예제 #1
0
    def test_add_aggregation_returns_aggregation(self):
        def foo(all, local, args):
            return 17

        n = config_manager.Namespace()
        aggregation = n.add_aggregation('myaggregation', foo)
        self.assertEqual(n['myaggregation'], aggregation)
예제 #2
0
 def test_setting_nested_namespaces(self):
     n = config_manager.Namespace()
     n.namespace('sub')
     sub_n = n.sub
     sub_n.add_option('name')
     self.assertTrue(n.sub)
     self.assertTrue(isinstance(n.sub.name, config_manager.Option))
예제 #3
0
    def test_comparing_namespace_instances(self):
        n = config_manager.Namespace()
        n2 = config_manager.Namespace()
        self.assertEqual(n, n2)

        n3 = config_manager.Namespace()
        n3.add_option('name', 'Peter')
        self.assertNotEqual(n, n3)

        n2.add_option('name', 'Peter', 'Name of a person')
        self.assertNotEqual(n, n2)
        self.assertNotEqual(n2, n3)

        n4 = config_manager.Namespace()
        n4.add_option('name', 'Peter')
        self.assertEqual(n4, n3)
예제 #4
0
    def test_write_json(self):
        n = config_manager.Namespace(doc='top')
        n.add_option('aaa',
                     '2011-05-04T15:10:00',
                     'the a',
                     short_form='a',
                     from_string_converter=dtu.datetime_from_ISO_string)

        def value_iter():
            yield 'aaa', 'aaa', n.aaa

        s = StringIO()
        ValueSource.write(value_iter, output_stream=s)
        received = s.getvalue()
        s.close()
        jrec = json.loads(received)

        expect_to_find = {
            "short_form": "a",
            "default": "2011-05-04T15:10:00",
            "doc": "the a",
            "value": "2011-05-04T15:10:00",
            "from_string_converter":
            "configman.datetime_util.datetime_from_ISO_string",
            "name": "aaa"
        }
        for key, value in expect_to_find.items():
            self.assertEqual(jrec['aaa'][key], value)
예제 #5
0
    def test_write_json(self):
        n = config_manager.Namespace(doc='top')
        n.add_option('aaa', '2011-05-04T15:10:00', 'the a',
          short_form='a',
          from_string_converter=dtu.datetime_from_ISO_string
        )

        c = config_manager.ConfigurationManager(
          [n],
          use_admin_controls=True,
          use_auto_help=False,
          argv_source=[]
        )

        out = StringIO()
        c.write_conf(for_json, opener=stringIO_context_wrapper(out))
        received = out.getvalue()
        out.close()
        jrec = json.loads(received)

        expect_to_find = {
          "short_form": "a",
          "default": "2011-05-04T15:10:00",
          "doc": "the a",
          "value": "2011-05-04T15:10:00",
          "from_string_converter":
              "configman.datetime_util.datetime_from_ISO_string",
          "name": "aaa"
        }
        for key, value in expect_to_find.items():
            self.assertEqual(jrec['aaa'][key], value)
예제 #6
0
 def _some_namespaces(self):
     """set up some namespaces"""
     n = config_manager.Namespace(doc='top')
     n.add_option('aaa',
                  '2011-05-04T15:10:00',
                  'the a',
                  short_form='a',
                  from_string_converter=dtu.datetime_from_ISO_string)
     n.c = config_manager.Namespace(doc='c space')
     n.c.add_option('fred', 'stupid', 'husband from Flintstones')
     n.c.add_option('wilma', 'waspish', 'wife from Flintstones')
     n.d = config_manager.Namespace(doc='d space')
     n.d.add_option('fred', 'crabby', 'male neighbor from I Love Lucy')
     n.d.add_option('ethel', 'silly', 'female neighbor from I Love Lucy')
     n.x = config_manager.Namespace(doc='x space')
     n.x.add_option('size', 100, 'how big in tons', short_form='s')
     n.x.add_option('password', 'secret', 'the password')
     return n
