configglue team mailing list archive
-
configglue team
-
Mailing list archive
-
Message #00078
[Merge] lp:~ricardokirkner/configglue/app into lp:configglue
Ricardo Kirkner has proposed merging lp:~ricardokirkner/configglue/app into lp:configglue.
Requested reviews:
Configglue developers (configglue)
For more details, see:
https://code.launchpad.net/~ricardokirkner/configglue/app/+merge/62738
By inheriting from configglue.app.App, your application instantly loads its
configuration files from the standard XDG locations:
- /etc/<app>/config.ini
- /home/<user>/.config/<app>/config.ini
plus a local config.ini file in the current folder (if available).
Configuration files are read in this order so that configuration can be
overridden at each level.
--
https://code.launchpad.net/~ricardokirkner/configglue/app/+merge/62738
Your team Configglue developers is requested to review the proposed merge of lp:~ricardokirkner/configglue/app into lp:configglue.
=== added directory 'configglue/app'
=== added file 'configglue/app/__init__.py'
--- configglue/app/__init__.py 1970-01-01 00:00:00 +0000
+++ configglue/app/__init__.py 2011-05-27 21:11:31 +0000
@@ -0,0 +1,1 @@
+from .base import App
=== added file 'configglue/app/base.py'
--- configglue/app/base.py 1970-01-01 00:00:00 +0000
+++ configglue/app/base.py 2011-05-27 21:11:31 +0000
@@ -0,0 +1,30 @@
+import os.path
+import sys
+
+from xdg.BaseDirectory import load_config_paths
+from xdgapp import XdgApplication
+
+from configglue.pyschema import configglue
+
+
+class App(XdgApplication):
+ def __init__(self, schema, name=None, create_dirs=True):
+ # initialize app name
+ if name is None:
+ name = os.path.splitext(os.path.basename(sys.argv[0]))[0]
+ self.name = name
+
+ super(App, self).__init__(name, create_dirs)
+
+ # initialize config
+ config_files = self.get_config_files()
+ self.glue = configglue(schema, config_files)
+
+ def get_config_files(self):
+ config_files = []
+ for path in reversed(list(load_config_paths(self.app))):
+ config_files.append(os.path.join(path, 'config.ini'))
+ if os.path.exists('config.ini'):
+ config_files.append('config.ini')
+ return config_files
+
=== added directory 'configglue/app/tests'
=== added file 'configglue/app/tests/__init__.py'
=== added file 'configglue/app/tests/test_base.py'
--- configglue/app/tests/test_base.py 1970-01-01 00:00:00 +0000
+++ configglue/app/tests/test_base.py 2011-05-27 21:11:31 +0000
@@ -0,0 +1,64 @@
+import user
+from ConfigParser import NoSectionError
+from unittest import TestCase
+
+from mock import (
+ Mock,
+ patch,
+)
+
+from configglue.app.base import App
+from configglue.pyschema import (
+ IntConfigOption,
+ Schema,
+)
+
+
+class AppTestCase(TestCase):
+ def make_app(self, schema=None, name=None):
+ if schema is None:
+ schema = Schema
+ # patch sys.argv so that nose can be run with extra options
+ # without conflicting with the schema validation
+ mock_sys = Mock()
+ mock_sys.argv = ['foo.py']
+ with patch('configglue.pyschema.glue.sys', mock_sys):
+ app = App(schema, name=name)
+ return app
+
+ def test_name_from_constructor(self):
+ app = self.make_app(name='myapp')
+ self.assertEqual(app.name, 'myapp')
+
+ @patch('configglue.app.base.sys')
+ def test_name_from_script(self, mock_sys):
+ mock_sys.argv = ['foo.py']
+ app = self.make_app()
+ self.assertEqual(app.name, 'foo')
+
+ def test_get_config_files(self):
+ app = self.make_app()
+ self.assertEqual(app.get_config_files(), [])
+
+ @patch('xdg.BaseDirectory.os.path.exists')
+ def test_get_config_files_full_hierarchy(self, mock_path_exists):
+ mock_path_exists.return_value = True
+ config_files = [
+ '/etc/xdg/myapp/config.ini',
+ '/etc/xdg/xdg-gnome/myapp/config.ini',
+ "{0}/.config/myapp/config.ini".format(user.home),
+ 'config.ini',
+ ]
+ app = self.make_app(name='myapp')
+ self.assertEqual(app.get_config_files(), config_files)
+
+ def test_glue_valid_config(self):
+ app = self.make_app()
+ self.assertNotEqual(app.glue.schema_parser.schema, Schema)
+ self.assertEqual(app.glue.schema_parser.is_valid(), True)
+
+ def test_glue_invalid_config(self):
+ class MySchema(Schema):
+ foo = IntConfigOption(fatal=True)
+ self.assertRaises(NoSectionError, self.make_app, schema=MySchema)
+
Follow ups