← Back to team overview

configglue team mailing list archive

[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