예제 #1
0
    def test_merge_exclude(self):
        """ test 'exclude' in merge """
        tmp = {'t': {}}
        obj = {'a': [{}, {}, {}], 'b': {'/a': {}, '~b': {}, 'cc': {}}}
        with TestContext(tmp, 't') as ctx:
            ctx.parse(obj)
        o = tmp['t']

        o1, o2 = TestObj(base.NullContext()), TestObj(base.NullContext())
        o1.merge(o, TestContext)
        o2.merge(o, TestContext, exclude=['b'])
        self.assertEqual(len(o1.a), 3)
        self.assertEqual(len(o2.a), 3)
        self.assertEqual(len(o1.b), 3)
        self.assertEqual(len(o2.b), 0)
예제 #2
0
    def test_merge(self):
        """ verify merge along with additionalProperties """
        # Schema
        addp = self.app.resolve('#/definitions/add_prop')
        final = objects.Schema(base.NullContext())
        final.merge(addp, parser.SchemaContext)

        # True
        addp = self.app.resolve('#/definitions/add_prop_bool')
        final = objects.Schema(base.NullContext())
        final.merge(addp, parser.SchemaContext)

        # False
        addp = self.app.resolve('#/definitions/add_prop_false')
        final = objects.Schema(base.NullContext())
        final.merge(addp, parser.SchemaContext)

        # nested with allOf
        addp = self.app.resolve('#/definitions/add_prop_nested')
        final = objects.Schema(base.NullContext())
        final.merge(addp, parser.SchemaContext)
예제 #3
0
    def test_merge(self):
        """ test merge function """
        class MergeObj(six.with_metaclass(base.FieldMeta, base.BaseObj)):
            __swagger_fields__ = {'ma': None, 'mb': None, 'mc': {}}

        class MergeContext(base.Context):
            __swagger_child__ = {
                'ma': (None, TestContext),
                'mb': (None, TestContext),
                'mc': (base.ContainerType.dict_, TestContext)
            }
            __swagger_ref_object__ = MergeObj

        tmp = {'t': {}}
        obj2 = {'mb': {'a': [{}, {}, {}]}}
        obj1 = {
            'ma': {
                'a': [{}, {}, {}, {}]
            },
            'mb': {
                'a': [{}, {}]
            },
            'mc': {
                '/a': {
                    'a': [{}],
                    'b': {
                        'bb': {}
                    },
                    'c': {
                        'cc': [{}]
                    },
                    'd': {}
                }
            }
        }
        o3 = MergeObj(base.NullContext())

        with MergeContext(tmp, 't') as ctx:
            ctx.parse(obj1)
        o1 = tmp['t']

        with MergeContext(tmp, 't') as ctx:
            ctx.parse(obj2)
        o2 = tmp['t']

        def _chk(o_from, o_to):
            # existing children are not affected
            self.assertTrue(len(o_to.mb.a), 3)
            # non-existing children are fully copied3
            self.assertEqual(len(o_to.ma.a), 4)
            self.assertNotEqual(id(o_to.ma), id(o_from.ma))
            # make sure complex children are copied
            self.assertNotEqual(id(o_to.mc), id(o_from.mc))
            self.assertEqual(len(o_to.mc['/a'].a), 1)
            self.assertTrue(isinstance(o_to.mc['/a'].b['bb'], ChildObj))
            self.assertNotEqual(id(o_to.mc['/a'].b['bb']),
                                id(o_from.mc['/a'].b['bb']))
            self.assertTrue(isinstance(o_to.mc['/a'].c['cc'][0], ChildObj))
            self.assertNotEqual(id(o_to.mc['/a'].c['cc'][0]),
                                id(o_from.mc['/a'].c['cc'][0]))
            self.assertTrue(o_to.mc['/a'].d, ChildObj)
            self.assertNotEqual(id(o_to.mc['/a'].d), id(o1.mc['/a'].d))

        def _chk_parent(o_from, o_to):
            for v in o_to.ma.a:
                self.assertEqual(id(v._parent_), id(o_to.ma))
                self.assertNotEqual(id(v._parent_), id(o_from.ma))

            self.assertEqual(id(o_to.ma._parent_), id(o_to))
            self.assertEqual(id(o_to.mb._parent_), id(o_to))
            self.assertEqual(id(o_to.mc['/a']._parent_), id(o_to))
            self.assertEqual(id(o_to.mc['/a'].a[0]._parent_),
                             id(o_to.mc['/a']))
            self.assertEqual(id(o_to.mc['/a'].b['bb']._parent_),
                             id(o_to.mc['/a']))
            self.assertEqual(id(o_to.mc['/a'].c['cc'][0]._parent_),
                             id(o_to.mc['/a']))

        self.assertEqual(o2.ma, None)
        self.assertTrue(isinstance(o2.mb, TestObj))
        self.assertTrue(len(o2.mb.a), 3)
        self.assertEqual(len(o2.mc), 0)

        id_mb = id(o2.mb)

        o2.merge(o1, MergeContext)
        self.assertNotEqual(id(o2.mb), id(o1.mb))
        self.assertEqual(id(o2.mb), id_mb)

        # cascade merge
        o3.merge(o2, MergeContext)

        _chk(o1, o2)
        _chk(o2, o3)
        _chk(o1, o3)

        _chk_parent(o1, o2)
        _chk_parent(o2, o3)
        _chk_parent(o1, o3)
예제 #4
0
 def test_field_default_value(self):
     """ field default value, make sure we won't reference to a global declared list_
     """
     o1 = TestObj(base.NullContext())
     o2 = TestObj(base.NullContext())
     self.assertTrue(id(o1.a) != id(o2.a))