예제 #7
0
    def test_deep_copy(self):
        from copy import deepcopy

        n = config_manager.Namespace()
        n2 = deepcopy(n)
        self.assertTrue(n is not n2)

        n = config_manager.Namespace()
        n.add_option('name', 'Peter')
        n3 = deepcopy(n)
        self.assertEqual(n, n3)
        self.assertTrue(n.name is not n3.name)

        def foo(all, local, args):
            return 17
        n = config_manager.Namespace()
        n.add_aggregation('a', foo)
        n4 = deepcopy(n)
        self.assertTrue(n.a is not n4.a)
예제 #8
0
    def test_add_option_returns_option(self):
        n = config_manager.Namespace()
        option = n.add_option('name', 'Peter')
        self.assertEqual(option.name, 'name')
        self.assertEqual(option.value, 'Peter')
        self.assertEqual(option, n['name'])

        # should work the same if you add an option straight
        o = Option('dwight')
        option = n.add_option(o)
        self.assertEqual(option, o)
예제 #9
0
 def test_overlay_config_6(self):
     """test namespace definition w/getopt"""
     n = config_manager.Namespace()
     n.add_option('a', doc='the a', default=1)
     n.b = 17
     n.c = config_manager.Namespace()
     n.c.add_option('extra', doc='the x', default=3.14159, short_form='e')
     c = config_manager.ConfigurationManager(
         [n], [['--a', '2', '--c.extra', '11.0']],
         use_admin_controls=True,
         use_auto_help=False)
     self.assertEqual(type(c.option_definitions.b), config_manager.Option)
     self.assertEqual(c.option_definitions.a.value, 2)
     self.assertEqual(c.option_definitions.b.value, 17)
     self.assertEqual(c.option_definitions.b.default, 17)
     self.assertEqual(c.option_definitions.b.name, 'b')
     self.assertEqual(c.option_definitions.c.extra.name, 'extra')
     self.assertEqual(c.option_definitions.c.extra.doc, 'the x')
     self.assertEqual(c.option_definitions.c.extra.default, '11.0')
     self.assertEqual(c.option_definitions.c.extra.value, 11.0)
예제 #10
0
    def test_walk_expanding_class_options(self):
        class A(config_manager.RequiredConfig):
            required_config = {
                'a': config_manager.Option('a', 1, 'the a'),
                'b': 17,
            }

        n = config_manager.Namespace()
        n.source = config_manager.Namespace()
        n.source.add_option('c', A, 'the A class')
        assert n.source.c.doc == 'the A class'

        n.dest = config_manager.Namespace()
        n.dest.add_option('c', A, doc='the A class')
        assert n.dest.c.doc == 'the A class'
        c = config_manager.ConfigurationManager(
            [n],
            use_admin_controls=True,
            #use_config_files=False,
            use_auto_help=False,
            argv_source=[])
        e = config_manager.Namespace()
        e.s = config_manager.Namespace()
        e.s.add_option('c', A, doc='the A class')
        e.s.add_option('a', 1, 'the a')
        e.s.add_option('b', default=17)
        e.d = config_manager.Namespace()
        e.d.add_option('c', A, doc='the A class')
        e.d.add_option('a', 1, 'the a')
        e.d.add_option('b', default=17)

        def namespace_test(val):
            self.assertEqual(type(val), config_manager.Namespace)

        def option_test(val, expected=None):
            self.assertEqual(val.name, expected.name)
            self.assertEqual(val.default, expected.default)
            self.assertEqual(val.doc, expected.doc)

        e = [
            ('dest', 'dest', namespace_test),
            ('dest.a', 'a', functools.partial(option_test, expected=e.d.a)),
            ('dest.b', 'b', functools.partial(option_test, expected=e.d.b)),
            ('dest.c', 'c', functools.partial(option_test, expected=e.d.c)),
            ('source', 'source', namespace_test),
            ('source.a', 'a', functools.partial(option_test, expected=e.s.a)),
            ('source.b', 'b', functools.partial(option_test, expected=e.s.b)),
            ('source.c', 'c', functools.partial(option_test, expected=e.s.c)),
        ]

        c_contents = [(qkey, key, val) for qkey, key, val in c._walk_config()]
        c_contents.sort()
        e.sort()
        for c_tuple, e_tuple in zip(c_contents, e):
            qkey, key, val = c_tuple
            e_qkey, e_key, e_fn = e_tuple
            self.assertEqual(qkey, e_qkey)
            self.assertEqual(key, e_key)
            e_fn(val)
