Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions jsonmodels/builders.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ def build(self):
return {'type': 'number'}
elif issubclass(self.type, float):
return {'type': 'number'}
elif self.type == dict:
return {'type': 'object'}

raise errors.FieldNotSupported(
"Can't specify value schema!", self.type
Expand Down
9 changes: 8 additions & 1 deletion jsonmodels/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,14 @@ def _get_embed_type(self):
return self.types[0]

def to_struct(self, value):
return value.to_struct()
try:
return value.to_struct()
except AttributeError:
# Only when we specify `dict` as a type should
# we return the raw value.
if dict not in self.types:
raise
return value.copy()


class _LazyType(object):
Expand Down
24 changes: 24 additions & 0 deletions tests/fixtures/schema_empty_object.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"additionalProperties": false,
"definitions": {
"tests_test_schema_structured": {
"additionalProperties": false,
"properties": {
"key": {"type": "string"},
"value": {"type": "string"}
},
"type": "object"
}
},
"properties": {
"arbitrary": {"type": "object"},
"structured": "#/definitions/tests_test_schema_structured",
"type_choices": {
"oneOf": [
"#/definitions/tests_test_schema_structured",
{"type": "object"}
]
}
},
"type": "object"
}
18 changes: 18 additions & 0 deletions tests/test_jsonmodels.py
Original file line number Diff line number Diff line change
Expand Up @@ -574,3 +574,21 @@ class Model(models.Base):
assert Model(age=1) == Model(age=1)
assert Model(age=1) != Model(age=2)
assert Model(name='William', age=1) != Model(age=1)


def test_empty_object():
class Model(models.Base):
data = fields.EmbeddedField(dict)

inst = Model(data={'wiz': 'boing'})

assert inst.data == {'wiz': 'boing'}


def test_empty_object_to_struct():
class Model(models.Base):
data = fields.EmbeddedField(dict)

inst = Model(data={'wiz': 'boing'})

assert inst.to_struct() == {'data': {'wiz': 'boing'}}
16 changes: 16 additions & 0 deletions tests/test_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -371,3 +371,19 @@ class Person(models.Base):

with pytest.raises(errors.FieldNotSupported):
Person.to_json_schema()


def test_schema_empty_object():
class Structured(models.Base):
key = fields.StringField()
value = fields.StringField()

class DataContainer(models.Base):
arbitrary = fields.EmbeddedField(dict)
structured = fields.EmbeddedField(Structured)
type_choices = fields.EmbeddedField([Structured, dict])

schema = DataContainer.to_json_schema()

pattern = get_fixture('schema_empty_object.json')
assert compare_schemas(pattern, schema)