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}

Reply via email to