예제 #11
0
 def test_overlay_config_6a(self):
     """test namespace w/getopt w/short form"""
     n = config_manager.Namespace()
     n.add_option('a', 1, doc='the a')
     n.b = 17
     n.c = config_manager.Namespace()
     n.c.add_option('extra', 3.14159, 'the x', short_form='e')
     c = config_manager.ConfigurationManager(
         [n], [getopt],
         use_admin_controls=True,
         argv_source=['--a', '2', '-e', '11.0'],
         use_auto_help=False)
     self.assertEqual(c.option_definitions.a, n.a)
     self.assertEqual(type(c.option_definitions.b), config_manager.Option)
     self.assertEqual(c.option_definitions.a.value, 2)
     self.assertEqual(c.option_definitions.b.value, 17)
     self.assertEqual(c.option_definitions.b.default, 17)
     self.assertEqual(c.option_definitions.b.name, 'b')
     self.assertEqual(c.option_definitions.c.extra.name, 'extra')
     self.assertEqual(c.option_definitions.c.extra.doc, 'the x')
     self.assertEqual(c.option_definitions.c.extra.default, 3.14159)
     self.assertEqual(c.option_definitions.c.extra.value, 11.0)
예제 #12
0
 def test_configuration_with_namespace(self):
     namespace = config_manager.Namespace()
     namespace.add_option('a')
     namespace.a.default = 1
     namespace.a.doc = 'the a'
     namespace.b = 17
     config = config_manager.ConfigurationManager([namespace],
                                                  argv_source=[])
     self.assertTrue(
         isinstance(config.option_definitions.b, config_manager.Option))
     self.assertEqual(config.option_definitions.b.value, 17)
     self.assertEqual(config.option_definitions.b.default, 17)
     self.assertEqual(config.option_definitions.b.name, 'b')
예제 #13
0
 def test_verify_key_order(self):
     d = config_manager.Namespace()
     d.add_option('a.b.c')
     d.a.b.add_option('d')
     d.a.add_option('x')
     d.add_aggregation('b', lambda x, y, z: None)
     self.assertTrue(isinstance(d._key_order, OrderedSet))
     # the keys should be in order of insertion within each level of the
     # nested dicts
     keys_in_breadth_first_order = [
         'a', 'b', 'a.b', 'a.x', 'a.b.c', 'a.b.d'
     ]
     self.assertEqual(keys_in_breadth_first_order,
                      [k for k in d.keys_breadth_first(include_dicts=True)])
예제 #14
0
 def test_Namespace_basics(self):
     namespace = config_manager.Namespace('doc string')
     namespace.alpha = 1
     my_birthday = datetime.datetime(1960, 5, 4, 15, 10)
     namespace.beta = my_birthday
     self.assertEqual(namespace.alpha.name, 'alpha')
     self.assertEqual(namespace.alpha.doc, None)
     self.assertEqual(namespace.alpha.default, 1)
     self.assertEqual(namespace.alpha.from_string_converter, int)
     self.assertEqual(namespace.alpha.value, 1)
     self.assertEqual(namespace.beta.name, 'beta')
     self.assertEqual(namespace.beta.doc, None)
     self.assertEqual(namespace.beta.default, my_birthday)
     self.assertEqual(namespace.beta.from_string_converter,
                      dtu.datetime_from_ISO_string)
     self.assertEqual(namespace.beta.value, my_birthday)
