Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-asdf for openSUSE:Factory checked in at 2026-03-29 20:01:00 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-asdf (Old) and /work/SRC/openSUSE:Factory/.python-asdf.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-asdf" Sun Mar 29 20:01:00 2026 rev:31 rq:1343410 version:5.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-asdf/python-asdf.changes 2026-03-23 17:13:58.843202952 +0100 +++ /work/SRC/openSUSE:Factory/.python-asdf.new.8177/python-asdf.changes 2026-03-29 20:01:28.719375903 +0200 @@ -1,0 +2,9 @@ +Sun Mar 29 10:22:52 UTC 2026 - Dirk Müller <[email protected]> + +- update to 5.2.0: + * Fix bug in validation where a failure within a schema + combiner can result in failure to correctly validate a tree. + * Remove unused dependency asdf-transform-schemas. + * Drop support for python 3.9. + +------------------------------------------------------------------- Old: ---- asdf-5.1.0.tar.gz New: ---- asdf-5.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-asdf.spec ++++++ --- /var/tmp/diff_new_pack.fQRf1e/_old 2026-03-29 20:01:29.667414961 +0200 +++ /var/tmp/diff_new_pack.fQRf1e/_new 2026-03-29 20:01:29.671415127 +0200 @@ -27,7 +27,7 @@ %{?sle15_python_module_pythons} Name: python-asdf%{psuffix} -Version: 5.1.0 +Version: 5.2.0 Release: 0 Summary: Python tools to handle ASDF files License: BSD-2-Clause AND BSD-3-Clause ++++++ asdf-5.1.0.tar.gz -> asdf-5.2.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/.github/workflows/benchmark.yml new/asdf-5.2.0/.github/workflows/benchmark.yml --- old/asdf-5.1.0/.github/workflows/benchmark.yml 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/.github/workflows/benchmark.yml 2026-03-19 20:33:05.000000000 +0100 @@ -7,7 +7,6 @@ push: branches: - main - - stable - '*.x' tags: - '*' @@ -31,7 +30,7 @@ name: Run benchmarks runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 with: @@ -40,6 +39,6 @@ run: pip install pytest-codspeed .[benchmark] - uses: CodSpeedHQ/action@v4 with: - run: pytest benchmarks/ --codspeed --codspeed-mode instrumentation - mode: instrumentation + run: pytest benchmarks/ --codspeed --codspeed-mode simulation + mode: simulation token: ${{ secrets.CODSPEED_TOKEN }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/.github/workflows/changelog.yml new/asdf-5.2.0/.github/workflows/changelog.yml --- old/asdf-5.1.0/.github/workflows/changelog.yml 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/.github/workflows/changelog.yml 2026-03-19 20:33:05.000000000 +0100 @@ -21,7 +21,7 @@ - uses: actions/setup-python@v6 with: python-version: 3 - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - run: pip install . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/.github/workflows/ci.yml new/asdf-5.2.0/.github/workflows/ci.yml --- old/asdf-5.1.0/.github/workflows/ci.yml 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/.github/workflows/ci.yml 2026-03-19 20:33:05.000000000 +0100 @@ -7,7 +7,6 @@ push: branches: - main - - stable - '*.x' tags: - '*' @@ -31,7 +30,7 @@ pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 - uses: pre-commit/[email protected] core: @@ -39,10 +38,11 @@ uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.10' envs: | - linux: coverage + name: Python 3.14 coverage + python-version: 3.14 + - linux: coverage name: Python 3.13 coverage python-version: 3.13 - linux: coverage @@ -54,9 +54,6 @@ - linux: coverage name: Python 3.10 coverage python-version: 3.10 - - linux: coverage - name: Python 3.9 coverage - python-version: 3.9 coverage: codecov jsonschema: @@ -64,29 +61,26 @@ if: (github.repository == 'asdf-format/asdf' && (github.event_name == 'schedule' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || contains(github.event.pull_request.labels.*.name, 'jsonschema'))) with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.10' envs: | - linux: jsonschema + python-version: 3.12 asdf-schemas: needs: [core] uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.10' envs: | - linux: asdf-standard + python-version: 3.12 - linux: asdf-transform-schemas + python-version: 3.12 test: needs: [core] uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.11' envs: | - macos: py311-parallel - windows: py311-parallel @@ -96,17 +90,14 @@ uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.11' envs: | - linux: py310-coverage-devdeps-parallel - linux: py311-coverage-devdeps-parallel - linux: py312-coverage-devdeps-parallel - linux: py313-coverage-devdeps-parallel - linux: py314-coverage-devdeps-parallel - python-version: '3.14-dev' # separate pytest so a failure here doesn't cause the whole suite to fail - - linux: py311-coverage-pytestdev-parallel + - linux: py314-coverage-pytestdev-parallel coverage: codecov oldest: @@ -114,27 +105,23 @@ uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.9' envs: | - - linux: py39-oldestdeps-parallel + - linux: py310-oldestdeps-parallel compatibility: needs: [core] uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.11' envs: | - linux: compatibility + python-version: 3.11 mocks3: needs: [core] uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v2 with: submodules: false - # Any env name which does not start with `pyXY` will use this Python version. - default_python: '3.11' envs: | - linux: mocks3 + python-version: 3.12 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/CHANGES.rst new/asdf-5.2.0/CHANGES.rst --- old/asdf-5.1.0/CHANGES.rst 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/CHANGES.rst 2026-03-19 20:33:05.000000000 +0100 @@ -1,3 +1,28 @@ +5.2.0 (2026-03-19) +================== + +Bugfix +------ + +- Fix bug in validation where a failure within a schema combiner can result in + failure to correctly validate a tree. (`#1999 + <https://github.com/asdf-format/asdf/pull/1999>`_) + + +General +------- + +- Remove unused dependency asdf-transform-schemas. (`#1965 + <https://github.com/asdf-format/asdf/pull/1965>`_) + + +Removal +------- + +- Drop support for python 3.9. (`#1992 + <https://github.com/asdf-format/asdf/pull/1992>`_) + + 5.1.0 (2025-11-06) ================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/PKG-INFO new/asdf-5.2.0/PKG-INFO --- old/asdf-5.1.0/PKG-INFO 2025-11-06 17:08:58.844089500 +0100 +++ new/asdf-5.2.0/PKG-INFO 2026-03-19 20:33:17.444121000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: asdf -Version: 5.1.0 +Version: 5.2.0 Summary: Python implementation of the ASDF Standard Author: The ASDF Developers Project-URL: documentation, https://asdf.readthedocs.io/en/stable/ @@ -9,16 +9,15 @@ Classifier: Development Status :: 5 - Production/Stable Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Requires-Python: >=3.9 +Requires-Python: >=3.10 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: asdf-standard>=1.1.0 -Requires-Dist: asdf-transform-schemas>=0.3 Requires-Dist: importlib-metadata>=4.11.4; python_version <= "3.11" Requires-Dist: jmespath>=0.6.2 Requires-Dist: numpy>=1.22 Requires-Dist: packaging>=19 -Requires-Dist: pyyaml>=5.4.1 +Requires-Dist: pyyaml>=6.0 Requires-Dist: semantic_version>=2.8 Requires-Dist: attrs>=22.2.0 Provides-Extra: all @@ -38,7 +37,6 @@ Requires-Dist: asdf[all]; extra == "tests" Requires-Dist: psutil; extra == "tests" Requires-Dist: pytest>=8; extra == "tests" -Requires-Dist: pytest-remotedata; extra == "tests" Provides-Extra: test Requires-Dist: asdf[tests]; extra == "test" Provides-Extra: benchmark diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf/_tests/test_asdf.py new/asdf-5.2.0/asdf/_tests/test_asdf.py --- old/asdf-5.1.0/asdf/_tests/test_asdf.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/asdf/_tests/test_asdf.py 2026-03-19 20:33:05.000000000 +0100 @@ -359,7 +359,6 @@ assert_tree_match(tree, af.tree) [email protected]_data() def test_fsspec_http(httpserver): """ Issue #1146 reported errors when opening a fsspec url (using the http diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf/_tests/test_generic_io.py new/asdf-5.2.0/asdf/_tests/test_generic_io.py --- old/asdf-5.1.0/asdf/_tests/test_generic_io.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/asdf/_tests/test_generic_io.py 2026-03-19 20:33:05.000000000 +0100 @@ -236,7 +236,6 @@ assert len(x) == 60 [email protected]_data() def test_urlopen(tree, httpserver): path = os.path.join(httpserver.tmpdir, "test.asdf") @@ -252,7 +251,6 @@ assert not isinstance(ff._blocks.blocks[0].cached_data, np.memmap) [email protected]_data() def test_http_connection(tree, httpserver): path = os.path.join(httpserver.tmpdir, "test.asdf") @@ -306,7 +304,6 @@ helpers.assert_tree_match(tree, ff.tree) [email protected]_data() def test_exploded_http(tree, httpserver): path = os.path.join(httpserver.tmpdir, "test.asdf") @@ -809,7 +806,6 @@ assert ai == i [email protected]_data() def test_fsspec_http(httpserver): """ Issue #1146 reported errors when opening a fsspec url (using the http diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf/_tests/test_history.py new/asdf-5.2.0/asdf/_tests/test_history.py --- old/asdf-5.1.0/asdf/_tests/test_history.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/asdf/_tests/test_history.py 2026-03-19 20:33:05.000000000 +0100 @@ -20,7 +20,7 @@ ) assert len(ff.tree["history"]["entries"]) == 1 - with pytest.raises(ValidationError, match=r".* is not valid under any of the given schemas"): + with pytest.raises(ValidationError, match=r"'name' is a required property"): ff.add_history_entry("That happened", {"author": "John Doe", "version": "2.0"}) assert len(ff.tree["history"]["entries"]) == 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf/_tests/test_reference.py new/asdf-5.2.0/asdf/_tests/test_reference.py --- old/asdf-5.1.0/asdf/_tests/test_reference.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/asdf/_tests/test_reference.py 2026-03-19 20:33:05.000000000 +0100 @@ -112,8 +112,7 @@ assert_array_equal(ff.tree["internal"], exttree["cool_stuff"]["a"]) [email protected]_data() -def test_external_reference_invalid(tmp_path): +def test_external_reference_invalid(tmp_path, httpserver): tree = {"foo": {"$ref": "fail.asdf"}} ff = asdf.AsdfFile() @@ -122,11 +121,10 @@ with pytest.raises(ValueError, match=r"Resolved to relative URL"): ff.resolve_references() - ff = asdf.AsdfFile({}, uri="http://httpstat.us/404") + ff = asdf.AsdfFile({}, uri=httpserver.url) ff.tree = tree ff.find_references() - msg = r"[HTTP Error 404: Not Found, HTTP Error 502: Bad Gateway]" # if httpstat.us is down 502 is returned. - with pytest.raises(IOError, match=msg): + with pytest.raises(IOError, match=r"fail.asdf"): ff.resolve_references() ff = asdf.AsdfFile({}, uri=(tmp_path / "main.asdf").as_uri()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf/_tests/test_schema.py new/asdf-5.2.0/asdf/_tests/test_schema.py --- old/asdf-5.1.0/asdf/_tests/test_schema.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/asdf/_tests/test_schema.py 2026-03-19 20:33:05.000000000 +0100 @@ -1089,3 +1089,42 @@ schema.validate(instance, schema=schema_tree) with pytest.raises(ValidationError, match=r"mismatched tags, wanted .*, got .*"): schema.validate(tagged.TaggedDict(tag="asdf://somewhere.org/tags/foo-1.0"), schema=schema_tree) + + +def test_fail_under_combiner(): + """ + Test that a failed validation under a schema combiner that allows failures + (oneOf, etc) does not result in an incorrect passing of validation + which used to be the case due to a bug in how repeat nodes + were handled. + + See: https://github.com/asdf-format/asdf/issues/2000 + """ + yaml_str = b"""#ASDF 1.0.0 +#ASDF_STANDARD 1.6.0 +%YAML 1.1 +%TAG ! tag:stsci.edu:asdf/ +--- !core/asdf-1.1.0 +obj: !core/complex-1.0.0 foo +...""" + + schema_id = "http://example.com/failing-1.0.0" + schema_str = f"""%YAML 1.1 +--- +$schema: "http://stsci.edu/schemas/yaml-schema/draft-01" +id: {schema_id} +properties: + obj: + oneOf: + - $ref: "http://stsci.edu/schemas/asdf/core/complex-1.0.0" + - true +...""" + + with asdf.config_context() as cfg: + cfg.add_resource_mapping({schema_id: schema_str}) + bio = io.BytesIO(yaml_str) + with pytest.raises(ValidationError, match=r"'foo' does not match"): + # using lazy_tree here to that the invalid complex is not + # deserialized (but is still validated) + with asdf.open(bio, custom_schema=schema_id, lazy_tree=True): + pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf/_version.py new/asdf-5.2.0/asdf/_version.py --- old/asdf-5.1.0/asdf/_version.py 2025-11-06 17:08:58.000000000 +0100 +++ new/asdf-5.2.0/asdf/_version.py 2026-03-19 20:33:17.000000000 +0100 @@ -28,7 +28,7 @@ commit_id: COMMIT_ID __commit_id__: COMMIT_ID -__version__ = version = '5.1.0' -__version_tuple__ = version_tuple = (5, 1, 0) +__version__ = version = '5.2.0' +__version_tuple__ = version_tuple = (5, 2, 0) -__commit_id__ = commit_id = 'g740c807b2' +__commit_id__ = commit_id = 'gf757db772' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf/schema.py new/asdf-5.2.0/asdf/schema.py --- old/asdf-5.1.0/asdf/schema.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/asdf/schema.py 2026-03-19 20:33:05.000000000 +0100 @@ -2,6 +2,7 @@ import datetime import json import warnings +import weakref from collections import OrderedDict from collections.abc import Mapping from functools import lru_cache @@ -206,6 +207,9 @@ """ self._seen.add(self._make_seen_key(instance, schema)) + def remove(self, instance, schema): + self._seen.remove(self._make_seen_key(instance, schema)) + def seen(self, instance, schema): """ Return True if an instance has already been @@ -251,12 +255,46 @@ def init(self, *args, **kwargs): self.ctx = kwargs.pop("ctx", None) + # cache evolved validators to avoid evolving more than one + # validator for the same schema + self.evolved_validators = kwargs.pop("evolved_validators", {}) self.serialization_context = kwargs.pop("serialization_context", None) original_init(self, *args, **kwargs) cls.__init__ = init + def _patch_evolve(cls): + original_evolve = cls.evolve + + def evolve(self, **changes): + if "schema" not in changes or len(changes) > 1: + raise NotImplementedError("only evolving the schema is supported") + + # evolved validators are cached by the schema id + schema_key = id(changes["schema"]) + + # check if this is an already evolved validator + if hasattr(self, "parent"): + # if so, resolve the weakref to the parent + parent = self.parent() + else: + parent = self + + # check for a cached evolved validator + if schema_key in parent.evolved_validators: + return parent.evolved_validators[schema_key] + + # evolve a new validator + validator = original_evolve(self, **changes) + validator.ctx = self.ctx + validator.parent = weakref.ref(parent) + validator.serialization_context = self.serialization_context + parent.evolved_validators[schema_key] = validator + return validator + + cls.evolve = evolve + def _patch_iter_errors(cls): original_iter_errors = cls.iter_errors @@ -279,20 +317,31 @@ if (isinstance(instance, dict) and "$ref" in instance) or isinstance(instance, reference.Reference): return - if not self.schema: - tag = tagged.get_tag(instance) - if tag is not None and self.serialization_context.extension_manager.handles_tag_definition(tag): - tag_def = self.serialization_context.extension_manager.get_tag_definition(tag) - schema_uris = tag_def.schema_uris - - # Must validate against all schema_uris - for schema_uri in schema_uris: - try: - with self.resolver.resolving(schema_uri) as resolved: + tag = tagged.get_tag(instance) + + if tag is not None and self.serialization_context.extension_manager.handles_tag_definition(tag): + tag_def = self.serialization_context.extension_manager.get_tag_definition(tag) + schema_uris = tag_def.schema_uris + + # Must validate against all schema_uris + for schema_uri in schema_uris: + try: + with self.resolver.resolving(schema_uri) as resolved: + if resolved != self.schema: yield from self.descend(instance, resolved) - except RefResolutionError: - warnings.warn(f"Unable to locate schema file for '{tag}': '{schema_uri}'", AsdfWarning) + except RefResolutionError: + warnings.warn(f"Unable to locate schema file for '{tag}': '{schema_uri}'", AsdfWarning) + if self.schema: + for error in original_iter_errors(self, instance): + # since this validation failed, remove the "seen" mark + # since it's ok for validation to fail under some schema combiners + # but we want to re-evaluate (and fail) when not under one + # of those combiners + if self._context.seen(instance, self.schema): + self._context.remove(instance, self.schema) + yield error + else: if isinstance(instance, dict): for val in instance.values(): yield from self.iter_errors(val) @@ -300,13 +349,12 @@ elif isinstance(instance, list): for val in instance: yield from self.iter_errors(val) - else: - yield from original_iter_errors(self, instance) cls.iter_errors = iter_errors _patch_init(ASDFvalidator) _patch_iter_errors(ASDFvalidator) + _patch_evolve(ASDFvalidator) return ASDFvalidator @@ -575,7 +623,7 @@ tag on the instance. The additional ``*args`` and ``**kwargs`` are passed along to - `~jsonschema.protocols.Validator.validate`. + the validator. Parameters ---------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf.egg-info/PKG-INFO new/asdf-5.2.0/asdf.egg-info/PKG-INFO --- old/asdf-5.1.0/asdf.egg-info/PKG-INFO 2025-11-06 17:08:58.000000000 +0100 +++ new/asdf-5.2.0/asdf.egg-info/PKG-INFO 2026-03-19 20:33:17.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: asdf -Version: 5.1.0 +Version: 5.2.0 Summary: Python implementation of the ASDF Standard Author: The ASDF Developers Project-URL: documentation, https://asdf.readthedocs.io/en/stable/ @@ -9,16 +9,15 @@ Classifier: Development Status :: 5 - Production/Stable Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Requires-Python: >=3.9 +Requires-Python: >=3.10 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: asdf-standard>=1.1.0 -Requires-Dist: asdf-transform-schemas>=0.3 Requires-Dist: importlib-metadata>=4.11.4; python_version <= "3.11" Requires-Dist: jmespath>=0.6.2 Requires-Dist: numpy>=1.22 Requires-Dist: packaging>=19 -Requires-Dist: pyyaml>=5.4.1 +Requires-Dist: pyyaml>=6.0 Requires-Dist: semantic_version>=2.8 Requires-Dist: attrs>=22.2.0 Provides-Extra: all @@ -38,7 +37,6 @@ Requires-Dist: asdf[all]; extra == "tests" Requires-Dist: psutil; extra == "tests" Requires-Dist: pytest>=8; extra == "tests" -Requires-Dist: pytest-remotedata; extra == "tests" Provides-Extra: test Requires-Dist: asdf[tests]; extra == "test" Provides-Extra: benchmark diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/asdf.egg-info/requires.txt new/asdf-5.2.0/asdf.egg-info/requires.txt --- old/asdf-5.1.0/asdf.egg-info/requires.txt 2025-11-06 17:08:58.000000000 +0100 +++ new/asdf-5.2.0/asdf.egg-info/requires.txt 2026-03-19 20:33:17.000000000 +0100 @@ -1,9 +1,8 @@ asdf-standard>=1.1.0 -asdf-transform-schemas>=0.3 jmespath>=0.6.2 numpy>=1.22 packaging>=19 -pyyaml>=5.4.1 +pyyaml>=6.0 semantic_version>=2.8 attrs>=22.2.0 @@ -40,4 +39,3 @@ asdf[all] psutil pytest>=8 -pytest-remotedata diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/docs/asdf/arrays.rst new/asdf-5.2.0/docs/asdf/arrays.rst --- old/asdf-5.1.0/docs/asdf/arrays.rst 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/docs/asdf/arrays.rst 2026-03-19 20:33:05.000000000 +0100 @@ -209,7 +209,7 @@ that streams a large CSV file containing rows of integer data and converts it to numpy arrays stored in ASDF: -.. doctest-skip:: +.. code:: import csv import numpy as np diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/docs/asdf/extending/resources.rst new/asdf-5.2.0/docs/asdf/extending/resources.rst --- old/asdf-5.1.0/docs/asdf/extending/resources.rst 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/docs/asdf/extending/resources.rst 2026-03-19 20:33:05.000000000 +0100 @@ -128,7 +128,7 @@ from asdf.schema import load_schema - uri = "asdf://example.com/example-project/schemas/nested/bar-2.3.4.yaml" + uri = "asdf://example.com/example-project/schemas/nested/bar-2.3.4" schema = load_schema(uri) assert schema["id"] == uri @@ -216,7 +216,7 @@ from asdf.schema import load_schema - uri = "asdf://example.com/example-project/schemas/nested/bar-2.3.4.yaml" + uri = "asdf://example.com/example-project/schemas/nested/bar-2.3.4" schema = load_schema(uri) assert schema["id"] == uri diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/docs/conf.py new/asdf-5.2.0/docs/conf.py --- old/asdf-5.1.0/docs/conf.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/docs/conf.py 2026-03-19 20:33:05.000000000 +0100 @@ -7,8 +7,6 @@ else: import tomllib -from sphinx_asdf.conf import * # noqa: F403 - # The standard library importlib.metadata returns duplicate entrypoints # for all python versions up to and including 3.11 # https://github.com/python/importlib_metadata/issues/410#issuecomment-1304258228 @@ -59,10 +57,15 @@ ] # Add intersphinx mappings -intersphinx_mapping["semantic_version"] = ("https://python-semanticversion.readthedocs.io/en/latest/", None) -intersphinx_mapping["jsonschema"] = ("https://python-jsonschema.readthedocs.io/en/stable/", None) -intersphinx_mapping["stdatamodels"] = ("https://stdatamodels.readthedocs.io/en/latest/", None) -intersphinx_mapping["pytest"] = ("https://docs.pytest.org/en/latest/", None) +intersphinx_mapping = { + "numpy": ("https://numpy.org/doc/stable/", None), + "pypa-packaging": ("https://packaging.python.org/en/latest/", None), + "pytest": ("https://docs.pytest.org/en/latest/", None), + "python": ("https://docs.python.org/3/", None), + "semantic_version": ("https://python-semanticversion.readthedocs.io/en/latest/", None), + "stdatamodels": ("https://stdatamodels.readthedocs.io/en/latest/", None), +} + # Docs are hosted as a "subproject" under the main project's domain: https://www.asdf-format.org/projects # This requires including links to main project (asdf-website) and the other asdf subprojects @@ -77,19 +80,63 @@ "asdf-wcs-schemas": ("https://www.asdf-format.org/projects/asdf-wcs-schemas/en/latest/", None), } -intersphinx_mapping.update(subprojects) # noqa: F405 -extensions += ["sphinx_inline_tabs", "sphinx.ext.intersphinx", "sphinx.ext.extlinks"] # noqa: F405 +intersphinx_mapping.update(subprojects) + +extensions = [ + # TODO clean these up, do we need them all? + "sphinx_inline_tabs", + "sphinx.ext.intersphinx", + "sphinx.ext.extlinks", + "sphinx_asdf", + "sphinx.ext.autodoc", + "sphinx.ext.coverage", + "sphinx.ext.inheritance_diagram", + "sphinx.ext.intersphinx", + "sphinx.ext.mathjax", + "sphinx.ext.todo", + "sphinx.ext.viewcode", + "sphinxcontrib.jquery", + "numpydoc", + "sphinx_automodapi.automodapi", + "sphinx_automodapi.smart_resolver", +] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ["_build"] + +# The suffix of source filenames. +source_suffix = ".rst" + +# The master toctree document. +master_doc = "index" + +# The reST default role (used for this markup: `text`) to use for all +# documents. Set to the "smart" one. +default_role = "obj" + +# Don't show summaries of the members in each class along with the +# class' docstring +numpydoc_show_class_members = False + +autosummary_generate = True + +automodapi_toctreedirnm = "api" + +# Class documentation should contain *both* the class docstring and +# the __init__ docstring +autoclass_content = "both" html_theme = "furo" html_static_path = ["_static"] -# Override default settings from sphinx_asdf / sphinx_astropy (incompatible with furo) html_sidebars = {} # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "_static/images/favicon.ico" html_logo = "" +html_last_updated_fmt = "%d %b %Y" globalnavlinks = { "ASDF Projects": "https://www.asdf-format.org", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/docs/rtd_environment.yaml new/asdf-5.2.0/docs/rtd_environment.yaml --- old/asdf-5.1.0/docs/rtd_environment.yaml 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/docs/rtd_environment.yaml 2026-03-19 20:33:05.000000000 +0100 @@ -1,9 +1,8 @@ name: rtd311 channels: - conda-forge - - defaults dependencies: - - python=3.11 + - python=3.13 - pip - graphviz - furo diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/integration_tests/compatibility/test_file_compatibility.py new/asdf-5.2.0/integration_tests/compatibility/test_file_compatibility.py --- old/asdf-5.1.0/integration_tests/compatibility/test_file_compatibility.py 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/integration_tests/compatibility/test_file_compatibility.py 2026-03-19 20:33:05.000000000 +0100 @@ -2,12 +2,10 @@ import os import subprocess import urllib.request -from contextlib import contextmanager from itertools import groupby from pathlib import Path import pytest -import pytest_remotedata from common import assert_file_correct, generate_file from packaging.version import Version @@ -42,22 +40,6 @@ NDARRAY_1_1_0_STANDARD_VERSION = AsdfVersion("1.6.0") -@contextmanager -def internet_temporarily_enabled(verbose=False): - """ - Context manager that temporarily enables pytest_remotedata - internet. - """ - initially_disabled = pytest_remotedata.disable_internet.INTERNET_OFF - - pytest_remotedata.disable_internet.turn_on_internet(verbose=verbose) - try: - yield - finally: - if initially_disabled: - pytest_remotedata.disable_internet.turn_off_internet(verbose=verbose) - - def fetch_package_versions(package_name): """ Request a package's available versions from pypi.org metadata. @@ -84,10 +66,7 @@ return [max(group) for _, group in groupby(versions, key=key_fn)] -# Enable internet here, otherwise pytest_remotedata will complain -# (and @pytest.mark.remote_data doesn't work on non-test methods). -with internet_temporarily_enabled(): - PATCH_VERSIONS = sorted(fetch_latest_patch_versions("asdf")) +PATCH_VERSIONS = sorted(fetch_latest_patch_versions("asdf")) def env_run(env_path, command, *args, **kwargs): @@ -142,11 +121,14 @@ assert subprocess.run(["virtualenv", str(path)]).returncode == 0 # noqa: S603,S607 + # we include pkg_resources here since newer versions of setuptools + # don't provide it and older versions of asdf need it assert env_run( path, "pip", "install", f"asdf=={asdf_version}", + "setuptools<82.0.0", capture_output=True, ), f"Failed to install asdf version {asdf_version}" @@ -167,7 +149,6 @@ os.chdir(original_cwd) [email protected]_data() def test_file_compatibility(asdf_version, env_path, tmp_path): # Sanity check to ensure we're not accidentally comparing # the current code to itself. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/pyproject.toml new/asdf-5.2.0/pyproject.toml --- old/asdf-5.1.0/pyproject.toml 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/pyproject.toml 2026-03-19 20:33:05.000000000 +0100 @@ -4,7 +4,7 @@ readme = 'README.rst' license-files = ['LICENSE'] authors = [{ name = 'The ASDF Developers' }] -requires-python = '>=3.9' +requires-python = '>=3.10' classifiers = [ 'Development Status :: 5 - Production/Stable', 'Programming Language :: Python', @@ -15,12 +15,11 @@ ] dependencies = [ "asdf-standard>=1.1.0", - "asdf-transform-schemas>=0.3", # required for asdf-1.0.0 schema "importlib-metadata>=4.11.4 ; python_version<='3.11'", "jmespath>=0.6.2", "numpy>=1.22", "packaging>=19", - "pyyaml>=5.4.1", + "pyyaml>=6.0", "semantic_version>=2.8", # for vendorized jsonschema "attrs>=22.2.0", @@ -48,7 +47,6 @@ "asdf[all]", "psutil", "pytest>=8", - "pytest-remotedata", ] test = [ "asdf[tests]", @@ -107,7 +105,6 @@ [tool.pytest.ini_options] testpaths = ['asdf', 'docs'] minversion = 4.6 -remote_data_strict = true filterwarnings = [ 'error', # also set in _tests/conftest to work with pyargs 'ignore:numpy.ndarray size changed:RuntimeWarning', @@ -170,7 +167,7 @@ ] [tool.ruff] -target-version = "py39" +target-version = "py310" line-length = 120 extend-exclude = ["asdf/_extern/*", "asdf/_jsonschema/*", "docs/*"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/asdf-5.1.0/tox.ini new/asdf-5.2.0/tox.ini --- old/asdf-5.1.0/tox.ini 2025-11-06 17:08:46.000000000 +0100 +++ new/asdf-5.2.0/tox.ini 2026-03-19 20:33:05.000000000 +0100 @@ -3,7 +3,7 @@ compatibility mocks3 coverage - py{39,310,311,312,313}{,-compatibility,-coverage,-jsonschema}{,-devdeps}{,-parallel}{,-pytestdev} + py{310,311,312,313}{,-compatibility,-coverage,-jsonschema}{,-devdeps}{,-parallel}{,-pytestdev} asdf{-standard,-transform-schemas,-unit-schemas,-wcs-schemas,-coordinates-schemas,-astropy,-zarr,-compression} astrocut gwcs @@ -21,7 +21,7 @@ devdeps: ASDF_UNSTABLE_CORE_SCHEMAS = 1 deps = compatibility: virtualenv - coverage: coverage + coverage: pytest-cov devdeps: -rrequirements-dev.txt numpydev: cython oldestdeps: minimum_dependencies @@ -30,7 +30,7 @@ mocks3: moto[s3,server] mocks3: boto mocks3: fsspec - mocks3: s3fs + mocks3: s3fs>2023.12.1 extras = all,tests # astropy will complain if the home directory is missing pass_env = HOME @@ -47,23 +47,15 @@ # print out the default core schemas version python -c "import asdf; print(f'Core schemas default version: {asdf.get_config().default_version}')" commands = -# coverage run must be used because the pytest-asdf plugin will interfere -# with proper coverage measurement due to the order pytest loads its -# entry points. - coverage: coverage run --source=asdf --rcfile={tox_root}/pyproject.toml -m \ pytest \ devdeps: -W "ignore::asdf_standard.exceptions.UnstableCoreSchemasWarning" compatibility: integration_tests/compatibility/ \ mocks3: integration_tests/mocks3/ \ - --remote-data \ --durations=10 \ jsonschema: --jsonschema \ parallel: --numprocesses auto \ -# the OpenAstronomy workflow appends `--cov-report` in `{posargs}`, which `coverage` doesn't recognize - !coverage: {posargs} - coverage: - coverage: coverage xml -o {tox_root}/coverage.xml - coverage: coverage report + coverage: --cov --cov-config pyproject.toml --cov-report term-missing --cov-report xml + {posargs} [testenv:asdf-standard] change_dir = {env_tmp_dir}
