Skip to content
This repository was archived by the owner on Jan 28, 2022. It is now read-only.

Commit adb2f9b

Browse files
authored
Merge pull request #63 from lmignon/finx-multi-inheritance
Finx multi inheritance
2 parents b42c7f6 + beb9325 commit adb2f9b

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

marshmallow_objects/models.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,17 @@ def __new__(mcs, name, parents, dct):
5454
'handle_error'):
5555
schema_fields[key] = value
5656

57-
parent_schema = cls.__schema_class__ or marshmallow.Schema
57+
parent_schemas = []
5858
if parents:
5959
for parent in parents:
6060
if issubclass(parent, Model):
61-
parent_schema = parent.__schema_class__
62-
break
63-
schema_class = type(name + 'Schema', (parent_schema, ), schema_fields)
61+
parent_schemas.append(parent.__schema_class__)
62+
parent_schemas = (
63+
parent_schemas
64+
or [cls.__schema_class__ or marshmallow.Schema]
65+
)
66+
schema_class = type(
67+
name + 'Schema', tuple(parent_schemas), schema_fields)
6468
cls.__schema_class__ = schema_class
6569

6670
return cls

tests/test_models.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ class C(marshmallow.Model):
5454
a = marshmallow.NestedModel(A, many=True)
5555

5656

57+
class MultiInheritance(A, B, C):
58+
pass
59+
60+
5761
def serialize_context_field(obj, context=None):
5862
return obj.test_field == context['value']
5963

@@ -80,27 +84,43 @@ def test_schema_name(self):
8084

8185
def test_schema_class(self):
8286
assert issubclass(A.__schema_class__, marshmallow.Schema)
87+
assert issubclass(
88+
MultiInheritance.__schema_class__, marshmallow.Schema)
8389

8490
def test_model_class(self):
8591
assert issubclass(A.__schema_class__.__model_class__,
8692
marshmallow.Model)
93+
assert issubclass(
94+
MultiInheritance.__schema_class__.__model_class__,
95+
marshmallow.Model)
8796

8897
def test_tag_processor(self):
8998
assert hasattr(A.__schema_class__, 'set_tag_field')
99+
assert hasattr(MultiInheritance.__schema_class__, 'set_tag_field')
90100

91101
def test_meta(self):
92102
assert hasattr(A.__schema_class__, 'Meta')
93103
self.assertEqual(id(A.Meta), id(A.__schema_class__.Meta))
94104
assert not hasattr(B, 'Meta')
95105
assert hasattr(B.__schema_class__, 'Meta')
106+
self.assertEqual(
107+
id(MultiInheritance.Meta),
108+
id(MultiInheritance.__schema_class__.Meta))
109+
assert hasattr(MultiInheritance.__schema_class__, 'Meta')
96110

97111
def test_on_bind_filed(self):
98112
self.assertEqual(
99113
id(A.on_bind_field), id(A.__schema_class__.on_bind_field))
114+
self.assertEqual(
115+
id(MultiInheritance.on_bind_field),
116+
id(MultiInheritance.__schema_class__.on_bind_field))
100117

101118
def test_handle_error(self):
102119
self.assertEqual(
103120
id(A.handle_error), id(A.__schema_class__.handle_error))
121+
self.assertEqual(
122+
id(MultiInheritance.handle_error),
123+
id(MultiInheritance.__schema_class__.handle_error))
104124

105125

106126
class TestModel(unittest.TestCase):

0 commit comments

Comments
 (0)