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

Problems with the example in docs/faq.rst #367

Closed
mpnowacki opened this issue Oct 16, 2017 · 4 comments
Closed

Problems with the example in docs/faq.rst #367

mpnowacki opened this issue Oct 16, 2017 · 4 comments
Labels
Bug Something doesn't work the way it should.

Comments

@mpnowacki
Copy link

I've encountered three issues when using the example supporting defaults (on python 3.5.3).

  • the method check_schema crashes in a most peculiar way. Calling DefaultValidatingDraft4Validator.check_schema(schema) causes a RecursionError: maximum recursion depth exceeded while calling a Python object
  • this code may work in an unexpected way when the default value is a mutable object. For example, let's say you validate an object and the default value gets injected. If you then manipulate this object, and modify the injected default value, the next time this schema injects the default value it shall be modified. Changing instance.setdefault(property, subschema["default"]) to instance.setdefault(property, copy.deepcopy(subschema["default"])) solves this completely, maybe it's worth to include it in the example?
  • This code doesn't work with python 3 because of the .iteritems() call, but that's just a cosmetic detail.
@Julian
Copy link
Member

Julian commented Oct 18, 2017

Hey! Thanks for the report.

Happy to fix these -- would you be able to send a PR?

For the second one, I'd not really like to promote the use of copy.deepcopy. Personally I'd not really recommend mutating objects :) -- Seep is/was a POC for how to do this in a way that I would recommend.

@Julian Julian added the Bug Something doesn't work the way it should. label Aug 13, 2018
@jamesstidard
Copy link

Hi,

I've also been playing around with this example in the FAQ. I also found that both the subschema and instance values could be boolean values. For example, this happens when iterating the readOnly property.

Here's what I've ended up with:

from copy import deepcopy
from jsonschema import Draft7Validator, validators


def extend_with_default(validator_class):
    validate_properties = validator_class.VALIDATORS["properties"]

    def set_defaults(validator, properties, instance, schema):
        for property_, subschema in properties.items():

            defaultable = (
                isinstance(subschema, dict) and
                isinstance(instance, dict) and
                "default" in subschema
            )

            if defaultable:
                default = deepcopy(subschema["default"])
                instance.setdefault(property_, default)

        for error in validate_properties(
            validator, properties, instance, schema,
        ):
            yield error

    return validators.extend(
        validator_class, {"properties": set_defaults},
    )


DefaultValidatingDraft7Validator = extend_with_default(Draft7Validator)

jsonschema is still new to me, so I don't know if this is robust or correct. Would appreciate a sanity check.

Here's what I used as an input schema:

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "const": "example_schema",
      "default": "example_schema"
    },
    "price": {
      "type": "number",
      "default": 5
    },
    "name": {
      "type": "string",
      "default": "something"
    }
  },
  "default": {}
}

Julian added a commit that referenced this issue Jun 9, 2020
817b724 add perl implementation and test suite to the user list
ca14e01 Merge branch 'pull/382'
3dabf55 move non-format tests out of the format directory, while keeping all ECMA regex tests together
4121aa5 move format tests to their own directory
4bae8aa Add more idn-hostname tests to draft-2019-09 and draft-07
6d91158 [325] Add some more hostname tests
e593057 Merge pull request #389 from ssilverman/readme-drafts
fb3766d README: Improve issue/PR links
79bef22 README: Update language around drafts
ade47e4 README: Add Snow to the list of supporting Java validators
fc0c14e README: Update simple JSON example
1167669 README: Update structure, consistency, spacing, and wrapping
9514122 Merge pull request #388 from json-schema-org/ether/maxProperties=0
7646490 test that maxProperties = 0 means the object is empty
c3f4319 Merge pull request #384 from ChALkeR/chalker/unique
7766f48 Improve uniqueItems validation
7555d41 Add unnormalized $id tests
11f70eb [300] Add tests for valid use of empty fragments in "$id"
b106ff0 [299] Add tests for invalid use of fragments in "$id"
4a74d45 Fix "tilde" spelling
3eca41b Merge pull request #379 from json-schema-org/ether/remove-wrapped-refs
d61bae8 remove wrapped refs
536ec07 [359] Add unevaluatedProperties/unevaluatedItems cousin tests
ac63eb7 Small README update that introduces the concept of directories
697944e Merge pull request #374 from karenetheridge/ether/allOf-anyOf-oneOf
33f8549 test all the *Of keywords together
44b99ed Merge pull request #373 from karenetheridge/ether/items-and-contains
4a2b52f some tests of items + contains
7f00cc8 add test that was present for other drafts but not 2019-09
a3f9e2e Merge pull request #371 from karenetheridge/ether/if-then-else-boolean
aeeaecc some tests with if/then/else and boolean schemas
b8a083c Merge pull request #372 from nomnoms12/unique-false-and-zero
85728f1 Add tests for uniqueness [1] and [true]
fd01a60 Add tests for uniqueness [1] and [true]
0a8823c Merge pull request #370 from karenetheridge/ether/nul-char
fa6f4dd add tests for the NUL character in strings
8bf2f7f Merge pull request #369 from ssilverman/data-desc
2ba7a76 Add data description
4f66078 Merge pull request #367 from karenetheridge/ether/additionalItems
283da7c some more tests for additionalItems
7ba95f3 add tests for keywords maxContains, minContains
2f2e7cf Merge pull request #365 from karenetheridge/ether/move-ecma-regex
8388f27 move ECMA regex tests under format/

git-subtree-dir: json
git-subtree-split: 817b724b7a64d7c18a8232aa32b5f1cc1d6dd153
@akshenk8
Copy link

akshenk8 commented Oct 13, 2020

I just stumbled upon this issue. And, I'm quite new to this library. Forgive me if my questions turnout naive.

Is it possible to convert VALIDATORS to an OrderedDict instead of the current Dict, and iterate over VALIDATORS instead of _schema.items() ?
Not sure if this will resolve the issue for the nested cases, but will guarantee an order of VALIDATORS execution.

@Julian
Copy link
Member

Julian commented Jul 25, 2022

PRs to improve the example code are definitely welcome here, but I'm going to close this since it's not really "fully supported" code, they're more like samples to start with. I don't see myself being able to dedicate much more time on them, but yeah help is welcome, as is someone creating an external library containing them built on top of this library so others can contribute.

@Julian Julian closed this as completed Jul 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Something doesn't work the way it should.
Projects
None yet
Development

No branches or pull requests

4 participants