예제 #15
0
    def test_editing_values_on_namespace(self):
        n = config_manager.Namespace()
        self.assertRaises(KeyError, n.set_value, 'name', 'Peter')
        n.add_option('name', 'Lars')
        n.set_value('name', 'Peter')
        self.assertTrue(n.name)
        self.assertEqual(n.name.value, 'Peter')
        n.namespace('user')
        n.user.add_option('age', 100)
        n.set_value('user.age', 200)
        self.assertTrue(n.user.age)
        self.assertEqual(n.user.age.value, 200)

        # let's not be strict once
        n.set_value('user.gender', u'male', strict=False)
        self.assertEqual(n.user.gender.value, u'male')
예제 #16
0
    def test_setup_definitions_1(self):
        d = dd.DotDict()

        def fake_mapping_func(source, destination):
            self.assertTrue(isinstance(source, collections.Mapping))
            self.assertEqual(d, destination)
        saved_original = defsrc.definition_dispatch.copy()
        try:
            defsrc.definition_dispatch[collections.Mapping] = fake_mapping_func
            s = {}
            defsrc.setup_definitions(s, d)
            s = dd.DotDict()
            defsrc.setup_definitions(s, d)
            s = config_manager.Namespace()
            defsrc.setup_definitions(s, d)
        finally:
            defsrc.definition_dispatch = saved_original
예제 #17
0
 def test_overlay_config_5(self):
     """test namespace definition w/getopt"""
     n = config_manager.Namespace()
     n.add_option('a', 1, doc='the a')
     n.b = 17
     n.add_option('c', False, doc='the c')
     c = config_manager.ConfigurationManager([n], [['--a', '2', '--c']],
                                             use_admin_controls=True,
                                             use_auto_help=False,
                                             argv_source=[])
     self.assertTrue(
         isinstance(c.option_definitions.b, config_manager.Option))
     self.assertEqual(c.option_definitions.a.value, 2)
     self.assertEqual(c.option_definitions.b.value, 17)
     self.assertEqual(c.option_definitions.b.default, 17)
     self.assertEqual(c.option_definitions.b.name, 'b')
     self.assertEqual(c.option_definitions.c.name, 'c')
     self.assertEqual(c.option_definitions.c.value, True)
예제 #18
0
    def test_json_round_trip(self):
        n = config_manager.Namespace(doc='top')
        n.add_option('aaa',
                     '2011-05-04T15:10:00',
                     'the a',
                     short_form='a',
                     from_string_converter=dtu.datetime_from_ISO_string)
        expected_date = dtu.datetime_from_ISO_string('2011-05-04T15:10:00')
        n.add_option('bbb',
                     '37',
                     'the a',
                     short_form='a',
                     from_string_converter=int)
        n.add_option('write', 'json')
        n.add_aggregation('bbb_minus_one', bbb_minus_one)
        #t = tempfile.NamedTemporaryFile('w', suffix='.json', delete=False)
        name = '/tmp/test.json'
        import functools
        opener = functools.partial(open, name, 'w')
        c1 = config_manager.ConfigurationManager([n], [],
                                                 use_admin_controls=True,
                                                 use_auto_help=False,
                                                 app_name='/tmp/test',
                                                 app_version='0',
                                                 app_description='',
                                                 argv_source=[])
        c1.write_conf('json', opener)
        d1 = {'bbb': 88}
        d2 = {'bbb': '-99'}
        try:
            with open(name) as jfp:
                j = json.load(jfp)
            c2 = config_manager.ConfigurationManager((j, ), (d1, d2),
                                                     use_admin_controls=True,
                                                     use_auto_help=False,
                                                     argv_source=[])
            config = c2.get_config()
            self.assertEqual(config.aaa, expected_date)
            self.assertEqual(config.bbb, -99)
            self.assertEqual(config.bbb_minus_one, -100)

        finally:
            os.unlink(name)
예제 #19
0
 def test_add_option_with_option(self):
     o = Option('dwight')
     n = config_manager.Namespace()
     n.add_option(o)
     self.assertTrue(o is n.dwight)
예제 #20
0
 def test_add_namespace_returns_namespace(self):
     n = config_manager.Namespace()
     namespace = n.namespace('deeper', 'My doc')
     self.assertEqual(namespace, n.deeper)
     self.assertEqual(namespace._doc, 'My doc')