From 37d4f0ab8a71c11cd4f90b02978326aac79c4d1c Mon Sep 17 00:00:00 2001 From: Mathew Marcus Date: Tue, 15 Nov 2016 22:13:46 -0600 Subject: [PATCH 1/7] fixed jsonschema.exceptions.RefResolutionError: Unresolvable JSON pointer for relative --- .gitignore | 1 + jsonschema/validators.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3397f2a09..adb30b68c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /jsonschema/_version.py /version.txt +.idea _cache _static diff --git a/jsonschema/validators.py b/jsonschema/validators.py index 0945949c9..63329372a 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -356,7 +356,7 @@ def resolve_fragment(self, document, fragment): """ - fragment = fragment.lstrip(u"/") + fragment = fragment.lstrip(u"#").lstrip(u"/") parts = unquote(fragment).split(u"/") if fragment else [] for part in parts: From d9efe693c037a11745b171bea8eb898311a12938 Mon Sep 17 00:00:00 2001 From: Mathew Marcus Date: Thu, 17 Nov 2016 22:16:54 -0600 Subject: [PATCH 2/7] added tests for modified resolve_fragment --- jsonschema/tests/test_validators.py | 96 ++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 84ba660c9..36f18a0cc 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -6,8 +6,9 @@ from jsonschema.tests.compat import mock, unittest from jsonschema.validators import ( RefResolutionError, UnknownType, Draft3Validator, - Draft4Validator, RefResolver, create, extend, validator_for, validate, + Draft4Validator, RefResolver, create, extend, validator_for, validate ) +from jsonschema.compat import Sequence, unquote class TestCreateAndExtend(unittest.TestCase): @@ -771,6 +772,28 @@ class TestRefResolver(unittest.TestCase): stored_uri = "foo://stored" stored_schema = {"stored" : "schema"} + def prev_resolve_fragment(self, document, fragment): + fragment = fragment.lstrip(u"/") + parts = unquote(fragment).split(u"/") if fragment else [] + + for part in parts: + part = part.replace(u"~1", u"/").replace(u"~0", u"~") + + if isinstance(document, Sequence): + # Array indexes should be turned into integers + try: + part = int(part) + except ValueError: + pass + try: + document = document[part] + except (TypeError, LookupError): + raise RefResolutionError( + "Unresolvable JSON pointer: %r" % fragment + ) + + return document + def setUp(self): self.referrer = {} self.store = {self.stored_uri : self.stored_schema} @@ -898,6 +921,77 @@ def test_helpful_error_message_on_failed_pop_scope(self): resolver.pop_scope() self.assertIn("Failed to pop the scope", str(exc.exception)) + def test_prev_resolve_fragment_raises_exception(self): + schema = { + "definitions": { + "Pet": { + "properties": { + "category": { + "type": "array", + "items": { + "$ref": "#/definitions/Category" + } + }, + "name": { + "type": "string" + } + } + }, + "Category": { + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "integer", + "format": "int32" + } + } + } + } + } + resolver = RefResolver.from_schema(schema) + resolver.resolve_fragment = mock.MagicMock(side_effect=self.prev_resolve_fragment) + self.assertRaises(RefResolutionError, resolver.resolve_fragment, schema, "#/definitions/Category") + + def test_resolve_fragment(self): + schema = { + "definitions": { + "Pet": { + "properties": { + "category": { + "type": "array", + "items": { + "$ref": "#/definitions/Category" + } + }, + "name": { + "type": "string" + } + } + }, + "Category": { + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "integer", + "format": "int32" + } + } + } + } + } + resolver = RefResolver.from_schema(schema) + self.assertEqual(resolver.resolve_fragment(schema, "#/definitions/Category"), schema['definitions']['Category']) + class UniqueTupleItemsMixin(object): """ From aab7523869b708865ef984facefa073932d530f4 Mon Sep 17 00:00:00 2001 From: Mathew Marcus Date: Sat, 19 Nov 2016 18:38:34 -0600 Subject: [PATCH 3/7] fixed styling on new tests --- jsonschema/tests/test_validators.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 36f18a0cc..3a0f9719e 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -954,8 +954,12 @@ def test_prev_resolve_fragment_raises_exception(self): } } resolver = RefResolver.from_schema(schema) - resolver.resolve_fragment = mock.MagicMock(side_effect=self.prev_resolve_fragment) - self.assertRaises(RefResolutionError, resolver.resolve_fragment, schema, "#/definitions/Category") + resolver.resolve_fragment = mock.MagicMock( + side_effect=self.prev_resolve_fragment) + self.assertRaises(RefResolutionError, + resolver.resolve_fragment, + schema, + "#/definitions/Category") def test_resolve_fragment(self): schema = { @@ -990,7 +994,9 @@ def test_resolve_fragment(self): } } resolver = RefResolver.from_schema(schema) - self.assertEqual(resolver.resolve_fragment(schema, "#/definitions/Category"), schema['definitions']['Category']) + self.assertEqual(resolver.resolve_fragment + (schema, "#/definitions/Category"), + schema['definitions']['Category']) class UniqueTupleItemsMixin(object): From e74dedcc75e37ebb60a49549758f3a3cfec12e5b Mon Sep 17 00:00:00 2001 From: Mathew Marcus Date: Sat, 19 Nov 2016 18:41:09 -0600 Subject: [PATCH 4/7] removed .idea from .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index adb30b68c..3397f2a09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ /jsonschema/_version.py /version.txt -.idea _cache _static From 62640dda69fada8120cc8b79e82bdfabb2ac3b28 Mon Sep 17 00:00:00 2001 From: Mathew Marcus Date: Sat, 19 Nov 2016 18:49:29 -0600 Subject: [PATCH 5/7] removed unecessary code from mocked resolve_fragment --- jsonschema/tests/test_validators.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 3a0f9719e..0092da6b6 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -777,14 +777,6 @@ def prev_resolve_fragment(self, document, fragment): parts = unquote(fragment).split(u"/") if fragment else [] for part in parts: - part = part.replace(u"~1", u"/").replace(u"~0", u"~") - - if isinstance(document, Sequence): - # Array indexes should be turned into integers - try: - part = int(part) - except ValueError: - pass try: document = document[part] except (TypeError, LookupError): From e4554395ca8b4f0b4cbd42c1b3f0d0ae8bb05573 Mon Sep 17 00:00:00 2001 From: Mathew Marcus Date: Sat, 19 Nov 2016 20:47:35 -0600 Subject: [PATCH 6/7] removed unnecessary imports and items from schemas in tests --- jsonschema/tests/test_validators.py | 22 +--------------------- jsonschema/validators.py | 1 - 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 0092da6b6..5d67df530 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -8,7 +8,7 @@ RefResolutionError, UnknownType, Draft3Validator, Draft4Validator, RefResolver, create, extend, validator_for, validate ) -from jsonschema.compat import Sequence, unquote +from jsonschema.compat import unquote class TestCreateAndExtend(unittest.TestCase): @@ -923,24 +923,14 @@ def test_prev_resolve_fragment_raises_exception(self): "items": { "$ref": "#/definitions/Category" } - }, - "name": { - "type": "string" } } }, "Category": { - "required": [ - "name" - ], "properties": { "name": { "type": "string" }, - "id": { - "type": "integer", - "format": "int32" - } } } } @@ -963,24 +953,14 @@ def test_resolve_fragment(self): "items": { "$ref": "#/definitions/Category" } - }, - "name": { - "type": "string" } } }, "Category": { - "required": [ - "name" - ], "properties": { "name": { "type": "string" }, - "id": { - "type": "integer", - "format": "int32" - } } } } diff --git a/jsonschema/validators.py b/jsonschema/validators.py index 63329372a..fac872353 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -14,7 +14,6 @@ Sequence, urljoin, urlsplit, urldefrag, unquote, urlopen, str_types, int_types, iteritems, lru_cache, ) -from jsonschema.exceptions import ErrorTree # Backwards compatibility # noqa from jsonschema.exceptions import RefResolutionError, SchemaError, UnknownType From 79baa6c8cfb39f1aa54644da90578e3faecc4bd4 Mon Sep 17 00:00:00 2001 From: Mathew Marcus Date: Sun, 20 Nov 2016 09:34:20 -0600 Subject: [PATCH 7/7] readded import statement for ErrorTree in validators.py --- jsonschema/validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jsonschema/validators.py b/jsonschema/validators.py index fac872353..b8f22ec88 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -15,7 +15,7 @@ str_types, int_types, iteritems, lru_cache, ) from jsonschema.exceptions import RefResolutionError, SchemaError, UnknownType - +from jsonschema.exceptions import ErrorTree # Backwards compatibility # noqa _unset = _utils.Unset()