Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue1414: wrong behavior of json() method with nested models containing custom root #1429

Closed
wants to merge 4 commits into from

Conversation

silversurfer34
Copy link

@silversurfer34 silversurfer34 commented Apr 24, 2020

Change Summary

1414

#1414
Fix proposal for the issue 1414, wrong behavior of json method when there are nested models with custom root.
Once the dict is generated, it is parsed and each time an item has the root key, its associated value is attached to the parent key
(Maybe this can be done in a more pythonic way, but with 15 years of C++ I still have bad habits)

Checklist

  • Unit tests for the changes exist
  • Tests pass on CI and coverage remains at 100%
  • Documentation reflects the changes where applicable
  • changes/<pull request or issue id>-<github username>.md file added describing change
    (see changes/README.md for details)

@codecov
Copy link

codecov bot commented Apr 24, 2020

Codecov Report

Merging #1429 into master will not change coverage.
The diff coverage is n/a.

@@            Coverage Diff            @@
##            master     #1429   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           21        21           
  Lines         3747      3761   +14     
  Branches       742       748    +6     
=========================================
+ Hits          3747      3761   +14     
Impacted Files Coverage Δ
pydantic/types.py 100.00% <0.00%> (ø)
pydantic/fields.py 100.00% <0.00%> (ø)
pydantic/schema.py 100.00% <0.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update f96c4dc...0b9bae0. Read the comment docs.

Copy link
Member

@samuelcolvin samuelcolvin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In future, please give pull requests a descriptive name, just "Issue1414" doesn't help explain what this is about, you can probably edit the title.

if self.__custom_root_type__:
data = data[ROOT_KEY]

def reparent_root(d: 'DictStrAny') -> 'DictStrAny':
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this can be done more easily with a change to _get_value, though I haven't tried myself.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried to look at _get_value but it would spread the change also to dict() method and make some other tests failing (and might introduce new issues?).

changes/1414-silversurfer34.md Outdated Show resolved Hide resolved
changes/1414-silversurfer34.md Outdated Show resolved Hide resolved
@@ -204,6 +204,37 @@ class Model(BaseModel):
assert Model(__root__=['a', 'b']).json() == '["a", "b"]'


def test_encode_nested_root():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this has nothing to do with .json() in particular, it should be true of .dict() too, so tests shouldn't be in this file.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure to understand your comment. Those tests build models with nested root as child elements, then calls the json method and the expected result is a json without the __root__ intermediate key.
(The behavior change concerns only the json method, doing it in dict method is breaking other tests)

@silversurfer34 silversurfer34 changed the title Issue1414 Issue1414: wrong behavior of json() method with nested models containing custom root May 4, 2020
@samuelcolvin
Copy link
Member

I think the point here is that this should effect dict() as well as json(), in this regard I don't see that there's anything special about json().

@samuelcolvin
Copy link
Member

replaced by #1607

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants