Skip to content

Commit 582ce34

Browse files
authored
Merge pull request #240 from p1c2u/fix/schema-accessor-resolver-evolution
Avoid unnecessary resolver evolution in get_resolved
2 parents 6db2573 + a6d6e59 commit 582ce34

2 files changed

Lines changed: 34 additions & 4 deletions

File tree

jsonschema_path/accessors.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,11 @@ def resolve(
144144

145145
def get_resolved(self, parts: Sequence[LookupKey]) -> Resolved[LookupNode]:
146146
resolved = self._get_resolved(self.node, parts, resolver=self.resolver)
147-
self.resolver = self.resolver._evolve(
148-
self.resolver._base_uri,
149-
registry=resolved.resolver._registry,
150-
)
147+
if resolved.resolver._registry is not self.resolver._registry:
148+
self.resolver = self.resolver._evolve(
149+
self.resolver._base_uri,
150+
registry=resolved.resolver._registry,
151+
)
151152
return resolved
152153

153154
@classmethod

tests/unit/test_accessors.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,32 @@ def test_dereferences(self):
159159
with pytest.raises(KeyError):
160160
accessor.require_child(["one"], "missing")
161161
retrieve.assert_called_once_with("x://testref")
162+
163+
164+
class TestSchemaAccessorResolverEvolution:
165+
def test_does_not_evolve_resolver_when_registry_unchanged(self):
166+
accessor = SchemaAccessor.from_schema({"a": {"b": 1}})
167+
initial_resolver = accessor.resolver
168+
169+
assert accessor.read(["a", "b"]) == 1
170+
assert accessor.resolver is initial_resolver
171+
172+
def test_evolves_once_when_registry_changes(self):
173+
retrieve = Mock(return_value={"value": "tested"})
174+
accessor = SchemaAccessor.from_schema(
175+
{
176+
"one": {
177+
"$ref": "x://testref",
178+
},
179+
},
180+
handlers={"x": retrieve},
181+
)
182+
initial_resolver = accessor.resolver
183+
184+
assert accessor.read(["one", "value"]) == "tested"
185+
evolved_resolver = accessor.resolver
186+
assert evolved_resolver is not initial_resolver
187+
188+
assert accessor.read(["one", "value"]) == "tested"
189+
assert accessor.resolver is evolved_resolver
190+
retrieve.assert_called_once_with("x://testref")

0 commit comments

Comments
 (0)