Skip to content

Commit

Permalink
Merge pull request marshmallow-code#1685 from marshmallow-code/dict_c…
Browse files Browse the repository at this point in the history
…ast_mapping_type

Cast to mapping type in Mapping.serialize/deserialize
  • Loading branch information
sloria committed Nov 8, 2020
2 parents ef0fc76 + aa27968 commit ad93940
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 15 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
Changelog
---------

3.9.1 (unreleased)
******************

Bug fixes:

- Cast to mapping type in ``Mapping.serialize`` and ``Mapping.deserialize``
(:pr:`1685`).
- Fix bug letting ``Dict`` pass invalid dict on deserialization when no key or
value ``Field`` is specified (:pr:`1685`).

3.9.0 (2020-10-31)
******************

Expand Down
4 changes: 2 additions & 2 deletions src/marshmallow/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -1505,7 +1505,7 @@ def _serialize(self, value, attr, obj, **kwargs):
if value is None:
return None
if not self.value_field and not self.key_field:
return value
return self.mapping_type(value)

#  Serialize keys
if self.key_field is None:
Expand All @@ -1532,7 +1532,7 @@ def _deserialize(self, value, attr, data, **kwargs):
if not isinstance(value, _Mapping):
raise self.make_error("invalid")
if not self.value_field and not self.key_field:
return value
return self.mapping_type(value)

errors = collections.defaultdict(dict)

Expand Down
7 changes: 6 additions & 1 deletion tests/test_deserialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -719,8 +719,13 @@ def test_invalid_date_field_deserialization(self, in_value):
assert excinfo.value.args[0] == msg

def test_dict_field_deserialization(self):
data = {"foo": "bar"}
field = fields.Dict()
assert field.deserialize({"foo": "bar"}) == {"foo": "bar"}
load = field.deserialize(data)
assert load == {"foo": "bar"}
# Check load is a distinct object
load["foo"] = "baz"
assert data["foo"] == "bar"
with pytest.raises(ValidationError) as excinfo:
field.deserialize("baddict")
assert excinfo.value.args[0] == "Not a valid mapping type."
Expand Down
5 changes: 0 additions & 5 deletions tests/test_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -641,11 +641,6 @@ def test_can_serialize_time(user, serialized_user):
assert serialized_user["time_registered"] == expected


def test_invalid_dict_but_okay():
u = User("Joe", various_data="baddict")
UserSchema().dump(u)


def test_json_module_is_deprecated():
with pytest.deprecated_call():

Expand Down
12 changes: 5 additions & 7 deletions tests/test_serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -369,16 +369,14 @@ def test_dict_field_serialize_none(self, user):
field = fields.Dict()
assert field.serialize("various_data", user) is None

def test_dict_field_invalid_dict_but_okay(self, user):
user.various_data = "okaydict"
field = fields.Dict()
field.serialize("various_data", user)
assert field.serialize("various_data", user) == "okaydict"

def test_dict_field_serialize(self, user):
user.various_data = {"foo": "bar"}
field = fields.Dict()
assert field.serialize("various_data", user) == {"foo": "bar"}
dump = field.serialize("various_data", user)
assert dump == {"foo": "bar"}
# Check dump is a distinct object
dump["foo"] = "baz"
assert user.various_data["foo"] == "bar"

def test_dict_field_serialize_ordereddict(self, user):
user.various_data = OrderedDict([("foo", "bar"), ("bar", "baz")])
Expand Down

0 comments on commit ad93940

Please sign in to comment.