Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-referencing for openSUSE:Factory checked in at 2023-05-26 20:15:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-referencing (Old) and /work/SRC/openSUSE:Factory/.python-referencing.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-referencing" Fri May 26 20:15:33 2023 rev:12 rq:1089009 version:0.28.5 Changes: -------- --- /work/SRC/openSUSE:Factory/python-referencing/python-referencing.changes 2023-05-24 20:23:06.372445630 +0200 +++ /work/SRC/openSUSE:Factory/.python-referencing.new.1533/python-referencing.changes 2023-05-26 20:15:50.068391766 +0200 @@ -1,0 +2,9 @@ +Thu May 25 06:24:03 UTC 2023 - ka...@b1-systems.de + +- Update to version 0.28.5: + * Fill in the missing coverage, and ensure it runs in CI. + * Add pip-audit to CI. + * Explicitly ensure we catch calling .anchor on a nonexistent + resource. + +------------------------------------------------------------------- Old: ---- referencing-0.28.4.tar.gz New: ---- referencing-0.28.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-referencing.spec ++++++ --- /var/tmp/diff_new_pack.IrNDUt/_old 2023-05-26 20:15:50.624395080 +0200 +++ /var/tmp/diff_new_pack.IrNDUt/_new 2023-05-26 20:15:50.632395128 +0200 @@ -26,7 +26,7 @@ %endif %{?sle15_python_module_pythons} Name: python-referencing%{psuffix} -Version: 0.28.4 +Version: 0.28.5 Release: 0 Summary: JSON Referencing + Python License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.IrNDUt/_old 2023-05-26 20:15:50.680395414 +0200 +++ /var/tmp/diff_new_pack.IrNDUt/_new 2023-05-26 20:15:50.684395438 +0200 @@ -2,7 +2,7 @@ <service name="tar_scm" mode="disabled"> <param name="url">https://github.com/python-jsonschema/referencing</param> <param name="scm">git</param> - <param name="revision">v0.28.4</param> + <param name="revision">v0.28.5</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.IrNDUt/_old 2023-05-26 20:15:50.704395557 +0200 +++ /var/tmp/diff_new_pack.IrNDUt/_new 2023-05-26 20:15:50.708395581 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/python-jsonschema/referencing</param> - <param name="changesrevision">de0d25830a19539d8b0bb31c8661ad65f80011cc</param></service></servicedata> + <param name="changesrevision">c22e9213bb9390cfdfef9e06efb987979531a4b7</param></service></servicedata> (No newline at EOF) ++++++ referencing-0.28.4.tar.gz -> referencing-0.28.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.git/FETCH_HEAD new/referencing-0.28.5/.git/FETCH_HEAD --- old/referencing-0.28.4/.git/FETCH_HEAD 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/.git/FETCH_HEAD 2023-05-24 21:33:11.000000000 +0200 @@ -1,2 +1,2 @@ -de0d25830a19539d8b0bb31c8661ad65f80011cc not-for-merge branch 'main' of https://github.com/python-jsonschema/referencing +fb511b359283c2543b3e6972b849b1c7edae5703 not-for-merge branch 'main' of https://github.com/python-jsonschema/referencing 29f587735daddcf3fde3318382227e6d1f561e6a not-for-merge branch 'retrieval' of https://github.com/python-jsonschema/referencing diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.git/HEAD new/referencing-0.28.5/.git/HEAD --- old/referencing-0.28.4/.git/HEAD 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/.git/HEAD 2023-05-24 21:33:11.000000000 +0200 @@ -1 +1 @@ -de0d25830a19539d8b0bb31c8661ad65f80011cc +c22e9213bb9390cfdfef9e06efb987979531a4b7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.git/ORIG_HEAD new/referencing-0.28.5/.git/ORIG_HEAD --- old/referencing-0.28.4/.git/ORIG_HEAD 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/.git/ORIG_HEAD 2023-05-24 21:33:11.000000000 +0200 @@ -1 +1 @@ -10376f502c5ae5f56a4e7e3c46ca06443e81cdc3 +1cbc3eed952d93f32405d602d45c061e122f7dc8 Binary files old/referencing-0.28.4/.git/index and new/referencing-0.28.5/.git/index differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.git/logs/HEAD new/referencing-0.28.5/.git/logs/HEAD --- old/referencing-0.28.4/.git/logs/HEAD 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/.git/logs/HEAD 2023-05-24 21:33:11.000000000 +0200 @@ -20,3 +20,5 @@ 2530bdfb17265bfbb55ce60fa1ffb7666c82ba0f 381a7310b8b88abc65c46ec3ec905faf0fbd02db Johannes Kastl <ka...@b1-systems.de> 1684828525 +0200 reset: moving to v0.28.3 381a7310b8b88abc65c46ec3ec905faf0fbd02db 10376f502c5ae5f56a4e7e3c46ca06443e81cdc3 Johannes Kastl <ka...@b1-systems.de> 1684904504 +0200 merge v0.28.4: Merge made by the 'ort' strategy. 10376f502c5ae5f56a4e7e3c46ca06443e81cdc3 de0d25830a19539d8b0bb31c8661ad65f80011cc Johannes Kastl <ka...@b1-systems.de> 1684904505 +0200 reset: moving to v0.28.4 +de0d25830a19539d8b0bb31c8661ad65f80011cc 1cbc3eed952d93f32405d602d45c061e122f7dc8 Johannes Kastl <ka...@b1-systems.de> 1684995842 +0200 merge v0.28.5: Merge made by the 'ort' strategy. +1cbc3eed952d93f32405d602d45c061e122f7dc8 c22e9213bb9390cfdfef9e06efb987979531a4b7 Johannes Kastl <ka...@b1-systems.de> 1684995843 +0200 reset: moving to v0.28.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.git/logs/refs/remotes/origin/main new/referencing-0.28.5/.git/logs/refs/remotes/origin/main --- old/referencing-0.28.4/.git/logs/refs/remotes/origin/main 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/.git/logs/refs/remotes/origin/main 2023-05-24 21:33:11.000000000 +0200 @@ -11,3 +11,4 @@ 9959594fc784107f771ba14e6a675b16dc9c9629 a22cd842aa769fd06c7d3ad256015fead9e71d10 Johannes Kastl <ka...@b1-systems.de> 1684396194 +0200 fetch --filter=tree:0 --tags: fast-forward a22cd842aa769fd06c7d3ad256015fead9e71d10 381a7310b8b88abc65c46ec3ec905faf0fbd02db Johannes Kastl <ka...@b1-systems.de> 1684828523 +0200 fetch --filter=tree:0 --tags: fast-forward 381a7310b8b88abc65c46ec3ec905faf0fbd02db de0d25830a19539d8b0bb31c8661ad65f80011cc Johannes Kastl <ka...@b1-systems.de> 1684904499 +0200 fetch --filter=tree:0 --tags: fast-forward +de0d25830a19539d8b0bb31c8661ad65f80011cc fb511b359283c2543b3e6972b849b1c7edae5703 Johannes Kastl <ka...@b1-systems.de> 1684995839 +0200 fetch --filter=tree:0 --tags: fast-forward Binary files old/referencing-0.28.4/.git/objects/1c/bc3eed952d93f32405d602d45c061e122f7dc8 and new/referencing-0.28.5/.git/objects/1c/bc3eed952d93f32405d602d45c061e122f7dc8 differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-22fa87dc843471b5974e45386c4f700b2e649b6b.idx and new/referencing-0.28.5/.git/objects/pack/pack-22fa87dc843471b5974e45386c4f700b2e649b6b.idx differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-22fa87dc843471b5974e45386c4f700b2e649b6b.pack and new/referencing-0.28.5/.git/objects/pack/pack-22fa87dc843471b5974e45386c4f700b2e649b6b.pack differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-336ff868097ed9c76207c634ae7cfbfa4bd2576b.idx and new/referencing-0.28.5/.git/objects/pack/pack-336ff868097ed9c76207c634ae7cfbfa4bd2576b.idx differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-336ff868097ed9c76207c634ae7cfbfa4bd2576b.pack and new/referencing-0.28.5/.git/objects/pack/pack-336ff868097ed9c76207c634ae7cfbfa4bd2576b.pack differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-8d98480cdf751b95b21f65f6aba2b738b0a73ed6.idx and new/referencing-0.28.5/.git/objects/pack/pack-8d98480cdf751b95b21f65f6aba2b738b0a73ed6.idx differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-8d98480cdf751b95b21f65f6aba2b738b0a73ed6.pack and new/referencing-0.28.5/.git/objects/pack/pack-8d98480cdf751b95b21f65f6aba2b738b0a73ed6.pack differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-ba2d38a2b75a303339c0ce058ae8276dd5385329.idx and new/referencing-0.28.5/.git/objects/pack/pack-ba2d38a2b75a303339c0ce058ae8276dd5385329.idx differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-ba2d38a2b75a303339c0ce058ae8276dd5385329.pack and new/referencing-0.28.5/.git/objects/pack/pack-ba2d38a2b75a303339c0ce058ae8276dd5385329.pack differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-c56997946c8e401e90fe9b6d73c797584406b0e5.idx and new/referencing-0.28.5/.git/objects/pack/pack-c56997946c8e401e90fe9b6d73c797584406b0e5.idx differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-c56997946c8e401e90fe9b6d73c797584406b0e5.pack and new/referencing-0.28.5/.git/objects/pack/pack-c56997946c8e401e90fe9b6d73c797584406b0e5.pack differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-c665bbcba8b18a44b8dad71a1a4a19089640aedc.idx and new/referencing-0.28.5/.git/objects/pack/pack-c665bbcba8b18a44b8dad71a1a4a19089640aedc.idx differ Binary files old/referencing-0.28.4/.git/objects/pack/pack-c665bbcba8b18a44b8dad71a1a4a19089640aedc.pack and new/referencing-0.28.5/.git/objects/pack/pack-c665bbcba8b18a44b8dad71a1a4a19089640aedc.pack differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.git/refs/remotes/origin/main new/referencing-0.28.5/.git/refs/remotes/origin/main --- old/referencing-0.28.4/.git/refs/remotes/origin/main 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/.git/refs/remotes/origin/main 2023-05-24 21:33:11.000000000 +0200 @@ -1 +1 @@ -de0d25830a19539d8b0bb31c8661ad65f80011cc +fb511b359283c2543b3e6972b849b1c7edae5703 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.git/refs/tags/v0.28.5 new/referencing-0.28.5/.git/refs/tags/v0.28.5 --- old/referencing-0.28.4/.git/refs/tags/v0.28.5 1970-01-01 01:00:00.000000000 +0100 +++ new/referencing-0.28.5/.git/refs/tags/v0.28.5 2023-05-24 21:33:11.000000000 +0200 @@ -0,0 +1 @@ +db0c4628b2184ce4de5ac6956844b5f736fbfb0d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/.github/workflows/ci.yml new/referencing-0.28.5/.github/workflows/ci.yml --- old/referencing-0.28.4/.github/workflows/ci.yml 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/.github/workflows/ci.yml 2023-05-24 21:33:11.000000000 +0200 @@ -47,6 +47,10 @@ fail-fast: false matrix: noxenv: ${{ fromJson(needs.list.outputs.noxenvs) }} + include: + - os: ubuntu-latest + noxenv: "tests-3.11" + posargs: ghcoverage steps: - uses: actions/checkout@v3 @@ -65,7 +69,7 @@ - name: Set up nox uses: wntrblm/nox@2023.04.22 - name: Run nox - run: nox -s "${{ matrix.noxenv }}" + run: nox -s "${{ matrix.noxenv }}" -- ${{ matrix.posargs }} packaging: needs: ci diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/noxfile.py new/referencing-0.28.5/noxfile.py --- old/referencing-0.28.4/noxfile.py 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/noxfile.py 2023-05-24 21:33:11.000000000 +0200 @@ -23,14 +23,21 @@ @session(python=["3.8", "3.9", "3.10", "3.11", "pypy3"]) def tests(session): session.install("-r", ROOT / "test-requirements.txt") - if session.posargs == ["coverage"]: + + if session.posargs and session.posargs[0] in {"coverage", "ghcoverage"}: session.install("coverage[toml]") - session.run("coverage", "run", "-m", "pytest") + session.run("coverage", "run", "-m", "pytest", REFERENCING) session.run("coverage", "report") else: session.run("pytest", *session.posargs, REFERENCING) +@session() +def audit(session): + session.install("pip-audit", ROOT) + session.run("python", "-m", "pip_audit") + + @session(tags=["build"]) def build(session): session.install("build") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/pyproject.toml new/referencing-0.28.5/pyproject.toml --- old/referencing-0.28.4/pyproject.toml 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/pyproject.toml 2023-05-24 21:33:11.000000000 +0200 @@ -44,13 +44,23 @@ Funding = "https://github.com/sponsors/Julian" Source = "https://github.com/python-jsonschema/referencing" +[tool.coverage.html] +show_contexts = true +skip_covered = false + [tool.coverage.run] branch = true source = ["referencing"] dynamic_context = "test_function" [tool.coverage.report] +exclude_also = [ + "if TYPE_CHECKING:", + "\\s*\\.\\.\\.\\s*", +] fail_under = 100 +show_missing = true +skip_covered = true [tool.doc8] ignore = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/referencing/_core.py new/referencing-0.28.5/referencing/_core.py --- old/referencing-0.28.4/referencing/_core.py 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/referencing/_core.py 2023-05-24 21:33:11.000000000 +0200 @@ -374,21 +374,20 @@ if value is not None: return Retrieved(value=value, registry=registry) - resource = self.get(uri) - if resource is not None: - canonical_uri = resource.id() - if canonical_uri is not None: - value = registry._anchors.get((canonical_uri, name)) - if value is not None: - return Retrieved(value=value, registry=registry) + resource = self[uri] + canonical_uri = resource.id() + if canonical_uri is not None: + value = registry._anchors.get((canonical_uri, name)) + if value is not None: + return Retrieved(value=value, registry=registry) if "/" in name: raise exceptions.InvalidAnchor( ref=uri, - resource=self[uri], + resource=resource, anchor=name, ) - raise exceptions.NoSuchAnchor(ref=uri, resource=self[uri], anchor=name) + raise exceptions.NoSuchAnchor(ref=uri, resource=resource, anchor=name) def contents(self, uri: URI) -> D: """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/referencing/jsonschema.py new/referencing-0.28.5/referencing/jsonschema.py --- old/referencing-0.28.4/referencing/jsonschema.py 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/referencing/jsonschema.py 2023-05-24 21:33:11.000000000 +0200 @@ -233,9 +233,7 @@ Specifically handle even older drafts where there are some funky keywords. """ - def subresources_of(contents: Schema) -> Iterable[ObjectSchema]: - if isinstance(contents, bool): - return + def subresources_of(contents: ObjectSchema) -> Iterable[ObjectSchema]: for each in in_value: if each in contents: yield contents[each] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/referencing/tests/test_core.py new/referencing-0.28.5/referencing/tests/test_core.py --- old/referencing-0.28.4/referencing/tests/test_core.py 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/referencing/tests/test_core.py 2023-05-24 21:33:11.000000000 +0200 @@ -24,6 +24,13 @@ ) +def blow_up(uri): # pragma: no cover + """ + A retriever suitable for use in tests which expect it never to be used. + """ + raise RuntimeError("This retrieve function expects to never be called!") + + class TestRegistry: def test_with_resource(self): """ @@ -181,6 +188,12 @@ ) assert retrieved.registry == registry.crawl() + def test_anchor_in_nonexistent_resource(self): + registry = Registry() + with pytest.raises(exceptions.NoSuchResource) as e: + registry.anchor("urn:example", "foo") + assert e.value == exceptions.NoSuchResource(ref="urn:example") + def test_init(self): one = Resource.opaque(contents={}) two = ID_AND_CHILDREN.create_resource({"foo": "bar"}) @@ -311,7 +324,7 @@ two = ID_AND_CHILDREN.create_resource({"foo": "bar"}) three = ID_AND_CHILDREN.create_resource({"baz": "quux"}) - def retrieve(uri): + def retrieve(uri): # pragma: no cover pass first = Registry().with_resource("http://example.com/1", one) @@ -344,7 +357,7 @@ two = ID_AND_CHILDREN.create_resource({"foo": "bar"}) three = ID_AND_CHILDREN.create_resource({"baz": "quux"}) - def retrieve(uri): + def retrieve(uri): # pragma: no cover pass first = Registry(retrieve=retrieve).with_resource( @@ -383,10 +396,10 @@ two = ID_AND_CHILDREN.create_resource({"foo": "bar"}) three = ID_AND_CHILDREN.create_resource({"baz": "quux"}) - def foo_retrieve(uri): + def foo_retrieve(uri): # pragma: no cover pass - def bar_retrieve(uri): + def bar_retrieve(uri): # pragma: no cover pass first = Registry(retrieve=foo_retrieve).with_resource( @@ -484,21 +497,15 @@ registry.get_or_retrieve("urn:uhoh") def test_retrieve_already_available_resource(self): - def retrieve(uri): - raise Exception("Oh no!") - foo = Resource.opaque({"foo": "bar"}) - registry = Registry({"urn:example": foo}) + registry = Registry({"urn:example": foo}, retrieve=blow_up) assert registry["urn:example"] == foo assert registry.get_or_retrieve("urn:example").value == foo def test_retrieve_first_checks_crawlable_resource(self): - def retrieve(uri): - raise Exception("Oh no!") - child = ID_AND_CHILDREN.create_resource({"ID": "urn:child", "foo": 12}) root = ID_AND_CHILDREN.create_resource({"children": [child.contents]}) - registry = Registry(retrieve=retrieve).with_resource("urn:root", root) + registry = Registry(retrieve=blow_up).with_resource("urn:root", root) assert registry.crawl()["urn:child"] == child def test_resolver(self): @@ -759,6 +766,7 @@ ref = "urn:example#noSuchAnchor" with pytest.raises(exceptions.Unresolvable) as e: resolver.lookup(ref) + assert "'noSuchAnchor' does not exist" in str(e.value) assert e.value == exceptions.NoSuchAnchor( ref="urn:example", resource=root, @@ -788,6 +796,21 @@ resolved = resolver.lookup("http://example.com/") assert resolved.contents == resource.contents + def test_lookup_failed_retrieved_resource(self): + """ + Unretrievable exceptions are also wrapped in Unresolvable. + """ + + uri = "http://example.com/" + + registry = Registry(retrieve=blow_up) + with pytest.raises(exceptions.Unretrievable): + registry.get_or_retrieve(uri) + + resolver = registry.resolver() + with pytest.raises(exceptions.Unresolvable): + resolver.lookup(uri) + def test_repeated_lookup_from_retrieved_resource(self): """ A (custom-)retrieved resource is added to the registry returned by diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/referencing/tests/test_exceptions.py new/referencing-0.28.5/referencing/tests/test_exceptions.py --- old/referencing-0.28.4/referencing/tests/test_exceptions.py 1970-01-01 01:00:00.000000000 +0100 +++ new/referencing-0.28.5/referencing/tests/test_exceptions.py 2023-05-24 21:33:11.000000000 +0200 @@ -0,0 +1,21 @@ +import itertools + +import pytest + +from referencing import Resource, exceptions + + +def pairs(*choices): + return itertools.combinations(choices, 2) + + +@pytest.mark.parametrize( + "one, two", + pairs( + exceptions.NoSuchResource("urn:example:foo"), + exceptions.NoInternalID(Resource.opaque({})), + exceptions.Unresolvable("urn:example:foo"), + ), +) +def test_eq_incompatible_types(one, two): + assert one != two diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/referencing/tests/test_jsonschema.py new/referencing-0.28.5/referencing/tests/test_jsonschema.py --- old/referencing-0.28.4/referencing/tests/test_jsonschema.py 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/referencing/tests/test_jsonschema.py 2023-05-24 21:33:11.000000000 +0200 @@ -181,7 +181,109 @@ assert specification is Specification.OPAQUE -# FIXME: These two also ideally should live in the referencing suite. +# FIXME: The tests below should move to the referencing suite but I haven't yet +# figured out how to represent dynamic (& recursive) ref lookups in it. +def test_lookup_trivial_dynamic_ref(): + one = referencing.jsonschema.DRAFT202012.create_resource( + {"$dynamicAnchor": "foo"}, + ) + resolver = Registry().with_resource("http://example.com", one).resolver() + resolved = resolver.lookup("http://example.com#foo") + assert resolved.contents == one.contents + + +def test_multiple_lookup_trivial_dynamic_ref(): + TRUE = referencing.jsonschema.DRAFT202012.create_resource(True) + root = referencing.jsonschema.DRAFT202012.create_resource( + { + "$id": "http://example.com", + "$dynamicAnchor": "fooAnchor", + "$defs": { + "foo": { + "$id": "foo", + "$dynamicAnchor": "fooAnchor", + "$defs": { + "bar": True, + "baz": { + "$dynamicAnchor": "fooAnchor", + }, + }, + }, + }, + }, + ) + resolver = ( + Registry() + .with_resources( + [ + ("http://example.com", root), + ("http://example.com/foo/", TRUE), + ("http://example.com/foo/bar", root), + ], + ) + .resolver() + ) + + first = resolver.lookup("http://example.com") + second = first.resolver.lookup("foo/") + resolver = second.resolver.lookup("bar").resolver + fourth = resolver.lookup("#fooAnchor") + assert fourth.contents == root.contents + + +def test_multiple_lookup_dynamic_ref_to_nondynamic_ref(): + one = referencing.jsonschema.DRAFT202012.create_resource( + {"$anchor": "fooAnchor"}, + ) + two = referencing.jsonschema.DRAFT202012.create_resource( + { + "$id": "http://example.com", + "$dynamicAnchor": "fooAnchor", + "$defs": { + "foo": { + "$id": "foo", + "$dynamicAnchor": "fooAnchor", + "$defs": { + "bar": True, + "baz": { + "$dynamicAnchor": "fooAnchor", + }, + }, + }, + }, + }, + ) + resolver = ( + Registry() + .with_resources( + [ + ("http://example.com", two), + ("http://example.com/foo/", one), + ("http://example.com/foo/bar", two), + ], + ) + .resolver() + ) + + first = resolver.lookup("http://example.com") + second = first.resolver.lookup("foo/") + resolver = second.resolver.lookup("bar").resolver + fourth = resolver.lookup("#fooAnchor") + assert fourth.contents == two.contents + + +def test_lookup_trivial_recursive_ref(): + one = referencing.jsonschema.DRAFT201909.create_resource( + {"$recursiveAnchor": True}, + ) + resolver = Registry().with_resource("http://example.com", one).resolver() + first = resolver.lookup("http://example.com") + resolved = referencing.jsonschema.lookup_recursive_ref( + resolver=first.resolver, + ) + assert resolved.contents == one.contents + + def test_lookup_recursive_ref_to_bool(): TRUE = referencing.jsonschema.DRAFT201909.create_resource(True) registry = Registry({"http://example.com": TRUE}) @@ -229,3 +331,48 @@ resolver = second.resolver.lookup("bar").resolver fourth = referencing.jsonschema.lookup_recursive_ref(resolver=resolver) assert fourth.contents == root.contents + + +def test_multiple_lookup_recursive_ref_with_nonrecursive_ref(): + one = referencing.jsonschema.DRAFT201909.create_resource( + {"$recursiveAnchor": True}, + ) + two = referencing.jsonschema.DRAFT201909.create_resource( + { + "$id": "http://example.com", + "$recursiveAnchor": True, + "$defs": { + "foo": { + "$id": "foo", + "$recursiveAnchor": True, + "$defs": { + "bar": True, + "baz": { + "$recursiveAnchor": True, + "$anchor": "fooAnchor", + }, + }, + }, + }, + }, + ) + three = referencing.jsonschema.DRAFT201909.create_resource( + {"$recursiveAnchor": False}, + ) + resolver = ( + Registry() + .with_resources( + [ + ("http://example.com", three), + ("http://example.com/foo/", two), + ("http://example.com/foo/bar", one), + ], + ) + .resolver() + ) + + first = resolver.lookup("http://example.com") + second = first.resolver.lookup("foo/") + resolver = second.resolver.lookup("bar").resolver + fourth = referencing.jsonschema.lookup_recursive_ref(resolver=resolver) + assert fourth.contents == two.contents diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/referencing-0.28.4/referencing/tests/test_referencing_suite.py new/referencing-0.28.5/referencing/tests/test_referencing_suite.py --- old/referencing-0.28.4/referencing/tests/test_referencing_suite.py 2023-05-23 22:36:13.000000000 +0200 +++ new/referencing-0.28.5/referencing/tests/test_referencing_suite.py 2023-05-24 21:33:11.000000000 +0200 @@ -10,7 +10,7 @@ class SuiteNotFound(Exception): - def __str__(self): + def __str__(self): # pragma: no cover return ( "Cannot find the referencing suite. " "Set the REFERENCING_SUITE environment variable to the path to " @@ -19,11 +19,11 @@ ) -if "REFERENCING_SUITE" in os.environ: +if "REFERENCING_SUITE" in os.environ: # pragma: no cover SUITE = Path(os.environ["REFERENCING_SUITE"]) / "tests" else: SUITE = Path(__file__).parent.parent.parent / "suite/tests" -if not SUITE.is_dir(): +if not SUITE.is_dir(): # pragma: no cover raise SuiteNotFound() DIALECT_IDS = json.loads(SUITE.joinpath("specifications.json").read_text()) @@ -56,7 +56,7 @@ assert resolved.contents == test["target"] then = test.get("then") - while then: + while then: # pragma: no cover with subtests.test(test=test, then=then): resolved = resolved.resolver.lookup(then["ref"]) assert resolved.contents == then["target"]