From noreply at release.debian.org  Sat Aug  1 05:39:10 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Sat, 01 Aug 2026 04:39:10 +0000
Subject: osmpbf 1.7.0-1 MIGRATED to testing
Message-ID: <E1wq1V8-00000000k0v-3eJl@respighi.debian.org>

FYI: The status of the osmpbf source package
in Debian's testing distribution has changed.

  Previous version: 1.6.1-4
  Current version:  1.7.0-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From gitlab at salsa.debian.org  Sat Aug  1 06:57:45 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Sat, 01 Aug 2026 05:57:45 +0000
Subject: [Git][debian-gis-team/qgis][master] Move from experimental to
 unstable.
Message-ID: <6a6d8ad934667_551faeec3266f5@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / qgis


Commits:
5e34b622 by Bas Couwenberg at 2026-08-01T06:30:31+02:00
Move from experimental to unstable.

- - - - -


1 changed file:

- debian/changelog


Changes:

=====================================
debian/changelog
=====================================
@@ -1,3 +1,9 @@
+qgis (3.44.13+dfsg-1) unstable; urgency=medium
+
+  * Move from experimental to unstable.
+
+ -- Bas Couwenberg <sebastic at debian.org>  Sat, 01 Aug 2026 06:30:23 +0200
+
 qgis (3.44.13+dfsg-1~exp1) experimental; urgency=medium
 
   [ Pino Toscano ]



View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/commit/5e34b622e5e229541cdfd720c66e574cae2db13b

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/commit/5e34b622e5e229541cdfd720c66e574cae2db13b
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/54c2b9b0/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  1 06:57:54 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Sat, 01 Aug 2026 05:57:54 +0000
Subject: [Git][debian-gis-team/qgis] Pushed new tag debian/3.44.13+dfsg-1
Message-ID: <6a6d8ae2810d2_551fb784326823@godard.mail>



Bas Couwenberg pushed new tag debian/3.44.13+dfsg-1 at Debian GIS Project / qgis

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/tree/debian/3.44.13+dfsg-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/020a1098/attachment.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  1 07:08:40 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 06:08:40 +0000
Subject: Processing of qgis_3.44.13+dfsg-1_source.changes
Message-ID: <E1wq2tk-00Dggq-1f@usper.debian.org>

qgis_3.44.13+dfsg-1_source.changes uploaded successfully to localhost
along with the files:
  qgis_3.44.13+dfsg-1.dsc
  qgis_3.44.13+dfsg-1.debian.tar.xz
  qgis_3.44.13+dfsg-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Sat Aug  1 07:19:20 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 06:19:20 +0000
Subject: qgis_3.44.13+dfsg-1_source.changes ACCEPTED into unstable
Message-ID: <E1wq344-0000000Djzl-173L@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Sat, 01 Aug 2026 06:30:23 +0200
Source: qgis
Architecture: source
Version: 3.44.13+dfsg-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Changes:
 qgis (3.44.13+dfsg-1) unstable; urgency=medium
 .
   * Move from experimental to unstable.
Checksums-Sha1:
 886b9b628f40fde1444e34b8a38a1a28d047a9d8 5365 qgis_3.44.13+dfsg-1.dsc
 92feeee71bccdbdd79511198b922ccadc7da6c8d 132420 qgis_3.44.13+dfsg-1.debian.tar.xz
 df44de8748463a8dff5d9181b8a901aa5179a09d 44343 qgis_3.44.13+dfsg-1_amd64.buildinfo
Checksums-Sha256:
 f1ac8a7fa60ca3b8c548a1ef5a7f57aa2d28b73c66947928ee73c428c6939eff 5365 qgis_3.44.13+dfsg-1.dsc
 093bc463183b66ec629c39243cd9e5aa7e2b1df2ebc2180841c89218815d9066 132420 qgis_3.44.13+dfsg-1.debian.tar.xz
 e821730ec3093fcb2ac840005e00c72d4175a81dc0482e9e8d60d28d76b3f5d4 44343 qgis_3.44.13+dfsg-1_amd64.buildinfo
Files:
 6b4414f90f7e89a0b8ba7ec67df07581 5365 science optional qgis_3.44.13+dfsg-1.dsc
 8c6dd0461910e2ca5bf4f7694fbf339d 132420 science optional qgis_3.44.13+dfsg-1.debian.tar.xz
 e003fb262cdf8913716bfc90d093b6b7 44343 science optional qgis_3.44.13+dfsg-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmptisYACgkQZ1DxCuiN
SvH1PBAA1Nf7zti2imLr/QNjCZ/ujRp6zaDWZdtRDkJt3fiDVcJdCnwKCWy5K8H3
wdwYOX+nORGvfDE/8diB1QgMsLKIGJJYuHAZI4O3oF49WahJnxTUc+KOBkX6R12q
nhuaEtpXsCop3/eObH0YZtKJy4mBKyaKWH5Bskk7RFUNqgjrCRud9dEezYR9NcSi
CkBSaEIDQKWTuOVqpxKiImeQBRAK95yRLfl/1SE7VCwxQZOHZSHJVfbwpxcMl5BE
JadOkgaPEcfyX3g1fHsb10u2/MWGuFRDuhNod3GEbrIHaR8JxVn9pmfow/WRq8p4
E0qaEhjOMrnirY/+hbhgE4y5DgSEyLfzOy7rmbGMRc/MhBGbRXtjOpOnhp+sYBRI
zrf23VqyE57hx7CykSEsIBMSWlt+mvnMbRYI/WAmAbf2j6gmaewiwZPCJzwhRO7n
D0syakSccvMHcq80nMBezLt8/doyFgWrNDmFYR21eHztw4SqJ/HDS0tZoIwrJDnC
opVIEBlVmv92V/RZual7KLC3PgVS5sYL/N5rzghpqKuHZzDC9J6vX8sNnqGi3Ek0
UYKN+afmKixOVa+qOS96Ub6KzCztxDLkB+xGTQdPKo90jB1ALSiSg49YxtekIyvt
65RtweCEvArtUXRf7EoAhYTjiPbuLzTavzQBGLZaXBVvC9fp454=
=odn1
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/486c7c84/attachment.sig>

From gitlab at salsa.debian.org  Sat Aug  1 10:25:34 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 09:25:34 +0000
Subject: [Git][debian-gis-team/stac-validator] Pushed new tag debian/4.5.1-1
Message-ID: <6a6dbb8ed9cde_551fb798348813@godard.mail>



Antonio Valentino pushed new tag debian/4.5.1-1 at Debian GIS Project / stac-validator

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/tree/debian/4.5.1-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/8a842079/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  1 10:25:37 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 09:25:37 +0000
Subject: [Git][debian-gis-team/stac-validator] Pushed new tag upstream/4.5.1
Message-ID: <6a6dbb91dab40_551faeec3490fe@godard.mail>



Antonio Valentino pushed new tag upstream/4.5.1 at Debian GIS Project / stac-validator

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/tree/upstream/4.5.1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/66e11ff5/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  1 10:25:50 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 09:25:50 +0000
Subject: [Git][debian-gis-team/stac-validator][master] 6 commits: New upstream
 version 4.5.1
Message-ID: <6a6dbb9ec1924_551fb4b43492f@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / stac-validator


Commits:
1fa2340d by Antonio Valentino at 2026-08-01T09:14:43+00:00
New upstream version 4.5.1
- - - - -
b7791e1b by Antonio Valentino at 2026-08-01T09:15:04+00:00
Update upstream source from tag 'upstream/4.5.1'

Update to upstream version '4.5.1'
with Debian dir 931c1d77a940f41fbd8f9089d2f6325b2f5de4d6
- - - - -
657da149 by Antonio Valentino at 2026-08-01T09:17:59+00:00
New upstream release

- - - - -
4d1be012 by Antonio Valentino at 2026-08-01T09:20:51+00:00
Refresh all patches

- - - - -
e791f340 by Antonio Valentino at 2026-08-01T09:23:12+00:00
Set upstream metadata fields: Repository, Repository-Browse.

Changes-By: lintian-brush

- - - - -
8975b43d by Antonio Valentino at 2026-08-01T09:23:12+00:00
Set distribution to unstable

- - - - -


8 changed files:

- .github/workflows/test-runner.yml
- CHANGELOG.md
- debian/changelog
- debian/patches/0001-No-network.patch
- debian/upstream/metadata
- pyproject.toml
- stac_validator/fast_validator.py
- tests/test_validate_item_collection.py


Changes:

=====================================
.github/workflows/test-runner.yml
=====================================
@@ -16,7 +16,7 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
+        python-version: ["3.10", "3.11", "3.12", "3.13"]
 
     steps:
       - uses: actions/checkout at v6


=====================================
CHANGELOG.md
=====================================
@@ -10,11 +10,35 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 
 ### Changed
 
-### Fixed
+### Fixed 
 
 ### Removed
 
-### Updated
+## [v4.5.1] - 2026-07-30
+
+### Changed
+
+- rebuilt the fastjsonschema compilation pipeline with in-memory schema patching to flawlessly compile complex extensions (e.g., file, storage) at ~1ms speeds, bypassing upstream compiler bugs. 
+
+### Added 
+
+- Added standard Python logging to expose cache and network events to FastAPI backend integrations.
+
+## [v4.5.0] - 2026-07-30
+
+### Added
+
+- Added an opt-in `validate_geometry` flag to `FastValidator`. When enabled, it performs pure-Python spatial checks to ensure coordinates fall within global WGS84 bounds and detects improper antimeridian crossings in Polygons/MultiPolygons.
+- Added a strict 5000-vertex limit to the new geometry validation rings. This acts as a safeguard to prevent CPU exhaustion or thread lockups when processing excessively complex coastal or generated polygons.
+- Added pure-Python checks to `FastValidator` that ensure an item's `start_datetime` is never strictly after its `end_datetime`. [#304](https://github.com/stac-utils/stac-validator/pull/304)
+
+### Changed
+
+- Completely refactored the fallback logic in `fast_validator` to remove the heavy `python-jsonschema` dependency block. If the dynamic `allOf` schema compiler fails (often caused by internal reference collisions in the `storage` or `file` extensions), the validator now gracefully compiles the base schema and compatible extensions individually, cleanly skipping incompatible extensions to maintain blazing-fast API ingestion speeds. [#304](https://github.com/stac-utils/stac-validator/pull/304)
+
+### Fixed
+
+- Fixed a fatal `KeyError: 'definitions'` crash in `fast_validator` caused by complex STAC extensions attempting to resolve local `$ref` pointers (like `#/definitions/links`) against an empty synthetic root. [#304](https://github.com/stac-utils/stac-validator/pull/304)
 
 ## [v4.4.0] - 2026-05-11
 
@@ -460,7 +484,10 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 - With the newest version - 1.0.0-beta.2 - items will run through jsonchema validation before the PySTAC validation. The reason for this is that jsonschema will give more informative error messages. This should be addressed better in the future. This is not the case with the --recursive option as time can be a concern here with larger collections.
 - Logging. Various additions were made here depending on the options selected. This was done to help assist people to update their STAC collections.
 
-[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.3.0..main
+[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.5.1..main
+[v4.5.1]: https://github.com/sparkgeo/stac-validator/compare/v4.5.0..v4.5.1
+[v4.5.0]: https://github.com/sparkgeo/stac-validator/compare/v4.4.0..v4.5.0
+[v4.4.0]: https://github.com/sparkgeo/stac-validator/compare/v4.3.0..v4.4.0
 [v4.3.0]: https://github.com/sparkgeo/stac-validator/compare/v4.2.2..v4.3.0
 [v4.2.2]: https://github.com/sparkgeo/stac-validator/compare/v4.2.1..v4.2.2
 [v4.2.1]: https://github.com/sparkgeo/stac-validator/compare/v4.2.0..v4.2.1


=====================================
debian/changelog
=====================================
@@ -1,3 +1,12 @@
+stac-validator (4.5.1-1) unstable; urgency=medium
+
+  * New upstream release.
+  * debian/patches:
+    - Refresh all patches.
+  * Set upstream metadata fields: Repository, Repository-Browse.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Sat, 01 Aug 2026 09:21:03 +0000
+
 stac-validator (4.4.0-1) unstable; urgency=medium
 
   * New upstream release.


=====================================
debian/patches/0001-No-network.patch
=====================================
@@ -25,7 +25,7 @@ Forwarded: not-needed
  18 files changed, 131 insertions(+), 1 deletion(-)
 
 diff --git a/pyproject.toml b/pyproject.toml
-index 128a49f..0a16d5a 100644
+index 6a8e955..86a4fc3 100644
 --- a/pyproject.toml
 +++ b/pyproject.toml
 @@ -73,4 +73,9 @@ stac-validator = "stac_validator.stac_validator:cli"
@@ -936,7 +936,7 @@ index f02f3ba..08fb9b8 100644
      stac = stac_validator.StacValidate()
      with open("tests/test_data/1rc2/extensions-collection/collection.json", "r") as f:
 diff --git a/tests/test_validate_item_collection.py b/tests/test_validate_item_collection.py
-index 0d7e8d5..977a97e 100644
+index 2b413d8..6340c0c 100644
 --- a/tests/test_validate_item_collection.py
 +++ b/tests/test_validate_item_collection.py
 @@ -3,9 +3,12 @@ Description: Test stac-validator on item-collection validation.
@@ -974,13 +974,13 @@ index 0d7e8d5..977a97e 100644
  
 + at pytest.mark.network
  def test_validate_item_collection_remote_pages_1_v110():
-     stac_file = "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-3-olci-2-wfr-nrt/items"
-     stac = stac_validator.StacValidate(stac_file, item_collection=True, pages=1)
-@@ -584,6 +590,7 @@ def test_validate_item_collection_remote_pages_1_v110():
+     # Use a permanent historical collection (sentinel-2-l2a) instead of NRT
+     # NRT collections are dynamic and may have fewer items at test time
+@@ -588,6 +594,7 @@ def test_validate_item_collection_remote_pages_1_v110():
      assert len(stac.message) == 10
  
  
 + at pytest.mark.network
  def test_validate_item_collection_remote_pages_3_v110():
-     stac_file = "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-3-olci-2-wfr-nrt/items"
-     stac = stac_validator.StacValidate(stac_file, item_collection=True, pages=3)
+     # Fix: Point to a massive, permanent historical collection, NOT a temporary Near Real-Time (nrt) one.
+     stac_file = (


=====================================
debian/upstream/metadata
=====================================
@@ -1,5 +1,5 @@
 ---
 Bug-Database: https://github.com/stac-utils/stac-validator/issues
 Bug-Submit: https://github.com/stac-utils/stac-validator/issues/new
-Repository: https://github.com/stac-utils/stac-validator.git
-Repository-Browse: https://github.com/stac-utils/stac-validator
+Repository: https://github.com/StacLabs/stac-validator.git
+Repository-Browse: https://github.com/StacLabs/stac-validator


=====================================
pyproject.toml
=====================================
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "stac_valid"
-version = "4.4.0"
+version = "4.5.1"
 description = "A package to validate STAC files"
 authors = [
     {name = "Jonathan Healy", email = "jon at healy-hyperspatial.dev"},


=====================================
stac_validator/fast_validator.py
=====================================
@@ -1,5 +1,6 @@
 import io
 import json
+import logging
 import os
 import sys
 import time
@@ -15,6 +16,9 @@ from urllib3.util.retry import Retry
 
 from .utilities import validate_with_ref_resolver
 
+# Standard Python logger for FastAPI/Uvicorn integration
+logger = logging.getLogger(__name__)
+
 # --- Caches & Config ---
 SCHEMA_CACHE: Dict[str, Any] = {}
 VALIDATOR_CACHE: Dict[Any, Any] = {}
@@ -71,6 +75,7 @@ def fetch_schema(uri: str) -> Dict[str, Any]:
     # 3. Network Fetch
     if not QUIET_MODE:
         click.secho(f"    [Network] Fetching: {uri}", fg="yellow", dim=True)
+    logger.debug(f"Network cache miss. Fetching schema: {uri}")
     try:
         response = HTTP_SESSION.get(uri, timeout=10)
         response.raise_for_status()
@@ -91,6 +96,49 @@ def fetch_schema(uri: str) -> Dict[str, Any]:
     return schema_dict
 
 
+def optimize_schema_for_compiler(schema: Any, remove_allof: bool = False) -> Any:
+    """
+    Recursively patches STAC schemas in-memory to bypass fastjsonschema code generation bugs.
+    Strips problematic constructs that cause IndentationError when compiling complex schemas.
+
+    Args:
+        schema: The JSON schema dictionary to optimize
+        remove_allof: If True, also remove allOf/oneOf/anyOf (used for all schemas)
+    """
+    if isinstance(schema, list):
+        return [optimize_schema_for_compiler(item, remove_allof) for item in schema]
+
+    if isinstance(schema, dict):
+        cleaned = {}
+        for k, v in schema.items():
+            # BUG FIX 1: fastjsonschema crashes on the 'duration' format (fixes product extension)
+            if k == "format" and v == "duration":
+                continue
+
+            # BUG FIX 2: fastjsonschema writes invalid Python code (empty for/else blocks)
+            # when translating complex JSON Schema conditionals (fixes file & storage extensions)
+            if k in (
+                "if",
+                "then",
+                "else",
+                "dependencies",
+                "dependentRequired",
+                "dependentSchemas",
+            ):
+                continue
+
+            # BUG FIX 3: Remove allOf/oneOf/anyOf at top level when requested
+            # These cause IndentationError in fastjsonschema's code generator
+            if remove_allof and k in ("allOf", "oneOf", "anyOf") and len(schema) > 1:
+                # Only skip if there are other validation keywords
+                continue
+
+            cleaned[k] = optimize_schema_for_compiler(v, remove_allof)
+        return cleaned
+
+    return schema
+
+
 def get_validator(stac_type: str, stac_version: str, extensions: List[str]):
     """Builds and caches a validator based on Object Type, Version, and Extensions."""
     ext_key = tuple(sorted(extensions))
@@ -110,40 +158,103 @@ def get_validator(stac_type: str, stac_version: str, extensions: List[str]):
     else:
         raise ValueError(f"Unknown STAC type for validation: {stac_type}")
 
-    schema_fragments: List[Dict[str, str]] = [{"$ref": base_uri}]
-    for ext in extensions:
-        schema_fragments.append({"$ref": ext})
-    dynamic_schema = {
-        "$schema": "http://json-schema.org/draft-07/schema#",
-        "allOf": schema_fragments,
-    }
-
+    # Fetch and compile the Base Schema directly
+    base_schema = fetch_schema(base_uri)
     try:
-        validator = fastjsonschema.compile(
-            dynamic_schema, handlers={"http": fetch_schema, "https": fetch_schema}
+        # Try to compile with fastjsonschema first
+        base_validator = fastjsonschema.compile(
+            base_schema, handlers={"http": fetch_schema, "https": fetch_schema}
         )
     except Exception:
-        # FALLBACK: Some schemas (like Item Assets) cause fastjsonschema to generate invalid python code.
-        # We fall back to the standard jsonschema library.
-        click.secho(
-            "    [Fallback] fastjsonschema compile failed. Using python-jsonschema.",
-            fg="yellow",
-            dim=True,
-        )
+        # If base schema fails to compile, use jsonschema validator instead
         import jsonschema
 
-        # Create a validator using the same custom logic
-        def fallback_validator(data: Dict[str, Any]) -> None:
-            # We need a resolver to handle the remote $refs
-            resolver = jsonschema.RefResolver(
-                base_uri="",
-                referrer=dynamic_schema,
-                handlers={"http": fetch_schema, "https": fetch_schema},
+        def base_validator(data):
+            jsonschema.validate(data, base_schema)
+
+        logger.debug(
+            f"Base schema {stac_type} {stac_version} compiled with jsonschema fallback"
+        )
+
+    ext_validators = []
+    skipped_extensions = []
+
+    if extensions:
+        logger.info(
+            f"Warming STAC Validator Cache: Compiling {len(extensions)} extension(s) for {stac_type} {stac_version}..."
+        )
+        if not QUIET_MODE:
+            click.secho(
+                f"    [Extensions] Compiling {len(extensions)} extension(s):",
+                fg="cyan",
+                dim=True,
             )
-            jsonschema.validate(data, dynamic_schema, resolver=resolver)
 
-        validator = fallback_validator
+    for ext in extensions:
+        try:
+            # 1. Fetch the raw dictionary
+            raw_ext_schema = fetch_schema(ext)
+
+            # 2. Try to compile without patching first
+            try:
+                ext_val = fastjsonschema.compile(
+                    raw_ext_schema,
+                    handlers={"http": fetch_schema, "https": fetch_schema},
+                )
+            except Exception:
+                # If compilation fails, try with aggressive patching (remove allOf/oneOf/anyOf)
+                optimized_schema = optimize_schema_for_compiler(
+                    raw_ext_schema, remove_allof=True
+                )
+                ext_val = fastjsonschema.compile(
+                    optimized_schema,
+                    handlers={"http": fetch_schema, "https": fetch_schema},
+                )
 
+            ext_validators.append(ext_val)
+            logger.debug(f"Successfully compiled STAC extension: {ext}")
+            if not QUIET_MODE:
+                click.secho(f"      ? {ext}", fg="green", dim=True)
+        except Exception as e:
+            # Log to standard Python logging for FastAPI/Uvicorn integration
+            logger.warning(
+                f"Skipped extension due to compiler incompatibility: {ext} - {type(e).__name__}: {str(e)[:100]}"
+            )
+            # Safety net for genuinely broken URLs or unfixable schemas
+            if not QUIET_MODE:
+                click.secho(
+                    f"      ? {ext}: {type(e).__name__}",
+                    fg="red",
+                    dim=True,
+                )
+            skipped_extensions.append(ext)
+
+    if skipped_extensions and not QUIET_MODE:
+        click.secho(
+            f"    [Warning] Skipped {len(skipped_extensions)} extension(s) due to fastjsonschema incompatibility:",
+            fg="yellow",
+            dim=True,
+        )
+        for ext in skipped_extensions:
+            click.secho(f"      - {ext}", fg="yellow", dim=True)
+        click.secho(
+            "    For strict validation of all extensions, use: stac-valid validate <file>",
+            fg="yellow",
+            dim=True,
+        )
+
+    def validator(data: Dict[str, Any]) -> None:
+        old_limit = sys.getrecursionlimit()
+        sys.setrecursionlimit(10000)
+        try:
+            # Execute the pre-compiled native Python functions
+            base_validator(data)
+            for ext_val in ext_validators:
+                ext_val(data)
+        finally:
+            sys.setrecursionlimit(old_limit)
+
+    # Cache the resulting validator so future items use it instantly
     VALIDATOR_CACHE[cache_key] = validator
     return validator, False
 
@@ -155,6 +266,7 @@ class FastValidator:
         quiet: bool = False,
         verbose: bool = False,
         limit: Optional[int] = None,
+        validate_geometry: bool = False,
     ):
         global QUIET_MODE
         self.stac_file = stac_file
@@ -162,9 +274,79 @@ class FastValidator:
         self.valid = True
         self.verbose = verbose
         self.limit = limit
+        self.validate_geometry = validate_geometry
         self.message: List[Dict[str, Any]] = []
         QUIET_MODE = quiet
 
+    def _validate_datetime_range(self, data: Dict[str, Any]) -> None:
+        """Ensures start_datetime is not strictly after end_datetime per STAC Spec.
+
+        Uses lexicographical string comparison since RFC 3339 timestamps sort
+        chronologically when compared as strings. This avoids datetime parsing
+        issues in Python 3.8/3.9 with non-standard ISO 8601 formats.
+        """
+        if data.get("type") != "Feature":
+            return
+
+        properties = data.get("properties", {})
+        start_str = properties.get("start_datetime")
+        end_str = properties.get("end_datetime")
+
+        if start_str and end_str:
+            # RFC 3339 timestamps sort lexicographically, so we can compare as strings
+            # This avoids datetime.fromisoformat() parsing issues in Python 3.8/3.9
+            if start_str > end_str:
+                raise ValueError(
+                    f"Logical Error: start_datetime ({start_str}) cannot be strictly after end_datetime ({end_str})"
+                )
+
+    def _validate_geometry(self, data: Dict[str, Any]) -> None:
+        """Lightweight topology check for global bounds and antimeridian crossings."""
+        if data.get("type") != "Feature":
+            return
+
+        geometry = data.get("geometry")
+        if not geometry:
+            return
+
+        geom_type = geometry.get("type")
+        coords = geometry.get("coordinates")
+        if not coords or geom_type not in ("Polygon", "MultiPolygon"):
+            return
+
+        def check_bounds(c: list):
+            if not c:
+                return
+            if isinstance(c[0], (int, float)):
+                if not (-180 <= c[0] <= 180) or not (-90 <= c[1] <= 90):
+                    raise ValueError(f"Geometry out of global WGS84 bounds: {c}")
+            else:
+                for sub in c:
+                    check_bounds(sub)
+
+        check_bounds(coords)
+
+        def check_rings(rings: list):
+            max_vertices = int(os.environ.get("MAX_TOPOLOGY_VERTICES", 5000))
+            for ring in rings:
+                if len(ring) < 4:
+                    raise ValueError("Polygon ring must have at least 4 coordinates.")
+                if len(ring) > max_vertices:
+                    raise ValueError(
+                        f"Geometry exceeds maximum allowed vertices ({max_vertices}). Found {len(ring)}."
+                    )
+                for i in range(len(ring) - 1):
+                    if abs(ring[i][0] - ring[i + 1][0]) > 180:
+                        raise ValueError(
+                            f"Improper antimeridian crossing between {ring[i][0]} and {ring[i + 1][0]}"
+                        )
+
+        if geom_type == "Polygon":
+            check_rings(coords)
+        elif geom_type == "MultiPolygon":
+            for poly in coords:
+                check_rings(poly)
+
     def _limit_reached(self, results: List[Dict]) -> bool:
         return self.limit is not None and len(results) >= self.limit
 
@@ -407,6 +589,10 @@ class FastValidator:
                     click.secho(f"? Setup failed for {item_id}: {e}", fg="red")
                 invalid_count += 1
                 self.valid = False
+                error_msg = f"Setup failed: {str(e)}"
+                if error_msg not in error_registry:
+                    error_registry[error_msg] = []
+                error_registry[error_msg].append(item_id)
                 continue
             t1 = time.perf_counter()
             setup_time = (t1 - t0) * 1000
@@ -416,6 +602,10 @@ class FastValidator:
             t2 = time.perf_counter()
             try:
                 validator(item)
+                # Run logical firewalls
+                self._validate_datetime_range(item)
+                if self.validate_geometry:
+                    self._validate_geometry(item)
                 t3 = time.perf_counter()
                 exec_time = (t3 - t2) * 1000
                 total_exec_ms += exec_time
@@ -445,6 +635,20 @@ class FastValidator:
                 error_registry[error_msg].append(item_id)
                 status_text = click.style("? INVALID", fg="red")
 
+            except ValueError as e:
+                t3 = time.perf_counter()
+                exec_time = (t3 - t2) * 1000
+                total_exec_ms += exec_time
+                invalid_count += 1
+                self.valid = False
+
+                # Logical validation errors (datetime range, geometry)
+                error_msg = str(e)
+                if error_msg not in error_registry:
+                    error_registry[error_msg] = []
+                error_registry[error_msg].append(item_id)
+                status_text = click.style("? INVALID", fg="red")
+
             except Exception as e:
                 t3 = time.perf_counter()
                 exec_time = (t3 - t2) * 1000
@@ -639,6 +843,7 @@ class FastValidator:
                 invalid_count += 1
                 self.valid = False
                 error_msg = str(e)
+                logger.error(f"Schema setup failed for item {item_id}: {error_msg}")
                 if error_msg not in error_registry:
                     error_registry[error_msg] = []
                 error_registry[error_msg].append(item_id)
@@ -649,6 +854,10 @@ class FastValidator:
             t2 = time.perf_counter()
             try:
                 validator(item)
+                # Run logical firewalls
+                self._validate_datetime_range(item)
+                if self.validate_geometry:
+                    self._validate_geometry(item)
                 t3 = time.perf_counter()
                 total_exec_ms += (t3 - t2) * 1000
                 valid_count += 1
@@ -663,6 +872,15 @@ class FastValidator:
                 if error_msg not in error_registry:
                     error_registry[error_msg] = []
                 error_registry[error_msg].append(item_id)
+            except ValueError as e:
+                t3 = time.perf_counter()
+                total_exec_ms += (t3 - t2) * 1000
+                invalid_count += 1
+                self.valid = False
+                error_msg = str(e)
+                if error_msg not in error_registry:
+                    error_registry[error_msg] = []
+                error_registry[error_msg].append(item_id)
             except Exception as e:
                 t3 = time.perf_counter()
                 total_exec_ms += (t3 - t2) * 1000


=====================================
tests/test_validate_item_collection.py
=====================================
@@ -544,7 +544,11 @@ def test_validate_item_collection_remote_pages():
 
 
 def test_validate_item_collection_remote_pages_1_v110():
-    stac_file = "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-3-olci-2-wfr-nrt/items"
+    # Use a permanent historical collection (sentinel-2-l2a) instead of NRT
+    # NRT collections are dynamic and may have fewer items at test time
+    stac_file = (
+        "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-2-l2a/items"
+    )
     stac = stac_validator.StacValidate(stac_file, item_collection=True, pages=1)
     stac.validate_item_collection()
 
@@ -585,7 +589,13 @@ def test_validate_item_collection_remote_pages_1_v110():
 
 
 def test_validate_item_collection_remote_pages_3_v110():
-    stac_file = "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-3-olci-2-wfr-nrt/items"
+    # Fix: Point to a massive, permanent historical collection, NOT a temporary Near Real-Time (nrt) one.
+    stac_file = (
+        "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-2-l2a/items"
+    )
     stac = stac_validator.StacValidate(stac_file, item_collection=True, pages=3)
     stac.validate_item_collection()
-    assert len(stac.message) == 30
+
+    # We expect 3 pages of results.
+    # Using > 20 proves pagination successfully fetched multiple pages without hardcoding a brittle exact number.
+    assert len(stac.message) > 20



View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/compare/86a07aeb7e5df8eab01f1af5e89e85e89d72b046...8975b43d9733b774dd39decbf7e90c85d423da39

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/compare/86a07aeb7e5df8eab01f1af5e89e85e89d72b046...8975b43d9733b774dd39decbf7e90c85d423da39
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/0c224a91/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  1 10:25:57 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 09:25:57 +0000
Subject: [Git][debian-gis-team/stac-validator][pristine-tar] pristine-tar data
 for stac-validator_4.5.1.orig.tar.gz
Message-ID: <6a6dbba59e766_551fb72034968d@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / stac-validator


Commits:
ea1fbd8d by Antonio Valentino at 2026-08-01T09:15:04+00:00
pristine-tar data for stac-validator_4.5.1.orig.tar.gz

- - - - -


2 changed files:

- + stac-validator_4.5.1.orig.tar.gz.delta
- + stac-validator_4.5.1.orig.tar.gz.id


Changes:

=====================================
stac-validator_4.5.1.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/stac-validator_4.5.1.orig.tar.gz.delta differ


=====================================
stac-validator_4.5.1.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+69209aa4887eb00a76488b45643041029fb599a0



View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/ea1fbd8dd63045327c43f588a366d3117771d447

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/ea1fbd8dd63045327c43f588a366d3117771d447
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/b7b87ea0/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  1 10:25:57 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 09:25:57 +0000
Subject: [Git][debian-gis-team/stac-validator][upstream] New upstream version
 4.5.1
Message-ID: <6a6dbba558fd5_551fb68034941d@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / stac-validator


Commits:
1fa2340d by Antonio Valentino at 2026-08-01T09:14:43+00:00
New upstream version 4.5.1
- - - - -


5 changed files:

- .github/workflows/test-runner.yml
- CHANGELOG.md
- pyproject.toml
- stac_validator/fast_validator.py
- tests/test_validate_item_collection.py


Changes:

=====================================
.github/workflows/test-runner.yml
=====================================
@@ -16,7 +16,7 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
+        python-version: ["3.10", "3.11", "3.12", "3.13"]
 
     steps:
       - uses: actions/checkout at v6


=====================================
CHANGELOG.md
=====================================
@@ -10,11 +10,35 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 
 ### Changed
 
-### Fixed
+### Fixed 
 
 ### Removed
 
-### Updated
+## [v4.5.1] - 2026-07-30
+
+### Changed
+
+- rebuilt the fastjsonschema compilation pipeline with in-memory schema patching to flawlessly compile complex extensions (e.g., file, storage) at ~1ms speeds, bypassing upstream compiler bugs. 
+
+### Added 
+
+- Added standard Python logging to expose cache and network events to FastAPI backend integrations.
+
+## [v4.5.0] - 2026-07-30
+
+### Added
+
+- Added an opt-in `validate_geometry` flag to `FastValidator`. When enabled, it performs pure-Python spatial checks to ensure coordinates fall within global WGS84 bounds and detects improper antimeridian crossings in Polygons/MultiPolygons.
+- Added a strict 5000-vertex limit to the new geometry validation rings. This acts as a safeguard to prevent CPU exhaustion or thread lockups when processing excessively complex coastal or generated polygons.
+- Added pure-Python checks to `FastValidator` that ensure an item's `start_datetime` is never strictly after its `end_datetime`. [#304](https://github.com/stac-utils/stac-validator/pull/304)
+
+### Changed
+
+- Completely refactored the fallback logic in `fast_validator` to remove the heavy `python-jsonschema` dependency block. If the dynamic `allOf` schema compiler fails (often caused by internal reference collisions in the `storage` or `file` extensions), the validator now gracefully compiles the base schema and compatible extensions individually, cleanly skipping incompatible extensions to maintain blazing-fast API ingestion speeds. [#304](https://github.com/stac-utils/stac-validator/pull/304)
+
+### Fixed
+
+- Fixed a fatal `KeyError: 'definitions'` crash in `fast_validator` caused by complex STAC extensions attempting to resolve local `$ref` pointers (like `#/definitions/links`) against an empty synthetic root. [#304](https://github.com/stac-utils/stac-validator/pull/304)
 
 ## [v4.4.0] - 2026-05-11
 
@@ -460,7 +484,10 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 - With the newest version - 1.0.0-beta.2 - items will run through jsonchema validation before the PySTAC validation. The reason for this is that jsonschema will give more informative error messages. This should be addressed better in the future. This is not the case with the --recursive option as time can be a concern here with larger collections.
 - Logging. Various additions were made here depending on the options selected. This was done to help assist people to update their STAC collections.
 
-[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.3.0..main
+[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.5.1..main
+[v4.5.1]: https://github.com/sparkgeo/stac-validator/compare/v4.5.0..v4.5.1
+[v4.5.0]: https://github.com/sparkgeo/stac-validator/compare/v4.4.0..v4.5.0
+[v4.4.0]: https://github.com/sparkgeo/stac-validator/compare/v4.3.0..v4.4.0
 [v4.3.0]: https://github.com/sparkgeo/stac-validator/compare/v4.2.2..v4.3.0
 [v4.2.2]: https://github.com/sparkgeo/stac-validator/compare/v4.2.1..v4.2.2
 [v4.2.1]: https://github.com/sparkgeo/stac-validator/compare/v4.2.0..v4.2.1


=====================================
pyproject.toml
=====================================
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "stac_valid"
-version = "4.4.0"
+version = "4.5.1"
 description = "A package to validate STAC files"
 authors = [
     {name = "Jonathan Healy", email = "jon at healy-hyperspatial.dev"},


=====================================
stac_validator/fast_validator.py
=====================================
@@ -1,5 +1,6 @@
 import io
 import json
+import logging
 import os
 import sys
 import time
@@ -15,6 +16,9 @@ from urllib3.util.retry import Retry
 
 from .utilities import validate_with_ref_resolver
 
+# Standard Python logger for FastAPI/Uvicorn integration
+logger = logging.getLogger(__name__)
+
 # --- Caches & Config ---
 SCHEMA_CACHE: Dict[str, Any] = {}
 VALIDATOR_CACHE: Dict[Any, Any] = {}
@@ -71,6 +75,7 @@ def fetch_schema(uri: str) -> Dict[str, Any]:
     # 3. Network Fetch
     if not QUIET_MODE:
         click.secho(f"    [Network] Fetching: {uri}", fg="yellow", dim=True)
+    logger.debug(f"Network cache miss. Fetching schema: {uri}")
     try:
         response = HTTP_SESSION.get(uri, timeout=10)
         response.raise_for_status()
@@ -91,6 +96,49 @@ def fetch_schema(uri: str) -> Dict[str, Any]:
     return schema_dict
 
 
+def optimize_schema_for_compiler(schema: Any, remove_allof: bool = False) -> Any:
+    """
+    Recursively patches STAC schemas in-memory to bypass fastjsonschema code generation bugs.
+    Strips problematic constructs that cause IndentationError when compiling complex schemas.
+
+    Args:
+        schema: The JSON schema dictionary to optimize
+        remove_allof: If True, also remove allOf/oneOf/anyOf (used for all schemas)
+    """
+    if isinstance(schema, list):
+        return [optimize_schema_for_compiler(item, remove_allof) for item in schema]
+
+    if isinstance(schema, dict):
+        cleaned = {}
+        for k, v in schema.items():
+            # BUG FIX 1: fastjsonschema crashes on the 'duration' format (fixes product extension)
+            if k == "format" and v == "duration":
+                continue
+
+            # BUG FIX 2: fastjsonschema writes invalid Python code (empty for/else blocks)
+            # when translating complex JSON Schema conditionals (fixes file & storage extensions)
+            if k in (
+                "if",
+                "then",
+                "else",
+                "dependencies",
+                "dependentRequired",
+                "dependentSchemas",
+            ):
+                continue
+
+            # BUG FIX 3: Remove allOf/oneOf/anyOf at top level when requested
+            # These cause IndentationError in fastjsonschema's code generator
+            if remove_allof and k in ("allOf", "oneOf", "anyOf") and len(schema) > 1:
+                # Only skip if there are other validation keywords
+                continue
+
+            cleaned[k] = optimize_schema_for_compiler(v, remove_allof)
+        return cleaned
+
+    return schema
+
+
 def get_validator(stac_type: str, stac_version: str, extensions: List[str]):
     """Builds and caches a validator based on Object Type, Version, and Extensions."""
     ext_key = tuple(sorted(extensions))
@@ -110,40 +158,103 @@ def get_validator(stac_type: str, stac_version: str, extensions: List[str]):
     else:
         raise ValueError(f"Unknown STAC type for validation: {stac_type}")
 
-    schema_fragments: List[Dict[str, str]] = [{"$ref": base_uri}]
-    for ext in extensions:
-        schema_fragments.append({"$ref": ext})
-    dynamic_schema = {
-        "$schema": "http://json-schema.org/draft-07/schema#",
-        "allOf": schema_fragments,
-    }
-
+    # Fetch and compile the Base Schema directly
+    base_schema = fetch_schema(base_uri)
     try:
-        validator = fastjsonschema.compile(
-            dynamic_schema, handlers={"http": fetch_schema, "https": fetch_schema}
+        # Try to compile with fastjsonschema first
+        base_validator = fastjsonschema.compile(
+            base_schema, handlers={"http": fetch_schema, "https": fetch_schema}
         )
     except Exception:
-        # FALLBACK: Some schemas (like Item Assets) cause fastjsonschema to generate invalid python code.
-        # We fall back to the standard jsonschema library.
-        click.secho(
-            "    [Fallback] fastjsonschema compile failed. Using python-jsonschema.",
-            fg="yellow",
-            dim=True,
-        )
+        # If base schema fails to compile, use jsonschema validator instead
         import jsonschema
 
-        # Create a validator using the same custom logic
-        def fallback_validator(data: Dict[str, Any]) -> None:
-            # We need a resolver to handle the remote $refs
-            resolver = jsonschema.RefResolver(
-                base_uri="",
-                referrer=dynamic_schema,
-                handlers={"http": fetch_schema, "https": fetch_schema},
+        def base_validator(data):
+            jsonschema.validate(data, base_schema)
+
+        logger.debug(
+            f"Base schema {stac_type} {stac_version} compiled with jsonschema fallback"
+        )
+
+    ext_validators = []
+    skipped_extensions = []
+
+    if extensions:
+        logger.info(
+            f"Warming STAC Validator Cache: Compiling {len(extensions)} extension(s) for {stac_type} {stac_version}..."
+        )
+        if not QUIET_MODE:
+            click.secho(
+                f"    [Extensions] Compiling {len(extensions)} extension(s):",
+                fg="cyan",
+                dim=True,
             )
-            jsonschema.validate(data, dynamic_schema, resolver=resolver)
 
-        validator = fallback_validator
+    for ext in extensions:
+        try:
+            # 1. Fetch the raw dictionary
+            raw_ext_schema = fetch_schema(ext)
+
+            # 2. Try to compile without patching first
+            try:
+                ext_val = fastjsonschema.compile(
+                    raw_ext_schema,
+                    handlers={"http": fetch_schema, "https": fetch_schema},
+                )
+            except Exception:
+                # If compilation fails, try with aggressive patching (remove allOf/oneOf/anyOf)
+                optimized_schema = optimize_schema_for_compiler(
+                    raw_ext_schema, remove_allof=True
+                )
+                ext_val = fastjsonschema.compile(
+                    optimized_schema,
+                    handlers={"http": fetch_schema, "https": fetch_schema},
+                )
 
+            ext_validators.append(ext_val)
+            logger.debug(f"Successfully compiled STAC extension: {ext}")
+            if not QUIET_MODE:
+                click.secho(f"      ? {ext}", fg="green", dim=True)
+        except Exception as e:
+            # Log to standard Python logging for FastAPI/Uvicorn integration
+            logger.warning(
+                f"Skipped extension due to compiler incompatibility: {ext} - {type(e).__name__}: {str(e)[:100]}"
+            )
+            # Safety net for genuinely broken URLs or unfixable schemas
+            if not QUIET_MODE:
+                click.secho(
+                    f"      ? {ext}: {type(e).__name__}",
+                    fg="red",
+                    dim=True,
+                )
+            skipped_extensions.append(ext)
+
+    if skipped_extensions and not QUIET_MODE:
+        click.secho(
+            f"    [Warning] Skipped {len(skipped_extensions)} extension(s) due to fastjsonschema incompatibility:",
+            fg="yellow",
+            dim=True,
+        )
+        for ext in skipped_extensions:
+            click.secho(f"      - {ext}", fg="yellow", dim=True)
+        click.secho(
+            "    For strict validation of all extensions, use: stac-valid validate <file>",
+            fg="yellow",
+            dim=True,
+        )
+
+    def validator(data: Dict[str, Any]) -> None:
+        old_limit = sys.getrecursionlimit()
+        sys.setrecursionlimit(10000)
+        try:
+            # Execute the pre-compiled native Python functions
+            base_validator(data)
+            for ext_val in ext_validators:
+                ext_val(data)
+        finally:
+            sys.setrecursionlimit(old_limit)
+
+    # Cache the resulting validator so future items use it instantly
     VALIDATOR_CACHE[cache_key] = validator
     return validator, False
 
@@ -155,6 +266,7 @@ class FastValidator:
         quiet: bool = False,
         verbose: bool = False,
         limit: Optional[int] = None,
+        validate_geometry: bool = False,
     ):
         global QUIET_MODE
         self.stac_file = stac_file
@@ -162,9 +274,79 @@ class FastValidator:
         self.valid = True
         self.verbose = verbose
         self.limit = limit
+        self.validate_geometry = validate_geometry
         self.message: List[Dict[str, Any]] = []
         QUIET_MODE = quiet
 
+    def _validate_datetime_range(self, data: Dict[str, Any]) -> None:
+        """Ensures start_datetime is not strictly after end_datetime per STAC Spec.
+
+        Uses lexicographical string comparison since RFC 3339 timestamps sort
+        chronologically when compared as strings. This avoids datetime parsing
+        issues in Python 3.8/3.9 with non-standard ISO 8601 formats.
+        """
+        if data.get("type") != "Feature":
+            return
+
+        properties = data.get("properties", {})
+        start_str = properties.get("start_datetime")
+        end_str = properties.get("end_datetime")
+
+        if start_str and end_str:
+            # RFC 3339 timestamps sort lexicographically, so we can compare as strings
+            # This avoids datetime.fromisoformat() parsing issues in Python 3.8/3.9
+            if start_str > end_str:
+                raise ValueError(
+                    f"Logical Error: start_datetime ({start_str}) cannot be strictly after end_datetime ({end_str})"
+                )
+
+    def _validate_geometry(self, data: Dict[str, Any]) -> None:
+        """Lightweight topology check for global bounds and antimeridian crossings."""
+        if data.get("type") != "Feature":
+            return
+
+        geometry = data.get("geometry")
+        if not geometry:
+            return
+
+        geom_type = geometry.get("type")
+        coords = geometry.get("coordinates")
+        if not coords or geom_type not in ("Polygon", "MultiPolygon"):
+            return
+
+        def check_bounds(c: list):
+            if not c:
+                return
+            if isinstance(c[0], (int, float)):
+                if not (-180 <= c[0] <= 180) or not (-90 <= c[1] <= 90):
+                    raise ValueError(f"Geometry out of global WGS84 bounds: {c}")
+            else:
+                for sub in c:
+                    check_bounds(sub)
+
+        check_bounds(coords)
+
+        def check_rings(rings: list):
+            max_vertices = int(os.environ.get("MAX_TOPOLOGY_VERTICES", 5000))
+            for ring in rings:
+                if len(ring) < 4:
+                    raise ValueError("Polygon ring must have at least 4 coordinates.")
+                if len(ring) > max_vertices:
+                    raise ValueError(
+                        f"Geometry exceeds maximum allowed vertices ({max_vertices}). Found {len(ring)}."
+                    )
+                for i in range(len(ring) - 1):
+                    if abs(ring[i][0] - ring[i + 1][0]) > 180:
+                        raise ValueError(
+                            f"Improper antimeridian crossing between {ring[i][0]} and {ring[i + 1][0]}"
+                        )
+
+        if geom_type == "Polygon":
+            check_rings(coords)
+        elif geom_type == "MultiPolygon":
+            for poly in coords:
+                check_rings(poly)
+
     def _limit_reached(self, results: List[Dict]) -> bool:
         return self.limit is not None and len(results) >= self.limit
 
@@ -407,6 +589,10 @@ class FastValidator:
                     click.secho(f"? Setup failed for {item_id}: {e}", fg="red")
                 invalid_count += 1
                 self.valid = False
+                error_msg = f"Setup failed: {str(e)}"
+                if error_msg not in error_registry:
+                    error_registry[error_msg] = []
+                error_registry[error_msg].append(item_id)
                 continue
             t1 = time.perf_counter()
             setup_time = (t1 - t0) * 1000
@@ -416,6 +602,10 @@ class FastValidator:
             t2 = time.perf_counter()
             try:
                 validator(item)
+                # Run logical firewalls
+                self._validate_datetime_range(item)
+                if self.validate_geometry:
+                    self._validate_geometry(item)
                 t3 = time.perf_counter()
                 exec_time = (t3 - t2) * 1000
                 total_exec_ms += exec_time
@@ -445,6 +635,20 @@ class FastValidator:
                 error_registry[error_msg].append(item_id)
                 status_text = click.style("? INVALID", fg="red")
 
+            except ValueError as e:
+                t3 = time.perf_counter()
+                exec_time = (t3 - t2) * 1000
+                total_exec_ms += exec_time
+                invalid_count += 1
+                self.valid = False
+
+                # Logical validation errors (datetime range, geometry)
+                error_msg = str(e)
+                if error_msg not in error_registry:
+                    error_registry[error_msg] = []
+                error_registry[error_msg].append(item_id)
+                status_text = click.style("? INVALID", fg="red")
+
             except Exception as e:
                 t3 = time.perf_counter()
                 exec_time = (t3 - t2) * 1000
@@ -639,6 +843,7 @@ class FastValidator:
                 invalid_count += 1
                 self.valid = False
                 error_msg = str(e)
+                logger.error(f"Schema setup failed for item {item_id}: {error_msg}")
                 if error_msg not in error_registry:
                     error_registry[error_msg] = []
                 error_registry[error_msg].append(item_id)
@@ -649,6 +854,10 @@ class FastValidator:
             t2 = time.perf_counter()
             try:
                 validator(item)
+                # Run logical firewalls
+                self._validate_datetime_range(item)
+                if self.validate_geometry:
+                    self._validate_geometry(item)
                 t3 = time.perf_counter()
                 total_exec_ms += (t3 - t2) * 1000
                 valid_count += 1
@@ -663,6 +872,15 @@ class FastValidator:
                 if error_msg not in error_registry:
                     error_registry[error_msg] = []
                 error_registry[error_msg].append(item_id)
+            except ValueError as e:
+                t3 = time.perf_counter()
+                total_exec_ms += (t3 - t2) * 1000
+                invalid_count += 1
+                self.valid = False
+                error_msg = str(e)
+                if error_msg not in error_registry:
+                    error_registry[error_msg] = []
+                error_registry[error_msg].append(item_id)
             except Exception as e:
                 t3 = time.perf_counter()
                 total_exec_ms += (t3 - t2) * 1000


=====================================
tests/test_validate_item_collection.py
=====================================
@@ -544,7 +544,11 @@ def test_validate_item_collection_remote_pages():
 
 
 def test_validate_item_collection_remote_pages_1_v110():
-    stac_file = "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-3-olci-2-wfr-nrt/items"
+    # Use a permanent historical collection (sentinel-2-l2a) instead of NRT
+    # NRT collections are dynamic and may have fewer items at test time
+    stac_file = (
+        "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-2-l2a/items"
+    )
     stac = stac_validator.StacValidate(stac_file, item_collection=True, pages=1)
     stac.validate_item_collection()
 
@@ -585,7 +589,13 @@ def test_validate_item_collection_remote_pages_1_v110():
 
 
 def test_validate_item_collection_remote_pages_3_v110():
-    stac_file = "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-3-olci-2-wfr-nrt/items"
+    # Fix: Point to a massive, permanent historical collection, NOT a temporary Near Real-Time (nrt) one.
+    stac_file = (
+        "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-2-l2a/items"
+    )
     stac = stac_validator.StacValidate(stac_file, item_collection=True, pages=3)
     stac.validate_item_collection()
-    assert len(stac.message) == 30
+
+    # We expect 3 pages of results.
+    # Using > 20 proves pagination successfully fetched multiple pages without hardcoding a brittle exact number.
+    assert len(stac.message) > 20



View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/1fa2340dc426e6ad3df55a4336d6af049d48a9c9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/1fa2340dc426e6ad3df55a4336d6af049d48a9c9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/c3cfda0c/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  1 11:00:29 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 10:00:29 +0000
Subject: Processing of stac-validator_4.5.1-1_source.changes
Message-ID: <E1wq6W6-00DrfE-0f@usper.debian.org>

stac-validator_4.5.1-1_source.changes uploaded successfully to localhost
along with the files:
  stac-validator_4.5.1-1.dsc
  stac-validator_4.5.1.orig.tar.gz
  stac-validator_4.5.1-1.debian.tar.xz
  stac-validator_4.5.1-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Sat Aug  1 11:09:50 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 10:09:50 +0000
Subject: stac-validator_4.5.1-1_source.changes ACCEPTED into unstable
Message-ID: <E1wq6f8-0000000EUCK-41X3@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Sat, 01 Aug 2026 09:21:03 +0000
Source: stac-validator
Architecture: source
Version: 4.5.1-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Changes:
 stac-validator (4.5.1-1) unstable; urgency=medium
 .
   * New upstream release.
   * debian/patches:
     - Refresh all patches.
   * Set upstream metadata fields: Repository, Repository-Browse.
Checksums-Sha1:
 324ae27a4c2a06e74bd57c0067e12537853a860d 2729 stac-validator_4.5.1-1.dsc
 e12f3c45ba188792fa0021941e0ee2e7c1517b59 12290726 stac-validator_4.5.1.orig.tar.gz
 996f884394b17ff7d38545af388306bfd3f49100 20048 stac-validator_4.5.1-1.debian.tar.xz
 eaf99c4659bd4512efb488324097fade766bc81d 8516 stac-validator_4.5.1-1_amd64.buildinfo
Checksums-Sha256:
 e853f66fa9f0faac3356b84a9deedd93b7ffee05c7b330dd78f5a48a448e3ce9 2729 stac-validator_4.5.1-1.dsc
 2ec3066872520041ebb8d31d6c0a438cece9c95a8dd001e8e8e2cccf41ea3dc4 12290726 stac-validator_4.5.1.orig.tar.gz
 994d6ec4977250bdb9f2c804dd73ffb836655f60f362f66e9a30e29ebaaeb4e7 20048 stac-validator_4.5.1-1.debian.tar.xz
 575b8fb64e3bfe3407d89c90db87a57ff4bd2f4ac94e14e4986c35f41cd2d6b7 8516 stac-validator_4.5.1-1_amd64.buildinfo
Files:
 bcb9ebc0e6a69d4e79c26f59ed5f590e 2729 python optional stac-validator_4.5.1-1.dsc
 e24c73321c8a7f6abf5c681e643a5ef2 12290726 python optional stac-validator_4.5.1.orig.tar.gz
 450b2dc4db2f81e9e893269166791a28 20048 python optional stac-validator_4.5.1-1.debian.tar.xz
 1830dd81ded06189bd71929b2c9428d6 8516 python optional stac-validator_4.5.1-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmptwk4dHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBIn8A//Y1qFooTJOW5CGdLB
lCUiJIdOT75dHu9KzvNHutYT9Au0mKIfzi3Yl236q3LIp1PAXmfTI/r+jqMugWt3
yn9jp2tWaNZ81qOirpuWXadkEulGBkuqOIub0bPbNXyJYofGyRQnTyyx45wO4wRL
2xLqA8aRyAoMzRucSXzNAahU5MyTomBmEOdDogB15e+RJJkbvlJClvT/JAUlmdca
S5T/8qhsTgcALVeITTRyO0btiwrKsNakoIQ/RtkhkVC2/oq+JmljroqgBEIGt8Qq
QiHK1mD3QeRbKvhWDLwKlMFI0zfvmcDveY8ZIvUmEgDFrlEEU+pb+fxqfAuC0euB
Jf9rYvTMQnFvCD4zOa1TtOKjq75RhdE1uWpxCoqiQwUegpfdAuWWb0ed44MfYoNr
u/qMIk9ChBbYgc0cDFQ8/yLK8f9mzohwfSA4AILjjmWVtBiqMZJ8br0lmCMaZIqD
JV9UzUw5PWT3c7D/L6VY7W1yOkj7PWzM40RLWdavMsrN/uRchBOthYH6oYtWaKA2
q0CijU0zY8lP6Rw5EQP+JC2U2fr1tzYgP8Tq8yhP+U5zJnfixeEKDsywDOUkJE97
x04ZAMvbty56cWPxi32/228IIzFr1yBVP66aNFlsl3qjL3frl0VFWqPiJkwqVPfW
OFL3dfnI22s4auke6ZKSAECP8cY=
=RYub
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/044e82c4/attachment.sig>

From gitlab at salsa.debian.org  Sat Aug  1 11:12:44 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 10:12:44 +0000
Subject: [Git][debian-gis-team/python-s3fs] Pushed new tag debian/2026.7.0-1
Message-ID: <6a6dc69c43ea0_551faeec3556a8@godard.mail>



Antonio Valentino pushed new tag debian/2026.7.0-1 at Debian GIS Project / python-s3fs

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/tree/debian/2026.7.0-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/c17778a8/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  1 11:12:47 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 10:12:47 +0000
Subject: [Git][debian-gis-team/python-s3fs] Pushed new tag upstream/2026.7.0
Message-ID: <6a6dc69f1fd7e_551faec4355868@godard.mail>



Antonio Valentino pushed new tag upstream/2026.7.0 at Debian GIS Project / python-s3fs

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/tree/upstream/2026.7.0
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/3df1c340/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  1 11:13:00 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 10:13:00 +0000
Subject: [Git][debian-gis-team/python-s3fs][master] 5 commits: New upstream
 version 2026.7.0
Message-ID: <6a6dc6acc858d_551fb680356065@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / python-s3fs


Commits:
ca03e160 by Antonio Valentino at 2026-08-01T09:59:18+00:00
New upstream version 2026.7.0
- - - - -
8b402bfd by Antonio Valentino at 2026-08-01T09:59:19+00:00
Update upstream source from tag 'upstream/2026.7.0'

Update to upstream version '2026.7.0'
with Debian dir 1ebf99e9b21efd835560e06cadb070864fc19640
- - - - -
887b8f13 by Antonio Valentino at 2026-08-01T10:01:49+00:00
New upstream release

- - - - -
d44ecbe4 by Antonio Valentino at 2026-08-01T10:10:40+00:00
New d/python3-s3fs.lintian-overrides

- - - - -
1623b1e4 by Antonio Valentino at 2026-08-01T10:10:41+00:00
Set distribution to unstable

- - - - -


9 changed files:

- .github/workflows/ci.yml
- ci/env.yaml
- debian/changelog
- + debian/python3-s3fs.lintian-overrides
- docs/source/changelog.rst
- requirements.txt
- s3fs/_version.py
- s3fs/core.py
- s3fs/tests/test_s3fs.py


Changes:

=====================================
.github/workflows/ci.yml
=====================================
@@ -15,7 +15,7 @@ jobs:
           - "3.12"
           - "3.13"
           - "3.14"
-        aiobotocore-version: [">=2.19.0,<2.20.0", "<3.0.0", "<4.0.0"]
+        aiobotocore-version: ["<4.0.0"]
 
     env:
       BOTO_CONFIG: /dev/null
@@ -38,7 +38,7 @@ jobs:
         shell: bash -l {0}
         run: |
           pip install git+https://github.com/fsspec/filesystem_spec
-          pip install --upgrade "aiobotocore${{ matrix.aiobotocore-version }}"
+          pip install --upgrade --force-reinstall "aiobotocore${{ matrix.aiobotocore-version }}"
           pip install . --no-deps
           pip list
 


=====================================
ci/env.yaml
=====================================
@@ -14,6 +14,6 @@ dependencies:
   - black
   - httpretty
   - aiobotocore
-  - moto
+  - moto !=5.2.0
   - flask
   - fsspec


=====================================
debian/changelog
=====================================
@@ -1,3 +1,10 @@
+python-s3fs (2026.7.0-1) unstable; urgency=medium
+
+  * New upstream release.
+  * New d/python3-s3fs.lintian-overrides.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Sat, 01 Aug 2026 10:02:23 +0000
+
 python-s3fs (2026.4.0-1) unstable; urgency=medium
 
   * New upstream release.


=====================================
debian/python3-s3fs.lintian-overrides
=====================================
@@ -0,0 +1,2 @@
+# False positive
+package-contains-documentation-outside-usr-share-doc [usr/lib/python3/*-packages/*.*-info/*.txt]


=====================================
docs/source/changelog.rst
=====================================
@@ -1,6 +1,18 @@
 Changelog
 =========
 
+2026.7.0
+--------
+
+- don't cache prefix-filtered listings as complete directory entries (#1034)
+
+2026.6.0
+--------
+
+- cat should use info (#1029)
+- loosen bounds to allow install from git (#1026)
+- Fix CI (#1024)
+
 2026.4.0
 --------
 


=====================================
requirements.txt
=====================================
@@ -1,3 +1,3 @@
 aiobotocore>=2.19.0,<4.0.0
-fsspec==2026.4.0
+fsspec>=2026.7.0,<2026.7.1
 aiohttp!=4.0.0a0, !=4.0.0a1, >=3.9.0


=====================================
s3fs/_version.py
=====================================
@@ -25,9 +25,9 @@ def get_keywords() -> Dict[str, str]:
     # setup.py/versioneer.py will grep for the variable names, so they must
     # each be defined on a line of their own. _version.py will just call
     # get_keywords().
-    git_refnames = " (tag: 2026.4.0)"
-    git_full = "35d9eb0566bf128267613d46761894dfd25482aa"
-    git_date = "2026-04-29 16:51:56 -0400"
+    git_refnames = " (HEAD -> main, tag: 2026.7.0)"
+    git_full = "609950a67e1d2f26bd98b5053b016200272a35dd"
+    git_date = "2026-07-28 13:11:33 -0400"
     keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
     return keywords
 


=====================================
s3fs/core.py
=====================================
@@ -425,7 +425,11 @@ class S3FileSystem(AsyncFileSystem):
         self.use_ssl = use_ssl
         self.cache_regions = cache_regions
         self._s3 = None
+        self._set_session_lock = asyncio.Lock()
         self.session = session
+        self._session_is_owned = (
+            session is None
+        )  # False when the caller injected a session
         self.fixed_upload_size = fixed_upload_size
         self.local_expiry_check = local_expiry_check
         if max_concurrency < 1:
@@ -599,7 +603,9 @@ class S3FileSystem(AsyncFileSystem):
         if self._s3 is not None and not refresh:
             hsess = getattr(getattr(self._s3, "_endpoint", None), "http_session", None)
             if hsess is not None:
-                if all(_.closed for _ in hsess._sessions.values()):
+                if hsess._sessions is None or (
+                    hsess._sessions and all(_.closed for _ in hsess._sessions.values())
+                ):
                     refresh = True
             if not refresh:
                 return self._s3
@@ -638,36 +644,43 @@ class S3FileSystem(AsyncFileSystem):
             }
             config_kwargs["signature_version"] = UNSIGNED
 
-        conf = AioConfig(**config_kwargs)
-        if self.session is None or refresh:
-            self.session = aiobotocore.session.AioSession(**self.kwargs)
-
-        for parameters in (config_kwargs, self.kwargs, init_kwargs, client_kwargs):
-            for option in ("region_name", "endpoint_url"):
-                if parameters.get(option):
-                    self.cache_regions = False
-                    break
-        else:
-            cache_regions = self.cache_regions
+        async with self._set_session_lock:
+            # Re-check under the lock: a concurrent task may have set up the
+            # session while we were waiting.
+            if self._s3 is not None and not refresh:
+                return self._s3
+            conf = AioConfig(**config_kwargs)
+            if self.session is None or (refresh and self._session_is_owned):
+                # Only (re)create the AioSession when s3fs owns it
+                self.session = aiobotocore.session.AioSession(**self.kwargs)
+                self._session_is_owned = True
+
+            for parameters in (config_kwargs, self.kwargs, init_kwargs, client_kwargs):
+                for option in ("region_name", "endpoint_url"):
+                    if parameters.get(option):
+                        self.cache_regions = False
+                        break
+            else:
+                cache_regions = self.cache_regions
 
-        logger.debug(
-            "RC: caching enabled? %r (explicit option is %r)",
-            cache_regions,
-            self.cache_regions,
-        )
-        self.cache_regions = cache_regions
-        if self.cache_regions:
-            s3creator = S3BucketRegionCache(
-                self.session, config=conf, **init_kwargs, **client_kwargs
-            )
-            self._s3 = await s3creator.get_client()
-        else:
-            s3creator = self.session.create_client(
-                "s3", config=conf, **init_kwargs, **client_kwargs
+            logger.debug(
+                "RC: caching enabled? %r (explicit option is %r)",
+                cache_regions,
+                self.cache_regions,
             )
-            self._s3 = await s3creator.__aenter__()
+            self.cache_regions = cache_regions
+            if self.cache_regions:
+                s3creator = S3BucketRegionCache(
+                    self.session, config=conf, **init_kwargs, **client_kwargs
+                )
+                self._s3 = await s3creator.get_client()
+            else:
+                s3creator = self.session.create_client(
+                    "s3", config=conf, **init_kwargs, **client_kwargs
+                )
+                self._s3 = await s3creator.__aenter__()
 
-        self._s3creator = s3creator
+            self._s3creator = s3creator
         # the following actually closes the aiohttp connection; use of privates
         # might break in the future, would cause exception at gc time
         if not self.asynchronous:
@@ -839,6 +852,9 @@ class S3FileSystem(AsyncFileSystem):
         versions=False,
     ):
         bucket, key, _ = self.split_path(path)
+        # A caller-supplied prefix is a stem filter, so the listing is partial
+        # and must not be cached. Capture it before prefix is overwritten below.
+        partial = bool(prefix)
         if not prefix:
             prefix = ""
         if key:
@@ -864,7 +880,7 @@ class S3FileSystem(AsyncFileSystem):
             except ClientError as e:
                 raise translate_boto_error(e)
 
-            if delimiter and files and not versions:
+            if delimiter and files and not versions and not partial:
                 self.dircache[path] = files
             return files
         return self.dircache[path]
@@ -1308,15 +1324,7 @@ class S3FileSystem(AsyncFileSystem):
             and (max_concurrency or self.max_concurrency) > 1
         ):
             chunksize = chunksize or self.default_block_size
-            resp = await self._call_s3(
-                "get_object",
-                Bucket=bucket,
-                Key=key,
-                **version_id_kw(version_id or vers),
-                **self.req_kw,
-            )
-            content_length = resp.get("ContentLength", None)
-            resp["Body"].close()
+            content_length = await self._size(path)
 
             if content_length and content_length > chunksize:
                 return await self._cat_file_concurrent(


=====================================
s3fs/tests/test_s3fs.py
=====================================
@@ -3172,14 +3172,14 @@ def test_find_missing_ls(s3):
     assert set(listed_cached) == set(listed_no_cache)
 
 
-def test_session_close():
+def test_session_close(s3):
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
     async def run_program(run):
-        s3 = s3fs.S3FileSystem(anon=True, asynchronous=True)
+        s3 = s3fs.S3FileSystem(anon=True, asynchronous=True, endpoint_url=endpoint_uri)
+        s3.invalidate_cache()
         session = await s3.set_session()
-        files = await s3._ls(
-            "s3://noaa-hrrr-bdp-pds/hrrr.20140730/conus/"
-        )  # Random open data store
-        print(f"Number of files {len(files)}")
+        files = await s3._ls(f"{test_bucket_name}/dir")
         await session.close()
 
     import aiobotocore.httpsession
@@ -3189,6 +3189,97 @@ def test_session_close():
     asyncio.run(run_program(False))
 
 
+def test_set_session_sessions_none(s3):
+    """After the HTTP session is closed and aiobotocore sets _sessions=None
+    (aiobotocore 3.x behaviour), set_session must rebuild the client rather
+    than returning the dead one."""
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    async def run():
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        await fs.set_session()
+        original_client = fs._s3
+
+        # Simulate aiobotocore 3.x behaviour: __aexit__ sets _sessions to None.
+        hsess = fs._s3._endpoint.http_session
+        hsess._sessions = None
+
+        # set_session must detect the dead client and create a new one.
+        await fs.set_session()
+        assert (
+            fs._s3 is not original_client
+        ), "set_session should have rebuilt the client when _sessions is None"
+        await fs.set_session(refresh=True)  # clean up
+
+    asyncio.run(run())
+
+
+def test_set_session_concurrent_no_leak(s3):
+    """Concurrent calls to set_session on a fresh instance must not leak
+    clients (i.e. only one client should be created, not N)."""
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    async def run():
+        S3FileSystem.clear_instance_cache()
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        # All coroutines start with _s3 == None; fire them simultaneously.
+        results = await asyncio.gather(*[fs.set_session() for _ in range(8)])
+        # Every coroutine must get back the same client object.
+        assert (
+            len(set(id(r) for r in results)) == 1
+        ), "Concurrent set_session calls returned different client objects"
+        # Only one client should be alive (no leaked extras).
+        assert fs._s3 is results[0]
+        await fs.set_session(refresh=True)  # clean up
+
+    asyncio.run(run())
+
+
+def test_set_session_preserves_injected_session(s3):
+    """A session= injected at construction time must not be replaced when
+    set_session triggers a refresh due to closed HTTP connections."""
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    async def run():
+        import aiobotocore.session as aio_session
+
+        custom_session = aio_session.AioSession()
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            session=custom_session,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        await fs.set_session()
+        assert (
+            fs.session is custom_session
+        ), "session should not be replaced on first connect"
+
+        # Simulate all HTTP connections being closed so set_session will refresh.
+        hsess = fs._s3._endpoint.http_session
+        if hsess._sessions:
+            for sess in hsess._sessions.values():
+                await sess.close()
+
+        await fs.set_session()
+        assert (
+            fs.session is custom_session
+        ), "set_session must not replace a user-injected session on refresh"
+
+    asyncio.run(run())
+
+
 def test_rm_recursive_prfix(s3):
     prefix = "logs/"  # must end with "/"
 
@@ -3198,3 +3289,108 @@ def test_rm_recursive_prfix(s3):
     logs_path = f"s3://{test_bucket_name}/{prefix}"
     s3.rm(logs_path, recursive=True)
     assert not s3.isdir(logs_path)
+
+
+def test_set_session_closed_sessions_rebuilds_once(s3):
+    """Regression test for the #1019 perf regression: a populated-but-all-closed
+    _sessions dict must rebuild the client exactly once, then reuse it. The
+    rebuilt client has an empty _sessions dict, which must not count as
+    "all closed" (vacuous all([]) == True) and force a refresh on every call.
+    """
+    import aiobotocore.session as aio_session
+    from unittest import mock
+
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    create_client_calls = 0
+    original_create_client = aio_session.AioSession._create_client
+
+    async def counting_create_client(self, *args, **kwargs):
+        nonlocal create_client_calls
+        create_client_calls += 1
+        return await original_create_client(self, *args, **kwargs)
+
+    async def run():
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        await fs._ls(f"{test_bucket_name}/dir")  # populates _sessions
+        sessions = fs._s3._endpoint.http_session._sessions
+        assert sessions, "expected a populated _sessions dict after an op"
+
+        for sess in sessions.values():
+            await sess.close()
+
+        baseline = create_client_calls  # ignore the warmup build above
+        iterations = 10
+        for _ in range(iterations):
+            await fs.set_session()
+
+        rebuilds = create_client_calls - baseline
+        assert rebuilds == 1, (
+            f"set_session rebuilt the client {rebuilds} times across {iterations} "
+            f"calls; expected 1. >1 means the empty-dict case forces a refresh on "
+            f"every call (#1019 regression)."
+        )
+        await fs.set_session(refresh=True)  # clean up
+
+    with mock.patch.object(
+        aio_session.AioSession, "_create_client", counting_create_client
+    ):
+        asyncio.run(run())
+
+
+def test_find_with_prefix_does_not_poison_dircache(s3):
+    data_dir = test_bucket_name + "/splits"
+    s3.touch(data_dir + "/train-00000.parquet")
+    s3.touch(data_dir + "/test-00000.parquet")
+    s3.invalidate_cache()
+
+    train_results = s3.find(data_dir, prefix="train-", maxdepth=1)
+    assert len(train_results) == 1
+    assert data_dir + "/train-00000.parquet" in train_results
+
+    all_files = {f.split("/")[-1] for f in s3.ls(data_dir)}
+    assert all_files == {"train-00000.parquet", "test-00000.parquet"}
+
+
+def test_glob_prefix_does_not_poison_dircache(s3):
+    data_dir = test_bucket_name + "/globs"
+    s3.touch(data_dir + "/train-00000.parquet")
+    s3.touch(data_dir + "/test-00000.parquet")
+    s3.invalidate_cache()
+
+    assert len(s3.glob(data_dir + "/train-*")) == 1
+    test_hits = s3.glob(data_dir + "/test-*")
+    assert len(test_hits) == 1
+    assert data_dir + "/test-00000.parquet" in test_hits
+
+
+def test_find_with_prefix_preserves_existing_full_cache(s3):
+    data_dir = test_bucket_name + "/warm"
+    s3.touch(data_dir + "/train-00000.parquet")
+    s3.touch(data_dir + "/test-00000.parquet")
+    s3.invalidate_cache()
+
+    assert len(s3.ls(data_dir)) == 2
+
+    s3.find(data_dir, prefix="train-", maxdepth=1)
+
+    cached = {f.split("/")[-1] for f in s3.ls(data_dir)}
+    assert cached == {"train-00000.parquet", "test-00000.parquet"}
+
+
+def test_normal_ls_and_find_still_populate_dircache(s3):
+    data_dir = test_bucket_name + "/normal"
+    s3.touch(data_dir + "/file-a")
+    s3.touch(data_dir + "/file-b")
+    s3.invalidate_cache()
+
+    assert data_dir not in s3.dircache
+
+    s3.ls(data_dir)
+    assert data_dir in s3.dircache
+    assert len(s3.dircache[data_dir]) == 2



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/compare/55737abc476501cdbd9b8f1895c735e2dc9e29b9...1623b1e4b6582058bdc22e70e74c0eb65cf953e9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/compare/55737abc476501cdbd9b8f1895c735e2dc9e29b9...1623b1e4b6582058bdc22e70e74c0eb65cf953e9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/413559ed/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  1 11:13:10 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 10:13:10 +0000
Subject: [Git][debian-gis-team/python-s3fs][pristine-tar] pristine-tar data
 for python-s3fs_2026.7.0.orig.tar.gz
Message-ID: <6a6dc6b6bc8e1_551fb6d03564e6@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / python-s3fs


Commits:
d2c5fc4d by Antonio Valentino at 2026-08-01T09:59:19+00:00
pristine-tar data for python-s3fs_2026.7.0.orig.tar.gz

- - - - -


2 changed files:

- + python-s3fs_2026.7.0.orig.tar.gz.delta
- + python-s3fs_2026.7.0.orig.tar.gz.id


Changes:

=====================================
python-s3fs_2026.7.0.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/python-s3fs_2026.7.0.orig.tar.gz.delta differ


=====================================
python-s3fs_2026.7.0.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+dffdaf7a3e00a57cb01ddbda9225aed539af8f76



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/commit/d2c5fc4d9d274a382a0e5f46c1afdff08bf6245d

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/commit/d2c5fc4d9d274a382a0e5f46c1afdff08bf6245d
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/64cd0b09/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  1 11:13:10 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 10:13:10 +0000
Subject: [Git][debian-gis-team/python-s3fs][upstream] New upstream version
 2026.7.0
Message-ID: <6a6dc6b6947ef_551faed8356281@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / python-s3fs


Commits:
ca03e160 by Antonio Valentino at 2026-08-01T09:59:18+00:00
New upstream version 2026.7.0
- - - - -


7 changed files:

- .github/workflows/ci.yml
- ci/env.yaml
- docs/source/changelog.rst
- requirements.txt
- s3fs/_version.py
- s3fs/core.py
- s3fs/tests/test_s3fs.py


Changes:

=====================================
.github/workflows/ci.yml
=====================================
@@ -15,7 +15,7 @@ jobs:
           - "3.12"
           - "3.13"
           - "3.14"
-        aiobotocore-version: [">=2.19.0,<2.20.0", "<3.0.0", "<4.0.0"]
+        aiobotocore-version: ["<4.0.0"]
 
     env:
       BOTO_CONFIG: /dev/null
@@ -38,7 +38,7 @@ jobs:
         shell: bash -l {0}
         run: |
           pip install git+https://github.com/fsspec/filesystem_spec
-          pip install --upgrade "aiobotocore${{ matrix.aiobotocore-version }}"
+          pip install --upgrade --force-reinstall "aiobotocore${{ matrix.aiobotocore-version }}"
           pip install . --no-deps
           pip list
 


=====================================
ci/env.yaml
=====================================
@@ -14,6 +14,6 @@ dependencies:
   - black
   - httpretty
   - aiobotocore
-  - moto
+  - moto !=5.2.0
   - flask
   - fsspec


=====================================
docs/source/changelog.rst
=====================================
@@ -1,6 +1,18 @@
 Changelog
 =========
 
+2026.7.0
+--------
+
+- don't cache prefix-filtered listings as complete directory entries (#1034)
+
+2026.6.0
+--------
+
+- cat should use info (#1029)
+- loosen bounds to allow install from git (#1026)
+- Fix CI (#1024)
+
 2026.4.0
 --------
 


=====================================
requirements.txt
=====================================
@@ -1,3 +1,3 @@
 aiobotocore>=2.19.0,<4.0.0
-fsspec==2026.4.0
+fsspec>=2026.7.0,<2026.7.1
 aiohttp!=4.0.0a0, !=4.0.0a1, >=3.9.0


=====================================
s3fs/_version.py
=====================================
@@ -25,9 +25,9 @@ def get_keywords() -> Dict[str, str]:
     # setup.py/versioneer.py will grep for the variable names, so they must
     # each be defined on a line of their own. _version.py will just call
     # get_keywords().
-    git_refnames = " (tag: 2026.4.0)"
-    git_full = "35d9eb0566bf128267613d46761894dfd25482aa"
-    git_date = "2026-04-29 16:51:56 -0400"
+    git_refnames = " (HEAD -> main, tag: 2026.7.0)"
+    git_full = "609950a67e1d2f26bd98b5053b016200272a35dd"
+    git_date = "2026-07-28 13:11:33 -0400"
     keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
     return keywords
 


=====================================
s3fs/core.py
=====================================
@@ -425,7 +425,11 @@ class S3FileSystem(AsyncFileSystem):
         self.use_ssl = use_ssl
         self.cache_regions = cache_regions
         self._s3 = None
+        self._set_session_lock = asyncio.Lock()
         self.session = session
+        self._session_is_owned = (
+            session is None
+        )  # False when the caller injected a session
         self.fixed_upload_size = fixed_upload_size
         self.local_expiry_check = local_expiry_check
         if max_concurrency < 1:
@@ -599,7 +603,9 @@ class S3FileSystem(AsyncFileSystem):
         if self._s3 is not None and not refresh:
             hsess = getattr(getattr(self._s3, "_endpoint", None), "http_session", None)
             if hsess is not None:
-                if all(_.closed for _ in hsess._sessions.values()):
+                if hsess._sessions is None or (
+                    hsess._sessions and all(_.closed for _ in hsess._sessions.values())
+                ):
                     refresh = True
             if not refresh:
                 return self._s3
@@ -638,36 +644,43 @@ class S3FileSystem(AsyncFileSystem):
             }
             config_kwargs["signature_version"] = UNSIGNED
 
-        conf = AioConfig(**config_kwargs)
-        if self.session is None or refresh:
-            self.session = aiobotocore.session.AioSession(**self.kwargs)
-
-        for parameters in (config_kwargs, self.kwargs, init_kwargs, client_kwargs):
-            for option in ("region_name", "endpoint_url"):
-                if parameters.get(option):
-                    self.cache_regions = False
-                    break
-        else:
-            cache_regions = self.cache_regions
+        async with self._set_session_lock:
+            # Re-check under the lock: a concurrent task may have set up the
+            # session while we were waiting.
+            if self._s3 is not None and not refresh:
+                return self._s3
+            conf = AioConfig(**config_kwargs)
+            if self.session is None or (refresh and self._session_is_owned):
+                # Only (re)create the AioSession when s3fs owns it
+                self.session = aiobotocore.session.AioSession(**self.kwargs)
+                self._session_is_owned = True
+
+            for parameters in (config_kwargs, self.kwargs, init_kwargs, client_kwargs):
+                for option in ("region_name", "endpoint_url"):
+                    if parameters.get(option):
+                        self.cache_regions = False
+                        break
+            else:
+                cache_regions = self.cache_regions
 
-        logger.debug(
-            "RC: caching enabled? %r (explicit option is %r)",
-            cache_regions,
-            self.cache_regions,
-        )
-        self.cache_regions = cache_regions
-        if self.cache_regions:
-            s3creator = S3BucketRegionCache(
-                self.session, config=conf, **init_kwargs, **client_kwargs
-            )
-            self._s3 = await s3creator.get_client()
-        else:
-            s3creator = self.session.create_client(
-                "s3", config=conf, **init_kwargs, **client_kwargs
+            logger.debug(
+                "RC: caching enabled? %r (explicit option is %r)",
+                cache_regions,
+                self.cache_regions,
             )
-            self._s3 = await s3creator.__aenter__()
+            self.cache_regions = cache_regions
+            if self.cache_regions:
+                s3creator = S3BucketRegionCache(
+                    self.session, config=conf, **init_kwargs, **client_kwargs
+                )
+                self._s3 = await s3creator.get_client()
+            else:
+                s3creator = self.session.create_client(
+                    "s3", config=conf, **init_kwargs, **client_kwargs
+                )
+                self._s3 = await s3creator.__aenter__()
 
-        self._s3creator = s3creator
+            self._s3creator = s3creator
         # the following actually closes the aiohttp connection; use of privates
         # might break in the future, would cause exception at gc time
         if not self.asynchronous:
@@ -839,6 +852,9 @@ class S3FileSystem(AsyncFileSystem):
         versions=False,
     ):
         bucket, key, _ = self.split_path(path)
+        # A caller-supplied prefix is a stem filter, so the listing is partial
+        # and must not be cached. Capture it before prefix is overwritten below.
+        partial = bool(prefix)
         if not prefix:
             prefix = ""
         if key:
@@ -864,7 +880,7 @@ class S3FileSystem(AsyncFileSystem):
             except ClientError as e:
                 raise translate_boto_error(e)
 
-            if delimiter and files and not versions:
+            if delimiter and files and not versions and not partial:
                 self.dircache[path] = files
             return files
         return self.dircache[path]
@@ -1308,15 +1324,7 @@ class S3FileSystem(AsyncFileSystem):
             and (max_concurrency or self.max_concurrency) > 1
         ):
             chunksize = chunksize or self.default_block_size
-            resp = await self._call_s3(
-                "get_object",
-                Bucket=bucket,
-                Key=key,
-                **version_id_kw(version_id or vers),
-                **self.req_kw,
-            )
-            content_length = resp.get("ContentLength", None)
-            resp["Body"].close()
+            content_length = await self._size(path)
 
             if content_length and content_length > chunksize:
                 return await self._cat_file_concurrent(


=====================================
s3fs/tests/test_s3fs.py
=====================================
@@ -3172,14 +3172,14 @@ def test_find_missing_ls(s3):
     assert set(listed_cached) == set(listed_no_cache)
 
 
-def test_session_close():
+def test_session_close(s3):
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
     async def run_program(run):
-        s3 = s3fs.S3FileSystem(anon=True, asynchronous=True)
+        s3 = s3fs.S3FileSystem(anon=True, asynchronous=True, endpoint_url=endpoint_uri)
+        s3.invalidate_cache()
         session = await s3.set_session()
-        files = await s3._ls(
-            "s3://noaa-hrrr-bdp-pds/hrrr.20140730/conus/"
-        )  # Random open data store
-        print(f"Number of files {len(files)}")
+        files = await s3._ls(f"{test_bucket_name}/dir")
         await session.close()
 
     import aiobotocore.httpsession
@@ -3189,6 +3189,97 @@ def test_session_close():
     asyncio.run(run_program(False))
 
 
+def test_set_session_sessions_none(s3):
+    """After the HTTP session is closed and aiobotocore sets _sessions=None
+    (aiobotocore 3.x behaviour), set_session must rebuild the client rather
+    than returning the dead one."""
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    async def run():
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        await fs.set_session()
+        original_client = fs._s3
+
+        # Simulate aiobotocore 3.x behaviour: __aexit__ sets _sessions to None.
+        hsess = fs._s3._endpoint.http_session
+        hsess._sessions = None
+
+        # set_session must detect the dead client and create a new one.
+        await fs.set_session()
+        assert (
+            fs._s3 is not original_client
+        ), "set_session should have rebuilt the client when _sessions is None"
+        await fs.set_session(refresh=True)  # clean up
+
+    asyncio.run(run())
+
+
+def test_set_session_concurrent_no_leak(s3):
+    """Concurrent calls to set_session on a fresh instance must not leak
+    clients (i.e. only one client should be created, not N)."""
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    async def run():
+        S3FileSystem.clear_instance_cache()
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        # All coroutines start with _s3 == None; fire them simultaneously.
+        results = await asyncio.gather(*[fs.set_session() for _ in range(8)])
+        # Every coroutine must get back the same client object.
+        assert (
+            len(set(id(r) for r in results)) == 1
+        ), "Concurrent set_session calls returned different client objects"
+        # Only one client should be alive (no leaked extras).
+        assert fs._s3 is results[0]
+        await fs.set_session(refresh=True)  # clean up
+
+    asyncio.run(run())
+
+
+def test_set_session_preserves_injected_session(s3):
+    """A session= injected at construction time must not be replaced when
+    set_session triggers a refresh due to closed HTTP connections."""
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    async def run():
+        import aiobotocore.session as aio_session
+
+        custom_session = aio_session.AioSession()
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            session=custom_session,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        await fs.set_session()
+        assert (
+            fs.session is custom_session
+        ), "session should not be replaced on first connect"
+
+        # Simulate all HTTP connections being closed so set_session will refresh.
+        hsess = fs._s3._endpoint.http_session
+        if hsess._sessions:
+            for sess in hsess._sessions.values():
+                await sess.close()
+
+        await fs.set_session()
+        assert (
+            fs.session is custom_session
+        ), "set_session must not replace a user-injected session on refresh"
+
+    asyncio.run(run())
+
+
 def test_rm_recursive_prfix(s3):
     prefix = "logs/"  # must end with "/"
 
@@ -3198,3 +3289,108 @@ def test_rm_recursive_prfix(s3):
     logs_path = f"s3://{test_bucket_name}/{prefix}"
     s3.rm(logs_path, recursive=True)
     assert not s3.isdir(logs_path)
+
+
+def test_set_session_closed_sessions_rebuilds_once(s3):
+    """Regression test for the #1019 perf regression: a populated-but-all-closed
+    _sessions dict must rebuild the client exactly once, then reuse it. The
+    rebuilt client has an empty _sessions dict, which must not count as
+    "all closed" (vacuous all([]) == True) and force a refresh on every call.
+    """
+    import aiobotocore.session as aio_session
+    from unittest import mock
+
+    s3.pipe(f"{test_bucket_name}/dir/afile", b"small")
+
+    create_client_calls = 0
+    original_create_client = aio_session.AioSession._create_client
+
+    async def counting_create_client(self, *args, **kwargs):
+        nonlocal create_client_calls
+        create_client_calls += 1
+        return await original_create_client(self, *args, **kwargs)
+
+    async def run():
+        fs = S3FileSystem(
+            anon=False,
+            asynchronous=True,
+            client_kwargs={"endpoint_url": endpoint_uri},
+            skip_instance_cache=True,
+        )
+        await fs._ls(f"{test_bucket_name}/dir")  # populates _sessions
+        sessions = fs._s3._endpoint.http_session._sessions
+        assert sessions, "expected a populated _sessions dict after an op"
+
+        for sess in sessions.values():
+            await sess.close()
+
+        baseline = create_client_calls  # ignore the warmup build above
+        iterations = 10
+        for _ in range(iterations):
+            await fs.set_session()
+
+        rebuilds = create_client_calls - baseline
+        assert rebuilds == 1, (
+            f"set_session rebuilt the client {rebuilds} times across {iterations} "
+            f"calls; expected 1. >1 means the empty-dict case forces a refresh on "
+            f"every call (#1019 regression)."
+        )
+        await fs.set_session(refresh=True)  # clean up
+
+    with mock.patch.object(
+        aio_session.AioSession, "_create_client", counting_create_client
+    ):
+        asyncio.run(run())
+
+
+def test_find_with_prefix_does_not_poison_dircache(s3):
+    data_dir = test_bucket_name + "/splits"
+    s3.touch(data_dir + "/train-00000.parquet")
+    s3.touch(data_dir + "/test-00000.parquet")
+    s3.invalidate_cache()
+
+    train_results = s3.find(data_dir, prefix="train-", maxdepth=1)
+    assert len(train_results) == 1
+    assert data_dir + "/train-00000.parquet" in train_results
+
+    all_files = {f.split("/")[-1] for f in s3.ls(data_dir)}
+    assert all_files == {"train-00000.parquet", "test-00000.parquet"}
+
+
+def test_glob_prefix_does_not_poison_dircache(s3):
+    data_dir = test_bucket_name + "/globs"
+    s3.touch(data_dir + "/train-00000.parquet")
+    s3.touch(data_dir + "/test-00000.parquet")
+    s3.invalidate_cache()
+
+    assert len(s3.glob(data_dir + "/train-*")) == 1
+    test_hits = s3.glob(data_dir + "/test-*")
+    assert len(test_hits) == 1
+    assert data_dir + "/test-00000.parquet" in test_hits
+
+
+def test_find_with_prefix_preserves_existing_full_cache(s3):
+    data_dir = test_bucket_name + "/warm"
+    s3.touch(data_dir + "/train-00000.parquet")
+    s3.touch(data_dir + "/test-00000.parquet")
+    s3.invalidate_cache()
+
+    assert len(s3.ls(data_dir)) == 2
+
+    s3.find(data_dir, prefix="train-", maxdepth=1)
+
+    cached = {f.split("/")[-1] for f in s3.ls(data_dir)}
+    assert cached == {"train-00000.parquet", "test-00000.parquet"}
+
+
+def test_normal_ls_and_find_still_populate_dircache(s3):
+    data_dir = test_bucket_name + "/normal"
+    s3.touch(data_dir + "/file-a")
+    s3.touch(data_dir + "/file-b")
+    s3.invalidate_cache()
+
+    assert data_dir not in s3.dircache
+
+    s3.ls(data_dir)
+    assert data_dir in s3.dircache
+    assert len(s3.dircache[data_dir]) == 2



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/commit/ca03e1601493df184c48d4f7b90f9a4ef736e8bb

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-s3fs/-/commit/ca03e1601493df184c48d4f7b90f9a4ef736e8bb
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/966d0958/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  1 11:51:24 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 10:51:24 +0000
Subject: Processing of python-s3fs_2026.7.0-1_source.changes
Message-ID: <E1wq7JM-00Dtwc-0M@usper.debian.org>

python-s3fs_2026.7.0-1_source.changes uploaded successfully to localhost
along with the files:
  python-s3fs_2026.7.0-1.dsc
  python-s3fs_2026.7.0.orig.tar.gz
  python-s3fs_2026.7.0-1.debian.tar.xz
  python-s3fs_2026.7.0-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Sat Aug  1 12:05:19 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 11:05:19 +0000
Subject: python-s3fs_2026.7.0-1_source.changes ACCEPTED into unstable
Message-ID: <E1wq7Wp-0000000EdIr-2uce@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Sat, 01 Aug 2026 10:02:23 +0000
Source: python-s3fs
Architecture: source
Version: 2026.7.0-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Changes:
 python-s3fs (2026.7.0-1) unstable; urgency=medium
 .
   * New upstream release.
   * New d/python3-s3fs.lintian-overrides.
Checksums-Sha1:
 0d91fc4687d7a332738d02ab9bd28f08f3ee6a8e 3131 python-s3fs_2026.7.0-1.dsc
 ff1c50a9686c51d0a72415a7733f852415f08fdd 100753 python-s3fs_2026.7.0.orig.tar.gz
 eaf45aeacf18f92a6a3ccf66140ef0db3eb2b4c3 5216 python-s3fs_2026.7.0-1.debian.tar.xz
 38310a6b5a3b4ca6355436832a6bf32f42b246ae 8841 python-s3fs_2026.7.0-1_amd64.buildinfo
Checksums-Sha256:
 a367a17c1687afbd7f256df467f928277fedd813e936981954ef5d6289f13190 3131 python-s3fs_2026.7.0-1.dsc
 8d076c01c50f0b20757e6c027ea743344c5b24b233169a79f991ca9051e5d452 100753 python-s3fs_2026.7.0.orig.tar.gz
 44224a05a7c9aefecc94198e267b27ac23feb9125c99f2b56edc7409f40a13d2 5216 python-s3fs_2026.7.0-1.debian.tar.xz
 a71e4322fdc53e81ce20b41bf04a8db87a2433e644722c276a151167f7006e03 8841 python-s3fs_2026.7.0-1_amd64.buildinfo
Files:
 67d4e9edc3232421f01633a67a8e3f1c 3131 python optional python-s3fs_2026.7.0-1.dsc
 a5465fa2fa7b72dc90f68c34d9eb1f8f 100753 python optional python-s3fs_2026.7.0.orig.tar.gz
 5d3b52915b08cc08d7aa0a36c18c0d11 5216 python optional python-s3fs_2026.7.0-1.debian.tar.xz
 6383bacc467bebaf74a4254af94eb8ec 8841 python optional python-s3fs_2026.7.0-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmptzPodHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBIOEA/6AvZ5GC/ZxTChFTQT
SZ706LAF1ro2BvRRSB2jVbrft84YSMx9D6JTd+OScZOGkdVMgcREQh+4MmytGckI
cbp5CKQ4/DrqJRT5Q22yM6i9WrWC+KT8FCmqcX9PhismBt9RvuVnYPDc4Xhr1wJr
aAnNarG3gd5UjiyOWeqBDQ/YP3nQceRxl4QU4q1ntkBlMSZbqpL2rNTSAit1Tlu6
2oH8ikVMmnx4L675NTlBFgJ+YQDdzMc8fQRRFmuGRoBy/Q9oae3qfG+m9mcylAxm
Uvqc6TomuwyTs+HR6zdJLnHqZUMeY+A76Tydpc9byZeLu6JTTGfPUqQG57d64ls5
v0m+uWuPU4mT6z9GH6NQa3xHA5VhpX8k/FvGfnXhyf0Ck6yY38CjkAQutZ7NKu6N
C1B1uI5oDTegbDEe1oRvn1ljET3U22zDJWUmigC3x8C1+xswNuHKh6kigKZUNy5i
jjC77jpLaDLlHl3kIKRC7cNHBm5V2kA4w4ha0koyUmJb/6wCGp9u+R7brqdTSn48
S5Fjf/hGdoS781f/LMDDNbJcowhMNPam7h70g1yc26FBEkAfZDoPZR+7bCT5cFlb
UuPFqHf5q1I0hIkam7HiaIwDM4lr9SHPQ1mjrBtje/ZeqHGNu9pCm52jIj/89xI7
70dYCIKy7W7DsvltauL6cCJAklI=
=z4ze
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/de9d7ae8/attachment.sig>

From gitlab at salsa.debian.org  Sat Aug  1 17:04:04 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 16:04:04 +0000
Subject: [Git][debian-gis-team/pytest-recording] Pushed new tag debian/0.13.4-2
Message-ID: <6a6e18f4d30fb_551fb48c41872b@godard.mail>



Antonio Valentino pushed new tag debian/0.13.4-2 at Debian GIS Project / pytest-recording

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pytest-recording/-/tree/debian/0.13.4-2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/cc3487cb/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  1 17:04:12 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 01 Aug 2026 16:04:12 +0000
Subject: [Git][debian-gis-team/pytest-recording][master] Set distribution to
 unstable
Message-ID: <6a6e18fcded1a_551fb10841893b@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / pytest-recording


Commits:
2fd5dcce by Antonio Valentino at 2026-08-01T16:01:42+00:00
Set distribution to unstable

- - - - -


1 changed file:

- debian/changelog


Changes:

=====================================
debian/changelog
=====================================
@@ -1,6 +1,6 @@
-pytest-recording (0.13.4-2) UNRELEASED; urgency=medium
+pytest-recording (0.13.4-2) unstable; urgency=medium
 
-  * Team upload.
+  [ Bas Couwenberg ]
   * Update lintian overrides.
   * Drop Rules-Requires-Root: no, default since dpkg 1.22.13.
   * Use test-build-validate-cleanup instead of test-build-twice.
@@ -9,7 +9,7 @@ pytest-recording (0.13.4-2) UNRELEASED; urgency=medium
   * Fix typo in Vcs-Browser URL.
     (closes: #1130654)
 
- -- Bas Couwenberg <sebastic at debian.org>  Fri, 12 Sep 2025 17:46:37 +0200
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Sat, 01 Aug 2026 16:01:18 +0000
 
 pytest-recording (0.13.4-1) unstable; urgency=medium
 



View it on GitLab: https://salsa.debian.org/debian-gis-team/pytest-recording/-/commit/2fd5dcceac59be26efe4e87b2ca7db7fcc821c5f

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pytest-recording/-/commit/2fd5dcceac59be26efe4e87b2ca7db7fcc821c5f
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/f3272c86/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  1 17:15:31 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 16:15:31 +0000
Subject: Processing of pytest-recording_0.13.4-2_source.changes
Message-ID: <E1wqCN1-00E8HB-2y@usper.debian.org>

pytest-recording_0.13.4-2_source.changes uploaded successfully to localhost
along with the files:
  pytest-recording_0.13.4-2.dsc
  pytest-recording_0.13.4-2.debian.tar.xz
  pytest-recording_0.13.4-2_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Sat Aug  1 17:19:18 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 01 Aug 2026 16:19:18 +0000
Subject: pytest-recording_0.13.4-2_source.changes ACCEPTED into unstable
Message-ID: <E1wqCQg-0000000Ffeq-3IJL@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Sat, 01 Aug 2026 16:01:18 +0000
Source: pytest-recording
Architecture: source
Version: 0.13.4-2
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Closes: 1130654
Changes:
 pytest-recording (0.13.4-2) unstable; urgency=medium
 .
   [ Bas Couwenberg ]
   * Update lintian overrides.
   * Drop Rules-Requires-Root: no, default since dpkg 1.22.13.
   * Use test-build-validate-cleanup instead of test-build-twice.
   * Drop Priority: optional, default since dpkg 1.22.13.
   * Bump Standards-Version to 4.7.4, changes: priority.
   * Fix typo in Vcs-Browser URL.
     (closes: #1130654)
Checksums-Sha1:
 2b736334b43e84778f8c51c20d6885a9240979b5 2755 pytest-recording_0.13.4-2.dsc
 7b1b795eb69a5c74c5a7fbba95f8b4cf14070f3c 3212 pytest-recording_0.13.4-2.debian.tar.xz
 e5de7fbf416885f0eecb6682b464d279f32b8357 8314 pytest-recording_0.13.4-2_amd64.buildinfo
Checksums-Sha256:
 be1d742dbf44434175b9d83a43966eb800c1f1466fc9c76a7de2e0bc506963f2 2755 pytest-recording_0.13.4-2.dsc
 eff0d51e183ff0c8168f9a957a37960ea2b881bbd316e4109a487504086dc476 3212 pytest-recording_0.13.4-2.debian.tar.xz
 a138347e241ce07de7ba29e5aa26723f81f12d0bfc6d04bccf2ec6bf3ac7c50d 8314 pytest-recording_0.13.4-2_amd64.buildinfo
Files:
 dd7610f67261029cf34ff27a0daff056 2755 python optional pytest-recording_0.13.4-2.dsc
 324936c3973441660b78029953bc5a0d 3212 python optional pytest-recording_0.13.4-2.debian.tar.xz
 07665f92ac85d26ce674b3ae40785dc0 8314 python optional pytest-recording_0.13.4-2_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmpuGSsdHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBLFtRAA0ZNWbpmBMhM1mQBm
Fmf2qzRciu6IGVvqUfHngjs2O5EtT0dk7a5EkeVdTgZznmP/DksQmPAo3zMQyUwk
21F9PIfpexEc3yxtyXbvuX5hWVWl5TP5T9fUFCjnw28ZfVrjihTJvMtz1ZLKQg8/
Tbq9aF2nm2CnoywRbSD4uvE+Zy/vlOPGQyAyAs5fYMmfIuBbUcfSwbhymVFKq6de
FnU/ddvrdoF6+wNuSJTwe9wU+2D2SgP5r8asfhS9eQyEf8mBi9DZyrjNRSXSe4R3
eosx7lJMrobvt9Zbe+QDQDuU/uzOi3enquTBeJNUZAqJDSy1XdKPOim5+KCsBroX
CKSVL9OjpZD8S3w6OcCk7MqRJ2bZ5Tuifu054eSxDAmPABIcjPKa1PDMenNTjdD2
TcBi/bz8Weef7H0fLRHl5n47ImTq21ZntKW35uy+JuHGOIVTHWt1hnzlwT4KMVTA
0Kp/j/uFDO+ymap3iwwRvuEdeCKrSoQL/3fv6C6gkxgeScfzUoOmh9wYwRvikJ6V
EY2/kysWsIKehjFriLIV3sMAPkQWz3UXeW/soOvM06VuOOD5/my1E8o8I3rhQGLF
h62AU8m/sNddz+uZNFq5XbG1lzFx09ZB1D3LR9j8pRNlRcgo5izPp2voZS2uY0n5
ZiZNV/sVtK7DEp4XvQ/Fc2cn4k4=
=ijI4
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/c31caf22/attachment.sig>

From owner at bugs.debian.org  Sat Aug  1 17:21:01 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Sat, 01 Aug 2026 16:21:01 +0000
Subject: Bug#1130654: marked as done (control Vcs-Browser please fix link)
References: <E1wqCQg-0000000Ffez-3dMx@fasolo.debian.org>
 <CALbAaL951LKUG0=hO0pY98Jy98E=Cn-rmdWpn5K-F7niLrTM4A@mail.gmail.com>
Message-ID: <handler.1130654.D1130654.17856011591432200.ackdone@bugs.debian.org>

Your message dated Sat, 01 Aug 2026 16:19:18 +0000
with message-id <E1wqCQg-0000000Ffez-3dMx at fasolo.debian.org>
and subject line Bug#1130654: fixed in pytest-recording 0.13.4-2
has caused the Debian Bug report #1130654,
regarding control Vcs-Browser please fix link
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner at bugs.debian.org
immediately.)


-- 
1130654: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1130654
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems
-------------- next part --------------
An embedded message was scrubbed...
From: onders <onders.am.istiets at gmail.com>
Subject: control Vcs-Browser please fix link
Date: Fri, 13 Mar 2026 21:49:11 +0100
Size: 4915
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/58b6dd5b/attachment.eml>
-------------- next part --------------
An embedded message was scrubbed...
From: Debian FTP Masters <ftpmaster at ftp-master.debian.org>
Subject: Bug#1130654: fixed in pytest-recording 0.13.4-2
Date: Sat, 01 Aug 2026 16:19:18 +0000
Size: 7093
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260801/58b6dd5b/attachment-0001.eml>

From sanvila at debian.org  Sat Aug  1 23:39:57 2026
From: sanvila at debian.org (Santiago Vila)
Date: Sat, 01 Aug 2026 22:39:57 +0000
Subject: Bug#1143435: universal-pathlib: FTBFS: E httpcore.ConnectError:
 [Errno 111] Connection refused
Message-ID: <E1wqIN3-00DZdC-0i@paradis.debian.org>

Package: src:universal-pathlib
Version: 0.3.10-2
Severity: serious
Tags: ftbfs forky sid

Dear maintainer:

During a rebuild of all packages in unstable, this package failed to build.

Below you will find the last part of the build log (probably the most
relevant part, but not necessarily). If required, the full build log
is available here:

https://people.debian.org/~sanvila/build-logs/202608/

About the archive rebuild: The build was made on virtual machines from AWS,
using sbuild and a reduced chroot with only build-essential packages.

If you cannot reproduce the bug please contact me privately, as I
am willing to provide ssh access to a virtual machine where the bug is
fully reproducible.

If this is really a bug in one of the build-depends, please use
reassign and add an affects on src:universal-pathlib, so that this is still
visible in the BTS web page for this package.

Thanks.

--------------------------------------------------------------------------------
[...]
 debian/rules clean
dh clean --buildsystem=pybuild
   dh_auto_clean -O--buildsystem=pybuild
   dh_autoreconf_clean -O--buildsystem=pybuild
   dh_clean -O--buildsystem=pybuild
 debian/rules binary
dh binary --buildsystem=pybuild
   dh_update_autotools_config -O--buildsystem=pybuild
   dh_autoreconf -O--buildsystem=pybuild
   dh_auto_configure -O--buildsystem=pybuild
   dh_auto_build -O--buildsystem=pybuild
I: pybuild plugin_pyproject:142: Building wheel for python3.13 with "build" module
I: pybuild base:385: python3.13 -m build --skip-dependency-check --no-isolation --wheel --outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_upath  
* Building wheel...
running bdist_wheel

[... snipped ...]

SKIPPED [1] ../../../upath/tests/cases.py:60: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:65: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:68: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:75: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:80: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:85: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:93: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:101: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:108: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:112: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:116: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:127: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:138: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:147: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:159: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:166: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:173: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:176: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:182: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:191: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:197: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:206: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:212: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:235: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:246: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:252: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:256: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/cases.py:262: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:43: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:47: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:57: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:63: could not import 's3fs': No module named 's3fs'
SKIPPED [2] ../../../upath/tests/implementations/test_s3.py:76: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:85: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:90: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:104: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_s3.py:173: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/implementations/test_sftp.py:19: docker not installed
SKIPPED [1] ../../../upath/tests/cases.py:846: docker run not available
SKIPPED [4] ../../../upath/tests/cases.py:870: docker run not available
SKIPPED [4] ../../../upath/tests/cases.py:912: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:943: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:946: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:949: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:954: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:960: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:965: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:989: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:999: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:1011: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:1020: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:679: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:683: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:687: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:693: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:733: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:740: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:747: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:755: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:762: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:770: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:776: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:783: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:789: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:803: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:810: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:817: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:824: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:288: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:292: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:310: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:314: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:318: docker run not available
SKIPPED [2] ../../../upath/tests/cases.py:322: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:329: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:361: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:368: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:373: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:381: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:384: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:387: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:390: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:393: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:396: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:409: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:412: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:424: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:429: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:434: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:438: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:442: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:449: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:453: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:458: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:463: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:467: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:471: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:476: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:481: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:487: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:507: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:523: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:532: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:545: docker run not available
SKIPPED [3] ../../../upath/tests/cases.py:554: docker run not available
SKIPPED [3] ../../../upath/tests/cases.py:568: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:588: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:599: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:607: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:618: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:631: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:644: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:655: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:659: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:663: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:40: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:49: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:54: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:60: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:65: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:68: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:75: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:80: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:85: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:93: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:101: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:108: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:112: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:116: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:127: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:138: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:147: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:159: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:166: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:173: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:176: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:182: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:191: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:197: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:206: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:212: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:235: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:246: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:252: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:256: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:262: docker run not available
SKIPPED [1] ../../../upath/tests/implementations/test_smb.py:18: docker run not available
SKIPPED [3] ../../../upath/tests/implementations/test_smb.py:24: docker run not available
SKIPPED [1] ../../../upath/tests/cases.py:846: No module named 'wsgidav'
SKIPPED [4] ../../../upath/tests/cases.py:870: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:943: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:946: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:949: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:954: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:960: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:965: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:989: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:999: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:1011: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:1020: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:679: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:683: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:687: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:693: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:733: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:740: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:747: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:755: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:762: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:770: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:776: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:783: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:789: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:803: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:810: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:817: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:824: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:288: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:292: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:310: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:314: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:318: No module named 'wsgidav'
SKIPPED [2] ../../../upath/tests/cases.py:322: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:329: No module named 'wsgidav'
SKIPPED [3] ../../../upath/tests/cases.py:332: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:361: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:368: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:373: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:381: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:384: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:387: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:390: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:393: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:396: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:409: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:412: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:424: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:429: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:434: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:438: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:442: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:449: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:453: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:458: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:463: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:467: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:471: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:476: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:481: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:487: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:507: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:523: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:532: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:545: No module named 'wsgidav'
SKIPPED [3] ../../../upath/tests/cases.py:554: No module named 'wsgidav'
SKIPPED [3] ../../../upath/tests/cases.py:568: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:588: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:599: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:607: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:618: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:631: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:644: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:655: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:659: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:663: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:40: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:49: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:54: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:60: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:65: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:68: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:75: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:80: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:85: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:93: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:101: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:108: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:112: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:116: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:127: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:138: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:147: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:159: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:166: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:173: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:176: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:182: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:191: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:197: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:206: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:212: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:235: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:246: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:252: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:256: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/cases.py:262: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/implementations/test_webdav.py:19: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/implementations/test_webdav.py:23: No module named 'wsgidav'
SKIPPED [4] ../../../upath/tests/implementations/test_webdav.py:29: No module named 'wsgidav'
SKIPPED [1] ../../../upath/tests/test_core.py:31: Only run on Windows
SKIPPED [1] ../../../upath/tests/test_core.py:202: could not import 's3fs': No module named 's3fs'
SKIPPED [1] ../../../upath/tests/test_core.py:202: could not import 'gcsfs': No module named 'gcsfs'
SKIPPED [2] ../../../upath/tests/test_pathlib_backport.py:23: windows only
SKIPPED [1] ../../../upath/tests/test_pydantic.py:137: Only run on Windows
SKIPPED [1] ../../../upath/tests/test_relative.py:41: s3 not available
SKIPPED [1] ../../../upath/tests/test_relative.py:41: gcs not available
SKIPPED [1] ../../../upath/tests/third_party/test_pydantic.py: requires pydantic
XFAIL ../../../upath/tests/implementations/test_azure.py::test_copy__object_key_collides_with_dir_prefix - adlfs returns isdir false
XFAIL ../../../upath/tests/test_core.py::test_new_method - unsupported on universal_pathlib>0.1.4
XFAIL ../../../upath/tests/test_stat.py::test_stat_atime_value - fsspec does not return 'atime'
XFAIL ../../../upath/tests/test_stat.py::test_stat_ctime_value - fsspec returns 'created' but not 'ctime'
FAILED ../../../upath/tests/implementations/test_hf.py::test_hfpath - httpx.ConnectError: [Errno 111] Connection refused
FAILED ../../../upath/tests/implementations/test_hf.py::TestUPathHf::test_iterdir_parent_iteration - ValueError: Repository id must be 'namespace/name', got '__username__'. Single-segment ids (e.g. 'gpt2') are no longer supported.
= 2 failed, 2387 passed, 885 skipped, 248 deselected, 4 xfailed, 3 warnings in 15.74s =
E: pybuild pybuild:485: test: plugin pyproject failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.14_upath/build; python3.14 -m pytest -m "not network" /<<PKGBUILDDIR>>/upath/tests
dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.13 3.14" --parallel=2 returned exit code 13
make: *** [debian/rules:9: binary] Error 25
dpkg-buildpackage: error: debian/rules binary subprocess failed with exit status 2
--------------------------------------------------------------------------------


From noreply at release.debian.org  Sun Aug  2 05:39:09 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Sun, 02 Aug 2026 04:39:09 +0000
Subject: jeolib-miallib 1.2.1-1 MIGRATED to testing
Message-ID: <E1wqNyf-000000024pG-3slS@respighi.debian.org>

FYI: The status of the jeolib-miallib source package
in Debian's testing distribution has changed.

  Previous version: 1.1.7-2
  Current version:  1.2.1-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Sun Aug  2 05:39:09 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Sun, 02 Aug 2026 04:39:09 +0000
Subject: jeolib-jiplib 1.2.1+ds-1 MIGRATED to testing
Message-ID: <E1wqNyf-000000024pB-3gn8@respighi.debian.org>

FYI: The status of the jeolib-jiplib source package
in Debian's testing distribution has changed.

  Previous version: 1.1.7+ds-2
  Current version:  1.2.1+ds-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Sun Aug  2 05:39:11 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Sun, 02 Aug 2026 04:39:11 +0000
Subject: libhdf4 4.3.1-3 MIGRATED to testing
Message-ID: <E1wqNyh-000000024rw-1Jmp@respighi.debian.org>

FYI: The status of the libhdf4 source package
in Debian's testing distribution has changed.

  Previous version: 4.3.1-2
  Current version:  4.3.1-3

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Sun Aug  2 05:39:19 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Sun, 02 Aug 2026 04:39:19 +0000
Subject: utm 0.9.0-1 MIGRATED to testing
Message-ID: <E1wqNyp-00000002567-0sbQ@respighi.debian.org>

FYI: The status of the utm source package
in Debian's testing distribution has changed.

  Previous version: 0.8.1-1
  Current version:  0.9.0-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From owner at bugs.debian.org  Sun Aug  2 08:41:02 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Sun, 02 Aug 2026 07:41:02 +0000
Subject: Processed: back to libkml
References: <CALF6qJmmFwC-ZRQ8unKm4o+gchOUO65HBCsio3QvjpK4StEFuA@mail.gmail.com>
Message-ID: <handler.s.C.17856563651888405.transcript@bugs.debian.org>

Processing commands for control at bugs.debian.org:

> reassign 1133521 src:libkml 1.3.0-13
Bug #1133521 [src:boost1.90] libkml: ftbfs with GCC-16
Bug reassigned from package 'src:boost1.90' to 'src:libkml'.
No longer marked as found in versions boost1.90/1.90.0-6.
Ignoring request to alter fixed versions of bug #1133521 to the same values previously set
Bug #1133521 [src:libkml] libkml: ftbfs with GCC-16
Marked as found in versions libkml/1.3.0-13.
> thanks
Stopping processing here.

Please contact me if you need assistance.
-- 
1133521: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1133521
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems


From sebastic at xs4all.nl  Sun Aug  2 10:21:59 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Sun, 2 Aug 2026 11:21:59 +0200
Subject: Bug#1143435: universal-pathlib: FTBFS: E httpcore.ConnectError:
 [Errno 111] Connection refused
In-Reply-To: <E1wqIN3-00DZdC-0i@paradis.debian.org>
References: <E1wqIN3-00DZdC-0i@paradis.debian.org>
 <E1wqIN3-00DZdC-0i@paradis.debian.org>
Message-ID: <cf014434-06fc-4859-ad11-7eb3e6dfe316@xs4all.nl>

On 8/2/26 12:39 AM, Santiago Vila wrote:
> FAILED ../../../upath/tests/implementations/test_hf.py::test_hfpath - httpx.ConnectError: [Errno 111] Connection refused
> FAILED ../../../upath/tests/implementations/test_hf.py::TestUPathHf::test_iterdir_parent_iteration - ValueError: Repository id must be 'namespace/name', got '__username__'. Single-segment ids (e.g. 'gpt2') are no longer supported.

Looks like the HuggingFace filesystem class became loadable, previously the ImportError would have skipped both tests.

The former can be marked as requiring network, the latter seems to require compatibility changes.

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From noreply at release.debian.org  Mon Aug  3 05:39:14 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Mon, 03 Aug 2026 04:39:14 +0000
Subject: lerc 4.2.0+ds-1 MIGRATED to testing
Message-ID: <E1wqkSI-00000003PwC-0HP4@respighi.debian.org>

FYI: The status of the lerc source package
in Debian's testing distribution has changed.

  Previous version: 4.1.1+ds-2
  Current version:  4.2.0+ds-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Mon Aug  3 05:39:40 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:39:40 +0000
Subject: pygeofilter is marked for autoremoval from testing
Message-ID: <E1wqkSi-00000003QCc-41xn@respighi.debian.org>

pygeofilter 0.4.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133505: ipe: ftbfs with GCC-16
 https://bugs.debian.org/1133505
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:39:41 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:39:41 +0000
Subject: postgis is marked for autoremoval from testing
Message-ID: <E1wqkSj-00000003QCt-371e@respighi.debian.org>

postgis 3.6.4+dfsg-2 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133505: ipe: ftbfs with GCC-16
 https://bugs.debian.org/1133505



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:39:42 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:39:42 +0000
Subject: pgrouting is marked for autoremoval from testing
Message-ID: <E1wqkSk-00000003QD4-0wns@respighi.debian.org>

pgrouting 4.0.1-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133505: ipe: ftbfs with GCC-16
 https://bugs.debian.org/1133505



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:39:43 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:39:43 +0000
Subject: tinyows is marked for autoremoval from testing
Message-ID: <E1wqkSl-00000003QDl-40iB@respighi.debian.org>

tinyows 1.2.2-2 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133505: ipe: ftbfs with GCC-16
 https://bugs.debian.org/1133505



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:39:42 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:39:42 +0000
Subject: sfcgal is marked for autoremoval from testing
Message-ID: <E1wqkSk-00000003QDM-3dzl@respighi.debian.org>

sfcgal 2.3.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133505: ipe: ftbfs with GCC-16
 https://bugs.debian.org/1133505



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:40:21 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:40:21 +0000
Subject: python-geopandas is marked for autoremoval from testing
Message-ID: <E1wqkTN-00000003QUg-1TmN@respighi.debian.org>

python-geopandas 1.1.4-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:07 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:07 +0000
Subject: python-s3fs is marked for autoremoval from testing
Message-ID: <E1wqkU7-00000003Qmk-1IOE@respighi.debian.org>

python-s3fs 2026.4.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:13 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:13 +0000
Subject: python-stetl is marked for autoremoval from testing
Message-ID: <E1wqkUD-00000003QpM-2n36@respighi.debian.org>

python-stetl 2.1-2 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:30 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:30 +0000
Subject: pywps is marked for autoremoval from testing
Message-ID: <E1wqkUU-00000003QwE-0b1h@respighi.debian.org>

pywps 4.7.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:32 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:32 +0000
Subject: rasterio is marked for autoremoval from testing
Message-ID: <E1wqkUW-00000003Qx4-0rUw@respighi.debian.org>

rasterio 1.5.0-2 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:34 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:34 +0000
Subject: rio-cogeo is marked for autoremoval from testing
Message-ID: <E1wqkUY-00000003Qy2-1oVk@respighi.debian.org>

rio-cogeo 7.0.2-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:57 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:57 +0000
Subject: stac-check is marked for autoremoval from testing
Message-ID: <E1wqkUv-00000003R8C-2bY7@respighi.debian.org>

stac-check 1.14.0-2 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:57 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:57 +0000
Subject: stac-pydantic is marked for autoremoval from testing
Message-ID: <E1wqkUv-00000003R8I-3H3R@respighi.debian.org>

stac-pydantic 3.6.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:58 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:58 +0000
Subject: stactools is marked for autoremoval from testing
Message-ID: <E1wqkUw-00000003R8V-14Ig@respighi.debian.org>

stactools 0.5.3-5 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:41:57 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:41:57 +0000
Subject: stac-validator is marked for autoremoval from testing
Message-ID: <E1wqkUv-00000003R8L-3wQg@respighi.debian.org>

stac-validator 4.4.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:42:08 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:42:08 +0000
Subject: universal-pathlib is marked for autoremoval from testing
Message-ID: <E1wqkV6-00000003RCX-0Kzx@respighi.debian.org>

universal-pathlib 0.3.10-2 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:42:08 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:42:08 +0000
Subject: usgs is marked for autoremoval from testing
Message-ID: <E1wqkV6-00000003RCg-1fXh@respighi.debian.org>

usgs 0.3.7-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:42:33 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:42:33 +0000
Subject: cdsetool is marked for autoremoval from testing
Message-ID: <E1wqkVV-00000003RNB-3T0x@respighi.debian.org>

cdsetool 0.3.1-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:42:46 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:42:46 +0000
Subject: doris is marked for autoremoval from testing
Message-ID: <E1wqkVi-00000003RSY-2zs3@respighi.debian.org>

doris 5.0.3~beta+dfsg-19 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:42:48 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:42:48 +0000
Subject: eodag is marked for autoremoval from testing
Message-ID: <E1wqkVk-00000003RTP-3J2K@respighi.debian.org>

eodag 4.5.0+ds-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:42:52 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:42:52 +0000
Subject: fiona is marked for autoremoval from testing
Message-ID: <E1wqkVo-00000003RUl-0dfs@respighi.debian.org>

fiona 1.10.1-7 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:43:01 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:43:01 +0000
Subject: glymur is marked for autoremoval from testing
Message-ID: <E1wqkVx-00000003RYP-0Wb3@respighi.debian.org>

glymur 0.14.8-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:43:26 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:43:26 +0000
Subject: morecantile is marked for autoremoval from testing
Message-ID: <E1wqkWM-00000003Rix-0p0D@respighi.debian.org>

morecantile 7.0.3-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:43:36 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:43:36 +0000
Subject: owslib is marked for autoremoval from testing
Message-ID: <E1wqkWW-00000003RnE-2Nm8@respighi.debian.org>

owslib 0.36.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:43:40 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:43:40 +0000
Subject: pims is marked for autoremoval from testing
Message-ID: <E1wqkWa-00000003Roj-16Ja@respighi.debian.org>

pims 0.7+ds-3 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:43:47 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:43:47 +0000
Subject: pycsw is marked for autoremoval from testing
Message-ID: <E1wqkWh-00000003RuL-2uRp@respighi.debian.org>

pycsw 2.6.2+dfsg-3 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:44:01 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:44:01 +0000
Subject: pyshp is marked for autoremoval from testing
Message-ID: <E1wqkWv-00000003S3U-1bRM@respighi.debian.org>

pyshp 3.1.6-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:44:02 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:44:02 +0000
Subject: pystac-client is marked for autoremoval from testing
Message-ID: <E1wqkWw-00000003S40-3qtj@respighi.debian.org>

pystac-client 0.9.0-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:44:02 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:44:02 +0000
Subject: pystac is marked for autoremoval from testing
Message-ID: <E1wqkWw-00000003S3w-35bv@respighi.debian.org>

pystac 1.14.3-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:44:05 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:44:05 +0000
Subject: pytest-recording is marked for autoremoval from testing
Message-ID: <E1wqkWz-00000003S4o-1k5q@respighi.debian.org>

pytest-recording 0.13.4-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Mon Aug  3 05:40:02 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Mon, 03 Aug 2026 04:40:02 +0000
Subject: python-cartopy is marked for autoremoval from testing
Message-ID: <E1wqkT4-00000003QLn-1AEx@respighi.debian.org>

python-cartopy 0.25.0+dfsg-2 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From mdione at grulic.org.ar  Mon Aug  3 08:00:43 2026
From: mdione at grulic.org.ar (Marcos Dione)
Date: Mon, 3 Aug 2026 09:00:43 +0200
Subject: Bug#1143505: python3-mapnik still depends on libmapnik4.1
Message-ID: <anA8m6e5DCE7_r1z@ioniq>

Package: python3-mapnik
Version: 1:0.0~20240222-5ab32f020-5
Severity: normal

Dear Maintainer,

I'm a daily user of python3-mapnik on Debian unstable. I see that the
latest version still depends on libmapnik4.1, but this is no longer
available on testing or sid (4.2 is), and thus this package has been
removed from those releases. Is there anything I can do to help this
move forward?

-- System Information:
Debian Release: forky/sid
  APT prefers unstable-debug
  APT policy: (500, 'unstable-debug'), (500, 'stable-security'), (500, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 7.0.13+deb14-amd64 (SMP w/8 CPU threads; PREEMPT)
Kernel taint flags: TAINT_CPU_OUT_OF_SPEC, TAINT_WARN, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to en_US.UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages python3-mapnik depends on:
hi  libboost-python1.83.0 [libboost-python1.83.0-py313]  1.83.0-5+b2
hi  libboost-thread1.83.0                                1.83.0-5+b2
ii  libc6                                                2.42-17
ii  libcairo2                                            1.18.4-3+b1
ii  libgcc-s1                                            16.1.0-3
ii  libicu76                                             76.1-4+b1
hi  libmapnik4.1                                         4.1.4+ds-1+b1
ii  libstdc++6                                           16.1.0-3
hi  python3                                              3.13.9-3+b1
ii  python3-cairo                                        1.27.0-3

python3-mapnik recommends no packages.

python3-mapnik suggests no packages.

-- no debconf information


From owner at bugs.debian.org  Mon Aug  3 11:19:02 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Mon, 03 Aug 2026 10:19:02 +0000
Subject: Bug#1143505: marked as done (python3-mapnik still depends on
 libmapnik4.1)
References: <becfd60b-c35d-45d7-a0cf-ba267c68ecdc@xs4all.nl>
 <anA8m6e5DCE7_r1z@ioniq>
Message-ID: <handler.1143505.D1143505.17857522612665332.ackdone@bugs.debian.org>

Your message dated Mon, 3 Aug 2026 12:17:33 +0200
with message-id <becfd60b-c35d-45d7-a0cf-ba267c68ecdc at xs4all.nl>
and subject line Re: Bug#1143505: python3-mapnik still depends on libmapnik4.1
has caused the Debian Bug report #1143505,
regarding python3-mapnik still depends on libmapnik4.1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner at bugs.debian.org
immediately.)


-- 
1143505: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1143505
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems
-------------- next part --------------
An embedded message was scrubbed...
From: Marcos Dione <mdione at grulic.org.ar>
Subject: python3-mapnik still depends on libmapnik4.1
Date: Mon, 3 Aug 2026 09:00:43 +0200
Size: 3361
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260803/75564a84/attachment.eml>
-------------- next part --------------
An embedded message was scrubbed...
From: Sebastiaan Couwenberg <sebastic at xs4all.nl>
Subject: Re: Bug#1143505: python3-mapnik still depends on libmapnik4.1
Date: Mon, 3 Aug 2026 12:17:33 +0200
Size: 6645
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260803/75564a84/attachment-0001.eml>

From hello at ajnajn.com  Mon Aug  3 17:51:27 2026
From: hello at ajnajn.com (Royal Mail)
Date: Mon, 3 Aug 2026 16:51:27 +0000
Subject: Update regarding your Royal Mail delivery
Message-ID: <0100019fc88995ca-1e9e60ea-fb6e-4b26-96e7-52cb6d247e11-000000@email.amazonses.com>

Royal Mail Templatebody {margin: 0;padding: 0;background-color: #f4f4f4;font-family: Arial, Helvetica, sans-serif;color: #333333;}table {border-spacing: 0;border-collapse: collapse;}td {padding: 0;}.email-wrapper {width: 100%;background-color: #f4f4f4;padding: 20px 0;}.email-content {width: 100%;max-width: 600px;margin: 0 auto;background-color: #ffffff;border-radius: 4px;overflow: hidden;box-shadow: 0 2px 5px rgba(0,0,0,0.05);}.header {background-color: #D50032;padding: 24px;text-align: center;}.header h1 {color: #ffffff;font-size: 24px;margin: 0;font-weight: bold;letter-spacing: 0.5px;}.body-section {padding: 32px 24px;}.body-section p {font-size: 15px;line-height: 1.6;margin: 0 0 16px 0;color: #555555;}.card-box {background-color: #f9f9f9;border-left: 4px solid #D50032;padding: 16px;margin: 24px 0;border-radius: 0 4px 4px 0;}.card-box p {margin: 0 0 8px 0;font-size: 14px;color: #333333;}.account-email {font-family: monospace;font-size: 15px;font-weight: bold;color: #D50032;}.btn-container {text-align: center;margin: 32px 0 16px 0;}.btn {background-color: #D50032;color: #ffffff;padding: 14px 28px;text-decoration: none;border-radius: 4px;font-weight: bold;font-size: 16px;display: inline-block;}.btn:hover {background-color: #b00028;}.footer {background-color: #f4f4f4;padding: 24px;text-align: center;font-size: 12px;color: #777777;border-top: 1px solid #eeeeee;}.footer p {margin: 0 0 8px 0;}.footer a {color: #D50032;text-decoration: none;}ROYAL MAILDear Customer,We are currently attempting to deliver your parcel, but unfortunately, we were unable to complete delivery because the shipping label on the package has been worn or damaged, resulting in an unclear delivery address.To ensure your item is successfully delivered without further delay, please verify and update your complete address information.Associated Email Account:pkg-grass-devel at alioth-lists.debian.netPlease Confirm Address Best regards,Royal Mail Team This is an automated message, please do not reply directly to this email.? 2026 Royal Mail Group Ltd. All rights reserved.Visit Royal Mail Website | Help & Support
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260803/1a89aa84/attachment.htm>

From noreply at release.debian.org  Tue Aug  4 05:39:07 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Tue, 04 Aug 2026 04:39:07 +0000
Subject: qgis is marked for autoremoval from testing
Message-ID: <E1wr6vj-00000004ma3-3XLH@respighi.debian.org>

qgis 3.44.12+dfsg-1 is marked for autoremoval from testing on 2026-09-02

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Tue Aug  4 05:39:27 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Tue, 04 Aug 2026 04:39:27 +0000
Subject: stac-validator 4.5.1-1 MIGRATED to testing
Message-ID: <E1wr6w3-00000004mts-13Zl@respighi.debian.org>

FYI: The status of the stac-validator source package
in Debian's testing distribution has changed.

  Previous version: 4.4.0-1
  Current version:  4.5.1-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From records at sabeng.it  Tue Aug  4 14:39:41 2026
From: records at sabeng.it (lists MAIL-DOMAIN-16206)
Date: Tue, 04 Aug 2026 13:39:41 +0000
Subject: Prove Ownership of This Email Address - 50677
Message-ID: <3ca6dbea-8925-21e5-b3a4-7ad5e8c3e3de@sabeng.it>

An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/840cc477/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lists.alioth.debian.org-logo.png
Type: image/png
Size: 5942 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/840cc477/attachment.png>

From sebastic at xs4all.nl  Tue Aug  4 14:37:25 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Tue, 4 Aug 2026 15:37:25 +0200
Subject: Bug#1143505: [SPAM] Re: Bug#1143505: python3-mapnik still depends on
 libmapnik4.1
In-Reply-To: <anCdQITtMBfgtmEU@ioniq>
References: <anCdQITtMBfgtmEU@ioniq> <anA8m6e5DCE7_r1z@ioniq>
Message-ID: <d1e7f193-4c7c-4b61-bb16-fd0f22710bd1@xs4all.nl>

On 8/3/26 3:53 PM, Marcos Dione wrote:
> On Mon, Aug 03, 2026 at 12:17:33PM +0200, Sebastiaan Couwenberg wrote:
>>> Is there anything I can do to help this move forward?
>>
>> Make the pybind11 build work, I managed to make it build successfully but it would segfault on use.
>>
>> python-mapnik would be served well by more active upstream developers, tagging releases, and getting the package on PyPI.
> 
> On Fri, 07 Nov 2025 17:24:23 +0100, Bas Couwenberg wrote[1]
>> it still doesn't have upstream releases
> 
>      There have been a couple of releases this year:
> 
> https://github.com/mapnik/python-mapnik/tags

Looks like the package on PyPI finally got updated too:

  https://pypi.org/project/mapnik/#history

Long after the package was removed from Debian, though.

>      I just cloned the salsa repo, I'll see what can be done.
> 
>      Cheers,
> 
> 	-- Marcos.
> 
> PS: I have never interactedas this level of involvement with Debian.
>      PLease let me know if I should use other methods.

For contribution to the Debian GIS team, you consult our team policy:

  https://debian-gis-team.pages.debian.net/policy/

But I think you're better off maintaining the python-mapnik package in the Python team.

Reintroducing the package should be easier when continuing from the last state of the git repo, you can push a new copy to the python-team namespace when you get added to the team.

Also read the relevant sections of the Developers Reference:

  https://www.debian.org/doc/manuals/developers-reference/pkgs.en.html#reintroducing-packages

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From eProposal at sorrentinolegal.com  Tue Aug  4 18:05:44 2026
From: eProposal at sorrentinolegal.com (eDocs_Adobe)
Date: Tue, 4 Aug 2026 10:05:44 -0700
Subject: A New Proposal Has Been Received
Message-ID: <202604081005446D40C6BEF0$5D4933B144@sorrentinolegal.com>


?

?

?

Please review and complete "AR 2026 Residential Roof Replacement - A-3638 Dylan Adam - PROPOSAL".

Your signature has been required on

AR 2026-A3638 -CONTRACT PROPOSAL https://t.co/0dGbrLZK69

Review and sign https://t.co/0dGbrLZK69

?

Please review and complete "AR 2026 - A3638 - CONTRACT PROPOSAL".

 ?

Prepared for the attention of:

pkg-grass-devel at lists.alioth.debian.org

?

?

After you sign AR 2026 - A3638 - CONTRACT PROPOSAL, all parties will receive a final PDF copy.

?

Don't forward this email: If you don't want to sign, you can
delegate https://supucansign.na2.echosign.com/public/resend?tsid=CBFCIBAACBSCTBABDUAAABACAABAANuor8vRHCD3fBtMWyt7Z8ANqrftbgeo0A4yBT3NFVewyHQkW8ITXBTIKazcf7xgDGmT01vHr419m-2nGDGL1V_KmgW3VjjswQnXl6nXxUbqA_8shhgqNf_pvErd99ofz to someone else.

?

By proceeding, you agree that this agreement may be signed using electronic or handwritten signatures.

To ensure that you continue receiving our emails, please add adobesign at adobesign.com to your address book or safe list.

Terms of Use https://www.adobe.com/go/terms |
Report Abuse https://na2.documents.adobe.com/public/reportAbuseForm?tsid=CBFCIBAACBSCTBABDUAAABACAABAAJQW4-_MQiCl2muHRxVajB0f9F1hK4ZpTjmq133A4Is9uXm0tWa5B7kp5EVgZZ5ApO1bcMUg1WsY-wH_3p_5ALnXYzwG_nk4ysguwXOJcidzXvl00PYci7_uYU6R0qTDb&&reportAbuse=true

? 2026 Adobe. All rights reserved.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/838e7c76/attachment-0001.htm>

From dfsg-team at debian.org  Tue Aug  4 18:31:45 2026
From: dfsg-team at debian.org (dfsg-team at debian.org)
Date: Tue, 04 Aug 2026 17:31:45 +0000
Subject: Debian NEW review note for mapnik 4.3.0+ds-1~exp2
Message-ID: <mailman.77.1785864714.664.pkg-grass-devel@alioth-lists.debian.net>

A reviewer has shared a note regarding mapnik 4.3.0+ds-1~exp2:

Hi,

the license text is not included correctly in debian/copyright (or elsewhere).

Plese note the licenses changes as documented.

The original license text should be under http://geogratis.cgdi.gc.ca/geogratis/en/licence.jsp but it isn't anyore
so I write to the maintainer to ask upstream for the recent license. The COPYING file under
demo/data is 19 years old.

A wayback link to a license which isn't valid any more cant be accepted

-- Mechtilde Stehmann

Full review details: https://dfsg-new-queue.debian.org/reviews/mapnik


From dfsg-team at debian.org  Tue Aug  4 18:57:45 2026
From: dfsg-team at debian.org (dfsg-team at debian.org)
Date: Tue, 04 Aug 2026 17:57:45 +0000
Subject: Debian NEW review of mapnik 4.3.0+ds-1~exp2: REJECTED
Message-ID: <mailman.78.1785866267.664.pkg-grass-devel@alioth-lists.debian.net>

The Debian NEW review of mapnik 4.3.0+ds-1~exp2 has been completed.

Decision: REJECTED
Reviewer: Mechtilde Stehmann

Review comment:

Hi,

the license text is not included correctly in debian/copyright (or elsewhere).

Plese note the licenses changes as documented.

The original license text should be under http://geogratis.cgdi.gc.ca/geogratis/en/licence.jsp but it isn't anyore
so I write to the maintainer to ask upstream for the recent license. The COPYING file under
demo/data is 19 years old.

A wayback link to a license which isn't valid any more cant be accepted

Full review details: https://dfsg-new-queue.debian.org/reviews/mapnik


From mechtilde at debian.org  Tue Aug  4 19:00:34 2026
From: mechtilde at debian.org (Mechtilde Stehmann)
Date: Tue, 04 Aug 2026 18:00:34 +0000
Subject: mapnik_4.3.0+ds-1~exp2_amd64.changes REJECTED
Message-ID: <E1wrJRK-0000000BfIX-1BLp@fasolo.debian.org>


Hi,

the license text is not included correctly in debian/copyright (or elsewhere).

Plese note the licenses changes as documented.

The original license text should be under http://geogratis.cgdi.gc.ca/geogratis/en/licence.jsp but it isn't anyore
so I write to the maintainer to ask upstream for the recent license. The COPYING file under
demo/data is 19 years old.

A wayback link to a license which isn't valid any more cant be accepted

Further information may be found at:
   https://dfsg-new-queue.debian.org/reviews/mapnik

Regards, Mechtilde Stehmann
Member of the DFSG, Licensing & New Packages Team



===

Please feel free to respond to this email if you don't understand why
your files were rejected, or if you upload new files which address our
concerns.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/bcf0159e/attachment.sig>

From sebastic at debian.org  Tue Aug  4 19:04:01 2026
From: sebastic at debian.org (Sebastiaan Couwenberg)
Date: Tue, 4 Aug 2026 20:04:01 +0200
Subject: Debian NEW review note for mapnik 4.3.0+ds-1~exp2
Message-ID: <c5c75416-4e16-40a3-98bb-76567173d30b@debian.org>

On 8/4/26 7:31 PM, dfsg-team at debian.org wrote:
> the license text is not included correctly in debian/copyright (or elsewhere).
> 
> Plese note the licenses changes as documented.

What changes are you talking about?

> The original license text should be under http://geogratis.cgdi.gc.ca/geogratis/en/licence.jsp but it isn't anyore
> so I write to the maintainer to ask upstream for the recent license. The COPYING file under
> demo/data is 19 years old.
> 
> A wayback link to a license which isn't valid any more cant be accepted

Why? The license terms as applicable when the files where included are documented in d/copyright, do you deem those DFSG incompatible?

> Full review details: https://dfsg-new-queue.debian.org/reviews/mapnik

That doesn't provide any more information than this email.

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From gitlab at salsa.debian.org  Tue Aug  4 19:33:27 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Tue, 04 Aug 2026 18:33:27 +0000
Subject: [Git][debian-gis-team/mapnik][experimental] 6 commits: Exclude demo
 files from repacked upstream tarball.
Message-ID: <6a7230774831c_551fb48c13347e4@godard.mail>



Bas Couwenberg pushed to branch experimental at Debian GIS Project / mapnik


Commits:
553ddf18 by Bas Couwenberg at 2026-08-04T20:00:51+02:00
Exclude demo files from repacked upstream tarball.

- - - - -
23688f61 by Bas Couwenberg at 2026-08-04T20:00:59+02:00
New upstream version 4.3.0+ds2
- - - - -
2d90cfed by Bas Couwenberg at 2026-08-04T20:01:03+02:00
Update upstream source from tag 'upstream/4.3.0+ds2'

Update to upstream version '4.3.0+ds2'
with Debian dir d4b75c6f54f9d8ee6b3b91d747a00ebcd96f633c
- - - - -
3f1fb93e by Bas Couwenberg at 2026-08-04T20:04:31+02:00
New repacked upstream release.

- - - - -
8c517423 by Bas Couwenberg at 2026-08-04T20:23:06+02:00
Drop mapnik-doc package, demo examples are gone now.

- - - - -
86670d58 by Bas Couwenberg at 2026-08-04T20:23:06+02:00
Set distribution to experimental.

- - - - -


80 changed files:

- debian/changelog
- debian/control
- debian/copyright
- ? debian/mapnik-doc.examples
- + debian/patches/repack.patch
- debian/patches/series
- ? demo/CMakeLists.txt
- ? demo/c++/CMakeLists.txt
- ? demo/c++/Makefile
- ? demo/c++/README.md
- ? demo/c++/build.py
- ? demo/c++/common.gypi
- ? demo/c++/rundemo.cpp
- ? demo/c++/rundemo.gyp
- ? demo/data/COPYRIGHT.txt
- ? demo/data/boundaries.dbf
- ? demo/data/boundaries.shp
- ? demo/data/boundaries.shx
- ? demo/data/boundaries_l.dbf
- ? demo/data/boundaries_l.shp
- ? demo/data/boundaries_l.shx
- ? demo/data/ontdrainage.dbf
- ? demo/data/ontdrainage.shp
- ? demo/data/ontdrainage.shx
- ? demo/data/popplaces.dbf
- ? demo/data/popplaces.shp
- ? demo/data/popplaces.shx
- ? demo/data/qcdrainage.dbf
- ? demo/data/qcdrainage.shp
- ? demo/data/qcdrainage.shx
- ? demo/data/roads.dbf
- ? demo/data/roads.shp
- ? demo/data/roads.shx
- ? demo/simple-renderer/render.py
- ? demo/viewer/CMakeLists.txt
- ? demo/viewer/about_dialog.cpp
- ? demo/viewer/about_dialog.hpp
- ? demo/viewer/build.py
- ? demo/viewer/forms/about.ui
- ? demo/viewer/forms/info.ui
- ? demo/viewer/forms/layer_info.ui
- ? demo/viewer/images/about.png
- ? demo/viewer/images/canada_map.png
- ? demo/viewer/images/down.png
- ? demo/viewer/images/export.png
- ? demo/viewer/images/filter.png
- ? demo/viewer/images/globe.png
- ? demo/viewer/images/globe_bw.png
- ? demo/viewer/images/help.png
- ? demo/viewer/images/home.png
- ? demo/viewer/images/info.png
- ? demo/viewer/images/left.png
- ? demo/viewer/images/mapnik.png
- ? demo/viewer/images/pan.png
- ? demo/viewer/images/print.png
- ? demo/viewer/images/reload.png
- ? demo/viewer/images/right.png
- ? demo/viewer/images/style.png
- ? demo/viewer/images/up.png
- ? demo/viewer/images/zoombox.png
- ? demo/viewer/images/zoomin.png
- ? demo/viewer/info_dialog.cpp
- ? demo/viewer/info_dialog.hpp
- ? demo/viewer/layer_info_dialog.cpp
- ? demo/viewer/layer_info_dialog.hpp
- ? demo/viewer/layerdelegate.cpp
- ? demo/viewer/layerdelegate.hpp
- ? demo/viewer/layerlistmodel.cpp
- ? demo/viewer/layerlistmodel.hpp
- ? demo/viewer/layerwidget.cpp
- ? demo/viewer/layerwidget.hpp
- ? demo/viewer/main.cpp
- ? demo/viewer/mainwindow.cpp
- ? demo/viewer/mainwindow.hpp
- ? demo/viewer/mapnik_viewer.qrc
- ? demo/viewer/mapwidget.cpp
- ? demo/viewer/mapwidget.hpp
- ? demo/viewer/styles_model.cpp
- ? demo/viewer/styles_model.hpp
- ? demo/viewer/viewer.pro


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/compare/da38200e638756d41aafb927eff4c20924fd52ec...86670d581afd114269c8a102ac14b2d82a31a75d

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/compare/da38200e638756d41aafb927eff4c20924fd52ec...86670d581afd114269c8a102ac14b2d82a31a75d
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/7a952834/attachment-0001.htm>

From gitlab at salsa.debian.org  Tue Aug  4 19:33:28 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Tue, 04 Aug 2026 18:33:28 +0000
Subject: [Git][debian-gis-team/mapnik][pristine-tar] pristine-tar data for
 mapnik_4.3.0+ds2.orig.tar.xz
Message-ID: <6a723078ded4a_551fb0a413349e8@godard.mail>



Bas Couwenberg pushed to branch pristine-tar at Debian GIS Project / mapnik


Commits:
3e9a54dc by Bas Couwenberg at 2026-08-04T20:01:03+02:00
pristine-tar data for mapnik_4.3.0+ds2.orig.tar.xz

- - - - -


2 changed files:

- + mapnik_4.3.0+ds2.orig.tar.xz.delta
- + mapnik_4.3.0+ds2.orig.tar.xz.id


Changes:

=====================================
mapnik_4.3.0+ds2.orig.tar.xz.delta
=====================================
Binary files /dev/null and b/mapnik_4.3.0+ds2.orig.tar.xz.delta differ


=====================================
mapnik_4.3.0+ds2.orig.tar.xz.id
=====================================
@@ -0,0 +1 @@
+7fe6a94c31c20c9a9f29b4d10f2d1e301e643317



View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/commit/3e9a54dcf705f956a62215d25583fc370d182922

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/commit/3e9a54dcf705f956a62215d25583fc370d182922
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/1a924039/attachment-0001.htm>

From gitlab at salsa.debian.org  Tue Aug  4 19:33:30 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Tue, 04 Aug 2026 18:33:30 +0000
Subject: [Git][debian-gis-team/mapnik][upstream] New upstream version 4.3.0+ds2
Message-ID: <6a72307a1af09_551668228813351ed@godard.mail>



Bas Couwenberg pushed to branch upstream at Debian GIS Project / mapnik


Commits:
23688f61 by Bas Couwenberg at 2026-08-04T20:00:59+02:00
New upstream version 4.3.0+ds2
- - - - -


74 changed files:

- ? demo/CMakeLists.txt
- ? demo/c++/CMakeLists.txt
- ? demo/c++/Makefile
- ? demo/c++/README.md
- ? demo/c++/build.py
- ? demo/c++/common.gypi
- ? demo/c++/rundemo.cpp
- ? demo/c++/rundemo.gyp
- ? demo/data/COPYRIGHT.txt
- ? demo/data/boundaries.dbf
- ? demo/data/boundaries.shp
- ? demo/data/boundaries.shx
- ? demo/data/boundaries_l.dbf
- ? demo/data/boundaries_l.shp
- ? demo/data/boundaries_l.shx
- ? demo/data/ontdrainage.dbf
- ? demo/data/ontdrainage.shp
- ? demo/data/ontdrainage.shx
- ? demo/data/popplaces.dbf
- ? demo/data/popplaces.shp
- ? demo/data/popplaces.shx
- ? demo/data/qcdrainage.dbf
- ? demo/data/qcdrainage.shp
- ? demo/data/qcdrainage.shx
- ? demo/data/roads.dbf
- ? demo/data/roads.shp
- ? demo/data/roads.shx
- ? demo/simple-renderer/render.py
- ? demo/viewer/CMakeLists.txt
- ? demo/viewer/about_dialog.cpp
- ? demo/viewer/about_dialog.hpp
- ? demo/viewer/build.py
- ? demo/viewer/forms/about.ui
- ? demo/viewer/forms/info.ui
- ? demo/viewer/forms/layer_info.ui
- ? demo/viewer/images/about.png
- ? demo/viewer/images/canada_map.png
- ? demo/viewer/images/down.png
- ? demo/viewer/images/export.png
- ? demo/viewer/images/filter.png
- ? demo/viewer/images/globe.png
- ? demo/viewer/images/globe_bw.png
- ? demo/viewer/images/help.png
- ? demo/viewer/images/home.png
- ? demo/viewer/images/info.png
- ? demo/viewer/images/left.png
- ? demo/viewer/images/mapnik.png
- ? demo/viewer/images/pan.png
- ? demo/viewer/images/print.png
- ? demo/viewer/images/reload.png
- ? demo/viewer/images/right.png
- ? demo/viewer/images/style.png
- ? demo/viewer/images/up.png
- ? demo/viewer/images/zoombox.png
- ? demo/viewer/images/zoomin.png
- ? demo/viewer/info_dialog.cpp
- ? demo/viewer/info_dialog.hpp
- ? demo/viewer/layer_info_dialog.cpp
- ? demo/viewer/layer_info_dialog.hpp
- ? demo/viewer/layerdelegate.cpp
- ? demo/viewer/layerdelegate.hpp
- ? demo/viewer/layerlistmodel.cpp
- ? demo/viewer/layerlistmodel.hpp
- ? demo/viewer/layerwidget.cpp
- ? demo/viewer/layerwidget.hpp
- ? demo/viewer/main.cpp
- ? demo/viewer/mainwindow.cpp
- ? demo/viewer/mainwindow.hpp
- ? demo/viewer/mapnik_viewer.qrc
- ? demo/viewer/mapwidget.cpp
- ? demo/viewer/mapwidget.hpp
- ? demo/viewer/styles_model.cpp
- ? demo/viewer/styles_model.hpp
- ? demo/viewer/viewer.pro


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/commit/23688f61eff4e47537e04cb7c90acf1da1f6dbf6

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/commit/23688f61eff4e47537e04cb7c90acf1da1f6dbf6
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/dc42c774/attachment-0001.htm>

From gitlab at salsa.debian.org  Tue Aug  4 19:33:31 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Tue, 04 Aug 2026 18:33:31 +0000
Subject: [Git][debian-gis-team/mapnik] Pushed new tag debian/4.3.0+ds2-1_exp1
Message-ID: <6a72307bb1e58_551fb0a41335342@godard.mail>



Bas Couwenberg pushed new tag debian/4.3.0+ds2-1_exp1 at Debian GIS Project / mapnik

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/tree/debian/4.3.0+ds2-1_exp1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/4d821ffa/attachment.htm>

From gitlab at salsa.debian.org  Tue Aug  4 19:33:33 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Tue, 04 Aug 2026 18:33:33 +0000
Subject: [Git][debian-gis-team/mapnik] Pushed new tag upstream/4.3.0+ds2
Message-ID: <6a72307d2f865_551854202413355d5@godard.mail>



Bas Couwenberg pushed new tag upstream/4.3.0+ds2 at Debian GIS Project / mapnik

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/tree/upstream/4.3.0+ds2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/f0226b81/attachment.htm>

From ftpmaster at ftp-master.debian.org  Tue Aug  4 19:41:52 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Tue, 04 Aug 2026 18:41:52 +0000
Subject: Processing of mapnik_4.3.0+ds2-1~exp1_amd64.changes
Message-ID: <E1wrK5I-00HHot-25@usper.debian.org>

mapnik_4.3.0+ds2-1~exp1_amd64.changes uploaded successfully to localhost
along with the files:
  mapnik_4.3.0+ds2-1~exp1.dsc
  mapnik_4.3.0+ds2.orig.tar.xz
  mapnik_4.3.0+ds2-1~exp1.debian.tar.xz
  libmapnik-dev_4.3.0+ds2-1~exp1_amd64.deb
  libmapnik4.3-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
  libmapnik4.3_4.3.0+ds2-1~exp1_amd64.deb
  mapnik-utils-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
  mapnik-utils_4.3.0+ds2-1~exp1_amd64.deb
  mapnik_4.3.0+ds2-1~exp1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Tue Aug  4 19:49:10 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Tue, 04 Aug 2026 18:49:10 +0000
Subject: mapnik_4.3.0+ds2-1~exp1_amd64.changes is NEW
Message-ID: <E1wrKCM-0000000BmvY-0VC6@fasolo.debian.org>

binary:libmapnik4.3 is NEW.
binary:libmapnik4.3 is NEW.

Your package has been put into the NEW queue, which requires manual action
from the ftpteam to process. The upload was otherwise valid (it had a good
OpenPGP signature and file hashes are valid), so please be patient.

Packages are routinely processed through to the archive, and do feel
free to browse the NEW queue[1].

If there is an issue with the upload, you will receive an email from a
member of the ftpteam.

If you have any questions, you may reply to this email.

[1]: https://ftp-master.debian.org/new.html
     or https://ftp-master.debian.org/backports-new.html for *-backports
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/fbf55845/attachment.sig>

From ops at sabeng.it  Tue Aug  4 20:03:06 2026
From: ops at sabeng.it (lists MAIL-SERVER-02408)
Date: Tue, 04 Aug 2026 19:03:06 +0000
Subject: Action Required: Confirm Your Email - 92911
Message-ID: <3342f6de-dadb-0f36-a5db-4b2d7587b243@sabeng.it>

An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/65341916/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lists.alioth.debian.org-logo.png
Type: image/png
Size: 5942 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260804/65341916/attachment-0001.png>

From noreply at release.debian.org  Wed Aug  5 05:39:14 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Wed, 05 Aug 2026 04:39:14 +0000
Subject: gmt 6.7.0+dfsg-3 MIGRATED to testing
Message-ID: <E1wrTPO-000000068Gw-0JDR@respighi.debian.org>

FYI: The status of the gmt source package
in Debian's testing distribution has changed.

  Previous version: 6.6.0+dfsg-1
  Current version:  6.7.0+dfsg-3

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Wed Aug  5 05:39:16 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Wed, 05 Aug 2026 04:39:16 +0000
Subject: pytest-recording 0.13.4-2 MIGRATED to testing
Message-ID: <E1wrTPQ-000000068KZ-2SzC@respighi.debian.org>

FYI: The status of the pytest-recording source package
in Debian's testing distribution has changed.

  Previous version: 0.13.4-1
  Current version:  0.13.4-2

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Wed Aug  5 05:39:39 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Wed, 05 Aug 2026 04:39:39 +0000
Subject: stac-validator is marked for autoremoval from testing
Message-ID: <E1wrTPn-000000068R3-2eao@respighi.debian.org>

stac-validator 4.5.1-1 is marked for autoremoval from testing on 2026-09-01

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1138816: nbclient: fails to build from source: testsuite failure
 https://bugs.debian.org/1138816
1140984: node-license-webpack-plugin: cannot parse ProvideSharedModule identifiers from webpack >= 5.107; breaks all jupyter labextension builds
 https://bugs.debian.org/1140984
1141549: node-tempy: node-tempy has an undeclared file conflict with node-unique-string
 https://bugs.debian.org/1141549
1142899: node-license-webpack-plugin: cannot parse ProvideSharedModule identifiers from webpack >= 5.107; breaks all jupyter labextension builds
 https://bugs.debian.org/1142899
1142900: node-license-webpack-plugin: cannot parse ProvideSharedModule identifiers from webpack >= 5.107; breaks all jupyter labextension builds
 https://bugs.debian.org/1142900



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From gitlab at salsa.debian.org  Wed Aug  5 18:52:51 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Wed, 05 Aug 2026 17:52:51 +0000
Subject: [Git][debian-gis-team/universal-pathlib] Pushed new tag
 debian/0.3.10-3
Message-ID: <6a73787344823_551fb6d01646078@godard.mail>



Antonio Valentino pushed new tag debian/0.3.10-3 at Debian GIS Project / universal-pathlib

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/universal-pathlib/-/tree/debian/0.3.10-3
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/664a41ea/attachment.htm>

From gitlab at salsa.debian.org  Wed Aug  5 18:53:02 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Wed, 05 Aug 2026 17:53:02 +0000
Subject: [Git][debian-gis-team/universal-pathlib][master] 5 commits: Copy the
 test folder to the build directory
Message-ID: <6a73787eac4cf_551aba1ae4164621@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / universal-pathlib


Commits:
2eecc01f by Antonio Valentino at 2026-08-05T16:28:39+00:00
Copy the test folder to the build directory

- - - - -
de61b9b2 by Antonio Valentino at 2026-08-05T16:36:37+00:00
Update dependencies

- - - - -
ef3addd7 by Antonio Valentino at 2026-08-05T17:43:20+00:00
New 0004-xfail.patch

- - - - -
74093ad0 by Antonio Valentino at 2026-08-05T17:49:55+00:00
New python3-universal-pathlib.lintian-overrides

- - - - -
c4969f99 by Antonio Valentino at 2026-08-05T17:49:55+00:00
Set distribution to unstable

- - - - -


7 changed files:

- debian/changelog
- debian/control
- debian/patches/0003-Mark-network-tests.patch
- + debian/patches/0004-xfail.patch
- debian/patches/series
- + debian/python3-universal-pathlib.lintian-overrides
- debian/rules


Changes:

=====================================
debian/changelog
=====================================
@@ -1,3 +1,17 @@
+universal-pathlib (0.3.10-3) unstable; urgency=medium
+
+  * debian/rules:
+    - Copy the test folder to the build directory.
+  * debian/control:
+    - Add dependencies on python3-packaging and
+      python3-pydantic-settings.
+  * debian/patches:
+    - Update 0003-Mark-network-tests.patch.
+    - New 0004-xfail.patch (Closes: #1143435).
+  * New python3-universal-pathlib.lintian-overrides.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Wed, 05 Aug 2026 17:43:24 +0000
+
 universal-pathlib (0.3.10-2) unstable; urgency=medium
 
   [ Bas Couwenberg ]


=====================================
debian/control
=====================================
@@ -12,8 +12,10 @@ Build-Depends: debhelper-compat (= 13),
                python3-fsspec,
                python3-huggingface-hub <!nocheck>,
                python3-moto <!nocheck>,
+               python3-packaging <!nocheck>,
                python3-pathlib-abc,
                python3-pydantic <!nocheck>,
+               python3-pydantic-settings <!nocheck>,
                python3-pyftpdlib <!nocheck>,
                python3-pytest <!nocheck>,
                python3-pytest-mock <!nocheck>,


=====================================
debian/patches/0003-Mark-network-tests.patch
=====================================
@@ -6,8 +6,9 @@ Forwarded: https://github.com/fsspec/universal_pathlib/pull/549
 ---
  pyproject.toml                             |  1 +
  upath/tests/implementations/test_github.py | 15 +++++++++------
+ upath/tests/implementations/test_hf.py     |  1 +
  upath/tests/implementations/test_http.py   |  1 +
- 3 files changed, 11 insertions(+), 6 deletions(-)
+ 4 files changed, 12 insertions(+), 6 deletions(-)
 
 diff --git a/pyproject.toml b/pyproject.toml
 index 3e1f650..e2b4d58 100644
@@ -48,6 +49,18 @@ index 5fda42f..4d35d0c 100644
  
  
  def xfail_on_github_connection_error(func):
+diff --git a/upath/tests/implementations/test_hf.py b/upath/tests/implementations/test_hf.py
+index 4b30dbf..6935212 100644
+--- a/upath/tests/implementations/test_hf.py
++++ b/upath/tests/implementations/test_hf.py
+@@ -17,6 +17,7 @@ except ImportError:
+     pytestmark = pytest.mark.skip
+ 
+ 
++ at pytest.mark.network
+ def test_hfpath():
+     path = UPath("hf://HuggingFaceTB/SmolLM2-135M")
+     assert isinstance(path, HfPath)
 diff --git a/upath/tests/implementations/test_http.py b/upath/tests/implementations/test_http.py
 index 66d76e6..aa4957e 100644
 --- a/upath/tests/implementations/test_http.py


=====================================
debian/patches/0004-xfail.patch
=====================================
@@ -0,0 +1,24 @@
+From: Antonio Valentino <antonio.valentino at tiscali.it>
+Date: Wed, 5 Aug 2026 17:31:25 +0000
+Subject: xfail
+
+* test_hf.py::TestUPathHf::test_iterdir_parent_iteration:
+  incompatibility of teh test with recent versions of huggingface-hub
+
+Forwarded: https://github.com/fsspec/universal_pathlib/issues/562
+---
+ upath/tests/implementations/test_hf.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/upath/tests/implementations/test_hf.py b/upath/tests/implementations/test_hf.py
+index 6935212..ec3d8ee 100644
+--- a/upath/tests/implementations/test_hf.py
++++ b/upath/tests/implementations/test_hf.py
+@@ -51,6 +51,7 @@ class TestUPathHf(
+     def test_is_correct_class(self):
+         assert isinstance(self.path, HfPath)
+ 
++    @pytest.mark.xfail(strict=False, reason="incompatibility with recent versions of huggingface_hub")
+     @overrides_base
+     def test_iterdir_parent_iteration(self):
+         # HfPath does not support listing all available Repositories


=====================================
debian/patches/series
=====================================
@@ -1,3 +1,4 @@
 0001-No-smbclient.patch
 0002-Better-detection-of-tests-requiring-s3fs.patch
 0003-Mark-network-tests.patch
+0004-xfail.patch


=====================================
debian/python3-universal-pathlib.lintian-overrides
=====================================
@@ -0,0 +1,2 @@
+# False positive
+package-contains-documentation-outside-usr-share-doc [usr/lib/python3/*-packages/universal_pathlib-*.*-info/*.txt]


=====================================
debian/rules
=====================================
@@ -3,7 +3,9 @@
 export CI=TRUE
 
 export PYBUILD_NAME=upath
-export PYBUILD_TEST_ARGS=-m "not network" $(CURDIR)/${PYBUILD_NAME}/tests
+export PYBUILD_BEFORE_TEST=cp -r {dir}/upath/tests {build_dir}/$(PYBUILD_NAME)
+export PYBUILD_TEST_ARGS=-m "not network" $(PYBUILD_NAME)/tests
+export PYBUILD_AFTER_TEST=$(RM) -r {build_dir}/$(PYBUILD_NAME)/tests
 
 %:
 	dh $@ --buildsystem=pybuild



View it on GitLab: https://salsa.debian.org/debian-gis-team/universal-pathlib/-/compare/be56dab598771ff5048ad165c032c349372104c9...c4969f99055244144597992245e3c14555e0ecd6

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/universal-pathlib/-/compare/be56dab598771ff5048ad165c032c349372104c9...c4969f99055244144597992245e3c14555e0ecd6
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/3ec08f7e/attachment-0001.htm>

From gitlab at salsa.debian.org  Wed Aug  5 19:05:46 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Wed, 05 Aug 2026 18:05:46 +0000
Subject: [Git][debian-gis-team/universal-pathlib] Deleted tag debian/0.3.10-3
Message-ID: <6a737b7a4f84d_55192c49cc1652049@godard.mail>



Antonio Valentino deleted tag debian/0.3.10-3 at Debian GIS Project / universal-pathlib

-- 

You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/e44a5bd4/attachment.htm>

From gitlab at salsa.debian.org  Wed Aug  5 19:52:25 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 05 Aug 2026 18:52:25 +0000
Subject: [Git][debian-gis-team/gdal][master] 2 commits: Drop KML support,
 libkml is dead upstream.
Message-ID: <6a73866935cee_551449434c16681a0@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / gdal


Commits:
8c14404f by Bas Couwenberg at 2026-08-05T20:51:31+02:00
Drop KML support, libkml is dead upstream.

- - - - -
b818f01b by Bas Couwenberg at 2026-08-05T20:52:18+02:00
Update lintian overrides.

- - - - -


5 changed files:

- debian/changelog
- debian/control
- debian/libgdal39.lintian-overrides
- debian/libgdal39.symbols
- debian/rules


Changes:

=====================================
debian/changelog
=====================================
@@ -1,3 +1,10 @@
+gdal (3.13.2+dfsg-2) UNRELEASED; urgency=medium
+
+  * Drop KML support, libkml is dead upstream.
+  * Update lintian overrides.
+
+ -- Bas Couwenberg <sebastic at debian.org>  Wed, 05 Aug 2026 20:27:29 +0200
+
 gdal (3.13.2+dfsg-1) unstable; urgency=medium
 
   * New upstream release.


=====================================
debian/control
=====================================
@@ -33,7 +33,6 @@ Build-Depends: cmake,
                libjpeg-dev,
                libjson-c-dev,
                libjxl-dev,
-               libkml-dev (>= 1.3.0~rc0-3),
                liblz4-dev,
                liblzma-dev,
                libmariadb-dev-compat,
@@ -123,7 +122,6 @@ Depends: libgdal39 (= ${binary:Version}),
          libjpeg-dev,
          libjson-c-dev,
          libjxl-dev,
-         libkml-dev,
          libltdl-dev,
          liblz4-dev,
          liblzma-dev,


=====================================
debian/libgdal39.lintian-overrides
=====================================
@@ -1,7 +1,6 @@
 # False positive, string not included in source
 spelling-error-in-binary Accesss Access *
 spelling-error-in-binary algoorithm algorithm *
-spelling-error-in-binary containe contained *
 spelling-error-in-binary lengH length *
 
 # False positive, Lat/Lon


=====================================
debian/libgdal39.symbols
=====================================
@@ -2243,7 +2243,6 @@ libgdal.so.39 #PACKAGE# #MINVER#
  RegisterOGRJML at Base 2.0.1
  RegisterOGRJSONFG at Base 3.8.0
  RegisterOGRKML at Base 1.8.0
- RegisterOGRLIBKML at Base 1.9.0
  RegisterOGRLVBAG at Base 3.2.0
  RegisterOGRMSSQLSpatial at Base 1.8.0
  RegisterOGRMVT at Base 2.3.0


=====================================
debian/rules
=====================================
@@ -77,7 +77,6 @@ override_dh_auto_configure:
 			-DGDAL_USE_JSONC=ON \
 			-DGDAL_USE_JXL=ON \
 			-DGDAL_USE_LERC_INTERNAL=ON \
-			-DGDAL_USE_LIBKML=ON \
 			-DGDAL_USE_LIBLZMA=ON \
 			-DGDAL_USE_LZ4=ON \
 			-DGDAL_USE_MRSID=OFF \



View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/compare/74ed257174abefb100eca5223f8f32d1cf63d65c...b818f01bed6db80a1c34c987c1508ad506e4a8f9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/compare/74ed257174abefb100eca5223f8f32d1cf63d65c...b818f01bed6db80a1c34c987c1508ad506e4a8f9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/291a81be/attachment-0001.htm>

From gitlab at salsa.debian.org  Wed Aug  5 20:53:03 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Wed, 05 Aug 2026 19:53:03 +0000
Subject: [Git][debian-gis-team/universal-pathlib][master] 2 commits: New
 0005-relative-imports.patch
Message-ID: <6a73949f6df1_551fb6d016781c0@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / universal-pathlib


Commits:
996b5113 by Antonio Valentino at 2026-08-05T18:15:26+00:00
New 0005-relative-imports.patch

- - - - -
e3348ca2 by Antonio Valentino at 2026-08-05T19:52:47+00:00
Fix test setup

- - - - -


4 changed files:

- debian/changelog
- + debian/patches/0005-relative-imports.patch
- debian/patches/series
- debian/rules


Changes:

=====================================
debian/changelog
=====================================
@@ -8,6 +8,7 @@ universal-pathlib (0.3.10-3) unstable; urgency=medium
   * debian/patches:
     - Update 0003-Mark-network-tests.patch.
     - New 0004-xfail.patch (Closes: #1143435).
+    - New 0005-relative-imports.patch.
   * New python3-universal-pathlib.lintian-overrides.
 
  -- Antonio Valentino <antonio.valentino at tiscali.it>  Wed, 05 Aug 2026 17:43:24 +0000


=====================================
debian/patches/0005-relative-imports.patch
=====================================
@@ -0,0 +1,44 @@
+From: Antonio Valentino <antonio.valentino at tiscali.it>
+Date: Wed, 5 Aug 2026 18:12:58 +0000
+Subject: relative-imports
+
+User relative imports in the tests sub-package
+
+Forwarded: not-needed
+---
+ upath/tests/cases.py                    | 3 ++-
+ upath/tests/implementations/test_ftp.py | 4 ++--
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/upath/tests/cases.py b/upath/tests/cases.py
+index 22587fa..366c27e 100644
+--- a/upath/tests/cases.py
++++ b/upath/tests/cases.py
+@@ -17,9 +17,10 @@ from upath import UnsupportedOperation
+ from upath import UPath
+ from upath._protocol import get_upath_protocol
+ from upath._stat import UPathStatResult
+-from upath.tests.utils import posixify
+ from upath.types import StatResultType
+ 
++from .utils import posixify
++
+ 
+ class JoinablePathTests:
+     """Tests for JoinablePath interface.
+diff --git a/upath/tests/implementations/test_ftp.py b/upath/tests/implementations/test_ftp.py
+index b7edc7c..c896d62 100644
+--- a/upath/tests/implementations/test_ftp.py
++++ b/upath/tests/implementations/test_ftp.py
+@@ -2,9 +2,9 @@ import pytest
+ 
+ from upath import UPath
+ from upath.implementations.ftp import FTPPath
+-from upath.tests.cases import BaseTests
+-from upath.tests.utils import skip_on_windows
+ 
++from ..cases import BaseTests
++from ..utils import skip_on_windows
+ from ..utils import OverrideMeta
+ from ..utils import extends_base
+ from ..utils import overrides_base


=====================================
debian/patches/series
=====================================
@@ -2,3 +2,4 @@
 0002-Better-detection-of-tests-requiring-s3fs.patch
 0003-Mark-network-tests.patch
 0004-xfail.patch
+0005-relative-imports.patch


=====================================
debian/rules
=====================================
@@ -3,9 +3,9 @@
 export CI=TRUE
 
 export PYBUILD_NAME=upath
-export PYBUILD_BEFORE_TEST=cp -r {dir}/upath/tests {build_dir}/$(PYBUILD_NAME)
-export PYBUILD_TEST_ARGS=-m "not network" $(PYBUILD_NAME)/tests
-export PYBUILD_AFTER_TEST=$(RM) -r {build_dir}/$(PYBUILD_NAME)/tests
+export PYBUILD_BEFORE_TEST=cp -r {dir}/upath/tests {build_dir}
+export PYBUILD_TEST_ARGS=-m "not network" tests
+export PYBUILD_AFTER_TEST=$(RM) -r {build_dir}/tests
 
 %:
 	dh $@ --buildsystem=pybuild



View it on GitLab: https://salsa.debian.org/debian-gis-team/universal-pathlib/-/compare/c4969f99055244144597992245e3c14555e0ecd6...e3348ca220bf4edce276e8d9abbe03b46d6c5f54

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/universal-pathlib/-/compare/c4969f99055244144597992245e3c14555e0ecd6...e3348ca220bf4edce276e8d9abbe03b46d6c5f54
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/a307a46f/attachment-0001.htm>

From gitlab at salsa.debian.org  Wed Aug  5 21:05:38 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Wed, 05 Aug 2026 20:05:38 +0000
Subject: [Git][debian-gis-team/universal-pathlib] Pushed new tag
 debian/0.3.10-3
Message-ID: <6a7397924356f_551fb61c16801ac@godard.mail>



Antonio Valentino pushed new tag debian/0.3.10-3 at Debian GIS Project / universal-pathlib

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/universal-pathlib/-/tree/debian/0.3.10-3
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/bc07abc6/attachment.htm>

From ftpmaster at ftp-master.debian.org  Wed Aug  5 21:18:33 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Wed, 05 Aug 2026 20:18:33 +0000
Subject: Processing of universal-pathlib_0.3.10-3_source.changes
Message-ID: <E1wri4P-000l4o-22@usper.debian.org>

universal-pathlib_0.3.10-3_source.changes uploaded successfully to localhost
along with the files:
  universal-pathlib_0.3.10-3.dsc
  universal-pathlib_0.3.10-3.debian.tar.xz
  universal-pathlib_0.3.10-3_source.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Wed Aug  5 21:33:51 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Wed, 05 Aug 2026 20:33:51 +0000
Subject: universal-pathlib_0.3.10-3_source.changes ACCEPTED into unstable
Message-ID: <E1wriJD-0000000GesL-2xNW@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Wed, 05 Aug 2026 17:43:24 +0000
Source: universal-pathlib
Architecture: source
Version: 0.3.10-3
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Closes: 1143435
Changes:
 universal-pathlib (0.3.10-3) unstable; urgency=medium
 .
   * debian/rules:
     - Copy the test folder to the build directory.
   * debian/control:
     - Add dependencies on python3-packaging and
       python3-pydantic-settings.
   * debian/patches:
     - Update 0003-Mark-network-tests.patch.
     - New 0004-xfail.patch (Closes: #1143435).
     - New 0005-relative-imports.patch.
   * New python3-universal-pathlib.lintian-overrides.
Checksums-Sha1:
 57d64012ef89ad0cd6d25faced4f5a4c8b32e9f6 2623 universal-pathlib_0.3.10-3.dsc
 2a3d238103a3a98e69824234bb1bab2ea2892012 5292 universal-pathlib_0.3.10-3.debian.tar.xz
 7f279f041dee83a1f6dfc8378f13d9782639a916 9814 universal-pathlib_0.3.10-3_source.buildinfo
Checksums-Sha256:
 6d65a45d15b06ef313d81250bcf6b1f781080f90a8cfd47d17d5c7365a75a950 2623 universal-pathlib_0.3.10-3.dsc
 6b0fae013c099da88f2291ae1ce517d939fab7f02be6bc45fdeed736d0ad5288 5292 universal-pathlib_0.3.10-3.debian.tar.xz
 1c1542470b9a65106e2fe44f14bd7c23a49cc239ef41f302f83a6511c6937617 9814 universal-pathlib_0.3.10-3_source.buildinfo
Files:
 362e7cf88b48b87736dee517fd1c1f24 2623 python optional universal-pathlib_0.3.10-3.dsc
 f48ba30b326981514dbaa46c16b1a42b 5292 python optional universal-pathlib_0.3.10-3.debian.tar.xz
 99c2af506118d0c15b786558d1c969f0 9814 python optional universal-pathlib_0.3.10-3_source.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmpzl8gdHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBL+3hAApQBiY17JyHqcji7i
7H6jbH4+LPyJJ1IkNdTKGO1pdtXpzZ2MfgTQcl57vSoDWbLIrUV6c794neTPTKhN
MHiwPrZLdRLRU2FxcH0W3OiP8Od190sFXAwotEPO12+Hzc9kHvlFYBlkUbSO5M+m
GPOQvnnmXu5wnXDeL3CHsIfKGHgcjHhVjcCHYUkbeoGqI4Ogsas9PhST9JfW7ywx
CL8xOChUljBDYY/fVOn4FjLwwiBEil2a110aupb52ZSODZclXa9PGFHIDxOxEzxu
kP/JokJCRu8CKewxAynr3Peyf1NFyWrZ7kqw4rucqU2aMCzNCdwY0jAnih070mUg
1p7xdMHJyswOUF2xKeBk72gwRbveEG2WJ2u4VXkd4IYmBlceDBE4q7IwzRrDJaMp
ahZ1bY/x9ZW+UFFMKpXsKgCsucWeZh+uItC0IWVfECOXYxTez/pVV2+fyEzL0DCl
TqJwzFC7dqf3t2zQETyp9DR7X02OLGYjqTkDATYSc9buFA1GWcaYwpG1iblnaKN3
HLScSsD1EDVw+IluLkuP/Zfcg85j3HwRzwBH7tIB7lacVtVs/2X9Gas3VlFSPQeT
wDFnzjq5yFV5gjSSgCUc41fxwuWD8kzGXX9/VVE5nKf3fR11cq3aDNF82biNdtd9
LA+4dIbdY6IG+IZ+F5Z8loPEgkw=
=d+0w
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/98fc991a/attachment.sig>

From owner at bugs.debian.org  Wed Aug  5 21:35:02 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Wed, 05 Aug 2026 20:35:02 +0000
Subject: Bug#1143435: marked as done (universal-pathlib: FTBFS: E         
 httpcore.ConnectError: [Errno 111] Connection refused)
References: <E1wriJD-0000000GesX-3IbE@fasolo.debian.org>
 <E1wqIN3-00DZdC-0i@paradis.debian.org>
Message-ID: <handler.1143435.D1143435.1785962033121669.ackdone@bugs.debian.org>

Your message dated Wed, 05 Aug 2026 20:33:51 +0000
with message-id <E1wriJD-0000000GesX-3IbE at fasolo.debian.org>
and subject line Bug#1143435: fixed in universal-pathlib 0.3.10-3
has caused the Debian Bug report #1143435,
regarding universal-pathlib: FTBFS: E                   httpcore.ConnectError: [Errno 111] Connection refused
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner at bugs.debian.org
immediately.)


-- 
1143435: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1143435
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems
-------------- next part --------------
An embedded message was scrubbed...
From: Santiago Vila <sanvila at debian.org>
Subject: universal-pathlib: FTBFS: E                   httpcore.ConnectError: [Errno 111] Connection refused
Date: Sat, 01 Aug 2026 22:39:57 +0000
Size: 26244
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/6c03e734/attachment-0002.eml>
-------------- next part --------------
An embedded message was scrubbed...
From: Debian FTP Masters <ftpmaster at ftp-master.debian.org>
Subject: Bug#1143435: fixed in universal-pathlib 0.3.10-3
Date: Wed, 05 Aug 2026 20:33:51 +0000
Size: 7169
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260805/6c03e734/attachment-0003.eml>

From noreply at release.debian.org  Thu Aug  6 05:39:20 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Thu, 06 Aug 2026 04:39:20 +0000
Subject: qgis 3.44.13+dfsg-1 MIGRATED to testing
Message-ID: <E1wrpt2-00000007TFn-2GwX@respighi.debian.org>

FYI: The status of the qgis source package
in Debian's testing distribution has changed.

  Previous version: 3.44.12+dfsg-1
  Current version:  3.44.13+dfsg-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Thu Aug  6 05:39:20 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Thu, 06 Aug 2026 04:39:20 +0000
Subject: python-s3fs 2026.7.0-1 MIGRATED to testing
Message-ID: <E1wrpt2-00000007TFW-1UV4@respighi.debian.org>

FYI: The status of the python-s3fs source package
in Debian's testing distribution has changed.

  Previous version: 2026.4.0-1
  Current version:  2026.7.0-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Thu Aug  6 05:40:28 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Thu, 06 Aug 2026 04:40:28 +0000
Subject: python-osmapi is marked for autoremoval from testing
Message-ID: <E1wrpu8-00000007TV7-0Y6i@respighi.debian.org>

python-osmapi 6.0.0+ds-1 is marked for autoremoval from testing on 2026-09-03

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1138816: nbclient: fails to build from source: testsuite failure
 https://bugs.debian.org/1138816



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Thu Aug  6 05:40:34 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Thu, 06 Aug 2026 04:40:34 +0000
Subject: pytest-recording is marked for autoremoval from testing
Message-ID: <E1wrpuE-00000007TVs-3bvK@respighi.debian.org>

pytest-recording 0.13.4-2 is marked for autoremoval from testing on 2026-09-03

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1138816: nbclient: fails to build from source: testsuite failure
 https://bugs.debian.org/1138816



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Thu Aug  6 05:39:46 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Thu, 06 Aug 2026 04:39:46 +0000
Subject: pyepr is marked for autoremoval from testing
Message-ID: <E1wrptS-00000007TOy-2k3G@respighi.debian.org>

pyepr 1.3.0-2 is marked for autoremoval from testing on 2026-09-03

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1138816: nbclient: fails to build from source: testsuite failure
 https://bugs.debian.org/1138816



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From sanvila at debian.org  Thu Aug  6 11:30:28 2026
From: sanvila at debian.org (Santiago Vila)
Date: Thu, 06 Aug 2026 10:30:28 +0000
Subject: Bug#1143800: qgis: FTBFS: the mapped type result needs an assignment
 operator or be movable
Message-ID: <E1wrvMq-000Hkf-09@paradis.debian.org>

Package: src:qgis
Version: 3.44.13+dfsg-1
Severity: serious
Tags: ftbfs forky sid

Dear maintainer:

During a rebuild of all packages in unstable, this package failed to build.

Below you will find the last part of the build log (probably the most
relevant part, but not necessarily). If required, the full build log
is available here:

https://people.debian.org/~sanvila/build-logs/202608/

About the archive rebuild: The build was made on virtual machines from AWS,
using sbuild and a reduced chroot with only build-essential packages.

If you cannot reproduce the bug please contact me privately, as I
am willing to provide ssh access to a virtual machine where the bug is
fully reproducible.

If this is really a bug in one of the build-depends, please use
reassign and add an affects on src:qgis, so that this is still
visible in the BTS web page for this package.

Thanks.

--------------------------------------------------------------------------------
[...]
sip-build: /<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/qgsmaplayerlegend.sip: line 165: column 12: 'QgsMapLayerLegendUtils::legendNodeCustomSymbol' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/qgsuserprofilemanager.sip: line 49: column 5: 'QgsUserProfileManager::getProfile' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/qgsuserprofilemanager.sip: line 177: column 5: 'QgsUserProfileManager::profileForName' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationmethod.sip: line 126: column 13: 'QgsClassificationMethod::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationmethod.sip: line 305: column 12: 'QgsClassificationMethod::create' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationcustom.sip: line 26: column 13: 'QgsClassificationCustom::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationequalinterval.sip: line 29: column 13: 'QgsClassificationEqualInterval::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationfixedinterval.sip: line 26: column 13: 'QgsClassificationFixedInterval::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationjenks.sip: line 29: column 13: 'QgsClassificationJenks::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationlogarithmic.sip: line 33: column 13: 'QgsClassificationLogarithmic::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationmethodregistry.sip: line 40: column 5: 'QgsClassificationMethodRegistry::method' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationprettybreaks.sip: line 29: column 13: 'QgsClassificationPrettyBreaks::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationquantile.sip: line 30: column 13: 'QgsClassificationQuantile::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/classification/qgsclassificationstandarddeviation.sip: line 30: column 13: 'QgsClassificationStandardDeviation::clone' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/elevation/qgsprofilerenderer.sip: line 169: column 12: 'QgsProfilePlotRenderer::defaultSubSectionsSymbol' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 46: column 5: 'QgsGeos::makeValid' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 72: column 5: 'QgsGeos::clip' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 83: column 5: 'QgsGeos::subdivide' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 325: column 5: 'QgsGeos::singleSidedBuffer' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 345: column 5: 'QgsGeos::maximumInscribedCircle' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 379: column 5: 'QgsGeos::largestEmptyCircle' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 415: column 5: 'QgsGeos::minimumWidth' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 469: column 5: 'QgsGeos::minimumClearanceLine' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 491: column 5: 'QgsGeos::node' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 511: column 5: 'QgsGeos::sharedPaths' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 532: column 5: 'QgsGeos::mergeLines' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 547: column 5: 'QgsGeos::closestPoint' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 559: column 5: 'QgsGeos::shortestLine' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 571: column 5: 'QgsGeos::shortestLine' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 628: column 5: 'QgsGeos::voronoiDiagram' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 651: column 5: 'QgsGeos::delaunayTriangulation' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 669: column 5: 'QgsGeos::constrainedDelaunayTriangulation' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 692: column 5: 'QgsGeos::concaveHull' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 730: column 5: 'QgsGeos::simplifyCoverageVW' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgsgeos.sip: line 764: column 5: 'QgsGeos::unionCoverage' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgslinestring.sip: line 250: column 12: 'QgsLineString::fromBezierCurve' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgslinestring.sip: line 264: column 12: 'QgsLineString::fromQPolygonF' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgslinestring.sip: line 910: column 5: 'QgsLineString::measuredLine' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/geometry/qgslinestring.sip: line 919: column 5: 'QgsLineString::interpolateM' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/providers/arcgis/qgsarcgisrestutils.sip: line 87: column 12: 'QgsArcGisRestUtils::convertGeometry' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/providers/arcgis/qgsarcgisrestutils.sip: line 111: column 12: 'QgsArcGisRestUtils::convertSymbol' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/providers/arcgis/qgsarcgisrestutils.sip: line 118: column 12: 'QgsArcGisRestUtils::convertRenderer' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/providers/arcgis/qgsarcgisrestutils.sip: line 126: column 12: 'QgsArcGisRestUtils::convertLabeling' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstaccontroller.sip: line 34: column 5: 'QgsStacController::openLocalCatalog' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstaccontroller.sip: line 40: column 5: 'QgsStacController::openLocalCollection' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstaccontroller.sip: line 46: column 5: 'QgsStacController::openLocalItem' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstaccontroller.sip: line 53: column 5: 'QgsStacController::fetchItemCollection' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstaccontroller.sip: line 61: column 5: 'QgsStacController::fetchCollections' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstaccontroller.sip: line 107: column 5: 'QgsStacController::takeItemCollection' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstaccontroller.sip: line 121: column 5: 'QgsStacController::takeCollections' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/stac/qgsstacparser.sip: line 45: column 5: 'QgsStacParser::catalog' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgsfillsymbol.sip: line 22: column 12: 'QgsFillSymbol::createSimple' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgslinesymbol.sip: line 23: column 12: 'QgsLineSymbol::createSimple' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgsmarkersymbol.sip: line 23: column 12: 'QgsMarkerSymbol::createSimple' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerregistry.sip: line 148: column 5: 'QgsSymbolLayerRegistry::createSymbolLayer' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerregistry.sip: line 154: column 5: 'QgsSymbolLayerRegistry::createSymbolLayerFromSld' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerregistry.sip: line 182: column 12: 'QgsSymbolLayerRegistry::defaultSymbolLayer' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 430: column 12: 'QgsSymbolLayerUtils::loadSymbol' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 441: column 12: 'QgsSymbolLayerUtils::loadSymbolLayer' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 463: column 12: 'QgsSymbolLayerUtils::createFillLayerFromSld' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 468: column 12: 'QgsSymbolLayerUtils::createLineLayerFromSld' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 473: column 12: 'QgsSymbolLayerUtils::createMarkerLayerFromSld' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 817: column 12: 'QgsSymbolLayerUtils::symbolFromMimeData' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 825: column 12: 'QgsSymbolLayerUtils::loadColorRamp' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 858: column 12: 'QgsSymbolLayerUtils::loadColorRamp' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 1121: column 12: 'QgsSymbolLayerUtils::fieldOrExpressionToExpression' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/symbology/qgssymbollayerutils.sip: line 1232: column 12: 'QgsSymbolLayerUtils::restrictedSizeSymbol' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/tiledscene/qgstiledscenetexturerenderer.sip: line 54: column 12: 'QgsTiledSceneTextureRenderer::createDefaultFillSymbol' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/tiledscene/qgstiledscenewireframerenderer.sip: line 54: column 12: 'QgsTiledSceneWireframeRenderer::createDefaultFillSymbol' the mapped type result needs an assignment operator or be movable
/<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/tiledscene/qgstiledscenewireframerenderer.sip: line 78: column 12: 'QgsTiledSceneWireframeRenderer::createDefaultLineSymbol' the mapped type result needs an assignment operator or be movable
ninja: build stopped: subcommand failed.
dh_auto_build: error: cd debian/build && LC_ALL=C.UTF-8 ninja -j1 -v returned exit code 1
make: *** [debian/rules:137: binary] Error 25
dpkg-buildpackage: error: debian/rules binary subprocess failed with exit status 2
--------------------------------------------------------------------------------


From gitlab at salsa.debian.org  Thu Aug  6 13:26:23 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 06 Aug 2026 12:26:23 +0000
Subject: [Git][debian-gis-team/qgis][trixie-backports] 8 commits: Drop the
 transitional qt5keychain-dev build dependency.
Message-ID: <6a747d6fbf1ba_551fb61c18616ad@godard.mail>



Bas Couwenberg pushed to branch trixie-backports at Debian GIS Project / qgis


Commits:
5985bc78 by Pino Toscano at 2026-07-26T09:44:35+02:00
Drop the transitional qt5keychain-dev build dependency.

- - - - -
d75bd8c7 by Bas Couwenberg at 2026-07-31T17:22:59+02:00
New upstream version 3.44.13+dfsg
- - - - -
4f74bffe by Bas Couwenberg at 2026-07-31T17:23:58+02:00
Update upstream source from tag 'upstream/3.44.13+dfsg'

Update to upstream version '3.44.13+dfsg'
with Debian dir fda5ed6f549f5e6c49106a01c03b341bf8be5200
- - - - -
2707da71 by Bas Couwenberg at 2026-07-31T17:29:03+02:00
New upstream release.

- - - - -
e40e3446 by Bas Couwenberg at 2026-07-31T17:31:07+02:00
Set distribution to experimental.

- - - - -
5e34b622 by Bas Couwenberg at 2026-08-01T06:30:31+02:00
Move from experimental to unstable.

- - - - -
2694bb97 by Bas Couwenberg at 2026-08-06T12:49:37+02:00
Merge tag 'debian/3.44.13+dfsg-1' into trixie-backports

releasing package qgis version 3.44.13+dfsg-1

- - - - -
04c9afc0 by Bas Couwenberg at 2026-08-06T12:49:43+02:00
Rebuild for trixie-backports.

- - - - -


120 changed files:

- CMakeLists.txt
- ChangeLog
- debian/changelog
- debian/control
- debian/libqgis-3d3.44.12.install ? debian/libqgis-3d3.44.13.install
- debian/libqgis-3d3.44.12.lintian-overrides ? debian/libqgis-3d3.44.13.lintian-overrides
- debian/libqgis-analysis3.44.12.install ? debian/libqgis-analysis3.44.13.install
- debian/libqgis-analysis3.44.12.lintian-overrides ? debian/libqgis-analysis3.44.13.lintian-overrides
- debian/libqgis-app3.44.12.install ? debian/libqgis-app3.44.13.install
- debian/libqgis-app3.44.12.lintian-overrides ? debian/libqgis-app3.44.13.lintian-overrides
- debian/libqgis-core3.44.12.install ? debian/libqgis-core3.44.13.install
- debian/libqgis-core3.44.12.lintian-overrides ? debian/libqgis-core3.44.13.lintian-overrides
- debian/libqgis-gui3.44.12.install ? debian/libqgis-gui3.44.13.install
- debian/libqgis-gui3.44.12.lintian-overrides ? debian/libqgis-gui3.44.13.lintian-overrides
- debian/libqgis-native3.44.12.install ? debian/libqgis-native3.44.13.install
- debian/libqgis-native3.44.12.lintian-overrides ? debian/libqgis-native3.44.13.lintian-overrides
- debian/libqgis-server3.44.12.install ? debian/libqgis-server3.44.13.install
- debian/libqgis-server3.44.12.lintian-overrides ? debian/libqgis-server3.44.13.lintian-overrides
- debian/libqgisgrass8-3.44.12.install ? debian/libqgisgrass8-3.44.13.install
- debian/libqgisgrass8-3.44.12.lintian-overrides ? debian/libqgisgrass8-3.44.13.lintian-overrides
- debian/libqgispython3.44.12.install ? debian/libqgispython3.44.13.install
- debian/libqgispython3.44.12.lintian-overrides ? debian/libqgispython3.44.13.lintian-overrides
- doc/TRANSLATORS
- i18n/qgis_ar.ts
- i18n/qgis_az.ts
- i18n/qgis_bg.ts
- i18n/qgis_bs.ts
- i18n/qgis_ca.ts
- i18n/qgis_cs.ts
- i18n/qgis_da.ts
- i18n/qgis_de.ts
- i18n/qgis_en_US.ts
- i18n/qgis_es.ts
- i18n/qgis_et.ts
- i18n/qgis_eu.ts
- i18n/qgis_fi.ts
- i18n/qgis_fr.ts
- i18n/qgis_gl.ts
- i18n/qgis_hu.ts
- i18n/qgis_is.ts
- i18n/qgis_it.ts
- i18n/qgis_ja.ts
- i18n/qgis_ko.ts
- i18n/qgis_lt.ts
- i18n/qgis_lv.ts
- i18n/qgis_nb.ts
- i18n/qgis_nl.ts
- i18n/qgis_pl.ts
- i18n/qgis_pt_BR.ts
- i18n/qgis_pt_PT.ts
- i18n/qgis_ro.ts
- i18n/qgis_ru.ts
- i18n/qgis_sc.ts
- i18n/qgis_sk.ts
- i18n/qgis_sv.ts
- i18n/qgis_ta.ts
- i18n/qgis_tr.ts
- i18n/qgis_uk.ts
- i18n/qgis_vi.ts
- i18n/qgis_zh-Hans.ts
- i18n/qgis_zh-Hant.ts
- i18n/qgis_zh_TW.ts
- linux/org.qgis.qgis.appdata.xml.in
- python/PyQt6/core/auto_additions/qgsprocessingutils.py
- python/PyQt6/core/auto_generated/geometry/qgslinestring.sip.in
- python/PyQt6/core/auto_generated/processing/qgsprocessingutils.sip.in
- python/PyQt6/server/auto_generated/qgsserverresponse.sip.in
- python/core/auto_additions/qgsprocessingutils.py
- python/core/auto_generated/geometry/qgslinestring.sip.in
- python/core/auto_generated/processing/qgsprocessingutils.sip.in
- python/plugins/processing/algs/gdal/ogr2ogrtopostgislist.py
- python/plugins/processing/tests/testdata/expected/join_by_location_summary_date.gml
- + python/plugins/processing/tests/testdata/expected/join_by_location_summary_date.xsd
- python/plugins/processing/tests/testdata/expected/join_by_location_summary_intersect.gml
- + python/plugins/processing/tests/testdata/expected/join_by_location_summary_intersect.xsd
- python/plugins/processing/tests/testdata/expected/join_by_location_summary_reproject.gml
- python/plugins/processing/tests/testdata/expected/join_by_location_summary_string.gml
- + python/plugins/processing/tests/testdata/expected/join_by_location_summary_string.xsd
- python/plugins/processing/tests/testdata/expected/join_by_location_summary_subset_stats.gml
- + python/plugins/processing/tests/testdata/expected/join_by_location_summary_subset_stats.xsd
- python/plugins/processing/tests/testdata/expected/join_by_location_summary_touches.gml
- + python/plugins/processing/tests/testdata/expected/join_by_location_summary_touches.xsd
- python/server/auto_generated/qgsserverresponse.sip.in
- resources/function_help/json/layer_property
- src/analysis/processing/qgsalgorithmgenerateelevationprofile.cpp
- src/analysis/processing/qgsalgorithmjoinbylocationsummary.cpp
- src/analysis/processing/qgsalgorithmlayoutatlastoimage.cpp
- src/analysis/processing/qgsalgorithmlayouttoimage.cpp
- src/app/qgisapp.cpp
- src/app/qgsmaptoolselectutils.cpp
- src/core/classification/qgsclassificationmethod.cpp
- src/core/dxf/qgsdxfexport.cpp
- src/core/dxf/qgsdxfexport.h
- src/core/dxf/qgsdxfpaintdevice.cpp
- src/core/dxf/qgsdxfpaintengine.cpp
- src/core/dxf/qgsdxfpaintengine.h
- src/core/expression/qgsexpression.cpp
- src/core/expression/qgsexpressionfunction.cpp
- src/core/expression/qgsexpressionnodeimpl.cpp
- src/core/geometry/qgslinestring.h
- src/core/mesh/qgsmeshlayer.cpp
- src/core/network/qgsnewsfeedparser.cpp
- src/core/processing/qgsprocessingutils.cpp
- src/core/processing/qgsprocessingutils.h
- src/core/qgsapplication.cpp
- src/core/qgsstringutils.cpp
- src/core/symbology/qgsmarkersymbollayer.cpp
- src/gui/layout/qgslayoutpicturewidget.cpp
- src/gui/qgsfilecontentsourcelineedit.cpp
- src/providers/postgres/qgspostgresutils.cpp
- src/providers/wms/qgswmsprovider.cpp
- src/server/qgsserverquerystringparameter.cpp
- src/server/qgsserverresponse.h
- src/server/services/wfs3/qgswfs3handlers.cpp
- src/server/services/wfs3/qgswfs3handlers.h
- src/ui/qgsadvanceddigitizingfloaterbase.ui
- tests/src/core/testqgsdxfexport.cpp
- tests/src/core/testqgsexpression.cpp
- tests/src/core/testqgssvgmarker.cpp
- tests/src/providers/testqgswmsprovider.cpp


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/compare/20c77d5e8cf2501ce86248a6316bf59440987c11...04c9afc053e25c914943fe7efb50019f8fdd5e46

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/compare/20c77d5e8cf2501ce86248a6316bf59440987c11...04c9afc053e25c914943fe7efb50019f8fdd5e46
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260806/479b5bea/attachment-0001.htm>

From gitlab at salsa.debian.org  Thu Aug  6 13:26:24 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 06 Aug 2026 12:26:24 +0000
Subject: [Git][debian-gis-team/qgis] Pushed new tag
 debian/3.44.13+dfsg-1_bpo13+1
Message-ID: <6a747d70e124e_551668228818618b6@godard.mail>



Bas Couwenberg pushed new tag debian/3.44.13+dfsg-1_bpo13+1 at Debian GIS Project / qgis

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/tree/debian/3.44.13+dfsg-1_bpo13+1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260806/224fc033/attachment.htm>

From ftpmaster at ftp-master.debian.org  Thu Aug  6 13:37:11 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Thu, 06 Aug 2026 12:37:11 +0000
Subject: Processing of qgis_3.44.13+dfsg-1~bpo13+1_amd64.changes
Message-ID: <E1wrxLT-001QL9-1x@usper.debian.org>

qgis_3.44.13+dfsg-1~bpo13+1_amd64.changes uploaded successfully to localhost
along with the files:
  qgis_3.44.13+dfsg-1~bpo13+1.dsc
  qgis_3.44.13+dfsg-1~bpo13+1.debian.tar.xz
  libqgis-3d3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-3d3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-analysis3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-analysis3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-app3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-app3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-core3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-core3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-customwidgets-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-customwidgets_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-dev_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-gui3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-gui3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-native3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-native3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-server3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgis-server3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgisgrass8-3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgisgrass8-3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgispython3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  libqgispython3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
  python3-qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
  python3-qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  python3-qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-api-doc_3.44.13+dfsg-1~bpo13+1_all.deb
  qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
  qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-plugin-grass-common_3.44.13+dfsg-1~bpo13+1_all.deb
  qgis-plugin-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-plugin-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-provider-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-provider-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-providers-common_3.44.13+dfsg-1~bpo13+1_all.deb
  qgis-providers-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-providers_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-bin-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-bin_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-common_3.44.13+dfsg-1~bpo13+1_all.deb
  qgis-server-landingpage-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-landingpage_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wcs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wcs_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wfs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wfs3-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wfs3_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wfs_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wms-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wms_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wmts-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server-wmts_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-server_3.44.13+dfsg-1~bpo13+1_amd64.deb
  qgis-sip_3.44.13+dfsg-1~bpo13+1_all.deb
  qgis_3.44.13+dfsg-1~bpo13+1_amd64.buildinfo
  qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Thu Aug  6 13:52:37 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Thu, 06 Aug 2026 12:52:37 +0000
Subject: qgis_3.44.13+dfsg-1~bpo13+1_amd64.changes is NEW
Message-ID: <E1wrxaP-00000001tMX-24SM@fasolo.debian.org>

Mapping trixie-backports to stable-backports.
binary:libqgis-3d3.44.13 is NEW.
binary:libqgis-analysis3.44.13 is NEW.
binary:libqgis-app3.44.13 is NEW.
binary:libqgis-core3.44.13 is NEW.
binary:libqgis-gui3.44.13 is NEW.
binary:libqgis-native3.44.13 is NEW.
binary:libqgis-server3.44.13 is NEW.
binary:libqgisgrass8-3.44.13 is NEW.
binary:libqgispython3.44.13 is NEW.
binary:libqgis-3d3.44.13 is NEW.
binary:libqgis-analysis3.44.13 is NEW.
binary:libqgis-app3.44.13 is NEW.
binary:libqgis-core3.44.13 is NEW.
binary:libqgis-gui3.44.13 is NEW.
binary:libqgis-native3.44.13 is NEW.
binary:libqgis-server3.44.13 is NEW.
binary:libqgisgrass8-3.44.13 is NEW.
binary:libqgispython3.44.13 is NEW.

Your package has been put into the NEW queue, which requires manual action
from the ftpteam to process. The upload was otherwise valid (it had a good
OpenPGP signature and file hashes are valid), so please be patient.

Packages are routinely processed through to the archive, and do feel
free to browse the NEW queue[1].

If there is an issue with the upload, you will receive an email from a
member of the ftpteam.

If you have any questions, you may reply to this email.

[1]: https://ftp-master.debian.org/new.html
     or https://ftp-master.debian.org/backports-new.html for *-backports
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260806/d5faa02e/attachment.sig>

From sebastic at xs4all.nl  Thu Aug  6 17:49:38 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Thu, 6 Aug 2026 18:49:38 +0200
Subject: Bug#1143800: qgis: FTBFS: the mapped type result needs an assignment
 operator or be movable
In-Reply-To: <E1wrvMq-000Hkf-09@paradis.debian.org>
References: <E1wrvMq-000Hkf-09@paradis.debian.org>
 <E1wrvMq-000Hkf-09@paradis.debian.org>
Message-ID: <4f9ad86f-0d02-456d-aa22-722d498437e6@xs4all.nl>

Control: tags -1 upstream
Control: forwarded -1 https://github.com/qgis/QGIS/issues/66993

On 8/6/26 12:30 PM, Santiago Vila wrote:
> sip-build: /<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/qgsmaplayerlegend.sip: line 165: column 12: 'QgsMapLayerLegendUtils::legendNodeCustomSymbol' the mapped type result needs an assignment operator or be movable
> [...]
> /<<PKGBUILDDIR>>/debian/build/python/core/auto_generated/tiledscene/qgstiledscenewireframerenderer.sip: line 78: column 12: 'QgsTiledSceneWireframeRenderer::createDefaultLineSymbol' the mapped type result needs an assignment operator or be movable

This seems to be caused by the recent update of sip6 to 6.16.0-1, I might also be gcc-16 but there are no error: lines in the log.

I have forwarded the issue upstream as I have no idea how to resolve this.

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From owner at bugs.debian.org  Thu Aug  6 18:03:02 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Thu, 06 Aug 2026 17:03:02 +0000
Subject: Processed: Re: Bug#1143800: qgis: FTBFS: the mapped type result
 needs an assignment operator or be movable
References: <4f9ad86f-0d02-456d-aa22-722d498437e6@xs4all.nl>
 <E1wrvMq-000Hkf-09@paradis.debian.org>
Message-ID: <handler.s.B1143800.1786035649695772.transcript@bugs.debian.org>

Processing control commands:

> tags -1 upstream
Bug #1143800 [src:qgis] qgis: FTBFS: the mapped type result needs an assignment operator or be movable
Added tag(s) upstream.
> forwarded -1 https://github.com/qgis/QGIS/issues/66993
Bug #1143800 [src:qgis] qgis: FTBFS: the mapped type result needs an assignment operator or be movable
Set Bug forwarded-to-address to 'https://github.com/qgis/QGIS/issues/66993'.

-- 
1143800: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1143800
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems


From ftpmaster at ftp-master.debian.org  Thu Aug  6 18:05:07 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Thu, 06 Aug 2026 17:05:07 +0000
Subject: mapnik_4.3.0+ds2-1~exp1_amd64.changes ACCEPTED into experimental
Message-ID: <E1ws1Wl-00000002mzk-1L8m@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Tue, 04 Aug 2026 20:06:23 +0200
Source: mapnik
Binary: libmapnik-dev libmapnik4.3 libmapnik4.3-dbgsym mapnik-utils mapnik-utils-dbgsym
Architecture: source amd64
Version: 4.3.0+ds2-1~exp1
Distribution: experimental
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Description:
 libmapnik-dev - C++ toolkit for developing GIS applications (devel)
 libmapnik4.3 - C++ toolkit for developing GIS applications (libraries)
 mapnik-utils - C++ toolkit for developing GIS applications (utilities)
Changes:
 mapnik (4.3.0+ds2-1~exp1) experimental; urgency=medium
 .
   * Exclude demo files from repacked upstream tarball.
   * Drop mapnik-doc package, demo examples are gone now.
Checksums-Sha1:
 d0c0edb268f9ad7b74e1d83ce743bc333b4f85ff 2710 mapnik_4.3.0+ds2-1~exp1.dsc
 c9efdfc18e2d8fa6c0e44ec78ece248a1475a7d2 2040284 mapnik_4.3.0+ds2.orig.tar.xz
 5e57566f6714fb24abeb50b9ac23829c22007a36 16924 mapnik_4.3.0+ds2-1~exp1.debian.tar.xz
 93482cee8bedd82d8ad6a9f51ac1ed4e5540abfa 679192 libmapnik-dev_4.3.0+ds2-1~exp1_amd64.deb
 1a19c7c1e094c9e2caec7318890649677bddcab8 94359316 libmapnik4.3-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
 46ca68636874d61a1993ae17b524613b85636f6c 3134160 libmapnik4.3_4.3.0+ds2-1~exp1_amd64.deb
 8c5c4fc81eaa00b87b76076091740b285e0e1b2c 8278972 mapnik-utils-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
 e6a7663d382823773a43c2bfb188d8598a591bf1 389016 mapnik-utils_4.3.0+ds2-1~exp1_amd64.deb
 dbacc2681fd2f2e8e2d24b89da0165bd69176336 20217 mapnik_4.3.0+ds2-1~exp1_amd64.buildinfo
Checksums-Sha256:
 26df546a2b60072ca99d896a3b7c47b623dde73e84eb52c7b56919f765304d0f 2710 mapnik_4.3.0+ds2-1~exp1.dsc
 14725cc4063d0d31324a30c3f1c73d6ed6050c886dbaeb521b76e0f5214161bd 2040284 mapnik_4.3.0+ds2.orig.tar.xz
 83e48f4d3c7c87c564bb55039cfbb1762e9e8650e0844c140cf4193403ea49bc 16924 mapnik_4.3.0+ds2-1~exp1.debian.tar.xz
 7519f46aba0a6483fc49fb45339c66f930974a59e7f79db5d1d99153e3fef98c 679192 libmapnik-dev_4.3.0+ds2-1~exp1_amd64.deb
 8ea98e1ec512551a71cc048f30d862aee6f27969d074cb8d8b57c6a026194b28 94359316 libmapnik4.3-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
 b2b2c1152427c3995d46e4ca8cd03c8f871b685d4c2fd28abb74fe3a6270ee84 3134160 libmapnik4.3_4.3.0+ds2-1~exp1_amd64.deb
 c77513e677a2b47f1efb525192d09641deceaf57fb7667dca34692ae830bcf40 8278972 mapnik-utils-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
 13933a38605954d9416b25bee2f192145c835b966a63bbba4596570ff9e8c513 389016 mapnik-utils_4.3.0+ds2-1~exp1_amd64.deb
 48730f445b531fb98b21d0c8629da36349ebfc3f2830962187437266c69f2756 20217 mapnik_4.3.0+ds2-1~exp1_amd64.buildinfo
Files:
 764cfa38f529543f5a04f3c42e9f7d12 2710 libs optional mapnik_4.3.0+ds2-1~exp1.dsc
 199ed4c8adcccd90e7d8af3a61125f19 2040284 libs optional mapnik_4.3.0+ds2.orig.tar.xz
 2a4a4a2d29778f441a629b77ff360b70 16924 libs optional mapnik_4.3.0+ds2-1~exp1.debian.tar.xz
 9d0d84aea539df1205df8517c316dd8f 679192 libdevel optional libmapnik-dev_4.3.0+ds2-1~exp1_amd64.deb
 97a7e07e2b687548260ba965f7182f30 94359316 debug optional libmapnik4.3-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
 883449690437681347cb0848a29d6e0b 3134160 libs optional libmapnik4.3_4.3.0+ds2-1~exp1_amd64.deb
 d0e2d794fec0e817eeface25d9355566 8278972 debug optional mapnik-utils-dbgsym_4.3.0+ds2-1~exp1_amd64.deb
 9175bda84c79e38be93f5b2e28cca8a8 389016 utils optional mapnik-utils_4.3.0+ds2-1~exp1_amd64.deb
 e3f94ff5e7a398c404046edb928ba3b1 20217 libs optional mapnik_4.3.0+ds2-1~exp1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmpyMFkACgkQZ1DxCuiN
SvHKARAAzigSXMplgkBUKIprX6+WQzpECVHLu5q0lESw7Utuw+r44dEMu4Gcvzzd
NUBryWjTRLnHLCjxYz/tMCENLMWvAE9PY6eZXhshGgkfheIq03grVsum1m7ktBmu
ktA0uk7NMh+3982P8/mYghq3f4mTZPvDHDK6LuQCVkKWGHmHVCJiCYEM97+0xbDm
Gs10+HcHVEy3TEB8yyET/Hxa52timZ6mAlaEDBRXAMa455fklOkJJxKzH4NKwnen
36gRehRgxsQ2M1gkqsKph+9z5N/3VuAAK/1SxmmR5MKTO9AfotQlKn/dG3I+Hta5
YLjoxsTsRIJPhPeoV/VY+E7hkd17o5+MxPH0h/8o2g36iGZfT71QKhGu9oqfbNhf
YR8tf5Myk4eWXhOa+qyiVg16YRDRwK2xVtjuzetjrkNvK7ZqCz3/vgcMm2kXpHPD
NDkHC+SRa1BAN1wd8MBEK4oV+UdeFVvMmYqluOGcbC4jbtsYi0GV5fihbdjj9zip
sgwd37d3wcHEFJMzIPiITKl9v8FoOl+ib50LskegpU1cV0sesQdQIRvKSoqnH0mL
DGedH6cv7BJrg8ra68PWXWKssZNnufq/cuQ3TLoPJXBibvEE2ThiwGog7r2n2Gtn
t4YPP4rGLmCC4PmoGuOud5WCiuIygwYISa3VNWf9861XorhMrYc=
=6MSr
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260806/84253abe/attachment-0001.sig>

From sebastic at debian.org  Thu Aug  6 18:08:30 2026
From: sebastic at debian.org (Bas Couwenberg)
Date: Thu, 06 Aug 2026 19:08:30 +0200
Subject: Bug#1143826: transition: mapnik
Message-ID: <178603611005.990867.6880310352071177090.reportbug@osiris.linuxminded.xs4all.nl>

Package: release.debian.org
Severity: normal
X-Debbugs-Cc: mapnik at packages.debian.org
Control: affects -1 + src:mapnik
User: release.debian.org at packages.debian.org
Usertags: transition
Control: forwarded -1 https://release.debian.org/transitions/html/auto-mapnik.html

Mapnik 4.3.0 has been released, the SONAME bump requires a transition.

All three rdeps built successfully as summarized below.


Transition: mapnik

 libmapnik4.2 (4.2.2+ds-1+b1) -> libmapnik4.3 (4.3.0+ds-1~exp2)

The status of the most recent rebuilds is as follows.

 libapache2-mod-tile (0.8.1-2)    OK
 tirex               (0.8.0+ds-1) OK
 viking              (1.11-3)     OK


Kind Regards,

Bas 


From sebastic at xs4all.nl  Thu Aug  6 18:21:59 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Thu, 6 Aug 2026 19:21:59 +0200
Subject: Bug#1133521: back to libkml
In-Reply-To: <CALF6qJmmFwC-ZRQ8unKm4o+gchOUO65HBCsio3QvjpK4StEFuA@mail.gmail.com>
References: <CALF6qJmmFwC-ZRQ8unKm4o+gchOUO65HBCsio3QvjpK4StEFuA@mail.gmail.com>
 <CALF6qJmmFwC-ZRQ8unKm4o+gchOUO65HBCsio3QvjpK4StEFuA@mail.gmail.com>
 <adzqKH3Z7qYgCOtZ@ariel.home>
Message-ID: <3ef7afee-1c34-4625-a4f2-ea785f3c836f@xs4all.nl>

On Sun, 2 Aug 2026 09:39:12 +0200 Anton Gladky <gladk at debian.org> wrote:
> It is not a Boost bug - this is most probably a libkml bug.
> 
> boost::intrusive_ptr relies on ADL to find intrusive_ptr_add_ref,
> which needs the pointer type to be complete.
> GCC-16 is stricter about this than older GCC.

I have not idea how to fix this, and seeing how libkml is dead upstream, we should just get rid of it.

Both gdal & goldencheetah dropped its use in git, and the latter only had an unused build dependency.

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From gitlab at salsa.debian.org  Fri Aug  7 04:52:22 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 03:52:22 +0000
Subject: [Git][debian-gis-team/mapnik][master] 15 commits: Update branch in
 gbp.conf & Vcs-Git URL.
Message-ID: <6a755676c0d18_537fafb485245@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / mapnik


Commits:
77944035 by Bas Couwenberg at 2026-07-24T14:57:13+02:00
Update branch in gbp.conf & Vcs-Git URL.

- - - - -
4d25c5af by Bas Couwenberg at 2026-07-24T14:57:55+02:00
New upstream version 4.3.0+ds
- - - - -
b9911880 by Bas Couwenberg at 2026-07-24T14:58:00+02:00
Update upstream source from tag 'upstream/4.3.0+ds'

Update to upstream version '4.3.0+ds'
with Debian dir a07cd99beeef6960280b11958e5360d4cba1174b
- - - - -
2d105f7f by Bas Couwenberg at 2026-07-24T15:05:58+02:00
New upstream release.

- - - - -
af68a9bd by Bas Couwenberg at 2026-07-24T15:08:59+02:00
Set distribution to experimental.

- - - - -
f26bbcb9 by Bas Couwenberg at 2026-07-24T16:08:40+02:00
Rename library package for SONAME bump.

- - - - -
da38200e by Bas Couwenberg at 2026-07-24T16:08:52+02:00
Set distribution to experimental.

- - - - -
553ddf18 by Bas Couwenberg at 2026-08-04T20:00:51+02:00
Exclude demo files from repacked upstream tarball.

- - - - -
23688f61 by Bas Couwenberg at 2026-08-04T20:00:59+02:00
New upstream version 4.3.0+ds2
- - - - -
2d90cfed by Bas Couwenberg at 2026-08-04T20:01:03+02:00
Update upstream source from tag 'upstream/4.3.0+ds2'

Update to upstream version '4.3.0+ds2'
with Debian dir d4b75c6f54f9d8ee6b3b91d747a00ebcd96f633c
- - - - -
3f1fb93e by Bas Couwenberg at 2026-08-04T20:04:31+02:00
New repacked upstream release.

- - - - -
8c517423 by Bas Couwenberg at 2026-08-04T20:23:06+02:00
Drop mapnik-doc package, demo examples are gone now.

- - - - -
86670d58 by Bas Couwenberg at 2026-08-04T20:23:06+02:00
Set distribution to experimental.

- - - - -
033647dd by Bas Couwenberg at 2026-08-07T05:38:52+02:00
Revert "Update branch in gbp.conf & Vcs-Git URL."

This reverts commit 77944035696904ecd5de46d792455c5cfba54c9d.

- - - - -
feb3d9df by Bas Couwenberg at 2026-08-07T05:39:20+02:00
Move from experimental to unstable.

- - - - -


117 changed files:

- .github/workflows/build_and_test.yml
- .gitmodules
- CHANGELOG.md
- debian/changelog
- debian/control
- debian/copyright
- debian/libmapnik4.2.install ? debian/libmapnik4.3.install
- debian/libmapnik4.2.lintian-overrides ? debian/libmapnik4.3.lintian-overrides
- ? debian/mapnik-doc.examples
- + debian/patches/repack.patch
- debian/patches/series
- ? demo/CMakeLists.txt
- ? demo/c++/CMakeLists.txt
- ? demo/c++/Makefile
- ? demo/c++/README.md
- ? demo/c++/build.py
- ? demo/c++/common.gypi
- ? demo/c++/rundemo.cpp
- ? demo/c++/rundemo.gyp
- ? demo/data/COPYRIGHT.txt
- ? demo/data/boundaries.dbf
- ? demo/data/boundaries.shp
- ? demo/data/boundaries.shx
- ? demo/data/boundaries_l.dbf
- ? demo/data/boundaries_l.shp
- ? demo/data/boundaries_l.shx
- ? demo/data/ontdrainage.dbf
- ? demo/data/ontdrainage.shp
- ? demo/data/ontdrainage.shx
- ? demo/data/popplaces.dbf
- ? demo/data/popplaces.shp
- ? demo/data/popplaces.shx
- ? demo/data/qcdrainage.dbf
- ? demo/data/qcdrainage.shp
- ? demo/data/qcdrainage.shx
- ? demo/data/roads.dbf
- ? demo/data/roads.shp
- ? demo/data/roads.shx
- ? demo/simple-renderer/render.py
- ? demo/viewer/CMakeLists.txt
- ? demo/viewer/about_dialog.cpp
- ? demo/viewer/about_dialog.hpp
- ? demo/viewer/build.py
- ? demo/viewer/forms/about.ui
- ? demo/viewer/forms/info.ui
- ? demo/viewer/forms/layer_info.ui
- ? demo/viewer/images/about.png
- ? demo/viewer/images/canada_map.png
- ? demo/viewer/images/down.png
- ? demo/viewer/images/export.png
- ? demo/viewer/images/filter.png
- ? demo/viewer/images/globe.png
- ? demo/viewer/images/globe_bw.png
- ? demo/viewer/images/help.png
- ? demo/viewer/images/home.png
- ? demo/viewer/images/info.png
- ? demo/viewer/images/left.png
- ? demo/viewer/images/mapnik.png
- ? demo/viewer/images/pan.png
- ? demo/viewer/images/print.png
- ? demo/viewer/images/reload.png
- ? demo/viewer/images/right.png
- ? demo/viewer/images/style.png
- ? demo/viewer/images/up.png
- ? demo/viewer/images/zoombox.png
- ? demo/viewer/images/zoomin.png
- ? demo/viewer/info_dialog.cpp
- ? demo/viewer/info_dialog.hpp
- ? demo/viewer/layer_info_dialog.cpp
- ? demo/viewer/layer_info_dialog.hpp
- ? demo/viewer/layerdelegate.cpp
- ? demo/viewer/layerdelegate.hpp
- ? demo/viewer/layerlistmodel.cpp
- ? demo/viewer/layerlistmodel.hpp
- ? demo/viewer/layerwidget.cpp
- ? demo/viewer/layerwidget.hpp
- ? demo/viewer/main.cpp
- ? demo/viewer/mainwindow.cpp
- ? demo/viewer/mainwindow.hpp
- ? demo/viewer/mapnik_viewer.qrc
- ? demo/viewer/mapwidget.cpp
- ? demo/viewer/mapwidget.hpp
- ? demo/viewer/styles_model.cpp
- ? demo/viewer/styles_model.hpp
- ? demo/viewer/viewer.pro
- include/mapnik/expression_grammar_x3.hpp
- include/mapnik/feature_style_processor_impl.hpp
- include/mapnik/geom_util.hpp
- include/mapnik/map.hpp
- include/mapnik/markers_placements/point.hpp
- include/mapnik/svg/svg_transform_grammar_x3_def.hpp
- include/mapnik/text/harfbuzz_shaper.hpp
- include/mapnik/transform/transform_expression.hpp
- include/mapnik/transform/transform_expression_grammar_x3_def.hpp
- include/mapnik/version.hpp
- plugins/input/gdal/gdal_datasource.hpp
- plugins/input/pgraster/pgraster_datasource.cpp
- plugins/input/pgraster/pgraster_datasource.hpp
- plugins/input/postgis/connection.hpp
- plugins/input/postgis/postgis_datasource.cpp
- plugins/input/postgis/postgis_datasource.hpp
- plugins/input/shape/shape_index_featureset.cpp
- plugins/input/shape/shape_io.hpp
- plugins/input/tiles/mbtiles_source.hpp
- plugins/input/tiles/pmtiles_source.hpp
- plugins/input/tiles/tiles_datasource.cpp
- plugins/input/tiles/tiles_datasource.hpp
- plugins/input/tiles/tiles_source.hpp
- plugins/input/tiles/vector_tiles_featureset.cpp
- plugins/input/tiles/vector_tiles_featureset.hpp
- src/load_map.cpp
- src/map.cpp
- src/text/itemizer.cpp
- src/xml_tree.cpp
- test/unit/datasource/postgis.cpp
- test/unit/renderer/feature_style_processor.cpp
- test/unit/text/shaping.cpp


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/compare/84ca26740e25faf286a9f9811353c14b73b86f09...feb3d9dfb98048688f93b064488a595ee7c47f67

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/compare/84ca26740e25faf286a9f9811353c14b73b86f09...feb3d9dfb98048688f93b064488a595ee7c47f67
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/49723123/attachment-0001.htm>

From gitlab at salsa.debian.org  Fri Aug  7 04:52:32 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 03:52:32 +0000
Subject: [Git][debian-gis-team/mapnik] Pushed new tag debian/4.3.0+ds2-1
Message-ID: <6a75568047df0_537fb54085458@godard.mail>



Bas Couwenberg pushed new tag debian/4.3.0+ds2-1 at Debian GIS Project / mapnik

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapnik/-/tree/debian/4.3.0+ds2-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/ec698b31/attachment.htm>

From ftpmaster at ftp-master.debian.org  Fri Aug  7 05:02:52 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 07 Aug 2026 04:02:52 +0000
Subject: Processing of mapnik_4.3.0+ds2-1_source.changes
Message-ID: <E1wsBnI-000FfU-2V@usper.debian.org>

mapnik_4.3.0+ds2-1_source.changes uploaded successfully to localhost
along with the files:
  mapnik_4.3.0+ds2-1.dsc
  mapnik_4.3.0+ds2-1.debian.tar.xz
  mapnik_4.3.0+ds2-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Fri Aug  7 05:08:35 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 07 Aug 2026 04:08:35 +0000
Subject: mapnik_4.3.0+ds2-1_source.changes ACCEPTED into unstable
Message-ID: <E1wsBsp-00000004jmW-3KX1@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Fri, 07 Aug 2026 05:39:02 +0200
Source: mapnik
Architecture: source
Version: 4.3.0+ds2-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Changes:
 mapnik (4.3.0+ds2-1) unstable; urgency=medium
 .
   * Move from experimental to unstable.
Checksums-Sha1:
 6fa4e0ef7095fbc74a514168d0d8367a5ceabd8d 2674 mapnik_4.3.0+ds2-1.dsc
 aee9c44e1acd3ff927206cae257342c507b6ec15 16956 mapnik_4.3.0+ds2-1.debian.tar.xz
 e701ac30e1200f7909fa361ccc413accf3029f56 20133 mapnik_4.3.0+ds2-1_amd64.buildinfo
Checksums-Sha256:
 37c7991d9bcd065b372ec378a3f2395ddc34ef0e585deea3b69ec4faee2573ba 2674 mapnik_4.3.0+ds2-1.dsc
 278e4bbb772721e0facf4f62cb7fe3d89cda4d9f8117d503d054017e4e6890f2 16956 mapnik_4.3.0+ds2-1.debian.tar.xz
 4c811c59a1f5932f5d47400f572b54845955745091d9dd081a41ef544c842c02 20133 mapnik_4.3.0+ds2-1_amd64.buildinfo
Files:
 1e111ace75d0753b000b88587d4b5826 2674 libs optional mapnik_4.3.0+ds2-1.dsc
 30fd138cae80144165a988b71fd73270 16956 libs optional mapnik_4.3.0+ds2-1.debian.tar.xz
 d79eee8735c50cd818642cf35bba2104 20133 libs optional mapnik_4.3.0+ds2-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmp1VmcACgkQZ1DxCuiN
SvEgaQ/9HcsLeE0ZxVj6umil6K7LvjK6eia0cFnD+r4IdW8lPOqbig0C0q8riOnN
o4M13tw3vETJ2SmdvU54hm4c1x5RypfWb7wqkNgZ+UGxQpD+YF87yZyGaQUNaAXZ
f+saBPKVZDXkJ9DOZfSuwiuymzqAkYofkwV5KuRVkH/+KJ9McUU1rCq14OI2xQRK
68ff1IhP7sFUT46JKF7Y5+q/RNssiyCdN1Lffi9kZGopNzs7aG7P007UkexPY+1d
MG6WdAFXHGjTVxLgYFVRB27XJFKgT/MLSrRri3Ww43xvHZ9xcT10UAxypcm9tV8I
c+/MZomtlyXb5qOZ3kHvuUmPGYXRKrxyBXnZTCRzfnr5ZepMKimL/hwdzyKCwPOk
h/CLmGN7uM1gcinsAj1NxkPb/pnytzrMoL1euDQtVMoMI+2Cu3PXBpXKtKzGGFX6
bFRate4PmoKIUMIldu9AghfMBbY25FEQLSsmtGj0zRGuhJ2UsfPLskmSUBd5Q3Kl
oHi3H4u0BM9D1PcXEsHLp5DxWgGK+6ZD7x5uUVCws7ewYeb1Yh0Xu+Vaf3u5E6ki
BRRFY4rsCvqpXNgZBKfuUwA89lFxvHz+zQM7NFTr8LZZA79Whag9t1nfzpdNkkXw
n6Z0Cejcu39k4WGQvvHuhiczOs2tsF0QFF59kXYez7gGqlP7kU8=
=DId4
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/f70819b1/attachment.sig>

From gitlab at salsa.debian.org  Fri Aug  7 05:21:30 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 04:21:30 +0000
Subject: [Git][debian-gis-team/rasterio][pristine-tar] pristine-tar data for
 rasterio_1.5.1.orig.tar.gz
Message-ID: <6a755d4a8103b_537fb52c881cb@godard.mail>



Bas Couwenberg pushed to branch pristine-tar at Debian GIS Project / rasterio


Commits:
20687bc4 by Bas Couwenberg at 2026-08-07T05:55:08+02:00
pristine-tar data for rasterio_1.5.1.orig.tar.gz

- - - - -


2 changed files:

- + rasterio_1.5.1.orig.tar.gz.delta
- + rasterio_1.5.1.orig.tar.gz.id


Changes:

=====================================
rasterio_1.5.1.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/rasterio_1.5.1.orig.tar.gz.delta differ


=====================================
rasterio_1.5.1.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+f33b9c3153afd99a0c041495239177826b5fd988



View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/commit/20687bc42a38f61c5ec149ce9ec4427952a4fb31

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/commit/20687bc42a38f61c5ec149ce9ec4427952a4fb31
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/1abd3e04/attachment.htm>

From gitlab at salsa.debian.org  Fri Aug  7 05:21:31 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 04:21:31 +0000
Subject: [Git][debian-gis-team/rasterio][upstream] New upstream version 1.5.1
Message-ID: <6a755d4bbb41d_537fb0908838d@godard.mail>



Bas Couwenberg pushed to branch upstream at Debian GIS Project / rasterio


Commits:
3a4d9b0f by Bas Couwenberg at 2026-08-07T05:54:42+02:00
New upstream version 1.5.1
- - - - -


53 changed files:

- .github/workflows/build-wheels.yaml
- .github/workflows/tests.yaml
- CHANGES.txt
- Dockerfile
- Makefile
- ci/config.sh
- ci/vcpkg.json
- docs/environment.yml
- docs/faq.rst
- pyproject.toml
- rasterio/__init__.py
- rasterio/_base.pyx
- rasterio/_features.pyx
- rasterio/_fill.pyx
- rasterio/_io.pyx
- rasterio/_show_versions.py
- rasterio/_vendor/snuggs.py
- rasterio/_vsiopener.pyx
- rasterio/_warp.pyx
- rasterio/errors.py
- rasterio/features.py
- rasterio/gdal.pxi
- rasterio/io.py
- rasterio/plot.py
- rasterio/rio/blocks.py
- rasterio/rio/bounds.py
- rasterio/rio/calc.py
- rasterio/rio/gcps.py
- rasterio/rio/info.py
- rasterio/rio/main.py
- rasterio/rio/options.py
- rasterio/rio/rasterize.py
- rasterio/rio/sample.py
- rasterio/rio/shapes.py
- rasterio/rio/transform.py
- rasterio/rio/warp.py
- + rasterio/serde.py
- rasterio/warp.py
- requirements-dev.txt
- requirements.txt
- + tests/test_buffered_write.py
- tests/test_dtypes.py
- tests/test_features.py
- tests/test_plot.py
- tests/test_process_pool_executor.py
- tests/test_pyopener.py
- tests/test_read.py
- tests/test_rio_calc.py
- tests/test_rio_info.py
- tests/test_rio_warp.py
- tests/test_show_versions.py
- tests/test_subdatasets.py
- tests/test_warp.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/commit/3a4d9b0f648975348bf47f5a65f52a72e5606092

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/commit/3a4d9b0f648975348bf47f5a65f52a72e5606092
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/08be2b57/attachment-0001.htm>

From gitlab at salsa.debian.org  Fri Aug  7 05:21:33 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 04:21:33 +0000
Subject: [Git][debian-gis-team/rasterio] Pushed new tag debian/1.5.1-1
Message-ID: <6a755d4d5365f_537fb270885e9@godard.mail>



Bas Couwenberg pushed new tag debian/1.5.1-1 at Debian GIS Project / rasterio

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/tree/debian/1.5.1-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/31954c6a/attachment.htm>

From gitlab at salsa.debian.org  Fri Aug  7 05:21:34 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 04:21:34 +0000
Subject: [Git][debian-gis-team/rasterio] Pushed new tag upstream/1.5.1
Message-ID: <6a755d4e9c3a6_537fb4508875d@godard.mail>



Bas Couwenberg pushed new tag upstream/1.5.1 at Debian GIS Project / rasterio

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/tree/upstream/1.5.1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/2ba0312b/attachment.htm>

From gitlab at salsa.debian.org  Fri Aug  7 05:21:29 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 04:21:29 +0000
Subject: [Git][debian-gis-team/rasterio][master] 6 commits: New upstream
 version 1.5.1
Message-ID: <6a755d494140f_537fb50487926@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / rasterio


Commits:
3a4d9b0f by Bas Couwenberg at 2026-08-07T05:54:42+02:00
New upstream version 1.5.1
- - - - -
0ccf4ffc by Bas Couwenberg at 2026-08-07T05:55:08+02:00
Update upstream source from tag 'upstream/1.5.1'

Update to upstream version '1.5.1'
with Debian dir 2458c270aff19704b8590f78a99e887c51380853
- - - - -
df09796e by Bas Couwenberg at 2026-08-07T05:57:05+02:00
New upstream release.

- - - - -
40bb9716 by Bas Couwenberg at 2026-08-07T06:08:47+02:00
Replace python3-cligj build dependency with python3-click.

- - - - -
b476984f by Bas Couwenberg at 2026-08-07T06:09:06+02:00
Drop pyparsing-3.3.patch, applied upstream.

- - - - -
f9bab76f by Bas Couwenberg at 2026-08-07T06:09:08+02:00
Set distribution to unstable.

- - - - -


58 changed files:

- .github/workflows/build-wheels.yaml
- .github/workflows/tests.yaml
- CHANGES.txt
- Dockerfile
- Makefile
- ci/config.sh
- ci/vcpkg.json
- debian/changelog
- debian/control
- debian/patches/0001-Rename-rio-to-rasterio-Closes-788463.patch
- ? debian/patches/pyparsing-3.3.patch
- debian/patches/series
- docs/environment.yml
- docs/faq.rst
- pyproject.toml
- rasterio/__init__.py
- rasterio/_base.pyx
- rasterio/_features.pyx
- rasterio/_fill.pyx
- rasterio/_io.pyx
- rasterio/_show_versions.py
- rasterio/_vendor/snuggs.py
- rasterio/_vsiopener.pyx
- rasterio/_warp.pyx
- rasterio/errors.py
- rasterio/features.py
- rasterio/gdal.pxi
- rasterio/io.py
- rasterio/plot.py
- rasterio/rio/blocks.py
- rasterio/rio/bounds.py
- rasterio/rio/calc.py
- rasterio/rio/gcps.py
- rasterio/rio/info.py
- rasterio/rio/main.py
- rasterio/rio/options.py
- rasterio/rio/rasterize.py
- rasterio/rio/sample.py
- rasterio/rio/shapes.py
- rasterio/rio/transform.py
- rasterio/rio/warp.py
- + rasterio/serde.py
- rasterio/warp.py
- requirements-dev.txt
- requirements.txt
- + tests/test_buffered_write.py
- tests/test_dtypes.py
- tests/test_features.py
- tests/test_plot.py
- tests/test_process_pool_executor.py
- tests/test_pyopener.py
- tests/test_read.py
- tests/test_rio_calc.py
- tests/test_rio_info.py
- tests/test_rio_warp.py
- tests/test_show_versions.py
- tests/test_subdatasets.py
- tests/test_warp.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/compare/a3a9f5aa77261113e08381ed0783c8cb04353c22...f9bab76f9ea9af611aa584bc40022cc696eaed79

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/rasterio/-/compare/a3a9f5aa77261113e08381ed0783c8cb04353c22...f9bab76f9ea9af611aa584bc40022cc696eaed79
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/5e593b26/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Fri Aug  7 05:32:58 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 07 Aug 2026 04:32:58 +0000
Subject: Processing of rasterio_1.5.1-1_source.changes
Message-ID: <E1wsCGQ-000GtZ-0a@usper.debian.org>

rasterio_1.5.1-1_source.changes uploaded successfully to localhost
along with the files:
  rasterio_1.5.1-1.dsc
  rasterio_1.5.1.orig.tar.gz
  rasterio_1.5.1-1.debian.tar.xz
  rasterio_1.5.1-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Fri Aug  7 05:34:32 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 07 Aug 2026 04:34:32 +0000
Subject: rasterio_1.5.1-1_source.changes ACCEPTED into unstable
Message-ID: <E1wsCHw-00000004oJo-2RID@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Fri, 07 Aug 2026 06:01:33 +0200
Source: rasterio
Architecture: source
Version: 1.5.1-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Changes:
 rasterio (1.5.1-1) unstable; urgency=medium
 .
   * Team upload.
   * New upstream release.
   * Bump Standards-Version to 4.7.4, no changes.
   * Replace python3-cligj build dependency with python3-click.
   * Drop pyparsing-3.3.patch, applied upstream.
Checksums-Sha1:
 41baaa3641c11b884bd447b21abfb9afe3d87d59 2478 rasterio_1.5.1-1.dsc
 5fe49ba14a40918dfb05d605fb567c9002c2d018 13515834 rasterio_1.5.1.orig.tar.gz
 d70db99290ca6ff44f5333a70fe0d10d26e3e268 9372 rasterio_1.5.1-1.debian.tar.xz
 ab4febff62f5f4f92373bc819187d689052ea004 18187 rasterio_1.5.1-1_amd64.buildinfo
Checksums-Sha256:
 204689d62e4fd46b32548d595afdd99e44c57bd108bae61286a961fdab35b5e9 2478 rasterio_1.5.1-1.dsc
 027350515d5b13633e25bd26d49d7ac4445f32fcdb14389186cb6312a447b490 13515834 rasterio_1.5.1.orig.tar.gz
 1b2aab7622c1f1be85cbfd592fa17f50cd80c626a9f7ad2f474e61e7ca3a2ab5 9372 rasterio_1.5.1-1.debian.tar.xz
 c7ce89e5c131b4fc8c9cae3230d1ea392ac4e04d25d477b1f27dc51e7a533bc0 18187 rasterio_1.5.1-1_amd64.buildinfo
Files:
 b31e6cf94be8d26383da9f5e2ff11536 2478 python optional rasterio_1.5.1-1.dsc
 be7cde968cff71bd66a38896df17ef4a 13515834 python optional rasterio_1.5.1.orig.tar.gz
 2c540571c5e469b85f7ec723bbc0e66f 9372 python optional rasterio_1.5.1-1.debian.tar.xz
 8a1def4569b026ef9b6c415392244d5e 18187 python optional rasterio_1.5.1-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmp1XTMACgkQZ1DxCuiN
SvFR1hAAg5TdUE2IbKpbj/ZeTuMx0z0tlAE3wz4gF15mlnqmEMn553BlksA3GnAB
nrFHcoMRhHdrDA/2JWJu/ZU/apTchciTnAv1KEXgxa4kKUijZwTyiANUJOFnSseQ
fEsBC7jHPQsQZtk28HwQnnIIjR6MOdVumeMNGkC47XG3vfUmLNL+tgl0aju+EXGQ
p8si14/Y2iGLP3EP9k3iTWsXyI6PIhXs1vhe0U3dFOugQzdvaFI97aZPufQEPOXD
TCCJGK+BGthOFQO5SfHxBp0bCv4/TMdALnjtDYl5naD68EF76iOGm0ejkcoN5X52
cGVfYnNik6efNpMGUjTCFb/Sp3hvQfVrK9VI0SLKIQDkxmUT8a1/rhjOirbB3oOk
XSPpiQfsB73M1cCQSmG3J8UmNSHjtUT+NZUEhgdmQF8FIRwEfwylOOf2NhkRaJF8
rcN5sbRXDyCN9QWp2IajOzRX2azv765gNWKWBMlolZ1hMAvPtvkKTP7sMaUPRzUy
5WtC/DvafN09by43oXfzjeYaRsDwiNyt/3LvMFHVtND6Jy71HJV7+a9jSTA3LMST
NGpoas+p5Pf3NqMPsOCAi8pZknvLlnibZwR0Yg3T2ch/2lsQ5QiVg8thM0R6fT6m
4jK0YlyoKg5MuLTf3wPNsvUXKp9COMzGfK6gyo0dn5wX02swuog=
=M/nr
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/763a897f/attachment.sig>

From noreply at release.debian.org  Fri Aug  7 05:39:12 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Fri, 07 Aug 2026 04:39:12 +0000
Subject: qgis is marked for autoremoval from testing
Message-ID: <E1wsCMS-00000000Nkm-2u26@respighi.debian.org>

qgis 3.44.13+dfsg-1 is marked for autoremoval from testing on 2026-09-03

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1138816: nbclient: fails to build from source: testsuite failure
 https://bugs.debian.org/1138816



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Fri Aug  7 05:39:12 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Fri, 07 Aug 2026 04:39:12 +0000
Subject: python-s3fs is marked for autoremoval from testing
Message-ID: <E1wsCMS-00000000Nkh-0R4q@respighi.debian.org>

python-s3fs 2026.7.0-1 is marked for autoremoval from testing on 2026-09-03

It (build-)depends on packages with these RC bugs:
1133642: taskflow: ftbfs with GCC-16
 https://bugs.debian.org/1133642
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1138816: nbclient: fails to build from source: testsuite failure
 https://bugs.debian.org/1138816



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From owner at bugs.debian.org  Fri Aug  7 08:57:03 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Fri, 07 Aug 2026 07:57:03 +0000
Subject: Processed: Re: Bug#1139600: fixed in gmtsar 6.6+ds-2
References: <cf8de72f-a92a-4b1c-9166-f9dc132e32f9@xs4all.nl>
Message-ID: <handler.s.C.17860893031439991.transcript@bugs.debian.org>

Processing commands for control at bugs.debian.org:

> unarchive 1139600
Bug #1139600 {Done: Antonio Valentino <antonio.valentino at tiscali.it>} [src:gmtsar] gmtsar: FTBFS against HDF5 2.1.0
Unarchived Bug 1139600
> reopen 1139600 =
Bug #1139600 {Done: Antonio Valentino <antonio.valentino at tiscali.it>} [src:gmtsar] gmtsar: FTBFS against HDF5 2.1.0
'reopen' may be inappropriate when a bug has been closed with a version;
all fixed versions will be cleared, and you may need to re-add them.
Bug reopened
No longer marked as fixed in versions gmtsar/6.7+ds-1.
> thanks
Stopping processing here.

Please contact me if you need assistance.
-- 
1139600: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1139600
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems


From sebastic at xs4all.nl  Fri Aug  7 08:54:55 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Fri, 7 Aug 2026 09:54:55 +0200
Subject: Bug#1139600: fixed in gmtsar 6.6+ds-2
In-Reply-To: <3a1c8de2-f3f5-4f7c-a04d-0777e28a2efe@pustule.org>
References: <E1wbGQr-00000003W9c-2Koq@fasolo.debian.org>
 <178107668767.49133.17979666369663909058.reportbug@pinibrem14>
 <3a1c8de2-f3f5-4f7c-a04d-0777e28a2efe@pustule.org>
 <178107668767.49133.17979666369663909058.reportbug@pinibrem14>
Message-ID: <cf8de72f-a92a-4b1c-9166-f9dc132e32f9@xs4all.nl>

unarchive 1139600
reopen 1139600 =
thanks

On 6/22/26 10:27 AM, Pini wrote:
> Unfortunately my patch wasn't robust enough, and it doesn't work with this new release of the package.
> 
> Please find attached an improved one.

Now that hdf5 transition started we see that the patch does resolve the FTBFS.

  x86_64-linux-gnu-gcc -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gmtsar-6.7+ds=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -Wall -pedantic -z muldefs -g -O2 -Wall -fPIC -fno-strict-aliasing -std=gnu99 -Wl,-z,relro -Wl,-z,now -z muldefs -g -s -o make_slc_csk make_slc_csk.o -L../../../gmtsar -lgmtsar -L../lib -lxmlC -L/usr/lib/x86_64-linux-gnu -lgmt  -laec -lsz -lz -ldl -lm -lhdf5_serial_hl  -lhdf5 -lhdf5_cpp -lm
  /usr/bin/x86_64-linux-gnu-ld.bfd: cannot find -lhdf5: No such file or directory
  /usr/bin/x86_64-linux-gnu-ld.bfd: cannot find -lhdf5_cpp: No such file or directory
  collect2: error: ld returned 1 exit status

Looks like only the first library correctly contains $HDF5_INFIX, whereas the other two do not.

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From owner at bugs.debian.org  Fri Aug  7 10:09:01 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Fri, 07 Aug 2026 09:09:01 +0000
Subject: Processed: severity of 1139600 is serious
References: <1786093622-565832172@bts.debian.org>
Message-ID: <handler.s.C.17860936281484376.transcript@bugs.debian.org>

Processing commands for control at bugs.debian.org:

> severity 1139600 serious
Bug #1139600 [src:gmtsar] gmtsar: FTBFS against HDF5 2.1.0
Severity set to 'serious' from 'important'
> thanks
Stopping processing here.

Please contact me if you need assistance.
-- 
1139600: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1139600
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems


From gitlab at salsa.debian.org  Fri Aug  7 12:39:11 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 11:39:11 +0000
Subject: [Git][debian-gis-team/gmtsar][master] Update HDF5 2.1.0 patch to
 detect INFIX correctly. (closes: #1139600)
Message-ID: <6a75c3df1d661_537fb1a8174558@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / gmtsar


Commits:
35fbd8f6 by Bas Couwenberg at 2026-08-07T13:35:58+02:00
Update HDF5 2.1.0 patch to detect INFIX correctly. (closes: #1139600)

- - - - -


2 changed files:

- debian/changelog
- debian/patches/0004-hdf5-2.1.0.patch


Changes:

=====================================
debian/changelog
=====================================
@@ -1,8 +1,13 @@
 gmtsar (6.7+ds-2) UNRELEASED; urgency=medium
 
+  [ Antonio Valentino ]
   * debian/copytight:
     - Drop `pwd` from the exclusion list.
 
+  [ Bas Couwenberg ]
+  * Update HDF5 2.1.0 patch to detect INFIX correctly.
+    (closes: #1139600)
+
  -- Antonio Valentino <antonio.valentino at tiscali.it>  Thu, 25 Jun 2026 13:58:56 +0000
 
 gmtsar (6.7+ds-1) unstable; urgency=medium


=====================================
debian/patches/0004-hdf5-2.1.0.patch
=====================================
@@ -9,27 +9,41 @@ Applied-Upstream: https://github.com/gmtsar/gmtsar/commit/564cdfc789192337c70f6f
  ax_lib_hdf5.m4 | 15 +++++++++++----
  1 file changed, 11 insertions(+), 4 deletions(-)
 
-diff --git a/ax_lib_hdf5.m4 b/ax_lib_hdf5.m4
-index 809cf96..03f8788 100644
 --- a/ax_lib_hdf5.m4
 +++ b/ax_lib_hdf5.m4
-@@ -226,7 +226,14 @@ HDF5 support is being disabled (equivalent to --with-hdf5=no).
+@@ -137,6 +137,7 @@ HDF5_LIBS=""
+ HDF5_FC=""
+ HDF5_FFLAGS=""
+ HDF5_FLIBS=""
++HDF5_INFIX=""
+ 
+ dnl Try and find hdf5 compiler tools and options.
+ if test "$with_hdf5" = "yes"; then
+@@ -226,7 +227,15 @@ HDF5 support is being disabled (equivale
            esac
          done
  
 -        HDF5_LIBS="$HDF5_LIBS -lhdf5"
-+        HDF5_INFIX=
-+        case "$HDF5_LIBS" in
++        for arg in $HDF5_LIBS ; do
++          case "$arg" in
 +            -lhdf5_*)
-+                HDF5_INFIX="${HDF5_LIBS#-lhdf5_}"
++                HDF5_INFIX="${arg#-lhdf5_}"
 +                HDF5_INFIX="_${HDF5_INFIX%%_*}"
 +                ;;
-+        esac
++          esac
++        done
 +        HDF5_LIBS="$HDF5_LIBS -lhdf5$HDF5_INFIX"
          AC_MSG_RESULT([yes (version $[HDF5_VERSION])])
  
          dnl See if we can compile
-@@ -245,7 +252,7 @@ HDF5 support is being disabled (equivalent to --with-hdf5=no).
+@@ -239,13 +248,13 @@ HDF5 support is being disabled (equivale
+         LIBS=$HDF5_LIBS
+         LDFLAGS=$HDF5_LDFLAGS
+         AC_CHECK_HEADER([hdf5.h], [ac_cv_hadf5_h=yes], [ac_cv_hadf5_h=no])
+-        AC_CHECK_LIB([hdf5], [H5Fcreate], [ac_cv_libhdf5=yes],
++        AC_CHECK_LIB([hdf5${HDF5_INFIX}], [H5Fcreate], [ac_cv_libhdf5=yes],
+                      [ac_cv_libhdf5=no])
+         if test "$ac_cv_hadf5_h" = "no" && test "$ac_cv_libhdf5" = "no" ; then
            AC_MSG_WARN([Unable to compile HDF5 test program])
          fi
          dnl Look for HDF5's high level library
@@ -38,7 +52,7 @@ index 809cf96..03f8788 100644
  
          CC=$ax_lib_hdf5_save_CC
          CPPFLAGS=$ax_lib_hdf5_save_CPPFLAGS
-@@ -281,9 +288,9 @@ HDF5 support is being disabled (equivalent to --with-hdf5=no).
+@@ -281,9 +290,9 @@ HDF5 support is being disabled (equivale
              for arg in $HDF5_LIBS
              do
                case "$arg" in #(



View it on GitLab: https://salsa.debian.org/debian-gis-team/gmtsar/-/commit/35fbd8f68d16b2fb4b397f7aeb2c1f7c86706d7c

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gmtsar/-/commit/35fbd8f68d16b2fb4b397f7aeb2c1f7c86706d7c
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/5bb9fe08/attachment-0001.htm>

From gitlab at salsa.debian.org  Fri Aug  7 12:45:46 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 07 Aug 2026 11:45:46 +0000
Subject: [Git][debian-gis-team/gmtsar][master] Use pini's changes.
Message-ID: <6a75c56ad8c1_537fb248174715@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / gmtsar


Commits:
582939f0 by Bas Couwenberg at 2026-08-07T13:43:08+02:00
Use pini's changes.

- - - - -


1 changed file:

- debian/patches/0004-hdf5-2.1.0.patch


Changes:

=====================================
debian/patches/0004-hdf5-2.1.0.patch
=====================================
@@ -11,24 +11,18 @@ Applied-Upstream: https://github.com/gmtsar/gmtsar/commit/564cdfc789192337c70f6f
 
 --- a/ax_lib_hdf5.m4
 +++ b/ax_lib_hdf5.m4
-@@ -137,6 +137,7 @@ HDF5_LIBS=""
- HDF5_FC=""
- HDF5_FFLAGS=""
- HDF5_FLIBS=""
-+HDF5_INFIX=""
- 
- dnl Try and find hdf5 compiler tools and options.
- if test "$with_hdf5" = "yes"; then
-@@ -226,7 +227,15 @@ HDF5 support is being disabled (equivale
+@@ -226,7 +226,17 @@ HDF5 support is being disabled (equivale
            esac
          done
  
 -        HDF5_LIBS="$HDF5_LIBS -lhdf5"
-+        for arg in $HDF5_LIBS ; do
-+          case "$arg" in
++        HDF5_INFIX=
++        for lib in $HDF5_LIBS; do
++          case "$lib" in
 +            -lhdf5_*)
-+                HDF5_INFIX="${arg#-lhdf5_}"
++                HDF5_INFIX="${lib#-lhdf5_}"
 +                HDF5_INFIX="_${HDF5_INFIX%%_*}"
++                break
 +                ;;
 +          esac
 +        done
@@ -36,7 +30,7 @@ Applied-Upstream: https://github.com/gmtsar/gmtsar/commit/564cdfc789192337c70f6f
          AC_MSG_RESULT([yes (version $[HDF5_VERSION])])
  
          dnl See if we can compile
-@@ -239,13 +248,13 @@ HDF5 support is being disabled (equivale
+@@ -239,13 +249,13 @@ HDF5 support is being disabled (equivale
          LIBS=$HDF5_LIBS
          LDFLAGS=$HDF5_LDFLAGS
          AC_CHECK_HEADER([hdf5.h], [ac_cv_hadf5_h=yes], [ac_cv_hadf5_h=no])
@@ -52,7 +46,7 @@ Applied-Upstream: https://github.com/gmtsar/gmtsar/commit/564cdfc789192337c70f6f
  
          CC=$ax_lib_hdf5_save_CC
          CPPFLAGS=$ax_lib_hdf5_save_CPPFLAGS
-@@ -281,9 +290,9 @@ HDF5 support is being disabled (equivale
+@@ -281,9 +291,9 @@ HDF5 support is being disabled (equivale
              for arg in $HDF5_LIBS
              do
                case "$arg" in #(



View it on GitLab: https://salsa.debian.org/debian-gis-team/gmtsar/-/commit/582939f055c72c9f17872385b3582f99ab1c4c5b

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gmtsar/-/commit/582939f055c72c9f17872385b3582f99ab1c4c5b
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/95a5fd50/attachment-0001.htm>

From sebastic at xs4all.nl  Fri Aug  7 12:51:43 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Fri, 7 Aug 2026 13:51:43 +0200
Subject: Bug#1139600: fixed in gmtsar 6.6+ds-2
In-Reply-To: <cf8de72f-a92a-4b1c-9166-f9dc132e32f9@xs4all.nl>
References: <E1wbGQr-00000003W9c-2Koq@fasolo.debian.org>
 <178107668767.49133.17979666369663909058.reportbug@pinibrem14>
 <3a1c8de2-f3f5-4f7c-a04d-0777e28a2efe@pustule.org>
 <178107668767.49133.17979666369663909058.reportbug@pinibrem14>
 <cf8de72f-a92a-4b1c-9166-f9dc132e32f9@xs4all.nl>
 <178107668767.49133.17979666369663909058.reportbug@pinibrem14>
Message-ID: <e34f81c1-6167-49ed-8b79-0ed8cc910571@xs4all.nl>

Control: tags -1 pending

On 8/7/26 9:54 AM, Sebastiaan Couwenberg via Pkg-grass-devel wrote:
> On 6/22/26 10:27 AM, Pini wrote:
>> Unfortunately my patch wasn't robust enough, and it doesn't work with this new release of the package.
>>
>> Please find attached an improved one.
> 
> Now that hdf5 transition started we see that the patch does resolve the FTBFS.
> 
>  ?x86_64-linux-gnu-gcc -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gmtsar-6.7+ds=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -Wall -pedantic -z muldefs -g -O2 -Wall -fPIC -fno-strict-aliasing -std=gnu99 -Wl,-z,relro -Wl,-z,now -z muldefs -g -s -o make_slc_csk make_slc_csk.o -L../../../gmtsar -lgmtsar -L../lib -lxmlC -L/usr/lib/x86_64-linux-gnu -lgmt? -laec -lsz -lz -ldl -lm -lhdf5_serial_hl? -lhdf5 -lhdf5_cpp -lm
>  ?/usr/bin/x86_64-linux-gnu-ld.bfd: cannot find -lhdf5: No such file or directory
>  ?/usr/bin/x86_64-linux-gnu-ld.bfd: cannot find -lhdf5_cpp: No such file or directory
>  ?collect2: error: ld returned 1 exit status
> 
> Looks like only the first library correctly contains $HDF5_INFIX, whereas the other two do not.

The patch in git has been updated to include pini's latest changes and a further change from me that I noticed while troubleshooting this issue.

I'll leave the upload to Antonio.

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From owner at bugs.debian.org  Fri Aug  7 12:53:02 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Fri, 07 Aug 2026 11:53:02 +0000
Subject: Processed: Re: Bug#1139600: fixed in gmtsar 6.6+ds-2
References: <e34f81c1-6167-49ed-8b79-0ed8cc910571@xs4all.nl>
 <178107668767.49133.17979666369663909058.reportbug@pinibrem14>
Message-ID: <handler.s.B1139600.17861035081583373.transcript@bugs.debian.org>

Processing control commands:

> tags -1 pending
Bug #1139600 [src:gmtsar] gmtsar: FTBFS against HDF5 2.1.0
Added tag(s) pending.

-- 
1139600: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1139600
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems


From gitlab at salsa.debian.org  Fri Aug  7 15:11:22 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Fri, 07 Aug 2026 14:11:22 +0000
Subject: [Git][debian-gis-team/gmtsar] Pushed new tag debian/6.7+ds-2
Message-ID: <6a75e78aef6b7_537fb4282040ee@godard.mail>



Antonio Valentino pushed new tag debian/6.7+ds-2 at Debian GIS Project / gmtsar

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gmtsar/-/tree/debian/6.7+ds-2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/f098b72e/attachment.htm>

From gitlab at salsa.debian.org  Fri Aug  7 15:11:30 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Fri, 07 Aug 2026 14:11:30 +0000
Subject: [Git][debian-gis-team/gmtsar][master] Set distribution to unstable
Message-ID: <6a75e7922edeb_537fb46420426f@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / gmtsar


Commits:
18adf2f4 by Antonio Valentino at 2026-08-07T14:01:57+00:00
Set distribution to unstable

- - - - -


1 changed file:

- debian/changelog


Changes:

=====================================
debian/changelog
=====================================
@@ -1,4 +1,4 @@
-gmtsar (6.7+ds-2) UNRELEASED; urgency=medium
+gmtsar (6.7+ds-2) unstable; urgency=medium
 
   [ Antonio Valentino ]
   * debian/copytight:
@@ -8,7 +8,7 @@ gmtsar (6.7+ds-2) UNRELEASED; urgency=medium
   * Update HDF5 2.1.0 patch to detect INFIX correctly.
     (closes: #1139600)
 
- -- Antonio Valentino <antonio.valentino at tiscali.it>  Thu, 25 Jun 2026 13:58:56 +0000
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Fri, 07 Aug 2026 14:01:27 +0000
 
 gmtsar (6.7+ds-1) unstable; urgency=medium
 



View it on GitLab: https://salsa.debian.org/debian-gis-team/gmtsar/-/commit/18adf2f4a0610c0c68bf893da1cf21dd9257658c

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gmtsar/-/commit/18adf2f4a0610c0c68bf893da1cf21dd9257658c
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/4cd3d254/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Fri Aug  7 15:25:00 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 07 Aug 2026 14:25:00 +0000
Subject: Processing of gmtsar_6.7+ds-2_source.changes
Message-ID: <E1wsLVM-000gId-2k@usper.debian.org>

gmtsar_6.7+ds-2_source.changes uploaded successfully to localhost
along with the files:
  gmtsar_6.7+ds-2.dsc
  gmtsar_6.7+ds-2.debian.tar.xz
  gmtsar_6.7+ds-2_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Fri Aug  7 15:36:15 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 07 Aug 2026 14:36:15 +0000
Subject: gmtsar_6.7+ds-2_source.changes ACCEPTED into unstable
Message-ID: <E1wsLgF-00000006fv2-0rLv@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Fri, 07 Aug 2026 14:01:27 +0000
Source: gmtsar
Architecture: source
Version: 6.7+ds-2
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Closes: 1139600
Changes:
 gmtsar (6.7+ds-2) unstable; urgency=medium
 .
   [ Antonio Valentino ]
   * debian/copytight:
     - Drop `pwd` from the exclusion list.
 .
   [ Bas Couwenberg ]
   * Update HDF5 2.1.0 patch to detect INFIX correctly.
     (closes: #1139600)
Checksums-Sha1:
 634c2524e5712a42a38b7ae34ab1a95cacfb6e6c 3414 gmtsar_6.7+ds-2.dsc
 46f678a5bd9689e45d641f65670d43ff528de463 23112 gmtsar_6.7+ds-2.debian.tar.xz
 bbbbed5512318e77777c6489915df111ec4c9dac 12377 gmtsar_6.7+ds-2_amd64.buildinfo
Checksums-Sha256:
 4da0da7e113f5423180ae80ce9c7dc2690a91ee305cdd2391b957e4be55950bb 3414 gmtsar_6.7+ds-2.dsc
 a589bfaa5c65dbe4cee76210407c12ab82c39fe14329dc03a2951e7f53aa5a58 23112 gmtsar_6.7+ds-2.debian.tar.xz
 0bfadc645b7dd2b8352298424cae3132ad5dae2b80cba7e6b10ac7b7de1418b2 12377 gmtsar_6.7+ds-2_amd64.buildinfo
Files:
 88831164ca61c48652ac54817d56a427 3414 science optional gmtsar_6.7+ds-2.dsc
 8c56a7960af3929ac341ec2d35eab0d3 23112 science optional gmtsar_6.7+ds-2.debian.tar.xz
 d3d935cd8df1ebb1bf0dfc49d97b034e 12377 science optional gmtsar_6.7+ds-2_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmp1558dHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBLIDRAAw+QgAzdMZdj4Q0XG
IOF8V8CF6tCDhU52CDAlv6CQjB+8FVkhCYlVHMstxzveifGiUW/tgWeqqfiQ3LCn
0nN3eNIXILz4bkNW7eRuZGMHMFCXZczORqKqpTCfODRT0lcP08sl7ELWLkt8ztZU
x81mOitQlkRXQETPo7L7GcVDW/sEZJPbov/gYyaChiS5iXW9V1fqLg4b4eM7d6+L
1XhE5nj2W4CsMRD4H3ZqHK3AncCLzop0nKYtwbgj4HOQA4T+NznfHn+d+s+FMxZp
9eAt2NcoX80DcvKt750CyXQNTkG5e/K+mgTWK5HOo83zjN6k+KVKtkQC5CaM9K5L
/BCYVCNFtTZHVNPBWhdkw2U3l61woNgpq2Y55yZvJrIYoxnzPquBaYdrzgen3RJW
wCk9s/8rlZS9IhVJe8ggpQNrzllsoKolfYvd3ar6i6LIZyvYBabri4e5Yq5rc37M
nHG2J46weaHkT2vXJ+ihMAjnF4XyZEuZCdCZ+RRIr+nZOEkEWEiDQYQPJmCfjo5O
Lsr9gx5Umi6FkCjH291gOW3oeJaTnf+bfonSnJb3STyDOfG95P1ZO3PlTfG8kPHv
Jm93ezs9V+rMcuFVcOQ7UDNcY1kM879MoMWQz1CpvRcL2bgWYRpYYWtr3gGZgedk
jwOx8LtfG3K452xtyH51R+naZR0=
=9a/6
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/00faa74d/attachment.sig>

From owner at bugs.debian.org  Fri Aug  7 15:39:03 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Fri, 07 Aug 2026 14:39:03 +0000
Subject: Bug#1139600: marked as done (gmtsar: FTBFS against HDF5 2.1.0)
References: <E1wsLgF-00000006fvB-1DXH@fasolo.debian.org>
 <178107668767.49133.17979666369663909058.reportbug@pinibrem14>
Message-ID: <handler.1139600.D1139600.17861133841667860.ackdone@bugs.debian.org>

Your message dated Fri, 07 Aug 2026 14:36:15 +0000
with message-id <E1wsLgF-00000006fvB-1DXH at fasolo.debian.org>
and subject line Bug#1139600: fixed in gmtsar 6.7+ds-2
has caused the Debian Bug report #1139600,
regarding gmtsar: FTBFS against HDF5 2.1.0
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner at bugs.debian.org
immediately.)


-- 
1139600: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1139600
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems
-------------- next part --------------
An embedded message was scrubbed...
From: Gilles Filippini <pini at debian.org>
Subject: gmtsar: FTBFS against HDF5 2.1.0
Date: Wed, 10 Jun 2026 09:31:27 +0200
Size: 6903
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/fd57efe0/attachment.eml>
-------------- next part --------------
An embedded message was scrubbed...
From: Debian FTP Masters <ftpmaster at ftp-master.debian.org>
Subject: Bug#1139600: fixed in gmtsar 6.7+ds-2
Date: Fri, 07 Aug 2026 14:36:15 +0000
Size: 6812
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260807/fd57efe0/attachment-0001.eml>

From ftpmaster at ftp-master.debian.org  Sat Aug  8 08:01:58 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 08 Aug 2026 07:01:58 +0000
Subject: qgis_3.44.13+dfsg-1~bpo13+1_amd64.changes ACCEPTED into
 stable-backports
Message-ID: <E1wsb4A-00000009VXC-2d7J@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Thu, 06 Aug 2026 12:49:40 +0200
Source: qgis
Binary: libqgis-3d3.44.13 libqgis-3d3.44.13-dbgsym libqgis-analysis3.44.13 libqgis-analysis3.44.13-dbgsym libqgis-app3.44.13 libqgis-app3.44.13-dbgsym libqgis-core3.44.13 libqgis-core3.44.13-dbgsym libqgis-customwidgets libqgis-customwidgets-dbgsym libqgis-dev libqgis-gui3.44.13 libqgis-gui3.44.13-dbgsym libqgis-native3.44.13 libqgis-native3.44.13-dbgsym libqgis-server3.44.13 libqgis-server3.44.13-dbgsym libqgisgrass8-3.44.13 libqgisgrass8-3.44.13-dbgsym libqgispython3.44.13 libqgispython3.44.13-dbgsym python3-qgis python3-qgis-common python3-qgis-dbgsym qgis qgis-api-doc qgis-common qgis-dbgsym qgis-plugin-grass qgis-plugin-grass-common qgis-plugin-grass-dbgsym qgis-provider-grass qgis-provider-grass-dbgsym qgis-providers qgis-providers-common qgis-providers-dbgsym qgis-server qgis-server-bin qgis-server-bin-dbgsym qgis-server-common qgis-server-landingpage qgis-server-landingpage-dbgsym qgis-server-wcs qgis-server-wcs-dbgsym qgis-server-wfs qgis-server-wfs-dbgsym
 qgis-server-wfs3 qgis-server-wfs3-dbgsym qgis-server-wms qgis-server-wms-dbgsym qgis-server-wmts qgis-server-wmts-dbgsym
 qgis-sip
Architecture: source amd64 all
Version: 3.44.13+dfsg-1~bpo13+1
Distribution: trixie-backports
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Description:
 libqgis-3d3.44.13 - QGIS - shared 3d library
 libqgis-analysis3.44.13 - QGIS - shared analysis library
 libqgis-app3.44.13 - QGIS - shared app library
 libqgis-core3.44.13 - QGIS - shared core library
 libqgis-customwidgets - QGIS custom widgets for Qt Designer
 libqgis-dev - QGIS - development files
 libqgis-gui3.44.13 - QGIS - shared gui library
 libqgis-native3.44.13 - QGIS - shared native gui library
 libqgis-server3.44.13 - QGIS - shared server library
 libqgisgrass8-3.44.13 - QGIS - shared grass library
 libqgispython3.44.13 - QGIS - shared Python library
 python3-qgis - Python bindings to QGIS
 python3-qgis-common - Python bindings to QGIS - architecture-independent files
 qgis       - Geographic Information System (GIS)
 qgis-api-doc - QGIS API documentation
 qgis-common - QGIS - architecture-independent data
 qgis-plugin-grass - GRASS plugin for QGIS
 qgis-plugin-grass-common - GRASS plugin for QGIS - architecture-independent data
 qgis-provider-grass - GRASS provider for QGIS
 qgis-providers - collection of data providers to QGIS
 qgis-providers-common - collection of data providers to QGIS - architecture-independent f
 qgis-server - QGIS server providing various OGC services
 qgis-server-bin - QGIS server providing various OGC services (executables)
 qgis-server-common - QGIS server providing various OGC services (data)
 qgis-server-landingpage - QGIS server providing various OGC services (landing page)
 qgis-server-wcs - QGIS server providing various OGC services (WCS)
 qgis-server-wfs - QGIS server providing various OGC services (WFS)
 qgis-server-wfs3 - QGIS server providing various OGC services (WFS 3)
 qgis-server-wms - QGIS server providing various OGC services (WMS)
 qgis-server-wmts - QGIS server providing various OGC services (WMTS)
 qgis-sip   - SIP specification files for QGIS
Changes:
 qgis (3.44.13+dfsg-1~bpo13+1) trixie-backports; urgency=medium
 .
   * Rebuild for trixie-backports.
 .
 qgis (3.44.13+dfsg-1) unstable; urgency=medium
 .
   * Move from experimental to unstable.
 .
 qgis (3.44.13+dfsg-1~exp1) experimental; urgency=medium
 .
   [ Pino Toscano ]
   * Drop the transitional qt5keychain-dev build dependency.
 .
   [ Bas Couwenberg ]
   * New upstream release.
Checksums-Sha1:
 19301d8da1dcdddbf3dc6fb99b4460210d29b661 5417 qgis_3.44.13+dfsg-1~bpo13+1.dsc
 7fd0e476cbf189c12e1514afaf880c7279f84c9c 132652 qgis_3.44.13+dfsg-1~bpo13+1.debian.tar.xz
 238396c7e8dad10c289e8849f076c7da26f6bb78 23091276 libqgis-3d3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5419adc083ac50afb4c0e2aac83d5c5b9fd8f46e 4521596 libqgis-3d3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8d71b412fbf43aee95b498474a5d3bebb8614073 86786248 libqgis-analysis3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e8dda37fd649232d9944fe7e12df98c65dc59263 6084208 libqgis-analysis3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e709270aa7130f7a9d5972ad13a04bb719bda451 89578324 libqgis-app3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 a20c37126de6b953c2c1565fa2e9977cbc9d1375 7739488 libqgis-app3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 afd9e5b98e31f267ac383a92f825c5e52b12a02f 232200028 libqgis-core3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 94a585b52adfb83d9d448d2ae171cd7019b3f329 17029944 libqgis-core3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 0083a4e1bc1f5c112c55450b96f12f66a14a1f0a 1873656 libqgis-customwidgets-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 bbf2e262241056bf4b103dd1d5b512400a1de026 3966708 libqgis-customwidgets_3.44.13+dfsg-1~bpo13+1_amd64.deb
 cdb81706b9d38ec69826ff81bc82af9c1d2e6d13 6231064 libqgis-dev_3.44.13+dfsg-1~bpo13+1_amd64.deb
 169b5b213980d2ddd739c88b73b401169b13e04b 164433092 libqgis-gui3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 fce703cc3154883e41f6953b5221f4f07c96ad0b 10443684 libqgis-gui3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 6712f5f07176774537ed510675a3e48d72aaa2c3 444880 libqgis-native3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5f695bcfbba58f4cab09f15e75ea9e88ed4f44b2 3937956 libqgis-native3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 165702115c2aa9dc73f32e7aa1d1d3048b0a9261 9744284 libqgis-server3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f7176afac9c35d1b430369cf4458c5114163348d 4240160 libqgis-server3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5bc9a9ea142dcd691c537b56b64129b14a3762b5 3661592 libqgisgrass8-3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 dc345010b70fe7882e4caed67b5b28cf5d0e1ed1 4121880 libqgisgrass8-3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 9c909086d6dd621346e97e5b180ac054327041e9 383516 libqgispython3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 ccbfb32cfcba62c1058b1edda74cfdcce7c25ca2 3945048 libqgispython3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 d86b0c63fc1591ba5d39404ef50c3e92c8269317 6665692 python3-qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
 c398b788d818d0a6271c483a312d8380f2126ac8 96836272 python3-qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 ffc3f162e2d26a98e800d303d3f81c974a01364d 19099712 python3-qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e84d2090b80e097e8f61580a9123108b339311fa 3224730512 qgis-api-doc_3.44.13+dfsg-1~bpo13+1_all.deb
 90594a9a3edb7a69571e6368186af2c54a2f58d5 28938784 qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
 f703b84c5ebf9257b470fc7f2e0741c0c3e6465f 9914176 qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 dc4495595c111c98d7a3e65d6210a279a713852a 4357728 qgis-plugin-grass-common_3.44.13+dfsg-1~bpo13+1_all.deb
 8be88d7f2e13907e5e48f2240d846278e7a528e7 4724072 qgis-plugin-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 db720f89dd59ca17adf551f50b6c1d6ebd0bccab 4338868 qgis-plugin-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f24582f5c6b1bc1d52031ba57c889dd2821f7c3f 1299920 qgis-provider-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 3d563724b6ed229a4c207d0d5583effdfec1e6af 3988788 qgis-provider-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
 672972f11546d32c9dffca0cb7ad7602e445973e 5380820 qgis-providers-common_3.44.13+dfsg-1~bpo13+1_all.deb
 beb2b089f03733c283872fba32d27b270db83138 70441952 qgis-providers-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 94ae55dd6e94e12e9de6e40520ffa75ce1457267 7054572 qgis-providers_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f5ca86f73b16241e4db4f7b068b3fbca87f73401 692188 qgis-server-bin-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8272de105068322b474c5e9172b58e68b74ef8ba 4055068 qgis-server-bin_3.44.13+dfsg-1~bpo13+1_amd64.deb
 4e99f66a34b734dfde2035f87ef7e0da31aac44b 4102784 qgis-server-common_3.44.13+dfsg-1~bpo13+1_all.deb
 f8f34884d9060d1c2829712beab671be452ff108 2243436 qgis-server-landingpage-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 57fee452e1be54db1d97f4a68f793552c654f1f6 3997436 qgis-server-landingpage_3.44.13+dfsg-1~bpo13+1_amd64.deb
 55b9e8487e97cf37585d6dfb73d399dfae14adbe 1237860 qgis-server-wcs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 89c261d623b8cc06bb9aa945dadf52dbdff27c20 3950440 qgis-server-wcs_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8c9e5494cd48db46b3aa477cfac3d4d5100dab11 3643540 qgis-server-wfs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 1926d1726a3d20cdc4fbdd428813aca1f4febc86 3145364 qgis-server-wfs3-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 9669054691df471573f672acd3ce55968635ff21 4094104 qgis-server-wfs3_3.44.13+dfsg-1~bpo13+1_amd64.deb
 951249dc720cf6cbfc66d2d87b3f18cc4b84fddb 4073860 qgis-server-wfs_3.44.13+dfsg-1~bpo13+1_amd64.deb
 6ecb60e9b918e1f2a8a6d01c0cdf19ae7cf8f7ea 7533428 qgis-server-wms-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 d3cda6f64329fbd3d17998c0aa493a795d7a2532 4199308 qgis-server-wms_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8886953c9e1492d1f796e83421b19214b5bb02d9 1634692 qgis-server-wmts-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 6ca93bb4986e263cf3ecd2c09345e7b023278343 3980284 qgis-server-wmts_3.44.13+dfsg-1~bpo13+1_amd64.deb
 752ab0879b1388c44981ead700b8f82631709bf9 3921692 qgis-server_3.44.13+dfsg-1~bpo13+1_amd64.deb
 90a4cad0fbe2b272f2f97caf12f2b64fcab87ef1 4980060 qgis-sip_3.44.13+dfsg-1~bpo13+1_all.deb
 9a2b9e64749427f31a9334033654960509b3309c 45053 qgis_3.44.13+dfsg-1~bpo13+1_amd64.buildinfo
 5ed0eedc3a5018717aeaebe7ddee210500beb605 8310728 qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb
Checksums-Sha256:
 42648d5803997d8167ae859c0464c38e0b9943484c4e492d8733a284c6b4e140 5417 qgis_3.44.13+dfsg-1~bpo13+1.dsc
 029f05b5534f01d8c027280a3f16af9789eebde25cf474f285e68255dda0b5ef 132652 qgis_3.44.13+dfsg-1~bpo13+1.debian.tar.xz
 b8b528b5985ffebbf9bb100c97ca73fbef782a753812779feca5abc40701b705 23091276 libqgis-3d3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 d26895e6ab5b812f5fa60ffffe7af3ec29d377c6cf2ac479e12be4cc4638993d 4521596 libqgis-3d3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 25701cf79cb322c9c4cda9772b0b95ee0f45159ad281a197933d7f5f59f007d8 86786248 libqgis-analysis3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 18fa52e6d5086daad0e6ad1ecb216ce75b5293de9b744e9cf5104a446ec9a790 6084208 libqgis-analysis3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5f9ff708b31505fed58b60c981592f57d8e11499b3d6707bceeee461019412d6 89578324 libqgis-app3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 383f1bb9bce21f13a1d60aebe9a3d27212eb8a90918598e6abf6048276b99436 7739488 libqgis-app3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e9b480e96d1cd251479dd91afa931a71cbd6f6eb431d651739c7fb90b26aaed2 232200028 libqgis-core3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 06700b3a60f7dad60b2b1f1ac2af34f14ae3dd975def7d99ad7f43d693f1e090 17029944 libqgis-core3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8491ad4d1fac13d767c82f401ecbdd469e2df28b9408137ed497cce4d6a70156 1873656 libqgis-customwidgets-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5a91099579cf289888b768d6cdd7cffb23c5a8dfee318dff7e47f02926e593e8 3966708 libqgis-customwidgets_3.44.13+dfsg-1~bpo13+1_amd64.deb
 4a3b670119b65ba8eec7544718d89ba1f33befa3ad68085feeba840f7c04ab8a 6231064 libqgis-dev_3.44.13+dfsg-1~bpo13+1_amd64.deb
 a533f8587595df73eac8e66062a75b93051429a3abdf5b77580e9b78296a430a 164433092 libqgis-gui3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 3959925d1c46fb9f0e4d466016640a34a8a44b44b832c67f653f4dc76a33f8d2 10443684 libqgis-gui3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 dadd28bf0f10768e8106747450f57c4a92e516035204fb7f13a6df7a3e79ce22 444880 libqgis-native3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 79c14ffba4ba698e2c99574c88d324c8803186d15b5568a568553be611df3bb8 3937956 libqgis-native3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 c12fe0d4c3cf788ce37245c654886108bca652064156fb5ff512a2b06a09604e 9744284 libqgis-server3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 3f2687a455407cc8424d4f43b59d0108ffd61c2f30ed65e074db18e2d416d971 4240160 libqgis-server3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f470ec2e95c634ef65aabc697262a04cfefaf313776f6527560566c4b1c8283f 3661592 libqgisgrass8-3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 28ba66164f437e264b9df0c11c6066c0fa0129e32b4b71b6946d9803a7ad92b3 4121880 libqgisgrass8-3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 ae19ed63805a0d2ee0442f01662a667a8cee6a5be19b7343dc2fa7f90ba90183 383516 libqgispython3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 6b9dc17fba0ea589aba55b23c19daef5021a9a11e24372e4716e3f117c0a7560 3945048 libqgispython3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 dc7493e38900f86ca9d290c16fa8fc16b5612c56ab927af595344cffd50e54aa 6665692 python3-qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
 231d898a26fcfa3a7612b132d9ac3a6f639613f909171efab00d1c730bd0cb41 96836272 python3-qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 2172d6e3975d56792dce69c659c264a8576b7b4384344c436d04521e25b579d2 19099712 python3-qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb
 2ce664b67fd07f2b6dc15034a2130be456cfcf79bd333e8750b32f75de15e20d 3224730512 qgis-api-doc_3.44.13+dfsg-1~bpo13+1_all.deb
 9ef2d1f72526f0043e36906d89581b008555546aca27a0ef09e8ba53a442f3b1 28938784 qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
 0861ddc9e350130db1bb170c64fbe114d63d87e56f019ce4918acdc7ec95e963 9914176 qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 47bd03a44803835c3f4aed0bafc706d5676490a4241d6ab47530db774b62cbef 4357728 qgis-plugin-grass-common_3.44.13+dfsg-1~bpo13+1_all.deb
 00e05ecee463f4b71bc9263ce7fd645d940c61a93802c44af82de5928e475b8f 4724072 qgis-plugin-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 56923ed9be539e8f389794c6c57761b2f8b34567d3cb340d612ad1cd0f99027d 4338868 qgis-plugin-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
 69eaed6c2b27d81c1684f2521d0517c4d0c758c9c718e10d3cae02167bbb9a0a 1299920 qgis-provider-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e751fe2ae950c5fb3c917869c45551e6b2c577cb26b0a06c87510d85fbfe58f6 3988788 qgis-provider-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8e8cd887e46d2e95a18a201f10a7861a84cc8d563dbe4dd1641285678b85f2a9 5380820 qgis-providers-common_3.44.13+dfsg-1~bpo13+1_all.deb
 651a42afdcdbb82ad7e8fd03688fb81b62539a83af3e94cacfb67852c5917aad 70441952 qgis-providers-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 1dd60578440808a33f65c0a1448f749d839d3402f9df60e3c376a53886b4dad5 7054572 qgis-providers_3.44.13+dfsg-1~bpo13+1_amd64.deb
 41647bd8543b7d692bd197a07b7526993429dda2a38103dfe433473d501fb0e7 692188 qgis-server-bin-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 54322dedc36f37899d35317daa84182d093d125762774609ebef9e2f32aba3d9 4055068 qgis-server-bin_3.44.13+dfsg-1~bpo13+1_amd64.deb
 d26871810004698f6d9945afbd88cf27f575d40b42c431726e4db8f97322e59e 4102784 qgis-server-common_3.44.13+dfsg-1~bpo13+1_all.deb
 3c368cca0492efb4239a90b8d4698f763c20341d22da28a3bc5902fa623dcdcf 2243436 qgis-server-landingpage-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 7c4ea9fad2e5cdc7c85403c01ae1e0c575f054744811f49a63850c4505159501 3997436 qgis-server-landingpage_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f20a7de1c57e57fd5b67101ed81727fd566610b329aaa6bb844b79063ffdcacf 1237860 qgis-server-wcs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 2f8ee1a1c6d1d358b128437b7a6a096f2e105aa9ee1dc3f6eeae56b492a3d3f9 3950440 qgis-server-wcs_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e4897903fa05b85ac394ad2520102d0e6d53e7199e0db239359fa89c8c1df750 3643540 qgis-server-wfs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 cdea1bef9b52552ea8d3fafb3e8daea0f9a4ccc74f89313635e7868d5c2cf32d 3145364 qgis-server-wfs3-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 70f7b9864612c91de7b4662c8e4d206b146ca29604c2d3bd604837c3add79631 4094104 qgis-server-wfs3_3.44.13+dfsg-1~bpo13+1_amd64.deb
 ccc2e79cc06d6832a1ffae13f7b33f4e10b1b2b94f5b2f02c05637fcf9410c45 4073860 qgis-server-wfs_3.44.13+dfsg-1~bpo13+1_amd64.deb
 19b830974a78897e3e6959250b3007fc2d4cdf2fa9d2f4792b9adc8aa1f053ef 7533428 qgis-server-wms-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 1d3c1671d32d41660e48a6c85cbb1d87faae6454b6b5ab6e0bb1eae34275a6d9 4199308 qgis-server-wms_3.44.13+dfsg-1~bpo13+1_amd64.deb
 4e824c23281d580d2b3654bdb0628a114baee1a6429833c4d9410ec9ee3d470e 1634692 qgis-server-wmts-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 c432e84281e02ceb4ef126c2de2b44ccc458caf87a828d665a59730888bd25a4 3980284 qgis-server-wmts_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5d9923db477ba887f770ad6d91c1cc8b168790f3f9142ad656154a7b2ec514b0 3921692 qgis-server_3.44.13+dfsg-1~bpo13+1_amd64.deb
 0da665abd48dcb7f574d987fd407a4745a5d56fa7bb3dc7ceb543444cea4c06c 4980060 qgis-sip_3.44.13+dfsg-1~bpo13+1_all.deb
 855fe6f71e1c964f0cf1fb56c18acf64626077fd53600753a6f1785549e00172 45053 qgis_3.44.13+dfsg-1~bpo13+1_amd64.buildinfo
 25720cf9ce6648ee7ca4dee0ba12cdb70abf6c947953e2e2c60ef5592fa72b52 8310728 qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb
Files:
 3f5bcbb81fc1e253ae0ef733ffb0b4bc 5417 science optional qgis_3.44.13+dfsg-1~bpo13+1.dsc
 64e5f59e830b637e86ecb8c3f496c1c2 132652 science optional qgis_3.44.13+dfsg-1~bpo13+1.debian.tar.xz
 7780ed3c1cc4ecc36fb97bf45ee89460 23091276 debug optional libqgis-3d3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 4e29cda5b73f0c6b1db994c87cea432d 4521596 libs optional libqgis-3d3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 03ae1856ad7e9fa0f3075cbbd2de7543 86786248 debug optional libqgis-analysis3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 b4b51f3544734ba0a47943429a624968 6084208 libs optional libqgis-analysis3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f20b5ac5a6ebad508edde6fb5f4b0aad 89578324 debug optional libqgis-app3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e78d07de7e47cf727bae7ce7b4bec541 7739488 libs optional libqgis-app3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 a83cfc4e8e718c79462d164272d88293 232200028 debug optional libqgis-core3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e3260c5102ec09588830ac5a3eb1198e 17029944 libs optional libqgis-core3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 42e33f1105c594185017e5efabe773d5 1873656 debug optional libqgis-customwidgets-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8c5f5ee6b3aeb31c14eee3939916469b 3966708 science optional libqgis-customwidgets_3.44.13+dfsg-1~bpo13+1_amd64.deb
 03ff98bb8ca56f81f4ac1308231876dc 6231064 libdevel optional libqgis-dev_3.44.13+dfsg-1~bpo13+1_amd64.deb
 a2d5ed271ba3856662ce377b46823666 164433092 debug optional libqgis-gui3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8f81bf3fae46fca67ed0f56ff66d3ad5 10443684 libs optional libqgis-gui3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 b8a5e235f387f54c1357b29a7b3cb5bf 444880 debug optional libqgis-native3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 d07c75ae48a142ada159c94b54e60b4b 3937956 libs optional libqgis-native3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 1a9c58c8812cafde39b6fe4f0bda1019 9744284 debug optional libqgis-server3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 c5e643f48f8a870fbfc9b9ee1fb1b48b 4240160 libs optional libqgis-server3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 2fc45477ccacd143401727575c1a89d6 3661592 debug optional libqgisgrass8-3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5d15781719b30ba496085caf85a31481 4121880 libs optional libqgisgrass8-3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 4e8d4a67aed47c811200b64f3521842f 383516 debug optional libqgispython3.44.13-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f1241d26f3c3ea17a669c553c6e232e8 3945048 libs optional libqgispython3.44.13_3.44.13+dfsg-1~bpo13+1_amd64.deb
 65229d7d3d44a6938854b88507983e8d 6665692 python optional python3-qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
 8586fb76f7153b52dc04eef674dae0bf 96836272 debug optional python3-qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 4afc5df85d63896eab3b0406b9a49c0e 19099712 python optional python3-qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb
 a15008fdaf30ca7293522d52cd4e894f 3224730512 doc optional qgis-api-doc_3.44.13+dfsg-1~bpo13+1_all.deb
 c7dfcfcf0e07733a6b40e1dd76a52016 28938784 science optional qgis-common_3.44.13+dfsg-1~bpo13+1_all.deb
 b050344f5b4aa8657b27c670dd45c79b 9914176 debug optional qgis-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 b6a690d85f9ca16f0609a2b7a0a14a52 4357728 science optional qgis-plugin-grass-common_3.44.13+dfsg-1~bpo13+1_all.deb
 916262cab2e88ffbf14e85e08c784bdf 4724072 debug optional qgis-plugin-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 f032b3bfc1fc49873f6267ecb72f8820 4338868 science optional qgis-plugin-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
 58c6f5fba06a0c4f938a4b0f67f86d32 1299920 debug optional qgis-provider-grass-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 fccec98ad33c2980679521a15cfca060 3988788 science optional qgis-provider-grass_3.44.13+dfsg-1~bpo13+1_amd64.deb
 a4acad66a5e3e45bccea4717125585f3 5380820 science optional qgis-providers-common_3.44.13+dfsg-1~bpo13+1_all.deb
 a2d388063e6c82f08968553f3e92762b 70441952 debug optional qgis-providers-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e1c9bdbc03bfbbb104204ff36d94b5b3 7054572 science optional qgis-providers_3.44.13+dfsg-1~bpo13+1_amd64.deb
 ee2d9f7255a9a02bc248b640ef9a62c4 692188 debug optional qgis-server-bin-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 ed1d8b01c345b60391c9a55e461e828a 4055068 science optional qgis-server-bin_3.44.13+dfsg-1~bpo13+1_amd64.deb
 4fcade02337eeabecce4c3e747edf7b1 4102784 science optional qgis-server-common_3.44.13+dfsg-1~bpo13+1_all.deb
 5089c9d9c064020197eba5e35e173cf3 2243436 debug optional qgis-server-landingpage-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 7045d793b256ded528baac4393bdc701 3997436 science optional qgis-server-landingpage_3.44.13+dfsg-1~bpo13+1_amd64.deb
 e138509821d9fe1776284f65f48e0591 1237860 debug optional qgis-server-wcs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 ff96eecf00c9641c7bfdaa58aab46b2b 3950440 science optional qgis-server-wcs_3.44.13+dfsg-1~bpo13+1_amd64.deb
 8f9eea636c7812f669738decbe845e17 3643540 debug optional qgis-server-wfs-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 df91600173b040e789ac2db8ac34222e 3145364 debug optional qgis-server-wfs3-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5f662af8a7ee4ed5c2fcbacd83436cc7 4094104 science optional qgis-server-wfs3_3.44.13+dfsg-1~bpo13+1_amd64.deb
 6a846a65288989b4fdaccdff38f74fa5 4073860 science optional qgis-server-wfs_3.44.13+dfsg-1~bpo13+1_amd64.deb
 6e01934fc5609d91133a9e176c416e58 7533428 debug optional qgis-server-wms-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 40345285534f59124b82270d7a11b7c2 4199308 science optional qgis-server-wms_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5ed16caaa56431d83205bb2145f2a5a3 1634692 debug optional qgis-server-wmts-dbgsym_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5b6fdbcafc390c90e37dc64723b2b02f 3980284 science optional qgis-server-wmts_3.44.13+dfsg-1~bpo13+1_amd64.deb
 5d9484aa47e029b7be5116d37e4e6cc2 3921692 science optional qgis-server_3.44.13+dfsg-1~bpo13+1_amd64.deb
 a559eded365b3cf92821ddfaf38a4006 4980060 devel optional qgis-sip_3.44.13+dfsg-1~bpo13+1_all.deb
 4d1eb5ec92f88a8e84e96e541ea25711 45053 science optional qgis_3.44.13+dfsg-1~bpo13+1_amd64.buildinfo
 e03fdead83d2551b2298b42cf942b07d 8310728 science optional qgis_3.44.13+dfsg-1~bpo13+1_amd64.deb

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmp0fVYACgkQZ1DxCuiN
SvGUMhAAkl+XvyeYYBJ+Jgs6kpWTWbsXEO8jbm5eyZ+BoGi74hv/AV0Lqp0xxZ1W
+z84GUUQge78xslA8hAReswg5KnU/t38MCooN+691OwPqVMel56loqWYy64zQdTH
3qnq8sfyPXZC0zndafuhUtcWyHAcLCGO//fEEPfXvttB4d7wQEhbMtbi2mJCFw5c
one87BbnY5uRtToZ6r75INiaPwl36l+e+9fXJpf9oShkodOacqPkh0e81P5fV/G2
xe/5kbR3gIqyS+70hgm0qbf3SW5+wnOX2pddjnl2GnHZk0taknreaa60f+jUz6A9
DRwrJe0frkm1+38xskHzOKLM9XERRFx9actmGfwWMqdoYLezx4q7Bb20QzSUrYt+
wlYAM9n2TvupHgbzZke6bKikpYv/tSH6/RGzM6s3J/ccXAVm7INrQPK0sE8UQvre
kmZ4m3AvaCsCS6gTH54Z+5aw+PshqKBxRY1oMyG/hmEx5+U8mPtveGMq+dhKeHv1
ke+zQGbyuTQaRwZ3LBP7d6gzAHCPTWu2lx0xwhKvw/ol7vu/0dP0ZYWXAtK7vzh+
MdtBCD3Mg4CwxsKoWrGIkuOcmv+5CEP7jww3SvItUvOB8js8OlcXozQqTFUREp4P
RGLhjxfuJl6KCaz5pdbEDVmD5UnmhyrSaK+O9EHFPy1H8tKBpoU=
=j+Su
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/3dc369f1/attachment-0001.sig>

From gitlab at salsa.debian.org  Sat Aug  8 16:38:26 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 15:38:26 +0000
Subject: [Git][debian-gis-team/stac-validator] Pushed new tag debian/4.5.2-1
Message-ID: <6a774d7212fc9_537fb0044224de@godard.mail>



Antonio Valentino pushed new tag debian/4.5.2-1 at Debian GIS Project / stac-validator

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/tree/debian/4.5.2-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/399b1b53/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 16:38:28 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 15:38:28 +0000
Subject: [Git][debian-gis-team/stac-validator] Pushed new tag upstream/4.5.2
Message-ID: <6a774d748e115_53712f1ec4226e4@godard.mail>



Antonio Valentino pushed new tag upstream/4.5.2 at Debian GIS Project / stac-validator

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/tree/upstream/4.5.2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/bfeb7ffb/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 16:38:38 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 15:38:38 +0000
Subject: [Git][debian-gis-team/stac-validator][master] 5 commits: New upstream
 version 4.5.2
Message-ID: <6a774d7ecc7ab_537fb50442282e@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / stac-validator


Commits:
da756b87 by Antonio Valentino at 2026-08-08T15:15:56+00:00
New upstream version 4.5.2
- - - - -
cad35bed by Antonio Valentino at 2026-08-08T15:16:17+00:00
Update upstream source from tag 'upstream/4.5.2'

Update to upstream version '4.5.2'
with Debian dir 1d16ee2bc1cf45b6e677843ea4a1d2a8c478250c
- - - - -
e3811e77 by Antonio Valentino at 2026-08-08T15:16:52+00:00
New upstream release

- - - - -
1fbe2d09 by Antonio Valentino at 2026-08-08T15:27:58+00:00
Refresh all patches

- - - - -
1bcd735d by Antonio Valentino at 2026-08-08T15:27:58+00:00
Set distribution to unstable

- - - - -


6 changed files:

- CHANGELOG.md
- debian/changelog
- debian/patches/0001-No-network.patch
- pyproject.toml
- stac_validator/fast_validator.py
- + tests/test_heavy_extensions.py


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -10,10 +10,16 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 
 ### Changed
 
-### Fixed 
+### Fixed
 
 ### Removed
 
+## [v4.5.2] - 2026-08-05
+
+### Fixed
+
+- Fixed timeout issue when validating STAC Collections with many extensions by implementing three-tier base schema compilation strategy: standard patching ? aggressive patching ? cached jsonschema fallback with proper RefResolver. [#307](https://github.com/stac-utils/stac-validator/pull/307)
+
 ## [v4.5.1] - 2026-07-30
 
 ### Changed
@@ -484,7 +490,8 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 - With the newest version - 1.0.0-beta.2 - items will run through jsonchema validation before the PySTAC validation. The reason for this is that jsonschema will give more informative error messages. This should be addressed better in the future. This is not the case with the --recursive option as time can be a concern here with larger collections.
 - Logging. Various additions were made here depending on the options selected. This was done to help assist people to update their STAC collections.
 
-[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.5.1..main
+[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.5.2..main
+[v4.5.2]: https://github.com/sparkgeo/stac-validator/compare/v4.5.1..v4.5.2
 [v4.5.1]: https://github.com/sparkgeo/stac-validator/compare/v4.5.0..v4.5.1
 [v4.5.0]: https://github.com/sparkgeo/stac-validator/compare/v4.4.0..v4.5.0
 [v4.4.0]: https://github.com/sparkgeo/stac-validator/compare/v4.3.0..v4.4.0


=====================================
debian/changelog
=====================================
@@ -1,3 +1,11 @@
+stac-validator (4.5.2-1) unstable; urgency=medium
+
+  * New upstream release.
+  * debian/control:
+    - Refresh all patches.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Sat, 08 Aug 2026 15:16:59 +0000
+
 stac-validator (4.5.1-1) unstable; urgency=medium
 
   * New upstream release.


=====================================
debian/patches/0001-No-network.patch
=====================================
@@ -14,6 +14,7 @@ Forwarded: not-needed
  tests/test_extensions.py               | 12 ++++++++++++
  tests/test_fast_validator.py           | 22 ++++++++++++++++++++++
  tests/test_header.py                   |  2 ++
+ tests/test_heavy_extensions.py         |  4 ++++
  tests/test_links.py                    |  4 ++++
  tests/test_pydantic.py                 |  3 +++
  tests/test_recursion.py                | 14 ++++++++++++++
@@ -22,10 +23,10 @@ Forwarded: not-needed
  tests/test_validate_collections.py     |  3 +++
  tests/test_validate_dict.py            |  4 ++++
  tests/test_validate_item_collection.py |  7 +++++++
- 18 files changed, 131 insertions(+), 1 deletion(-)
+ 19 files changed, 135 insertions(+), 1 deletion(-)
 
 diff --git a/pyproject.toml b/pyproject.toml
-index 6a8e955..86a4fc3 100644
+index 2e37a0f..f9e1cdd 100644
 --- a/pyproject.toml
 +++ b/pyproject.toml
 @@ -73,4 +73,9 @@ stac-validator = "stac_validator.stac_validator:cli"
@@ -698,6 +699,39 @@ index 6203bd0..872048b 100644
  def test_header():
      stac_file = "tests/test_data/v110/simple-item.json"
      url = "https://localhost/" + stac_file
+diff --git a/tests/test_heavy_extensions.py b/tests/test_heavy_extensions.py
+index 2caafef..94189db 100644
+--- a/tests/test_heavy_extensions.py
++++ b/tests/test_heavy_extensions.py
+@@ -3,10 +3,12 @@ Test validation of STAC Items and Collections with heavy extension loads.
+ This ensures the three-tier fallback strategy (fastjsonschema -> aggressive patching -> jsonschema) works correctly.
+ """
+ 
++import pytest
+ 
+ class TestHeavyExtensions:
+     """Test validation with many extensions to stress the compiler."""
+ 
++    @pytest.mark.network
+     def test_item_with_15_extensions(self, tmp_path):
+         """Test that a STAC Item with 15 extensions compiles without hanging."""
+         from stac_validator.fast_validator import get_validator
+@@ -35,6 +37,7 @@ class TestHeavyExtensions:
+         assert validator is not None
+         assert callable(validator)
+ 
++    @pytest.mark.network
+     def test_collection_with_12_extensions(self, tmp_path):
+         """Test that a STAC Collection with 12 extensions compiles without hanging."""
+         from stac_validator.fast_validator import get_validator
+@@ -60,6 +63,7 @@ class TestHeavyExtensions:
+         assert validator is not None
+         assert callable(validator)
+ 
++    @pytest.mark.network
+     def test_compilation_performance(self):
+         """Test that compilation is fast and caching works."""
+         import time
 diff --git a/tests/test_links.py b/tests/test_links.py
 index 913bd13..de88ed0 100644
 --- a/tests/test_links.py


=====================================
pyproject.toml
=====================================
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "stac_valid"
-version = "4.5.1"
+version = "4.5.2"
 description = "A package to validate STAC files"
 authors = [
     {name = "Jonathan Healy", email = "jon at healy-hyperspatial.dev"},


=====================================
stac_validator/fast_validator.py
=====================================
@@ -158,23 +158,52 @@ def get_validator(stac_type: str, stac_version: str, extensions: List[str]):
     else:
         raise ValueError(f"Unknown STAC type for validation: {stac_type}")
 
-    # Fetch and compile the Base Schema directly
-    base_schema = fetch_schema(base_uri)
+    # Fetch the raw Base Schema directly
+    raw_base_schema = fetch_schema(base_uri)
+
     try:
-        # Try to compile with fastjsonschema first
+        # Tier 1: Try to compile with standard patching first
+        optimized_base = optimize_schema_for_compiler(raw_base_schema)
         base_validator = fastjsonschema.compile(
-            base_schema, handlers={"http": fetch_schema, "https": fetch_schema}
+            optimized_base, handlers={"http": fetch_schema, "https": fetch_schema}
+        )
+        logger.debug(
+            f"Base schema {stac_type} {stac_version} compiled with fastjsonschema"
         )
     except Exception:
-        # If base schema fails to compile, use jsonschema validator instead
-        import jsonschema
+        try:
+            # Tier 2: If it fails, try aggressive patching (stripping allOf/oneOf/anyOf)
+            optimized_base = optimize_schema_for_compiler(
+                raw_base_schema, remove_allof=True
+            )
+            base_validator = fastjsonschema.compile(
+                optimized_base, handlers={"http": fetch_schema, "https": fetch_schema}
+            )
+            logger.debug(
+                f"Base schema {stac_type} {stac_version} compiled with fastjsonschema (aggressive patching)"
+            )
+        except Exception:
+            # Tier 3: THE ULTIMATE FALLBACK
+            # If fastjsonschema completely chokes, instantiate a cached jsonschema validator
+            # that is strictly wired to use our high-speed fetch_schema session.
+            import jsonschema
+
+            resolver = jsonschema.RefResolver(
+                base_uri=base_uri,
+                referrer=raw_base_schema,
+                handlers={"http": fetch_schema, "https": fetch_schema},
+            )
+            ValidatorClass = jsonschema.validators.validator_for(raw_base_schema)
 
-        def base_validator(data):
-            jsonschema.validate(data, base_schema)
+            # Pre-compile the jsonschema object ONCE, outside the execution loop
+            js_validator = ValidatorClass(raw_base_schema, resolver=resolver)
 
-        logger.debug(
-            f"Base schema {stac_type} {stac_version} compiled with jsonschema fallback"
-        )
+            def base_validator(data):
+                js_validator.validate(data)
+
+            logger.debug(
+                f"Base schema {stac_type} {stac_version} compiled with cached jsonschema fallback"
+            )
 
     ext_validators = []
     skipped_extensions = []


=====================================
tests/test_heavy_extensions.py
=====================================
@@ -0,0 +1,90 @@
+"""
+Test validation of STAC Items and Collections with heavy extension loads.
+This ensures the three-tier fallback strategy (fastjsonschema -> aggressive patching -> jsonschema) works correctly.
+"""
+
+
+class TestHeavyExtensions:
+    """Test validation with many extensions to stress the compiler."""
+
+    def test_item_with_15_extensions(self, tmp_path):
+        """Test that a STAC Item with 15 extensions compiles without hanging."""
+        from stac_validator.fast_validator import get_validator
+
+        # Test that get_validator can compile 15 extensions without hanging
+        extensions = [
+            "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/view/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/raster/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/classification/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/processing/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/sat/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/alternate-assets/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/authentication/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/timestamps/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/product/v1.0.0/schema.json",
+            "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+            "https://stac-extensions.github.io/storage/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/scientific/v1.0.0/schema.json",
+        ]
+
+        # Should compile all 15 extensions without hanging or errors
+        validator, cached = get_validator("Item", "1.0.0", extensions)
+        assert validator is not None
+        assert callable(validator)
+
+    def test_collection_with_12_extensions(self, tmp_path):
+        """Test that a STAC Collection with 12 extensions compiles without hanging."""
+        from stac_validator.fast_validator import get_validator
+
+        # Test that get_validator can compile 12 extensions for a collection without hanging
+        extensions = [
+            "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/authentication/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/processing/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/product/v0.1.0/schema.json",
+            "https://stac-extensions.github.io/scientific/v1.0.0/schema.json",
+            "https://stac-extensions.github.io/alternate-assets/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/raster/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/sat/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/classification/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/ceos-ard/v0.2.0/schema.json",
+            "https://stac-extensions.github.io/storage/v2.0.0/schema.json",
+        ]
+
+        # Should compile all 12 extensions without hanging or errors
+        validator, cached = get_validator("Collection", "1.1.0", extensions)
+        assert validator is not None
+        assert callable(validator)
+
+    def test_compilation_performance(self):
+        """Test that compilation is fast and caching works."""
+        import time
+
+        from stac_validator.fast_validator import get_validator
+
+        extensions = [
+            "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/view/v1.1.0/schema.json",
+        ]
+
+        # First compilation (cache miss)
+        start = time.time()
+        validator1, cached1 = get_validator("Item", "1.0.0", extensions)
+        first_time = time.time() - start
+        assert cached1 is False, "First call should be a cache miss"
+
+        # Second compilation (cache hit)
+        start = time.time()
+        validator2, cached2 = get_validator("Item", "1.0.0", extensions)
+        second_time = time.time() - start
+        assert cached2 is True, "Second call should be a cache hit"
+
+        # Second compilation should be significantly faster (at least 10x)
+        assert (
+            second_time < first_time / 10
+        ), f"Cache not working: {first_time:.3f}s -> {second_time:.3f}s"



View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/compare/8975b43d9733b774dd39decbf7e90c85d423da39...1bcd735d41691cae3a207053718fa5c58ee658c9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/compare/8975b43d9733b774dd39decbf7e90c85d423da39...1bcd735d41691cae3a207053718fa5c58ee658c9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/b3db2d06/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  8 16:38:45 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 15:38:45 +0000
Subject: [Git][debian-gis-team/stac-validator][upstream] New upstream version
 4.5.2
Message-ID: <6a774d853c226_537fb42842302b@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / stac-validator


Commits:
da756b87 by Antonio Valentino at 2026-08-08T15:15:56+00:00
New upstream version 4.5.2
- - - - -


4 changed files:

- CHANGELOG.md
- pyproject.toml
- stac_validator/fast_validator.py
- + tests/test_heavy_extensions.py


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -10,10 +10,16 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 
 ### Changed
 
-### Fixed 
+### Fixed
 
 ### Removed
 
+## [v4.5.2] - 2026-08-05
+
+### Fixed
+
+- Fixed timeout issue when validating STAC Collections with many extensions by implementing three-tier base schema compilation strategy: standard patching ? aggressive patching ? cached jsonschema fallback with proper RefResolver. [#307](https://github.com/stac-utils/stac-validator/pull/307)
+
 ## [v4.5.1] - 2026-07-30
 
 ### Changed
@@ -484,7 +490,8 @@ The format is (loosely) based on [Keep a Changelog](http://keepachangelog.com/)
 - With the newest version - 1.0.0-beta.2 - items will run through jsonchema validation before the PySTAC validation. The reason for this is that jsonschema will give more informative error messages. This should be addressed better in the future. This is not the case with the --recursive option as time can be a concern here with larger collections.
 - Logging. Various additions were made here depending on the options selected. This was done to help assist people to update their STAC collections.
 
-[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.5.1..main
+[Unreleased]: https://github.com/sparkgeo/stac-validator/compare/v4.5.2..main
+[v4.5.2]: https://github.com/sparkgeo/stac-validator/compare/v4.5.1..v4.5.2
 [v4.5.1]: https://github.com/sparkgeo/stac-validator/compare/v4.5.0..v4.5.1
 [v4.5.0]: https://github.com/sparkgeo/stac-validator/compare/v4.4.0..v4.5.0
 [v4.4.0]: https://github.com/sparkgeo/stac-validator/compare/v4.3.0..v4.4.0


=====================================
pyproject.toml
=====================================
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "stac_valid"
-version = "4.5.1"
+version = "4.5.2"
 description = "A package to validate STAC files"
 authors = [
     {name = "Jonathan Healy", email = "jon at healy-hyperspatial.dev"},


=====================================
stac_validator/fast_validator.py
=====================================
@@ -158,23 +158,52 @@ def get_validator(stac_type: str, stac_version: str, extensions: List[str]):
     else:
         raise ValueError(f"Unknown STAC type for validation: {stac_type}")
 
-    # Fetch and compile the Base Schema directly
-    base_schema = fetch_schema(base_uri)
+    # Fetch the raw Base Schema directly
+    raw_base_schema = fetch_schema(base_uri)
+
     try:
-        # Try to compile with fastjsonschema first
+        # Tier 1: Try to compile with standard patching first
+        optimized_base = optimize_schema_for_compiler(raw_base_schema)
         base_validator = fastjsonschema.compile(
-            base_schema, handlers={"http": fetch_schema, "https": fetch_schema}
+            optimized_base, handlers={"http": fetch_schema, "https": fetch_schema}
+        )
+        logger.debug(
+            f"Base schema {stac_type} {stac_version} compiled with fastjsonschema"
         )
     except Exception:
-        # If base schema fails to compile, use jsonschema validator instead
-        import jsonschema
+        try:
+            # Tier 2: If it fails, try aggressive patching (stripping allOf/oneOf/anyOf)
+            optimized_base = optimize_schema_for_compiler(
+                raw_base_schema, remove_allof=True
+            )
+            base_validator = fastjsonschema.compile(
+                optimized_base, handlers={"http": fetch_schema, "https": fetch_schema}
+            )
+            logger.debug(
+                f"Base schema {stac_type} {stac_version} compiled with fastjsonschema (aggressive patching)"
+            )
+        except Exception:
+            # Tier 3: THE ULTIMATE FALLBACK
+            # If fastjsonschema completely chokes, instantiate a cached jsonschema validator
+            # that is strictly wired to use our high-speed fetch_schema session.
+            import jsonschema
+
+            resolver = jsonschema.RefResolver(
+                base_uri=base_uri,
+                referrer=raw_base_schema,
+                handlers={"http": fetch_schema, "https": fetch_schema},
+            )
+            ValidatorClass = jsonschema.validators.validator_for(raw_base_schema)
 
-        def base_validator(data):
-            jsonschema.validate(data, base_schema)
+            # Pre-compile the jsonschema object ONCE, outside the execution loop
+            js_validator = ValidatorClass(raw_base_schema, resolver=resolver)
 
-        logger.debug(
-            f"Base schema {stac_type} {stac_version} compiled with jsonschema fallback"
-        )
+            def base_validator(data):
+                js_validator.validate(data)
+
+            logger.debug(
+                f"Base schema {stac_type} {stac_version} compiled with cached jsonschema fallback"
+            )
 
     ext_validators = []
     skipped_extensions = []


=====================================
tests/test_heavy_extensions.py
=====================================
@@ -0,0 +1,90 @@
+"""
+Test validation of STAC Items and Collections with heavy extension loads.
+This ensures the three-tier fallback strategy (fastjsonschema -> aggressive patching -> jsonschema) works correctly.
+"""
+
+
+class TestHeavyExtensions:
+    """Test validation with many extensions to stress the compiler."""
+
+    def test_item_with_15_extensions(self, tmp_path):
+        """Test that a STAC Item with 15 extensions compiles without hanging."""
+        from stac_validator.fast_validator import get_validator
+
+        # Test that get_validator can compile 15 extensions without hanging
+        extensions = [
+            "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/view/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/raster/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/classification/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/processing/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/sat/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/alternate-assets/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/authentication/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/timestamps/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/product/v1.0.0/schema.json",
+            "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+            "https://stac-extensions.github.io/storage/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/scientific/v1.0.0/schema.json",
+        ]
+
+        # Should compile all 15 extensions without hanging or errors
+        validator, cached = get_validator("Item", "1.0.0", extensions)
+        assert validator is not None
+        assert callable(validator)
+
+    def test_collection_with_12_extensions(self, tmp_path):
+        """Test that a STAC Collection with 12 extensions compiles without hanging."""
+        from stac_validator.fast_validator import get_validator
+
+        # Test that get_validator can compile 12 extensions for a collection without hanging
+        extensions = [
+            "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/authentication/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/processing/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/product/v0.1.0/schema.json",
+            "https://stac-extensions.github.io/scientific/v1.0.0/schema.json",
+            "https://stac-extensions.github.io/alternate-assets/v1.2.0/schema.json",
+            "https://stac-extensions.github.io/raster/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/sat/v1.1.0/schema.json",
+            "https://stac-extensions.github.io/classification/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/ceos-ard/v0.2.0/schema.json",
+            "https://stac-extensions.github.io/storage/v2.0.0/schema.json",
+        ]
+
+        # Should compile all 12 extensions without hanging or errors
+        validator, cached = get_validator("Collection", "1.1.0", extensions)
+        assert validator is not None
+        assert callable(validator)
+
+    def test_compilation_performance(self):
+        """Test that compilation is fast and caching works."""
+        import time
+
+        from stac_validator.fast_validator import get_validator
+
+        extensions = [
+            "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+            "https://stac-extensions.github.io/view/v1.1.0/schema.json",
+        ]
+
+        # First compilation (cache miss)
+        start = time.time()
+        validator1, cached1 = get_validator("Item", "1.0.0", extensions)
+        first_time = time.time() - start
+        assert cached1 is False, "First call should be a cache miss"
+
+        # Second compilation (cache hit)
+        start = time.time()
+        validator2, cached2 = get_validator("Item", "1.0.0", extensions)
+        second_time = time.time() - start
+        assert cached2 is True, "Second call should be a cache hit"
+
+        # Second compilation should be significantly faster (at least 10x)
+        assert (
+            second_time < first_time / 10
+        ), f"Cache not working: {first_time:.3f}s -> {second_time:.3f}s"



View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/da756b87cfb47367027d04f50e4df06a521d4d06

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/da756b87cfb47367027d04f50e4df06a521d4d06
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/b8f121cb/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  8 16:38:46 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 15:38:46 +0000
Subject: [Git][debian-gis-team/stac-validator][pristine-tar] pristine-tar data
 for stac-validator_4.5.2.orig.tar.gz
Message-ID: <6a774d8685710_537fb2704232bc@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / stac-validator


Commits:
63a5edcd by Antonio Valentino at 2026-08-08T15:16:16+00:00
pristine-tar data for stac-validator_4.5.2.orig.tar.gz

- - - - -


2 changed files:

- + stac-validator_4.5.2.orig.tar.gz.delta
- + stac-validator_4.5.2.orig.tar.gz.id


Changes:

=====================================
stac-validator_4.5.2.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/stac-validator_4.5.2.orig.tar.gz.delta differ


=====================================
stac-validator_4.5.2.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+887854904030a1e0820940a278fe8f3c4a4dd984



View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/63a5edcd1d35c3286a19e2bcf654842d56440a76

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/stac-validator/-/commit/63a5edcd1d35c3286a19e2bcf654842d56440a76
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/a3c0f4e2/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:00:18 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:00:18 +0000
Subject: [Git][debian-gis-team/python-affine] Pushed new tag upstream/3.0.0
Message-ID: <6a77529238d92_537fafc84284d2@godard.mail>



Antonio Valentino pushed new tag upstream/3.0.0 at Debian GIS Project / python-affine

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/tree/upstream/3.0.0
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/06234734/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:00:15 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:00:15 +0000
Subject: [Git][debian-gis-team/python-affine] Pushed new tag debian/3.0.0-1
Message-ID: <6a77528f9dda9_53712f8194428217@godard.mail>



Antonio Valentino pushed new tag debian/3.0.0-1 at Debian GIS Project / python-affine

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/tree/debian/3.0.0-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/ffa59548/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:00:46 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:00:46 +0000
Subject: [Git][debian-gis-team/python-affine][master] 6 commits: New upstream
 version 3.0.0
Message-ID: <6a7752ae15517_53712f2384428621@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / python-affine


Commits:
8fa9e1be by Antonio Valentino at 2026-08-08T15:44:56+00:00
New upstream version 3.0.0
- - - - -
89fe6a54 by Antonio Valentino at 2026-08-08T15:44:56+00:00
Update upstream source from tag 'upstream/3.0.0'

Update to upstream version '3.0.0'
with Debian dir 959dde9beaefe25df1e1c0538a44577219a6a01a
- - - - -
ff8ea995 by Antonio Valentino at 2026-08-08T15:51:22+00:00
New upstream release

- - - - -
8167feb4 by Antonio Valentino at 2026-08-08T15:51:29+00:00
Update d/copyright

- - - - -
ec2dfb75 by Antonio Valentino at 2026-08-08T15:58:37+00:00
Add dependency on python3-attr

- - - - -
9f274bfb by Antonio Valentino at 2026-08-08T15:58:47+00:00
Set distribution to unstable

- - - - -


29 changed files:

- + .github/dependabot.yml
- .github/workflows/ci.yml
- .gitignore
- + .pre-commit-config.yaml
- + .readthedocs.yaml
- AUTHORS.txt
- CHANGES.txt
- README.rst
- ? affine/tests/test_transform.py
- debian/changelog
- debian/control
- debian/copyright
- + docs/Makefile
- + docs/make.bat
- + docs/requirements.txt
- + docs/src/_static/.gitkeep
- + docs/src/conf.py
- + docs/src/index.rst
- pyproject.toml
- ? setup.cfg
- affine/__init__.py ? src/affine/__init__.py
- + src/affine/py.typed
- affine/tests/__init__.py ? tests/__init__.py
- + tests/test_numpy.py
- affine/tests/test_pickle.py ? tests/test_pickle.py
- affine/tests/test_rotation.py ? tests/test_rotation.py
- affine/tests/test_serialize.py ? tests/test_serialize.py
- + tests/test_transform.py
- tox.ini


Changes:

=====================================
.github/dependabot.yml
=====================================
@@ -0,0 +1,11 @@
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+version: 2
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "quarterly"
+    groups:
+      github-actions:
+        patterns:
+          - "*"


=====================================
.github/workflows/ci.yml
=====================================
@@ -9,19 +9,33 @@ on:
     - '*'
   pull_request:
 env:
-  LATEST_PY_VERSION: '3.11'
+  LATEST_PY_VERSION: '3.14'
 
 jobs:
-  tests:
+  pre-commit:
     runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout at v6
+      - uses: actions/setup-python at v6
+        with:
+            python-version: 3.*
+      - name: pre-commit checks
+        shell: bash
+        run: |
+          python -m pip install --upgrade pip
+          python -m pip install pre-commit
+          pre-commit run --show-diff-on-failure --all-files
+
+  tests:
+    runs-on: ubuntu-24.04
     strategy:
       matrix:
-        python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
+        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
 
     steps:
-      - uses: actions/checkout at v3
+      - uses: actions/checkout at v6
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python at v4
+        uses: actions/setup-python at v6
         with:
           python-version: ${{ matrix.python-version }}
 
@@ -41,42 +55,3 @@ jobs:
           files: ./coverage.xml
           flags: unittests
           fail_ci_if_error: false
-
-  lint:
-    needs: tests
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout at v3
-      - name: Set up Python
-        uses: actions/setup-python at v4
-        with:
-          python-version: ${{ env.LATEST_PY_VERSION }}
-
-      - name: Install dependencies
-        run: |
-          python -m pip install --upgrade pip
-          python -m pip install flake8 pydocstyle
-
-      - name: Run lint
-        run: |
-          flake8 --ignore=E501,W503
-          python -m pydocstyle affine
-
-  typing:
-    needs: tests
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout at v3
-      - name: Set up Python
-        uses: actions/setup-python at v4
-        with:
-          python-version: ${{ env.LATEST_PY_VERSION }}
-
-      - name: Install dependencies
-        run: |
-          python -m pip install --upgrade pip
-          python -m pip install mypy pytest
-
-      - name: Run typing test
-        run: |
-          mypy affine


=====================================
.gitignore
=====================================
@@ -59,3 +59,4 @@ __pycache__
 *.swp
 
 .coverage.*
+.DS_Store


=====================================
.pre-commit-config.yaml
=====================================
@@ -0,0 +1,22 @@
+ci:
+  autoupdate_schedule: quarterly
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v6.0.0
+    hooks:
+    - id: check-yaml
+    - id: end-of-file-fixer
+    - id: trailing-whitespace
+  - repo: https://github.com/astral-sh/ruff-pre-commit
+    rev: v0.14.10
+    hooks:
+      # Run the linter.
+      - id: ruff-check
+        args: [ --fix ]
+      # Run the formatter.
+      - id: ruff-format
+  - repo: https://github.com/pre-commit/mirrors-mypy
+    rev: v1.19.1
+    hooks:
+      - id: mypy
+        additional_dependencies: [attrs]


=====================================
.readthedocs.yaml
=====================================
@@ -0,0 +1,15 @@
+version: 2
+
+build:
+  os: ubuntu-24.04
+  tools:
+    python: "3.14"
+
+sphinx:
+   configuration: docs/src/conf.py
+
+python:
+   install:
+   - requirements: docs/requirements.txt
+   - method: pip
+     path: .


=====================================
AUTHORS.txt
=====================================
@@ -1,10 +1,18 @@
 Authors
 =======
 
-- Sean Gillies <sean at mapbox.com>
-- Steven Ring <smr at southsky.com.au>
-- Mike Taves <mwtoews at gmail.com>
-- Kevin Wurster <wursterk at gmail.com>
-- Todd Small <todd_small at icloud.com>
-- Juan Luis Cano Rodr?guez <juanlu at satellogic.com>
+- Casey Duncan
+- Sean Gillies
+- Denis Rykov
+- Juan Luis Cano Rodr?guez
+- Kevin Wurster
 - Kirill Kouzoubov
+- Lo?c Dutrieux
+- Michael Wess
+- Mike Taves
+- Nick Maxwell
+- Rotzbua
+- Ryan Grout
+- Steven Ring
+- Stuart Axon
+- Vincent Sarago


=====================================
CHANGES.txt
=====================================
@@ -1,6 +1,52 @@
 CHANGES
 =======
 
+3.0.0 (2026-08-08)
+------------------
+
+- `Affine.__array__()` has been deleted to remove a dependency on Numpy and
+  associated typing annotations (#140). To convert an Affine instance to
+  a Numpy array, do this: `numpy.array(Affine()).reshape(3, 3)`.
+
+3.0rc3 (2026-01-30)
+-------------------
+
+The single file module affine.py has been moved to affine/__init__.py so that
+a py.typed file can be distributed in the same directory (#136).
+
+3.0rc2 (2026-01-27)
+-------------------
+
+3.0rc1 tagged the wrong commit. The distributions on PyPI have the correct
+version, but the GitHub release does not. This is fixed by 3.0rc2, which makes
+no other changes.
+
+3.0rc1 (2026-01-26)
+-------------------
+
+This is the first 3.0 release candidate. There are no significant changes
+since 3.0b1.
+
+3.0b1 (2025-01-29)
+------------------
+
+- Matrix multiplication with tuples of coordinate matrices, like the output of
+  numpy.meshgrid(), has been restored (#126).
+
+3.0a1 (2025-01-27)
+------------------
+
+- Type hint annotations for functions and methods are complete (#121).
+- Affine raises ValueError if initialized with values for g, h, and i that are
+  not 0.0, 0.0, and 1.0, respectively (#117).
+- Python version support was changed to 3.9+ (#110).
+- Switch from namedtuple to attrs for implementation of the Affine class and
+  use functools.cached_property(), which absolutely requires Python 3.8+
+  (#111).
+- Source was moved to a single-module affine.py in the src directory (#112).
+- Add numpy __array__ interface (#108).
+- Add support for ``@`` matrix multiplier methods (#122).
+
 2.4.0 (2023-01-19)
 ------------------
 
@@ -63,7 +109,7 @@ Bug fixes:
 
 2.0b2 (2016-05-16)
 ------------------
-- Bug fix: restore ``Affine __rmul__`` even though it permits dubious 
+- Bug fix: restore ``Affine __rmul__`` even though it permits dubious
   vector * matrix expressions (#27).
 
 2.0b1 (2016-05-16)


=====================================
README.rst
=====================================
@@ -9,8 +9,12 @@ Matrices describing 2D affine transformation of the plane.
 .. image:: https://codecov.io/gh/rasterio/affine/branch/main/graph/badge.svg
     :target: https://codecov.io/gh/rasterio/affine
 
+.. image:: https://readthedocs.org/projects/affine/badge/?version=latest
+       :target: https://affine.readthedocs.io/en/latest/?badge=latest
+       :alt: Documentation Status
+
 The Affine package is derived from Casey Duncan's Planar package. Please see
-the copyright statement in `affine/__init__.py <affine/__init__.py>`__.
+the copyright statement in `src/affine.py <src/affine.py>`__.
 
 Usage
 -----
@@ -18,7 +22,7 @@ Usage
 The 3x3 augmented affine transformation matrix for transformations in two
 dimensions is illustrated below.
 
-::
+.. code-block:: none
 
   | x' |   | a  b  c | | x |
   | y' | = | d  e  f | | y |
@@ -47,8 +51,9 @@ Matrices can be created by passing the values ``a, b, c, d, e, f`` to the
   Affine(0.7071067811865476, -0.7071067811865475, 0.0,
          0.7071067811865475, 0.7071067811865476, 0.0)
 
-These matrices can be applied to ``(x, y)`` tuples to obtain transformed
-coordinates ``(x', y')``.
+These matrices can be applied to ``(x, y)`` tuples using the
+``*`` operator (or the ``@`` matrix multiplier operator for
+future releases) to obtain transformed coordinates ``(x', y')``.
 
 .. code-block:: pycon
 
@@ -87,11 +92,10 @@ origin can be easily computed.
   >>> fwd * (col, row)
   (-237481.5, 195036.4)
 
-The reverse transformation is obtained using the ``~`` operator.
+The reverse transformation is obtained using the ``~`` inverse operator.
 
 .. code-block:: pycon
 
   >>> rev = ~fwd
   >>> rev * fwd * (col, row)
   (0.0, 99.99999999999999)
-


=====================================
affine/tests/test_transform.py deleted
=====================================
@@ -1,543 +0,0 @@
-#############################################################################
-# Planar is Copyright (c) 2010 by Casey Duncan
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-# * Neither the name(s) of the copyright holders nor the names of its
-#   contributors may be used to endorse or promote products derived from this
-#   software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AS IS AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#############################################################################
-
-"""Transform unit tests"""
-
-import math
-import unittest
-from textwrap import dedent
-
-import pytest
-
-import affine
-from affine import Affine, EPSILON
-
-
-def seq_almost_equal(t1, t2, error=0.00001):
-    assert len(t1) == len(t2), f"{t1!r} != {t2!r}"
-    for m1, m2 in zip(t1, t2):
-        assert abs(m1 - m2) <= error, f"{t1!r} != {t2!r}"
-
-
-class PyAffineTestCase(unittest.TestCase):
-    def test_zero_args(self):
-        with pytest.raises(TypeError):
-            Affine()
-
-    def test_wrong_arg_type(self):
-        with pytest.raises(TypeError):
-            Affine(None)
-
-    def test_args_too_few(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2)
-
-    def test_args_too_many(self):
-        with pytest.raises(TypeError):
-            Affine(*range(10))
-
-    def test_args_members_wrong_type(self):
-        with pytest.raises(TypeError):
-            Affine(0, 2, 3, None, None, "")
-
-    def test_len(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert len(t) == 9
-
-    def test_slice_last_row(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert t[-3:] == (0, 0, 1)
-
-    def test_members_are_floats(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        for m in t:
-            assert isinstance(m, float), repr(m)
-
-    def test_getitem(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert t[0] == 1
-        assert t[1] == 2
-        assert t[2] == 3
-        assert t[3] == 4
-        assert t[4] == 5
-        assert t[5] == 6
-        assert t[6] == 0
-        assert t[7] == 0
-        assert t[8] == 1
-        assert t[-1] == 1
-
-    def test_getitem_wrong_type(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        with pytest.raises(TypeError):
-            t["foobar"]
-
-    def test_str(self):
-        t = Affine(1.111, 2.222, 3.333, -4.444, -5.555, 6.666)
-        assert str(t) == dedent(
-            """\
-            | 1.11, 2.22, 3.33|
-            |-4.44,-5.55, 6.67|
-            | 0.00, 0.00, 1.00|"""
-        )
-
-    def test_repr(self):
-        t = Affine(1.111, 2.222, 3.456, 4.444, 5.5, 6.25)
-        assert repr(t) == dedent(
-            """\
-            Affine(1.111, 2.222, 3.456,
-                   4.444, 5.5, 6.25)"""
-        )
-
-    def test_identity_constructor(self):
-        ident = Affine.identity()
-        assert isinstance(ident, Affine)
-        assert tuple(ident) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
-        assert ident.is_identity
-
-    def test_permutation_constructor(self):
-        perm = Affine.permutation()
-        assert isinstance(perm, Affine)
-        assert tuple(perm) == (0, 1, 0, 1, 0, 0, 0, 0, 1)
-        assert (perm * perm).is_identity
-
-    def test_translation_constructor(self):
-        trans = Affine.translation(2, -5)
-        assert isinstance(trans, Affine)
-        assert tuple(trans) == (1, 0, 2, 0, 1, -5, 0, 0, 1)
-
-    def test_scale_constructor(self):
-        scale = Affine.scale(5)
-        assert isinstance(scale, Affine)
-        assert tuple(scale) == (5, 0, 0, 0, 5, 0, 0, 0, 1)
-        scale = Affine.scale(-1, 2)
-        assert tuple(scale) == (-1, 0, 0, 0, 2, 0, 0, 0, 1)
-        assert tuple(Affine.scale(1)) == tuple(Affine.identity())
-
-    def test_shear_constructor(self):
-        shear = Affine.shear(30)
-        assert isinstance(shear, Affine)
-        mx = math.tan(math.radians(30))
-        seq_almost_equal(tuple(shear), (1, mx, 0, 0, 1, 0, 0, 0, 1))
-        shear = Affine.shear(-15, 60)
-        mx = math.tan(math.radians(-15))
-        my = math.tan(math.radians(60))
-        seq_almost_equal(tuple(shear), (1, mx, 0, my, 1, 0, 0, 0, 1))
-        shear = Affine.shear(y_angle=45)
-        seq_almost_equal(tuple(shear), (1, 0, 0, 1, 1, 0, 0, 0, 1))
-
-    def test_rotation_constructor(self):
-        rot = Affine.rotation(60)
-        assert isinstance(rot, Affine)
-        r = math.radians(60)
-        s, c = math.sin(r), math.cos(r)
-        assert tuple(rot) == (c, -s, 0, s, c, 0, 0, 0, 1)
-        rot = Affine.rotation(337)
-        r = math.radians(337)
-        s, c = math.sin(r), math.cos(r)
-        seq_almost_equal(tuple(rot), (c, -s, 0, s, c, 0, 0, 0, 1))
-        assert tuple(Affine.rotation(0)) == tuple(Affine.identity())
-
-    def test_rotation_constructor_quadrants(self):
-        assert tuple(Affine.rotation(0)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(90)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(-180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(270)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(-90)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(360)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(450)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(-450)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
-
-    def test_rotation_constructor_with_pivot(self):
-        assert tuple(Affine.rotation(60)) == tuple(Affine.rotation(60, pivot=(0, 0)))
-        rot = Affine.rotation(27, pivot=(2, -4))
-        r = math.radians(27)
-        s, c = math.sin(r), math.cos(r)
-        assert tuple(rot) == (
-            c,
-            -s,
-            2 - 2 * c - 4 * s,
-            s,
-            c,
-            -4 - 2 * s + 4 * c,
-            0,
-            0,
-            1,
-        )
-        assert tuple(Affine.rotation(0, (-3, 2))) == tuple(Affine.identity())
-
-    def test_rotation_contructor_wrong_arg_types(self):
-        with pytest.raises(TypeError):
-            Affine.rotation(1, 1)
-
-    def test_determinant(self):
-        assert Affine.identity().determinant == 1
-        assert Affine.scale(2).determinant == 4
-        assert Affine.scale(0).determinant == 0
-        assert Affine.scale(5, 1).determinant == 5
-        assert Affine.scale(-1, 1).determinant == -1
-        assert Affine.scale(-1, 0).determinant == 0
-        assert Affine.rotation(77).determinant == pytest.approx(1)
-        assert Affine.translation(32, -47).determinant == pytest.approx(1)
-
-    def test_is_rectilinear(self):
-        assert Affine.identity().is_rectilinear
-        assert Affine.scale(2.5, 6.1).is_rectilinear
-        assert Affine.translation(4, -1).is_rectilinear
-        assert Affine.rotation(90).is_rectilinear
-        assert not Affine.shear(4, -1).is_rectilinear
-        assert not Affine.rotation(-26).is_rectilinear
-
-    def test_is_conformal(self):
-        assert Affine.identity().is_conformal
-        assert Affine.scale(2.5, 6.1).is_conformal
-        assert Affine.translation(4, -1).is_conformal
-        assert Affine.rotation(90).is_conformal
-        assert Affine.rotation(-26).is_conformal
-        assert not Affine.shear(4, -1).is_conformal
-
-    def test_is_orthonormal(self):
-        assert Affine.identity().is_orthonormal
-        assert Affine.translation(4, -1).is_orthonormal
-        assert Affine.rotation(90).is_orthonormal
-        assert Affine.rotation(-26).is_orthonormal
-        assert not Affine.scale(2.5, 6.1).is_orthonormal
-        assert not Affine.scale(0.5, 2).is_orthonormal
-        assert not Affine.shear(4, -1).is_orthonormal
-
-    def test_is_degenerate(self):
-        assert not Affine.identity().is_degenerate
-        assert not Affine.translation(2, -1).is_degenerate
-        assert not Affine.shear(0, -22.5).is_degenerate
-        assert not Affine.rotation(88.7).is_degenerate
-        assert not Affine.scale(0.5).is_degenerate
-        assert Affine.scale(0).is_degenerate
-        assert Affine.scale(-10, 0).is_degenerate
-        assert Affine.scale(0, 300).is_degenerate
-        assert Affine.scale(0).is_degenerate
-        assert Affine.scale(0).is_degenerate
-
-    def test_column_vectors(self):
-        a, b, c = Affine(2, 3, 4, 5, 6, 7).column_vectors
-        assert isinstance(a, tuple)
-        assert isinstance(b, tuple)
-        assert isinstance(c, tuple)
-        assert a == (2, 5)
-        assert b == (3, 6)
-        assert c == (4, 7)
-
-    def test_almost_equals(self):
-        EPSILON = 1e-5
-        E = EPSILON * 0.5
-        t = Affine(1.0, E, 0, -E, 1.0 + E, E)
-        assert t.almost_equals(Affine.identity())
-        assert Affine.identity().almost_equals(t)
-        assert t.almost_equals(t)
-        t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
-        assert not t.almost_equals(Affine.identity())
-        assert not Affine.identity().almost_equals(t)
-        assert t.almost_equals(t)
-
-    def test_almost_equals_2(self):
-        EPSILON = 1e-10
-        E = EPSILON * 0.5
-        t = Affine(1.0, E, 0, -E, 1.0 + E, E)
-        assert t.almost_equals(Affine.identity(), precision=EPSILON)
-        assert Affine.identity().almost_equals(t, precision=EPSILON)
-        assert t.almost_equals(t, precision=EPSILON)
-        t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
-        assert not t.almost_equals(Affine.identity(), precision=EPSILON)
-        assert not Affine.identity().almost_equals(t, precision=EPSILON)
-        assert t.almost_equals(t, precision=EPSILON)
-
-    def test_equality(self):
-        t1 = Affine(1, 2, 3, 4, 5, 6)
-        t2 = Affine(6, 5, 4, 3, 2, 1)
-        t3 = Affine(1, 2, 3, 4, 5, 6)
-        assert t1 == t3
-        assert not t1 == t2
-        assert t2 == t2
-        assert not t1 != t3
-        assert not t2 != t2
-        assert t1 != t2
-        assert not t1 == 1
-        assert t1 != 1
-
-    def test_gt(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) > Affine(6, 5, 4, 3, 2, 1)
-
-    def test_lt(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) < Affine(6, 5, 4, 3, 2, 1)
-
-    def test_add(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) + Affine(6, 5, 4, 3, 2, 1)
-
-    def test_sub(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) - Affine(6, 5, 4, 3, 2, 1)
-
-    def test_mul_by_identity(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert tuple(t * Affine.identity()) == tuple(t)
-
-    def test_mul_transform(self):
-        t = Affine.rotation(5) * Affine.rotation(29)
-        assert isinstance(t, Affine)
-        seq_almost_equal(t, Affine.rotation(34))
-        t = Affine.scale(3, 5) * Affine.scale(2)
-        seq_almost_equal(t, Affine.scale(6, 10))
-
-    def test_itransform(self):
-        pts = [(4, 1), (-1, 0), (3, 2)]
-        r = Affine.scale(-2).itransform(pts)
-        assert r is None, r
-        assert pts == [(-8, -2), (2, 0), (-6, -4)]
-
-        A = Affine.rotation(33)
-        pts = [(4, 1), (-1, 0), (3, 2)]
-        pts_expect = [A * pt for pt in pts]
-        r = A.itransform(pts)
-        assert r is None
-        assert pts == pts_expect
-
-    def test_mul_wrong_type(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) * None
-
-    def test_mul_sequence_wrong_member_types(self):
-        class NotPtSeq:
-            @classmethod
-            def from_points(cls, points):
-                list(points)
-
-            def __iter__(self):
-                yield 0
-
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) * NotPtSeq()
-
-    def test_imul_transform(self):
-        t = Affine.translation(3, 5)
-        t *= Affine.translation(-2, 3.5)
-        assert isinstance(t, Affine)
-        seq_almost_equal(t, Affine.translation(1, 8.5))
-
-    def test_inverse(self):
-        seq_almost_equal(~Affine.identity(), Affine.identity())
-        seq_almost_equal(~Affine.translation(2, -3), Affine.translation(-2, 3))
-        seq_almost_equal(~Affine.rotation(-33.3), Affine.rotation(33.3))
-        t = Affine(1, 2, 3, 4, 5, 6)
-        seq_almost_equal(~t * t, Affine.identity())
-
-    def test_cant_invert_degenerate(self):
-        t = Affine.scale(0)
-        with pytest.raises(affine.TransformNotInvertibleError):
-            ~t
-
-    def test_bad_type_world(self):
-        """wrong type, i.e don't use readlines()"""
-        with pytest.raises(TypeError):
-            affine.loadsw(["1.0", "0.0", "0.0", "1.0", "0.0", "0.0"])
-
-    def test_bad_value_world(self):
-        """Wrong number of parameters."""
-        with pytest.raises(ValueError):
-            affine.loadsw("1.0\n0.0\n0.0\n1.0\n0.0\n0.0\n0.0")
-
-    def test_simple_world(self):
-        s = "1.0\n0.0\n0.0\n-1.0\n100.5\n199.5\n"
-        a = affine.loadsw(s)
-        assert a == Affine(1.0, 0.0, 100.0, 0.0, -1.0, 200.0)
-        assert affine.dumpsw(a) == s
-
-    def test_real_world(self):
-        s = dedent(
-            """\
-                 39.9317755024
-                 30.0907511581
-                 30.0907511576
-                -39.9317755019
-            2658137.2266720217
-            5990821.7039887439"""
-        )  # no EOL
-        a1 = affine.loadsw(s)
-        assert a1.almost_equals(
-            Affine(
-                39.931775502364644,
-                30.090751157602412,
-                2658102.2154086917,
-                30.090751157602412,
-                -39.931775502364644,
-                5990826.624500916,
-            )
-        )
-        a1out = affine.dumpsw(a1)
-        assert isinstance(a1out, str)
-        a2 = affine.loadsw(a1out)
-        assert a1.almost_equals(a2)
-
-
-# We're using pytest for tests added after 1.0 and don't need unittest
-# test case classes.
-
-
-def test_gdal():
-    t = Affine.from_gdal(-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
-    assert t.c == t.xoff == -237481.5
-    assert t.a == 425.0
-    assert t.b == 0.0
-    assert t.f == t.yoff == 237536.4
-    assert t.d == 0.0
-    assert t.e == -425.0
-    assert tuple(t) == (425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4, 0, 0, 1)
-    assert t.to_gdal() == (-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
-
-
-def test_shapely():
-    t = Affine(425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4)
-    assert t.to_shapely() == (425.0, 0.0, 0.0, -425, -237481.5, 237536.4)
-
-
-def test_imul_number():
-    t = Affine(1, 2, 3, 4, 5, 6)
-    try:
-        t *= 2.0
-    except TypeError:
-        assert True
-
-
-def test_mul_tuple():
-    t = Affine(1, 2, 3, 4, 5, 6)
-    t * (2.0, 2.0)
-
-
-def test_rmul_tuple():
-    with pytest.warns(DeprecationWarning):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        (2.0, 2.0) * t
-
-
-def test_transform_precision():
-    t = Affine.rotation(45.0)
-    assert t.precision == EPSILON
-    t.precision = 1e-10
-    assert t.precision == 1e-10
-    assert Affine.rotation(0.0).precision == EPSILON
-
-
-def test_associative():
-    point = (12, 5)
-    trans = Affine.translation(-10.0, -5.0)
-    rot90 = Affine.rotation(90.0)
-    result1 = rot90 * (trans * point)
-    result2 = (rot90 * trans) * point
-    seq_almost_equal(result1, (0.0, 2.0))
-    seq_almost_equal(result1, result2)
-
-
-def test_roundtrip():
-    point = (12, 5)
-    trans = Affine.translation(3, 4)
-    rot37 = Affine.rotation(37.0)
-    point_prime = (trans * rot37) * point
-    roundtrip_point = ~(trans * rot37) * point_prime
-    seq_almost_equal(point, roundtrip_point)
-
-
-def test_eccentricity():
-    assert Affine.identity().eccentricity == 0.0
-    assert Affine.scale(2).eccentricity == 0.0
-    # assert_equal(Affine.scale(0).eccentricity, ?)
-    assert Affine.scale(2, 1).eccentricity == pytest.approx(math.sqrt(3) / 2)
-    assert Affine.scale(2, 3).eccentricity == pytest.approx(math.sqrt(5) / 3)
-    assert Affine.scale(1, 0).eccentricity == 1.0
-    assert Affine.rotation(77).eccentricity == pytest.approx(0.0)
-    assert Affine.translation(32, -47).eccentricity == pytest.approx(0.0)
-    assert Affine.scale(-1, 1).eccentricity == pytest.approx(0.0)
-
-
-def test_eccentricity_complex():
-    assert (Affine.scale(2, 3) * Affine.rotation(77)).eccentricity == pytest.approx(
-        math.sqrt(5) / 3
-    )
-    assert (Affine.rotation(77) * Affine.scale(2, 3)).eccentricity == pytest.approx(
-        math.sqrt(5) / 3
-    )
-    assert (
-        Affine.translation(32, -47) * Affine.rotation(77) * Affine.scale(2, 3)
-    ).eccentricity == pytest.approx(math.sqrt(5) / 3)
-
-
-def test_rotation_angle():
-    assert Affine.identity().rotation_angle == 0.0
-    assert Affine.scale(2).rotation_angle == 0.0
-    assert Affine.scale(2, 1).rotation_angle == 0.0
-    assert Affine.translation(32, -47).rotation_angle == pytest.approx(0.0)
-    assert Affine.rotation(30).rotation_angle == pytest.approx(30)
-    assert Affine.rotation(-150).rotation_angle == pytest.approx(-150)
-
-
-def test_rotation_improper():
-    with pytest.raises(affine.UndefinedRotationError):
-        Affine.scale(-1, 1).rotation_angle
-
-
-# See gh-71 for bug report motivating this test.
-def test_mul_fallback_unpack():
-    """Support fallback in case that other is a single object."""
-
-    class TextPoint:
-        """Not iterable, will trigger ValueError in Affine.__mul__."""
-
-        def __rmul__(self, other):
-            return other * (1, 2)
-
-    assert Affine.identity() * TextPoint() == (1, 2)
-
-
-# See gh-71 for bug report motivating this test.
-def test_mul_fallback_type_error():
-    """Support fallback in case that other is an unexpected type."""
-
-    class TextPoint:
-        """Iterable, but values trigger TypeError in Affine.__mul__."""
-
-        def __iter__(self):
-            return ("1", "2")
-
-        def __rmul__(self, other):
-            return other * (1, 2)
-
-    assert Affine.identity() * TextPoint() == (1, 2)
-
-
-if __name__ == "__main__":
-    unittest.main()


=====================================
debian/changelog
=====================================
@@ -1,9 +1,15 @@
-python-affine (2.4.0-4) UNRELEASED; urgency=medium
+python-affine (3.0.0-1) unstable; urgency=medium
 
-  * Team upload.
+  [ Bas Couwenberg ]
   * Bump Standards-Version to 4.7.4, no changes.
 
- -- Bas Couwenberg <sebastic at debian.org>  Sat, 04 Apr 2026 10:20:12 +0200
+  [ Antonio Valentino ]
+  * New upstream release.
+  * Update d/copyright.
+  * debian/control:
+    - Add dependency on python3-attrs.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Sat, 08 Aug 2026 15:51:32 +0000
 
 python-affine (2.4.0-3) unstable; urgency=medium
 


=====================================
debian/control
=====================================
@@ -9,6 +9,7 @@ Build-Depends: debhelper-compat (= 13),
                flit,
                pybuild-plugin-pyproject,
                python3-all,
+               python3-attr,
                python3-pytest <!nocheck>
 Standards-Version: 4.7.4
 Vcs-Browser: https://salsa.debian.org/debian-gis-team/python-affine


=====================================
debian/copyright
=====================================
@@ -4,17 +4,15 @@ Upstream-Name: affine
 Source: https://github.com/rasterio/affine
 
 Files: *
-Copyright: 2014, Sean Gillies <sean.gillies at gmail.com>
+Copyright: 2014, Sean C. Gillies <sean.gillies at gmail.com>
            2014, Steven Ring <smr at southsky.com.au>
            2014, Mike Toews <mwtoews at gmail.com>
-License: BSD-3-Clause
-
-Files: affine/__init__.py
-Copyright: 2010, Casey Duncan
+           2010, Casey Duncan
 License: BSD-3-Clause
 
 Files: debian/*
 Copyright: 2014, Johan Van de Wauw
+           2026, Antonio Vaentino
 License: BSD-3-Clause
 
 License: BSD-3-Clause


=====================================
docs/Makefile
=====================================
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS    ?=
+SPHINXBUILD   ?= sphinx-build
+SOURCEDIR     = src
+BUILDDIR      = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)


=====================================
docs/make.bat
=====================================
@@ -0,0 +1,35 @@
+ at ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=src
+set BUILDDIR=build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.https://www.sphinx-doc.org/
+	exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd


=====================================
docs/requirements.txt
=====================================
@@ -0,0 +1,2 @@
+attrs
+sphinx==9.1.0


=====================================
docs/src/_static/.gitkeep
=====================================


=====================================
docs/src/conf.py
=====================================
@@ -0,0 +1,40 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+import os
+import sys
+
+sys.path.append(os.path.abspath("../../src"))
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = "rasterio/affine"
+project_copyright = "%Y, Sean Gillies"
+author = "Sean Gillies"
+release = "development"
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+    "sphinx.ext.autodoc",
+    "sphinx.ext.coverage",
+    "sphinx.ext.ifconfig",
+    "sphinx.ext.napoleon",  # NumPy doc style.
+    "sphinx.ext.todo",
+    "sphinx.ext.viewcode",
+]
+
+templates_path = ["_templates"]
+exclude_patterns = ["build", "Thumbs.db", ".DS_Store"]
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = "nature"
+html_static_path = ["_static"]
+
+# If this is not None, a 'Last updated on:' timestamp is inserted at every page bottom.
+html_last_updated_fmt = ""


=====================================
docs/src/index.rst
=====================================
@@ -0,0 +1,28 @@
+Welcome to rasterio/affine's documentation!
+===========================================
+
+This is the documentation of the latest development version at https://github.com/rasterio/affine .
+
+.. include:: ../../README.rst
+
+Module documentation
+====================
+
+.. automodule:: affine
+   :members:
+
+.. include:: ../../CHANGES.txt
+.. include:: ../../AUTHORS.txt
+
+License
+=======
+
+.. include:: ../../LICENSE.txt
+   :literal:
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`


=====================================
pyproject.toml
=====================================
@@ -18,19 +18,22 @@ classifiers = [
     "Programming Language :: Python :: 3 :: Only",
     "Topic :: Multimedia :: Graphics :: Graphics Conversion",
     "Topic :: Scientific/Engineering :: GIS",
+    "Typing :: Typed",
 ]
 license = {text = "BSD-3-Clause"}
-requires-python = ">=3.7"
+requires-python = ">=3.9"
+dependencies = [
+    "attrs",
+]
 
 [project.optional-dependencies]
 test = [
-    "pytest >=4.6",
+    "numpy>=1.20",
+    "pytest>=6.0",
     "pytest-cov",
 ]
 dev = [
-    "pydocstyle",
-    "flake8",
-    "coveralls",
+    "coveralls>=3.0",
 ]
 
 [project.urls]
@@ -41,4 +44,39 @@ include = [
     "AUTHORS.txt",
     "CHANGES.txt",
     "LICENSE.txt",
+    "docs/",
+    "tests/",
+]
+exclude = ["docs/build/**"]
+
+[tool.pytest.ini_options]
+pythonpath = "src"
+testpaths = ["tests"]
+
+[tool.ruff.lint]
+select = [
+    "B",  # flake8-bugbear
+    "D",  # pydocstyle
+    "E", "W",  # pycodestyle
+    "F",  # Pyflakes
+    "I",  # isort
+    "NPY", # NumPy-specific rules
+    "PT", # flake8-pytest-style
+    "RET", # flake8-return
+    "RUF", # Ruff-specific rules
+    "SIM", # flake8-simplify
+    "UP", # pyupgrade
 ]
+ignore = [
+    "D105",  # Missing docstring in magic method
+]
+
+[tool.ruff.lint.per-file-ignores]
+"tests/**.py" = ["B", "D"]
+"docs/**.py" = ["D"]
+
+[tool.ruff.lint.isort]
+force-sort-within-sections = true
+
+[tool.ruff.lint.pydocstyle]
+convention = "numpy"


=====================================
setup.cfg deleted
=====================================
@@ -1,6 +0,0 @@
-[tool:pytest]
-testpaths: affine/tests
-
-[pydocstyle]
-select: D1
-add-ignore: D105


=====================================
affine/__init__.py ? src/affine/__init__.py
=====================================
@@ -1,4 +1,4 @@
-"""Affine transformation matrices
+"""Affine transformation matrices.
 
 The Affine package is derived from Casey Duncan's Planar package. See the
 copyright statement below.
@@ -32,16 +32,22 @@ copyright statement below.
 # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #############################################################################
 
-from collections import namedtuple
+from __future__ import annotations
+
+from collections.abc import MutableSequence, Sequence
+from functools import cached_property
 import math
+from typing import overload
 import warnings
 
+from attrs import astuple, define, field
 
 __all__ = ["Affine"]
 __author__ = "Sean Gillies"
-__version__ = "2.4.0"
+__version__ = "3.0.0"
 
 EPSILON: float = 1e-5
+EPSILON2: float = 1e-10
 
 
 class AffineError(Exception):
@@ -49,33 +55,14 @@ class AffineError(Exception):
 
 
 class TransformNotInvertibleError(AffineError):
-    """The transform could not be inverted"""
+    """The transform could not be inverted."""
 
 
 class UndefinedRotationError(AffineError):
-    """The rotation angle could not be computed for this transform"""
-
-
-def cached_property(func):
-    """Special property decorator that caches the computed
-    property value in the object's instance dict the first
-    time it is accessed.
-    """
-    name = func.__name__
-    doc = func.__doc__
-
-    def getter(self, name=name):
-        try:
-            return self.__dict__[name]
-        except KeyError:
-            self.__dict__[name] = value = func(self)
-            return value
-
-    getter.func_name = name
-    return property(getter, doc=doc)
+    """The rotation angle could not be computed for this transform."""
 
 
-def cos_sin_deg(deg: float):
+def cos_sin_deg(deg: float) -> tuple[float, float]:
     """Return the cosine and sin for the given angle in degrees.
 
     With special-case handling of multiples of 90 for perfect right
@@ -84,272 +71,297 @@ def cos_sin_deg(deg: float):
     deg = deg % 360.0
     if deg == 90.0:
         return 0.0, 1.0
-    elif deg == 180.0:
+    if deg == 180.0:
         return -1.0, 0
-    elif deg == 270.0:
+    if deg == 270.0:
         return 0, -1.0
     rad = math.radians(deg)
     return math.cos(rad), math.sin(rad)
 
 
-class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))):
+ at define(frozen=True)
+class Affine:
     """Two dimensional affine transform for 2D linear mapping.
 
+    Parallel lines are preserved by these transforms. Affine transforms
+    can perform any combination of translations, scales/flips, shears,
+    and rotations. Class methods are provided to conveniently compose
+    transforms from these operations.
+
     Parameters
     ----------
     a, b, c, d, e, f : float
-        Coefficients of an augmented affine transformation matrix
-
-        | x' |   | a  b  c | | x |
-        | y' | = | d  e  f | | y |
-        | 1  |   | 0  0  1 | | 1 |
+        Coefficients of the 3 x 3 augmented affine transformation matrix.
 
-        `a`, `b`, and `c` are the elements of the first row of the
-        matrix. `d`, `e`, and `f` are the elements of the second row.
+    g, h, i : float, optional
+        Coefficients of the 3 x 3 augmented affine transformation matrix.
 
     Attributes
     ----------
     a, b, c, d, e, f, g, h, i : float
-        The coefficients of the 3x3 augmented affine transformation
-        matrix
+        Coefficients of the 3 x 3 augmented affine transformation matrix.
 
-        | x' |   | a  b  c | | x |
-        | y' | = | d  e  f | | y |
-        | 1  |   | g  h  i | | 1 |
+        .. code-block:: none
+
+            | x' |   | a  b  c | | x |
+            | y' | = | d  e  f | | y |
+            | 1  |   | g  h  i | | 1 |
 
         `g`, `h`, and `i` are always 0, 0, and 1.
 
-    The Affine package is derived from Casey Duncan's Planar package.
-    See the copyright statement below.  Parallel lines are preserved by
-    these transforms. Affine transforms can perform any combination of
-    translations, scales/flips, shears, and rotations.  Class methods
-    are provided to conveniently compose transforms from these
-    operations.
-
-    Internally the transform is stored as a 3x3 transformation matrix.
-    The transform may be constructed directly by specifying the first
-    two rows of matrix values as 6 floats. Since the matrix is an affine
-    transform, the last row is always ``(0, 0, 1)``.
-
-    N.B.: multiplication of a transform and an (x, y) vector *always*
-    returns the column vector that is the matrix multiplication product
-    of the transform and (x, y) as a column vector, no matter which is
-    on the left or right side. This is obviously not the case for
-    matrices and vectors in general, but provides a convenience for
-    users of this class.
+    Notes
+    -----
+    Multiplication of a transform and an (x, y) vector *always* returns
+    the column vector that is the matrix multiplication product of the
+    transform and (x, y) as a column vector, no matter which is on the
+    left or right side. This is obviously not the case for matrices and
+    vectors in general, but provides a convenience for users of this
+    class.
 
+    The Affine package is derived from Casey Duncan's Planar package.
+    See the copyright statement.
     """
 
-    precision = EPSILON
-
-    def __new__(
-        cls,
-        a: float,
-        b: float,
-        c: float,
-        d: float,
-        e: float,
-        f: float,
-        g: float = 0.0,
-        h: float = 0.0,
-        i: float = 1.0,
-    ):
-        """Create a new object
+    a: float = field(converter=float)
+    b: float = field(converter=float)
+    c: float = field(converter=float)
+    d: float = field(converter=float)
+    e: float = field(converter=float)
+    f: float = field(converter=float)
 
-        Parameters
-        ----------
-        a, b, c, d, e, f : float
-            Elements of an augmented affine transformation matrix.
-        """
-        return tuple.__new__(
-            cls,
-            (
-                a * 1.0,
-                b * 1.0,
-                c * 1.0,
-                d * 1.0,
-                e * 1.0,
-                f * 1.0,
-                g * 1.0,
-                h * 1.0,
-                i * 1.0,
-            ),
-        )
+    # The class has 3 attributes that don't have to be specified: g, h,
+    # and i. If they are, the given value has to be the same as the
+    # default value. This allows a new instances to be created from the
+    # tuple form of another, like Affine(*Affine.identity()).
+
+    g: float = field(default=0.0, converter=float)
+
+    @g.validator
+    def _check_g(self, attribute, value):
+        if value != 0.0:
+            raise ValueError("g must be equal to 0.0")
+
+    h: float = field(default=0.0, converter=float)
+
+    @h.validator
+    def _check_h(self, attribute, value):
+        if value != 0.0:
+            raise ValueError("h must be equal to 0.0")
+
+    i: float = field(default=1.0, converter=float)
+
+    @i.validator
+    def _check_i(self, attribute, value):
+        if value != 1.0:
+            raise ValueError("i must be equal to 1.0")
 
     @classmethod
-    def from_gdal(cls, c: float, a: float, b: float, f: float, d: float, e: float):
+    def from_gdal(
+        cls, c: float, a: float, b: float, f: float, d: float, e: float
+    ) -> Affine:
         """Use same coefficient order as GDAL's GetGeoTransform().
 
-        :param c, a, b, f, d, e: 6 floats ordered by GDAL.
-        :rtype: Affine
+        Parameters
+        ----------
+        c, a, b, f, d, e : float
+            Parameters ordered by GDAL's GeoTransform.
+
+        Returns
+        -------
+        Affine
         """
-        return cls.__new__(cls, a, b, c, d, e, f)
+        return cls(a, b, c, d, e, f)
 
     @classmethod
-    def identity(cls):
+    def identity(cls) -> Affine:
         """Return the identity transform.
 
-        :rtype: Affine
+        Returns
+        -------
+        Affine
         """
         return identity
 
     @classmethod
-    def translation(cls, xoff: float, yoff: float):
+    def translation(cls, xoff: float, yoff: float) -> Affine:
         """Create a translation transform from an offset vector.
 
-        :param xoff: Translation x offset.
-        :type xoff: float
-        :param yoff: Translation y offset.
-        :type yoff: float
-        :rtype: Affine
+        Parameters
+        ----------
+        xoff, yoff : float
+            Translation offsets in x and y directions.
+
+        Returns
+        -------
+        Affine
         """
-        return tuple.__new__(cls, (1.0, 0.0, xoff, 0.0, 1.0, yoff, 0.0, 0.0, 1.0))
+        return cls(1.0, 0.0, xoff, 0.0, 1.0, yoff)
 
     @classmethod
-    def scale(cls, *scaling):
+    def scale(cls, *scaling: float) -> Affine:
         """Create a scaling transform from a scalar or vector.
 
-        :param scaling: The scaling factor. A scalar value will
-            scale in both dimensions equally. A vector scaling
-            value scales the dimensions independently.
-        :type scaling: float or sequence
-        :rtype: Affine
+        Parameters
+        ----------
+        *scaling : float or sequence of two floats
+            One or two scaling factors. A scalar value will scale in
+            both dimensions equally. A vector scaling value scales the
+            dimensions independently.
+
+        Returns
+        -------
+        Affine
         """
         if len(scaling) == 1:
-            sx = sy = float(scaling[0])
+            sx = scaling[0]
+            sy = sx
         else:
             sx, sy = scaling
-        return tuple.__new__(cls, (sx, 0.0, 0.0, 0.0, sy, 0.0, 0.0, 0.0, 1.0))
+        return cls(sx, 0.0, 0.0, 0.0, sy, 0.0)
 
     @classmethod
-    def shear(cls, x_angle: float = 0, y_angle: float = 0):
+    def shear(cls, x_angle: float = 0.0, y_angle: float = 0.0) -> Affine:
         """Create a shear transform along one or both axes.
 
-        :param x_angle: Shear angle in degrees parallel to the x-axis.
-        :type x_angle: float
-        :param y_angle: Shear angle in degrees parallel to the y-axis.
-        :type y_angle: float
-        :rtype: Affine
+        Parameters
+        ----------
+        x_angle, y_angle : float
+            Shear angles in degrees parallel to the x- and y-axis.
+
+        Returns
+        -------
+        Affine
         """
         mx = math.tan(math.radians(x_angle))
         my = math.tan(math.radians(y_angle))
-        return tuple.__new__(cls, (1.0, mx, 0.0, my, 1.0, 0.0, 0.0, 0.0, 1.0))
+        return cls(1.0, mx, 0.0, my, 1.0, 0.0)
 
     @classmethod
-    def rotation(cls, angle: float, pivot=None):
+    def rotation(cls, angle: float, pivot: Sequence[float] | None = None) -> Affine:
         """Create a rotation transform at the specified angle.
 
-        A pivot point other than the coordinate system origin may be
-        optionally specified.
-
-        :param angle: Rotation angle in degrees, counter-clockwise
-            about the pivot point.
-        :type angle: float
-        :param pivot: Point to rotate about, if omitted the rotation is
-            about the origin.
-        :type pivot: sequence
-        :rtype: Affine
+        Parameters
+        ----------
+        angle : float
+            Rotation angle in degrees, counter-clockwise about the pivot
+            point.
+        pivot : sequence of float (px, py), optional
+            Pivot point coordinates to rotate around. If None (default),
+            the pivot point is the coordinate system origin (0.0, 0.0).
+
+        Returns
+        -------
+        Affine
         """
         ca, sa = cos_sin_deg(angle)
         if pivot is None:
-            return tuple.__new__(cls, (ca, -sa, 0.0, sa, ca, 0.0, 0.0, 0.0, 1.0))
-        else:
-            px, py = pivot
-            return tuple.__new__(
-                cls,
-                (
-                    ca,
-                    -sa,
-                    px - px * ca + py * sa,
-                    sa,
-                    ca,
-                    py - px * sa - py * ca,
-                    0.0,
-                    0.0,
-                    1.0,
-                ),
-            )
+            return cls(ca, -sa, 0.0, sa, ca, 0.0)
+        px, py = pivot
+        # fmt: off
+        return cls(
+            ca, -sa, px - px * ca + py * sa,
+            sa, ca, py - px * sa - py * ca,
+        )
+        # fmt: on
 
     @classmethod
-    def permutation(cls, *scaling):
-        """Create the permutation transform
+    def permutation(cls, *scaling: float) -> Affine:
+        """Create the permutation transform.
 
         For 2x2 matrices, there is only one permutation matrix that is
         not the identity.
 
-        :rtype: Affine
-        """
+        Parameters
+        ----------
+        *scaling : any
+            Ignored.
 
-        return tuple.__new__(cls, (0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0))
+        Returns
+        -------
+        Affine
+        """
+        return cls(0.0, 1.0, 0.0, 1.0, 0.0, 0.0)
 
     def __str__(self) -> str:
         """Concise string representation."""
         return (
-            "|% .2f,% .2f,% .2f|\n" "|% .2f,% .2f,% .2f|\n" "|% .2f,% .2f,% .2f|"
-        ) % self
+            f"|{self.a: .2f},{self.b: .2f},{self.c: .2f}|\n"
+            f"|{self.d: .2f},{self.e: .2f},{self.f: .2f}|\n"
+            f"|{self.g: .2f},{self.h: .2f},{self.i: .2f}|"
+        )
 
     def __repr__(self) -> str:
         """Precise string representation."""
-        return ("Affine(%r, %r, %r,\n" "       %r, %r, %r)") % self[:6]
+        return (
+            f"Affine({self.a!r}, {self.b!r}, {self.c!r},\n"
+            f"       {self.d!r}, {self.e!r}, {self.f!r})"
+        )
 
-    def to_gdal(self):
-        """Return same coefficient order as GDAL's SetGeoTransform().
+    def to_gdal(self) -> tuple[float, float, float, float, float, float]:
+        """Return same coefficient order expected by GDAL's SetGeoTransform().
 
-        :rtype: tuple
+        Returns
+        -------
+        tuple
+            Ordered: c, a, b, f, d, e.
         """
         return (self.c, self.a, self.b, self.f, self.d, self.e)
 
-    def to_shapely(self):
-        """Return an affine transformation matrix compatible with shapely
-
-        Shapely's affinity module expects an affine transformation matrix
-        in (a,b,d,e,xoff,yoff) order.
+    def to_shapely(self) -> tuple[float, float, float, float, float, float]:
+        """Return affine transformation parameters for shapely's affinity module.
 
-        :rtype: tuple
+        Returns
+        -------
+        tuple
+            Ordered: a, b, d, e, c, f.
         """
-        return (self.a, self.b, self.d, self.e, self.xoff, self.yoff)
+        return (self.a, self.b, self.d, self.e, self.c, self.f)
 
     @property
     def xoff(self) -> float:
-        """Alias for 'c'"""
+        """Alias for 'c'."""
         return self.c
 
     @property
     def yoff(self) -> float:
-        """Alias for 'f'"""
+        """Alias for 'f'."""
         return self.f
 
     @cached_property
     def determinant(self) -> float:
-        """The determinant of the transform matrix.
+        """Evaluate the determinant of the transform matrix.
 
         This value is equal to the area scaling factor when the
         transform is applied to a shape.
+
+        Returns
+        -------
+        float
         """
-        a, b, c, d, e, f, g, h, i = self
-        return a * e - b * d
+        return self.a * self.e - self.b * self.d
 
     @property
-    def _scaling(self):
+    def _scaling(self) -> tuple[float, float]:
         """The absolute scaling factors of the transformation.
 
-        This tuple represents the absolute value of the scaling factors of the
-        transformation, sorted from bigger to smaller.
+        This tuple represents the absolute value of the scaling factors
+        of the transformation, sorted from bigger to smaller.
         """
-        a, b, _, d, e, _, _, _, _ = self
+        a, b, d, e = self.a, self.b, self.d, self.e
 
         # The singular values are the square root of the eigenvalues
         # of the matrix times its transpose, M M*
         # Computing trace and determinant of M M*
-        trace = a ** 2 + b ** 2 + d ** 2 + e ** 2
-        det = (a * e - b * d) ** 2
+        trace = a**2 + b**2 + d**2 + e**2
+        det2 = (a * e - b * d) ** 2
 
-        delta = trace ** 2 / 4 - det
-        if delta < 1e-12:
-            delta = 0
+        delta = trace**2 / 4.0 - det2
+        if delta < EPSILON2:
+            delta = 0.0
 
-        l1 = math.sqrt(trace / 2 + math.sqrt(delta))
-        l2 = math.sqrt(trace / 2 - math.sqrt(delta))
+        sqrt_delta = math.sqrt(delta)
+        l1 = math.sqrt(trace / 2.0 + sqrt_delta)
+        l2 = math.sqrt(trace / 2.0 - sqrt_delta)
         return l1, l2
 
     @property
@@ -359,36 +371,37 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         This value represents the eccentricity of an ellipse under
         this affine transformation.
 
-        Raises NotImplementedError for improper transformations.
+        Raises
+        ------
+        NotImplementedError
+            For improper transformations.
         """
         l1, l2 = self._scaling
-        return math.sqrt(l1 ** 2 - l2 ** 2) / l1
+        return math.sqrt(l1**2 - l2**2) / l1
 
     @property
     def rotation_angle(self) -> float:
         """The rotation angle in degrees of the affine transformation.
 
-        This is the rotation angle in degrees of the affine transformation,
-        assuming it is in the form M = R S, where R is a rotation and S is a
-        scaling.
+        This is the rotation angle in degrees of the affine
+        transformation, assuming it is in the form M = R S, where R is
+        a rotation and S is a scaling.
 
-        Raises UndefinedRotationError for improper and degenerate
-        transformations.
+        Raises
+        ------
+        UndefinedRotationError
+            For improper and degenerate transformations.
         """
-        a, b, _, c, d, _, _, _, _ = self
         if self.is_proper or self.is_degenerate:
             l1, _ = self._scaling
-            y, x = c / l1, a / l1
-            return math.atan2(y, x) * 180 / math.pi
-        else:
-            raise UndefinedRotationError
+            y, x = self.d / l1, self.a / l1
+            return math.degrees(math.atan2(y, x))
+        raise UndefinedRotationError
 
     @property
     def is_identity(self) -> bool:
-        """True if this transform equals the identity matrix,
-        within rounding limits.
-        """
-        return self is identity or self.almost_equals(identity, self.precision)
+        """True if this transform equals the identity matrix, within rounding limits."""
+        return self is identity or self.almost_equals(identity, EPSILON)
 
     @property
     def is_rectilinear(self) -> bool:
@@ -397,9 +410,8 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         i.e., whether a shape would remain axis-aligned, within rounding
         limits, after applying the transform.
         """
-        a, b, c, d, e, f, g, h, i = self
-        return (abs(a) < self.precision and abs(e) < self.precision) or (
-            abs(d) < self.precision and abs(b) < self.precision
+        return (abs(self.a) < EPSILON and abs(self.e) < EPSILON) or (
+            abs(self.d) < EPSILON and abs(self.b) < EPSILON
         )
 
     @property
@@ -410,8 +422,7 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         transform, within rounding limits.  This implies that the
         transform has no effective shear.
         """
-        a, b, c, d, e, f, g, h, i = self
-        return abs(a * b + d * e) < self.precision
+        return abs(self.a * self.b + self.d * self.e) < EPSILON
 
     @property
     def is_orthonormal(self) -> bool:
@@ -423,48 +434,83 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         and unit-length.  Applying an orthonormal transform to a shape
         always results in a congruent shape.
         """
-        a, b, c, d, e, f, g, h, i = self
+        a, b, d, e = self.a, self.b, self.d, self.e
         return (
             self.is_conformal
-            and abs(1.0 - (a * a + d * d)) < self.precision
-            and abs(1.0 - (b * b + e * e)) < self.precision
+            and abs(1.0 - (a * a + d * d)) < EPSILON
+            and abs(1.0 - (b * b + e * e)) < EPSILON
         )
 
     @cached_property
     def is_degenerate(self) -> bool:
-        """True if this transform is degenerate.
+        """Return True if this transform is degenerate.
+
+        A degenerate transform will collapse a shape to an effective area
+        of zero, and cannot be inverted.
 
-        Which means that it will collapse a shape to an effective area
-        of zero. Degenerate transforms cannot be inverted.
+        Returns
+        -------
+        bool
         """
         return self.determinant == 0.0
 
     @cached_property
     def is_proper(self) -> bool:
-        """True if this transform is proper.
+        """Return True if this transform is proper.
 
-        Which means that it does not include reflection.
+        A proper transform (with a positive determinant) does not include
+        reflection.
+
+        Returns
+        -------
+        bool
         """
         return self.determinant > 0.0
 
     @property
-    def column_vectors(self):
-        """The values of the transform as three 2D column vectors"""
-        a, b, c, d, e, f, _, _, _ = self
-        return (a, d), (b, e), (c, f)
+    def column_vectors(
+        self,
+    ) -> tuple[tuple[float, float], tuple[float, float], tuple[float, float]]:
+        """The values of the transform as three 2D column vectors.
+
+        Returns
+        -------
+        tuple of three tuple pairs
+            Ordered (a, d), (b, e), (c, f).
+        """
+        return (self.a, self.d), (self.b, self.e), (self.c, self.f)
 
-    def almost_equals(self, other, precision: float = EPSILON) -> bool:
+    def almost_equals(self, other: Affine, precision: float | None = None) -> bool:
         """Compare transforms for approximate equality.
 
-        :param other: Transform being compared.
-        :type other: Affine
-        :return: True if absolute difference between each element
-            of each respective transform matrix < ``self.precision``.
+        Parameters
+        ----------
+        other : Affine
+            Transform being compared.
+        precision : float, default EPSILON
+            Precision to use to evaluate equality.
+
+        Returns
+        -------
+        bool
+            True if absolute difference between each element
+            of each respective transform matrix < ``precision``.
         """
-        for i in (0, 1, 2, 3, 4, 5):
-            if abs(self[i] - other[i]) >= precision:
-                return False
-        return True
+        precision = precision or EPSILON
+        return all(abs(sv - ov) < precision for sv, ov in zip(self, other))
+
+    @cached_property
+    def _astuple(self) -> tuple[float]:
+        return astuple(self)
+
+    def __getitem__(self, index):
+        return self._astuple[index]
+
+    def __iter__(self):
+        return iter(self._astuple)
+
+    def __len__(self):
+        return 9
 
     def __gt__(self, other) -> bool:
         return NotImplemented
@@ -480,104 +526,164 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
 
     __iadd__ = __add__
 
-    def __mul__(self, other):
-        """Multiplication
+    @overload
+    def __matmul__(self, other: Affine) -> Affine: ...
+    @overload
+    def __matmul__(self, other: tuple[float, float]) -> tuple[float, float]: ...
+    @overload
+    def __matmul__(
+        self, other: tuple[float, float, float]
+    ) -> tuple[float, float, float]: ...
+    # For other float sequences, we don't know the returned tuple length here
+    @overload
+    def __matmul__(self, other: Sequence[float]) -> tuple[float, ...]: ...
+    def __matmul__(self, other):
+        """Matrix multiplication.
 
         Apply the transform using matrix multiplication, creating
         a resulting object of the same type.  A transform may be applied
         to another transform, a vector, vector array, or shape.
 
-        :param other: The object to transform.
-        :type other: Affine, :class:`~planar.Vec2`,
-            :class:`~planar.Vec2Array`, :class:`~planar.Shape`
-        :rtype: Same as ``other``
+        Parameters
+        ----------
+        other : Affine or iterable of (vx, vy, [vw])
+
+        Returns
+        -------
+        Affine or a tuple of two or three items
         """
-        sa, sb, sc, sd, se, sf, _, _, _ = self
+        sa, sb, sc, sd, se, sf = self[:6]
         if isinstance(other, Affine):
-            oa, ob, oc, od, oe, of, _, _, _ = other
-            return tuple.__new__(
-                self.__class__,
-                (
-                    sa * oa + sb * od,
-                    sa * ob + sb * oe,
-                    sa * oc + sb * of + sc,
-                    sd * oa + se * od,
-                    sd * ob + se * oe,
-                    sd * oc + se * of + sf,
-                    0.0,
-                    0.0,
-                    1.0,
-                ),
+            oa, ob, oc, od, oe, of = other[:6]
+            return self.__class__(
+                sa * oa + sb * od,
+                sa * ob + sb * oe,
+                sa * oc + sb * of + sc,
+                sd * oa + se * od,
+                sd * ob + se * oe,
+                sd * oc + se * of + sf,
             )
-        else:
+        # vector of 2 or 3 items
+        try:
+            num_items = len(other)
+        except (TypeError, ValueError):
+            return NotImplemented
+        if num_items == 2:
+            vx, vy = other
+        elif num_items == 3:
+            vx, vy, vw = other
+            vw_eq_one = vw == 1.0
             try:
-                vx, vy = other
-                return (vx * sa + vy * sb + sc, vx * sd + vy * se + sf)
-            except (ValueError, TypeError):
-                return NotImplemented
+                is_eq_one = bool(vw_eq_one)
+                msg = "third value must be 1.0"
+            except ValueError:
+                is_eq_one = (vw_eq_one).all()
+                msg = "third values must all be 1.0"
+            if not is_eq_one:
+                raise ValueError(msg)
+        else:
+            raise TypeError("expected vector of 2 or 3 items")
+        px = vx * sa + vy * sb + sc
+        py = vx * sd + vy * se + sf
+        if num_items == 2:
+            return (px, py)
+        return (px, py, vw)
+
+    def __rmatmul__(self, other):
+        return NotImplemented
 
-    def __rmul__(self, other):
-        """Right hand multiplication
+    def __imatmul__(self, other):  # type: ignore
+        if not isinstance(other, Affine):
+            raise TypeError("Operation not supported")
+        return NotImplemented
 
-        .. deprecated:: 2.3.0
-            Right multiplication will be prohibited in version 3.0. This method
-            will raise AffineError.
+    @overload
+    def __mul__(self, other: Affine) -> Affine: ...
+    @overload
+    def __mul__(self, other: tuple[float, float]) -> tuple[float, float]: ...
+    def __mul__(self, other):
+        """Multiplication.
 
-        Notes
-        -----
-        We should not be called if other is an affine instance This is
-        just a guarantee, since we would potentially return the wrong
-        answer in that case.
-        """
-        warnings.warn(
-            "Right multiplication will be prohibited in version 3.0",
-            DeprecationWarning,
-            stacklevel=2,
-        )
-        assert not isinstance(other, Affine)
-        return self.__mul__(other)
+        Apply the transform using matrix multiplication, creating
+        a resulting object of the same type.  A transform may be applied
+        to another transform, a vector, vector array, or shape.
 
-    def __imul__(self, other):
-        if isinstance(other, Affine) or isinstance(other, tuple):
-            return self.__mul__(other)
-        else:
+        Parameters
+        ----------
+        other : Affine or iterable of (vx, vy)
+
+        Returns
+        -------
+        Affine or a tuple of two items
+        """
+        # TODO: consider enabling this for 3.1
+        # warnings.warn(
+        #     "Use `@` matmul instead of `*` mul operator for matrix multiplication",
+        #     PendingDeprecationWarning,
+        #     stacklevel=2,
+        # )
+        if isinstance(other, Affine):
+            return self.__matmul__(other)
+        try:
+            _, _ = other
+            return self.__matmul__(other)
+        except (ValueError, TypeError):
             return NotImplemented
 
-    def itransform(self, seq) -> None:
-        """Transform a sequence of points or vectors in place.
+    def __rmul__(self, other):
+        return NotImplemented
+
+    def __imul__(self, other):  # type: ignore
+        if isinstance(other, tuple):
+            warnings.warn(
+                "in-place multiplication with tuple is deprecated",
+                DeprecationWarning,
+                stacklevel=2,
+            )
+        return NotImplemented
+
+    def itransform(self, seq: MutableSequence[Sequence[float]]) -> None:
+        """Transform a sequence of points or vectors in-place.
+
+        Parameters
+        ----------
+        seq : mutable sequence
 
-        :param seq: Mutable sequence of :class:`~planar.Vec2` to be
-            transformed.
-        :returns: None, the input sequence is mutated in place.
+        Returns
+        -------
+        None
+            The input sequence is mutated in-place.
         """
         if self is not identity and self != identity:
-            sa, sb, sc, sd, se, sf, _, _, _ = self
+            sa, sb, sc, sd, se, sf = self[:6]
             for i, (x, y) in enumerate(seq):
                 seq[i] = (x * sa + y * sb + sc, x * sd + y * se + sf)
 
     def __invert__(self):
         """Return the inverse transform.
 
-        :raises: :except:`TransformNotInvertible` if the transform
-            is degenerate.
+        Raises
+        ------
+        TransformNotInvertible
+            If the transform is degenerate.
         """
         if self.is_degenerate:
             raise TransformNotInvertibleError("Cannot invert degenerate transform")
         idet = 1.0 / self.determinant
-        sa, sb, sc, sd, se, sf, _, _, _ = self
+        sa, sb, sc, sd, se, sf = self[:6]
         ra = se * idet
         rb = -sb * idet
         rd = -sd * idet
         re = sa * idet
-        return tuple.__new__(
-            self.__class__,
-            (ra, rb, -sc * ra - sf * rb, rd, re, -sc * rd - sf * re, 0.0, 0.0, 1.0),
+        # fmt: off
+        return self.__class__(
+            ra, rb, -sc * ra - sf * rb,
+            rd, re, -sc * rd - sf * re,
         )
-
-    __hash__ = tuple.__hash__  # hash is not inherited in Py 3
+        # fmt: on
 
     def __getnewargs__(self):
-        """Pickle protocol support
+        """Pickle protocol support.
 
         Notes
         -----
@@ -585,7 +691,7 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         9 elements rather than the 6 that are required for the
         constructor.  This method ensures that only the 6 are provided.
         """
-        return self.a, self.b, self.c, self.d, self.e, self.f
+        return self[:6]
 
 
 identity = Affine(1, 0, 0, 0, 1, 0)
@@ -594,32 +700,71 @@ identity = Affine(1, 0, 0, 0, 1, 0)
 # Miscellaneous utilities
 
 
-def loadsw(s: str):
-    """Returns Affine from the contents of a world file string.
+def loadsw(s: str) -> Affine:
+    """Return Affine from the contents of a world file string.
 
     This method also translates the coefficients from center- to
     corner-based coordinates.
 
-    :param s: str with 6 floats ordered in a world file.
-    :rtype: Affine
+    Parameters
+    ----------
+    s : str
+        String with 6 floats ordered in a world file.
+
+    Returns
+    -------
+    Affine
     """
     if not hasattr(s, "split"):
         raise TypeError("Cannot split input string")
     coeffs = s.split()
     if len(coeffs) != 6:
-        raise ValueError("Expected 6 coefficients, found %d" % len(coeffs))
+        raise ValueError(f"Expected 6 coefficients, found {len(coeffs)}")
     a, d, b, e, c, f = (float(x) for x in coeffs)
-    center = tuple.__new__(Affine, [a, b, c, d, e, f, 0.0, 0.0, 1.0])
-    return center * Affine.translation(-0.5, -0.5)
+    center = Affine(a, b, c, d, e, f)
+    return center @ Affine.translation(-0.5, -0.5)
 
 
-def dumpsw(obj) -> str:
+def dumpsw(obj: Affine) -> str:
     """Return string for a world file.
 
     This method also translates the coefficients from corner- to
     center-based coordinates.
 
-    :rtype: str
+    Returns
+    -------
+    str
     """
-    center = obj * Affine.translation(0.5, 0.5)
+    center = obj @ Affine.translation(0.5, 0.5)
     return "\n".join(repr(getattr(center, x)) for x in list("adbecf")) + "\n"
+
+
+def set_epsilon(epsilon: float) -> None:
+    """Set the global absolute error value and rounding limit.
+
+    This value is accessible via the affine.EPSILON global variable.
+
+    Parameters
+    ----------
+    epsilon : float
+        The global absolute error value and rounding limit for
+        approximate floating point comparison operations.
+
+    Returns
+    -------
+    None
+
+    Notes
+    -----
+    The default value of ``0.00001`` is suitable for values that are in
+    the "countable range". You may need a larger epsilon when using
+    large absolute values, and a smaller value for very small values
+    close to zero. Otherwise approximate comparison operations will not
+    behave as expected.
+    """
+    global EPSILON, EPSILON2
+    EPSILON = float(epsilon)
+    EPSILON2 = EPSILON**2
+
+
+set_epsilon(1e-5)


=====================================
src/affine/py.typed
=====================================


=====================================
affine/tests/__init__.py ? tests/__init__.py
=====================================


=====================================
tests/test_numpy.py
=====================================
@@ -0,0 +1,132 @@
+"""Test interoperability with NumPy."""
+
+import pytest
+
+from affine import Affine
+
+try:
+    import numpy as np
+    from numpy import testing
+except ImportError:
+    pytest.skip("requires numpy", allow_module_level=True)
+
+
+def test_array():
+    """Affine instance has 9 elements, becomes 1-D Numpy array."""
+    assert np.array(Affine.identity()).shape == (9,)
+
+
+def test_linalg():
+    # cross-check properties with numpy's linear algebra module
+    ar = np.array(
+        [
+            [0, -2, 2],
+            [3, 0, 5],
+            [0, 0, 1],
+        ]
+    )
+    tfm = Affine(*ar.flatten())
+    assert tfm.determinant == pytest.approx(6.0)
+    assert np.linalg.det(ar) == pytest.approx(6.0)
+
+    expected_inv = np.array(
+        [
+            [0, 1 / 3, -5 / 3],
+            [-1 / 2, 0, 1],
+            [0, 0, 1],
+        ]
+    )
+    testing.assert_allclose(np.array(~tfm).reshape(3, 3), expected_inv)
+    testing.assert_allclose(np.linalg.inv(ar), expected_inv)
+
+
+def test_matmul_3x3_array():
+    A = Affine(2, 0, 3, 0, 3, 2)
+    Ar = np.array(A).reshape(3, 3)
+
+    # matrix @ matrix = matrix
+    res = A @ Affine.identity()
+    assert isinstance(res, Affine)
+    testing.assert_equal(np.array(res).reshape(3, 3), Ar)
+    res = Ar @ np.eye(3)
+    assert isinstance(res, np.ndarray)
+    testing.assert_equal(res, Ar)
+
+
+def test_matmul_vector():
+    A = Affine(2, 0, 3, 0, 3, 2)
+    Ar = np.array(A).reshape(3, 3)
+
+    # matrix @ vector = vector
+    v = (2, 3, 1)
+    vr = np.array(v)
+    expected_p = (7, 11, 1)
+    res = A @ v
+    assert isinstance(res, tuple)
+    testing.assert_equal(res, expected_p)
+    res = A @ vr
+    assert isinstance(res, tuple)
+    testing.assert_equal(res, expected_p)
+    res = Ar @ vr
+    assert isinstance(res, np.ndarray)
+    testing.assert_equal(res, expected_p)
+
+
+def test_matmul_items():
+    A = Affine(2, 0, 3, 0, 3, 2) @ Affine.rotation(45)
+    shape = (4, 5)
+    vx, vy = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]))
+    expected_px = np.array(
+        [
+            [3.0, 4.4142137, 5.8284273, 7.2426405, 8.656855],
+            [1.5857865, 3.0, 4.4142137, 5.8284273, 7.2426405],
+            [0.17157288, 1.5857865, 3.0, 4.4142137, 5.8284273],
+            [-1.2426407, 0.17157288, 1.5857865, 3.0, 4.4142137],
+        ]
+    )
+    expected_py = np.array(
+        [
+            [2.0, 4.1213202, 6.2426405, 8.363961, 10.485281],
+            [4.1213202, 6.2426405, 8.363961, 10.485281, 12.606602],
+            [6.2426405, 8.363961, 10.485281, 12.606602, 14.727922],
+            [8.363961, 10.485281, 12.606602, 14.727922, 16.849243],
+        ]
+    )
+    px, py = A @ (vx, vy)
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+
+    px, py, pw = A @ (vx, vy, 1)
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+    assert pw == 1
+
+    px, py, pw = A @ (vx, vy, np.ones(shape))
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+    testing.assert_array_equal(pw, np.ones(shape))
+
+    # see GH-125 with mul `*` op
+    px, py = A * (vx, vy)
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+
+
+def test_matmul_item_errors():
+    shape = (4, 5)
+    vx, vy = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]))
+    with pytest.raises(ValueError, match=r"third value must be 1.0"):
+        Affine.identity() @ (vx, vy, 2)
+    with pytest.raises(ValueError, match=r"third values must all be 1.0"):
+        Affine.identity() @ (vx, vy, np.zeros(shape))
+    with pytest.raises(TypeError, match="2 or 3 items"):
+        Affine.identity() @ (vx, vy, np.ones(shape), np.ones(shape))
+
+
+def test_mul_item_errors():
+    shape = (4, 5)
+    vx, vy = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]))
+    with pytest.raises(TypeError):
+        Affine.identity() * (vx, vy, 1)
+    with pytest.raises(TypeError):
+        Affine.identity() * (vx, vy, np.zeros(shape))


=====================================
affine/tests/test_pickle.py ? tests/test_pickle.py
=====================================
@@ -2,9 +2,8 @@
 Validate that instances of `affine.Affine()` can be pickled and unpickled.
 """
 
-
-import pickle
 from multiprocessing import Pool
+import pickle
 
 import affine
 


=====================================
affine/tests/test_rotation.py ? tests/test_rotation.py
=====================================
@@ -1,5 +1,7 @@
 import math
 
+import pytest
+
 from affine import Affine
 
 
@@ -14,7 +16,7 @@ def test_rotation_angle():
         |
         0---------*
 
-    Affine.rotation(45.0) * (1.0, 0.0) == (0.707..., 0.707...)
+    Affine.rotation(45.0) @ (1.0, 0.0) == (0.707..., 0.707...)
 
         |
         |      *
@@ -22,9 +24,10 @@ def test_rotation_angle():
         |
         0----------
     """
-    x, y = Affine.rotation(45.0) * (1.0, 0.0)
-    assert round(x, 14) == round(math.sqrt(2.0) / 2.0, 14)
-    assert round(y, 14) == round(math.sqrt(2.0) / 2.0, 14)
+    x, y = Affine.rotation(45.0) @ (1.0, 0.0)
+    sqrt2div2 = math.sqrt(2.0) / 2.0
+    assert x == pytest.approx(sqrt2div2)
+    assert y == pytest.approx(sqrt2div2)
 
 
 def test_rotation_matrix():
@@ -34,12 +37,16 @@ def test_rotation_matrix():
     | sin(a)  cos(a) |
 
     """
-    rot = Affine.rotation(90.0)
-    assert round(rot.a, 15) == round(math.cos(math.pi / 2.0), 15)
-    assert round(rot.b, 15) == round(-math.sin(math.pi / 2.0), 15)
+    deg = 90.0
+    rot = Affine.rotation(deg)
+    rad = math.radians(deg)
+    cosrad = math.cos(rad)
+    sinrad = math.sin(rad)
+    assert rot.a == pytest.approx(cosrad)
+    assert rot.b == pytest.approx(-sinrad)
     assert rot.c == 0.0
-    assert round(rot.d, 15) == round(math.sin(math.pi / 2.0), 15)
-    assert round(rot.e, 15) == round(math.cos(math.pi / 2.0), 15)
+    assert rot.d == pytest.approx(sinrad)
+    assert rot.e == pytest.approx(cosrad)
     assert rot.f == 0.0
 
 
@@ -48,8 +55,8 @@ def test_rotation_matrix_pivot():
     rot = Affine.rotation(90.0, pivot=(1.0, 1.0))
     exp = (
         Affine.translation(1.0, 1.0)
-        * Affine.rotation(90.0)
-        * Affine.translation(-1.0, -1.0)
+        @ Affine.rotation(90.0)
+        @ Affine.translation(-1.0, -1.0)
     )
     for r, e in zip(rot, exp):
-        assert round(r, 15) == round(e, 15)
+        assert r == pytest.approx(e)


=====================================
affine/tests/test_serialize.py ? tests/test_serialize.py
=====================================


=====================================
tests/test_transform.py
=====================================
@@ -0,0 +1,658 @@
+#############################################################################
+# Planar is Copyright (c) 2010 by Casey Duncan
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+#   this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name(s) of the copyright holders nor the names of its
+#   contributors may be used to endorse or promote products derived from this
+#   software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AS IS AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#############################################################################
+
+"""Transform unit tests"""
+
+import math
+from textwrap import dedent
+
+import pytest
+
+import affine
+from affine import Affine
+
+
+def seq_almost_equal(t1, t2, error=0.00001):
+    assert len(t1) == len(t2), f"{t1!r} != {t2!r}"
+    for m1, m2 in zip(t1, t2):
+        assert abs(m1 - m2) <= error, f"{t1!r} != {t2!r}"
+
+
+def test_zero_args():
+    with pytest.raises(TypeError):
+        Affine()
+
+
+def test_wrong_arg_type():
+    with pytest.raises(TypeError):
+        Affine(None)
+
+
+def test_args_too_few():
+    with pytest.raises(TypeError):
+        Affine(1, 2)
+
+
+def test_args_too_many():
+    with pytest.raises(TypeError):
+        Affine(*range(10))
+
+
+def test_args_members_wrong_type():
+    with pytest.raises(TypeError):
+        Affine(0, 2, 3, None, None, "")
+
+
+def test_len():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert len(t) == 9
+
+
+def test_slice_last_row():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t[-3:] == (0, 0, 1)
+
+
+def test_members():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t.a == 1
+    assert t.b == 2
+    assert t.c == 3
+    assert t.d == 4
+    assert t.e == 5
+    assert t.f == 6
+    assert t.g == 0
+    assert t.h == 0
+    assert t.i == 1
+    # these are aliases
+    assert t.c is t.xoff
+    assert t.f is t.yoff
+
+
+def test_members_are_floats():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    for m in t:
+        assert isinstance(m, float), repr(m)
+
+
+def test_getitem():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t[0] == 1
+    assert t[1] == 2
+    assert t[2] == 3
+    assert t[3] == 4
+    assert t[4] == 5
+    assert t[5] == 6
+    assert t[6] == 0
+    assert t[7] == 0
+    assert t[8] == 1
+    assert t[-1] == 1
+
+
+def test_getitem_wrong_type():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    with pytest.raises(TypeError):
+        t["foobar"]
+
+
+def test_str():
+    t = Affine(1.111, 2.222, 3.333, -4.444, -5.555, 6.666)
+    assert str(t) == dedent(
+        """\
+        | 1.11, 2.22, 3.33|
+        |-4.44,-5.55, 6.67|
+        | 0.00, 0.00, 1.00|"""
+    )
+
+
+def test_repr():
+    t = Affine(1.111, 2.222, 3.456, 4.444, 5.5, 6.25)
+    assert repr(t) == dedent(
+        """\
+        Affine(1.111, 2.222, 3.456,
+               4.444, 5.5, 6.25)"""
+    )
+
+
+def test_identity_constructor():
+    ident = Affine.identity()
+    assert isinstance(ident, Affine)
+    assert tuple(ident) == (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)
+    assert ident.is_identity
+
+
+def test_permutation_constructor():
+    perm = Affine.permutation()
+    assert isinstance(perm, Affine)
+    assert tuple(perm) == (0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0)
+    assert (perm @ perm).is_identity
+
+
+def test_translation_constructor():
+    trans = Affine.translation(2, -5)
+    assert isinstance(trans, Affine)
+    assert tuple(trans) == (1.0, 0.0, 2.0, 0.0, 1.0, -5.0, 0.0, 0.0, 1.0)
+
+
+def test_scale_constructor():
+    scale = Affine.scale(5)
+    assert isinstance(scale, Affine)
+    assert tuple(scale) == (5, 0, 0, 0, 5, 0, 0, 0, 1)
+    scale = Affine.scale(-1, 2)
+    assert tuple(scale) == (-1, 0, 0, 0, 2, 0, 0, 0, 1)
+    assert tuple(Affine.scale(1)) == tuple(Affine.identity())
+
+
+def test_shear_constructor():
+    shear = Affine.shear(30)
+    assert isinstance(shear, Affine)
+    mx = math.tan(math.radians(30))
+    seq_almost_equal(tuple(shear), (1, mx, 0, 0, 1, 0, 0, 0, 1))
+    shear = Affine.shear(-15, 60)
+    mx = math.tan(math.radians(-15))
+    my = math.tan(math.radians(60))
+    seq_almost_equal(tuple(shear), (1, mx, 0, my, 1, 0, 0, 0, 1))
+    shear = Affine.shear(y_angle=45)
+    seq_almost_equal(tuple(shear), (1, 0, 0, 1, 1, 0, 0, 0, 1))
+
+
+def test_rotation_constructor():
+    rot = Affine.rotation(60)
+    assert isinstance(rot, Affine)
+    r = math.radians(60)
+    s, c = math.sin(r), math.cos(r)
+    assert tuple(rot) == (c, -s, 0, s, c, 0, 0, 0, 1)
+    rot = Affine.rotation(337)
+    r = math.radians(337)
+    s, c = math.sin(r), math.cos(r)
+    seq_almost_equal(tuple(rot), (c, -s, 0, s, c, 0, 0, 0, 1))
+    assert tuple(Affine.rotation(0)) == tuple(Affine.identity())
+
+
+def test_rotation_constructor_quadrants():
+    assert tuple(Affine.rotation(0)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(90)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(-180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(270)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(-90)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(360)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(450)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(-450)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
+
+
+def test_rotation_constructor_with_pivot():
+    assert tuple(Affine.rotation(60)) == tuple(Affine.rotation(60, pivot=(0, 0)))
+    rot = Affine.rotation(27, pivot=(2, -4))
+    r = math.radians(27)
+    s, c = math.sin(r), math.cos(r)
+    # fmt: off
+    assert tuple(rot) == (
+        c, -s, 2 - 2 * c - 4 * s,
+        s, c, -4 - 2 * s + 4 * c,
+        0, 0, 1,
+    )
+    # fmt: on
+    assert tuple(Affine.rotation(0, (-3, 2))) == tuple(Affine.identity())
+
+
+def test_rotation_contructor_wrong_arg_types():
+    with pytest.raises(TypeError):
+        Affine.rotation(1, 1)
+
+
+def test_determinant():
+    assert Affine.identity().determinant == 1
+    assert Affine.scale(2).determinant == 4
+    assert Affine.scale(0).determinant == 0
+    assert Affine.scale(5, 1).determinant == 5
+    assert Affine.scale(-1, 1).determinant == -1
+    assert Affine.scale(-1, 0).determinant == 0
+    assert Affine.rotation(77).determinant == pytest.approx(1)
+    assert Affine.translation(32, -47).determinant == pytest.approx(1)
+
+
+def test_is_rectilinear():
+    assert Affine.identity().is_rectilinear
+    assert Affine.scale(2.5, 6.1).is_rectilinear
+    assert Affine.translation(4, -1).is_rectilinear
+    assert Affine.rotation(90).is_rectilinear
+    assert not Affine.shear(4, -1).is_rectilinear
+    assert not Affine.rotation(-26).is_rectilinear
+
+
+def test_is_conformal():
+    assert Affine.identity().is_conformal
+    assert Affine.scale(2.5, 6.1).is_conformal
+    assert Affine.translation(4, -1).is_conformal
+    assert Affine.rotation(90).is_conformal
+    assert Affine.rotation(-26).is_conformal
+    assert not Affine.shear(4, -1).is_conformal
+
+
+def test_is_orthonormal():
+    assert Affine.identity().is_orthonormal
+    assert Affine.translation(4, -1).is_orthonormal
+    assert Affine.rotation(90).is_orthonormal
+    assert Affine.rotation(-26).is_orthonormal
+    assert not Affine.scale(2.5, 6.1).is_orthonormal
+    assert not Affine.scale(0.5, 2).is_orthonormal
+    assert not Affine.shear(4, -1).is_orthonormal
+
+
+def test_is_degenerate():
+    assert not Affine.identity().is_degenerate
+    assert not Affine.translation(2, -1).is_degenerate
+    assert not Affine.shear(0, -22.5).is_degenerate
+    assert not Affine.rotation(88.7).is_degenerate
+    assert not Affine.scale(0.5).is_degenerate
+    assert Affine.scale(0).is_degenerate
+    assert Affine.scale(-10, 0).is_degenerate
+    assert Affine.scale(0, 300).is_degenerate
+    assert Affine.scale(0).is_degenerate
+    assert Affine.scale(0).is_degenerate
+
+
+def test_column_vectors():
+    a, b, c = Affine(2, 3, 4, 5, 6, 7).column_vectors
+    assert isinstance(a, tuple)
+    assert isinstance(b, tuple)
+    assert isinstance(c, tuple)
+    assert a == (2, 5)
+    assert b == (3, 6)
+    assert c == (4, 7)
+
+
+def test_almost_equals():
+    EPSILON = 1e-5
+    E = EPSILON * 0.5
+    t = Affine(1.0, E, 0, -E, 1.0 + E, E)
+    assert t.almost_equals(Affine.identity())
+    assert Affine.identity().almost_equals(t)
+    assert t.almost_equals(t)
+    t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
+    assert not t.almost_equals(Affine.identity())
+    assert not Affine.identity().almost_equals(t)
+    assert t.almost_equals(t)
+
+
+def test_almost_equals_2():
+    EPSILON = 1e-10
+    E = EPSILON * 0.5
+    t = Affine(1.0, E, 0, -E, 1.0 + E, E)
+    assert t.almost_equals(Affine.identity(), precision=EPSILON)
+    assert Affine.identity().almost_equals(t, precision=EPSILON)
+    assert t.almost_equals(t, precision=EPSILON)
+    t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
+    assert not t.almost_equals(Affine.identity(), precision=EPSILON)
+    assert not Affine.identity().almost_equals(t, precision=EPSILON)
+    assert t.almost_equals(t, precision=EPSILON)
+
+
+def test_equality():
+    t1 = Affine(1, 2, 3, 4, 5, 6)
+    t2 = Affine(6, 5, 4, 3, 2, 1)
+    t3 = Affine(1, 2, 3, 4, 5, 6)
+    assert t1 == t3
+    assert t1 != t2
+    assert t2 == t2
+    assert t1 == t3
+    assert t2 == t2
+    assert t1 != t2
+    assert t1 != 1
+    assert t1 != 1
+
+
+def test_gt():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) > Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_lt():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) < Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_add():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) + Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_sub():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) - Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_matmul_by_identity():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert tuple(t @ Affine.identity()) == tuple(t)
+
+
+def test_matmul_transform():
+    t = Affine.rotation(5) @ Affine.rotation(29)
+    assert isinstance(t, Affine)
+    seq_almost_equal(t, Affine.rotation(34))
+    t = Affine.scale(3, 5) @ Affine.scale(2)
+    seq_almost_equal(t, Affine.scale(6, 10))
+
+
+def test_itransform():
+    pts = [(4, 1), (-1, 0), (3, 2)]
+    r = Affine.scale(-2).itransform(pts)
+    assert r is None, r
+    assert pts == [(-8, -2), (2, 0), (-6, -4)]
+
+    A = Affine.rotation(33)
+    pts = [(4, 1), (-1, 0), (3, 2)]
+    pts_expect = [A @ pt for pt in pts]
+    r = A.itransform(pts)
+    assert r is None
+    assert pts == pts_expect
+
+
+def test_mul_wrong_type():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) * None
+
+
+def test_matmul_wrong_type():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) @ None
+
+
+def test_matmul_sequence_wrong_member_types():
+    class NotPtSeq:
+        @classmethod
+        def from_points(cls, points):
+            list(points)
+
+        def __iter__():
+            yield 0
+
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) * NotPtSeq()
+
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) @ NotPtSeq()
+
+
+def test_imul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        t *= 2.0
+
+
+def test_imatmul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        t @= 2.0
+    with pytest.raises(TypeError):
+        t @= (1, 2)
+    with pytest.raises(TypeError):
+        t @= (1, 2, 1)
+
+
+def test_imul_tuple():
+    t = Affine.translation(3, 5)
+    with pytest.deprecated_call():
+        t *= (4, 5)
+    assert isinstance(t, tuple)  # changes type!
+    assert t == (7.0, 10.0)
+
+
+def test_imul_transform():
+    t = Affine.translation(3, 5)
+    t *= Affine.translation(-2, 3.5)
+    assert isinstance(t, Affine)
+    seq_almost_equal(t, Affine.translation(1, 8.5))
+
+
+def test_imatmul_transform():
+    t = Affine.translation(3, 5)
+    t @= Affine.translation(-2, 3.5)
+    assert isinstance(t, Affine)
+    seq_almost_equal(t, Affine.translation(1, 8.5))
+
+
+def test_inverse():
+    seq_almost_equal(~Affine.identity(), Affine.identity())
+    seq_almost_equal(~Affine.translation(2, -3), Affine.translation(-2, 3))
+    seq_almost_equal(~Affine.rotation(-33.3), Affine.rotation(33.3))
+    t = Affine(1, 2, 3, 4, 5, 6)
+    seq_almost_equal(~t @ t, Affine.identity())
+
+
+def test_cant_invert_degenerate():
+    t = Affine.scale(0)
+    with pytest.raises(affine.TransformNotInvertibleError):
+        ~t
+
+
+def test_bad_type_world():
+    """wrong type, i.e don't use readlines()"""
+    with pytest.raises(TypeError):
+        affine.loadsw(["1.0", "0.0", "0.0", "1.0", "0.0", "0.0"])
+
+
+def test_bad_value_world():
+    """Wrong number of parameters."""
+    with pytest.raises(ValueError, match="Expected 6 coefficients"):
+        affine.loadsw("1.0\n0.0\n0.0\n1.0\n0.0\n0.0\n0.0")
+
+
+def test_simple_world():
+    s = "1.0\n0.0\n0.0\n-1.0\n100.5\n199.5\n"
+    a = affine.loadsw(s)
+    assert a == Affine(1.0, 0.0, 100.0, 0.0, -1.0, 200.0)
+    assert affine.dumpsw(a) == s
+
+
+def test_real_world():
+    s = dedent(
+        """\
+                39.9317755024
+                30.0907511581
+                30.0907511576
+            -39.9317755019
+        2658137.2266720217
+        5990821.7039887439"""
+    )  # no EOL
+    a1 = affine.loadsw(s)
+    assert a1.almost_equals(
+        Affine(
+            39.931775502364644,
+            30.090751157602412,
+            2658102.2154086917,
+            30.090751157602412,
+            -39.931775502364644,
+            5990826.624500916,
+        )
+    )
+    a1out = affine.dumpsw(a1)
+    assert isinstance(a1out, str)
+    a2 = affine.loadsw(a1out)
+    assert a1.almost_equals(a2)
+
+
+def test_gdal():
+    t = Affine.from_gdal(-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
+    assert t.c == t.xoff == -237481.5
+    assert t.a == 425.0
+    assert t.b == 0.0
+    assert t.f == t.yoff == 237536.4
+    assert t.d == 0.0
+    assert t.e == -425.0
+    assert tuple(t) == (425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4, 0, 0, 1)
+    assert t.to_gdal() == (-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
+
+
+def test_shapely():
+    t = Affine(425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4)
+    assert t.to_shapely() == (425.0, 0.0, 0.0, -425, -237481.5, 237536.4)
+
+
+def test_rmul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        (1.0, 1.0) * t
+
+
+def test_rmatmul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        (1.0, 1.0) @ t
+    with pytest.raises(TypeError):
+        (1.0, 1.0, 1.0) @ t
+
+
+def test_mul_tuple():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t * (2, 2) == (9, 24)
+    with pytest.raises(TypeError):
+        t * (2, 2, 1)
+
+
+def test_associative():
+    point = (12, 5)
+    trans = Affine.translation(-10.0, -5.0)
+    rot90 = Affine.rotation(90.0)
+    result1 = rot90 @ (trans @ point)
+    result2 = (rot90 @ trans) @ point
+    seq_almost_equal(result1, (0.0, 2.0))
+    seq_almost_equal(result1, result2)
+
+
+def test_roundtrip():
+    point = (12, 5)
+    trans = Affine.translation(3, 4)
+    rot37 = Affine.rotation(37.0)
+    point_prime = (trans @ rot37) @ point
+    roundtrip_point = ~(trans @ rot37) @ point_prime
+    seq_almost_equal(point, roundtrip_point)
+
+
+def test_eccentricity():
+    assert Affine.identity().eccentricity == 0.0
+    assert Affine.scale(2).eccentricity == 0.0
+    # assert_equal(Affine.scale(0).eccentricity, ?)
+    assert Affine.scale(2, 1).eccentricity == pytest.approx(math.sqrt(3) / 2)
+    assert Affine.scale(2, 3).eccentricity == pytest.approx(math.sqrt(5) / 3)
+    assert Affine.scale(1, 0).eccentricity == 1.0
+    assert Affine.rotation(77).eccentricity == pytest.approx(0.0)
+    assert Affine.translation(32, -47).eccentricity == pytest.approx(0.0)
+    assert Affine.scale(-1, 1).eccentricity == pytest.approx(0.0)
+
+
+def test_eccentricity_complex():
+    assert (Affine.scale(2, 3) @ Affine.rotation(77)).eccentricity == pytest.approx(
+        math.sqrt(5) / 3
+    )
+    assert (Affine.rotation(77) @ Affine.scale(2, 3)).eccentricity == pytest.approx(
+        math.sqrt(5) / 3
+    )
+    assert (
+        Affine.translation(32, -47) @ Affine.rotation(77) @ Affine.scale(2, 3)
+    ).eccentricity == pytest.approx(math.sqrt(5) / 3)
+
+
+def test_rotation_angle():
+    assert Affine.identity().rotation_angle == 0.0
+    assert Affine.scale(2).rotation_angle == 0.0
+    assert Affine.scale(2, 1).rotation_angle == 0.0
+    assert Affine.translation(32, -47).rotation_angle == pytest.approx(0.0)
+    assert Affine.rotation(30).rotation_angle == pytest.approx(30)
+    assert Affine.rotation(-150).rotation_angle == pytest.approx(-150)
+
+
+def test_rotation_improper():
+    with pytest.raises(affine.UndefinedRotationError):
+        Affine.scale(-1, 1).rotation_angle
+
+
+# See gh-71 for bug report motivating this test.
+def test_mul_fallback_unpack():
+    """Support fallback in case that other is a single object."""
+
+    class TextPoint:
+        """Not iterable, will trigger ValueError in Affine.__mul__."""
+
+        def __rmul__(self, other):
+            return other * (1, 2)
+
+        def __rmatmul__(self, other):
+            return other @ (1, 2)
+
+    assert Affine.identity() * TextPoint() == (1, 2)
+
+    assert Affine.identity() @ TextPoint() == (1, 2)
+
+
+# See gh-71 for bug report motivating this test.
+def test_mul_fallback_type_error():
+    """Support fallback in case that other is an unexpected type."""
+
+    class TextPoint:
+        """Iterable, but values trigger TypeError in Affine.__mul__."""
+
+        def __iter__(self):
+            return ("1", "2")
+
+        def __rmul__(self, other):
+            return other * (1, 2)
+
+        def __rmatmul__(self, other):
+            return other @ (1, 2)
+
+    assert Affine.identity() * TextPoint() == (1, 2)
+    assert Affine.identity() @ TextPoint() == (1, 2)
+
+
+def test_init_invalid_g():
+    with pytest.raises(ValueError, match="g must"):
+        Affine(0, 0, 0, 0, 0, 0, 1)
+
+
+def test_init_invalid_h():
+    with pytest.raises(ValueError, match="h must"):
+        Affine(0, 0, 0, 0, 0, 0, 0, 1)
+
+
+def test_init_invalid_i():
+    with pytest.raises(ValueError, match="i must"):
+        Affine(0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+
+def test_matmul_invalid_vector():
+    with pytest.raises(ValueError, match=r"must be 1.0"):
+        Affine.identity() @ (2.0, 3.0, 0.0)
+
+
+ at pytest.mark.parametrize("vec", [(2.0,), (2.0, 2.0, 1.0, 1.0)])
+def test_matmul_invalid_vector_2(vec):
+    with pytest.raises(TypeError, match="2 or 3 items"):
+        Affine.identity() @ vec


=====================================
tox.ini
=====================================
@@ -1,11 +1,11 @@
 [tox]
 envlist =
-    py37,py38,py39,py310,py311
+    py39,py310,py311,py312,py313,py314
 
 [testenv]
 usedevelop = true
 deps =
+    numpy
     pytest-cov
-    responses
 commands =
-    python -m pytest affine/tests --cov affine --cov-report term-missing
+    python -m pytest  --cov affine --cov-report term-missing



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/compare/128329182bfbdd88546417c6a8cccc2923ac9bd7...9f274bfbf613faa1ccbfc4bd97f1ffcae7bb450b

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/compare/128329182bfbdd88546417c6a8cccc2923ac9bd7...9f274bfbf613faa1ccbfc4bd97f1ffcae7bb450b
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/780ac8d6/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:00:50 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:00:50 +0000
Subject: [Git][debian-gis-team/python-affine][pristine-tar] pristine-tar data
 for python-affine_3.0.0.orig.tar.gz
Message-ID: <6a7752b25f9b1_537fafc8428869@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / python-affine


Commits:
e83d39ed by Antonio Valentino at 2026-08-08T15:44:56+00:00
pristine-tar data for python-affine_3.0.0.orig.tar.gz

- - - - -


2 changed files:

- + python-affine_3.0.0.orig.tar.gz.delta
- + python-affine_3.0.0.orig.tar.gz.id


Changes:

=====================================
python-affine_3.0.0.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/python-affine_3.0.0.orig.tar.gz.delta differ


=====================================
python-affine_3.0.0.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+7e402ed9429a5b4e55566efbfd8754b7dbecd800



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/commit/e83d39ed7532268a0f38bfc17999c82a239e33d9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/commit/e83d39ed7532268a0f38bfc17999c82a239e33d9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/d465e014/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:01:06 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:01:06 +0000
Subject: [Git][debian-gis-team/python-affine][upstream] New upstream version
 3.0.0
Message-ID: <6a7752c261e9a_537fb1a842905f@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / python-affine


Commits:
8fa9e1be by Antonio Valentino at 2026-08-08T15:44:56+00:00
New upstream version 3.0.0
- - - - -


26 changed files:

- + .github/dependabot.yml
- .github/workflows/ci.yml
- .gitignore
- + .pre-commit-config.yaml
- + .readthedocs.yaml
- AUTHORS.txt
- CHANGES.txt
- README.rst
- ? affine/tests/test_transform.py
- + docs/Makefile
- + docs/make.bat
- + docs/requirements.txt
- + docs/src/_static/.gitkeep
- + docs/src/conf.py
- + docs/src/index.rst
- pyproject.toml
- ? setup.cfg
- affine/__init__.py ? src/affine/__init__.py
- + src/affine/py.typed
- affine/tests/__init__.py ? tests/__init__.py
- + tests/test_numpy.py
- affine/tests/test_pickle.py ? tests/test_pickle.py
- affine/tests/test_rotation.py ? tests/test_rotation.py
- affine/tests/test_serialize.py ? tests/test_serialize.py
- + tests/test_transform.py
- tox.ini


Changes:

=====================================
.github/dependabot.yml
=====================================
@@ -0,0 +1,11 @@
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+version: 2
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "quarterly"
+    groups:
+      github-actions:
+        patterns:
+          - "*"


=====================================
.github/workflows/ci.yml
=====================================
@@ -9,19 +9,33 @@ on:
     - '*'
   pull_request:
 env:
-  LATEST_PY_VERSION: '3.11'
+  LATEST_PY_VERSION: '3.14'
 
 jobs:
-  tests:
+  pre-commit:
     runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout at v6
+      - uses: actions/setup-python at v6
+        with:
+            python-version: 3.*
+      - name: pre-commit checks
+        shell: bash
+        run: |
+          python -m pip install --upgrade pip
+          python -m pip install pre-commit
+          pre-commit run --show-diff-on-failure --all-files
+
+  tests:
+    runs-on: ubuntu-24.04
     strategy:
       matrix:
-        python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
+        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
 
     steps:
-      - uses: actions/checkout at v3
+      - uses: actions/checkout at v6
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python at v4
+        uses: actions/setup-python at v6
         with:
           python-version: ${{ matrix.python-version }}
 
@@ -41,42 +55,3 @@ jobs:
           files: ./coverage.xml
           flags: unittests
           fail_ci_if_error: false
-
-  lint:
-    needs: tests
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout at v3
-      - name: Set up Python
-        uses: actions/setup-python at v4
-        with:
-          python-version: ${{ env.LATEST_PY_VERSION }}
-
-      - name: Install dependencies
-        run: |
-          python -m pip install --upgrade pip
-          python -m pip install flake8 pydocstyle
-
-      - name: Run lint
-        run: |
-          flake8 --ignore=E501,W503
-          python -m pydocstyle affine
-
-  typing:
-    needs: tests
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout at v3
-      - name: Set up Python
-        uses: actions/setup-python at v4
-        with:
-          python-version: ${{ env.LATEST_PY_VERSION }}
-
-      - name: Install dependencies
-        run: |
-          python -m pip install --upgrade pip
-          python -m pip install mypy pytest
-
-      - name: Run typing test
-        run: |
-          mypy affine


=====================================
.gitignore
=====================================
@@ -59,3 +59,4 @@ __pycache__
 *.swp
 
 .coverage.*
+.DS_Store


=====================================
.pre-commit-config.yaml
=====================================
@@ -0,0 +1,22 @@
+ci:
+  autoupdate_schedule: quarterly
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v6.0.0
+    hooks:
+    - id: check-yaml
+    - id: end-of-file-fixer
+    - id: trailing-whitespace
+  - repo: https://github.com/astral-sh/ruff-pre-commit
+    rev: v0.14.10
+    hooks:
+      # Run the linter.
+      - id: ruff-check
+        args: [ --fix ]
+      # Run the formatter.
+      - id: ruff-format
+  - repo: https://github.com/pre-commit/mirrors-mypy
+    rev: v1.19.1
+    hooks:
+      - id: mypy
+        additional_dependencies: [attrs]


=====================================
.readthedocs.yaml
=====================================
@@ -0,0 +1,15 @@
+version: 2
+
+build:
+  os: ubuntu-24.04
+  tools:
+    python: "3.14"
+
+sphinx:
+   configuration: docs/src/conf.py
+
+python:
+   install:
+   - requirements: docs/requirements.txt
+   - method: pip
+     path: .


=====================================
AUTHORS.txt
=====================================
@@ -1,10 +1,18 @@
 Authors
 =======
 
-- Sean Gillies <sean at mapbox.com>
-- Steven Ring <smr at southsky.com.au>
-- Mike Taves <mwtoews at gmail.com>
-- Kevin Wurster <wursterk at gmail.com>
-- Todd Small <todd_small at icloud.com>
-- Juan Luis Cano Rodr?guez <juanlu at satellogic.com>
+- Casey Duncan
+- Sean Gillies
+- Denis Rykov
+- Juan Luis Cano Rodr?guez
+- Kevin Wurster
 - Kirill Kouzoubov
+- Lo?c Dutrieux
+- Michael Wess
+- Mike Taves
+- Nick Maxwell
+- Rotzbua
+- Ryan Grout
+- Steven Ring
+- Stuart Axon
+- Vincent Sarago


=====================================
CHANGES.txt
=====================================
@@ -1,6 +1,52 @@
 CHANGES
 =======
 
+3.0.0 (2026-08-08)
+------------------
+
+- `Affine.__array__()` has been deleted to remove a dependency on Numpy and
+  associated typing annotations (#140). To convert an Affine instance to
+  a Numpy array, do this: `numpy.array(Affine()).reshape(3, 3)`.
+
+3.0rc3 (2026-01-30)
+-------------------
+
+The single file module affine.py has been moved to affine/__init__.py so that
+a py.typed file can be distributed in the same directory (#136).
+
+3.0rc2 (2026-01-27)
+-------------------
+
+3.0rc1 tagged the wrong commit. The distributions on PyPI have the correct
+version, but the GitHub release does not. This is fixed by 3.0rc2, which makes
+no other changes.
+
+3.0rc1 (2026-01-26)
+-------------------
+
+This is the first 3.0 release candidate. There are no significant changes
+since 3.0b1.
+
+3.0b1 (2025-01-29)
+------------------
+
+- Matrix multiplication with tuples of coordinate matrices, like the output of
+  numpy.meshgrid(), has been restored (#126).
+
+3.0a1 (2025-01-27)
+------------------
+
+- Type hint annotations for functions and methods are complete (#121).
+- Affine raises ValueError if initialized with values for g, h, and i that are
+  not 0.0, 0.0, and 1.0, respectively (#117).
+- Python version support was changed to 3.9+ (#110).
+- Switch from namedtuple to attrs for implementation of the Affine class and
+  use functools.cached_property(), which absolutely requires Python 3.8+
+  (#111).
+- Source was moved to a single-module affine.py in the src directory (#112).
+- Add numpy __array__ interface (#108).
+- Add support for ``@`` matrix multiplier methods (#122).
+
 2.4.0 (2023-01-19)
 ------------------
 
@@ -63,7 +109,7 @@ Bug fixes:
 
 2.0b2 (2016-05-16)
 ------------------
-- Bug fix: restore ``Affine __rmul__`` even though it permits dubious 
+- Bug fix: restore ``Affine __rmul__`` even though it permits dubious
   vector * matrix expressions (#27).
 
 2.0b1 (2016-05-16)


=====================================
README.rst
=====================================
@@ -9,8 +9,12 @@ Matrices describing 2D affine transformation of the plane.
 .. image:: https://codecov.io/gh/rasterio/affine/branch/main/graph/badge.svg
     :target: https://codecov.io/gh/rasterio/affine
 
+.. image:: https://readthedocs.org/projects/affine/badge/?version=latest
+       :target: https://affine.readthedocs.io/en/latest/?badge=latest
+       :alt: Documentation Status
+
 The Affine package is derived from Casey Duncan's Planar package. Please see
-the copyright statement in `affine/__init__.py <affine/__init__.py>`__.
+the copyright statement in `src/affine.py <src/affine.py>`__.
 
 Usage
 -----
@@ -18,7 +22,7 @@ Usage
 The 3x3 augmented affine transformation matrix for transformations in two
 dimensions is illustrated below.
 
-::
+.. code-block:: none
 
   | x' |   | a  b  c | | x |
   | y' | = | d  e  f | | y |
@@ -47,8 +51,9 @@ Matrices can be created by passing the values ``a, b, c, d, e, f`` to the
   Affine(0.7071067811865476, -0.7071067811865475, 0.0,
          0.7071067811865475, 0.7071067811865476, 0.0)
 
-These matrices can be applied to ``(x, y)`` tuples to obtain transformed
-coordinates ``(x', y')``.
+These matrices can be applied to ``(x, y)`` tuples using the
+``*`` operator (or the ``@`` matrix multiplier operator for
+future releases) to obtain transformed coordinates ``(x', y')``.
 
 .. code-block:: pycon
 
@@ -87,11 +92,10 @@ origin can be easily computed.
   >>> fwd * (col, row)
   (-237481.5, 195036.4)
 
-The reverse transformation is obtained using the ``~`` operator.
+The reverse transformation is obtained using the ``~`` inverse operator.
 
 .. code-block:: pycon
 
   >>> rev = ~fwd
   >>> rev * fwd * (col, row)
   (0.0, 99.99999999999999)
-


=====================================
affine/tests/test_transform.py deleted
=====================================
@@ -1,543 +0,0 @@
-#############################################################################
-# Planar is Copyright (c) 2010 by Casey Duncan
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-# * Neither the name(s) of the copyright holders nor the names of its
-#   contributors may be used to endorse or promote products derived from this
-#   software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AS IS AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#############################################################################
-
-"""Transform unit tests"""
-
-import math
-import unittest
-from textwrap import dedent
-
-import pytest
-
-import affine
-from affine import Affine, EPSILON
-
-
-def seq_almost_equal(t1, t2, error=0.00001):
-    assert len(t1) == len(t2), f"{t1!r} != {t2!r}"
-    for m1, m2 in zip(t1, t2):
-        assert abs(m1 - m2) <= error, f"{t1!r} != {t2!r}"
-
-
-class PyAffineTestCase(unittest.TestCase):
-    def test_zero_args(self):
-        with pytest.raises(TypeError):
-            Affine()
-
-    def test_wrong_arg_type(self):
-        with pytest.raises(TypeError):
-            Affine(None)
-
-    def test_args_too_few(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2)
-
-    def test_args_too_many(self):
-        with pytest.raises(TypeError):
-            Affine(*range(10))
-
-    def test_args_members_wrong_type(self):
-        with pytest.raises(TypeError):
-            Affine(0, 2, 3, None, None, "")
-
-    def test_len(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert len(t) == 9
-
-    def test_slice_last_row(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert t[-3:] == (0, 0, 1)
-
-    def test_members_are_floats(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        for m in t:
-            assert isinstance(m, float), repr(m)
-
-    def test_getitem(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert t[0] == 1
-        assert t[1] == 2
-        assert t[2] == 3
-        assert t[3] == 4
-        assert t[4] == 5
-        assert t[5] == 6
-        assert t[6] == 0
-        assert t[7] == 0
-        assert t[8] == 1
-        assert t[-1] == 1
-
-    def test_getitem_wrong_type(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        with pytest.raises(TypeError):
-            t["foobar"]
-
-    def test_str(self):
-        t = Affine(1.111, 2.222, 3.333, -4.444, -5.555, 6.666)
-        assert str(t) == dedent(
-            """\
-            | 1.11, 2.22, 3.33|
-            |-4.44,-5.55, 6.67|
-            | 0.00, 0.00, 1.00|"""
-        )
-
-    def test_repr(self):
-        t = Affine(1.111, 2.222, 3.456, 4.444, 5.5, 6.25)
-        assert repr(t) == dedent(
-            """\
-            Affine(1.111, 2.222, 3.456,
-                   4.444, 5.5, 6.25)"""
-        )
-
-    def test_identity_constructor(self):
-        ident = Affine.identity()
-        assert isinstance(ident, Affine)
-        assert tuple(ident) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
-        assert ident.is_identity
-
-    def test_permutation_constructor(self):
-        perm = Affine.permutation()
-        assert isinstance(perm, Affine)
-        assert tuple(perm) == (0, 1, 0, 1, 0, 0, 0, 0, 1)
-        assert (perm * perm).is_identity
-
-    def test_translation_constructor(self):
-        trans = Affine.translation(2, -5)
-        assert isinstance(trans, Affine)
-        assert tuple(trans) == (1, 0, 2, 0, 1, -5, 0, 0, 1)
-
-    def test_scale_constructor(self):
-        scale = Affine.scale(5)
-        assert isinstance(scale, Affine)
-        assert tuple(scale) == (5, 0, 0, 0, 5, 0, 0, 0, 1)
-        scale = Affine.scale(-1, 2)
-        assert tuple(scale) == (-1, 0, 0, 0, 2, 0, 0, 0, 1)
-        assert tuple(Affine.scale(1)) == tuple(Affine.identity())
-
-    def test_shear_constructor(self):
-        shear = Affine.shear(30)
-        assert isinstance(shear, Affine)
-        mx = math.tan(math.radians(30))
-        seq_almost_equal(tuple(shear), (1, mx, 0, 0, 1, 0, 0, 0, 1))
-        shear = Affine.shear(-15, 60)
-        mx = math.tan(math.radians(-15))
-        my = math.tan(math.radians(60))
-        seq_almost_equal(tuple(shear), (1, mx, 0, my, 1, 0, 0, 0, 1))
-        shear = Affine.shear(y_angle=45)
-        seq_almost_equal(tuple(shear), (1, 0, 0, 1, 1, 0, 0, 0, 1))
-
-    def test_rotation_constructor(self):
-        rot = Affine.rotation(60)
-        assert isinstance(rot, Affine)
-        r = math.radians(60)
-        s, c = math.sin(r), math.cos(r)
-        assert tuple(rot) == (c, -s, 0, s, c, 0, 0, 0, 1)
-        rot = Affine.rotation(337)
-        r = math.radians(337)
-        s, c = math.sin(r), math.cos(r)
-        seq_almost_equal(tuple(rot), (c, -s, 0, s, c, 0, 0, 0, 1))
-        assert tuple(Affine.rotation(0)) == tuple(Affine.identity())
-
-    def test_rotation_constructor_quadrants(self):
-        assert tuple(Affine.rotation(0)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(90)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(-180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(270)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(-90)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(360)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(450)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
-        assert tuple(Affine.rotation(-450)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
-
-    def test_rotation_constructor_with_pivot(self):
-        assert tuple(Affine.rotation(60)) == tuple(Affine.rotation(60, pivot=(0, 0)))
-        rot = Affine.rotation(27, pivot=(2, -4))
-        r = math.radians(27)
-        s, c = math.sin(r), math.cos(r)
-        assert tuple(rot) == (
-            c,
-            -s,
-            2 - 2 * c - 4 * s,
-            s,
-            c,
-            -4 - 2 * s + 4 * c,
-            0,
-            0,
-            1,
-        )
-        assert tuple(Affine.rotation(0, (-3, 2))) == tuple(Affine.identity())
-
-    def test_rotation_contructor_wrong_arg_types(self):
-        with pytest.raises(TypeError):
-            Affine.rotation(1, 1)
-
-    def test_determinant(self):
-        assert Affine.identity().determinant == 1
-        assert Affine.scale(2).determinant == 4
-        assert Affine.scale(0).determinant == 0
-        assert Affine.scale(5, 1).determinant == 5
-        assert Affine.scale(-1, 1).determinant == -1
-        assert Affine.scale(-1, 0).determinant == 0
-        assert Affine.rotation(77).determinant == pytest.approx(1)
-        assert Affine.translation(32, -47).determinant == pytest.approx(1)
-
-    def test_is_rectilinear(self):
-        assert Affine.identity().is_rectilinear
-        assert Affine.scale(2.5, 6.1).is_rectilinear
-        assert Affine.translation(4, -1).is_rectilinear
-        assert Affine.rotation(90).is_rectilinear
-        assert not Affine.shear(4, -1).is_rectilinear
-        assert not Affine.rotation(-26).is_rectilinear
-
-    def test_is_conformal(self):
-        assert Affine.identity().is_conformal
-        assert Affine.scale(2.5, 6.1).is_conformal
-        assert Affine.translation(4, -1).is_conformal
-        assert Affine.rotation(90).is_conformal
-        assert Affine.rotation(-26).is_conformal
-        assert not Affine.shear(4, -1).is_conformal
-
-    def test_is_orthonormal(self):
-        assert Affine.identity().is_orthonormal
-        assert Affine.translation(4, -1).is_orthonormal
-        assert Affine.rotation(90).is_orthonormal
-        assert Affine.rotation(-26).is_orthonormal
-        assert not Affine.scale(2.5, 6.1).is_orthonormal
-        assert not Affine.scale(0.5, 2).is_orthonormal
-        assert not Affine.shear(4, -1).is_orthonormal
-
-    def test_is_degenerate(self):
-        assert not Affine.identity().is_degenerate
-        assert not Affine.translation(2, -1).is_degenerate
-        assert not Affine.shear(0, -22.5).is_degenerate
-        assert not Affine.rotation(88.7).is_degenerate
-        assert not Affine.scale(0.5).is_degenerate
-        assert Affine.scale(0).is_degenerate
-        assert Affine.scale(-10, 0).is_degenerate
-        assert Affine.scale(0, 300).is_degenerate
-        assert Affine.scale(0).is_degenerate
-        assert Affine.scale(0).is_degenerate
-
-    def test_column_vectors(self):
-        a, b, c = Affine(2, 3, 4, 5, 6, 7).column_vectors
-        assert isinstance(a, tuple)
-        assert isinstance(b, tuple)
-        assert isinstance(c, tuple)
-        assert a == (2, 5)
-        assert b == (3, 6)
-        assert c == (4, 7)
-
-    def test_almost_equals(self):
-        EPSILON = 1e-5
-        E = EPSILON * 0.5
-        t = Affine(1.0, E, 0, -E, 1.0 + E, E)
-        assert t.almost_equals(Affine.identity())
-        assert Affine.identity().almost_equals(t)
-        assert t.almost_equals(t)
-        t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
-        assert not t.almost_equals(Affine.identity())
-        assert not Affine.identity().almost_equals(t)
-        assert t.almost_equals(t)
-
-    def test_almost_equals_2(self):
-        EPSILON = 1e-10
-        E = EPSILON * 0.5
-        t = Affine(1.0, E, 0, -E, 1.0 + E, E)
-        assert t.almost_equals(Affine.identity(), precision=EPSILON)
-        assert Affine.identity().almost_equals(t, precision=EPSILON)
-        assert t.almost_equals(t, precision=EPSILON)
-        t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
-        assert not t.almost_equals(Affine.identity(), precision=EPSILON)
-        assert not Affine.identity().almost_equals(t, precision=EPSILON)
-        assert t.almost_equals(t, precision=EPSILON)
-
-    def test_equality(self):
-        t1 = Affine(1, 2, 3, 4, 5, 6)
-        t2 = Affine(6, 5, 4, 3, 2, 1)
-        t3 = Affine(1, 2, 3, 4, 5, 6)
-        assert t1 == t3
-        assert not t1 == t2
-        assert t2 == t2
-        assert not t1 != t3
-        assert not t2 != t2
-        assert t1 != t2
-        assert not t1 == 1
-        assert t1 != 1
-
-    def test_gt(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) > Affine(6, 5, 4, 3, 2, 1)
-
-    def test_lt(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) < Affine(6, 5, 4, 3, 2, 1)
-
-    def test_add(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) + Affine(6, 5, 4, 3, 2, 1)
-
-    def test_sub(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) - Affine(6, 5, 4, 3, 2, 1)
-
-    def test_mul_by_identity(self):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        assert tuple(t * Affine.identity()) == tuple(t)
-
-    def test_mul_transform(self):
-        t = Affine.rotation(5) * Affine.rotation(29)
-        assert isinstance(t, Affine)
-        seq_almost_equal(t, Affine.rotation(34))
-        t = Affine.scale(3, 5) * Affine.scale(2)
-        seq_almost_equal(t, Affine.scale(6, 10))
-
-    def test_itransform(self):
-        pts = [(4, 1), (-1, 0), (3, 2)]
-        r = Affine.scale(-2).itransform(pts)
-        assert r is None, r
-        assert pts == [(-8, -2), (2, 0), (-6, -4)]
-
-        A = Affine.rotation(33)
-        pts = [(4, 1), (-1, 0), (3, 2)]
-        pts_expect = [A * pt for pt in pts]
-        r = A.itransform(pts)
-        assert r is None
-        assert pts == pts_expect
-
-    def test_mul_wrong_type(self):
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) * None
-
-    def test_mul_sequence_wrong_member_types(self):
-        class NotPtSeq:
-            @classmethod
-            def from_points(cls, points):
-                list(points)
-
-            def __iter__(self):
-                yield 0
-
-        with pytest.raises(TypeError):
-            Affine(1, 2, 3, 4, 5, 6) * NotPtSeq()
-
-    def test_imul_transform(self):
-        t = Affine.translation(3, 5)
-        t *= Affine.translation(-2, 3.5)
-        assert isinstance(t, Affine)
-        seq_almost_equal(t, Affine.translation(1, 8.5))
-
-    def test_inverse(self):
-        seq_almost_equal(~Affine.identity(), Affine.identity())
-        seq_almost_equal(~Affine.translation(2, -3), Affine.translation(-2, 3))
-        seq_almost_equal(~Affine.rotation(-33.3), Affine.rotation(33.3))
-        t = Affine(1, 2, 3, 4, 5, 6)
-        seq_almost_equal(~t * t, Affine.identity())
-
-    def test_cant_invert_degenerate(self):
-        t = Affine.scale(0)
-        with pytest.raises(affine.TransformNotInvertibleError):
-            ~t
-
-    def test_bad_type_world(self):
-        """wrong type, i.e don't use readlines()"""
-        with pytest.raises(TypeError):
-            affine.loadsw(["1.0", "0.0", "0.0", "1.0", "0.0", "0.0"])
-
-    def test_bad_value_world(self):
-        """Wrong number of parameters."""
-        with pytest.raises(ValueError):
-            affine.loadsw("1.0\n0.0\n0.0\n1.0\n0.0\n0.0\n0.0")
-
-    def test_simple_world(self):
-        s = "1.0\n0.0\n0.0\n-1.0\n100.5\n199.5\n"
-        a = affine.loadsw(s)
-        assert a == Affine(1.0, 0.0, 100.0, 0.0, -1.0, 200.0)
-        assert affine.dumpsw(a) == s
-
-    def test_real_world(self):
-        s = dedent(
-            """\
-                 39.9317755024
-                 30.0907511581
-                 30.0907511576
-                -39.9317755019
-            2658137.2266720217
-            5990821.7039887439"""
-        )  # no EOL
-        a1 = affine.loadsw(s)
-        assert a1.almost_equals(
-            Affine(
-                39.931775502364644,
-                30.090751157602412,
-                2658102.2154086917,
-                30.090751157602412,
-                -39.931775502364644,
-                5990826.624500916,
-            )
-        )
-        a1out = affine.dumpsw(a1)
-        assert isinstance(a1out, str)
-        a2 = affine.loadsw(a1out)
-        assert a1.almost_equals(a2)
-
-
-# We're using pytest for tests added after 1.0 and don't need unittest
-# test case classes.
-
-
-def test_gdal():
-    t = Affine.from_gdal(-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
-    assert t.c == t.xoff == -237481.5
-    assert t.a == 425.0
-    assert t.b == 0.0
-    assert t.f == t.yoff == 237536.4
-    assert t.d == 0.0
-    assert t.e == -425.0
-    assert tuple(t) == (425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4, 0, 0, 1)
-    assert t.to_gdal() == (-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
-
-
-def test_shapely():
-    t = Affine(425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4)
-    assert t.to_shapely() == (425.0, 0.0, 0.0, -425, -237481.5, 237536.4)
-
-
-def test_imul_number():
-    t = Affine(1, 2, 3, 4, 5, 6)
-    try:
-        t *= 2.0
-    except TypeError:
-        assert True
-
-
-def test_mul_tuple():
-    t = Affine(1, 2, 3, 4, 5, 6)
-    t * (2.0, 2.0)
-
-
-def test_rmul_tuple():
-    with pytest.warns(DeprecationWarning):
-        t = Affine(1, 2, 3, 4, 5, 6)
-        (2.0, 2.0) * t
-
-
-def test_transform_precision():
-    t = Affine.rotation(45.0)
-    assert t.precision == EPSILON
-    t.precision = 1e-10
-    assert t.precision == 1e-10
-    assert Affine.rotation(0.0).precision == EPSILON
-
-
-def test_associative():
-    point = (12, 5)
-    trans = Affine.translation(-10.0, -5.0)
-    rot90 = Affine.rotation(90.0)
-    result1 = rot90 * (trans * point)
-    result2 = (rot90 * trans) * point
-    seq_almost_equal(result1, (0.0, 2.0))
-    seq_almost_equal(result1, result2)
-
-
-def test_roundtrip():
-    point = (12, 5)
-    trans = Affine.translation(3, 4)
-    rot37 = Affine.rotation(37.0)
-    point_prime = (trans * rot37) * point
-    roundtrip_point = ~(trans * rot37) * point_prime
-    seq_almost_equal(point, roundtrip_point)
-
-
-def test_eccentricity():
-    assert Affine.identity().eccentricity == 0.0
-    assert Affine.scale(2).eccentricity == 0.0
-    # assert_equal(Affine.scale(0).eccentricity, ?)
-    assert Affine.scale(2, 1).eccentricity == pytest.approx(math.sqrt(3) / 2)
-    assert Affine.scale(2, 3).eccentricity == pytest.approx(math.sqrt(5) / 3)
-    assert Affine.scale(1, 0).eccentricity == 1.0
-    assert Affine.rotation(77).eccentricity == pytest.approx(0.0)
-    assert Affine.translation(32, -47).eccentricity == pytest.approx(0.0)
-    assert Affine.scale(-1, 1).eccentricity == pytest.approx(0.0)
-
-
-def test_eccentricity_complex():
-    assert (Affine.scale(2, 3) * Affine.rotation(77)).eccentricity == pytest.approx(
-        math.sqrt(5) / 3
-    )
-    assert (Affine.rotation(77) * Affine.scale(2, 3)).eccentricity == pytest.approx(
-        math.sqrt(5) / 3
-    )
-    assert (
-        Affine.translation(32, -47) * Affine.rotation(77) * Affine.scale(2, 3)
-    ).eccentricity == pytest.approx(math.sqrt(5) / 3)
-
-
-def test_rotation_angle():
-    assert Affine.identity().rotation_angle == 0.0
-    assert Affine.scale(2).rotation_angle == 0.0
-    assert Affine.scale(2, 1).rotation_angle == 0.0
-    assert Affine.translation(32, -47).rotation_angle == pytest.approx(0.0)
-    assert Affine.rotation(30).rotation_angle == pytest.approx(30)
-    assert Affine.rotation(-150).rotation_angle == pytest.approx(-150)
-
-
-def test_rotation_improper():
-    with pytest.raises(affine.UndefinedRotationError):
-        Affine.scale(-1, 1).rotation_angle
-
-
-# See gh-71 for bug report motivating this test.
-def test_mul_fallback_unpack():
-    """Support fallback in case that other is a single object."""
-
-    class TextPoint:
-        """Not iterable, will trigger ValueError in Affine.__mul__."""
-
-        def __rmul__(self, other):
-            return other * (1, 2)
-
-    assert Affine.identity() * TextPoint() == (1, 2)
-
-
-# See gh-71 for bug report motivating this test.
-def test_mul_fallback_type_error():
-    """Support fallback in case that other is an unexpected type."""
-
-    class TextPoint:
-        """Iterable, but values trigger TypeError in Affine.__mul__."""
-
-        def __iter__(self):
-            return ("1", "2")
-
-        def __rmul__(self, other):
-            return other * (1, 2)
-
-    assert Affine.identity() * TextPoint() == (1, 2)
-
-
-if __name__ == "__main__":
-    unittest.main()


=====================================
docs/Makefile
=====================================
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS    ?=
+SPHINXBUILD   ?= sphinx-build
+SOURCEDIR     = src
+BUILDDIR      = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)


=====================================
docs/make.bat
=====================================
@@ -0,0 +1,35 @@
+ at ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=src
+set BUILDDIR=build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.https://www.sphinx-doc.org/
+	exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd


=====================================
docs/requirements.txt
=====================================
@@ -0,0 +1,2 @@
+attrs
+sphinx==9.1.0


=====================================
docs/src/_static/.gitkeep
=====================================


=====================================
docs/src/conf.py
=====================================
@@ -0,0 +1,40 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+import os
+import sys
+
+sys.path.append(os.path.abspath("../../src"))
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = "rasterio/affine"
+project_copyright = "%Y, Sean Gillies"
+author = "Sean Gillies"
+release = "development"
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+    "sphinx.ext.autodoc",
+    "sphinx.ext.coverage",
+    "sphinx.ext.ifconfig",
+    "sphinx.ext.napoleon",  # NumPy doc style.
+    "sphinx.ext.todo",
+    "sphinx.ext.viewcode",
+]
+
+templates_path = ["_templates"]
+exclude_patterns = ["build", "Thumbs.db", ".DS_Store"]
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = "nature"
+html_static_path = ["_static"]
+
+# If this is not None, a 'Last updated on:' timestamp is inserted at every page bottom.
+html_last_updated_fmt = ""


=====================================
docs/src/index.rst
=====================================
@@ -0,0 +1,28 @@
+Welcome to rasterio/affine's documentation!
+===========================================
+
+This is the documentation of the latest development version at https://github.com/rasterio/affine .
+
+.. include:: ../../README.rst
+
+Module documentation
+====================
+
+.. automodule:: affine
+   :members:
+
+.. include:: ../../CHANGES.txt
+.. include:: ../../AUTHORS.txt
+
+License
+=======
+
+.. include:: ../../LICENSE.txt
+   :literal:
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`


=====================================
pyproject.toml
=====================================
@@ -18,19 +18,22 @@ classifiers = [
     "Programming Language :: Python :: 3 :: Only",
     "Topic :: Multimedia :: Graphics :: Graphics Conversion",
     "Topic :: Scientific/Engineering :: GIS",
+    "Typing :: Typed",
 ]
 license = {text = "BSD-3-Clause"}
-requires-python = ">=3.7"
+requires-python = ">=3.9"
+dependencies = [
+    "attrs",
+]
 
 [project.optional-dependencies]
 test = [
-    "pytest >=4.6",
+    "numpy>=1.20",
+    "pytest>=6.0",
     "pytest-cov",
 ]
 dev = [
-    "pydocstyle",
-    "flake8",
-    "coveralls",
+    "coveralls>=3.0",
 ]
 
 [project.urls]
@@ -41,4 +44,39 @@ include = [
     "AUTHORS.txt",
     "CHANGES.txt",
     "LICENSE.txt",
+    "docs/",
+    "tests/",
+]
+exclude = ["docs/build/**"]
+
+[tool.pytest.ini_options]
+pythonpath = "src"
+testpaths = ["tests"]
+
+[tool.ruff.lint]
+select = [
+    "B",  # flake8-bugbear
+    "D",  # pydocstyle
+    "E", "W",  # pycodestyle
+    "F",  # Pyflakes
+    "I",  # isort
+    "NPY", # NumPy-specific rules
+    "PT", # flake8-pytest-style
+    "RET", # flake8-return
+    "RUF", # Ruff-specific rules
+    "SIM", # flake8-simplify
+    "UP", # pyupgrade
 ]
+ignore = [
+    "D105",  # Missing docstring in magic method
+]
+
+[tool.ruff.lint.per-file-ignores]
+"tests/**.py" = ["B", "D"]
+"docs/**.py" = ["D"]
+
+[tool.ruff.lint.isort]
+force-sort-within-sections = true
+
+[tool.ruff.lint.pydocstyle]
+convention = "numpy"


=====================================
setup.cfg deleted
=====================================
@@ -1,6 +0,0 @@
-[tool:pytest]
-testpaths: affine/tests
-
-[pydocstyle]
-select: D1
-add-ignore: D105


=====================================
affine/__init__.py ? src/affine/__init__.py
=====================================
@@ -1,4 +1,4 @@
-"""Affine transformation matrices
+"""Affine transformation matrices.
 
 The Affine package is derived from Casey Duncan's Planar package. See the
 copyright statement below.
@@ -32,16 +32,22 @@ copyright statement below.
 # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #############################################################################
 
-from collections import namedtuple
+from __future__ import annotations
+
+from collections.abc import MutableSequence, Sequence
+from functools import cached_property
 import math
+from typing import overload
 import warnings
 
+from attrs import astuple, define, field
 
 __all__ = ["Affine"]
 __author__ = "Sean Gillies"
-__version__ = "2.4.0"
+__version__ = "3.0.0"
 
 EPSILON: float = 1e-5
+EPSILON2: float = 1e-10
 
 
 class AffineError(Exception):
@@ -49,33 +55,14 @@ class AffineError(Exception):
 
 
 class TransformNotInvertibleError(AffineError):
-    """The transform could not be inverted"""
+    """The transform could not be inverted."""
 
 
 class UndefinedRotationError(AffineError):
-    """The rotation angle could not be computed for this transform"""
-
-
-def cached_property(func):
-    """Special property decorator that caches the computed
-    property value in the object's instance dict the first
-    time it is accessed.
-    """
-    name = func.__name__
-    doc = func.__doc__
-
-    def getter(self, name=name):
-        try:
-            return self.__dict__[name]
-        except KeyError:
-            self.__dict__[name] = value = func(self)
-            return value
-
-    getter.func_name = name
-    return property(getter, doc=doc)
+    """The rotation angle could not be computed for this transform."""
 
 
-def cos_sin_deg(deg: float):
+def cos_sin_deg(deg: float) -> tuple[float, float]:
     """Return the cosine and sin for the given angle in degrees.
 
     With special-case handling of multiples of 90 for perfect right
@@ -84,272 +71,297 @@ def cos_sin_deg(deg: float):
     deg = deg % 360.0
     if deg == 90.0:
         return 0.0, 1.0
-    elif deg == 180.0:
+    if deg == 180.0:
         return -1.0, 0
-    elif deg == 270.0:
+    if deg == 270.0:
         return 0, -1.0
     rad = math.radians(deg)
     return math.cos(rad), math.sin(rad)
 
 
-class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))):
+ at define(frozen=True)
+class Affine:
     """Two dimensional affine transform for 2D linear mapping.
 
+    Parallel lines are preserved by these transforms. Affine transforms
+    can perform any combination of translations, scales/flips, shears,
+    and rotations. Class methods are provided to conveniently compose
+    transforms from these operations.
+
     Parameters
     ----------
     a, b, c, d, e, f : float
-        Coefficients of an augmented affine transformation matrix
-
-        | x' |   | a  b  c | | x |
-        | y' | = | d  e  f | | y |
-        | 1  |   | 0  0  1 | | 1 |
+        Coefficients of the 3 x 3 augmented affine transformation matrix.
 
-        `a`, `b`, and `c` are the elements of the first row of the
-        matrix. `d`, `e`, and `f` are the elements of the second row.
+    g, h, i : float, optional
+        Coefficients of the 3 x 3 augmented affine transformation matrix.
 
     Attributes
     ----------
     a, b, c, d, e, f, g, h, i : float
-        The coefficients of the 3x3 augmented affine transformation
-        matrix
+        Coefficients of the 3 x 3 augmented affine transformation matrix.
 
-        | x' |   | a  b  c | | x |
-        | y' | = | d  e  f | | y |
-        | 1  |   | g  h  i | | 1 |
+        .. code-block:: none
+
+            | x' |   | a  b  c | | x |
+            | y' | = | d  e  f | | y |
+            | 1  |   | g  h  i | | 1 |
 
         `g`, `h`, and `i` are always 0, 0, and 1.
 
-    The Affine package is derived from Casey Duncan's Planar package.
-    See the copyright statement below.  Parallel lines are preserved by
-    these transforms. Affine transforms can perform any combination of
-    translations, scales/flips, shears, and rotations.  Class methods
-    are provided to conveniently compose transforms from these
-    operations.
-
-    Internally the transform is stored as a 3x3 transformation matrix.
-    The transform may be constructed directly by specifying the first
-    two rows of matrix values as 6 floats. Since the matrix is an affine
-    transform, the last row is always ``(0, 0, 1)``.
-
-    N.B.: multiplication of a transform and an (x, y) vector *always*
-    returns the column vector that is the matrix multiplication product
-    of the transform and (x, y) as a column vector, no matter which is
-    on the left or right side. This is obviously not the case for
-    matrices and vectors in general, but provides a convenience for
-    users of this class.
+    Notes
+    -----
+    Multiplication of a transform and an (x, y) vector *always* returns
+    the column vector that is the matrix multiplication product of the
+    transform and (x, y) as a column vector, no matter which is on the
+    left or right side. This is obviously not the case for matrices and
+    vectors in general, but provides a convenience for users of this
+    class.
 
+    The Affine package is derived from Casey Duncan's Planar package.
+    See the copyright statement.
     """
 
-    precision = EPSILON
-
-    def __new__(
-        cls,
-        a: float,
-        b: float,
-        c: float,
-        d: float,
-        e: float,
-        f: float,
-        g: float = 0.0,
-        h: float = 0.0,
-        i: float = 1.0,
-    ):
-        """Create a new object
+    a: float = field(converter=float)
+    b: float = field(converter=float)
+    c: float = field(converter=float)
+    d: float = field(converter=float)
+    e: float = field(converter=float)
+    f: float = field(converter=float)
 
-        Parameters
-        ----------
-        a, b, c, d, e, f : float
-            Elements of an augmented affine transformation matrix.
-        """
-        return tuple.__new__(
-            cls,
-            (
-                a * 1.0,
-                b * 1.0,
-                c * 1.0,
-                d * 1.0,
-                e * 1.0,
-                f * 1.0,
-                g * 1.0,
-                h * 1.0,
-                i * 1.0,
-            ),
-        )
+    # The class has 3 attributes that don't have to be specified: g, h,
+    # and i. If they are, the given value has to be the same as the
+    # default value. This allows a new instances to be created from the
+    # tuple form of another, like Affine(*Affine.identity()).
+
+    g: float = field(default=0.0, converter=float)
+
+    @g.validator
+    def _check_g(self, attribute, value):
+        if value != 0.0:
+            raise ValueError("g must be equal to 0.0")
+
+    h: float = field(default=0.0, converter=float)
+
+    @h.validator
+    def _check_h(self, attribute, value):
+        if value != 0.0:
+            raise ValueError("h must be equal to 0.0")
+
+    i: float = field(default=1.0, converter=float)
+
+    @i.validator
+    def _check_i(self, attribute, value):
+        if value != 1.0:
+            raise ValueError("i must be equal to 1.0")
 
     @classmethod
-    def from_gdal(cls, c: float, a: float, b: float, f: float, d: float, e: float):
+    def from_gdal(
+        cls, c: float, a: float, b: float, f: float, d: float, e: float
+    ) -> Affine:
         """Use same coefficient order as GDAL's GetGeoTransform().
 
-        :param c, a, b, f, d, e: 6 floats ordered by GDAL.
-        :rtype: Affine
+        Parameters
+        ----------
+        c, a, b, f, d, e : float
+            Parameters ordered by GDAL's GeoTransform.
+
+        Returns
+        -------
+        Affine
         """
-        return cls.__new__(cls, a, b, c, d, e, f)
+        return cls(a, b, c, d, e, f)
 
     @classmethod
-    def identity(cls):
+    def identity(cls) -> Affine:
         """Return the identity transform.
 
-        :rtype: Affine
+        Returns
+        -------
+        Affine
         """
         return identity
 
     @classmethod
-    def translation(cls, xoff: float, yoff: float):
+    def translation(cls, xoff: float, yoff: float) -> Affine:
         """Create a translation transform from an offset vector.
 
-        :param xoff: Translation x offset.
-        :type xoff: float
-        :param yoff: Translation y offset.
-        :type yoff: float
-        :rtype: Affine
+        Parameters
+        ----------
+        xoff, yoff : float
+            Translation offsets in x and y directions.
+
+        Returns
+        -------
+        Affine
         """
-        return tuple.__new__(cls, (1.0, 0.0, xoff, 0.0, 1.0, yoff, 0.0, 0.0, 1.0))
+        return cls(1.0, 0.0, xoff, 0.0, 1.0, yoff)
 
     @classmethod
-    def scale(cls, *scaling):
+    def scale(cls, *scaling: float) -> Affine:
         """Create a scaling transform from a scalar or vector.
 
-        :param scaling: The scaling factor. A scalar value will
-            scale in both dimensions equally. A vector scaling
-            value scales the dimensions independently.
-        :type scaling: float or sequence
-        :rtype: Affine
+        Parameters
+        ----------
+        *scaling : float or sequence of two floats
+            One or two scaling factors. A scalar value will scale in
+            both dimensions equally. A vector scaling value scales the
+            dimensions independently.
+
+        Returns
+        -------
+        Affine
         """
         if len(scaling) == 1:
-            sx = sy = float(scaling[0])
+            sx = scaling[0]
+            sy = sx
         else:
             sx, sy = scaling
-        return tuple.__new__(cls, (sx, 0.0, 0.0, 0.0, sy, 0.0, 0.0, 0.0, 1.0))
+        return cls(sx, 0.0, 0.0, 0.0, sy, 0.0)
 
     @classmethod
-    def shear(cls, x_angle: float = 0, y_angle: float = 0):
+    def shear(cls, x_angle: float = 0.0, y_angle: float = 0.0) -> Affine:
         """Create a shear transform along one or both axes.
 
-        :param x_angle: Shear angle in degrees parallel to the x-axis.
-        :type x_angle: float
-        :param y_angle: Shear angle in degrees parallel to the y-axis.
-        :type y_angle: float
-        :rtype: Affine
+        Parameters
+        ----------
+        x_angle, y_angle : float
+            Shear angles in degrees parallel to the x- and y-axis.
+
+        Returns
+        -------
+        Affine
         """
         mx = math.tan(math.radians(x_angle))
         my = math.tan(math.radians(y_angle))
-        return tuple.__new__(cls, (1.0, mx, 0.0, my, 1.0, 0.0, 0.0, 0.0, 1.0))
+        return cls(1.0, mx, 0.0, my, 1.0, 0.0)
 
     @classmethod
-    def rotation(cls, angle: float, pivot=None):
+    def rotation(cls, angle: float, pivot: Sequence[float] | None = None) -> Affine:
         """Create a rotation transform at the specified angle.
 
-        A pivot point other than the coordinate system origin may be
-        optionally specified.
-
-        :param angle: Rotation angle in degrees, counter-clockwise
-            about the pivot point.
-        :type angle: float
-        :param pivot: Point to rotate about, if omitted the rotation is
-            about the origin.
-        :type pivot: sequence
-        :rtype: Affine
+        Parameters
+        ----------
+        angle : float
+            Rotation angle in degrees, counter-clockwise about the pivot
+            point.
+        pivot : sequence of float (px, py), optional
+            Pivot point coordinates to rotate around. If None (default),
+            the pivot point is the coordinate system origin (0.0, 0.0).
+
+        Returns
+        -------
+        Affine
         """
         ca, sa = cos_sin_deg(angle)
         if pivot is None:
-            return tuple.__new__(cls, (ca, -sa, 0.0, sa, ca, 0.0, 0.0, 0.0, 1.0))
-        else:
-            px, py = pivot
-            return tuple.__new__(
-                cls,
-                (
-                    ca,
-                    -sa,
-                    px - px * ca + py * sa,
-                    sa,
-                    ca,
-                    py - px * sa - py * ca,
-                    0.0,
-                    0.0,
-                    1.0,
-                ),
-            )
+            return cls(ca, -sa, 0.0, sa, ca, 0.0)
+        px, py = pivot
+        # fmt: off
+        return cls(
+            ca, -sa, px - px * ca + py * sa,
+            sa, ca, py - px * sa - py * ca,
+        )
+        # fmt: on
 
     @classmethod
-    def permutation(cls, *scaling):
-        """Create the permutation transform
+    def permutation(cls, *scaling: float) -> Affine:
+        """Create the permutation transform.
 
         For 2x2 matrices, there is only one permutation matrix that is
         not the identity.
 
-        :rtype: Affine
-        """
+        Parameters
+        ----------
+        *scaling : any
+            Ignored.
 
-        return tuple.__new__(cls, (0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0))
+        Returns
+        -------
+        Affine
+        """
+        return cls(0.0, 1.0, 0.0, 1.0, 0.0, 0.0)
 
     def __str__(self) -> str:
         """Concise string representation."""
         return (
-            "|% .2f,% .2f,% .2f|\n" "|% .2f,% .2f,% .2f|\n" "|% .2f,% .2f,% .2f|"
-        ) % self
+            f"|{self.a: .2f},{self.b: .2f},{self.c: .2f}|\n"
+            f"|{self.d: .2f},{self.e: .2f},{self.f: .2f}|\n"
+            f"|{self.g: .2f},{self.h: .2f},{self.i: .2f}|"
+        )
 
     def __repr__(self) -> str:
         """Precise string representation."""
-        return ("Affine(%r, %r, %r,\n" "       %r, %r, %r)") % self[:6]
+        return (
+            f"Affine({self.a!r}, {self.b!r}, {self.c!r},\n"
+            f"       {self.d!r}, {self.e!r}, {self.f!r})"
+        )
 
-    def to_gdal(self):
-        """Return same coefficient order as GDAL's SetGeoTransform().
+    def to_gdal(self) -> tuple[float, float, float, float, float, float]:
+        """Return same coefficient order expected by GDAL's SetGeoTransform().
 
-        :rtype: tuple
+        Returns
+        -------
+        tuple
+            Ordered: c, a, b, f, d, e.
         """
         return (self.c, self.a, self.b, self.f, self.d, self.e)
 
-    def to_shapely(self):
-        """Return an affine transformation matrix compatible with shapely
-
-        Shapely's affinity module expects an affine transformation matrix
-        in (a,b,d,e,xoff,yoff) order.
+    def to_shapely(self) -> tuple[float, float, float, float, float, float]:
+        """Return affine transformation parameters for shapely's affinity module.
 
-        :rtype: tuple
+        Returns
+        -------
+        tuple
+            Ordered: a, b, d, e, c, f.
         """
-        return (self.a, self.b, self.d, self.e, self.xoff, self.yoff)
+        return (self.a, self.b, self.d, self.e, self.c, self.f)
 
     @property
     def xoff(self) -> float:
-        """Alias for 'c'"""
+        """Alias for 'c'."""
         return self.c
 
     @property
     def yoff(self) -> float:
-        """Alias for 'f'"""
+        """Alias for 'f'."""
         return self.f
 
     @cached_property
     def determinant(self) -> float:
-        """The determinant of the transform matrix.
+        """Evaluate the determinant of the transform matrix.
 
         This value is equal to the area scaling factor when the
         transform is applied to a shape.
+
+        Returns
+        -------
+        float
         """
-        a, b, c, d, e, f, g, h, i = self
-        return a * e - b * d
+        return self.a * self.e - self.b * self.d
 
     @property
-    def _scaling(self):
+    def _scaling(self) -> tuple[float, float]:
         """The absolute scaling factors of the transformation.
 
-        This tuple represents the absolute value of the scaling factors of the
-        transformation, sorted from bigger to smaller.
+        This tuple represents the absolute value of the scaling factors
+        of the transformation, sorted from bigger to smaller.
         """
-        a, b, _, d, e, _, _, _, _ = self
+        a, b, d, e = self.a, self.b, self.d, self.e
 
         # The singular values are the square root of the eigenvalues
         # of the matrix times its transpose, M M*
         # Computing trace and determinant of M M*
-        trace = a ** 2 + b ** 2 + d ** 2 + e ** 2
-        det = (a * e - b * d) ** 2
+        trace = a**2 + b**2 + d**2 + e**2
+        det2 = (a * e - b * d) ** 2
 
-        delta = trace ** 2 / 4 - det
-        if delta < 1e-12:
-            delta = 0
+        delta = trace**2 / 4.0 - det2
+        if delta < EPSILON2:
+            delta = 0.0
 
-        l1 = math.sqrt(trace / 2 + math.sqrt(delta))
-        l2 = math.sqrt(trace / 2 - math.sqrt(delta))
+        sqrt_delta = math.sqrt(delta)
+        l1 = math.sqrt(trace / 2.0 + sqrt_delta)
+        l2 = math.sqrt(trace / 2.0 - sqrt_delta)
         return l1, l2
 
     @property
@@ -359,36 +371,37 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         This value represents the eccentricity of an ellipse under
         this affine transformation.
 
-        Raises NotImplementedError for improper transformations.
+        Raises
+        ------
+        NotImplementedError
+            For improper transformations.
         """
         l1, l2 = self._scaling
-        return math.sqrt(l1 ** 2 - l2 ** 2) / l1
+        return math.sqrt(l1**2 - l2**2) / l1
 
     @property
     def rotation_angle(self) -> float:
         """The rotation angle in degrees of the affine transformation.
 
-        This is the rotation angle in degrees of the affine transformation,
-        assuming it is in the form M = R S, where R is a rotation and S is a
-        scaling.
+        This is the rotation angle in degrees of the affine
+        transformation, assuming it is in the form M = R S, where R is
+        a rotation and S is a scaling.
 
-        Raises UndefinedRotationError for improper and degenerate
-        transformations.
+        Raises
+        ------
+        UndefinedRotationError
+            For improper and degenerate transformations.
         """
-        a, b, _, c, d, _, _, _, _ = self
         if self.is_proper or self.is_degenerate:
             l1, _ = self._scaling
-            y, x = c / l1, a / l1
-            return math.atan2(y, x) * 180 / math.pi
-        else:
-            raise UndefinedRotationError
+            y, x = self.d / l1, self.a / l1
+            return math.degrees(math.atan2(y, x))
+        raise UndefinedRotationError
 
     @property
     def is_identity(self) -> bool:
-        """True if this transform equals the identity matrix,
-        within rounding limits.
-        """
-        return self is identity or self.almost_equals(identity, self.precision)
+        """True if this transform equals the identity matrix, within rounding limits."""
+        return self is identity or self.almost_equals(identity, EPSILON)
 
     @property
     def is_rectilinear(self) -> bool:
@@ -397,9 +410,8 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         i.e., whether a shape would remain axis-aligned, within rounding
         limits, after applying the transform.
         """
-        a, b, c, d, e, f, g, h, i = self
-        return (abs(a) < self.precision and abs(e) < self.precision) or (
-            abs(d) < self.precision and abs(b) < self.precision
+        return (abs(self.a) < EPSILON and abs(self.e) < EPSILON) or (
+            abs(self.d) < EPSILON and abs(self.b) < EPSILON
         )
 
     @property
@@ -410,8 +422,7 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         transform, within rounding limits.  This implies that the
         transform has no effective shear.
         """
-        a, b, c, d, e, f, g, h, i = self
-        return abs(a * b + d * e) < self.precision
+        return abs(self.a * self.b + self.d * self.e) < EPSILON
 
     @property
     def is_orthonormal(self) -> bool:
@@ -423,48 +434,83 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         and unit-length.  Applying an orthonormal transform to a shape
         always results in a congruent shape.
         """
-        a, b, c, d, e, f, g, h, i = self
+        a, b, d, e = self.a, self.b, self.d, self.e
         return (
             self.is_conformal
-            and abs(1.0 - (a * a + d * d)) < self.precision
-            and abs(1.0 - (b * b + e * e)) < self.precision
+            and abs(1.0 - (a * a + d * d)) < EPSILON
+            and abs(1.0 - (b * b + e * e)) < EPSILON
         )
 
     @cached_property
     def is_degenerate(self) -> bool:
-        """True if this transform is degenerate.
+        """Return True if this transform is degenerate.
+
+        A degenerate transform will collapse a shape to an effective area
+        of zero, and cannot be inverted.
 
-        Which means that it will collapse a shape to an effective area
-        of zero. Degenerate transforms cannot be inverted.
+        Returns
+        -------
+        bool
         """
         return self.determinant == 0.0
 
     @cached_property
     def is_proper(self) -> bool:
-        """True if this transform is proper.
+        """Return True if this transform is proper.
 
-        Which means that it does not include reflection.
+        A proper transform (with a positive determinant) does not include
+        reflection.
+
+        Returns
+        -------
+        bool
         """
         return self.determinant > 0.0
 
     @property
-    def column_vectors(self):
-        """The values of the transform as three 2D column vectors"""
-        a, b, c, d, e, f, _, _, _ = self
-        return (a, d), (b, e), (c, f)
+    def column_vectors(
+        self,
+    ) -> tuple[tuple[float, float], tuple[float, float], tuple[float, float]]:
+        """The values of the transform as three 2D column vectors.
+
+        Returns
+        -------
+        tuple of three tuple pairs
+            Ordered (a, d), (b, e), (c, f).
+        """
+        return (self.a, self.d), (self.b, self.e), (self.c, self.f)
 
-    def almost_equals(self, other, precision: float = EPSILON) -> bool:
+    def almost_equals(self, other: Affine, precision: float | None = None) -> bool:
         """Compare transforms for approximate equality.
 
-        :param other: Transform being compared.
-        :type other: Affine
-        :return: True if absolute difference between each element
-            of each respective transform matrix < ``self.precision``.
+        Parameters
+        ----------
+        other : Affine
+            Transform being compared.
+        precision : float, default EPSILON
+            Precision to use to evaluate equality.
+
+        Returns
+        -------
+        bool
+            True if absolute difference between each element
+            of each respective transform matrix < ``precision``.
         """
-        for i in (0, 1, 2, 3, 4, 5):
-            if abs(self[i] - other[i]) >= precision:
-                return False
-        return True
+        precision = precision or EPSILON
+        return all(abs(sv - ov) < precision for sv, ov in zip(self, other))
+
+    @cached_property
+    def _astuple(self) -> tuple[float]:
+        return astuple(self)
+
+    def __getitem__(self, index):
+        return self._astuple[index]
+
+    def __iter__(self):
+        return iter(self._astuple)
+
+    def __len__(self):
+        return 9
 
     def __gt__(self, other) -> bool:
         return NotImplemented
@@ -480,104 +526,164 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
 
     __iadd__ = __add__
 
-    def __mul__(self, other):
-        """Multiplication
+    @overload
+    def __matmul__(self, other: Affine) -> Affine: ...
+    @overload
+    def __matmul__(self, other: tuple[float, float]) -> tuple[float, float]: ...
+    @overload
+    def __matmul__(
+        self, other: tuple[float, float, float]
+    ) -> tuple[float, float, float]: ...
+    # For other float sequences, we don't know the returned tuple length here
+    @overload
+    def __matmul__(self, other: Sequence[float]) -> tuple[float, ...]: ...
+    def __matmul__(self, other):
+        """Matrix multiplication.
 
         Apply the transform using matrix multiplication, creating
         a resulting object of the same type.  A transform may be applied
         to another transform, a vector, vector array, or shape.
 
-        :param other: The object to transform.
-        :type other: Affine, :class:`~planar.Vec2`,
-            :class:`~planar.Vec2Array`, :class:`~planar.Shape`
-        :rtype: Same as ``other``
+        Parameters
+        ----------
+        other : Affine or iterable of (vx, vy, [vw])
+
+        Returns
+        -------
+        Affine or a tuple of two or three items
         """
-        sa, sb, sc, sd, se, sf, _, _, _ = self
+        sa, sb, sc, sd, se, sf = self[:6]
         if isinstance(other, Affine):
-            oa, ob, oc, od, oe, of, _, _, _ = other
-            return tuple.__new__(
-                self.__class__,
-                (
-                    sa * oa + sb * od,
-                    sa * ob + sb * oe,
-                    sa * oc + sb * of + sc,
-                    sd * oa + se * od,
-                    sd * ob + se * oe,
-                    sd * oc + se * of + sf,
-                    0.0,
-                    0.0,
-                    1.0,
-                ),
+            oa, ob, oc, od, oe, of = other[:6]
+            return self.__class__(
+                sa * oa + sb * od,
+                sa * ob + sb * oe,
+                sa * oc + sb * of + sc,
+                sd * oa + se * od,
+                sd * ob + se * oe,
+                sd * oc + se * of + sf,
             )
-        else:
+        # vector of 2 or 3 items
+        try:
+            num_items = len(other)
+        except (TypeError, ValueError):
+            return NotImplemented
+        if num_items == 2:
+            vx, vy = other
+        elif num_items == 3:
+            vx, vy, vw = other
+            vw_eq_one = vw == 1.0
             try:
-                vx, vy = other
-                return (vx * sa + vy * sb + sc, vx * sd + vy * se + sf)
-            except (ValueError, TypeError):
-                return NotImplemented
+                is_eq_one = bool(vw_eq_one)
+                msg = "third value must be 1.0"
+            except ValueError:
+                is_eq_one = (vw_eq_one).all()
+                msg = "third values must all be 1.0"
+            if not is_eq_one:
+                raise ValueError(msg)
+        else:
+            raise TypeError("expected vector of 2 or 3 items")
+        px = vx * sa + vy * sb + sc
+        py = vx * sd + vy * se + sf
+        if num_items == 2:
+            return (px, py)
+        return (px, py, vw)
+
+    def __rmatmul__(self, other):
+        return NotImplemented
 
-    def __rmul__(self, other):
-        """Right hand multiplication
+    def __imatmul__(self, other):  # type: ignore
+        if not isinstance(other, Affine):
+            raise TypeError("Operation not supported")
+        return NotImplemented
 
-        .. deprecated:: 2.3.0
-            Right multiplication will be prohibited in version 3.0. This method
-            will raise AffineError.
+    @overload
+    def __mul__(self, other: Affine) -> Affine: ...
+    @overload
+    def __mul__(self, other: tuple[float, float]) -> tuple[float, float]: ...
+    def __mul__(self, other):
+        """Multiplication.
 
-        Notes
-        -----
-        We should not be called if other is an affine instance This is
-        just a guarantee, since we would potentially return the wrong
-        answer in that case.
-        """
-        warnings.warn(
-            "Right multiplication will be prohibited in version 3.0",
-            DeprecationWarning,
-            stacklevel=2,
-        )
-        assert not isinstance(other, Affine)
-        return self.__mul__(other)
+        Apply the transform using matrix multiplication, creating
+        a resulting object of the same type.  A transform may be applied
+        to another transform, a vector, vector array, or shape.
 
-    def __imul__(self, other):
-        if isinstance(other, Affine) or isinstance(other, tuple):
-            return self.__mul__(other)
-        else:
+        Parameters
+        ----------
+        other : Affine or iterable of (vx, vy)
+
+        Returns
+        -------
+        Affine or a tuple of two items
+        """
+        # TODO: consider enabling this for 3.1
+        # warnings.warn(
+        #     "Use `@` matmul instead of `*` mul operator for matrix multiplication",
+        #     PendingDeprecationWarning,
+        #     stacklevel=2,
+        # )
+        if isinstance(other, Affine):
+            return self.__matmul__(other)
+        try:
+            _, _ = other
+            return self.__matmul__(other)
+        except (ValueError, TypeError):
             return NotImplemented
 
-    def itransform(self, seq) -> None:
-        """Transform a sequence of points or vectors in place.
+    def __rmul__(self, other):
+        return NotImplemented
+
+    def __imul__(self, other):  # type: ignore
+        if isinstance(other, tuple):
+            warnings.warn(
+                "in-place multiplication with tuple is deprecated",
+                DeprecationWarning,
+                stacklevel=2,
+            )
+        return NotImplemented
+
+    def itransform(self, seq: MutableSequence[Sequence[float]]) -> None:
+        """Transform a sequence of points or vectors in-place.
+
+        Parameters
+        ----------
+        seq : mutable sequence
 
-        :param seq: Mutable sequence of :class:`~planar.Vec2` to be
-            transformed.
-        :returns: None, the input sequence is mutated in place.
+        Returns
+        -------
+        None
+            The input sequence is mutated in-place.
         """
         if self is not identity and self != identity:
-            sa, sb, sc, sd, se, sf, _, _, _ = self
+            sa, sb, sc, sd, se, sf = self[:6]
             for i, (x, y) in enumerate(seq):
                 seq[i] = (x * sa + y * sb + sc, x * sd + y * se + sf)
 
     def __invert__(self):
         """Return the inverse transform.
 
-        :raises: :except:`TransformNotInvertible` if the transform
-            is degenerate.
+        Raises
+        ------
+        TransformNotInvertible
+            If the transform is degenerate.
         """
         if self.is_degenerate:
             raise TransformNotInvertibleError("Cannot invert degenerate transform")
         idet = 1.0 / self.determinant
-        sa, sb, sc, sd, se, sf, _, _, _ = self
+        sa, sb, sc, sd, se, sf = self[:6]
         ra = se * idet
         rb = -sb * idet
         rd = -sd * idet
         re = sa * idet
-        return tuple.__new__(
-            self.__class__,
-            (ra, rb, -sc * ra - sf * rb, rd, re, -sc * rd - sf * re, 0.0, 0.0, 1.0),
+        # fmt: off
+        return self.__class__(
+            ra, rb, -sc * ra - sf * rb,
+            rd, re, -sc * rd - sf * re,
         )
-
-    __hash__ = tuple.__hash__  # hash is not inherited in Py 3
+        # fmt: on
 
     def __getnewargs__(self):
-        """Pickle protocol support
+        """Pickle protocol support.
 
         Notes
         -----
@@ -585,7 +691,7 @@ class Affine(namedtuple("Affine", ("a", "b", "c", "d", "e", "f", "g", "h", "i"))
         9 elements rather than the 6 that are required for the
         constructor.  This method ensures that only the 6 are provided.
         """
-        return self.a, self.b, self.c, self.d, self.e, self.f
+        return self[:6]
 
 
 identity = Affine(1, 0, 0, 0, 1, 0)
@@ -594,32 +700,71 @@ identity = Affine(1, 0, 0, 0, 1, 0)
 # Miscellaneous utilities
 
 
-def loadsw(s: str):
-    """Returns Affine from the contents of a world file string.
+def loadsw(s: str) -> Affine:
+    """Return Affine from the contents of a world file string.
 
     This method also translates the coefficients from center- to
     corner-based coordinates.
 
-    :param s: str with 6 floats ordered in a world file.
-    :rtype: Affine
+    Parameters
+    ----------
+    s : str
+        String with 6 floats ordered in a world file.
+
+    Returns
+    -------
+    Affine
     """
     if not hasattr(s, "split"):
         raise TypeError("Cannot split input string")
     coeffs = s.split()
     if len(coeffs) != 6:
-        raise ValueError("Expected 6 coefficients, found %d" % len(coeffs))
+        raise ValueError(f"Expected 6 coefficients, found {len(coeffs)}")
     a, d, b, e, c, f = (float(x) for x in coeffs)
-    center = tuple.__new__(Affine, [a, b, c, d, e, f, 0.0, 0.0, 1.0])
-    return center * Affine.translation(-0.5, -0.5)
+    center = Affine(a, b, c, d, e, f)
+    return center @ Affine.translation(-0.5, -0.5)
 
 
-def dumpsw(obj) -> str:
+def dumpsw(obj: Affine) -> str:
     """Return string for a world file.
 
     This method also translates the coefficients from corner- to
     center-based coordinates.
 
-    :rtype: str
+    Returns
+    -------
+    str
     """
-    center = obj * Affine.translation(0.5, 0.5)
+    center = obj @ Affine.translation(0.5, 0.5)
     return "\n".join(repr(getattr(center, x)) for x in list("adbecf")) + "\n"
+
+
+def set_epsilon(epsilon: float) -> None:
+    """Set the global absolute error value and rounding limit.
+
+    This value is accessible via the affine.EPSILON global variable.
+
+    Parameters
+    ----------
+    epsilon : float
+        The global absolute error value and rounding limit for
+        approximate floating point comparison operations.
+
+    Returns
+    -------
+    None
+
+    Notes
+    -----
+    The default value of ``0.00001`` is suitable for values that are in
+    the "countable range". You may need a larger epsilon when using
+    large absolute values, and a smaller value for very small values
+    close to zero. Otherwise approximate comparison operations will not
+    behave as expected.
+    """
+    global EPSILON, EPSILON2
+    EPSILON = float(epsilon)
+    EPSILON2 = EPSILON**2
+
+
+set_epsilon(1e-5)


=====================================
src/affine/py.typed
=====================================


=====================================
affine/tests/__init__.py ? tests/__init__.py
=====================================


=====================================
tests/test_numpy.py
=====================================
@@ -0,0 +1,132 @@
+"""Test interoperability with NumPy."""
+
+import pytest
+
+from affine import Affine
+
+try:
+    import numpy as np
+    from numpy import testing
+except ImportError:
+    pytest.skip("requires numpy", allow_module_level=True)
+
+
+def test_array():
+    """Affine instance has 9 elements, becomes 1-D Numpy array."""
+    assert np.array(Affine.identity()).shape == (9,)
+
+
+def test_linalg():
+    # cross-check properties with numpy's linear algebra module
+    ar = np.array(
+        [
+            [0, -2, 2],
+            [3, 0, 5],
+            [0, 0, 1],
+        ]
+    )
+    tfm = Affine(*ar.flatten())
+    assert tfm.determinant == pytest.approx(6.0)
+    assert np.linalg.det(ar) == pytest.approx(6.0)
+
+    expected_inv = np.array(
+        [
+            [0, 1 / 3, -5 / 3],
+            [-1 / 2, 0, 1],
+            [0, 0, 1],
+        ]
+    )
+    testing.assert_allclose(np.array(~tfm).reshape(3, 3), expected_inv)
+    testing.assert_allclose(np.linalg.inv(ar), expected_inv)
+
+
+def test_matmul_3x3_array():
+    A = Affine(2, 0, 3, 0, 3, 2)
+    Ar = np.array(A).reshape(3, 3)
+
+    # matrix @ matrix = matrix
+    res = A @ Affine.identity()
+    assert isinstance(res, Affine)
+    testing.assert_equal(np.array(res).reshape(3, 3), Ar)
+    res = Ar @ np.eye(3)
+    assert isinstance(res, np.ndarray)
+    testing.assert_equal(res, Ar)
+
+
+def test_matmul_vector():
+    A = Affine(2, 0, 3, 0, 3, 2)
+    Ar = np.array(A).reshape(3, 3)
+
+    # matrix @ vector = vector
+    v = (2, 3, 1)
+    vr = np.array(v)
+    expected_p = (7, 11, 1)
+    res = A @ v
+    assert isinstance(res, tuple)
+    testing.assert_equal(res, expected_p)
+    res = A @ vr
+    assert isinstance(res, tuple)
+    testing.assert_equal(res, expected_p)
+    res = Ar @ vr
+    assert isinstance(res, np.ndarray)
+    testing.assert_equal(res, expected_p)
+
+
+def test_matmul_items():
+    A = Affine(2, 0, 3, 0, 3, 2) @ Affine.rotation(45)
+    shape = (4, 5)
+    vx, vy = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]))
+    expected_px = np.array(
+        [
+            [3.0, 4.4142137, 5.8284273, 7.2426405, 8.656855],
+            [1.5857865, 3.0, 4.4142137, 5.8284273, 7.2426405],
+            [0.17157288, 1.5857865, 3.0, 4.4142137, 5.8284273],
+            [-1.2426407, 0.17157288, 1.5857865, 3.0, 4.4142137],
+        ]
+    )
+    expected_py = np.array(
+        [
+            [2.0, 4.1213202, 6.2426405, 8.363961, 10.485281],
+            [4.1213202, 6.2426405, 8.363961, 10.485281, 12.606602],
+            [6.2426405, 8.363961, 10.485281, 12.606602, 14.727922],
+            [8.363961, 10.485281, 12.606602, 14.727922, 16.849243],
+        ]
+    )
+    px, py = A @ (vx, vy)
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+
+    px, py, pw = A @ (vx, vy, 1)
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+    assert pw == 1
+
+    px, py, pw = A @ (vx, vy, np.ones(shape))
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+    testing.assert_array_equal(pw, np.ones(shape))
+
+    # see GH-125 with mul `*` op
+    px, py = A * (vx, vy)
+    testing.assert_allclose(px, expected_px)
+    testing.assert_allclose(py, expected_py)
+
+
+def test_matmul_item_errors():
+    shape = (4, 5)
+    vx, vy = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]))
+    with pytest.raises(ValueError, match=r"third value must be 1.0"):
+        Affine.identity() @ (vx, vy, 2)
+    with pytest.raises(ValueError, match=r"third values must all be 1.0"):
+        Affine.identity() @ (vx, vy, np.zeros(shape))
+    with pytest.raises(TypeError, match="2 or 3 items"):
+        Affine.identity() @ (vx, vy, np.ones(shape), np.ones(shape))
+
+
+def test_mul_item_errors():
+    shape = (4, 5)
+    vx, vy = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]))
+    with pytest.raises(TypeError):
+        Affine.identity() * (vx, vy, 1)
+    with pytest.raises(TypeError):
+        Affine.identity() * (vx, vy, np.zeros(shape))


=====================================
affine/tests/test_pickle.py ? tests/test_pickle.py
=====================================
@@ -2,9 +2,8 @@
 Validate that instances of `affine.Affine()` can be pickled and unpickled.
 """
 
-
-import pickle
 from multiprocessing import Pool
+import pickle
 
 import affine
 


=====================================
affine/tests/test_rotation.py ? tests/test_rotation.py
=====================================
@@ -1,5 +1,7 @@
 import math
 
+import pytest
+
 from affine import Affine
 
 
@@ -14,7 +16,7 @@ def test_rotation_angle():
         |
         0---------*
 
-    Affine.rotation(45.0) * (1.0, 0.0) == (0.707..., 0.707...)
+    Affine.rotation(45.0) @ (1.0, 0.0) == (0.707..., 0.707...)
 
         |
         |      *
@@ -22,9 +24,10 @@ def test_rotation_angle():
         |
         0----------
     """
-    x, y = Affine.rotation(45.0) * (1.0, 0.0)
-    assert round(x, 14) == round(math.sqrt(2.0) / 2.0, 14)
-    assert round(y, 14) == round(math.sqrt(2.0) / 2.0, 14)
+    x, y = Affine.rotation(45.0) @ (1.0, 0.0)
+    sqrt2div2 = math.sqrt(2.0) / 2.0
+    assert x == pytest.approx(sqrt2div2)
+    assert y == pytest.approx(sqrt2div2)
 
 
 def test_rotation_matrix():
@@ -34,12 +37,16 @@ def test_rotation_matrix():
     | sin(a)  cos(a) |
 
     """
-    rot = Affine.rotation(90.0)
-    assert round(rot.a, 15) == round(math.cos(math.pi / 2.0), 15)
-    assert round(rot.b, 15) == round(-math.sin(math.pi / 2.0), 15)
+    deg = 90.0
+    rot = Affine.rotation(deg)
+    rad = math.radians(deg)
+    cosrad = math.cos(rad)
+    sinrad = math.sin(rad)
+    assert rot.a == pytest.approx(cosrad)
+    assert rot.b == pytest.approx(-sinrad)
     assert rot.c == 0.0
-    assert round(rot.d, 15) == round(math.sin(math.pi / 2.0), 15)
-    assert round(rot.e, 15) == round(math.cos(math.pi / 2.0), 15)
+    assert rot.d == pytest.approx(sinrad)
+    assert rot.e == pytest.approx(cosrad)
     assert rot.f == 0.0
 
 
@@ -48,8 +55,8 @@ def test_rotation_matrix_pivot():
     rot = Affine.rotation(90.0, pivot=(1.0, 1.0))
     exp = (
         Affine.translation(1.0, 1.0)
-        * Affine.rotation(90.0)
-        * Affine.translation(-1.0, -1.0)
+        @ Affine.rotation(90.0)
+        @ Affine.translation(-1.0, -1.0)
     )
     for r, e in zip(rot, exp):
-        assert round(r, 15) == round(e, 15)
+        assert r == pytest.approx(e)


=====================================
affine/tests/test_serialize.py ? tests/test_serialize.py
=====================================


=====================================
tests/test_transform.py
=====================================
@@ -0,0 +1,658 @@
+#############################################################################
+# Planar is Copyright (c) 2010 by Casey Duncan
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+#   this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name(s) of the copyright holders nor the names of its
+#   contributors may be used to endorse or promote products derived from this
+#   software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AS IS AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#############################################################################
+
+"""Transform unit tests"""
+
+import math
+from textwrap import dedent
+
+import pytest
+
+import affine
+from affine import Affine
+
+
+def seq_almost_equal(t1, t2, error=0.00001):
+    assert len(t1) == len(t2), f"{t1!r} != {t2!r}"
+    for m1, m2 in zip(t1, t2):
+        assert abs(m1 - m2) <= error, f"{t1!r} != {t2!r}"
+
+
+def test_zero_args():
+    with pytest.raises(TypeError):
+        Affine()
+
+
+def test_wrong_arg_type():
+    with pytest.raises(TypeError):
+        Affine(None)
+
+
+def test_args_too_few():
+    with pytest.raises(TypeError):
+        Affine(1, 2)
+
+
+def test_args_too_many():
+    with pytest.raises(TypeError):
+        Affine(*range(10))
+
+
+def test_args_members_wrong_type():
+    with pytest.raises(TypeError):
+        Affine(0, 2, 3, None, None, "")
+
+
+def test_len():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert len(t) == 9
+
+
+def test_slice_last_row():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t[-3:] == (0, 0, 1)
+
+
+def test_members():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t.a == 1
+    assert t.b == 2
+    assert t.c == 3
+    assert t.d == 4
+    assert t.e == 5
+    assert t.f == 6
+    assert t.g == 0
+    assert t.h == 0
+    assert t.i == 1
+    # these are aliases
+    assert t.c is t.xoff
+    assert t.f is t.yoff
+
+
+def test_members_are_floats():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    for m in t:
+        assert isinstance(m, float), repr(m)
+
+
+def test_getitem():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t[0] == 1
+    assert t[1] == 2
+    assert t[2] == 3
+    assert t[3] == 4
+    assert t[4] == 5
+    assert t[5] == 6
+    assert t[6] == 0
+    assert t[7] == 0
+    assert t[8] == 1
+    assert t[-1] == 1
+
+
+def test_getitem_wrong_type():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    with pytest.raises(TypeError):
+        t["foobar"]
+
+
+def test_str():
+    t = Affine(1.111, 2.222, 3.333, -4.444, -5.555, 6.666)
+    assert str(t) == dedent(
+        """\
+        | 1.11, 2.22, 3.33|
+        |-4.44,-5.55, 6.67|
+        | 0.00, 0.00, 1.00|"""
+    )
+
+
+def test_repr():
+    t = Affine(1.111, 2.222, 3.456, 4.444, 5.5, 6.25)
+    assert repr(t) == dedent(
+        """\
+        Affine(1.111, 2.222, 3.456,
+               4.444, 5.5, 6.25)"""
+    )
+
+
+def test_identity_constructor():
+    ident = Affine.identity()
+    assert isinstance(ident, Affine)
+    assert tuple(ident) == (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)
+    assert ident.is_identity
+
+
+def test_permutation_constructor():
+    perm = Affine.permutation()
+    assert isinstance(perm, Affine)
+    assert tuple(perm) == (0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0)
+    assert (perm @ perm).is_identity
+
+
+def test_translation_constructor():
+    trans = Affine.translation(2, -5)
+    assert isinstance(trans, Affine)
+    assert tuple(trans) == (1.0, 0.0, 2.0, 0.0, 1.0, -5.0, 0.0, 0.0, 1.0)
+
+
+def test_scale_constructor():
+    scale = Affine.scale(5)
+    assert isinstance(scale, Affine)
+    assert tuple(scale) == (5, 0, 0, 0, 5, 0, 0, 0, 1)
+    scale = Affine.scale(-1, 2)
+    assert tuple(scale) == (-1, 0, 0, 0, 2, 0, 0, 0, 1)
+    assert tuple(Affine.scale(1)) == tuple(Affine.identity())
+
+
+def test_shear_constructor():
+    shear = Affine.shear(30)
+    assert isinstance(shear, Affine)
+    mx = math.tan(math.radians(30))
+    seq_almost_equal(tuple(shear), (1, mx, 0, 0, 1, 0, 0, 0, 1))
+    shear = Affine.shear(-15, 60)
+    mx = math.tan(math.radians(-15))
+    my = math.tan(math.radians(60))
+    seq_almost_equal(tuple(shear), (1, mx, 0, my, 1, 0, 0, 0, 1))
+    shear = Affine.shear(y_angle=45)
+    seq_almost_equal(tuple(shear), (1, 0, 0, 1, 1, 0, 0, 0, 1))
+
+
+def test_rotation_constructor():
+    rot = Affine.rotation(60)
+    assert isinstance(rot, Affine)
+    r = math.radians(60)
+    s, c = math.sin(r), math.cos(r)
+    assert tuple(rot) == (c, -s, 0, s, c, 0, 0, 0, 1)
+    rot = Affine.rotation(337)
+    r = math.radians(337)
+    s, c = math.sin(r), math.cos(r)
+    seq_almost_equal(tuple(rot), (c, -s, 0, s, c, 0, 0, 0, 1))
+    assert tuple(Affine.rotation(0)) == tuple(Affine.identity())
+
+
+def test_rotation_constructor_quadrants():
+    assert tuple(Affine.rotation(0)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(90)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(-180)) == (-1, 0, 0, 0, -1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(270)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(-90)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(360)) == (1, 0, 0, 0, 1, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(450)) == (0, -1, 0, 1, 0, 0, 0, 0, 1)
+    assert tuple(Affine.rotation(-450)) == (0, 1, 0, -1, 0, 0, 0, 0, 1)
+
+
+def test_rotation_constructor_with_pivot():
+    assert tuple(Affine.rotation(60)) == tuple(Affine.rotation(60, pivot=(0, 0)))
+    rot = Affine.rotation(27, pivot=(2, -4))
+    r = math.radians(27)
+    s, c = math.sin(r), math.cos(r)
+    # fmt: off
+    assert tuple(rot) == (
+        c, -s, 2 - 2 * c - 4 * s,
+        s, c, -4 - 2 * s + 4 * c,
+        0, 0, 1,
+    )
+    # fmt: on
+    assert tuple(Affine.rotation(0, (-3, 2))) == tuple(Affine.identity())
+
+
+def test_rotation_contructor_wrong_arg_types():
+    with pytest.raises(TypeError):
+        Affine.rotation(1, 1)
+
+
+def test_determinant():
+    assert Affine.identity().determinant == 1
+    assert Affine.scale(2).determinant == 4
+    assert Affine.scale(0).determinant == 0
+    assert Affine.scale(5, 1).determinant == 5
+    assert Affine.scale(-1, 1).determinant == -1
+    assert Affine.scale(-1, 0).determinant == 0
+    assert Affine.rotation(77).determinant == pytest.approx(1)
+    assert Affine.translation(32, -47).determinant == pytest.approx(1)
+
+
+def test_is_rectilinear():
+    assert Affine.identity().is_rectilinear
+    assert Affine.scale(2.5, 6.1).is_rectilinear
+    assert Affine.translation(4, -1).is_rectilinear
+    assert Affine.rotation(90).is_rectilinear
+    assert not Affine.shear(4, -1).is_rectilinear
+    assert not Affine.rotation(-26).is_rectilinear
+
+
+def test_is_conformal():
+    assert Affine.identity().is_conformal
+    assert Affine.scale(2.5, 6.1).is_conformal
+    assert Affine.translation(4, -1).is_conformal
+    assert Affine.rotation(90).is_conformal
+    assert Affine.rotation(-26).is_conformal
+    assert not Affine.shear(4, -1).is_conformal
+
+
+def test_is_orthonormal():
+    assert Affine.identity().is_orthonormal
+    assert Affine.translation(4, -1).is_orthonormal
+    assert Affine.rotation(90).is_orthonormal
+    assert Affine.rotation(-26).is_orthonormal
+    assert not Affine.scale(2.5, 6.1).is_orthonormal
+    assert not Affine.scale(0.5, 2).is_orthonormal
+    assert not Affine.shear(4, -1).is_orthonormal
+
+
+def test_is_degenerate():
+    assert not Affine.identity().is_degenerate
+    assert not Affine.translation(2, -1).is_degenerate
+    assert not Affine.shear(0, -22.5).is_degenerate
+    assert not Affine.rotation(88.7).is_degenerate
+    assert not Affine.scale(0.5).is_degenerate
+    assert Affine.scale(0).is_degenerate
+    assert Affine.scale(-10, 0).is_degenerate
+    assert Affine.scale(0, 300).is_degenerate
+    assert Affine.scale(0).is_degenerate
+    assert Affine.scale(0).is_degenerate
+
+
+def test_column_vectors():
+    a, b, c = Affine(2, 3, 4, 5, 6, 7).column_vectors
+    assert isinstance(a, tuple)
+    assert isinstance(b, tuple)
+    assert isinstance(c, tuple)
+    assert a == (2, 5)
+    assert b == (3, 6)
+    assert c == (4, 7)
+
+
+def test_almost_equals():
+    EPSILON = 1e-5
+    E = EPSILON * 0.5
+    t = Affine(1.0, E, 0, -E, 1.0 + E, E)
+    assert t.almost_equals(Affine.identity())
+    assert Affine.identity().almost_equals(t)
+    assert t.almost_equals(t)
+    t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
+    assert not t.almost_equals(Affine.identity())
+    assert not Affine.identity().almost_equals(t)
+    assert t.almost_equals(t)
+
+
+def test_almost_equals_2():
+    EPSILON = 1e-10
+    E = EPSILON * 0.5
+    t = Affine(1.0, E, 0, -E, 1.0 + E, E)
+    assert t.almost_equals(Affine.identity(), precision=EPSILON)
+    assert Affine.identity().almost_equals(t, precision=EPSILON)
+    assert t.almost_equals(t, precision=EPSILON)
+    t = Affine(1.0, 0, 0, -EPSILON, 1.0, 0)
+    assert not t.almost_equals(Affine.identity(), precision=EPSILON)
+    assert not Affine.identity().almost_equals(t, precision=EPSILON)
+    assert t.almost_equals(t, precision=EPSILON)
+
+
+def test_equality():
+    t1 = Affine(1, 2, 3, 4, 5, 6)
+    t2 = Affine(6, 5, 4, 3, 2, 1)
+    t3 = Affine(1, 2, 3, 4, 5, 6)
+    assert t1 == t3
+    assert t1 != t2
+    assert t2 == t2
+    assert t1 == t3
+    assert t2 == t2
+    assert t1 != t2
+    assert t1 != 1
+    assert t1 != 1
+
+
+def test_gt():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) > Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_lt():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) < Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_add():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) + Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_sub():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) - Affine(6, 5, 4, 3, 2, 1)
+
+
+def test_matmul_by_identity():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert tuple(t @ Affine.identity()) == tuple(t)
+
+
+def test_matmul_transform():
+    t = Affine.rotation(5) @ Affine.rotation(29)
+    assert isinstance(t, Affine)
+    seq_almost_equal(t, Affine.rotation(34))
+    t = Affine.scale(3, 5) @ Affine.scale(2)
+    seq_almost_equal(t, Affine.scale(6, 10))
+
+
+def test_itransform():
+    pts = [(4, 1), (-1, 0), (3, 2)]
+    r = Affine.scale(-2).itransform(pts)
+    assert r is None, r
+    assert pts == [(-8, -2), (2, 0), (-6, -4)]
+
+    A = Affine.rotation(33)
+    pts = [(4, 1), (-1, 0), (3, 2)]
+    pts_expect = [A @ pt for pt in pts]
+    r = A.itransform(pts)
+    assert r is None
+    assert pts == pts_expect
+
+
+def test_mul_wrong_type():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) * None
+
+
+def test_matmul_wrong_type():
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) @ None
+
+
+def test_matmul_sequence_wrong_member_types():
+    class NotPtSeq:
+        @classmethod
+        def from_points(cls, points):
+            list(points)
+
+        def __iter__():
+            yield 0
+
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) * NotPtSeq()
+
+    with pytest.raises(TypeError):
+        Affine(1, 2, 3, 4, 5, 6) @ NotPtSeq()
+
+
+def test_imul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        t *= 2.0
+
+
+def test_imatmul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        t @= 2.0
+    with pytest.raises(TypeError):
+        t @= (1, 2)
+    with pytest.raises(TypeError):
+        t @= (1, 2, 1)
+
+
+def test_imul_tuple():
+    t = Affine.translation(3, 5)
+    with pytest.deprecated_call():
+        t *= (4, 5)
+    assert isinstance(t, tuple)  # changes type!
+    assert t == (7.0, 10.0)
+
+
+def test_imul_transform():
+    t = Affine.translation(3, 5)
+    t *= Affine.translation(-2, 3.5)
+    assert isinstance(t, Affine)
+    seq_almost_equal(t, Affine.translation(1, 8.5))
+
+
+def test_imatmul_transform():
+    t = Affine.translation(3, 5)
+    t @= Affine.translation(-2, 3.5)
+    assert isinstance(t, Affine)
+    seq_almost_equal(t, Affine.translation(1, 8.5))
+
+
+def test_inverse():
+    seq_almost_equal(~Affine.identity(), Affine.identity())
+    seq_almost_equal(~Affine.translation(2, -3), Affine.translation(-2, 3))
+    seq_almost_equal(~Affine.rotation(-33.3), Affine.rotation(33.3))
+    t = Affine(1, 2, 3, 4, 5, 6)
+    seq_almost_equal(~t @ t, Affine.identity())
+
+
+def test_cant_invert_degenerate():
+    t = Affine.scale(0)
+    with pytest.raises(affine.TransformNotInvertibleError):
+        ~t
+
+
+def test_bad_type_world():
+    """wrong type, i.e don't use readlines()"""
+    with pytest.raises(TypeError):
+        affine.loadsw(["1.0", "0.0", "0.0", "1.0", "0.0", "0.0"])
+
+
+def test_bad_value_world():
+    """Wrong number of parameters."""
+    with pytest.raises(ValueError, match="Expected 6 coefficients"):
+        affine.loadsw("1.0\n0.0\n0.0\n1.0\n0.0\n0.0\n0.0")
+
+
+def test_simple_world():
+    s = "1.0\n0.0\n0.0\n-1.0\n100.5\n199.5\n"
+    a = affine.loadsw(s)
+    assert a == Affine(1.0, 0.0, 100.0, 0.0, -1.0, 200.0)
+    assert affine.dumpsw(a) == s
+
+
+def test_real_world():
+    s = dedent(
+        """\
+                39.9317755024
+                30.0907511581
+                30.0907511576
+            -39.9317755019
+        2658137.2266720217
+        5990821.7039887439"""
+    )  # no EOL
+    a1 = affine.loadsw(s)
+    assert a1.almost_equals(
+        Affine(
+            39.931775502364644,
+            30.090751157602412,
+            2658102.2154086917,
+            30.090751157602412,
+            -39.931775502364644,
+            5990826.624500916,
+        )
+    )
+    a1out = affine.dumpsw(a1)
+    assert isinstance(a1out, str)
+    a2 = affine.loadsw(a1out)
+    assert a1.almost_equals(a2)
+
+
+def test_gdal():
+    t = Affine.from_gdal(-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
+    assert t.c == t.xoff == -237481.5
+    assert t.a == 425.0
+    assert t.b == 0.0
+    assert t.f == t.yoff == 237536.4
+    assert t.d == 0.0
+    assert t.e == -425.0
+    assert tuple(t) == (425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4, 0, 0, 1)
+    assert t.to_gdal() == (-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0)
+
+
+def test_shapely():
+    t = Affine(425.0, 0.0, -237481.5, 0.0, -425.0, 237536.4)
+    assert t.to_shapely() == (425.0, 0.0, 0.0, -425, -237481.5, 237536.4)
+
+
+def test_rmul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        (1.0, 1.0) * t
+
+
+def test_rmatmul_errors():
+    t = Affine.identity()
+    with pytest.raises(TypeError):
+        (1.0, 1.0) @ t
+    with pytest.raises(TypeError):
+        (1.0, 1.0, 1.0) @ t
+
+
+def test_mul_tuple():
+    t = Affine(1, 2, 3, 4, 5, 6)
+    assert t * (2, 2) == (9, 24)
+    with pytest.raises(TypeError):
+        t * (2, 2, 1)
+
+
+def test_associative():
+    point = (12, 5)
+    trans = Affine.translation(-10.0, -5.0)
+    rot90 = Affine.rotation(90.0)
+    result1 = rot90 @ (trans @ point)
+    result2 = (rot90 @ trans) @ point
+    seq_almost_equal(result1, (0.0, 2.0))
+    seq_almost_equal(result1, result2)
+
+
+def test_roundtrip():
+    point = (12, 5)
+    trans = Affine.translation(3, 4)
+    rot37 = Affine.rotation(37.0)
+    point_prime = (trans @ rot37) @ point
+    roundtrip_point = ~(trans @ rot37) @ point_prime
+    seq_almost_equal(point, roundtrip_point)
+
+
+def test_eccentricity():
+    assert Affine.identity().eccentricity == 0.0
+    assert Affine.scale(2).eccentricity == 0.0
+    # assert_equal(Affine.scale(0).eccentricity, ?)
+    assert Affine.scale(2, 1).eccentricity == pytest.approx(math.sqrt(3) / 2)
+    assert Affine.scale(2, 3).eccentricity == pytest.approx(math.sqrt(5) / 3)
+    assert Affine.scale(1, 0).eccentricity == 1.0
+    assert Affine.rotation(77).eccentricity == pytest.approx(0.0)
+    assert Affine.translation(32, -47).eccentricity == pytest.approx(0.0)
+    assert Affine.scale(-1, 1).eccentricity == pytest.approx(0.0)
+
+
+def test_eccentricity_complex():
+    assert (Affine.scale(2, 3) @ Affine.rotation(77)).eccentricity == pytest.approx(
+        math.sqrt(5) / 3
+    )
+    assert (Affine.rotation(77) @ Affine.scale(2, 3)).eccentricity == pytest.approx(
+        math.sqrt(5) / 3
+    )
+    assert (
+        Affine.translation(32, -47) @ Affine.rotation(77) @ Affine.scale(2, 3)
+    ).eccentricity == pytest.approx(math.sqrt(5) / 3)
+
+
+def test_rotation_angle():
+    assert Affine.identity().rotation_angle == 0.0
+    assert Affine.scale(2).rotation_angle == 0.0
+    assert Affine.scale(2, 1).rotation_angle == 0.0
+    assert Affine.translation(32, -47).rotation_angle == pytest.approx(0.0)
+    assert Affine.rotation(30).rotation_angle == pytest.approx(30)
+    assert Affine.rotation(-150).rotation_angle == pytest.approx(-150)
+
+
+def test_rotation_improper():
+    with pytest.raises(affine.UndefinedRotationError):
+        Affine.scale(-1, 1).rotation_angle
+
+
+# See gh-71 for bug report motivating this test.
+def test_mul_fallback_unpack():
+    """Support fallback in case that other is a single object."""
+
+    class TextPoint:
+        """Not iterable, will trigger ValueError in Affine.__mul__."""
+
+        def __rmul__(self, other):
+            return other * (1, 2)
+
+        def __rmatmul__(self, other):
+            return other @ (1, 2)
+
+    assert Affine.identity() * TextPoint() == (1, 2)
+
+    assert Affine.identity() @ TextPoint() == (1, 2)
+
+
+# See gh-71 for bug report motivating this test.
+def test_mul_fallback_type_error():
+    """Support fallback in case that other is an unexpected type."""
+
+    class TextPoint:
+        """Iterable, but values trigger TypeError in Affine.__mul__."""
+
+        def __iter__(self):
+            return ("1", "2")
+
+        def __rmul__(self, other):
+            return other * (1, 2)
+
+        def __rmatmul__(self, other):
+            return other @ (1, 2)
+
+    assert Affine.identity() * TextPoint() == (1, 2)
+    assert Affine.identity() @ TextPoint() == (1, 2)
+
+
+def test_init_invalid_g():
+    with pytest.raises(ValueError, match="g must"):
+        Affine(0, 0, 0, 0, 0, 0, 1)
+
+
+def test_init_invalid_h():
+    with pytest.raises(ValueError, match="h must"):
+        Affine(0, 0, 0, 0, 0, 0, 0, 1)
+
+
+def test_init_invalid_i():
+    with pytest.raises(ValueError, match="i must"):
+        Affine(0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+
+def test_matmul_invalid_vector():
+    with pytest.raises(ValueError, match=r"must be 1.0"):
+        Affine.identity() @ (2.0, 3.0, 0.0)
+
+
+ at pytest.mark.parametrize("vec", [(2.0,), (2.0, 2.0, 1.0, 1.0)])
+def test_matmul_invalid_vector_2(vec):
+    with pytest.raises(TypeError, match="2 or 3 items"):
+        Affine.identity() @ vec


=====================================
tox.ini
=====================================
@@ -1,11 +1,11 @@
 [tox]
 envlist =
-    py37,py38,py39,py310,py311
+    py39,py310,py311,py312,py313,py314
 
 [testenv]
 usedevelop = true
 deps =
+    numpy
     pytest-cov
-    responses
 commands =
-    python -m pytest affine/tests --cov affine --cov-report term-missing
+    python -m pytest  --cov affine --cov-report term-missing



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/commit/8fa9e1be21f3c9a0b0256d02c59b00f19f85cb54

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/commit/8fa9e1be21f3c9a0b0256d02c59b00f19f85cb54
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/45568909/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  8 17:06:48 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 08 Aug 2026 16:06:48 +0000
Subject: Processing of stac-validator_4.5.2-1_source.changes
Message-ID: <E1wsjZQ-001hcx-1D@usper.debian.org>

stac-validator_4.5.2-1_source.changes uploaded successfully to localhost
along with the files:
  stac-validator_4.5.2-1.dsc
  stac-validator_4.5.2.orig.tar.gz
  stac-validator_4.5.2-1.debian.tar.xz
  stac-validator_4.5.2-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From gitlab at salsa.debian.org  Sat Aug  8 17:10:22 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:10:22 +0000
Subject: [Git][debian-gis-team/asf-search] Pushed new tag debian/12.3.0-1
Message-ID: <6a7754eebcd35_53712f8544303e@godard.mail>



Antonio Valentino pushed new tag debian/12.3.0-1 at Debian GIS Project / asf-search

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/tree/debian/12.3.0-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/d69a03c4/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:10:26 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:10:26 +0000
Subject: [Git][debian-gis-team/asf-search] Pushed new tag upstream/12.3.0
Message-ID: <6a7754f21bfe9_537fb4a0430558@godard.mail>



Antonio Valentino pushed new tag upstream/12.3.0 at Debian GIS Project / asf-search

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/tree/upstream/12.3.0
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/4134838e/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:10:45 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:10:45 +0000
Subject: [Git][debian-gis-team/asf-search][master] 4 commits: New upstream
 version 12.3.0
Message-ID: <6a77550575d54_537fafa04307ec@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / asf-search


Commits:
5ab9bd0a by Antonio Valentino at 2026-08-08T16:03:02+00:00
New upstream version 12.3.0
- - - - -
1a0586fc by Antonio Valentino at 2026-08-08T16:03:08+00:00
Update upstream source from tag 'upstream/12.3.0'

Update to upstream version '12.3.0'
with Debian dir 1fe5ed12e4dc520c14c65c0a54c3eea55a3384ad
- - - - -
682ecc88 by Antonio Valentino at 2026-08-08T16:03:37+00:00
New upstream reease

- - - - -
8864c8ab by Antonio Valentino at 2026-08-08T16:04:47+00:00
Set distribution to unstable

- - - - -


28 changed files:

- .github/workflows/lint.yml
- .github/workflows/run-pytest-authenticated.yml
- CHANGELOG.md
- asf_search/ASFSearchOptions/validator_map.py
- asf_search/CMR/datasets.py
- asf_search/CMR/subquery.py
- asf_search/Pair.py
- + asf_search/S1MultiBurstProduct.py
- asf_search/SBASNetwork.py
- asf_search/Stack.py
- asf_search/__init__.py
- + asf_search/constants/MATURITIES.py
- asf_search/constants/__init__.py
- asf_search/search/geo_search.py
- asf_search/search/search.py
- asf_search/search/search_count.py
- asf_search/search/search_generator.py
- conftest.py
- debian/changelog
- examples/SBASNetwork.ipynb
- + examples/SBASNetwork_S1-Multiburst.ipynb
- examples/Stack.ipynb
- pyproject.toml
- setup.py
- + tests/S1MultiBurstProduct/test_S1MultiBurstProduct.py
- tests/SBASNetwork/test_SBASNetwork.py
- tests/yml_tests/test_ASFSearchResults.yml
- tests/yml_tests/test_known_bugs.yml


Changes:

=====================================
.github/workflows/lint.yml
=====================================
@@ -9,4 +9,4 @@ jobs:
       - uses: astral-sh/ruff-action at v3
         with:
           src: './asf_search'
-          version-file: 'pyproject.toml'
\ No newline at end of file
+          version: '0.15.22'
\ No newline at end of file


=====================================
.github/workflows/run-pytest-authenticated.yml
=====================================
@@ -8,7 +8,6 @@ on:
     branches:
       - master
 
-
 jobs:
   run-tests:
     runs-on: ubuntu-latest


=====================================
CHANGELOG.md
=====================================
@@ -25,6 +25,22 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 -
 
 -->
+=======
+## [v12.3.0](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.3...v12.3.0)
+### Added
+- Adds Sentinel-1 multi-burst support to `SBASNetwork` class
+  - Adds multi-burst supporting classes:
+    - S1MultiBurstSceneIDPair
+    - S1MultiBurst
+    - S1MultiBurstGroup
+    - S1MultiBurstProduct
+  - For usage examples, see `examples/SBASNetwork_S1-Multiburst.ipynb`
+- Updates `SBASNetwork.add_pairs()` and `SABANetork.remove_pairs()` to take either Pair objects or tuples of date pair strings.
+- Parameter for filtering NISAR products based off of data maturity.
+```python
+asf.search_count(dataMaturity=asf.constants.MATURITIES.BETA, dataset=asf.constants.DATASET.NISAR)
+```
+
 ------
 ## [v12.2.3](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.2...v12.2.3)
 ### Added
@@ -38,7 +54,7 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 ------
 ## [v12.2.1](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.0...v12.2.1)
 ### Fixed
-- Fixes optinal dependency `pandas` causing import error in `SBASNetwork` class
+- Fixes optional dependency `pandas` causing import error in `SBASNetwork` class
 
 ------
 ## [v12.2.0](https://github.com/asfadmin/Discovery-asf_search/compare/v12.1.1...v12.2.0)
@@ -64,6 +80,11 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 - `OPERA_L3_DIST-ALERT-S1_V1` shortname/collections added
 - Add `NISAR_EA` shortname/collections to NISAR dataset (available to authorized users)
 
+------
+## [v12.0.8](https://github.com/asfadmin/Discovery-asf_search/compare/v12.0.7...v12.0.8)
+### Added
+- `Sentinel-1D` constants and search support
+
 ------
 ## [v12.0.7](https://github.com/asfadmin/Discovery-asf_search/compare/v12.0.6...v12.0.7)
 ### Added


=====================================
asf_search/ASFSearchOptions/validator_map.py
=====================================
@@ -44,6 +44,7 @@ validator_map = {
     'bbox': parse_bbox,
     'beamMode': parse_string_list,
     'beamSwath': parse_string_list,
+    'dataMaturity': parse_string_list,
     'campaign': parse_string,
     'circle': parse_circle,
     'linestring': parse_linestring,


=====================================
asf_search/CMR/datasets.py
=====================================
@@ -1994,6 +1994,24 @@ collections_by_processing_level = {
 
 # Helper Methods
 
+def get_nisar_collection_by_maturity(maturities: List[str]):
+    collections = {
+        'BETA': [],
+        'PROVISIONAL': [],
+        'VALIDATED': []
+    }
+
+    for short_name, maturity_collection in dataset_collections['NISAR'].items():
+        if 'BETA' in short_name:
+            collections['BETA'].extend(maturity_collection)
+        elif 'PROVISIONAL' in short_name:
+            collections['PROVISIONAL'].extend(maturity_collection)
+        elif short_name.endswith('V1'):
+            collections['VALIDATED'].extend(maturity_collection)
+    try:
+        return sum([collections[maturity.upper()] for maturity in maturities],[])
+    except KeyError:
+        raise ValueError(f'Invalid maturity option provided valid options are: {", ".join(collections.keys())}' )
 
 def get_concept_id_alias(param_list: List[str], collections_dict: dict) -> List[str]:
     """


=====================================
asf_search/CMR/subquery.py
=====================================
@@ -10,6 +10,7 @@ from asf_search.CMR.datasets import (
     collections_per_platform,
     get_concept_id_alias,
     get_dataset_concept_ids,
+    get_nisar_collection_by_maturity
 )
 from numpy import intersect1d, union1d
 
@@ -128,12 +129,13 @@ def get_keyword_concept_ids(params: dict, use_collection_alias: bool = True, inc
         if alias_processing_levels and alias_platforms and not len(collections):
             # processingLevel isn't part of the given platform. Drop aliased keywords so we don't search on zero collections
             aliased_keywords = []
-            
+
     if 'dataset' in params.keys():
         aliased_keywords.append('dataset')
         dataset_concept_ids = get_dataset_concept_ids(params.get('dataset'))
         collections = _get_intersection(dataset_concept_ids, collections)
-
+    if 'dataMaturity' in params.keys():
+        collections = _get_intersection(get_nisar_collection_by_maturity(params.get('dataMaturity')), collections)
     return collections, aliased_keywords
 
 


=====================================
asf_search/Pair.py
=====================================
@@ -1,7 +1,9 @@
 import importlib.util
 import math
+from typing import Union
 
 from .ASFProduct import ASFProduct
+from .S1MultiBurstProduct import S1MultiBurstProduct
 from .baseline import calculate_perpendicular_baselines
 from .exceptions import CoherenceEstimationError
 import pytz
@@ -27,8 +29,7 @@ except ImportError:
 
 class Pair:
     """
-    A Pair is comprised of a reference scene and a secondary scene. These scenes typically intersect geographically,
-    but that is not a requirement. When a pair is created, its perpendicular and temporal baselines are calculated
+    A Pair is comprised of a reference scene and a secondary scene. When a pair is created, its perpendicular and temporal baselines are calculated
     and stored in the self.perpendicular_baseline and self.temporal_baseline member variables.
 
     Two pairs are equivalent if they have matching reference and secondary dates
@@ -36,19 +37,30 @@ class Pair:
     ref: ASFProduct for reference scene
     sec: ASFProduct for secondary scene
     """
-    def __init__(self, ref: ASFProduct, sec: ASFProduct):
-        self.ref = ref
-        self.sec = sec
-        self.id = (ref.properties['sceneName'], sec.properties['sceneName'])
-
-        self.perpendicular_baseline = calculate_perpendicular_baselines(
-            ref.properties['sceneName'], 
-            [sec, ref])[0].properties['perpendicularBaseline']
+    def __init__(self, 
+            ref: Union[ASFProduct, S1MultiBurstProduct], 
+            sec: Union[ASFProduct, S1MultiBurstProduct]):
+        
 
-        self.ref_time = parse_datetime(ref.properties["startTime"])
+        self.ref = ref
+        self.sec = sec          
+        
+        self.id = (self.ref.properties['sceneName'], self.sec.properties['sceneName'])
+        if isinstance(ref, ASFProduct) and isinstance(sec, ASFProduct):
+            self.perpendicular_baseline = calculate_perpendicular_baselines(
+                self.ref.properties['sceneName'], 
+                [self.sec, self.ref])[0].properties['perpendicularBaseline']
+            
+        elif isinstance(ref, S1MultiBurstProduct) and isinstance(sec, S1MultiBurstProduct):
+            perpendicular_baselines = [calculate_perpendicular_baselines(ref.properties['sceneName'], [sec, ref])[0].properties['perpendicularBaseline'] 
+                                       for ref, sec in zip(self.ref.geo_reference_bursts, self.sec.geo_reference_bursts)]
+            # Use the largest burst perpendicular baseline to represent the S1MultiBurstProduct
+            self.perpendicular_baseline = max((x for x in perpendicular_baselines if x is not None), default=None)
+
+        self.ref_time = parse_datetime(self.ref.properties["startTime"])
         if self.ref_time.tzinfo is None:
             self.ref_time = pytz.utc.localize(self.ref_time)
-        self.sec_time = parse_datetime(sec.properties["startTime"])
+        self.sec_time = parse_datetime(self.sec.properties["startTime"])
         if self.sec_time.tzinfo is None:
             self.sec_time = pytz.utc.localize(self.sec_time)
 


=====================================
asf_search/S1MultiBurstProduct.py
=====================================
@@ -0,0 +1,294 @@
+from collections import defaultdict
+from dataclasses import dataclass
+from datetime import timedelta
+from typing import List, Literal, Optional
+
+from asf_search import ASF_LOGGER
+from .ASFProduct import ASFProduct
+from asf_search.ASFSearchOptions import ASFSearchOptions
+from .search import geo_search, search
+from .ASFSearchResults import ASFSearchResults
+from .baseline import get_baseline_from_stack
+
+try:
+    from ciso8601 import parse_datetime
+except ImportError:
+    from dateutil.parser import parse as parse_datetime
+
+Subswath = Literal["IW1", "IW2", "IW3"]
+
+
+ at dataclass(frozen=True)
+class S1MultiBurst:
+    """
+    Represents a Sentinel-1 burst and which subswaths it should include.
+    """
+    relative_burst_id: str
+    subswaths: tuple[Subswath, ...]
+
+
+ at dataclass(frozen=True)
+class S1MultiBurstGroup:
+    """
+    Represents a group of S1MultiBursts to be processed together.
+    """
+    bursts: list[S1MultiBurst]
+
+    def __post_init__(self):
+        self.check_group_validity()
+
+    def check_group_validity(self) -> None:
+        """Check that the burst group is valid.
+
+        Temporarily borrowed (edited) from burst2safe, until validation logic moves to its own package.
+        https://github.com/ASFHyP3/burst2safe/blob/develop/src/burst2safe/safe.py#L83
+
+        A valid burst group must:
+        - Have the same acquisition mode
+        - Be from the same absolute orbit
+        - Be contiguous in time and space
+
+        Args:
+            burst_infos: A list of BurstInfo objects
+        """
+        group_size = sum(len(burst.subswaths) for burst in self.bursts)
+        if group_size > 15:
+            raise ValueError("An S1MultiBurstGroup may include no more than 15 burst/subswath combinations")
+
+        swaths = sorted(list(set([int(subswath[2]) for burst in self.bursts for subswath in burst.subswaths])))
+
+        burst_range: dict[str, tuple[int, int]] = {}
+        for swath in swaths:
+            burst_subset = [burst for burst in self.bursts if f"IW{swath}" in burst.subswaths]
+
+
+            if not burst_subset:
+                burst_range[swath] = (0, 0)
+                continue
+
+            self.check_burst_group_validity(burst_subset, swath)
+
+            burst_ids = [int(info.relative_burst_id.split("_")[1]) for info in burst_subset]
+            burst_range[swath] = (min(burst_ids), max(burst_ids))
+
+        if len(swaths) <= 1:
+            return
+
+        for swath1, swath2 in zip(swaths, swaths[1:]):
+            min_diff = burst_range[swath1][0] - burst_range[swath2][0]
+            if abs(min_diff) > 1:
+                raise ValueError(f'Products from swaths {swath1} and {swath2} do not overlap')
+
+            max_diff = burst_range[swath1][1] - burst_range[swath2][1]
+            if abs(max_diff) > 1:
+                raise ValueError(f'Products from swaths {swath1} and {swath2} do not overlap')
+                     
+    def check_burst_group_validity(self, burst_subset, swath):
+        """Check that the burst group is valid.
+
+        Temporarily borrowed (edited) from burst2safe, until validation logic moves to its own package.
+        https://github.com/ASFHyP3/burst2safe/blob/develop/src/burst2safe/safe.py#L83
+
+        The burst group must:
+        - Not contain duplicate granules
+        - Have the same absolute orbit
+        - Have consecutive burst IDs
+
+        Args:
+            burst_infos: A list of BurstInfo objects
+        """
+        granules = [f"{burst.relative_burst_id}_IW{swath}" for burst in burst_subset]
+
+        duplicates = list(set([x for x in granules if granules.count(x) > 1]))
+        if duplicates:
+            raise ValueError(f'Found duplicate granules: {duplicates}.')
+
+        orbits = set([granule.split("_")[0] for granule in granules])
+        if len(orbits) != 1:
+            raise ValueError(f'All bursts must have the same absolute orbit. Found: {orbits}.')
+
+        burst_ids = [int(burst.split('_')[1]) for burst in granules]
+        burst_ids.sort()
+        if burst_ids != list(range(min(burst_ids), max(burst_ids) + 1)):
+            raise ValueError(f'All bursts must have consecutive burst IDs. Found: {burst_ids}.')
+
+
+class S1MultiBurstProduct():
+    """
+    Represents a group of Sentinel-1 bursts. 
+     
+    member variables:
+    - multiburst_group (S1MultiBurstGroup): Represents the geographical area with burst and subswath IDs
+    - geo_reference_bursts (list of ASFProducts): A list of geographic reference burst ASFProducts
+
+    An S1MultiBurstProduct can be initialized from either a multiburst_group and start_date or a geo_reference_bursts list.
+    When creating a S1MultiBurstProduct from a S1MultiBurstGroup, a geographic search is performed to identify geographic
+    reference products with acquisition dates as near as possible to the start_date. 
+
+    ### multiburst_group example ###
+
+    multiburst_group = asf.S1MultiBurstGroup(
+        bursts=[
+        S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+        S1MultiBurst("173_370306", ("IW1", "IW2", "IW3")),
+        S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+        ])
+
+    start_date = '2023-01-01'
+    multiburst = asf.S1MultiBurstProduct(multiburst_group, start_date)
+
+    ### geo_reference_bursts example ###
+
+    multiburst = asf.S1MultiBurstProduct([burst_product_1, burst_product_2, burst_product_3, ...])
+    
+    """
+    def __init__(
+        self,
+        multiburst_group: S1MultiBurstGroup = None,
+        start_date: str = None,
+        geo_reference_bursts: List[ASFProduct] = None   
+    ):
+        self.start_date=start_date
+        if not multiburst_group and not geo_reference_bursts:
+            raise ValueError("Provide multiburst_group or geo_reference_bursts")
+        
+        if not geo_reference_bursts:
+            self.geo_reference_bursts = self.identify_geo_reference_bursts(multiburst_group)
+        else:
+            self.geo_reference_bursts = geo_reference_bursts
+
+        if not multiburst_group:
+            self.multiburst_group = self.identify_multiburst_group(geo_reference_bursts)
+        else:
+            self.multiburst_group = multiburst_group
+
+        start_time = max([p.properties["startTime"] for p in self.geo_reference_bursts])
+        stop_time = max([p.properties["stopTime"] for p in self.geo_reference_bursts])
+        self.id = self._build_scene_name(start_time)
+        self.properties = {
+            "sceneName": self.id,
+            "startTime": start_time,
+            "stopTime": stop_time,
+        }
+
+    def __repr__(self) -> str:
+        return f"S1MultiBurstProduct({self.id})"
+
+    def __eq__(self, other):
+        if not isinstance(other, S1MultiBurstProduct):
+            return NotImplemented
+        return self.id == other.id
+    
+    def __hash__(self):
+        return hash(self.id)
+
+    def __len__(self):
+        return len(self.geo_reference_bursts)
+    
+    def identify_geo_reference_bursts(self, multiburst_group: S1MultiBurstGroup) -> List[ASFProduct]:
+        """
+        Returns one geographic reference product for each burst/subswath in multiburst_group,
+        from the earliest acquisition date with complete coverage.
+
+        There is no guarantee that the returned products will fall on self.start_date; they will
+        fall on the first available date on or after self.start_date.
+        """
+        relative_burst_ids = [
+            f"{burst.relative_burst_id}_{subswath}"
+            for burst in multiburst_group.bursts
+            for subswath in burst.subswaths
+        ]
+
+        results = geo_search(
+            fullBurstID=relative_burst_ids,
+            polarization="VV",
+            start=self.start_date,
+            end=str(
+                (parse_datetime(self.start_date) + timedelta(days=48)).date()
+            ),
+        )
+
+        products_by_date = {}
+
+        for result in results:
+            acquisition_date = parse_datetime(
+                result.properties["startTime"]
+            ).date()
+
+            full_burst_id = result.properties["burst"]["fullBurstID"]
+
+            products_by_date.setdefault(acquisition_date, {})[full_burst_id] = result
+
+        for acquisition_date in sorted(products_by_date):
+            products = products_by_date[acquisition_date]
+
+            if set(relative_burst_ids) <= products.keys():
+                return [products[burst_id] for burst_id in relative_burst_ids]
+
+        raise ValueError(
+            "No acquisition date contains all requested burst/subswath "
+            f"combinations: {relative_burst_ids}"
+        )
+
+    def identify_multiburst_group(self, geo_reference_bursts):
+        """
+        Returns an S1MultiBurstGroup corresponding to the list of geo_reference_bursts
+        """
+        relative_burst_ids = sorted(set([f'{p.properties["pathNumber"]}_{p.properties["burst"]["relativeBurstID"]}' for p in geo_reference_bursts]))
+        burst_group_dict = {burst_id: [] for burst_id in relative_burst_ids}
+        for p in geo_reference_bursts:
+            burst_id = f'{p.properties["pathNumber"]}_{p.properties["burst"]["relativeBurstID"]}'
+            burst_group_dict[burst_id].append(p.properties["burst"]["subswath"])
+
+        multibursts = [S1MultiBurst(k, v) for k, v in burst_group_dict.items()]
+        return S1MultiBurstGroup(bursts=multibursts)
+    
+    def _build_scene_name(self, start_time):
+        start_time = "".join(start_time.split("T")[0].split("-"))
+        id = ""
+        for multiburst in self.multiburst_group.bursts:
+            id = f"{id}_{multiburst.relative_burst_id}_IW"
+            for subswath in multiburst.subswaths:
+                id = f"{id}{subswath[2]}"
+        return f"{id[1:]}_{start_time}"
+
+    def stack(self, opts: Optional[ASFSearchOptions] = None) -> List[ASFSearchResults]:
+        """
+        Builds a baseline stack for each burst product in self.geo_reference_bursts.
+
+        opts: An ASFSearchOptions object describing the search parameters to be used.
+
+        Returns: A list of asf_search.ASFSearchResults, each containing the stack for 
+                 a burst ASFProduct in self.geo_reference_bursts, with the addition of baseline 
+                 values (temporal, perpendicular) attached to each burst ASFProduct.
+        """
+        full_burst_id_list = [burst.properties["burst"]["fullBurstID"] for burst in self.geo_reference_bursts]
+
+        stack_opts = self.geo_reference_bursts[0].get_stack_opts()
+        stack_opts.fullBurstID = full_burst_id_list
+
+        opts.merge_args(**dict(stack_opts))
+
+        combined_results = search(opts=opts)
+
+        grouped = defaultdict(list)
+
+        for product in combined_results:
+            full_burst_id = product.properties["burst"]["fullBurstID"]
+            grouped[full_burst_id].append(product)
+
+        split_results = {
+            burst_id: ASFSearchResults(products)
+            for burst_id, products in grouped.items()
+        }
+
+        stack_search_results = []
+
+        for p in self.geo_reference_bursts:
+            full_burst_id = p.properties["burst"]["fullBurstID"]
+            stack, _ = get_baseline_from_stack(reference=p, stack=split_results[full_burst_id])
+            stack.sort(key=lambda product: product.properties['temporalBaseline'])
+            stack_search_results.append(stack)
+
+        return stack_search_results
+    
\ No newline at end of file


=====================================
asf_search/SBASNetwork.py
=====================================
@@ -1,9 +1,12 @@
 from datetime import datetime, timedelta
+from itertools import combinations
 import importlib.util
 import numpy as np
-from typing import Optional, List, Dict, Tuple, Union
+from typing import Optional, List, Dict, Tuple, Union, NamedTuple
 
+from asf_search import ASF_LOGGER
 from .ASFProduct import ASFProduct
+from .S1MultiBurstProduct import S1MultiBurstProduct
 from .Pair import Pair
 from .Stack import Stack
 from .ASFSearchOptions import ASFSearchOptions
@@ -30,23 +33,37 @@ except ImportError:
     sample_colorscale = None
     pd = None
 
+class S1MultiBurstSceneIDPair(NamedTuple):
+    """
+    Defines a named tuple of lists of reference and secondary ASFProducts ID strings
+    for Pairs of S1MultiBurstProducts
+
+    This is useful when ordering S1 multi-burst interferograms from HyP3
+    """
+    reference: List[str]
+    secondary: List[str]
 class SBASNetwork(Stack):
     """
     SBASNetwork is a child class of Stack, used to create seasonal SBAS networks. It can be used
     to create multiannual networks connected with multiannual bridge pairs.
+
+    Construct using:
+    - SBASNetwork.from_geo_reference()
+    - SBASNetwork.from_search_results()
     """
     def __init__(
         self,
-        geo_reference: ASFProduct = None,
-        start_date: str = None,
-        end_date: str = None,
-        season: Tuple[int] = (1, 365),
-        perpendicular_baseline: Optional[int] = 400,
-        inseason_temporal_baseline: Optional[int] = 36,
-        bridge_year_threshold: Optional[int] = 1,
+        geo_reference: Union[ASFProduct, S1MultiBurstProduct],
+        *,
+        start_date: Optional[str] = None,
+        end_date: Optional[str] = None,
+        season: Tuple[int, int] = (1, 365),
+        perpendicular_baseline: int = 400,
+        inseason_temporal_baseline: int = 36,
+        bridge_year_threshold: int = 0,
         bridge_target_date: Optional[str] = None,
-        opts: Optional[ASFSearchOptions] = ASFSearchOptions(),
-        allow_missing_state_vectors: Optional[bool] = False
+        opts: Optional[ASFSearchOptions] = None,
+        allow_missing_state_vectors: bool = False
     ):
         """
         geo_reference: an ASFProduct used as a georeference scene for the network
@@ -55,65 +72,92 @@ class SBASNetwork(Stack):
         bridge_year_threshold: the number of year for which to allow multiannual bridging
         bridge_target_date: %m-%d string of the inseason bridge date to target. 
                             Reference scenes for bridge pairs are valid within an inseason_temporal_baseline of this date.
-        opts: ASFSearchOptions to limit the size of your SBASNetwork and define seasons
-              Recommended to include: "start", "end", "season"
+        opts:  Additional ASFSearchOptions used for the stack search. Explicit start_date and end_date arguments 
+               override corresponding values in opts. The opts season value is always overriden by the season argument.
         """
-        self.season = season
-        if bridge_target_date:
-            self.bridge_target_date = bridge_target_date
-        else:
-            self.bridge_target_date = self.season[0]
         self.start_date = start_date
         self.end_date = end_date
-        self.perpendicular_baseline = perpendicular_baseline
-        self.inseason_temporal_baseline = inseason_temporal_baseline
-        self.bridge_year_threshold = bridge_year_threshold
-        opts.merge_args(
-            start=self.start_date,
-            end=self.end_date,
-            season=self.season,
-        )
-        self.opts = opts
-        self.allow_missing_state_vectors = allow_missing_state_vectors
+        self._set_network_parameters(
+            season=season, 
+            perpendicular_baseline=perpendicular_baseline, 
+            inseason_temporal_baseline=inseason_temporal_baseline, 
+            bridge_year_threshold=bridge_year_threshold,
+            bridge_target_date=bridge_target_date,
+            allow_missing_state_vectors=allow_missing_state_vectors
+            )
 
-        self.temporal_baseline = (bridge_year_threshold * 365) + inseason_temporal_baseline
+        if opts is None:
+            opts = ASFSearchOptions()
+
+        merge_kwargs = {"season": self.season}
+
+        if self.start_date is not None:
+            merge_kwargs["start"] = self.start_date
+
+        if self.end_date is not None:
+            merge_kwargs["end"] = self.end_date
+
+        opts.merge_args(**merge_kwargs)
+        self.opts = opts
 
         super().__init__(
             geo_reference=geo_reference, 
             opts=self.opts,
             allow_missing_state_vectors = self.allow_missing_state_vectors
             )
-
         self._build_sbas_network()
+        self.geo_reference = self.subset_stack[0].ref # must reset here because ref object is replaced with a duplicate when building full stack
+
+    @classmethod
+    def from_geo_reference(
+        cls,
+        geo_reference: Union[ASFProduct, S1MultiBurstProduct],
+        **kwargs,
+    ):
+        """
+        Class constructor using a geo_reference ASFProduct or S1MultiBurstProduct
+        """
+        if not isinstance(geo_reference, (ASFProduct, S1MultiBurstProduct)):
+            raise TypeError(
+                f"Unsupported geo_reference type: {type(geo_reference).__name__}"
+            )
+
+        return cls(geo_reference=geo_reference, **kwargs)
 
     @classmethod
     def from_search_results(
         cls,
         stack_search_results: ASFSearchResults,
-        season: Tuple[int] = (1, 365),
-        perpendicular_baseline: Optional[int] = 400,
-        inseason_temporal_baseline: Optional[int] = 36,
-        bridge_year_threshold: Optional[int] = 1,
+        season: Tuple[int, int] = (1, 365),
+        perpendicular_baseline: int = 400,
+        inseason_temporal_baseline: int = 36,
+        bridge_year_threshold: int = 1,
         bridge_target_date: Optional[str] = None,
-        allow_missing_state_vectors: Optional[bool] = False
+        allow_missing_state_vectors: bool = False
     ):
         """
-        Alternate class method constructor using ASFSearchResults instead of a single geo_reference.
+        Class constructor using ASFSearchResults instead of a single geo_reference.
         """
-        obj = cls.__new__(cls)
+        if not stack_search_results:
+            raise ValueError("stack_search_results cannot be empty")
 
-        obj.season = season
-        if bridge_target_date:
-            obj.bridge_target_date = bridge_target_date
-        else:
-            obj.bridge_target_date = obj.season[0]
+        # Intentionally bypass __init__ and Stack.__init__:
+        # search results are already available, so no stack search
+        # or ASFSearchOptions are needed
+        obj = cls.__new__(cls)
         dates = [parse_datetime(product.properties["startTime"]).date() for product in stack_search_results]
         obj.start_date = str(min(dates))
         obj.end_date = str(max(dates))
-        obj.perpendicular_baseline = perpendicular_baseline
-        obj.inseason_temporal_baseline = inseason_temporal_baseline
-        obj.bridge_year_threshold = bridge_year_threshold
-        obj.allow_missing_state_vectors = allow_missing_state_vectors
+
+        obj._set_network_parameters(
+            season=season, 
+            perpendicular_baseline=perpendicular_baseline, 
+            inseason_temporal_baseline=inseason_temporal_baseline, 
+            bridge_year_threshold=bridge_year_threshold,
+            bridge_target_date=bridge_target_date,
+            allow_missing_state_vectors=allow_missing_state_vectors
+            )
+        
         obj.full_stack = obj._build_full_stack(stack_search_results)
         obj._remove_list = []
         obj.subset_stack = obj._get_subset_stack()
@@ -123,7 +167,52 @@ class SBASNetwork(Stack):
         obj._build_sbas_network()
 
         return obj
+    
+    def _set_network_parameters(
+        self,
+        season: Tuple[int, int],
+        perpendicular_baseline: int,
+        inseason_temporal_baseline: int,
+        bridge_year_threshold: int,
+        bridge_target_date: Optional[str],
+        allow_missing_state_vectors: bool,
+    ) -> None:
+        self.season = season
+        if bridge_target_date is not None:
+            self.bridge_target_date = bridge_target_date
+        elif self.start_date is not None:
+            year = parse_datetime(self.start_date).year
+            self.bridge_target_date = datetime.strptime(
+                f"{year}-{season[0]}",
+                "%Y-%j",
+            ).strftime("%m-%d")
+        else:
+            raise ValueError(
+                "start_date is required when bridge_target_date is not provided"
+    )
 
+        self.perpendicular_baseline = perpendicular_baseline
+        self.inseason_temporal_baseline = inseason_temporal_baseline
+        self.bridge_year_threshold = bridge_year_threshold
+        self.allow_missing_state_vectors = allow_missing_state_vectors
+        self.temporal_baseline = (
+            bridge_year_threshold * 365
+            + inseason_temporal_baseline
+        )
+    
+    def _full_stack_pair_is_valid(self, pair: Pair) -> bool:
+        perpendicular_baseline = pair.perpendicular_baseline
+
+        if perpendicular_baseline is None and not self.allow_missing_state_vectors:
+            return False
+
+        if perpendicular_baseline is not None and abs(perpendicular_baseline) > self.perpendicular_baseline:
+            return False
+
+        maximum_temporal_baseline = self.inseason_temporal_baseline + self.bridge_year_threshold * 365
+
+        return pair.temporal_baseline.days <= maximum_temporal_baseline
+       
     def _build_full_stack(self, stack_search_results: Optional[ASFSearchResults]=None) -> List[Pair]:
         """
         Create self._full_stack, which involves performing a stack search
@@ -131,35 +220,45 @@ class SBASNetwork(Stack):
 
         Overrides Stack._build_full_stack() to naively exclude pairs based on self.perpendicular_baseline,
         self.inseason_temporal_baseline, and self.bridge_year_threshold. This is done for efficiency, to
-        avoid build massive full_stacks. More targeted occures in self._build_sbas_network()
+        avoid build massive full_stacks. More targeted filtering occures in self._build_sbas_network()
 
         stack_search_results: (Optional) ASFSearchResults from an ASFProduct.stack search
 
         Returns: A list of pairs filtered by baselines, and including every possible bridge pair within 
-                 self.bridge_year_threshold
+                    self.bridge_year_threshold
         """
-        if stack_search_results is None: 
+        if stack_search_results is None:
             stack_search_results = self.geo_reference.stack(opts=self.opts)
 
-        if self.allow_missing_state_vectors:
-             full_stack = [
-                Pair(p1, p2)
-                for i, p1 in enumerate(stack_search_results)
-                for p2 in stack_search_results[i+1:]
-                if (Pair(p1, p2).perpendicular_baseline is None
-                or Pair(p1, p2).perpendicular_baseline <= self.perpendicular_baseline)
-                and Pair(p1, p2).temporal_baseline.days <= self.inseason_temporal_baseline + (self.bridge_year_threshold * 365)
-            ]
-        else:
-            full_stack = [
-                Pair(p1, p2)
-                for i, p1 in enumerate(stack_search_results)
-                for p2 in stack_search_results[i+1:]
-                if Pair(p1, p2).perpendicular_baseline is not None
-                and Pair(p1, p2).perpendicular_baseline <= self.perpendicular_baseline
-                and Pair(p1, p2).temporal_baseline.days <= self.inseason_temporal_baseline + (self.bridge_year_threshold * 365)
-            ]
-        return full_stack
+            if isinstance(self.geo_reference, S1MultiBurstProduct):
+                multiburst_dict = {}
+                for results in stack_search_results:
+                    for p1, p2 in combinations(results, 2):
+                        key = (parse_datetime(p1.properties["startTime"]).date(), parse_datetime(p2.properties["startTime"]).date())
+                        if self._full_stack_pair_is_valid(Pair(p1, p2)):
+                                multiburst_dict.setdefault(key, [[], []])
+                                multiburst_dict[key][0].append(p1)
+                                multiburst_dict[key][1].append(p2) 
+                
+                full_stack = []
+                for product_lists in multiburst_dict.values():
+                    # skip pairs that don't contain a product for every burst/subswath
+                    if len(product_lists[0]) == len(self.geo_reference):
+                        pair = Pair(
+                            S1MultiBurstProduct(geo_reference_bursts=product_lists[0]), 
+                            S1MultiBurstProduct(geo_reference_bursts=product_lists[1])
+                            )
+                        full_stack.append(pair)
+                return self._sort_pair_list(full_stack)
+    
+        full_stack = []
+        for p1, p2 in combinations(stack_search_results, 2):
+            pair = Pair(p1, p2)
+            if self._full_stack_pair_is_valid(pair):
+                full_stack.append(pair)
+
+        return self._sort_pair_list(full_stack)
+
 
     def _is_valid_bridge_pair(self, pair: Pair) -> bool:
         """
@@ -180,7 +279,6 @@ class SBASNetwork(Stack):
                 datetime.strptime(f"{self.bridge_target_date}-{pair.ref_time.year}", "%m-%d-%Y") 
                 - pair.ref_time.replace(tzinfo=None)).days
             )
-        
         half_inseason_temporal_baseline = self.inseason_temporal_baseline / 2
 
         # Create lists of valid secondary scene date ranges.
@@ -207,6 +305,35 @@ class SBASNetwork(Stack):
                 remove_list.append(pair)
         self.remove_list = remove_list
 
+    def get_scene_ids(
+            self,
+            pair_list: Optional[List[Pair]] = None
+            ) -> Union[List[Tuple[List[str], List[str]]], List[Tuple[str, str]]]:
+        """
+        Overrides Stack.get_scene_ids
+
+        Provides scene names for all asf_search.ASFProducts in a list of Pairs.
+        Useful when ordering pair-based products from ASF HyP3 On-Demand Processing.
+
+        If no pair_list is passed, defaults to the largest connected substack
+
+        pair_list: (Optional) A list of `Pair`s for which to retrieve scene IDs.
+        
+        Returns: If the SBASNetwork is comprised of S1MultiBurstProducts, returns a list of tuples of lists. 
+                 Each tuple contains a list of reference scene IDs and a list of secondary scene IDs for a 
+                 Pair of S1MultiBurstProducts. If not an S1MultiBurstProducts SBASNetwork, defaults 
+                 to using Stack.get_scene_ids
+        """
+        if pair_list is None:
+            pair_list = max(self.connected_substacks, key=len)
+
+        if pair_list and isinstance(pair_list[0].ref, S1MultiBurstProduct):
+            return [S1MultiBurstSceneIDPair([p.properties["sceneName"] for p in pair.ref.geo_reference_bursts],
+                     [p.properties["sceneName"] for p in pair.sec.geo_reference_bursts])
+                     for pair in pair_list]
+
+        return super().get_scene_ids(pair_list)
+
     def add_digraph_edge_traces(self, digraph, largest_network, pair_lists, node_positions):
         """
         Used for SBASNetwork plotting. Adds networkx traces to graph edges
@@ -397,7 +524,7 @@ class SBASNetwork(Stack):
             )
         return plot_header_text
 
-    def plot(self, pair_list: Optional[Union[List[Pair], None]] = None):
+    def plot(self, pair_list: Optional[List[Pair]] = None):
         """
         Plot the SBAS network(s). Accepts a pair_list or a list of pair_lists.
         The largest network is plotted in blue; others are plotted in distinct colors.
@@ -431,7 +558,7 @@ class SBASNetwork(Stack):
         edge_traces = self.add_digraph_edge_traces(G, largest_network, pair_lists, (node_x_positions, node_y_positions))
         node_traces, unused_slcs_traces = self.add_digraph_node_traces(G, plot_geo_ref, pair_lists, (node_x_positions, node_y_positions))
 
-        start_date, end_date = get_pair_lists_date_range(pair_lists)
+        start_date, end_date = get_pair_lists_date_range([self.full_stack])
         date_range = (
             pd.date_range(
                 start=start_date,
@@ -476,26 +603,6 @@ class SBASNetwork(Stack):
         )
         fig.show()
 
-    def get_pair_from_dates(self, pair_list: List[Pair],
-                                ref_date: datetime.date, sec_date: datetime.date) -> Pair:
-        """
-        This convenience method allows for the retrieval of a Pair object from a list
-        of Pairs by reference and secondary date. This is usefull when identifying a 
-        Pair object for removal or addition to an SBASNetwork.subset_stack
-
-        This method is included in SBASNetwork and not Stack because we only care about
-        dates in SBASNetwork and Stack is aware of datetimes.
-
-        pair_list: a list of Pairs from which to find a Pair object
-        ref_date: a datetime.date of a target Pair's reference scene
-        sec_date: a datetime.date of a target Pair's secondary scene
-
-        Returns: A Pair with a corresponding ref_date and sec_date
-        """
-        for pair in pair_list:
-            if pair.ref_time.date() == ref_date and pair.sec_time.date() == sec_date:
-                return pair
-
 def get_n_colors(n: int, colorscale: str="Rainbow", alpha: float=0.4) -> List[str]:
     """
     Used for SBASNetwork plotting. Creates an n-length list of rgba colors from a plotly colorscale
@@ -613,4 +720,4 @@ def julian_to_month_day(ref_product: ASFProduct, julian_tuple: Tuple[int, int])
     for day in julian_tuple:
         date = datetime(year, 1, 1) + timedelta(days=day - 1)
         month_day.append(date.strftime("%m-%d"))
-    return tuple(month_day)
\ No newline at end of file
+    return tuple(month_day)        


=====================================
asf_search/Stack.py
=====================================
@@ -1,14 +1,35 @@
 from collections import defaultdict, deque
 from copy import copy
-from typing import Optional, List, Tuple, Union
+from datetime import date, timedelta
+from typing import Optional, List, Tuple, Union, NamedTuple
 import warnings
 
+from .search import geo_search
 from .ASFProduct import ASFProduct
+from .S1MultiBurstProduct import S1MultiBurstProduct
 from .Pair import Pair
 from .ASFSearchOptions import ASFSearchOptions
 from .ASFSearchResults import ASFSearchResults
 from .warnings import PairNotInFullStackWarning
 
+try:
+    from ciso8601 import parse_datetime
+except ImportError:
+    from dateutil.parser import parse as parse_datetime
+
+DatePair = Tuple[str, str]
+PairInput = Union[Pair, DatePair]
+
+class SceneIDPair(NamedTuple):
+    """
+    Defines a named tuple of reference and secondary ASFProducts ID strings
+    for Pairs of ASFProducts
+
+    This is useful when ordering interferograms from HyP3
+    """
+    reference: str
+    secondary: str
+
 class Stack:
     """
     A Stack object contains 4+ lists of Pair objects. Each Pair contains a pair of asf_search.ASFProduct objects.
@@ -29,6 +50,24 @@ class Stack:
     - Stack.get_scene_ids(): A convenience method that returns a given list of Pairs as a list of tuples of asf_search.ASFProduct
       product IDs, which is useful when ordering on-demand processing via ASF's HyP3 or HyP3+ services.
     """
+
+
+    @property
+    def scene_ids(self) -> List[Tuple[str, str]]:
+        """
+        Provides scene names for all asf_search.ASFProducts in the largest connected substack
+        Useful when ordering pair-based products from ASF HyP3 On-Demand Processing.
+
+        Use the get_scene_ids method to get the IDs for other pair lists (full_stack, subset_stack, 
+        any network in connected_substacks, or remove_list)
+        
+        Returns:
+            A list tuples containing the reference and secondary scene names for each `Pair` in a `Pair` list
+        """
+        pair_list = max(self.connected_substacks, key=len)
+        return self.get_scene_ids(pair_list)
+    
+
     def __init__(
         self,
         geo_reference: ASFProduct,
@@ -92,18 +131,36 @@ class Stack:
         pairs: A list of Pairs to remove from self.subset_stack
         """
         # remove duplicates
-        self._remove_list = list(set(pairs))
+        self._remove_list = self._sort_pair_list(list(set(pairs)))
         self._update_stack()
 
-    def remove_pairs(self, pairs: Union[List[Pair], Pair]):
+    def remove_pairs(self, pairs: Union[List[Pair], Pair, Tuple[str], List[Tuple[str]]]):
         """
         Remove pairs from self.subset_stack, 
         i.e., add them to self._remove_list
 
+        Example calls:
+            my_stack.remove_pairs(my_pair)
+            my_stack.remove_pairs([my_pair_1, my_pair_2, ...])
+            my_stack.remove_pairs(("2024-10-20", "2024-11-02"))
+            my_stack.remove_pairs([("2024-10-20", "2024-11-02"), ("2024-10-26", "2024-11-02")])
+
         pairs: A Pair or list of Pairs to remove from self.subset_stack
+               or a Tuple of parsable date pair strings
         """
-        if isinstance(pairs, Pair):
+        if not isinstance(pairs, List):
             pairs = [pairs]
+        if isinstance(pairs[0], Pair):
+            if type(pairs[0].ref) is not type(self.full_stack[0].ref):
+                raise ValueError(
+                    (f"Can't remove Pairs of type {type(pairs[0].ref)} from a Stack"
+                     f"of Pairs of type {type(self.full_stack[0].ref)}"))
+        else:
+            pairs = [get_existing_pair_from_dates(
+                self.subset_stack,
+                parse_datetime(date_pair[0]).date(),
+                parse_datetime(date_pair[1]).date()) for
+                date_pair in pairs]
 
         for pair in pairs:
             if pair not in self._remove_list:
@@ -114,26 +171,136 @@ class Stack:
                     warnings.warn(PairNotInFullStackWarning(msg))
         self._update_stack()
 
-    def add_pairs(self, pairs: Union[List[Pair], Pair]):
+    def safe_pair_append(self, pair: Pair) -> None:
+        products_by_time = {
+            product_time: product
+            for existing_pair in self.full_stack
+            for product_time, product in (
+                (existing_pair.ref_time, existing_pair.ref),
+                (existing_pair.sec_time, existing_pair.sec),
+            )
+        }
+
+        ref = products_by_time.get(pair.ref_time, pair.ref)
+        sec = products_by_time.get(pair.sec_time, pair.sec)
+
+        self.full_stack.append(Pair(ref, sec))
+
+    def _validate_pair_type(self, pair: Pair) -> None:
+        expected_type = type(self.full_stack[0].ref)
+        actual_type = type(pair.ref)
+
+        if actual_type is not expected_type:
+            raise ValueError(
+                f"Can't add Pairs of type {actual_type} to a Stack "
+                f"of Pairs of type {expected_type}"
+            )
+        
+    def _pair_from_dates(self, date_pair: DatePair) -> Pair:
+        ref_date_string, sec_date_string = date_pair
+
+        ref_date = parse_datetime(ref_date_string).date()
+        sec_date = parse_datetime(sec_date_string).date()
+
+        try:
+            return get_existing_pair_from_dates(
+                self.remove_list,
+                ref_date,
+                sec_date,
+            )
+        except ValueError:
+            pass
+
+        stack_product = self.full_stack[0].ref
+
+        if isinstance(stack_product, S1MultiBurstProduct):
+            group = stack_product.multiburst_group
+
+            return Pair(
+                S1MultiBurstProduct(group, ref_date_string),
+                S1MultiBurstProduct(group, sec_date_string),
+            )
+
+        return Pair(
+            self._search_product_by_date(ref_date_string),
+            self._search_product_by_date(sec_date_string),
+        )
+    
+    def _search_product_by_date(self, date_string: str):
+        stack_product = self.full_stack[0].ref
+
+        end_date = str(
+            (parse_datetime(date_string) + timedelta(days=12)).date()
+        )
+
+        if stack_product.properties["processingLevel"] == "BURST":
+            results = geo_search(
+                fullBurstID=stack_product.properties["fullBurstID"],
+                start=date_string,
+                end=end_date,
+                processingLevel="BURST",
+            )
+        else:
+            results = geo_search(
+                asfFrame=stack_product.properties["frameNumber"],
+                relativeOrbit=stack_product.properties["pathNumber"],
+                start=date_string,
+                end=end_date,
+                processingLevel="SLC",
+            )
+
+        try:
+            return min(
+                results,
+                key=lambda product: product.properties["startTime"],
+            )
+        except ValueError:
+            raise ValueError(
+                f"No matching product found for {date_string}"
+            ) from None
+
+    def add_pairs(
+        self,
+        pairs: Union[PairInput, List[PairInput]],
+    ) -> None:
         """
-        Add pairs to self.subset_stack and, if necessary, to self.full_stack 
-        i.e., remove them from self._remove_list if present or else add them to self.full_stack 
+        Add pairs to subset_stack and, when necessary, to full_stack.
 
-        This allows for the addition of custom pairs that were not originally present
-        in self.full_stack
-
-        pairs: A Pair or list of Pairs to add to self.subset_stack
+        Date pairs are resolved from remove_list when possible. Otherwise,
+        the corresponding products are constructed or searched for.
         """
-        if isinstance(pairs, Pair):
+        if not isinstance(pairs, list):
             pairs = [pairs]
 
-        for pair in pairs:
+        if not pairs:
+            return
+        
+        contains_pairs = any(isinstance(item, Pair) for item in pairs)
+        if contains_pairs and not all(isinstance(item, Pair) for item in pairs):
+            raise TypeError("pairs must not mix Pair objects and date tuples")
+
+        resolved_pairs = []
+
+        for item in pairs:
+            if isinstance(item, Pair):
+                self._validate_pair_type(item)
+                resolved_pairs.append(item)
+            else:
+                resolved_pairs.append(self._pair_from_dates(item))
+
+        for pair in resolved_pairs:
             if pair in self._remove_list:
                 self._remove_list.remove(pair)
             else:
-                self.full_stack.append(pair)
+                self.safe_pair_append(pair)
+
         self._update_stack()
 
+    def _sort_pair_list(self, pair_list: List[Pair]) -> List[Pair]:
+        return sorted(
+            pair_list,
+            key=lambda item: item.id)
+
     def _build_full_stack(self, stack_search_results: Optional[ASFSearchResults]=None) -> List[Pair]:
         """
         Create self._full_stack, which involves performing a stack search
@@ -163,7 +330,9 @@ class Stack:
         Recalculate self.subset_stack and find its connected substacks.
         These two things should always happen together.
         """
-        self.subset_stack = self._get_subset_stack()
+        self.full_stack = self._sort_pair_list(self.full_stack)
+        self._remove_list = self._sort_pair_list(self._remove_list)
+        self.subset_stack = self._sort_pair_list(self._get_subset_stack())
         self.connected_substacks = self._find_connected_substacks()
 
     def _find_connected_substacks(self) -> List[List[Pair]]:
@@ -207,9 +376,10 @@ class Stack:
                             queue.append(neighbor)
                 component_pairs = [v for v in component_pairs.values()]
                 components.append(component_pairs)
-
+        components = [self._sort_pair_list(component) for component in components]
         return components
 
+
     def get_scene_ids(self, pair_list: Optional[List[Pair]] = None) -> List[Tuple[str, str]]:
         """
         Provides scene names for all asf_search.ASFProducts in a list of Pairs.
@@ -222,11 +392,29 @@ class Stack:
         Returns:
             A list tuples containing the reference and secondary scene names for each `Pair` in a `Pair` list
         """
-        if not pair_list:
+        if pair_list is None:
             pair_list = max(self.connected_substacks, key=len)
 
         return [
-            (pair.ref.properties["sceneName"], pair.sec.properties["sceneName"])
+            SceneIDPair(pair.ref.properties["sceneName"], pair.sec.properties["sceneName"])
             for pair in pair_list
             ]
-    
\ No newline at end of file
+    
+def get_existing_pair_from_dates(pair_list: List[Pair],
+                            ref_date: date, sec_date: date) -> Pair:
+    """
+    This convenience method allows for the retrieval of a Pair object from a list
+    of Pairs by reference and secondary date. This is usefull when identifying a 
+    Pair object for removal or addition to an SBASNetwork.subset_stack
+
+    pair_list: a list of Pairs from which to find a Pair object
+    ref_date: a datetime.date of a target Pair's reference scene
+    sec_date: a datetime.date of a target Pair's secondary scene
+
+    Returns: A Pair with a corresponding ref_date and sec_date
+    """
+    for pair in pair_list:
+        if pair.ref_time.date() == ref_date and pair.sec_time.date() == sec_date:
+            return pair
+    raise ValueError(f"No Pairs found corresponding to reference date: {ref_date}, secondary date: {sec_date}")
+            
\ No newline at end of file


=====================================
asf_search/__init__.py
=====================================
@@ -54,9 +54,10 @@ from .CMR import *  # noqa: F403 F401 E402
 from .baseline import *  # noqa: F403 F401 E402
 from .WKT import validate_wkt  # noqa: F401 E402
 from .export import *  # noqa: F403 F401 E402
-from .Pair import Pair  # noqa:  F401, E402
-from .Stack import Stack  # noqa:  F401, E402
-from .SBASNetwork import SBASNetwork # noqa:  F401, E402
+from .Pair import Pair  # noqa:  F401 E402
+from .Stack import *  # noqa:  F403 F401 E402
+from .SBASNetwork import * # noqa: F403 F401 E402
+from .S1MultiBurstProduct import * # noqa: F403 F401 E402
 from . import utils # noqa: F401, E402
 
 REPORT_ERRORS = True


=====================================
asf_search/constants/MATURITIES.py
=====================================
@@ -0,0 +1,3 @@
+BETA='BETA'
+PROVISIONAL='PROVISIONAL'
+VALIDATED='VALIDATED'


=====================================
asf_search/constants/__init__.py
=====================================
@@ -11,3 +11,4 @@ from .INTERNAL import *  # noqa: F403 F401
 from .DATASET import *  # noqa: F403 F401
 from .RANGE_BANDWIDTH import *  # noqa: F403 F401
 from .PRODUCTION_CONFIGURATION import * # noqa: F403 F401
+from .MATURITIES import * # noqa: F403 F401


=====================================
asf_search/search/geo_search.py
=====================================
@@ -17,6 +17,7 @@ def geo_search(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,
@@ -86,6 +87,8 @@ def geo_search(
     campaign:
         For UAVSAR and AIRSAR data collections only. Search by general location,
         site description, or data grouping as supplied by flight agency or project.
+    dataMaturity:
+        For NISAR data collections only. Determined by when products were processed
     maxDoppler:
         Doppler provides an indication of how much the look direction deviates
         from the ideal perpendicular flight direction acquisition.


=====================================
asf_search/search/search.py
=====================================
@@ -19,6 +19,7 @@ def search(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,
@@ -93,6 +94,8 @@ def search(
     campaign:
         For UAVSAR and AIRSAR data collections only. Search by general location,
         site description, or data grouping as supplied by flight agency or project.
+    dataMaturity:
+        For NISAR data collections only. Determined by when products were processed
     maxDoppler:
         Doppler provides an indication of how much the look direction deviates
         from the ideal perpendicular flight direction acquisition.


=====================================
asf_search/search/search_count.py
=====================================
@@ -18,6 +18,7 @@ def search_count(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,


=====================================
asf_search/search/search_generator.py
=====================================
@@ -44,6 +44,7 @@ def search_generator(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,
@@ -117,6 +118,8 @@ def search_generator(
     campaign:
         For UAVSAR and AIRSAR data collections only. Search by general location,
         site description, or data grouping as supplied by flight agency or project.
+    dataMaturity:
+        For NISAR data collections only. Determined by when products were processed
     maxDoppler:
         Doppler provides an indication of how much the look direction deviates
         from the ideal perpendicular flight direction acquisition.


=====================================
conftest.py
=====================================
@@ -2,6 +2,7 @@ import argparse
 import pytest
 import os
 from asf_search.ASFSession import ASFSession
+from asf_search import S1MultiBurst, S1MultiBurstGroup, S1MultiBurstProduct
 from getpass import getpass
 
 def string_to_session(user_input: str) -> ASFSession:
@@ -61,3 +62,18 @@ def pytest_addoption(parser: pytest.Parser):
 
     parser.addoption("--auth_with_token", action="store", dest="authenticated_session", type=set_should_auth_session_with_token, default='FALSE',
                      help = "'auth_with_creds': Use EDL token to authenticate session for relevant tests")
+
+ at pytest.fixture(scope="module")
+def three_by_three_multiburst_group():
+    return S1MultiBurstGroup(
+    bursts=[
+    S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+    S1MultiBurst("173_370306", ("IW1", "IW2", "IW3")),
+    S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+    ]
+)
+
+ at pytest.fixture(scope="module")
+def three_by_three_multiburst_product(three_by_three_multiburst_group):
+    start_date = '2023-01-01'
+    return S1MultiBurstProduct(three_by_three_multiburst_group, start_date)


=====================================
debian/changelog
=====================================
@@ -1,3 +1,9 @@
+asf-search (12.3.0-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Sat, 08 Aug 2026 16:04:26 +0000
+
 asf-search (12.2.3-1) unstable; urgency=medium
 
   * New upstream release.


=====================================
examples/SBASNetwork.ipynb
=====================================
@@ -81,7 +81,7 @@
     "    start_date = '2023-01-01',\n",
     "    end_date = '2025-10-02',\n",
     "    season = get_julian_season(season),\n",
-    "    perpendicular_baseline=100, \n",
+    "    perpendicular_baseline=150, \n",
     "    inseason_temporal_baseline=24,\n",
     "    bridge_target_date='3-1',\n",
     "    bridge_year_threshold=2,\n",
@@ -131,6 +131,16 @@
     "print(len(sbas_from_search_results.full_stack))"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a674e164",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sbas_from_search_results.plot()"
+   ]
+  },
   {
    "cell_type": "markdown",
    "id": "1d03afce",
@@ -246,192 +256,151 @@
   },
   {
    "cell_type": "markdown",
-   "id": "c3aa3107",
+   "id": "d4bddacd",
    "metadata": {},
    "source": [
-    "### Add an automatically filtered Pair back to the `SBASNetwork` to manually connect one of the disconnected sub-networks\n",
+    "### Plot a different network\n",
     "\n",
-    "Use the `SBASNetwork.get_pair_from_dates()` method to identify a Pair to return to the network\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "98a38281",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "removed_pair_to_return_to_network = sbas.get_pair_from_dates(sbas.remove_list, date(2023,1,17), date(2024,6,16))\n",
-    "print(removed_pair_to_return_to_network)\n",
-    "print(f\"Pair Dates: {removed_pair_to_return_to_network.ref_time.date()} - {removed_pair_to_return_to_network.sec_time.date()}\")\n",
+    "By default `SBASNetwork.plot()` plots all connected sub-networks (`sbas.connected_substacks`)\n",
     "\n",
-    "sbas.add_pairs(removed_pair_to_return_to_network)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "fbd56642",
-   "metadata": {},
-   "source": [
-    "### Re-plot the the `SBASNetwork`\n",
+    "However, `SBASNetwork` contains multiple networks that you can plot:\n",
+    "- `SBASNetwork.full_stack`: an SBAS network filtered by baselines, and including every possible bridge pair within SBASNetwork.bridge_year_threshold\n",
+    "- `SBASNetwork.subset_stack`: a possibly disconnected SBAS network filtered by temporal baseline, perpendicular baseline, and bridge pair filtering applied\n",
+    "- `SBASNetwork.connected_substacks`: SBASNetwork.subset_stack, broken up into a list of connected sub-networks\n",
     "\n",
-    "Note that the selected Pair has beeed back to the network, connecting a previously disconnected sub-network."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "da83378a",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "sbas.plot()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "4a3754dc",
-   "metadata": {},
-   "source": [
-    "### Remove pairs from the network"
+    "The code cell below plots `sbas.full_stack`\n"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "06bc7afc",
+   "id": "94c08504",
    "metadata": {},
    "outputs": [],
    "source": [
-    "pair1_to_remove = sbas.get_pair_from_dates(sbas.subset_stack, date(2025,1,6), date(2025,1,18))\n",
-    "pair2_to_remove = sbas.get_pair_from_dates(sbas.subset_stack, date(2025,1,6), date(2025,1,30))\n",
-    "print(f\"{pair1_to_remove}, {pair2_to_remove}\")\n",
-    "print(f\"Pair 1 Dates: {pair1_to_remove.ref_time.date()} - {pair1_to_remove.sec_time.date()}\")\n",
-    "print(f\"Pair 2 Dates: {pair2_to_remove.ref_time.date()} - {pair2_to_remove.sec_time.date()}\")\n",
-    "\n",
-    "sbas.remove_pairs([pair1_to_remove, pair2_to_remove])"
+    "sbas.plot(sbas.full_stack)"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "4344ee36",
+   "id": "0367d3ea",
    "metadata": {},
    "source": [
-    "### Re-plot the network after removing 2 Pairs\n",
+    "### Plot the SBASNetwork that contains missing state vectors, resulting in perpendicular baselines with values of None\n",
     "\n",
-    "Note that after removing both Pairs, the date 2025-01-06 is no longer included in the network at all and its vertex on the plot is red."
+    "To view the perpendicular baselines of None on the plot, hover over the edges representing the following date pairs:\n",
+    "- 2023/01/05 - 2023/01/29\n",
+    "- 2023/01/17 - 2023/01/29\n",
+    "- 2023/01/29 - 2023/02/10\n",
+    "- 2023/01/29 - 2023/02/22"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "caed94de",
+   "id": "ebf20960",
    "metadata": {},
    "outputs": [],
    "source": [
-    "sbas.plot()"
+    "missing_state_vectors_allowed_sbas.plot()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "7a8b4c11",
-   "metadata": {},
-   "source": [
-    "### You can also add Pairs that were not included in the initial search and are not included in `SBASNetwork.remove_list` at all"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "10ee6452",
+   "id": "c3aa3107",
    "metadata": {},
-   "outputs": [],
    "source": [
-    "existing_pair = sbas.get_pair_from_dates(sbas.subset_stack, date(2025,3,7), date(2025,3,19))\n",
-    "existing_ref_scene = existing_pair.ref\n",
+    "<hr>\n",
     "\n",
-    "results = asf.product_search('S1A_IW_SLC__1SDV_20260401T105744_20260401T105802_063885_0808EC_7B1B-SLC')\n",
-    "new_sec_scene = results[0]\n",
+    "## Add and remove Pairs from an SBASNetwork \n",
     "\n",
-    "new_pair = asf.Pair(existing_ref_scene, new_sec_scene)\n",
-    "print(new_pair)\n",
-    "print(f\"Pair Dates: {new_pair.ref_time.date()} - {new_pair.sec_time.date()}\")\n",
+    "### Add Pair to the `SBASNetwork` to manually connect one of the disconnected sub-networks\n",
     "\n",
-    "sbas.add_pairs(new_pair)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "13591778",
-   "metadata": {},
-   "source": [
-    "### Re-plot the network after adding a Pair that was not in the scope of the original `SBASNetwork`'s time bounds\n",
+    "You can add or remove pairs by passing:\n",
+    "- A Tuple of date pair strings: (\"2023-01-05\", \"2023-01-29\")\n",
+    "- A List of tuples of date pair strings: [(\"2023-01-05\", \"2023-01-29\"), (\"2023-01-05\", \"2024-01-12\")]\n",
+    "- A Pair object\n",
+    "- A List of Pair objects\n",
     "\n",
-    "Note that there is now a pair with a secondary scene date in 2026. While this new pair has been manually added to the network, its perpendiccular baseline was not determined during the initial search and is therefore set to `None`. "
+    "Note that the following code cell adds a Pair to the network, connecting a previously disconnected sub-network in 2023."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "205bd3c8",
+   "id": "0a45ffd8",
    "metadata": {},
    "outputs": [],
    "source": [
+    "sbas.add_pairs((\"2023-01-05\", \"2023-01-29\"))\n",
+    "\n",
     "sbas.plot()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "d4bddacd",
+   "id": "eec0a391",
    "metadata": {},
    "source": [
-    "### Plot a different network\n",
+    "### Add Pairs by passing the Pair objects themselves (instead of date pair strings)\n",
     "\n",
-    "By default `SBASNetwork.plot()` plots all connected sub-networks (`sbas.connected_substacks`)\n",
+    "Note that we are able to add a Pair that extends beyond the original temporal range of the SBASNetwork. \n",
     "\n",
-    "However, `SBASNetwork` contains multiple networks that you can plot:\n",
-    "- `SBASNetwork.full_stack`: an SBAS network filtered by baselines, and including every possible bridge pair within SBASNetwork.bridge_year_threshold\n",
-    "- `SBASNetwork.subset_stack`: a possibly disconnected SBAS network filtered by baselines, with additional bridge pair filtering applied\n",
-    "- `SBASNetwork.connected_substacks`: SBASNetwork.subset_stack, broken up into a list of connected sub-networks\n",
-    "\n",
-    "The code cell below plots `sbas.full_stack`\n"
+    "Arbitrarily added pairs are not required to adhere to the baselines or temporal range of the SBASNetwork. "
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "94c08504",
+   "id": "e6226426",
    "metadata": {},
    "outputs": [],
    "source": [
-    "sbas.plot(sbas.full_stack)"
+    "results = asf.product_search('S1A_IW_SLC__1SDV_20230529T225128_20230529T225155_048755_05DD08_82C5-SLC')\n",
+    "ref = results[0]\n",
+    "stack = ref.stack()\n",
+    "sec_1 = stack[-1]\n",
+    "sec_2 = stack[-2]\n",
+    "\n",
+    "pair_1 = asf.Pair(ref, sec_1)\n",
+    "pair_2 = asf.Pair(ref, sec_2)\n",
+    "\n",
+    "\n",
+    "sbas.add_pairs([\n",
+    "    pair_1,\n",
+    "    pair_2\n",
+    "])\n",
+    "\n",
+    "sbas.plot()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "0367d3ea",
+   "id": "4a3754dc",
    "metadata": {},
    "source": [
-    "### Plot the SBASNetwork that contains missing state vectors, resulting in perpendicular baselines with values of None\n",
+    "### Remove pairs from the network\n",
     "\n",
-    "Note that perpendicular baselines with None values are plotted with values of 0.0 m.\n",
+    "#### Remove Pairs with list of date pair strings\n",
     "\n",
-    "To view the perpendicular baselines of None on the plot, hover over the edges representing the following date pairs:\n",
-    "- 2023/01/05 - 2023/01/29\n",
-    "- 2023/01/17 - 2023/01/29\n",
-    "- 2023/01/29 - 2023/02/10\n",
-    "- 2023/01/29 - 2023/02/22"
+    "Like the `add_pairs` method, you can pass date pair strings or Pair objects to `remove_pairs`"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ebf20960",
+   "id": "6a126430",
    "metadata": {},
    "outputs": [],
    "source": [
-    "missing_state_vectors_allowed_sbas.plot()"
+    "sbas.remove_pairs([\n",
+    "    (\"2024-05-11\", \"2024-05-23\"),\n",
+    "    (\"2024-05-23\", \"2024-06-04\"),\n",
+    "    (\"2024-05-23\", \"2024-06-16\"),\n",
+    "    (\"2024-06-04\", \"2024-06-16\"),\n",
+    "])\n",
+    "\n",
+    "sbas.plot()"
    ]
   },
   {
@@ -441,13 +410,11 @@
    "source": [
     "<hr>\n",
     "\n",
-    "## View the SLC IDs of an `SBASNetwork`'s `Pairs`\n",
-    "\n",
-    "### View `SBASNetwork.subset_stack`'s scene ID's \n",
+    "## Prepare a list of the SBASNetwork's SLC IDs to order on-demand processing from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/) or [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/)\n",
     "\n",
     "When ordering data from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/) or [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/) On-Demand Processing, it is helpful to provide an `SBASNetwork` as a list of scene IDs.\n",
     "\n",
-    "The `SBASNetwork.get_scene_ids()` method (inherited from the `Stack` class) offers this functionality."
+    "### Use the `scene_ids` property to view the scene ID's of the largest connected network in `connected_substacks`\n"
    ]
   },
   {
@@ -457,7 +424,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "largest_fully_connected_subset_stack_ids = sbas.get_scene_ids()\n",
+    "largest_fully_connected_subset_stack_ids = sbas.scene_ids\n",
     "largest_fully_connected_subset_stack_ids"
    ]
   },
@@ -466,7 +433,13 @@
    "id": "25f0d098",
    "metadata": {},
    "source": [
-    "### You can view the scene IDs of any stack_list contained in a `SBASNetwork` object, including the complete `SBASNetwork.full_stack`, `SBASNetwork.remove_list`, the possibly disconnected `SBASNetwork.subset_stack`, or any of the stack_lists in `SBASNetwork.connected_substacks`"
+    "### Use the `get_scene_ids` method to view the scene IDs of any stack_list contained in an `SBASNetwork` object\n",
+    "\n",
+    "Options include:\n",
+    "- `SBASNetwork.full_stack`\n",
+    "- `SBASNetwork.remove_list`\n",
+    "- The possibly disconnected `SBASNetwork.subset_stack`\n",
+    "- Any of the stack_lists in `SBASNetwork.connected_substacks`"
    ]
   },
   {
@@ -483,15 +456,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3d0e4696",
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "677e5bbf",
+   "id": "119e5a76",
    "metadata": {},
    "outputs": [],
    "source": []


=====================================
examples/SBASNetwork_S1-Multiburst.ipynb
=====================================
@@ -0,0 +1,295 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "eb53c259",
+   "metadata": {
+    "vscode": {
+     "languageId": "plaintext"
+    }
+   },
+   "source": [
+    "## Create SBASNetworks from groups of Sentinel-1 burst data\n",
+    "\n",
+    "This notebook demonstrates how to create SBASNetworks of interferometric pairs from groups of adjacent Sentinel-1 burst data. Refer to the [SBASNetwork Tutorial](SBASNetwork.ipynb) for examples of creating SBASNetworks of networks of full Sentinel-1 scenes or individual Sentinel-1 bursts."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "aeb8be28",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# This is useful if you are working with a dev install of asf_search and experimenting with changes to the codebase\n",
+    "%load_ext autoreload\n",
+    "%autoreload 2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3ccc6d0a",
+   "metadata": {},
+   "source": [
+    "### Create an asf_search.S1MultiBurstGroup object defining a group of Sentinel-1 bursts and subswaths\n",
+    "\n",
+    "Refer to [HyP3's mutli-burst guidelines](https://hyp3-docs.asf.alaska.edu/guides/burst_insar_product_guide/#considerations-for-selecting-input-bursts) when assembling a collection of bursts.\n",
+    "\n",
+    "S1MultiBurstGroup validation is performed during initialitzation to prevent the creation of invalid multiburst SBASNetworks that result in failed HyP3 on-demand processing jobs."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a4333bc6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import asf_search as asf\n",
+    "\n",
+    "multiburst_group = asf.S1MultiBurstGroup(\n",
+    "    bursts=[\n",
+    "    asf.S1MultiBurst(\"173_370305\", (\"IW1\", \"IW2\", \"IW3\")),\n",
+    "    asf.S1MultiBurst(\"173_370306\", (\"IW1\", \"IW2\", \"IW3\")),\n",
+    "    asf.S1MultiBurst(\"173_370307\", (\"IW1\", \"IW2\", \"IW3\"))\n",
+    "    ]\n",
+    ")\n",
+    "multiburst_group"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "aac455e5",
+   "metadata": {},
+   "source": [
+    "### Create a geoographic reference S1MultiBurstProduct object\n",
+    "\n",
+    "An `S1MultiBurstProduct` contains a collection of Sentinel-1 burst products."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f35864ff",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "start_date = '2023-01-01'\n",
+    "\n",
+    "reference_multiburst = asf.S1MultiBurstProduct(multiburst_group, start_date)\n",
+    "reference_multiburst"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "833d605b",
+   "metadata": {},
+   "source": [
+    "### Create an SBASNetwork from the S1MultiBurstProduct object"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "af8ee46c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from datetime import datetime, date\n",
+    "import pandas as pd\n",
+    "\n",
+    "def get_julian_season(season) -> tuple[int,int]:\n",
+    "    season_start_ts = pd.Timestamp(\n",
+    "        datetime.strptime(f\"{season[0]}-0001\", \"%m-%d-%Y\"), tz=\"UTC\"\n",
+    "        )\n",
+    "    season_start_day = season_start_ts.timetuple().tm_yday\n",
+    "    season_end_ts = pd.Timestamp(\n",
+    "        datetime.strptime(f\"{season[1]}-0001\", \"%m-%d-%Y\"), tz=\"UTC\"\n",
+    "    )\n",
+    "    season_end_day = season_end_ts.timetuple().tm_yday\n",
+    "    return (season_start_day, season_end_day)\n",
+    "\n",
+    "season = (\"1-1\", \"6-25\")\n",
+    "\n",
+    "multiburst_sbas = asf.SBASNetwork.from_geo_reference(\n",
+    "    geo_reference = reference_multiburst,\n",
+    "    start_date = '2023-01-01',\n",
+    "    end_date = '2025-10-02',\n",
+    "    season = get_julian_season(season),\n",
+    "    perpendicular_baseline=150, \n",
+    "    inseason_temporal_baseline=36,\n",
+    "    bridge_target_date='3-1',\n",
+    "    bridge_year_threshold=1,\n",
+    "    allow_missing_state_vectors=True)\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8c8d61e1",
+   "metadata": {},
+   "source": [
+    "## Add and remove Pairs from an SBASNetwork \n",
+    "\n",
+    "### Add Pairs to the `SBASNetwork` to manually connect an unused S1MultiBurst\n",
+    "\n",
+    "You can add or remove pairs by passing:\n",
+    "- A Tuple of date pair strings: (\"2024-02-03\", \"2024-04-15\")\n",
+    "- A List of tuples of date pair strings: [(\"2024-02-03\", \"2024-04-15\"), (\"2024-02-03\", \"2024-04-15\")]\n",
+    "- A Pair object\n",
+    "- A List of Pair objects"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "488db17a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "multiburst_sbas.add_pairs([\n",
+    "    (\"2024-03-22\", \"2024-04-15\"),\n",
+    "    (\"2024-04-03\", \"2024-04-15\")\n",
+    "    ])\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b5b29930",
+   "metadata": {},
+   "source": [
+    "### Add a Pair by passing a Pair object"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3749d06d",
+   "metadata": {},
+   "source": [
+    "### "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3666f00a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "pair = multiburst_sbas.remove_list[60]\n",
+    "print(f\"{pair.ref_time.date()}, {pair.sec_time.date()}\")\n",
+    "\n",
+    "multiburst_sbas.add_pairs(pair)\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "58de13ef",
+   "metadata": {},
+   "source": [
+    "### Remove Pairs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "361ecbfd",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "multiburst_sbas.remove_pairs([\n",
+    "    (\"2024-04-27\", \"2024-05-21\"),\n",
+    "    (\"2024-05-21\", \"2024-06-14\"),\n",
+    "    (\"2024-06-02\", \"2024-06-14\"),\n",
+    "    (\"2024-05-09\", \"2024-06-14\"),\n",
+    "    (\"2024-05-09\", \"2024-06-02\"),\n",
+    "    (\"2024-04-27\", \"2024-06-02\"),\n",
+    "    (\"2024-04-27\", \"2024-05-09\")\n",
+    "])\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d4d21b40",
+   "metadata": {},
+   "source": [
+    "<hr>\n",
+    "\n",
+    "## Use the `scene_ids` property to access multi-burst product IDs for easy InSAR product ordering from HyP3 \n",
+    "\n",
+    "The `scene_ids` property provides scene IDs for the largest network in the `connected_substacks` list for each SBASNetwork in `sbas_networks`\n",
+    "\n",
+    "An SBAS Network generated from a `S1MultiBurstProduct` geo-reference can be used to order Sentinel-1 multi-burst InSAR processing from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/guides/burst_insar_product_guide/) and [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8cc9451a",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [],
+   "source": [
+    "sbas_burst_ids = multiburst_sbas.scene_ids\n",
+    "sbas_burst_ids"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9f32cacb",
+   "metadata": {},
+   "source": [
+    "<hr>\n",
+    "\n",
+    "## Use the `get_scene_ids` method to access multi-burst product IDs from any of the SBASNetwork pair lists in `sbas_networks`\n",
+    "\n",
+    "Options include:\n",
+    "- `SBASNetwork.full_stack`\n",
+    "- `SBASNetwork.remove_list`\n",
+    "- The possibly disconnected `SBASNetwork.subset_stack`\n",
+    "- Any of the stack_lists in `SBASNetwork.connected_substacks`\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c26c928a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "full_stack_burst_ids = multiburst_sbas.get_scene_ids(multiburst_sbas.full_stack)\n",
+    "full_stack_burst_ids"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.12.0"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}


=====================================
examples/Stack.ipynb
=====================================
@@ -358,71 +358,56 @@
     "\n",
     "When ordering data from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/) or [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/) On-Demand Processing, it is helpful to provide a `Stack` as a list of scene IDs.\n",
     "\n",
-    "The `Stack.get_scene_ids()` method offers this functionality."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "e04d7bf8",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "possibly_disconnected_subset_stack_ids = stack.get_scene_ids(stack.subset_stack)\n",
-    "possibly_disconnected_subset_stack_ids"
+    "The `Stack.scene_ids` property and `Stack.get_scene_ids()` method offer this functionality."
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "87798431",
-   "metadata": {},
-   "source": [
-    "### View the largest connected substack in `stack.connected_substacks`\n",
-    "\n",
-    "`stack.get_scene_ids()` takes the optional argument `stack_list`. \n",
-    "\n",
-    "If you do not provide a stack_list, the method defaults to using the largest connected substack in `stack.connected_substacks`."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "14711e1f",
+   "id": "183233d2",
    "metadata": {},
-   "outputs": [],
    "source": [
-    "largest_fully_connected_subset_stack_ids = stack.get_scene_ids()\n",
-    "largest_fully_connected_subset_stack_ids\n"
+    "### Use the `scene_ids` property to view the scene IDs of the largest connected network in `stack.connected_substacks`"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c2d4c0c7",
+   "id": "7fbc5b28",
    "metadata": {},
    "outputs": [],
    "source": [
-    "len(largest_fully_connected_subset_stack_ids)"
+    "largest_connected_substack_scene_ids = stack.scene_ids\n",
+    "largest_connected_substack_scene_ids"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "183233d2",
+   "id": "ce5a0754",
    "metadata": {},
    "source": [
-    "### You can view the scene IDs of any stack_list contained in a `Stack` object, including the complete `stack.full_stack`, `stack.remove_list`, the possibly disconnected `stack.subset_stack`, or any of the stack_lists in `stack.connected_substacks`"
+    "### Use the `get_scene_ids` method view the scene IDs of any stack_list contained in a `Stack` object\n",
+    "\n",
+    "Options include the complete `stack.full_stack`, `stack.remove_list`, the possibly disconnected `stack.subset_stack`, or any of the stack_lists in `stack.connected_substacks`"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7fbc5b28",
+   "id": "10e04773",
    "metadata": {},
    "outputs": [],
    "source": [
     "remove_list_scene_ids = stack.get_scene_ids(stack.remove_list)\n",
     "remove_list_scene_ids"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b500b090",
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {


=====================================
pyproject.toml
=====================================
@@ -12,6 +12,7 @@ build-backend = "setuptools.build_meta"
 [tool.setuptools_scm]
 
 [tool.ruff]
+required-version = "==0.15.22"
 line-length = 100
 fix = true
 


=====================================
setup.py
=====================================
@@ -72,7 +72,7 @@ setup(
                     'extras': extra_requirements, 
                     'asf-enumeration': asf_enumeration, 
                     'coherence': coherence,
-                    'sbasnetwork_plot': sbasnetwork_plot
+                    'sbasnetwork_plot': sbasnetwork_plot,
                     },
     license='BSD',
     license_files=('LICENSE',),


=====================================
tests/S1MultiBurstProduct/test_S1MultiBurstProduct.py
=====================================
@@ -0,0 +1,99 @@
+import pytest
+import re
+
+from asf_search import S1MultiBurst, S1MultiBurstGroup, S1MultiBurstProduct, SBASNetwork
+
+def test_three_by_three_group(three_by_three_multiburst_group):       
+        assert len(three_by_three_multiburst_group.bursts) == 3
+
+def test_horizontal_line_group():
+        multiburst_group = S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                ])
+        
+        assert len(multiburst_group.bursts) == 1
+
+
+def test_vertical_line_group():
+        multiburst_group = S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1",)),
+                S1MultiBurst("173_370306", ("IW1",)),
+                S1MultiBurst("173_370307", ("IW1",))
+                ])
+        
+        assert len(multiburst_group.bursts) == 3
+
+def test_L_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match="Products from swaths 2 and 3 do not overlap"
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2")),
+                S1MultiBurst("173_370306", ("IW1", "IW2")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_u_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match="Products from swaths 1 and 2 do not overlap"
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1",        "IW3")),
+                S1MultiBurst("173_370306", ("IW1",        "IW3")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_c_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match=re.escape("All bursts must have consecutive burst IDs. Found: [370305, 370307].")
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370306", ("IW1",             )),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_donut_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match=re.escape("All bursts must have consecutive burst IDs. Found: [370305, 370307].")
+        ):   
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370306", ("IW1",        "IW3")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_too_large_group():
+    with pytest.raises(
+        ValueError,
+        match="An S1MultiBurstGroup may include no more than 15 burst/subswath combinations"
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370306", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3")), 
+                S1MultiBurst("173_370308", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370309", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370310", ("IW1", "IW2", "IW3")), 
+                ])
+
+def test_multiburst_product_from_multiburst_group(three_by_three_multiburst_product):
+     assert three_by_three_multiburst_product.id == '173_370305_IW123_173_370306_IW123_173_370307_IW123_20230103'
+     assert len(three_by_three_multiburst_product.geo_reference_bursts) == 9
+
+def test_multiburst_product_from_geo_reference_bursts(three_by_three_multiburst_product):
+    geo_ref_bursts = three_by_three_multiburst_product.geo_reference_bursts
+    multiburst_product = S1MultiBurstProduct(geo_reference_bursts=geo_ref_bursts)
+    assert three_by_three_multiburst_product == multiburst_product
+


=====================================
tests/SBASNetwork/test_SBASNetwork.py
=====================================
@@ -1,9 +1,9 @@
+import copy
 from datetime import date
 import pickle
 from pathlib import Path
 
-from asf_search.ASFSearchOptions import ASFSearchOptions
-from asf_search import SBASNetwork
+from asf_search import SBASNetwork, get_existing_pair_from_dates
 
 import pytest
 
@@ -15,14 +15,6 @@ def reference():
         # trusted local test fixture
         return pickle.load(f) # nosec B301
     
- at pytest.fixture
-def pair():
-    path = Path(__file__).parent / "data/pair_0.pkl"
-
-    with open(path, "rb") as f:
-        # trusted local test fixture
-        return pickle.load(f) # nosec B301
-    
 @pytest.fixture
 def stack_results():
     path = Path(__file__).parent / "data/stack_search_0.pkl"
@@ -40,19 +32,24 @@ def sbas_network(stack_results):
         inseason_temporal_baseline=24,
         bridge_target_date='3-1',
         bridge_year_threshold=2)
-    
-def test_sbas_network_from_ref_scene(mocker, reference, stack_results):
+
+ at pytest.fixture
+def multiburst_sbas_network(three_by_three_multiburst_product):
+    return SBASNetwork.from_geo_reference(
+    geo_reference = three_by_three_multiburst_product,
+    start_date = '2023-01-01',
+    end_date = '2025-10-02',
+    season = (1, 176),
+    perpendicular_baseline=150, 
+    inseason_temporal_baseline=36,
+    bridge_target_date='3-1',
+    bridge_year_threshold=1)
+
+def test_sbas_network_from_ref_scene(reference):
     """
     Create an SBASNetwork from a geographic reference scene
     """
-    mock_stack = mocker.patch.object(
-        reference,
-        "stack",
-        return_value=stack_results,
-    )
-
-    # Create an SBASNetwork and confrm expected size of its full_stack and subset_stack
-    sbas = SBASNetwork(
+    sbas = SBASNetwork.from_geo_reference(
         reference,
         start_date="2020-01-01",
         end_date="2025-10-02",
@@ -62,19 +59,25 @@ def test_sbas_network_from_ref_scene(mocker, reference, stack_results):
         bridge_target_date='3-1',
         bridge_year_threshold=2)
 
-    assert len(sbas.full_stack) == 1730
-    assert len(sbas.subset_stack) == 176
-    assert len(sbas.connected_substacks) == 3
-    assert len(max(sbas.connected_substacks, key=lambda s: len(s))) == 161
+    assert len(sbas.full_stack) == 1508
+    assert len(sbas.subset_stack) == 159
+    assert len(sbas.connected_substacks) == 4
+    assert len(max(sbas.connected_substacks, key=lambda s: len(s))) == 145
+
+def test_multiburst_sbas_network(multiburst_sbas_network):
+    assert len(multiburst_sbas_network.full_stack) == 416
+    assert len(multiburst_sbas_network.subset_stack) == 99
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 96
 
 def test_sbasnetwork_from_search_results(sbas_network):
     """
     Create an SBASNetwork from ASFProduct.stack search results with the 
     SBASNetwork.from_search_results alternate class method constructor
     """
-    assert len(sbas_network.full_stack) == 1730
-    assert len(sbas_network.subset_stack) == 176
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 161
+    assert len(sbas_network.full_stack) == 1508
+    assert len(sbas_network.subset_stack) == 159
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 145
 
 def test_disallow_missing_state_vectors(stack_results):
     """
@@ -104,34 +107,193 @@ def test_disallow_missing_state_vectors(stack_results):
         bridge_target_date='3-1',
         bridge_year_threshold=2,
         allow_missing_state_vectors=True)
-    assert len(missing_state_vectors_allowed_sbas.full_stack) == 1730
+    assert len(missing_state_vectors_allowed_sbas.full_stack) == 1508
     assert len([p for p in missing_state_vectors_allowed_sbas.full_stack if p.perpendicular_baseline is None]) == 32
 
-def test_add_pair(sbas_network):
-    removed_pair_0 = sbas_network.get_pair_from_dates(sbas_network.remove_list, date(2023,1,17), date(2024,6,16))
-    sbas_network.add_pairs(removed_pair_0)
-    assert len(sbas_network.subset_stack) == 177
-    assert len(sbas_network.connected_substacks) == 2
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 165
+def test_add_pair_date_strings(sbas_network):
+    """
+    Tests adding a single pair, which is on the remove_list, using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs(("2023-01-17", "2024-06-16"))
+    assert len(sbas_network.subset_stack) == 160
+    assert len(sbas_network.remove_list) == removed_list_size - 1
+    assert len(sbas_network.connected_substacks) == 3
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 145
 
-def test_add_pairs(sbas_network):
-    removed_pair_0 = sbas_network.get_pair_from_dates(sbas_network.remove_list, date(2023,1,17), date(2024,6,16))
-    removed_pair_1 = sbas_network.get_pair_from_dates(sbas_network.remove_list, date(2023,1,5), date(2024,2,5))
-    sbas_network.add_pairs([removed_pair_0, removed_pair_1])
-    assert len(sbas_network.subset_stack) == 178
+def test_add_multiburst_pair_date_strings(multiburst_sbas_network):
+    """
+    Tests adding a single S1MultiBurstProduct pair, which is on the remove_list, using date pair strings
+    """
+    multiburst_sbas_network.add_pairs(("2024-03-22", "2024-04-15"))
+    assert len(multiburst_sbas_network.subset_stack) == 100
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 97
+
+def test_add_new_pair_date_strings(sbas_network):
+    """
+    tests adding a pair previously unknown to the SBASNetwork
+    and not on the remove_list, using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs(("2023-01-17", "2025-05-14"))
+    assert len(sbas_network.subset_stack) == 160
+    assert len(sbas_network.remove_list) == removed_list_size
+    assert len(sbas_network.connected_substacks) == 3
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 145
+
+def test_add_pairs_date_strings(sbas_network):
+    """
+    Tests adding a multiple pairs using date pair strings
+    """
+    sbas_network.add_pairs([("2023-01-17", "2024-06-16"), ("2023-01-05", "2024-02-05")])
+    assert len(sbas_network.subset_stack) == 161
     assert len(sbas_network.connected_substacks) == 2
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 166
-
-def test_remove_pairs(sbas_network):
-    pair1_to_remove = sbas_network.get_pair_from_dates(sbas_network.subset_stack, date(2025,1,6), date(2025,1,18))
-    pair2_to_remove = sbas_network.get_pair_from_dates(sbas_network.subset_stack, date(2025,1,6), date(2025,1,30))
-    sbas_network.remove_pairs([pair1_to_remove, pair2_to_remove])
-    assert len(sbas_network.subset_stack) == 174
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 159
-    assert len(sbas_network.remove_list) == 1556
-
-def add_new_pair(sbas_network, pair):
-    sbas_network.add_pairs(pair)
-    assert len(sbas_network.full_stack) == 1731
-    assert len(sbas_network.subset_stack) == 176
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 164
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 151
+
+def test_add_multiburst_pairs_date_strings(multiburst_sbas_network):
+    """
+    Tests adding multiple S1MultiBurstProduct pairs using date pair strings
+    """
+    multiburst_sbas_network.add_pairs([("2024-03-22", "2024-04-15"), ("2024-04-03", "2024-02-15")])
+    assert len(multiburst_sbas_network.subset_stack) == 101
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 98
+
+def test_add_pair_object(sbas_network):
+    """
+    Tests adding a single pair using a Pair object
+    """
+    pair_to_add = sbas_network.remove_list[10]
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs(pair_to_add)
+    assert len(sbas_network.subset_stack) == 160
+    assert len(sbas_network.remove_list) == removed_list_size - 1
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 146
+
+def test_add_multiburst_pair_object(multiburst_sbas_network):
+    """
+    Tests adding a single S1MultiBurstProduct pair using a Pair object
+    """
+    pair_to_add = multiburst_sbas_network.remove_list[10]
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.add_pairs(pair_to_add)
+    assert len(multiburst_sbas_network.subset_stack) == 100
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size - 1
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 97
+
+def test_add_pair_objects(sbas_network):
+    """
+    Tests adding a multiple pairs using Pair objects
+    """
+
+    pair_to_add_1 = sbas_network.remove_list[10]
+    pair_to_add_2 = sbas_network.remove_list[-1]
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs([pair_to_add_1, pair_to_add_2])
+    assert len(sbas_network.subset_stack) == 161
+    assert len(sbas_network.remove_list) == removed_list_size - 2
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 146
+
+def test_add_multiburst_pair_objects(multiburst_sbas_network):
+    """
+    Tests adding multiple S1MultiBurstProduct pairs using a Pair objects
+    """
+    pairs_to_add = multiburst_sbas_network.remove_list[10:12]
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.add_pairs(pairs_to_add)
+    assert len(multiburst_sbas_network.subset_stack) == 101
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size - 2
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 98
+
+def test_remove_pair_date_strings(sbas_network):
+    """
+    Tests removing a single pair using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs(("2025-01-06", "2025-01-18"))
+    assert len(sbas_network.subset_stack) == 158
+    assert len(sbas_network.remove_list) == removed_list_size + 1
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 144
+
+def test_remove_multiburst_pair_date_strings(multiburst_sbas_network):
+    """
+    Tests removing a single S1MultiBurstProduct pair using date pair strings
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs(("2023-02-20", "2024-02-15"))
+    assert len(multiburst_sbas_network.subset_stack) == 98
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 1
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 95
+
+def test_remove_pairs_date_strings(sbas_network):
+    """
+    Tests a multiple pairs using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs([("2025-01-06", "2025-01-18"), ("2025-01-06", "2025-01-30")])
+    assert len(sbas_network.subset_stack) == 157
+    assert len(sbas_network.remove_list) == removed_list_size + 2
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 143
+
+def test_remove_multiburst_pairs_date_strings(multiburst_sbas_network):
+    """
+    Tests removing multiple S1MultiBurstProduct pairs using date pair strings
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs([("2023-02-20", "2024-02-15"), ("2023-03-04", "2024-02-15")])
+    assert len(multiburst_sbas_network.subset_stack) == 97
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 2
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 94
+
+def test_remove_pair_object(sbas_network):
+    """
+    Tests removing a single pair using a Pair object
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs(sbas_network.subset_stack[0])
+    assert len(sbas_network.subset_stack) == 158
+    assert len(sbas_network.remove_list) == removed_list_size + 1
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 144
+
+def test_remove_multiburst_pair_object(multiburst_sbas_network):
+    """
+    Tests removing a single S1MultiBurstProduct pair using a Pair object
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs(multiburst_sbas_network.subset_stack[0])
+    assert len(multiburst_sbas_network.subset_stack) == 98
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 1
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 95
+
+def test_remove_pair_objects(sbas_network):
+    """
+    Tests removing multiple pairs using pair objects
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs(sbas_network.subset_stack[:3])
+    assert len(sbas_network.subset_stack) == 156
+    assert len(sbas_network.remove_list) == removed_list_size + 3
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 142
+
+def test_remove_multiburst_pair_objects(multiburst_sbas_network):
+    """
+    Tests removing multiple S1MultiBurstProduct pairs using pair objects
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs(multiburst_sbas_network.subset_stack[:3])
+    assert len(multiburst_sbas_network.subset_stack) == 96
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 3
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 93


=====================================
tests/yml_tests/test_ASFSearchResults.yml
=====================================
@@ -2,9 +2,6 @@ tests:
 - Test ASFSearchResults_intersection simple-polygon:
     wkt: POLYGON ((0 0, 50 0, 50 50, 0 50, 0 0))
 
-- Test ASFSearchResults_intersection Shovel_Creek Polygon:
-    wkt: POLYGON ((-148.395929999329 65.02006999976498, -148.398010619511 65.02049651421811, -148.3980473296276 65.02074794119113, -148.3982428597838 65.02104161295625, -148.3992698433036 65.02120374777655, -148.4007460405182 65.02123858637134, -148.401412730549 65.02108323434425, -148.4027226255657 65.0207780217462, -148.4035199986349 65.0207700013126, -148.4086000003617 65.02056000058639, -148.4120399989118 65.02099999942624, -148.4150700005966 65.02205999978662, -148.4207299999013 65.02348000026927, -148.4247500012678 65.02348000026927, -148.4283700011887 65.02275000067596, -148.4360600005286 65.02072999998933, -148.4453999984648 65.01838999919386, -148.4505993951639 65.01648358639204, -148.4509054577393 65.01644310572868, -148.4524066683864 65.01582945088057, -148.4524399995483 65.0158299996333, -148.4554199992516 65.01481999994485, -148.4574399986286 65.01414000102335, -148.4595599993493 65.01347999948933, -148.4620200014952 65.01214000165317, -148.4626900010681 65.01101999996274, -148.4630200005255 65.01047999977919, -148.4648500004927 65.00898999992751, -148.466480000392 65.00734000002149, -148.4677900355436 65.00472812040925, -148.4678953842795 65.0045180620574, -148.4689400012282 65.00142999997701, -148.4691890681716 65.00087774780837, -148.4696833359056 64.9997817550319, -148.470480000442 64.9987799984213, -148.4725000011287 64.99773999937747, -148.4759300016398 64.99630000019761, -148.4771114544676 64.99570064042348, -148.4788537666308 64.99430364564563, -148.4826219690773 64.99391567746977, -148.4874281274788 64.99320716567104, -148.4913011914632 64.99292186009308, -148.4943174586139 64.99262299154805, -148.4981470362368 64.99216857452501, -148.5015947304217 64.99144294923741, -148.5039482954939 64.990973367518, -148.5048332384966 64.99045220828117, -148.5053359562367 64.98921814329481, -148.5042842447928 64.9883712934228, -148.5010520624355 64.98800007464683, -148.4973591294795 64.98818001315345, -148.4903337063593 64.98897527503073, -148.485345891161 64.98929340361769, -148.4795349390187 64.98966013414639, -148.4775199989061 64.98850000147519, -148.4745600005193 64.98700000096528, -148.471699999547 64.9833199997143, -148.4681499989951 64.97882000080398, -148.4666722602962 64.9756643308163, -148.4665600004192 64.97416000052954, -148.4661999989871 64.97277999875075, -148.4650700005675 64.97143000025636, -148.4640093414419 64.97080265016427, -148.4628142313506 64.97009573223681, -148.4620099995273 64.96962000160562, -148.4618567455953 64.96961620748476, -148.4614782594474 64.96942664943458, -148.4598182575734 64.96893576851335, -148.4536700006213 64.96761000157716, -148.4487799996138 64.96622999979837, -148.4423399987343 64.96448999920693, -148.4402099999748 64.96339000145235, -148.4397699998252 64.96224000040655, -148.4397849536643 64.96133779461235, -148.4396582494107 64.96122947161047, -148.4379060963693 64.95777518584453, -148.4351494364053 64.95236794152066, -148.4341252896358 64.95051261379939, -148.4336461918369 64.95000396848212, -148.4326677303688 64.94967417071433, -148.4312261504144 64.9496943226431, -148.4274077338195 64.95021227580196, -148.4249869485031 64.9502836608043, -148.4239955946201 64.95031288352391, -148.4233534465399 64.95033180959939, -148.4193875700035 64.95055001018432, -148.410199567404 64.95105270173099, -148.4071979777517 64.95096232255025, -148.3997900949375 64.95123385692324, -148.3944654857017 64.9530024044434, -148.3860846014435 64.95415602411396, -148.380667186204 64.95455384495511, -148.3795556764293 64.95500717756943, -148.3788123705647 64.95541219113124, -148.3774486833746 64.95607947575331, -148.3766577250807 64.95675944717169, -148.3766052713925 64.95727565060821, -148.3770170284574 64.95794499796432, -148.377050976475 64.95800018100971, -148.3771632101586 64.95806187181716, -148.3772045434187 64.95807053268055, -148.3774508535018 64.95828005668602, -148.377498737743 64.95832078880647, -148.377759414932 64.95856235525622, -148.3781711340164 64.95878103911025, -148.3784735543929 64.95901422234715, -148.3788887925669 64.95936592831441, -148.3792663134863 64.95965258940328, -148.3797080397841 64.95992131452897, -148.3797919439446 64.96002399153332, -148.3799253235983 64.96023662863001, -148.3799373699648 64.96025583366571, -148.3799253864626 64.96027401060854, -148.3798222785761 64.96043041037359, -148.3798023047627 64.96046070571492, -148.3797408130255 64.96055398058127, -148.3797688924012 64.96085547632907, -148.3800383705885 64.96131891044644, -148.3801248718294 64.96147992942593, -148.3804082652857 64.96191838547173, -148.3804958561739 64.96223228774596, -148.3804993752636 64.96251140643164, -148.3804642550893 64.96266856580667, -148.3804734764924 64.96285187671958, -148.3804406181223 64.96297794185318, -148.3803955247928 64.96345177084009, -148.3803961940354 64.96349963150726, -148.380437265361 64.96386935856634, -148.3804609036377 64.96397647797937, -148.3803516036201 64.96426590640596, -148.3803191643452 64.96442038357196, -148.3802623363513 64.96484149038787, -148.3803492553776 64.96490510903305, -148.3809197277082 64.96508850507468, -148.3811571032064 64.96517140209716, -148.3813156063053 64.96542520612559, -148.3816272441559 64.96598654218172, -148.3816793795937 64.96658065147938, -148.3820580739796 64.96716864198771, -148.3823038326906 64.96757156007368, -148.3823237803105 64.96761866636962, -148.3823864782559 64.96775411792504, -148.3824091368976 64.96780183714759, -148.3819600004736 64.96810000108889, -148.3805500006492 64.96962000029595, -148.3777400003488 64.97000999977365, -148.3746299999464 64.96986999841641, -148.3716999996053 64.96940999956973, -148.3693700688807 64.96870474361651, -148.3704556510715 64.96824846031035, -148.3716986624298 64.96719965110043, -148.3728913037886 64.96588657488957, -148.3722037716317 64.96468081454253, -148.3700530198037 64.96407850407655, -148.3674836154858 64.96350482435821, -148.3659655231618 64.96283775452241, -148.3646722033587 64.96195656111172, -148.3631116881271 64.96117245240436, -148.3612595533871 64.9608537213681, -148.359609841609 64.96051427524395, -148.3579713393167 64.96011922435986, -148.3560216693461 64.95962893933955, -148.3542673671323 64.95948162084278, -148.3520203714107 64.95948445628346, -148.3501949120776 64.95936251661789, -148.3483878064931 64.95882129058094, -148.3469311181582 64.958180732443, -148.3458400418918 64.95769335620503, -148.344821788648 64.95684466755296, -148.3441971115972 64.95601021111054, -148.343851605619 64.95510186688193, -148.3411043373156 64.95463851003529, -148.3382125322595 64.95358196459068, -148.3351337138467 64.95279853822257, -148.3308052859461 64.95166178058383, -148.3302523252447 64.95080186149119, -148.329953998904 64.94933527858154, -148.3236780331795 64.9477077055052, -148.3213589203488 64.94709154525384, -148.3184873025826 64.94659524097932, -148.313846778446 64.94655529204294, -148.3083189591352 64.94649584994295, -148.3075757462573 64.94648784260607, -148.3053740442451 64.94646410217501, -148.2992930494466 64.94732037644945, -148.2930874877798 64.94839646089616, -148.2897545745913 64.94912953560021, -148.2873323656611 64.94940456417908, -148.2865662178006 64.94965351456165, -148.2850427977293 64.94964716396032, -148.2842981455215 64.94964405479811, -148.2807296235829 64.94962910357827, -148.2749596864503 64.94986141719272, -148.2686122807172 64.95065066112551, -148.2618036790968 64.9518252565087, -148.2610336441288 64.95214683739204, -148.2596114984027 64.95249326406997, -148.2583534480766 64.95265094731394, -148.2578890343243 64.95276207825339, -148.2571120384476 64.95299071561749, -148.2565297921623 64.95326090757629, -148.251326658968 64.9547869836631, -148.248432115387 64.95545683786241, -148.2443829633328 64.95607704893041, -148.2411535352165 64.95683790309516, -148.2380841556124 64.95745650850483, -148.2366640726204 64.95779057318521, -148.2316172082239 64.95784155742098, -148.2249859886296 64.95784259337182, -148.2183133820788 64.95779126469222, -148.2150862406504 64.95759969760462, -148.2111793085385 64.95712510638839, -148.2070109946338 64.95657001877908, -148.203830876992 64.95661712507496, -148.2014863408011 64.95638876012276, -148.1993577983972 64.95619194255863, -148.1960149578922 64.95595001463931, -148.1936230456129 64.95541336328802, -148.1908710166504 64.95500470752734, -148.1889280613701 64.95480992126505, -148.1869174313892 64.95422134140415, -148.1853585545578 64.95369196135385, -148.183965305443 64.95316872759599, -148.1812561433669 64.95309146609378, -148.1783299096435 64.95352461403746, -148.1748649867186 64.95440904102924, -148.1721725557071 64.95532220354249, -148.1669249971162 64.95675283856491, -148.163271104184 64.95800712227327, -148.157881333509 64.95931432984224, -148.1525901994989 64.95961150367128, -148.1488088846126 64.95987073498196, -148.1463068825834 64.96013064077397, -148.1443847157326 64.96051093426973, -148.144343724297 64.96154064976611, -148.1450132864394 64.9620813519341, -148.1469237880384 64.96167409228411, -148.1506507528309 64.96089282163678, -148.1546971323087 64.96108099143424, -148.1582184182938 64.96128626555287, -148.1620292361697 64.96260715788844, -148.1672635330181 64.96335495461966, -148.1727892764982 64.96311903940619, -148.1809728206329 64.96180335563764, -148.1844446966085 64.96056988131352, -148.1848876919788 64.96045006986554, -148.1873364715422 64.96255566549979, -148.1886712398565 64.9649254705094, -148.1895612093818 64.96650534007927, -148.1900985876013 64.96810893436418, -148.1906662965232 64.96956634039947, -148.191603369725 64.97007991794294, -148.1959102102958 64.97027664121066, -148.1978054136118 64.96994185228147, -148.199281080409 64.96911271441854, -148.2007944264804 64.96810082356313, -148.2017371234153 64.96732556169263, -148.2040386421075 64.96586411138901, -148.2066731947678 64.96489373845753, -148.2099223255953 64.96431436035471, -148.2128187027177 64.96375869256059, -148.2163599284647 64.96344779205543, -148.2186145635052 64.96305242161128, -148.220782868872 64.96265383068283, -148.2243163452876 64.96237929977946, -148.2276396310745 64.96228106387412, -148.2291398463707 64.96259422618346, -148.2295934330614 64.96334749341617, -148.2297506487523 64.96427395565235, -148.2306506883484 64.96497004258924, -148.2327925802428 64.96512270454934, -148.2352217055529 64.96518624985288, -148.2366696387279 64.96785253587478, -148.2367990815065 64.96809087005312, -148.2402036193674 64.97435802561159, -148.2386825868289 64.97560729458451, -148.239508957354 64.97555546037137, -148.23961858348 64.97550091775571, -148.2417614825124 64.97548188690649, -148.2432022923794 64.97522692119873, -148.2443149664529 64.97495986852459, -148.2449653589207 64.97436780624486, -148.2454844881653 64.97377091389347, -148.2463116575907 64.97296135694222, -148.2467222961953 64.97224847476679, -148.2467704109389 64.97172686500272, -148.2484462375842 64.97117562259149, -148.2496482195264 64.97016615986865, -148.2505066364248 64.96921430832384, -148.2513935648908 64.96812301596151, -148.251922689555 64.96715905911492, -148.252401799141 64.96643911649579, -148.2523076258394 64.96613705235012, -148.2520008481829 64.965152998581, -148.2522470194407 64.96436125841274, -148.2518461313468 64.96388994530639, -148.2518315009967 64.96315185848619, -148.2517274514558 64.96244560456262, -148.2511406226268 64.96207281679921, -148.2511797294439 64.96147719352035, -148.2513296659758 64.96074515869617, -148.2506534637945 64.96040420251973, -148.2490794288151 64.95999510147044, -148.2482999733736 64.95973987513787, -148.2479919214059 64.95963900417172, -148.2475446211425 64.95899036142623, -148.2474729558703 64.95853114838292, -148.2496941746203 64.95861286146157, -148.2509676240742 64.95887042163037, -148.2516471292492 64.95892198736067, -148.2523550176438 64.95876706490606, -148.25480858275 64.9577460325375, -148.2569387334316 64.95662729468091, -148.2584837277358 64.9557762879088, -148.2604817259266 64.9547931980585, -148.2622952620025 64.95407049595968, -148.2642207789952 64.95354471096005, -148.2663159797598 64.95349983634588, -148.2674565616418 64.95302202464524, -148.2680631364011 64.9521945395889, -148.2691240810352 64.95177589364732, -148.271238896763 64.95153967328019, -148.2727945177488 64.95130479139829, -148.2744288814764 64.95148267764824, -148.2756123773931 64.95183399595248, -148.2763401584014 64.95247659194064, -148.2759734710919 64.95330308950406, -148.2744004982568 64.95388942720581, -148.2721344703763 64.95431036900305, -148.2708771888278 64.95432028977126, -148.2703607365535 64.95393739264676, -148.2693001966082 64.95395451137438, -148.2676469644307 64.9542858624136, -148.2660163974433 64.9545060406038, -148.2658114546718 64.95486249544308, -148.2662023813976 64.95521281053828, -148.2655213596219 64.95563579804372, -148.2644889095296 64.95592453365362, -148.2637095719587 64.95614247623314, -148.2639175309057 64.95674715458676, -148.2657138447899 64.95769106296871, -148.2672879897818 64.95809999637993, -148.269387397214 64.95796624215984, -148.2706965706012 64.95804934349121, -148.2711048072668 64.95848574597079, -148.2712022128398 64.95922683979876, -148.27151397249 64.95972994651163, -148.271790171916 64.9604073509721, -148.2722634194084 64.96133781687678, -148.2736346765047 64.96233629144842, -148.2756957838781 64.96279808192691, -148.2778280326548 64.96291124547793, -148.2793914173785 64.96296844934778, -148.2814739732564 64.96332558259735, -148.2830444891462 64.96334788893722, -148.284768282542 64.96302458321537, -148.2866849893687 64.96256783104644, -148.2888952933091 64.96229737715322, -148.2896954075225 64.96162420817313, -148.2899536041921 64.96152670699405, -148.2899635236506 64.96152864007047, -148.2924390362464 64.9615839016962, -148.2936689338553 64.96124247796678, -148.2965727224136 64.96082163439502, -148.2972407509296 64.96038945167982, -148.2977654554495 64.9598466815392, -148.2986829634557 64.95900216550331, -148.2989537146446 64.95848525353398, -148.30001885154 64.95813778173755, -148.3017138255953 64.95795373609837, -148.3029222249321 64.95771682422424, -148.3042951466221 64.95748589755289, -148.3049983385316 64.95687937910952, -148.3056475195525 64.95613041676989, -148.3060428048679 64.95540732569833, -148.3054252301704 64.95436639678712, -148.3041797775828 64.95396983847013, -148.3017659466267 64.95402234323552, -148.3009733185006 64.95380783330734, -148.301256199875 64.95372288926694, -148.3003198090124 64.95312881664012, -148.2982891227089 64.95271880143952, -148.298091060956 64.95206765329073, -148.2992883031939 64.95202733109772, -148.3012477380817 64.95246273429728, -148.3033214693872 64.95298626535077, -148.304439814342 64.953334977407, -148.3053917038673 64.95320167764322, -148.30772272162 64.95278264403868, -148.3086997673322 64.95251889959695, -148.3093157887583 64.9527521614142, -148.3123310592483 64.95300237301126, -148.3141195596271 64.95317279150942, -148.3165474093163 64.95305037381343, -148.3177177901738 64.95340898044435, -148.3189869583087 64.95327952064002, -148.3197081542843 64.95323709249385, -148.3201915936472 64.9535161509346, -148.3213444668044 64.95403801477516, -148.3212197047949 64.95494094350852, -148.3213536764206 64.95550769244062, -148.321974209668 64.95612723426603, -148.3238170404954 64.95643997748022, -148.3266635204101 64.95629747464869, -148.327605206278 64.95628193014733, -148.3290006163522 64.95699947606607, -148.3314802976352 64.95846119092352, -148.3326199103597 64.95903442142418, -148.3327216915481 64.96049389019345, -148.3342890995853 64.96189448918966, -148.3364409554671 64.96236438130143, -148.3402520392065 64.96345421861776, -148.3449330924643 64.96449142674982, -148.3483806779464 64.96509197963547, -148.3502456671207 64.96501938842493, -148.3513416559681 64.96449907261712, -148.3524610552092 64.96484744939715, -148.3530638031058 64.96579305904351, -148.3537972405891 64.96589468307121, -148.3533126264502 64.96671188981878, -148.3539871247477 64.96720437246933, -148.3533599999193 64.96727000015193, -148.3498800000459 64.96771000161118, -148.3464500008445 64.96823999851716, -148.3447900015899 64.96853000058024, -148.3400000006164 64.96950000156482, -148.3366000007703 64.97006000044553, -148.3348299995138 64.97023999919702, -148.3311600002308 64.97043000122613, -148.3275299996517 64.97057999931258, -148.3240800004434 64.97095999944179, -148.3209300000275 64.97153000029039, -148.3208900916909 64.97152527761182, -148.3197333183293 64.97187038283028, -148.3194400014854 64.97185000039917, -148.3165000004861 64.97253000063029, -148.3142100003624 64.97340000027123, -148.3131390131606 64.97428978251332, -148.3136603033646 64.97503578368367, -148.3138100002265 64.97525000024524, -148.3157199989112 64.97607000052398, -148.3173927425877 64.97628215435157, -148.3181154158738 64.97710949927301, -148.318506832417 64.97752678315527, -148.3187389443419 64.97826073664947, -148.3191775248066 64.97838722480719, -148.3187036827229 64.9785124478214, -148.3174808822287 64.97901466526673, -148.3183191301726 64.97940472760871, -148.3179133845039 64.98006608334396, -148.3178643739444 64.98039869559773, -148.317717597652 64.98046658639413, -148.3165037173362 64.98102803770149, -148.3158305797883 64.98133936777919, -148.3136403766995 64.98169043855529, -148.3124228974041 64.98159245803612, -148.3106442287358 64.9817736328734, -148.3085689899975 64.9821898415147, -148.3075063283829 64.98248161818384, -148.3074353009211 64.9823643173778, -148.3075113274024 64.98152061988714, -148.307689970643 64.98064034848585, -148.3053761881787 64.98031430947776, -148.3052377492606 64.98037990703784, -148.304154185275 64.98023807737798, -148.3033326487505 64.98101592847075, -148.3035788815629 64.9822540966606, -148.303609042008 64.9829224774785, -148.3029990450748 64.98388363555517, -148.30328332256 64.98452614903402, -148.303235581073 64.98557802025795, -148.3029986141926 64.98634992936718, -148.3001099994984 64.98611999935645, -148.2988772743069 64.9865277226304, -148.298759997075 64.98649000013705, -148.2985074044935 64.98665005257834, -148.2976941778403 64.98716532090884, -148.2961399988037 64.98814999939168, -148.29416000075 64.99019000139481, -148.2919799986993 64.99236999951654, -148.2910500003476 64.99376000064387, -148.2943157993754 64.99484862651326, -148.2946053050727 64.99503986356336, -148.2946899989657 64.99503000042074, -148.296969998431 64.99563999997326, -148.3006600003402 64.99654000158887, -148.3006688655125 64.99656069048336, -148.303190430118 64.99696088445086, -148.3032105912145 64.99718197417303, -148.3038899994737 64.99720999985215, -148.3063199996449 64.99755000127738, -148.3073614236123 64.99776908065252, -148.3077700007926 64.99793999944546, -148.3085600004063 64.99809999949986, -148.3094099961114 64.99820000346284, -148.3121299983457 64.99851999964261, -148.3139300002672 64.99865999969018, -148.3157000002141 64.99879000038925, -148.316639999224 64.99889999977177, -148.3180141624833 64.99914803731269, -148.3194200014786 64.99951999998257, -148.3211799994576 65.00009999887004, -148.3229000000423 65.00068999972541, -148.3241044886974 65.00118402124099, -148.3253100002067 65.00175000008574, -148.3259799997796 65.00217999957709, -148.3273699995973 65.00380999947635, -148.3293199996053 65.00625000030578, -148.3312600002648 65.0080600002662, -148.3343199999953 65.00923999935765, -148.3350104396249 65.00939097184039, -148.335234252156 65.01018466211087, -148.3351465892357 65.01100225914081, -148.3339866936152 65.01174824459508, -148.334658432433 65.01226500464242, -148.3368734105941 65.01244359287676, -148.3390489073719 65.01281770733829, -148.3417658200891 65.01281737992019, -148.3440400975958 65.01270253344023, -148.3452138914596 65.01304038438343, -148.3470812878118 65.01340325923667, -148.3486601947724 65.01365721256769, -148.3506178891056 65.01395763962284, -148.3519985090498 65.01404025375609, -148.3538791959572 65.01433786239636, -148.3545136981701 65.01465620053091, -148.3556942656594 65.01496138169676, -148.35727017478 65.01446004435132, -148.3590641024411 65.0140322045097, -148.361102294477 65.01354747904861, -148.3619877351552 65.01377632857964, -148.3634815618695 65.01445385091068, -148.364793324479 65.01410708764695, -148.3662673162052 65.01333936556028, -148.3668481362573 65.01302032806069, -148.3708081886807 65.01304589286542, -148.3711290400765 65.0134813091617, -148.3721097764455 65.01400898663792, -148.3738183724032 65.01400470138992, -148.3752070520711 65.0136606203352, -148.376363068442 65.01370212385268, -148.3766764533957 65.01407449514028, -148.3768917281725 65.01493578153088, -148.3783168455452 65.0151839028909, -148.3797186062208 65.01477459229397, -148.381435142722 65.01434373103825, -148.382481453077 65.01454539962884, -148.3830196105516 65.01495864186217, -148.3845231733703 65.01481557325218, -148.3849148151772 65.01482634661716, -148.3854207822145 65.01577727746229, -148.387758416432 65.01701172749227, -148.3907954156963 65.01809066440546, -148.3921436592297 65.01856960242435, -148.395929999329 65.02006999976498))
-
 - Test ASFSearchResults_intersection complex-polygon:
     wkt: POLYGON ((0 0, 5 0, 5 5, 5 5.1, 0 5, 0 5, 0 0))
 


=====================================
tests/yml_tests/test_known_bugs.yml
=====================================
@@ -1,4 +1,5 @@
 # To exclude from the pipeline, but still keep track of
 
 tests:
-    [] # placeholder until this file has tests
+- Test ASFSearchResults_intersection Shovel_Creek Polygon:
+    wkt: POLYGON ((-148.395929999329 65.02006999976498, -148.398010619511 65.02049651421811, -148.3980473296276 65.02074794119113, -148.3982428597838 65.02104161295625, -148.3992698433036 65.02120374777655, -148.4007460405182 65.02123858637134, -148.401412730549 65.02108323434425, -148.4027226255657 65.0207780217462, -148.4035199986349 65.0207700013126, -148.4086000003617 65.02056000058639, -148.4120399989118 65.02099999942624, -148.4150700005966 65.02205999978662, -148.4207299999013 65.02348000026927, -148.4247500012678 65.02348000026927, -148.4283700011887 65.02275000067596, -148.4360600005286 65.02072999998933, -148.4453999984648 65.01838999919386, -148.4505993951639 65.01648358639204, -148.4509054577393 65.01644310572868, -148.4524066683864 65.01582945088057, -148.4524399995483 65.0158299996333, -148.4554199992516 65.01481999994485, -148.4574399986286 65.01414000102335, -148.4595599993493 65.01347999948933, -148.4620200014952 65.01214000165317, -148.4626900010681 65.01101999996274, -148.4630200005255 65.01047999977919, -148.4648500004927 65.00898999992751, -148.466480000392 65.00734000002149, -148.4677900355436 65.00472812040925, -148.4678953842795 65.0045180620574, -148.4689400012282 65.00142999997701, -148.4691890681716 65.00087774780837, -148.4696833359056 64.9997817550319, -148.470480000442 64.9987799984213, -148.4725000011287 64.99773999937747, -148.4759300016398 64.99630000019761, -148.4771114544676 64.99570064042348, -148.4788537666308 64.99430364564563, -148.4826219690773 64.99391567746977, -148.4874281274788 64.99320716567104, -148.4913011914632 64.99292186009308, -148.4943174586139 64.99262299154805, -148.4981470362368 64.99216857452501, -148.5015947304217 64.99144294923741, -148.5039482954939 64.990973367518, -148.5048332384966 64.99045220828117, -148.5053359562367 64.98921814329481, -148.5042842447928 64.9883712934228, -148.5010520624355 64.98800007464683, -148.4973591294795 64.98818001315345, -148.4903337063593 64.98897527503073, -148.485345891161 64.98929340361769, -148.4795349390187 64.98966013414639, -148.4775199989061 64.98850000147519, -148.4745600005193 64.98700000096528, -148.471699999547 64.9833199997143, -148.4681499989951 64.97882000080398, -148.4666722602962 64.9756643308163, -148.4665600004192 64.97416000052954, -148.4661999989871 64.97277999875075, -148.4650700005675 64.97143000025636, -148.4640093414419 64.97080265016427, -148.4628142313506 64.97009573223681, -148.4620099995273 64.96962000160562, -148.4618567455953 64.96961620748476, -148.4614782594474 64.96942664943458, -148.4598182575734 64.96893576851335, -148.4536700006213 64.96761000157716, -148.4487799996138 64.96622999979837, -148.4423399987343 64.96448999920693, -148.4402099999748 64.96339000145235, -148.4397699998252 64.96224000040655, -148.4397849536643 64.96133779461235, -148.4396582494107 64.96122947161047, -148.4379060963693 64.95777518584453, -148.4351494364053 64.95236794152066, -148.4341252896358 64.95051261379939, -148.4336461918369 64.95000396848212, -148.4326677303688 64.94967417071433, -148.4312261504144 64.9496943226431, -148.4274077338195 64.95021227580196, -148.4249869485031 64.9502836608043, -148.4239955946201 64.95031288352391, -148.4233534465399 64.95033180959939, -148.4193875700035 64.95055001018432, -148.410199567404 64.95105270173099, -148.4071979777517 64.95096232255025, -148.3997900949375 64.95123385692324, -148.3944654857017 64.9530024044434, -148.3860846014435 64.95415602411396, -148.380667186204 64.95455384495511, -148.3795556764293 64.95500717756943, -148.3788123705647 64.95541219113124, -148.3774486833746 64.95607947575331, -148.3766577250807 64.95675944717169, -148.3766052713925 64.95727565060821, -148.3770170284574 64.95794499796432, -148.377050976475 64.95800018100971, -148.3771632101586 64.95806187181716, -148.3772045434187 64.95807053268055, -148.3774508535018 64.95828005668602, -148.377498737743 64.95832078880647, -148.377759414932 64.95856235525622, -148.3781711340164 64.95878103911025, -148.3784735543929 64.95901422234715, -148.3788887925669 64.95936592831441, -148.3792663134863 64.95965258940328, -148.3797080397841 64.95992131452897, -148.3797919439446 64.96002399153332, -148.3799253235983 64.96023662863001, -148.3799373699648 64.96025583366571, -148.3799253864626 64.96027401060854, -148.3798222785761 64.96043041037359, -148.3798023047627 64.96046070571492, -148.3797408130255 64.96055398058127, -148.3797688924012 64.96085547632907, -148.3800383705885 64.96131891044644, -148.3801248718294 64.96147992942593, -148.3804082652857 64.96191838547173, -148.3804958561739 64.96223228774596, -148.3804993752636 64.96251140643164, -148.3804642550893 64.96266856580667, -148.3804734764924 64.96285187671958, -148.3804406181223 64.96297794185318, -148.3803955247928 64.96345177084009, -148.3803961940354 64.96349963150726, -148.380437265361 64.96386935856634, -148.3804609036377 64.96397647797937, -148.3803516036201 64.96426590640596, -148.3803191643452 64.96442038357196, -148.3802623363513 64.96484149038787, -148.3803492553776 64.96490510903305, -148.3809197277082 64.96508850507468, -148.3811571032064 64.96517140209716, -148.3813156063053 64.96542520612559, -148.3816272441559 64.96598654218172, -148.3816793795937 64.96658065147938, -148.3820580739796 64.96716864198771, -148.3823038326906 64.96757156007368, -148.3823237803105 64.96761866636962, -148.3823864782559 64.96775411792504, -148.3824091368976 64.96780183714759, -148.3819600004736 64.96810000108889, -148.3805500006492 64.96962000029595, -148.3777400003488 64.97000999977365, -148.3746299999464 64.96986999841641, -148.3716999996053 64.96940999956973, -148.3693700688807 64.96870474361651, -148.3704556510715 64.96824846031035, -148.3716986624298 64.96719965110043, -148.3728913037886 64.96588657488957, -148.3722037716317 64.96468081454253, -148.3700530198037 64.96407850407655, -148.3674836154858 64.96350482435821, -148.3659655231618 64.96283775452241, -148.3646722033587 64.96195656111172, -148.3631116881271 64.96117245240436, -148.3612595533871 64.9608537213681, -148.359609841609 64.96051427524395, -148.3579713393167 64.96011922435986, -148.3560216693461 64.95962893933955, -148.3542673671323 64.95948162084278, -148.3520203714107 64.95948445628346, -148.3501949120776 64.95936251661789, -148.3483878064931 64.95882129058094, -148.3469311181582 64.958180732443, -148.3458400418918 64.95769335620503, -148.344821788648 64.95684466755296, -148.3441971115972 64.95601021111054, -148.343851605619 64.95510186688193, -148.3411043373156 64.95463851003529, -148.3382125322595 64.95358196459068, -148.3351337138467 64.95279853822257, -148.3308052859461 64.95166178058383, -148.3302523252447 64.95080186149119, -148.329953998904 64.94933527858154, -148.3236780331795 64.9477077055052, -148.3213589203488 64.94709154525384, -148.3184873025826 64.94659524097932, -148.313846778446 64.94655529204294, -148.3083189591352 64.94649584994295, -148.3075757462573 64.94648784260607, -148.3053740442451 64.94646410217501, -148.2992930494466 64.94732037644945, -148.2930874877798 64.94839646089616, -148.2897545745913 64.94912953560021, -148.2873323656611 64.94940456417908, -148.2865662178006 64.94965351456165, -148.2850427977293 64.94964716396032, -148.2842981455215 64.94964405479811, -148.2807296235829 64.94962910357827, -148.2749596864503 64.94986141719272, -148.2686122807172 64.95065066112551, -148.2618036790968 64.9518252565087, -148.2610336441288 64.95214683739204, -148.2596114984027 64.95249326406997, -148.2583534480766 64.95265094731394, -148.2578890343243 64.95276207825339, -148.2571120384476 64.95299071561749, -148.2565297921623 64.95326090757629, -148.251326658968 64.9547869836631, -148.248432115387 64.95545683786241, -148.2443829633328 64.95607704893041, -148.2411535352165 64.95683790309516, -148.2380841556124 64.95745650850483, -148.2366640726204 64.95779057318521, -148.2316172082239 64.95784155742098, -148.2249859886296 64.95784259337182, -148.2183133820788 64.95779126469222, -148.2150862406504 64.95759969760462, -148.2111793085385 64.95712510638839, -148.2070109946338 64.95657001877908, -148.203830876992 64.95661712507496, -148.2014863408011 64.95638876012276, -148.1993577983972 64.95619194255863, -148.1960149578922 64.95595001463931, -148.1936230456129 64.95541336328802, -148.1908710166504 64.95500470752734, -148.1889280613701 64.95480992126505, -148.1869174313892 64.95422134140415, -148.1853585545578 64.95369196135385, -148.183965305443 64.95316872759599, -148.1812561433669 64.95309146609378, -148.1783299096435 64.95352461403746, -148.1748649867186 64.95440904102924, -148.1721725557071 64.95532220354249, -148.1669249971162 64.95675283856491, -148.163271104184 64.95800712227327, -148.157881333509 64.95931432984224, -148.1525901994989 64.95961150367128, -148.1488088846126 64.95987073498196, -148.1463068825834 64.96013064077397, -148.1443847157326 64.96051093426973, -148.144343724297 64.96154064976611, -148.1450132864394 64.9620813519341, -148.1469237880384 64.96167409228411, -148.1506507528309 64.96089282163678, -148.1546971323087 64.96108099143424, -148.1582184182938 64.96128626555287, -148.1620292361697 64.96260715788844, -148.1672635330181 64.96335495461966, -148.1727892764982 64.96311903940619, -148.1809728206329 64.96180335563764, -148.1844446966085 64.96056988131352, -148.1848876919788 64.96045006986554, -148.1873364715422 64.96255566549979, -148.1886712398565 64.9649254705094, -148.1895612093818 64.96650534007927, -148.1900985876013 64.96810893436418, -148.1906662965232 64.96956634039947, -148.191603369725 64.97007991794294, -148.1959102102958 64.97027664121066, -148.1978054136118 64.96994185228147, -148.199281080409 64.96911271441854, -148.2007944264804 64.96810082356313, -148.2017371234153 64.96732556169263, -148.2040386421075 64.96586411138901, -148.2066731947678 64.96489373845753, -148.2099223255953 64.96431436035471, -148.2128187027177 64.96375869256059, -148.2163599284647 64.96344779205543, -148.2186145635052 64.96305242161128, -148.220782868872 64.96265383068283, -148.2243163452876 64.96237929977946, -148.2276396310745 64.96228106387412, -148.2291398463707 64.96259422618346, -148.2295934330614 64.96334749341617, -148.2297506487523 64.96427395565235, -148.2306506883484 64.96497004258924, -148.2327925802428 64.96512270454934, -148.2352217055529 64.96518624985288, -148.2366696387279 64.96785253587478, -148.2367990815065 64.96809087005312, -148.2402036193674 64.97435802561159, -148.2386825868289 64.97560729458451, -148.239508957354 64.97555546037137, -148.23961858348 64.97550091775571, -148.2417614825124 64.97548188690649, -148.2432022923794 64.97522692119873, -148.2443149664529 64.97495986852459, -148.2449653589207 64.97436780624486, -148.2454844881653 64.97377091389347, -148.2463116575907 64.97296135694222, -148.2467222961953 64.97224847476679, -148.2467704109389 64.97172686500272, -148.2484462375842 64.97117562259149, -148.2496482195264 64.97016615986865, -148.2505066364248 64.96921430832384, -148.2513935648908 64.96812301596151, -148.251922689555 64.96715905911492, -148.252401799141 64.96643911649579, -148.2523076258394 64.96613705235012, -148.2520008481829 64.965152998581, -148.2522470194407 64.96436125841274, -148.2518461313468 64.96388994530639, -148.2518315009967 64.96315185848619, -148.2517274514558 64.96244560456262, -148.2511406226268 64.96207281679921, -148.2511797294439 64.96147719352035, -148.2513296659758 64.96074515869617, -148.2506534637945 64.96040420251973, -148.2490794288151 64.95999510147044, -148.2482999733736 64.95973987513787, -148.2479919214059 64.95963900417172, -148.2475446211425 64.95899036142623, -148.2474729558703 64.95853114838292, -148.2496941746203 64.95861286146157, -148.2509676240742 64.95887042163037, -148.2516471292492 64.95892198736067, -148.2523550176438 64.95876706490606, -148.25480858275 64.9577460325375, -148.2569387334316 64.95662729468091, -148.2584837277358 64.9557762879088, -148.2604817259266 64.9547931980585, -148.2622952620025 64.95407049595968, -148.2642207789952 64.95354471096005, -148.2663159797598 64.95349983634588, -148.2674565616418 64.95302202464524, -148.2680631364011 64.9521945395889, -148.2691240810352 64.95177589364732, -148.271238896763 64.95153967328019, -148.2727945177488 64.95130479139829, -148.2744288814764 64.95148267764824, -148.2756123773931 64.95183399595248, -148.2763401584014 64.95247659194064, -148.2759734710919 64.95330308950406, -148.2744004982568 64.95388942720581, -148.2721344703763 64.95431036900305, -148.2708771888278 64.95432028977126, -148.2703607365535 64.95393739264676, -148.2693001966082 64.95395451137438, -148.2676469644307 64.9542858624136, -148.2660163974433 64.9545060406038, -148.2658114546718 64.95486249544308, -148.2662023813976 64.95521281053828, -148.2655213596219 64.95563579804372, -148.2644889095296 64.95592453365362, -148.2637095719587 64.95614247623314, -148.2639175309057 64.95674715458676, -148.2657138447899 64.95769106296871, -148.2672879897818 64.95809999637993, -148.269387397214 64.95796624215984, -148.2706965706012 64.95804934349121, -148.2711048072668 64.95848574597079, -148.2712022128398 64.95922683979876, -148.27151397249 64.95972994651163, -148.271790171916 64.9604073509721, -148.2722634194084 64.96133781687678, -148.2736346765047 64.96233629144842, -148.2756957838781 64.96279808192691, -148.2778280326548 64.96291124547793, -148.2793914173785 64.96296844934778, -148.2814739732564 64.96332558259735, -148.2830444891462 64.96334788893722, -148.284768282542 64.96302458321537, -148.2866849893687 64.96256783104644, -148.2888952933091 64.96229737715322, -148.2896954075225 64.96162420817313, -148.2899536041921 64.96152670699405, -148.2899635236506 64.96152864007047, -148.2924390362464 64.9615839016962, -148.2936689338553 64.96124247796678, -148.2965727224136 64.96082163439502, -148.2972407509296 64.96038945167982, -148.2977654554495 64.9598466815392, -148.2986829634557 64.95900216550331, -148.2989537146446 64.95848525353398, -148.30001885154 64.95813778173755, -148.3017138255953 64.95795373609837, -148.3029222249321 64.95771682422424, -148.3042951466221 64.95748589755289, -148.3049983385316 64.95687937910952, -148.3056475195525 64.95613041676989, -148.3060428048679 64.95540732569833, -148.3054252301704 64.95436639678712, -148.3041797775828 64.95396983847013, -148.3017659466267 64.95402234323552, -148.3009733185006 64.95380783330734, -148.301256199875 64.95372288926694, -148.3003198090124 64.95312881664012, -148.2982891227089 64.95271880143952, -148.298091060956 64.95206765329073, -148.2992883031939 64.95202733109772, -148.3012477380817 64.95246273429728, -148.3033214693872 64.95298626535077, -148.304439814342 64.953334977407, -148.3053917038673 64.95320167764322, -148.30772272162 64.95278264403868, -148.3086997673322 64.95251889959695, -148.3093157887583 64.9527521614142, -148.3123310592483 64.95300237301126, -148.3141195596271 64.95317279150942, -148.3165474093163 64.95305037381343, -148.3177177901738 64.95340898044435, -148.3189869583087 64.95327952064002, -148.3197081542843 64.95323709249385, -148.3201915936472 64.9535161509346, -148.3213444668044 64.95403801477516, -148.3212197047949 64.95494094350852, -148.3213536764206 64.95550769244062, -148.321974209668 64.95612723426603, -148.3238170404954 64.95643997748022, -148.3266635204101 64.95629747464869, -148.327605206278 64.95628193014733, -148.3290006163522 64.95699947606607, -148.3314802976352 64.95846119092352, -148.3326199103597 64.95903442142418, -148.3327216915481 64.96049389019345, -148.3342890995853 64.96189448918966, -148.3364409554671 64.96236438130143, -148.3402520392065 64.96345421861776, -148.3449330924643 64.96449142674982, -148.3483806779464 64.96509197963547, -148.3502456671207 64.96501938842493, -148.3513416559681 64.96449907261712, -148.3524610552092 64.96484744939715, -148.3530638031058 64.96579305904351, -148.3537972405891 64.96589468307121, -148.3533126264502 64.96671188981878, -148.3539871247477 64.96720437246933, -148.3533599999193 64.96727000015193, -148.3498800000459 64.96771000161118, -148.3464500008445 64.96823999851716, -148.3447900015899 64.96853000058024, -148.3400000006164 64.96950000156482, -148.3366000007703 64.97006000044553, -148.3348299995138 64.97023999919702, -148.3311600002308 64.97043000122613, -148.3275299996517 64.97057999931258, -148.3240800004434 64.97095999944179, -148.3209300000275 64.97153000029039, -148.3208900916909 64.97152527761182, -148.3197333183293 64.97187038283028, -148.3194400014854 64.97185000039917, -148.3165000004861 64.97253000063029, -148.3142100003624 64.97340000027123, -148.3131390131606 64.97428978251332, -148.3136603033646 64.97503578368367, -148.3138100002265 64.97525000024524, -148.3157199989112 64.97607000052398, -148.3173927425877 64.97628215435157, -148.3181154158738 64.97710949927301, -148.318506832417 64.97752678315527, -148.3187389443419 64.97826073664947, -148.3191775248066 64.97838722480719, -148.3187036827229 64.9785124478214, -148.3174808822287 64.97901466526673, -148.3183191301726 64.97940472760871, -148.3179133845039 64.98006608334396, -148.3178643739444 64.98039869559773, -148.317717597652 64.98046658639413, -148.3165037173362 64.98102803770149, -148.3158305797883 64.98133936777919, -148.3136403766995 64.98169043855529, -148.3124228974041 64.98159245803612, -148.3106442287358 64.9817736328734, -148.3085689899975 64.9821898415147, -148.3075063283829 64.98248161818384, -148.3074353009211 64.9823643173778, -148.3075113274024 64.98152061988714, -148.307689970643 64.98064034848585, -148.3053761881787 64.98031430947776, -148.3052377492606 64.98037990703784, -148.304154185275 64.98023807737798, -148.3033326487505 64.98101592847075, -148.3035788815629 64.9822540966606, -148.303609042008 64.9829224774785, -148.3029990450748 64.98388363555517, -148.30328332256 64.98452614903402, -148.303235581073 64.98557802025795, -148.3029986141926 64.98634992936718, -148.3001099994984 64.98611999935645, -148.2988772743069 64.9865277226304, -148.298759997075 64.98649000013705, -148.2985074044935 64.98665005257834, -148.2976941778403 64.98716532090884, -148.2961399988037 64.98814999939168, -148.29416000075 64.99019000139481, -148.2919799986993 64.99236999951654, -148.2910500003476 64.99376000064387, -148.2943157993754 64.99484862651326, -148.2946053050727 64.99503986356336, -148.2946899989657 64.99503000042074, -148.296969998431 64.99563999997326, -148.3006600003402 64.99654000158887, -148.3006688655125 64.99656069048336, -148.303190430118 64.99696088445086, -148.3032105912145 64.99718197417303, -148.3038899994737 64.99720999985215, -148.3063199996449 64.99755000127738, -148.3073614236123 64.99776908065252, -148.3077700007926 64.99793999944546, -148.3085600004063 64.99809999949986, -148.3094099961114 64.99820000346284, -148.3121299983457 64.99851999964261, -148.3139300002672 64.99865999969018, -148.3157000002141 64.99879000038925, -148.316639999224 64.99889999977177, -148.3180141624833 64.99914803731269, -148.3194200014786 64.99951999998257, -148.3211799994576 65.00009999887004, -148.3229000000423 65.00068999972541, -148.3241044886974 65.00118402124099, -148.3253100002067 65.00175000008574, -148.3259799997796 65.00217999957709, -148.3273699995973 65.00380999947635, -148.3293199996053 65.00625000030578, -148.3312600002648 65.0080600002662, -148.3343199999953 65.00923999935765, -148.3350104396249 65.00939097184039, -148.335234252156 65.01018466211087, -148.3351465892357 65.01100225914081, -148.3339866936152 65.01174824459508, -148.334658432433 65.01226500464242, -148.3368734105941 65.01244359287676, -148.3390489073719 65.01281770733829, -148.3417658200891 65.01281737992019, -148.3440400975958 65.01270253344023, -148.3452138914596 65.01304038438343, -148.3470812878118 65.01340325923667, -148.3486601947724 65.01365721256769, -148.3506178891056 65.01395763962284, -148.3519985090498 65.01404025375609, -148.3538791959572 65.01433786239636, -148.3545136981701 65.01465620053091, -148.3556942656594 65.01496138169676, -148.35727017478 65.01446004435132, -148.3590641024411 65.0140322045097, -148.361102294477 65.01354747904861, -148.3619877351552 65.01377632857964, -148.3634815618695 65.01445385091068, -148.364793324479 65.01410708764695, -148.3662673162052 65.01333936556028, -148.3668481362573 65.01302032806069, -148.3708081886807 65.01304589286542, -148.3711290400765 65.0134813091617, -148.3721097764455 65.01400898663792, -148.3738183724032 65.01400470138992, -148.3752070520711 65.0136606203352, -148.376363068442 65.01370212385268, -148.3766764533957 65.01407449514028, -148.3768917281725 65.01493578153088, -148.3783168455452 65.0151839028909, -148.3797186062208 65.01477459229397, -148.381435142722 65.01434373103825, -148.382481453077 65.01454539962884, -148.3830196105516 65.01495864186217, -148.3845231733703 65.01481557325218, -148.3849148151772 65.01482634661716, -148.3854207822145 65.01577727746229, -148.387758416432 65.01701172749227, -148.3907954156963 65.01809066440546, -148.3921436592297 65.01856960242435, -148.395929999329 65.02006999976498))



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/5eaa4fb8149a7c10756dafd37eed56fcc3635859...8864c8abb6c01d4c19523201814cd714bc374655

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/5eaa4fb8149a7c10756dafd37eed56fcc3635859...8864c8abb6c01d4c19523201814cd714bc374655
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/3db3cf26/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:10:57 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:10:57 +0000
Subject: [Git][debian-gis-team/asf-search][pristine-tar] pristine-tar data for
 asf-search_12.3.0.orig.tar.gz
Message-ID: <6a775510df808_537faf64431264@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / asf-search


Commits:
07a482d4 by Antonio Valentino at 2026-08-08T16:03:07+00:00
pristine-tar data for asf-search_12.3.0.orig.tar.gz

- - - - -


2 changed files:

- + asf-search_12.3.0.orig.tar.gz.delta
- + asf-search_12.3.0.orig.tar.gz.id


Changes:

=====================================
asf-search_12.3.0.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/asf-search_12.3.0.orig.tar.gz.delta differ


=====================================
asf-search_12.3.0.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+b1225065ece0bba6181cf9231703d44cb763e58b



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/07a482d4a1d2e421768c52d832b67b5d0ef63dc8

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/07a482d4a1d2e421768c52d832b67b5d0ef63dc8
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/941d0fd7/attachment.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:11:05 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:11:05 +0000
Subject: [Git][debian-gis-team/asf-search][upstream] New upstream version
 12.3.0
Message-ID: <6a775519b4e1a_53712e9cc0431316@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / asf-search


Commits:
5ab9bd0a by Antonio Valentino at 2026-08-08T16:03:02+00:00
New upstream version 12.3.0
- - - - -


27 changed files:

- .github/workflows/lint.yml
- .github/workflows/run-pytest-authenticated.yml
- CHANGELOG.md
- asf_search/ASFSearchOptions/validator_map.py
- asf_search/CMR/datasets.py
- asf_search/CMR/subquery.py
- asf_search/Pair.py
- + asf_search/S1MultiBurstProduct.py
- asf_search/SBASNetwork.py
- asf_search/Stack.py
- asf_search/__init__.py
- + asf_search/constants/MATURITIES.py
- asf_search/constants/__init__.py
- asf_search/search/geo_search.py
- asf_search/search/search.py
- asf_search/search/search_count.py
- asf_search/search/search_generator.py
- conftest.py
- examples/SBASNetwork.ipynb
- + examples/SBASNetwork_S1-Multiburst.ipynb
- examples/Stack.ipynb
- pyproject.toml
- setup.py
- + tests/S1MultiBurstProduct/test_S1MultiBurstProduct.py
- tests/SBASNetwork/test_SBASNetwork.py
- tests/yml_tests/test_ASFSearchResults.yml
- tests/yml_tests/test_known_bugs.yml


Changes:

=====================================
.github/workflows/lint.yml
=====================================
@@ -9,4 +9,4 @@ jobs:
       - uses: astral-sh/ruff-action at v3
         with:
           src: './asf_search'
-          version-file: 'pyproject.toml'
\ No newline at end of file
+          version: '0.15.22'
\ No newline at end of file


=====================================
.github/workflows/run-pytest-authenticated.yml
=====================================
@@ -8,7 +8,6 @@ on:
     branches:
       - master
 
-
 jobs:
   run-tests:
     runs-on: ubuntu-latest


=====================================
CHANGELOG.md
=====================================
@@ -25,6 +25,22 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 -
 
 -->
+=======
+## [v12.3.0](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.3...v12.3.0)
+### Added
+- Adds Sentinel-1 multi-burst support to `SBASNetwork` class
+  - Adds multi-burst supporting classes:
+    - S1MultiBurstSceneIDPair
+    - S1MultiBurst
+    - S1MultiBurstGroup
+    - S1MultiBurstProduct
+  - For usage examples, see `examples/SBASNetwork_S1-Multiburst.ipynb`
+- Updates `SBASNetwork.add_pairs()` and `SABANetork.remove_pairs()` to take either Pair objects or tuples of date pair strings.
+- Parameter for filtering NISAR products based off of data maturity.
+```python
+asf.search_count(dataMaturity=asf.constants.MATURITIES.BETA, dataset=asf.constants.DATASET.NISAR)
+```
+
 ------
 ## [v12.2.3](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.2...v12.2.3)
 ### Added
@@ -38,7 +54,7 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 ------
 ## [v12.2.1](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.0...v12.2.1)
 ### Fixed
-- Fixes optinal dependency `pandas` causing import error in `SBASNetwork` class
+- Fixes optional dependency `pandas` causing import error in `SBASNetwork` class
 
 ------
 ## [v12.2.0](https://github.com/asfadmin/Discovery-asf_search/compare/v12.1.1...v12.2.0)
@@ -64,6 +80,11 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 - `OPERA_L3_DIST-ALERT-S1_V1` shortname/collections added
 - Add `NISAR_EA` shortname/collections to NISAR dataset (available to authorized users)
 
+------
+## [v12.0.8](https://github.com/asfadmin/Discovery-asf_search/compare/v12.0.7...v12.0.8)
+### Added
+- `Sentinel-1D` constants and search support
+
 ------
 ## [v12.0.7](https://github.com/asfadmin/Discovery-asf_search/compare/v12.0.6...v12.0.7)
 ### Added


=====================================
asf_search/ASFSearchOptions/validator_map.py
=====================================
@@ -44,6 +44,7 @@ validator_map = {
     'bbox': parse_bbox,
     'beamMode': parse_string_list,
     'beamSwath': parse_string_list,
+    'dataMaturity': parse_string_list,
     'campaign': parse_string,
     'circle': parse_circle,
     'linestring': parse_linestring,


=====================================
asf_search/CMR/datasets.py
=====================================
@@ -1994,6 +1994,24 @@ collections_by_processing_level = {
 
 # Helper Methods
 
+def get_nisar_collection_by_maturity(maturities: List[str]):
+    collections = {
+        'BETA': [],
+        'PROVISIONAL': [],
+        'VALIDATED': []
+    }
+
+    for short_name, maturity_collection in dataset_collections['NISAR'].items():
+        if 'BETA' in short_name:
+            collections['BETA'].extend(maturity_collection)
+        elif 'PROVISIONAL' in short_name:
+            collections['PROVISIONAL'].extend(maturity_collection)
+        elif short_name.endswith('V1'):
+            collections['VALIDATED'].extend(maturity_collection)
+    try:
+        return sum([collections[maturity.upper()] for maturity in maturities],[])
+    except KeyError:
+        raise ValueError(f'Invalid maturity option provided valid options are: {", ".join(collections.keys())}' )
 
 def get_concept_id_alias(param_list: List[str], collections_dict: dict) -> List[str]:
     """


=====================================
asf_search/CMR/subquery.py
=====================================
@@ -10,6 +10,7 @@ from asf_search.CMR.datasets import (
     collections_per_platform,
     get_concept_id_alias,
     get_dataset_concept_ids,
+    get_nisar_collection_by_maturity
 )
 from numpy import intersect1d, union1d
 
@@ -128,12 +129,13 @@ def get_keyword_concept_ids(params: dict, use_collection_alias: bool = True, inc
         if alias_processing_levels and alias_platforms and not len(collections):
             # processingLevel isn't part of the given platform. Drop aliased keywords so we don't search on zero collections
             aliased_keywords = []
-            
+
     if 'dataset' in params.keys():
         aliased_keywords.append('dataset')
         dataset_concept_ids = get_dataset_concept_ids(params.get('dataset'))
         collections = _get_intersection(dataset_concept_ids, collections)
-
+    if 'dataMaturity' in params.keys():
+        collections = _get_intersection(get_nisar_collection_by_maturity(params.get('dataMaturity')), collections)
     return collections, aliased_keywords
 
 


=====================================
asf_search/Pair.py
=====================================
@@ -1,7 +1,9 @@
 import importlib.util
 import math
+from typing import Union
 
 from .ASFProduct import ASFProduct
+from .S1MultiBurstProduct import S1MultiBurstProduct
 from .baseline import calculate_perpendicular_baselines
 from .exceptions import CoherenceEstimationError
 import pytz
@@ -27,8 +29,7 @@ except ImportError:
 
 class Pair:
     """
-    A Pair is comprised of a reference scene and a secondary scene. These scenes typically intersect geographically,
-    but that is not a requirement. When a pair is created, its perpendicular and temporal baselines are calculated
+    A Pair is comprised of a reference scene and a secondary scene. When a pair is created, its perpendicular and temporal baselines are calculated
     and stored in the self.perpendicular_baseline and self.temporal_baseline member variables.
 
     Two pairs are equivalent if they have matching reference and secondary dates
@@ -36,19 +37,30 @@ class Pair:
     ref: ASFProduct for reference scene
     sec: ASFProduct for secondary scene
     """
-    def __init__(self, ref: ASFProduct, sec: ASFProduct):
-        self.ref = ref
-        self.sec = sec
-        self.id = (ref.properties['sceneName'], sec.properties['sceneName'])
-
-        self.perpendicular_baseline = calculate_perpendicular_baselines(
-            ref.properties['sceneName'], 
-            [sec, ref])[0].properties['perpendicularBaseline']
+    def __init__(self, 
+            ref: Union[ASFProduct, S1MultiBurstProduct], 
+            sec: Union[ASFProduct, S1MultiBurstProduct]):
+        
 
-        self.ref_time = parse_datetime(ref.properties["startTime"])
+        self.ref = ref
+        self.sec = sec          
+        
+        self.id = (self.ref.properties['sceneName'], self.sec.properties['sceneName'])
+        if isinstance(ref, ASFProduct) and isinstance(sec, ASFProduct):
+            self.perpendicular_baseline = calculate_perpendicular_baselines(
+                self.ref.properties['sceneName'], 
+                [self.sec, self.ref])[0].properties['perpendicularBaseline']
+            
+        elif isinstance(ref, S1MultiBurstProduct) and isinstance(sec, S1MultiBurstProduct):
+            perpendicular_baselines = [calculate_perpendicular_baselines(ref.properties['sceneName'], [sec, ref])[0].properties['perpendicularBaseline'] 
+                                       for ref, sec in zip(self.ref.geo_reference_bursts, self.sec.geo_reference_bursts)]
+            # Use the largest burst perpendicular baseline to represent the S1MultiBurstProduct
+            self.perpendicular_baseline = max((x for x in perpendicular_baselines if x is not None), default=None)
+
+        self.ref_time = parse_datetime(self.ref.properties["startTime"])
         if self.ref_time.tzinfo is None:
             self.ref_time = pytz.utc.localize(self.ref_time)
-        self.sec_time = parse_datetime(sec.properties["startTime"])
+        self.sec_time = parse_datetime(self.sec.properties["startTime"])
         if self.sec_time.tzinfo is None:
             self.sec_time = pytz.utc.localize(self.sec_time)
 


=====================================
asf_search/S1MultiBurstProduct.py
=====================================
@@ -0,0 +1,294 @@
+from collections import defaultdict
+from dataclasses import dataclass
+from datetime import timedelta
+from typing import List, Literal, Optional
+
+from asf_search import ASF_LOGGER
+from .ASFProduct import ASFProduct
+from asf_search.ASFSearchOptions import ASFSearchOptions
+from .search import geo_search, search
+from .ASFSearchResults import ASFSearchResults
+from .baseline import get_baseline_from_stack
+
+try:
+    from ciso8601 import parse_datetime
+except ImportError:
+    from dateutil.parser import parse as parse_datetime
+
+Subswath = Literal["IW1", "IW2", "IW3"]
+
+
+ at dataclass(frozen=True)
+class S1MultiBurst:
+    """
+    Represents a Sentinel-1 burst and which subswaths it should include.
+    """
+    relative_burst_id: str
+    subswaths: tuple[Subswath, ...]
+
+
+ at dataclass(frozen=True)
+class S1MultiBurstGroup:
+    """
+    Represents a group of S1MultiBursts to be processed together.
+    """
+    bursts: list[S1MultiBurst]
+
+    def __post_init__(self):
+        self.check_group_validity()
+
+    def check_group_validity(self) -> None:
+        """Check that the burst group is valid.
+
+        Temporarily borrowed (edited) from burst2safe, until validation logic moves to its own package.
+        https://github.com/ASFHyP3/burst2safe/blob/develop/src/burst2safe/safe.py#L83
+
+        A valid burst group must:
+        - Have the same acquisition mode
+        - Be from the same absolute orbit
+        - Be contiguous in time and space
+
+        Args:
+            burst_infos: A list of BurstInfo objects
+        """
+        group_size = sum(len(burst.subswaths) for burst in self.bursts)
+        if group_size > 15:
+            raise ValueError("An S1MultiBurstGroup may include no more than 15 burst/subswath combinations")
+
+        swaths = sorted(list(set([int(subswath[2]) for burst in self.bursts for subswath in burst.subswaths])))
+
+        burst_range: dict[str, tuple[int, int]] = {}
+        for swath in swaths:
+            burst_subset = [burst for burst in self.bursts if f"IW{swath}" in burst.subswaths]
+
+
+            if not burst_subset:
+                burst_range[swath] = (0, 0)
+                continue
+
+            self.check_burst_group_validity(burst_subset, swath)
+
+            burst_ids = [int(info.relative_burst_id.split("_")[1]) for info in burst_subset]
+            burst_range[swath] = (min(burst_ids), max(burst_ids))
+
+        if len(swaths) <= 1:
+            return
+
+        for swath1, swath2 in zip(swaths, swaths[1:]):
+            min_diff = burst_range[swath1][0] - burst_range[swath2][0]
+            if abs(min_diff) > 1:
+                raise ValueError(f'Products from swaths {swath1} and {swath2} do not overlap')
+
+            max_diff = burst_range[swath1][1] - burst_range[swath2][1]
+            if abs(max_diff) > 1:
+                raise ValueError(f'Products from swaths {swath1} and {swath2} do not overlap')
+                     
+    def check_burst_group_validity(self, burst_subset, swath):
+        """Check that the burst group is valid.
+
+        Temporarily borrowed (edited) from burst2safe, until validation logic moves to its own package.
+        https://github.com/ASFHyP3/burst2safe/blob/develop/src/burst2safe/safe.py#L83
+
+        The burst group must:
+        - Not contain duplicate granules
+        - Have the same absolute orbit
+        - Have consecutive burst IDs
+
+        Args:
+            burst_infos: A list of BurstInfo objects
+        """
+        granules = [f"{burst.relative_burst_id}_IW{swath}" for burst in burst_subset]
+
+        duplicates = list(set([x for x in granules if granules.count(x) > 1]))
+        if duplicates:
+            raise ValueError(f'Found duplicate granules: {duplicates}.')
+
+        orbits = set([granule.split("_")[0] for granule in granules])
+        if len(orbits) != 1:
+            raise ValueError(f'All bursts must have the same absolute orbit. Found: {orbits}.')
+
+        burst_ids = [int(burst.split('_')[1]) for burst in granules]
+        burst_ids.sort()
+        if burst_ids != list(range(min(burst_ids), max(burst_ids) + 1)):
+            raise ValueError(f'All bursts must have consecutive burst IDs. Found: {burst_ids}.')
+
+
+class S1MultiBurstProduct():
+    """
+    Represents a group of Sentinel-1 bursts. 
+     
+    member variables:
+    - multiburst_group (S1MultiBurstGroup): Represents the geographical area with burst and subswath IDs
+    - geo_reference_bursts (list of ASFProducts): A list of geographic reference burst ASFProducts
+
+    An S1MultiBurstProduct can be initialized from either a multiburst_group and start_date or a geo_reference_bursts list.
+    When creating a S1MultiBurstProduct from a S1MultiBurstGroup, a geographic search is performed to identify geographic
+    reference products with acquisition dates as near as possible to the start_date. 
+
+    ### multiburst_group example ###
+
+    multiburst_group = asf.S1MultiBurstGroup(
+        bursts=[
+        S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+        S1MultiBurst("173_370306", ("IW1", "IW2", "IW3")),
+        S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+        ])
+
+    start_date = '2023-01-01'
+    multiburst = asf.S1MultiBurstProduct(multiburst_group, start_date)
+
+    ### geo_reference_bursts example ###
+
+    multiburst = asf.S1MultiBurstProduct([burst_product_1, burst_product_2, burst_product_3, ...])
+    
+    """
+    def __init__(
+        self,
+        multiburst_group: S1MultiBurstGroup = None,
+        start_date: str = None,
+        geo_reference_bursts: List[ASFProduct] = None   
+    ):
+        self.start_date=start_date
+        if not multiburst_group and not geo_reference_bursts:
+            raise ValueError("Provide multiburst_group or geo_reference_bursts")
+        
+        if not geo_reference_bursts:
+            self.geo_reference_bursts = self.identify_geo_reference_bursts(multiburst_group)
+        else:
+            self.geo_reference_bursts = geo_reference_bursts
+
+        if not multiburst_group:
+            self.multiburst_group = self.identify_multiburst_group(geo_reference_bursts)
+        else:
+            self.multiburst_group = multiburst_group
+
+        start_time = max([p.properties["startTime"] for p in self.geo_reference_bursts])
+        stop_time = max([p.properties["stopTime"] for p in self.geo_reference_bursts])
+        self.id = self._build_scene_name(start_time)
+        self.properties = {
+            "sceneName": self.id,
+            "startTime": start_time,
+            "stopTime": stop_time,
+        }
+
+    def __repr__(self) -> str:
+        return f"S1MultiBurstProduct({self.id})"
+
+    def __eq__(self, other):
+        if not isinstance(other, S1MultiBurstProduct):
+            return NotImplemented
+        return self.id == other.id
+    
+    def __hash__(self):
+        return hash(self.id)
+
+    def __len__(self):
+        return len(self.geo_reference_bursts)
+    
+    def identify_geo_reference_bursts(self, multiburst_group: S1MultiBurstGroup) -> List[ASFProduct]:
+        """
+        Returns one geographic reference product for each burst/subswath in multiburst_group,
+        from the earliest acquisition date with complete coverage.
+
+        There is no guarantee that the returned products will fall on self.start_date; they will
+        fall on the first available date on or after self.start_date.
+        """
+        relative_burst_ids = [
+            f"{burst.relative_burst_id}_{subswath}"
+            for burst in multiburst_group.bursts
+            for subswath in burst.subswaths
+        ]
+
+        results = geo_search(
+            fullBurstID=relative_burst_ids,
+            polarization="VV",
+            start=self.start_date,
+            end=str(
+                (parse_datetime(self.start_date) + timedelta(days=48)).date()
+            ),
+        )
+
+        products_by_date = {}
+
+        for result in results:
+            acquisition_date = parse_datetime(
+                result.properties["startTime"]
+            ).date()
+
+            full_burst_id = result.properties["burst"]["fullBurstID"]
+
+            products_by_date.setdefault(acquisition_date, {})[full_burst_id] = result
+
+        for acquisition_date in sorted(products_by_date):
+            products = products_by_date[acquisition_date]
+
+            if set(relative_burst_ids) <= products.keys():
+                return [products[burst_id] for burst_id in relative_burst_ids]
+
+        raise ValueError(
+            "No acquisition date contains all requested burst/subswath "
+            f"combinations: {relative_burst_ids}"
+        )
+
+    def identify_multiburst_group(self, geo_reference_bursts):
+        """
+        Returns an S1MultiBurstGroup corresponding to the list of geo_reference_bursts
+        """
+        relative_burst_ids = sorted(set([f'{p.properties["pathNumber"]}_{p.properties["burst"]["relativeBurstID"]}' for p in geo_reference_bursts]))
+        burst_group_dict = {burst_id: [] for burst_id in relative_burst_ids}
+        for p in geo_reference_bursts:
+            burst_id = f'{p.properties["pathNumber"]}_{p.properties["burst"]["relativeBurstID"]}'
+            burst_group_dict[burst_id].append(p.properties["burst"]["subswath"])
+
+        multibursts = [S1MultiBurst(k, v) for k, v in burst_group_dict.items()]
+        return S1MultiBurstGroup(bursts=multibursts)
+    
+    def _build_scene_name(self, start_time):
+        start_time = "".join(start_time.split("T")[0].split("-"))
+        id = ""
+        for multiburst in self.multiburst_group.bursts:
+            id = f"{id}_{multiburst.relative_burst_id}_IW"
+            for subswath in multiburst.subswaths:
+                id = f"{id}{subswath[2]}"
+        return f"{id[1:]}_{start_time}"
+
+    def stack(self, opts: Optional[ASFSearchOptions] = None) -> List[ASFSearchResults]:
+        """
+        Builds a baseline stack for each burst product in self.geo_reference_bursts.
+
+        opts: An ASFSearchOptions object describing the search parameters to be used.
+
+        Returns: A list of asf_search.ASFSearchResults, each containing the stack for 
+                 a burst ASFProduct in self.geo_reference_bursts, with the addition of baseline 
+                 values (temporal, perpendicular) attached to each burst ASFProduct.
+        """
+        full_burst_id_list = [burst.properties["burst"]["fullBurstID"] for burst in self.geo_reference_bursts]
+
+        stack_opts = self.geo_reference_bursts[0].get_stack_opts()
+        stack_opts.fullBurstID = full_burst_id_list
+
+        opts.merge_args(**dict(stack_opts))
+
+        combined_results = search(opts=opts)
+
+        grouped = defaultdict(list)
+
+        for product in combined_results:
+            full_burst_id = product.properties["burst"]["fullBurstID"]
+            grouped[full_burst_id].append(product)
+
+        split_results = {
+            burst_id: ASFSearchResults(products)
+            for burst_id, products in grouped.items()
+        }
+
+        stack_search_results = []
+
+        for p in self.geo_reference_bursts:
+            full_burst_id = p.properties["burst"]["fullBurstID"]
+            stack, _ = get_baseline_from_stack(reference=p, stack=split_results[full_burst_id])
+            stack.sort(key=lambda product: product.properties['temporalBaseline'])
+            stack_search_results.append(stack)
+
+        return stack_search_results
+    
\ No newline at end of file


=====================================
asf_search/SBASNetwork.py
=====================================
@@ -1,9 +1,12 @@
 from datetime import datetime, timedelta
+from itertools import combinations
 import importlib.util
 import numpy as np
-from typing import Optional, List, Dict, Tuple, Union
+from typing import Optional, List, Dict, Tuple, Union, NamedTuple
 
+from asf_search import ASF_LOGGER
 from .ASFProduct import ASFProduct
+from .S1MultiBurstProduct import S1MultiBurstProduct
 from .Pair import Pair
 from .Stack import Stack
 from .ASFSearchOptions import ASFSearchOptions
@@ -30,23 +33,37 @@ except ImportError:
     sample_colorscale = None
     pd = None
 
+class S1MultiBurstSceneIDPair(NamedTuple):
+    """
+    Defines a named tuple of lists of reference and secondary ASFProducts ID strings
+    for Pairs of S1MultiBurstProducts
+
+    This is useful when ordering S1 multi-burst interferograms from HyP3
+    """
+    reference: List[str]
+    secondary: List[str]
 class SBASNetwork(Stack):
     """
     SBASNetwork is a child class of Stack, used to create seasonal SBAS networks. It can be used
     to create multiannual networks connected with multiannual bridge pairs.
+
+    Construct using:
+    - SBASNetwork.from_geo_reference()
+    - SBASNetwork.from_search_results()
     """
     def __init__(
         self,
-        geo_reference: ASFProduct = None,
-        start_date: str = None,
-        end_date: str = None,
-        season: Tuple[int] = (1, 365),
-        perpendicular_baseline: Optional[int] = 400,
-        inseason_temporal_baseline: Optional[int] = 36,
-        bridge_year_threshold: Optional[int] = 1,
+        geo_reference: Union[ASFProduct, S1MultiBurstProduct],
+        *,
+        start_date: Optional[str] = None,
+        end_date: Optional[str] = None,
+        season: Tuple[int, int] = (1, 365),
+        perpendicular_baseline: int = 400,
+        inseason_temporal_baseline: int = 36,
+        bridge_year_threshold: int = 0,
         bridge_target_date: Optional[str] = None,
-        opts: Optional[ASFSearchOptions] = ASFSearchOptions(),
-        allow_missing_state_vectors: Optional[bool] = False
+        opts: Optional[ASFSearchOptions] = None,
+        allow_missing_state_vectors: bool = False
     ):
         """
         geo_reference: an ASFProduct used as a georeference scene for the network
@@ -55,65 +72,92 @@ class SBASNetwork(Stack):
         bridge_year_threshold: the number of year for which to allow multiannual bridging
         bridge_target_date: %m-%d string of the inseason bridge date to target. 
                             Reference scenes for bridge pairs are valid within an inseason_temporal_baseline of this date.
-        opts: ASFSearchOptions to limit the size of your SBASNetwork and define seasons
-              Recommended to include: "start", "end", "season"
+        opts:  Additional ASFSearchOptions used for the stack search. Explicit start_date and end_date arguments 
+               override corresponding values in opts. The opts season value is always overriden by the season argument.
         """
-        self.season = season
-        if bridge_target_date:
-            self.bridge_target_date = bridge_target_date
-        else:
-            self.bridge_target_date = self.season[0]
         self.start_date = start_date
         self.end_date = end_date
-        self.perpendicular_baseline = perpendicular_baseline
-        self.inseason_temporal_baseline = inseason_temporal_baseline
-        self.bridge_year_threshold = bridge_year_threshold
-        opts.merge_args(
-            start=self.start_date,
-            end=self.end_date,
-            season=self.season,
-        )
-        self.opts = opts
-        self.allow_missing_state_vectors = allow_missing_state_vectors
+        self._set_network_parameters(
+            season=season, 
+            perpendicular_baseline=perpendicular_baseline, 
+            inseason_temporal_baseline=inseason_temporal_baseline, 
+            bridge_year_threshold=bridge_year_threshold,
+            bridge_target_date=bridge_target_date,
+            allow_missing_state_vectors=allow_missing_state_vectors
+            )
 
-        self.temporal_baseline = (bridge_year_threshold * 365) + inseason_temporal_baseline
+        if opts is None:
+            opts = ASFSearchOptions()
+
+        merge_kwargs = {"season": self.season}
+
+        if self.start_date is not None:
+            merge_kwargs["start"] = self.start_date
+
+        if self.end_date is not None:
+            merge_kwargs["end"] = self.end_date
+
+        opts.merge_args(**merge_kwargs)
+        self.opts = opts
 
         super().__init__(
             geo_reference=geo_reference, 
             opts=self.opts,
             allow_missing_state_vectors = self.allow_missing_state_vectors
             )
-
         self._build_sbas_network()
+        self.geo_reference = self.subset_stack[0].ref # must reset here because ref object is replaced with a duplicate when building full stack
+
+    @classmethod
+    def from_geo_reference(
+        cls,
+        geo_reference: Union[ASFProduct, S1MultiBurstProduct],
+        **kwargs,
+    ):
+        """
+        Class constructor using a geo_reference ASFProduct or S1MultiBurstProduct
+        """
+        if not isinstance(geo_reference, (ASFProduct, S1MultiBurstProduct)):
+            raise TypeError(
+                f"Unsupported geo_reference type: {type(geo_reference).__name__}"
+            )
+
+        return cls(geo_reference=geo_reference, **kwargs)
 
     @classmethod
     def from_search_results(
         cls,
         stack_search_results: ASFSearchResults,
-        season: Tuple[int] = (1, 365),
-        perpendicular_baseline: Optional[int] = 400,
-        inseason_temporal_baseline: Optional[int] = 36,
-        bridge_year_threshold: Optional[int] = 1,
+        season: Tuple[int, int] = (1, 365),
+        perpendicular_baseline: int = 400,
+        inseason_temporal_baseline: int = 36,
+        bridge_year_threshold: int = 1,
         bridge_target_date: Optional[str] = None,
-        allow_missing_state_vectors: Optional[bool] = False
+        allow_missing_state_vectors: bool = False
     ):
         """
-        Alternate class method constructor using ASFSearchResults instead of a single geo_reference.
+        Class constructor using ASFSearchResults instead of a single geo_reference.
         """
-        obj = cls.__new__(cls)
+        if not stack_search_results:
+            raise ValueError("stack_search_results cannot be empty")
 
-        obj.season = season
-        if bridge_target_date:
-            obj.bridge_target_date = bridge_target_date
-        else:
-            obj.bridge_target_date = obj.season[0]
+        # Intentionally bypass __init__ and Stack.__init__:
+        # search results are already available, so no stack search
+        # or ASFSearchOptions are needed
+        obj = cls.__new__(cls)
         dates = [parse_datetime(product.properties["startTime"]).date() for product in stack_search_results]
         obj.start_date = str(min(dates))
         obj.end_date = str(max(dates))
-        obj.perpendicular_baseline = perpendicular_baseline
-        obj.inseason_temporal_baseline = inseason_temporal_baseline
-        obj.bridge_year_threshold = bridge_year_threshold
-        obj.allow_missing_state_vectors = allow_missing_state_vectors
+
+        obj._set_network_parameters(
+            season=season, 
+            perpendicular_baseline=perpendicular_baseline, 
+            inseason_temporal_baseline=inseason_temporal_baseline, 
+            bridge_year_threshold=bridge_year_threshold,
+            bridge_target_date=bridge_target_date,
+            allow_missing_state_vectors=allow_missing_state_vectors
+            )
+        
         obj.full_stack = obj._build_full_stack(stack_search_results)
         obj._remove_list = []
         obj.subset_stack = obj._get_subset_stack()
@@ -123,7 +167,52 @@ class SBASNetwork(Stack):
         obj._build_sbas_network()
 
         return obj
+    
+    def _set_network_parameters(
+        self,
+        season: Tuple[int, int],
+        perpendicular_baseline: int,
+        inseason_temporal_baseline: int,
+        bridge_year_threshold: int,
+        bridge_target_date: Optional[str],
+        allow_missing_state_vectors: bool,
+    ) -> None:
+        self.season = season
+        if bridge_target_date is not None:
+            self.bridge_target_date = bridge_target_date
+        elif self.start_date is not None:
+            year = parse_datetime(self.start_date).year
+            self.bridge_target_date = datetime.strptime(
+                f"{year}-{season[0]}",
+                "%Y-%j",
+            ).strftime("%m-%d")
+        else:
+            raise ValueError(
+                "start_date is required when bridge_target_date is not provided"
+    )
 
+        self.perpendicular_baseline = perpendicular_baseline
+        self.inseason_temporal_baseline = inseason_temporal_baseline
+        self.bridge_year_threshold = bridge_year_threshold
+        self.allow_missing_state_vectors = allow_missing_state_vectors
+        self.temporal_baseline = (
+            bridge_year_threshold * 365
+            + inseason_temporal_baseline
+        )
+    
+    def _full_stack_pair_is_valid(self, pair: Pair) -> bool:
+        perpendicular_baseline = pair.perpendicular_baseline
+
+        if perpendicular_baseline is None and not self.allow_missing_state_vectors:
+            return False
+
+        if perpendicular_baseline is not None and abs(perpendicular_baseline) > self.perpendicular_baseline:
+            return False
+
+        maximum_temporal_baseline = self.inseason_temporal_baseline + self.bridge_year_threshold * 365
+
+        return pair.temporal_baseline.days <= maximum_temporal_baseline
+       
     def _build_full_stack(self, stack_search_results: Optional[ASFSearchResults]=None) -> List[Pair]:
         """
         Create self._full_stack, which involves performing a stack search
@@ -131,35 +220,45 @@ class SBASNetwork(Stack):
 
         Overrides Stack._build_full_stack() to naively exclude pairs based on self.perpendicular_baseline,
         self.inseason_temporal_baseline, and self.bridge_year_threshold. This is done for efficiency, to
-        avoid build massive full_stacks. More targeted occures in self._build_sbas_network()
+        avoid build massive full_stacks. More targeted filtering occures in self._build_sbas_network()
 
         stack_search_results: (Optional) ASFSearchResults from an ASFProduct.stack search
 
         Returns: A list of pairs filtered by baselines, and including every possible bridge pair within 
-                 self.bridge_year_threshold
+                    self.bridge_year_threshold
         """
-        if stack_search_results is None: 
+        if stack_search_results is None:
             stack_search_results = self.geo_reference.stack(opts=self.opts)
 
-        if self.allow_missing_state_vectors:
-             full_stack = [
-                Pair(p1, p2)
-                for i, p1 in enumerate(stack_search_results)
-                for p2 in stack_search_results[i+1:]
-                if (Pair(p1, p2).perpendicular_baseline is None
-                or Pair(p1, p2).perpendicular_baseline <= self.perpendicular_baseline)
-                and Pair(p1, p2).temporal_baseline.days <= self.inseason_temporal_baseline + (self.bridge_year_threshold * 365)
-            ]
-        else:
-            full_stack = [
-                Pair(p1, p2)
-                for i, p1 in enumerate(stack_search_results)
-                for p2 in stack_search_results[i+1:]
-                if Pair(p1, p2).perpendicular_baseline is not None
-                and Pair(p1, p2).perpendicular_baseline <= self.perpendicular_baseline
-                and Pair(p1, p2).temporal_baseline.days <= self.inseason_temporal_baseline + (self.bridge_year_threshold * 365)
-            ]
-        return full_stack
+            if isinstance(self.geo_reference, S1MultiBurstProduct):
+                multiburst_dict = {}
+                for results in stack_search_results:
+                    for p1, p2 in combinations(results, 2):
+                        key = (parse_datetime(p1.properties["startTime"]).date(), parse_datetime(p2.properties["startTime"]).date())
+                        if self._full_stack_pair_is_valid(Pair(p1, p2)):
+                                multiburst_dict.setdefault(key, [[], []])
+                                multiburst_dict[key][0].append(p1)
+                                multiburst_dict[key][1].append(p2) 
+                
+                full_stack = []
+                for product_lists in multiburst_dict.values():
+                    # skip pairs that don't contain a product for every burst/subswath
+                    if len(product_lists[0]) == len(self.geo_reference):
+                        pair = Pair(
+                            S1MultiBurstProduct(geo_reference_bursts=product_lists[0]), 
+                            S1MultiBurstProduct(geo_reference_bursts=product_lists[1])
+                            )
+                        full_stack.append(pair)
+                return self._sort_pair_list(full_stack)
+    
+        full_stack = []
+        for p1, p2 in combinations(stack_search_results, 2):
+            pair = Pair(p1, p2)
+            if self._full_stack_pair_is_valid(pair):
+                full_stack.append(pair)
+
+        return self._sort_pair_list(full_stack)
+
 
     def _is_valid_bridge_pair(self, pair: Pair) -> bool:
         """
@@ -180,7 +279,6 @@ class SBASNetwork(Stack):
                 datetime.strptime(f"{self.bridge_target_date}-{pair.ref_time.year}", "%m-%d-%Y") 
                 - pair.ref_time.replace(tzinfo=None)).days
             )
-        
         half_inseason_temporal_baseline = self.inseason_temporal_baseline / 2
 
         # Create lists of valid secondary scene date ranges.
@@ -207,6 +305,35 @@ class SBASNetwork(Stack):
                 remove_list.append(pair)
         self.remove_list = remove_list
 
+    def get_scene_ids(
+            self,
+            pair_list: Optional[List[Pair]] = None
+            ) -> Union[List[Tuple[List[str], List[str]]], List[Tuple[str, str]]]:
+        """
+        Overrides Stack.get_scene_ids
+
+        Provides scene names for all asf_search.ASFProducts in a list of Pairs.
+        Useful when ordering pair-based products from ASF HyP3 On-Demand Processing.
+
+        If no pair_list is passed, defaults to the largest connected substack
+
+        pair_list: (Optional) A list of `Pair`s for which to retrieve scene IDs.
+        
+        Returns: If the SBASNetwork is comprised of S1MultiBurstProducts, returns a list of tuples of lists. 
+                 Each tuple contains a list of reference scene IDs and a list of secondary scene IDs for a 
+                 Pair of S1MultiBurstProducts. If not an S1MultiBurstProducts SBASNetwork, defaults 
+                 to using Stack.get_scene_ids
+        """
+        if pair_list is None:
+            pair_list = max(self.connected_substacks, key=len)
+
+        if pair_list and isinstance(pair_list[0].ref, S1MultiBurstProduct):
+            return [S1MultiBurstSceneIDPair([p.properties["sceneName"] for p in pair.ref.geo_reference_bursts],
+                     [p.properties["sceneName"] for p in pair.sec.geo_reference_bursts])
+                     for pair in pair_list]
+
+        return super().get_scene_ids(pair_list)
+
     def add_digraph_edge_traces(self, digraph, largest_network, pair_lists, node_positions):
         """
         Used for SBASNetwork plotting. Adds networkx traces to graph edges
@@ -397,7 +524,7 @@ class SBASNetwork(Stack):
             )
         return plot_header_text
 
-    def plot(self, pair_list: Optional[Union[List[Pair], None]] = None):
+    def plot(self, pair_list: Optional[List[Pair]] = None):
         """
         Plot the SBAS network(s). Accepts a pair_list or a list of pair_lists.
         The largest network is plotted in blue; others are plotted in distinct colors.
@@ -431,7 +558,7 @@ class SBASNetwork(Stack):
         edge_traces = self.add_digraph_edge_traces(G, largest_network, pair_lists, (node_x_positions, node_y_positions))
         node_traces, unused_slcs_traces = self.add_digraph_node_traces(G, plot_geo_ref, pair_lists, (node_x_positions, node_y_positions))
 
-        start_date, end_date = get_pair_lists_date_range(pair_lists)
+        start_date, end_date = get_pair_lists_date_range([self.full_stack])
         date_range = (
             pd.date_range(
                 start=start_date,
@@ -476,26 +603,6 @@ class SBASNetwork(Stack):
         )
         fig.show()
 
-    def get_pair_from_dates(self, pair_list: List[Pair],
-                                ref_date: datetime.date, sec_date: datetime.date) -> Pair:
-        """
-        This convenience method allows for the retrieval of a Pair object from a list
-        of Pairs by reference and secondary date. This is usefull when identifying a 
-        Pair object for removal or addition to an SBASNetwork.subset_stack
-
-        This method is included in SBASNetwork and not Stack because we only care about
-        dates in SBASNetwork and Stack is aware of datetimes.
-
-        pair_list: a list of Pairs from which to find a Pair object
-        ref_date: a datetime.date of a target Pair's reference scene
-        sec_date: a datetime.date of a target Pair's secondary scene
-
-        Returns: A Pair with a corresponding ref_date and sec_date
-        """
-        for pair in pair_list:
-            if pair.ref_time.date() == ref_date and pair.sec_time.date() == sec_date:
-                return pair
-
 def get_n_colors(n: int, colorscale: str="Rainbow", alpha: float=0.4) -> List[str]:
     """
     Used for SBASNetwork plotting. Creates an n-length list of rgba colors from a plotly colorscale
@@ -613,4 +720,4 @@ def julian_to_month_day(ref_product: ASFProduct, julian_tuple: Tuple[int, int])
     for day in julian_tuple:
         date = datetime(year, 1, 1) + timedelta(days=day - 1)
         month_day.append(date.strftime("%m-%d"))
-    return tuple(month_day)
\ No newline at end of file
+    return tuple(month_day)        


=====================================
asf_search/Stack.py
=====================================
@@ -1,14 +1,35 @@
 from collections import defaultdict, deque
 from copy import copy
-from typing import Optional, List, Tuple, Union
+from datetime import date, timedelta
+from typing import Optional, List, Tuple, Union, NamedTuple
 import warnings
 
+from .search import geo_search
 from .ASFProduct import ASFProduct
+from .S1MultiBurstProduct import S1MultiBurstProduct
 from .Pair import Pair
 from .ASFSearchOptions import ASFSearchOptions
 from .ASFSearchResults import ASFSearchResults
 from .warnings import PairNotInFullStackWarning
 
+try:
+    from ciso8601 import parse_datetime
+except ImportError:
+    from dateutil.parser import parse as parse_datetime
+
+DatePair = Tuple[str, str]
+PairInput = Union[Pair, DatePair]
+
+class SceneIDPair(NamedTuple):
+    """
+    Defines a named tuple of reference and secondary ASFProducts ID strings
+    for Pairs of ASFProducts
+
+    This is useful when ordering interferograms from HyP3
+    """
+    reference: str
+    secondary: str
+
 class Stack:
     """
     A Stack object contains 4+ lists of Pair objects. Each Pair contains a pair of asf_search.ASFProduct objects.
@@ -29,6 +50,24 @@ class Stack:
     - Stack.get_scene_ids(): A convenience method that returns a given list of Pairs as a list of tuples of asf_search.ASFProduct
       product IDs, which is useful when ordering on-demand processing via ASF's HyP3 or HyP3+ services.
     """
+
+
+    @property
+    def scene_ids(self) -> List[Tuple[str, str]]:
+        """
+        Provides scene names for all asf_search.ASFProducts in the largest connected substack
+        Useful when ordering pair-based products from ASF HyP3 On-Demand Processing.
+
+        Use the get_scene_ids method to get the IDs for other pair lists (full_stack, subset_stack, 
+        any network in connected_substacks, or remove_list)
+        
+        Returns:
+            A list tuples containing the reference and secondary scene names for each `Pair` in a `Pair` list
+        """
+        pair_list = max(self.connected_substacks, key=len)
+        return self.get_scene_ids(pair_list)
+    
+
     def __init__(
         self,
         geo_reference: ASFProduct,
@@ -92,18 +131,36 @@ class Stack:
         pairs: A list of Pairs to remove from self.subset_stack
         """
         # remove duplicates
-        self._remove_list = list(set(pairs))
+        self._remove_list = self._sort_pair_list(list(set(pairs)))
         self._update_stack()
 
-    def remove_pairs(self, pairs: Union[List[Pair], Pair]):
+    def remove_pairs(self, pairs: Union[List[Pair], Pair, Tuple[str], List[Tuple[str]]]):
         """
         Remove pairs from self.subset_stack, 
         i.e., add them to self._remove_list
 
+        Example calls:
+            my_stack.remove_pairs(my_pair)
+            my_stack.remove_pairs([my_pair_1, my_pair_2, ...])
+            my_stack.remove_pairs(("2024-10-20", "2024-11-02"))
+            my_stack.remove_pairs([("2024-10-20", "2024-11-02"), ("2024-10-26", "2024-11-02")])
+
         pairs: A Pair or list of Pairs to remove from self.subset_stack
+               or a Tuple of parsable date pair strings
         """
-        if isinstance(pairs, Pair):
+        if not isinstance(pairs, List):
             pairs = [pairs]
+        if isinstance(pairs[0], Pair):
+            if type(pairs[0].ref) is not type(self.full_stack[0].ref):
+                raise ValueError(
+                    (f"Can't remove Pairs of type {type(pairs[0].ref)} from a Stack"
+                     f"of Pairs of type {type(self.full_stack[0].ref)}"))
+        else:
+            pairs = [get_existing_pair_from_dates(
+                self.subset_stack,
+                parse_datetime(date_pair[0]).date(),
+                parse_datetime(date_pair[1]).date()) for
+                date_pair in pairs]
 
         for pair in pairs:
             if pair not in self._remove_list:
@@ -114,26 +171,136 @@ class Stack:
                     warnings.warn(PairNotInFullStackWarning(msg))
         self._update_stack()
 
-    def add_pairs(self, pairs: Union[List[Pair], Pair]):
+    def safe_pair_append(self, pair: Pair) -> None:
+        products_by_time = {
+            product_time: product
+            for existing_pair in self.full_stack
+            for product_time, product in (
+                (existing_pair.ref_time, existing_pair.ref),
+                (existing_pair.sec_time, existing_pair.sec),
+            )
+        }
+
+        ref = products_by_time.get(pair.ref_time, pair.ref)
+        sec = products_by_time.get(pair.sec_time, pair.sec)
+
+        self.full_stack.append(Pair(ref, sec))
+
+    def _validate_pair_type(self, pair: Pair) -> None:
+        expected_type = type(self.full_stack[0].ref)
+        actual_type = type(pair.ref)
+
+        if actual_type is not expected_type:
+            raise ValueError(
+                f"Can't add Pairs of type {actual_type} to a Stack "
+                f"of Pairs of type {expected_type}"
+            )
+        
+    def _pair_from_dates(self, date_pair: DatePair) -> Pair:
+        ref_date_string, sec_date_string = date_pair
+
+        ref_date = parse_datetime(ref_date_string).date()
+        sec_date = parse_datetime(sec_date_string).date()
+
+        try:
+            return get_existing_pair_from_dates(
+                self.remove_list,
+                ref_date,
+                sec_date,
+            )
+        except ValueError:
+            pass
+
+        stack_product = self.full_stack[0].ref
+
+        if isinstance(stack_product, S1MultiBurstProduct):
+            group = stack_product.multiburst_group
+
+            return Pair(
+                S1MultiBurstProduct(group, ref_date_string),
+                S1MultiBurstProduct(group, sec_date_string),
+            )
+
+        return Pair(
+            self._search_product_by_date(ref_date_string),
+            self._search_product_by_date(sec_date_string),
+        )
+    
+    def _search_product_by_date(self, date_string: str):
+        stack_product = self.full_stack[0].ref
+
+        end_date = str(
+            (parse_datetime(date_string) + timedelta(days=12)).date()
+        )
+
+        if stack_product.properties["processingLevel"] == "BURST":
+            results = geo_search(
+                fullBurstID=stack_product.properties["fullBurstID"],
+                start=date_string,
+                end=end_date,
+                processingLevel="BURST",
+            )
+        else:
+            results = geo_search(
+                asfFrame=stack_product.properties["frameNumber"],
+                relativeOrbit=stack_product.properties["pathNumber"],
+                start=date_string,
+                end=end_date,
+                processingLevel="SLC",
+            )
+
+        try:
+            return min(
+                results,
+                key=lambda product: product.properties["startTime"],
+            )
+        except ValueError:
+            raise ValueError(
+                f"No matching product found for {date_string}"
+            ) from None
+
+    def add_pairs(
+        self,
+        pairs: Union[PairInput, List[PairInput]],
+    ) -> None:
         """
-        Add pairs to self.subset_stack and, if necessary, to self.full_stack 
-        i.e., remove them from self._remove_list if present or else add them to self.full_stack 
+        Add pairs to subset_stack and, when necessary, to full_stack.
 
-        This allows for the addition of custom pairs that were not originally present
-        in self.full_stack
-
-        pairs: A Pair or list of Pairs to add to self.subset_stack
+        Date pairs are resolved from remove_list when possible. Otherwise,
+        the corresponding products are constructed or searched for.
         """
-        if isinstance(pairs, Pair):
+        if not isinstance(pairs, list):
             pairs = [pairs]
 
-        for pair in pairs:
+        if not pairs:
+            return
+        
+        contains_pairs = any(isinstance(item, Pair) for item in pairs)
+        if contains_pairs and not all(isinstance(item, Pair) for item in pairs):
+            raise TypeError("pairs must not mix Pair objects and date tuples")
+
+        resolved_pairs = []
+
+        for item in pairs:
+            if isinstance(item, Pair):
+                self._validate_pair_type(item)
+                resolved_pairs.append(item)
+            else:
+                resolved_pairs.append(self._pair_from_dates(item))
+
+        for pair in resolved_pairs:
             if pair in self._remove_list:
                 self._remove_list.remove(pair)
             else:
-                self.full_stack.append(pair)
+                self.safe_pair_append(pair)
+
         self._update_stack()
 
+    def _sort_pair_list(self, pair_list: List[Pair]) -> List[Pair]:
+        return sorted(
+            pair_list,
+            key=lambda item: item.id)
+
     def _build_full_stack(self, stack_search_results: Optional[ASFSearchResults]=None) -> List[Pair]:
         """
         Create self._full_stack, which involves performing a stack search
@@ -163,7 +330,9 @@ class Stack:
         Recalculate self.subset_stack and find its connected substacks.
         These two things should always happen together.
         """
-        self.subset_stack = self._get_subset_stack()
+        self.full_stack = self._sort_pair_list(self.full_stack)
+        self._remove_list = self._sort_pair_list(self._remove_list)
+        self.subset_stack = self._sort_pair_list(self._get_subset_stack())
         self.connected_substacks = self._find_connected_substacks()
 
     def _find_connected_substacks(self) -> List[List[Pair]]:
@@ -207,9 +376,10 @@ class Stack:
                             queue.append(neighbor)
                 component_pairs = [v for v in component_pairs.values()]
                 components.append(component_pairs)
-
+        components = [self._sort_pair_list(component) for component in components]
         return components
 
+
     def get_scene_ids(self, pair_list: Optional[List[Pair]] = None) -> List[Tuple[str, str]]:
         """
         Provides scene names for all asf_search.ASFProducts in a list of Pairs.
@@ -222,11 +392,29 @@ class Stack:
         Returns:
             A list tuples containing the reference and secondary scene names for each `Pair` in a `Pair` list
         """
-        if not pair_list:
+        if pair_list is None:
             pair_list = max(self.connected_substacks, key=len)
 
         return [
-            (pair.ref.properties["sceneName"], pair.sec.properties["sceneName"])
+            SceneIDPair(pair.ref.properties["sceneName"], pair.sec.properties["sceneName"])
             for pair in pair_list
             ]
-    
\ No newline at end of file
+    
+def get_existing_pair_from_dates(pair_list: List[Pair],
+                            ref_date: date, sec_date: date) -> Pair:
+    """
+    This convenience method allows for the retrieval of a Pair object from a list
+    of Pairs by reference and secondary date. This is usefull when identifying a 
+    Pair object for removal or addition to an SBASNetwork.subset_stack
+
+    pair_list: a list of Pairs from which to find a Pair object
+    ref_date: a datetime.date of a target Pair's reference scene
+    sec_date: a datetime.date of a target Pair's secondary scene
+
+    Returns: A Pair with a corresponding ref_date and sec_date
+    """
+    for pair in pair_list:
+        if pair.ref_time.date() == ref_date and pair.sec_time.date() == sec_date:
+            return pair
+    raise ValueError(f"No Pairs found corresponding to reference date: {ref_date}, secondary date: {sec_date}")
+            
\ No newline at end of file


=====================================
asf_search/__init__.py
=====================================
@@ -54,9 +54,10 @@ from .CMR import *  # noqa: F403 F401 E402
 from .baseline import *  # noqa: F403 F401 E402
 from .WKT import validate_wkt  # noqa: F401 E402
 from .export import *  # noqa: F403 F401 E402
-from .Pair import Pair  # noqa:  F401, E402
-from .Stack import Stack  # noqa:  F401, E402
-from .SBASNetwork import SBASNetwork # noqa:  F401, E402
+from .Pair import Pair  # noqa:  F401 E402
+from .Stack import *  # noqa:  F403 F401 E402
+from .SBASNetwork import * # noqa: F403 F401 E402
+from .S1MultiBurstProduct import * # noqa: F403 F401 E402
 from . import utils # noqa: F401, E402
 
 REPORT_ERRORS = True


=====================================
asf_search/constants/MATURITIES.py
=====================================
@@ -0,0 +1,3 @@
+BETA='BETA'
+PROVISIONAL='PROVISIONAL'
+VALIDATED='VALIDATED'


=====================================
asf_search/constants/__init__.py
=====================================
@@ -11,3 +11,4 @@ from .INTERNAL import *  # noqa: F403 F401
 from .DATASET import *  # noqa: F403 F401
 from .RANGE_BANDWIDTH import *  # noqa: F403 F401
 from .PRODUCTION_CONFIGURATION import * # noqa: F403 F401
+from .MATURITIES import * # noqa: F403 F401


=====================================
asf_search/search/geo_search.py
=====================================
@@ -17,6 +17,7 @@ def geo_search(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,
@@ -86,6 +87,8 @@ def geo_search(
     campaign:
         For UAVSAR and AIRSAR data collections only. Search by general location,
         site description, or data grouping as supplied by flight agency or project.
+    dataMaturity:
+        For NISAR data collections only. Determined by when products were processed
     maxDoppler:
         Doppler provides an indication of how much the look direction deviates
         from the ideal perpendicular flight direction acquisition.


=====================================
asf_search/search/search.py
=====================================
@@ -19,6 +19,7 @@ def search(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,
@@ -93,6 +94,8 @@ def search(
     campaign:
         For UAVSAR and AIRSAR data collections only. Search by general location,
         site description, or data grouping as supplied by flight agency or project.
+    dataMaturity:
+        For NISAR data collections only. Determined by when products were processed
     maxDoppler:
         Doppler provides an indication of how much the look direction deviates
         from the ideal perpendicular flight direction acquisition.


=====================================
asf_search/search/search_count.py
=====================================
@@ -18,6 +18,7 @@ def search_count(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,


=====================================
asf_search/search/search_generator.py
=====================================
@@ -44,6 +44,7 @@ def search_generator(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,
     end: Union[datetime.datetime, str] = None,
@@ -117,6 +118,8 @@ def search_generator(
     campaign:
         For UAVSAR and AIRSAR data collections only. Search by general location,
         site description, or data grouping as supplied by flight agency or project.
+    dataMaturity:
+        For NISAR data collections only. Determined by when products were processed
     maxDoppler:
         Doppler provides an indication of how much the look direction deviates
         from the ideal perpendicular flight direction acquisition.


=====================================
conftest.py
=====================================
@@ -2,6 +2,7 @@ import argparse
 import pytest
 import os
 from asf_search.ASFSession import ASFSession
+from asf_search import S1MultiBurst, S1MultiBurstGroup, S1MultiBurstProduct
 from getpass import getpass
 
 def string_to_session(user_input: str) -> ASFSession:
@@ -61,3 +62,18 @@ def pytest_addoption(parser: pytest.Parser):
 
     parser.addoption("--auth_with_token", action="store", dest="authenticated_session", type=set_should_auth_session_with_token, default='FALSE',
                      help = "'auth_with_creds': Use EDL token to authenticate session for relevant tests")
+
+ at pytest.fixture(scope="module")
+def three_by_three_multiburst_group():
+    return S1MultiBurstGroup(
+    bursts=[
+    S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+    S1MultiBurst("173_370306", ("IW1", "IW2", "IW3")),
+    S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+    ]
+)
+
+ at pytest.fixture(scope="module")
+def three_by_three_multiburst_product(three_by_three_multiburst_group):
+    start_date = '2023-01-01'
+    return S1MultiBurstProduct(three_by_three_multiburst_group, start_date)


=====================================
examples/SBASNetwork.ipynb
=====================================
@@ -81,7 +81,7 @@
     "    start_date = '2023-01-01',\n",
     "    end_date = '2025-10-02',\n",
     "    season = get_julian_season(season),\n",
-    "    perpendicular_baseline=100, \n",
+    "    perpendicular_baseline=150, \n",
     "    inseason_temporal_baseline=24,\n",
     "    bridge_target_date='3-1',\n",
     "    bridge_year_threshold=2,\n",
@@ -131,6 +131,16 @@
     "print(len(sbas_from_search_results.full_stack))"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a674e164",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sbas_from_search_results.plot()"
+   ]
+  },
   {
    "cell_type": "markdown",
    "id": "1d03afce",
@@ -246,192 +256,151 @@
   },
   {
    "cell_type": "markdown",
-   "id": "c3aa3107",
+   "id": "d4bddacd",
    "metadata": {},
    "source": [
-    "### Add an automatically filtered Pair back to the `SBASNetwork` to manually connect one of the disconnected sub-networks\n",
+    "### Plot a different network\n",
     "\n",
-    "Use the `SBASNetwork.get_pair_from_dates()` method to identify a Pair to return to the network\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "98a38281",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "removed_pair_to_return_to_network = sbas.get_pair_from_dates(sbas.remove_list, date(2023,1,17), date(2024,6,16))\n",
-    "print(removed_pair_to_return_to_network)\n",
-    "print(f\"Pair Dates: {removed_pair_to_return_to_network.ref_time.date()} - {removed_pair_to_return_to_network.sec_time.date()}\")\n",
+    "By default `SBASNetwork.plot()` plots all connected sub-networks (`sbas.connected_substacks`)\n",
     "\n",
-    "sbas.add_pairs(removed_pair_to_return_to_network)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "fbd56642",
-   "metadata": {},
-   "source": [
-    "### Re-plot the the `SBASNetwork`\n",
+    "However, `SBASNetwork` contains multiple networks that you can plot:\n",
+    "- `SBASNetwork.full_stack`: an SBAS network filtered by baselines, and including every possible bridge pair within SBASNetwork.bridge_year_threshold\n",
+    "- `SBASNetwork.subset_stack`: a possibly disconnected SBAS network filtered by temporal baseline, perpendicular baseline, and bridge pair filtering applied\n",
+    "- `SBASNetwork.connected_substacks`: SBASNetwork.subset_stack, broken up into a list of connected sub-networks\n",
     "\n",
-    "Note that the selected Pair has beeed back to the network, connecting a previously disconnected sub-network."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "da83378a",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "sbas.plot()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "4a3754dc",
-   "metadata": {},
-   "source": [
-    "### Remove pairs from the network"
+    "The code cell below plots `sbas.full_stack`\n"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "06bc7afc",
+   "id": "94c08504",
    "metadata": {},
    "outputs": [],
    "source": [
-    "pair1_to_remove = sbas.get_pair_from_dates(sbas.subset_stack, date(2025,1,6), date(2025,1,18))\n",
-    "pair2_to_remove = sbas.get_pair_from_dates(sbas.subset_stack, date(2025,1,6), date(2025,1,30))\n",
-    "print(f\"{pair1_to_remove}, {pair2_to_remove}\")\n",
-    "print(f\"Pair 1 Dates: {pair1_to_remove.ref_time.date()} - {pair1_to_remove.sec_time.date()}\")\n",
-    "print(f\"Pair 2 Dates: {pair2_to_remove.ref_time.date()} - {pair2_to_remove.sec_time.date()}\")\n",
-    "\n",
-    "sbas.remove_pairs([pair1_to_remove, pair2_to_remove])"
+    "sbas.plot(sbas.full_stack)"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "4344ee36",
+   "id": "0367d3ea",
    "metadata": {},
    "source": [
-    "### Re-plot the network after removing 2 Pairs\n",
+    "### Plot the SBASNetwork that contains missing state vectors, resulting in perpendicular baselines with values of None\n",
     "\n",
-    "Note that after removing both Pairs, the date 2025-01-06 is no longer included in the network at all and its vertex on the plot is red."
+    "To view the perpendicular baselines of None on the plot, hover over the edges representing the following date pairs:\n",
+    "- 2023/01/05 - 2023/01/29\n",
+    "- 2023/01/17 - 2023/01/29\n",
+    "- 2023/01/29 - 2023/02/10\n",
+    "- 2023/01/29 - 2023/02/22"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "caed94de",
+   "id": "ebf20960",
    "metadata": {},
    "outputs": [],
    "source": [
-    "sbas.plot()"
+    "missing_state_vectors_allowed_sbas.plot()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "7a8b4c11",
-   "metadata": {},
-   "source": [
-    "### You can also add Pairs that were not included in the initial search and are not included in `SBASNetwork.remove_list` at all"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "10ee6452",
+   "id": "c3aa3107",
    "metadata": {},
-   "outputs": [],
    "source": [
-    "existing_pair = sbas.get_pair_from_dates(sbas.subset_stack, date(2025,3,7), date(2025,3,19))\n",
-    "existing_ref_scene = existing_pair.ref\n",
+    "<hr>\n",
     "\n",
-    "results = asf.product_search('S1A_IW_SLC__1SDV_20260401T105744_20260401T105802_063885_0808EC_7B1B-SLC')\n",
-    "new_sec_scene = results[0]\n",
+    "## Add and remove Pairs from an SBASNetwork \n",
     "\n",
-    "new_pair = asf.Pair(existing_ref_scene, new_sec_scene)\n",
-    "print(new_pair)\n",
-    "print(f\"Pair Dates: {new_pair.ref_time.date()} - {new_pair.sec_time.date()}\")\n",
+    "### Add Pair to the `SBASNetwork` to manually connect one of the disconnected sub-networks\n",
     "\n",
-    "sbas.add_pairs(new_pair)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "13591778",
-   "metadata": {},
-   "source": [
-    "### Re-plot the network after adding a Pair that was not in the scope of the original `SBASNetwork`'s time bounds\n",
+    "You can add or remove pairs by passing:\n",
+    "- A Tuple of date pair strings: (\"2023-01-05\", \"2023-01-29\")\n",
+    "- A List of tuples of date pair strings: [(\"2023-01-05\", \"2023-01-29\"), (\"2023-01-05\", \"2024-01-12\")]\n",
+    "- A Pair object\n",
+    "- A List of Pair objects\n",
     "\n",
-    "Note that there is now a pair with a secondary scene date in 2026. While this new pair has been manually added to the network, its perpendiccular baseline was not determined during the initial search and is therefore set to `None`. "
+    "Note that the following code cell adds a Pair to the network, connecting a previously disconnected sub-network in 2023."
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "205bd3c8",
+   "id": "0a45ffd8",
    "metadata": {},
    "outputs": [],
    "source": [
+    "sbas.add_pairs((\"2023-01-05\", \"2023-01-29\"))\n",
+    "\n",
     "sbas.plot()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "d4bddacd",
+   "id": "eec0a391",
    "metadata": {},
    "source": [
-    "### Plot a different network\n",
+    "### Add Pairs by passing the Pair objects themselves (instead of date pair strings)\n",
     "\n",
-    "By default `SBASNetwork.plot()` plots all connected sub-networks (`sbas.connected_substacks`)\n",
+    "Note that we are able to add a Pair that extends beyond the original temporal range of the SBASNetwork. \n",
     "\n",
-    "However, `SBASNetwork` contains multiple networks that you can plot:\n",
-    "- `SBASNetwork.full_stack`: an SBAS network filtered by baselines, and including every possible bridge pair within SBASNetwork.bridge_year_threshold\n",
-    "- `SBASNetwork.subset_stack`: a possibly disconnected SBAS network filtered by baselines, with additional bridge pair filtering applied\n",
-    "- `SBASNetwork.connected_substacks`: SBASNetwork.subset_stack, broken up into a list of connected sub-networks\n",
-    "\n",
-    "The code cell below plots `sbas.full_stack`\n"
+    "Arbitrarily added pairs are not required to adhere to the baselines or temporal range of the SBASNetwork. "
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "94c08504",
+   "id": "e6226426",
    "metadata": {},
    "outputs": [],
    "source": [
-    "sbas.plot(sbas.full_stack)"
+    "results = asf.product_search('S1A_IW_SLC__1SDV_20230529T225128_20230529T225155_048755_05DD08_82C5-SLC')\n",
+    "ref = results[0]\n",
+    "stack = ref.stack()\n",
+    "sec_1 = stack[-1]\n",
+    "sec_2 = stack[-2]\n",
+    "\n",
+    "pair_1 = asf.Pair(ref, sec_1)\n",
+    "pair_2 = asf.Pair(ref, sec_2)\n",
+    "\n",
+    "\n",
+    "sbas.add_pairs([\n",
+    "    pair_1,\n",
+    "    pair_2\n",
+    "])\n",
+    "\n",
+    "sbas.plot()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "0367d3ea",
+   "id": "4a3754dc",
    "metadata": {},
    "source": [
-    "### Plot the SBASNetwork that contains missing state vectors, resulting in perpendicular baselines with values of None\n",
+    "### Remove pairs from the network\n",
     "\n",
-    "Note that perpendicular baselines with None values are plotted with values of 0.0 m.\n",
+    "#### Remove Pairs with list of date pair strings\n",
     "\n",
-    "To view the perpendicular baselines of None on the plot, hover over the edges representing the following date pairs:\n",
-    "- 2023/01/05 - 2023/01/29\n",
-    "- 2023/01/17 - 2023/01/29\n",
-    "- 2023/01/29 - 2023/02/10\n",
-    "- 2023/01/29 - 2023/02/22"
+    "Like the `add_pairs` method, you can pass date pair strings or Pair objects to `remove_pairs`"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ebf20960",
+   "id": "6a126430",
    "metadata": {},
    "outputs": [],
    "source": [
-    "missing_state_vectors_allowed_sbas.plot()"
+    "sbas.remove_pairs([\n",
+    "    (\"2024-05-11\", \"2024-05-23\"),\n",
+    "    (\"2024-05-23\", \"2024-06-04\"),\n",
+    "    (\"2024-05-23\", \"2024-06-16\"),\n",
+    "    (\"2024-06-04\", \"2024-06-16\"),\n",
+    "])\n",
+    "\n",
+    "sbas.plot()"
    ]
   },
   {
@@ -441,13 +410,11 @@
    "source": [
     "<hr>\n",
     "\n",
-    "## View the SLC IDs of an `SBASNetwork`'s `Pairs`\n",
-    "\n",
-    "### View `SBASNetwork.subset_stack`'s scene ID's \n",
+    "## Prepare a list of the SBASNetwork's SLC IDs to order on-demand processing from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/) or [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/)\n",
     "\n",
     "When ordering data from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/) or [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/) On-Demand Processing, it is helpful to provide an `SBASNetwork` as a list of scene IDs.\n",
     "\n",
-    "The `SBASNetwork.get_scene_ids()` method (inherited from the `Stack` class) offers this functionality."
+    "### Use the `scene_ids` property to view the scene ID's of the largest connected network in `connected_substacks`\n"
    ]
   },
   {
@@ -457,7 +424,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "largest_fully_connected_subset_stack_ids = sbas.get_scene_ids()\n",
+    "largest_fully_connected_subset_stack_ids = sbas.scene_ids\n",
     "largest_fully_connected_subset_stack_ids"
    ]
   },
@@ -466,7 +433,13 @@
    "id": "25f0d098",
    "metadata": {},
    "source": [
-    "### You can view the scene IDs of any stack_list contained in a `SBASNetwork` object, including the complete `SBASNetwork.full_stack`, `SBASNetwork.remove_list`, the possibly disconnected `SBASNetwork.subset_stack`, or any of the stack_lists in `SBASNetwork.connected_substacks`"
+    "### Use the `get_scene_ids` method to view the scene IDs of any stack_list contained in an `SBASNetwork` object\n",
+    "\n",
+    "Options include:\n",
+    "- `SBASNetwork.full_stack`\n",
+    "- `SBASNetwork.remove_list`\n",
+    "- The possibly disconnected `SBASNetwork.subset_stack`\n",
+    "- Any of the stack_lists in `SBASNetwork.connected_substacks`"
    ]
   },
   {
@@ -483,15 +456,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "3d0e4696",
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "677e5bbf",
+   "id": "119e5a76",
    "metadata": {},
    "outputs": [],
    "source": []


=====================================
examples/SBASNetwork_S1-Multiburst.ipynb
=====================================
@@ -0,0 +1,295 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "eb53c259",
+   "metadata": {
+    "vscode": {
+     "languageId": "plaintext"
+    }
+   },
+   "source": [
+    "## Create SBASNetworks from groups of Sentinel-1 burst data\n",
+    "\n",
+    "This notebook demonstrates how to create SBASNetworks of interferometric pairs from groups of adjacent Sentinel-1 burst data. Refer to the [SBASNetwork Tutorial](SBASNetwork.ipynb) for examples of creating SBASNetworks of networks of full Sentinel-1 scenes or individual Sentinel-1 bursts."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "aeb8be28",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# This is useful if you are working with a dev install of asf_search and experimenting with changes to the codebase\n",
+    "%load_ext autoreload\n",
+    "%autoreload 2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3ccc6d0a",
+   "metadata": {},
+   "source": [
+    "### Create an asf_search.S1MultiBurstGroup object defining a group of Sentinel-1 bursts and subswaths\n",
+    "\n",
+    "Refer to [HyP3's mutli-burst guidelines](https://hyp3-docs.asf.alaska.edu/guides/burst_insar_product_guide/#considerations-for-selecting-input-bursts) when assembling a collection of bursts.\n",
+    "\n",
+    "S1MultiBurstGroup validation is performed during initialitzation to prevent the creation of invalid multiburst SBASNetworks that result in failed HyP3 on-demand processing jobs."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a4333bc6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import asf_search as asf\n",
+    "\n",
+    "multiburst_group = asf.S1MultiBurstGroup(\n",
+    "    bursts=[\n",
+    "    asf.S1MultiBurst(\"173_370305\", (\"IW1\", \"IW2\", \"IW3\")),\n",
+    "    asf.S1MultiBurst(\"173_370306\", (\"IW1\", \"IW2\", \"IW3\")),\n",
+    "    asf.S1MultiBurst(\"173_370307\", (\"IW1\", \"IW2\", \"IW3\"))\n",
+    "    ]\n",
+    ")\n",
+    "multiburst_group"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "aac455e5",
+   "metadata": {},
+   "source": [
+    "### Create a geoographic reference S1MultiBurstProduct object\n",
+    "\n",
+    "An `S1MultiBurstProduct` contains a collection of Sentinel-1 burst products."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f35864ff",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "start_date = '2023-01-01'\n",
+    "\n",
+    "reference_multiburst = asf.S1MultiBurstProduct(multiburst_group, start_date)\n",
+    "reference_multiburst"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "833d605b",
+   "metadata": {},
+   "source": [
+    "### Create an SBASNetwork from the S1MultiBurstProduct object"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "af8ee46c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from datetime import datetime, date\n",
+    "import pandas as pd\n",
+    "\n",
+    "def get_julian_season(season) -> tuple[int,int]:\n",
+    "    season_start_ts = pd.Timestamp(\n",
+    "        datetime.strptime(f\"{season[0]}-0001\", \"%m-%d-%Y\"), tz=\"UTC\"\n",
+    "        )\n",
+    "    season_start_day = season_start_ts.timetuple().tm_yday\n",
+    "    season_end_ts = pd.Timestamp(\n",
+    "        datetime.strptime(f\"{season[1]}-0001\", \"%m-%d-%Y\"), tz=\"UTC\"\n",
+    "    )\n",
+    "    season_end_day = season_end_ts.timetuple().tm_yday\n",
+    "    return (season_start_day, season_end_day)\n",
+    "\n",
+    "season = (\"1-1\", \"6-25\")\n",
+    "\n",
+    "multiburst_sbas = asf.SBASNetwork.from_geo_reference(\n",
+    "    geo_reference = reference_multiburst,\n",
+    "    start_date = '2023-01-01',\n",
+    "    end_date = '2025-10-02',\n",
+    "    season = get_julian_season(season),\n",
+    "    perpendicular_baseline=150, \n",
+    "    inseason_temporal_baseline=36,\n",
+    "    bridge_target_date='3-1',\n",
+    "    bridge_year_threshold=1,\n",
+    "    allow_missing_state_vectors=True)\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8c8d61e1",
+   "metadata": {},
+   "source": [
+    "## Add and remove Pairs from an SBASNetwork \n",
+    "\n",
+    "### Add Pairs to the `SBASNetwork` to manually connect an unused S1MultiBurst\n",
+    "\n",
+    "You can add or remove pairs by passing:\n",
+    "- A Tuple of date pair strings: (\"2024-02-03\", \"2024-04-15\")\n",
+    "- A List of tuples of date pair strings: [(\"2024-02-03\", \"2024-04-15\"), (\"2024-02-03\", \"2024-04-15\")]\n",
+    "- A Pair object\n",
+    "- A List of Pair objects"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "488db17a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "multiburst_sbas.add_pairs([\n",
+    "    (\"2024-03-22\", \"2024-04-15\"),\n",
+    "    (\"2024-04-03\", \"2024-04-15\")\n",
+    "    ])\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b5b29930",
+   "metadata": {},
+   "source": [
+    "### Add a Pair by passing a Pair object"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3749d06d",
+   "metadata": {},
+   "source": [
+    "### "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3666f00a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "pair = multiburst_sbas.remove_list[60]\n",
+    "print(f\"{pair.ref_time.date()}, {pair.sec_time.date()}\")\n",
+    "\n",
+    "multiburst_sbas.add_pairs(pair)\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "58de13ef",
+   "metadata": {},
+   "source": [
+    "### Remove Pairs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "361ecbfd",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "multiburst_sbas.remove_pairs([\n",
+    "    (\"2024-04-27\", \"2024-05-21\"),\n",
+    "    (\"2024-05-21\", \"2024-06-14\"),\n",
+    "    (\"2024-06-02\", \"2024-06-14\"),\n",
+    "    (\"2024-05-09\", \"2024-06-14\"),\n",
+    "    (\"2024-05-09\", \"2024-06-02\"),\n",
+    "    (\"2024-04-27\", \"2024-06-02\"),\n",
+    "    (\"2024-04-27\", \"2024-05-09\")\n",
+    "])\n",
+    "\n",
+    "multiburst_sbas.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d4d21b40",
+   "metadata": {},
+   "source": [
+    "<hr>\n",
+    "\n",
+    "## Use the `scene_ids` property to access multi-burst product IDs for easy InSAR product ordering from HyP3 \n",
+    "\n",
+    "The `scene_ids` property provides scene IDs for the largest network in the `connected_substacks` list for each SBASNetwork in `sbas_networks`\n",
+    "\n",
+    "An SBAS Network generated from a `S1MultiBurstProduct` geo-reference can be used to order Sentinel-1 multi-burst InSAR processing from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/guides/burst_insar_product_guide/) and [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8cc9451a",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [],
+   "source": [
+    "sbas_burst_ids = multiburst_sbas.scene_ids\n",
+    "sbas_burst_ids"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9f32cacb",
+   "metadata": {},
+   "source": [
+    "<hr>\n",
+    "\n",
+    "## Use the `get_scene_ids` method to access multi-burst product IDs from any of the SBASNetwork pair lists in `sbas_networks`\n",
+    "\n",
+    "Options include:\n",
+    "- `SBASNetwork.full_stack`\n",
+    "- `SBASNetwork.remove_list`\n",
+    "- The possibly disconnected `SBASNetwork.subset_stack`\n",
+    "- Any of the stack_lists in `SBASNetwork.connected_substacks`\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c26c928a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "full_stack_burst_ids = multiburst_sbas.get_scene_ids(multiburst_sbas.full_stack)\n",
+    "full_stack_burst_ids"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.12.0"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}


=====================================
examples/Stack.ipynb
=====================================
@@ -358,71 +358,56 @@
     "\n",
     "When ordering data from ASF [HyP3](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/) or [HyP3+](https://hyp3-docs.asf.alaska.edu/hyp3-docs/about/hyp3_plus/) On-Demand Processing, it is helpful to provide a `Stack` as a list of scene IDs.\n",
     "\n",
-    "The `Stack.get_scene_ids()` method offers this functionality."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "e04d7bf8",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "possibly_disconnected_subset_stack_ids = stack.get_scene_ids(stack.subset_stack)\n",
-    "possibly_disconnected_subset_stack_ids"
+    "The `Stack.scene_ids` property and `Stack.get_scene_ids()` method offer this functionality."
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "87798431",
-   "metadata": {},
-   "source": [
-    "### View the largest connected substack in `stack.connected_substacks`\n",
-    "\n",
-    "`stack.get_scene_ids()` takes the optional argument `stack_list`. \n",
-    "\n",
-    "If you do not provide a stack_list, the method defaults to using the largest connected substack in `stack.connected_substacks`."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "14711e1f",
+   "id": "183233d2",
    "metadata": {},
-   "outputs": [],
    "source": [
-    "largest_fully_connected_subset_stack_ids = stack.get_scene_ids()\n",
-    "largest_fully_connected_subset_stack_ids\n"
+    "### Use the `scene_ids` property to view the scene IDs of the largest connected network in `stack.connected_substacks`"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c2d4c0c7",
+   "id": "7fbc5b28",
    "metadata": {},
    "outputs": [],
    "source": [
-    "len(largest_fully_connected_subset_stack_ids)"
+    "largest_connected_substack_scene_ids = stack.scene_ids\n",
+    "largest_connected_substack_scene_ids"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "183233d2",
+   "id": "ce5a0754",
    "metadata": {},
    "source": [
-    "### You can view the scene IDs of any stack_list contained in a `Stack` object, including the complete `stack.full_stack`, `stack.remove_list`, the possibly disconnected `stack.subset_stack`, or any of the stack_lists in `stack.connected_substacks`"
+    "### Use the `get_scene_ids` method view the scene IDs of any stack_list contained in a `Stack` object\n",
+    "\n",
+    "Options include the complete `stack.full_stack`, `stack.remove_list`, the possibly disconnected `stack.subset_stack`, or any of the stack_lists in `stack.connected_substacks`"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7fbc5b28",
+   "id": "10e04773",
    "metadata": {},
    "outputs": [],
    "source": [
     "remove_list_scene_ids = stack.get_scene_ids(stack.remove_list)\n",
     "remove_list_scene_ids"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b500b090",
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {


=====================================
pyproject.toml
=====================================
@@ -12,6 +12,7 @@ build-backend = "setuptools.build_meta"
 [tool.setuptools_scm]
 
 [tool.ruff]
+required-version = "==0.15.22"
 line-length = 100
 fix = true
 


=====================================
setup.py
=====================================
@@ -72,7 +72,7 @@ setup(
                     'extras': extra_requirements, 
                     'asf-enumeration': asf_enumeration, 
                     'coherence': coherence,
-                    'sbasnetwork_plot': sbasnetwork_plot
+                    'sbasnetwork_plot': sbasnetwork_plot,
                     },
     license='BSD',
     license_files=('LICENSE',),


=====================================
tests/S1MultiBurstProduct/test_S1MultiBurstProduct.py
=====================================
@@ -0,0 +1,99 @@
+import pytest
+import re
+
+from asf_search import S1MultiBurst, S1MultiBurstGroup, S1MultiBurstProduct, SBASNetwork
+
+def test_three_by_three_group(three_by_three_multiburst_group):       
+        assert len(three_by_three_multiburst_group.bursts) == 3
+
+def test_horizontal_line_group():
+        multiburst_group = S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                ])
+        
+        assert len(multiburst_group.bursts) == 1
+
+
+def test_vertical_line_group():
+        multiburst_group = S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1",)),
+                S1MultiBurst("173_370306", ("IW1",)),
+                S1MultiBurst("173_370307", ("IW1",))
+                ])
+        
+        assert len(multiburst_group.bursts) == 3
+
+def test_L_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match="Products from swaths 2 and 3 do not overlap"
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2")),
+                S1MultiBurst("173_370306", ("IW1", "IW2")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_u_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match="Products from swaths 1 and 2 do not overlap"
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1",        "IW3")),
+                S1MultiBurst("173_370306", ("IW1",        "IW3")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_c_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match=re.escape("All bursts must have consecutive burst IDs. Found: [370305, 370307].")
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370306", ("IW1",             )),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_donut_shaped_group():
+    with pytest.raises(
+        ValueError,
+        match=re.escape("All bursts must have consecutive burst IDs. Found: [370305, 370307].")
+        ):   
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370306", ("IW1",        "IW3")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3"))
+                ])
+
+def test_too_large_group():
+    with pytest.raises(
+        ValueError,
+        match="An S1MultiBurstGroup may include no more than 15 burst/subswath combinations"
+        ):
+        S1MultiBurstGroup(
+            bursts=[
+                S1MultiBurst("173_370305", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370306", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370307", ("IW1", "IW2", "IW3")), 
+                S1MultiBurst("173_370308", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370309", ("IW1", "IW2", "IW3")),
+                S1MultiBurst("173_370310", ("IW1", "IW2", "IW3")), 
+                ])
+
+def test_multiburst_product_from_multiburst_group(three_by_three_multiburst_product):
+     assert three_by_three_multiburst_product.id == '173_370305_IW123_173_370306_IW123_173_370307_IW123_20230103'
+     assert len(three_by_three_multiburst_product.geo_reference_bursts) == 9
+
+def test_multiburst_product_from_geo_reference_bursts(three_by_three_multiburst_product):
+    geo_ref_bursts = three_by_three_multiburst_product.geo_reference_bursts
+    multiburst_product = S1MultiBurstProduct(geo_reference_bursts=geo_ref_bursts)
+    assert three_by_three_multiburst_product == multiburst_product
+


=====================================
tests/SBASNetwork/test_SBASNetwork.py
=====================================
@@ -1,9 +1,9 @@
+import copy
 from datetime import date
 import pickle
 from pathlib import Path
 
-from asf_search.ASFSearchOptions import ASFSearchOptions
-from asf_search import SBASNetwork
+from asf_search import SBASNetwork, get_existing_pair_from_dates
 
 import pytest
 
@@ -15,14 +15,6 @@ def reference():
         # trusted local test fixture
         return pickle.load(f) # nosec B301
     
- at pytest.fixture
-def pair():
-    path = Path(__file__).parent / "data/pair_0.pkl"
-
-    with open(path, "rb") as f:
-        # trusted local test fixture
-        return pickle.load(f) # nosec B301
-    
 @pytest.fixture
 def stack_results():
     path = Path(__file__).parent / "data/stack_search_0.pkl"
@@ -40,19 +32,24 @@ def sbas_network(stack_results):
         inseason_temporal_baseline=24,
         bridge_target_date='3-1',
         bridge_year_threshold=2)
-    
-def test_sbas_network_from_ref_scene(mocker, reference, stack_results):
+
+ at pytest.fixture
+def multiburst_sbas_network(three_by_three_multiburst_product):
+    return SBASNetwork.from_geo_reference(
+    geo_reference = three_by_three_multiburst_product,
+    start_date = '2023-01-01',
+    end_date = '2025-10-02',
+    season = (1, 176),
+    perpendicular_baseline=150, 
+    inseason_temporal_baseline=36,
+    bridge_target_date='3-1',
+    bridge_year_threshold=1)
+
+def test_sbas_network_from_ref_scene(reference):
     """
     Create an SBASNetwork from a geographic reference scene
     """
-    mock_stack = mocker.patch.object(
-        reference,
-        "stack",
-        return_value=stack_results,
-    )
-
-    # Create an SBASNetwork and confrm expected size of its full_stack and subset_stack
-    sbas = SBASNetwork(
+    sbas = SBASNetwork.from_geo_reference(
         reference,
         start_date="2020-01-01",
         end_date="2025-10-02",
@@ -62,19 +59,25 @@ def test_sbas_network_from_ref_scene(mocker, reference, stack_results):
         bridge_target_date='3-1',
         bridge_year_threshold=2)
 
-    assert len(sbas.full_stack) == 1730
-    assert len(sbas.subset_stack) == 176
-    assert len(sbas.connected_substacks) == 3
-    assert len(max(sbas.connected_substacks, key=lambda s: len(s))) == 161
+    assert len(sbas.full_stack) == 1508
+    assert len(sbas.subset_stack) == 159
+    assert len(sbas.connected_substacks) == 4
+    assert len(max(sbas.connected_substacks, key=lambda s: len(s))) == 145
+
+def test_multiburst_sbas_network(multiburst_sbas_network):
+    assert len(multiburst_sbas_network.full_stack) == 416
+    assert len(multiburst_sbas_network.subset_stack) == 99
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 96
 
 def test_sbasnetwork_from_search_results(sbas_network):
     """
     Create an SBASNetwork from ASFProduct.stack search results with the 
     SBASNetwork.from_search_results alternate class method constructor
     """
-    assert len(sbas_network.full_stack) == 1730
-    assert len(sbas_network.subset_stack) == 176
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 161
+    assert len(sbas_network.full_stack) == 1508
+    assert len(sbas_network.subset_stack) == 159
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 145
 
 def test_disallow_missing_state_vectors(stack_results):
     """
@@ -104,34 +107,193 @@ def test_disallow_missing_state_vectors(stack_results):
         bridge_target_date='3-1',
         bridge_year_threshold=2,
         allow_missing_state_vectors=True)
-    assert len(missing_state_vectors_allowed_sbas.full_stack) == 1730
+    assert len(missing_state_vectors_allowed_sbas.full_stack) == 1508
     assert len([p for p in missing_state_vectors_allowed_sbas.full_stack if p.perpendicular_baseline is None]) == 32
 
-def test_add_pair(sbas_network):
-    removed_pair_0 = sbas_network.get_pair_from_dates(sbas_network.remove_list, date(2023,1,17), date(2024,6,16))
-    sbas_network.add_pairs(removed_pair_0)
-    assert len(sbas_network.subset_stack) == 177
-    assert len(sbas_network.connected_substacks) == 2
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 165
+def test_add_pair_date_strings(sbas_network):
+    """
+    Tests adding a single pair, which is on the remove_list, using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs(("2023-01-17", "2024-06-16"))
+    assert len(sbas_network.subset_stack) == 160
+    assert len(sbas_network.remove_list) == removed_list_size - 1
+    assert len(sbas_network.connected_substacks) == 3
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 145
 
-def test_add_pairs(sbas_network):
-    removed_pair_0 = sbas_network.get_pair_from_dates(sbas_network.remove_list, date(2023,1,17), date(2024,6,16))
-    removed_pair_1 = sbas_network.get_pair_from_dates(sbas_network.remove_list, date(2023,1,5), date(2024,2,5))
-    sbas_network.add_pairs([removed_pair_0, removed_pair_1])
-    assert len(sbas_network.subset_stack) == 178
+def test_add_multiburst_pair_date_strings(multiburst_sbas_network):
+    """
+    Tests adding a single S1MultiBurstProduct pair, which is on the remove_list, using date pair strings
+    """
+    multiburst_sbas_network.add_pairs(("2024-03-22", "2024-04-15"))
+    assert len(multiburst_sbas_network.subset_stack) == 100
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 97
+
+def test_add_new_pair_date_strings(sbas_network):
+    """
+    tests adding a pair previously unknown to the SBASNetwork
+    and not on the remove_list, using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs(("2023-01-17", "2025-05-14"))
+    assert len(sbas_network.subset_stack) == 160
+    assert len(sbas_network.remove_list) == removed_list_size
+    assert len(sbas_network.connected_substacks) == 3
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 145
+
+def test_add_pairs_date_strings(sbas_network):
+    """
+    Tests adding a multiple pairs using date pair strings
+    """
+    sbas_network.add_pairs([("2023-01-17", "2024-06-16"), ("2023-01-05", "2024-02-05")])
+    assert len(sbas_network.subset_stack) == 161
     assert len(sbas_network.connected_substacks) == 2
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 166
-
-def test_remove_pairs(sbas_network):
-    pair1_to_remove = sbas_network.get_pair_from_dates(sbas_network.subset_stack, date(2025,1,6), date(2025,1,18))
-    pair2_to_remove = sbas_network.get_pair_from_dates(sbas_network.subset_stack, date(2025,1,6), date(2025,1,30))
-    sbas_network.remove_pairs([pair1_to_remove, pair2_to_remove])
-    assert len(sbas_network.subset_stack) == 174
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 159
-    assert len(sbas_network.remove_list) == 1556
-
-def add_new_pair(sbas_network, pair):
-    sbas_network.add_pairs(pair)
-    assert len(sbas_network.full_stack) == 1731
-    assert len(sbas_network.subset_stack) == 176
-    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 164
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 151
+
+def test_add_multiburst_pairs_date_strings(multiburst_sbas_network):
+    """
+    Tests adding multiple S1MultiBurstProduct pairs using date pair strings
+    """
+    multiburst_sbas_network.add_pairs([("2024-03-22", "2024-04-15"), ("2024-04-03", "2024-02-15")])
+    assert len(multiburst_sbas_network.subset_stack) == 101
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 98
+
+def test_add_pair_object(sbas_network):
+    """
+    Tests adding a single pair using a Pair object
+    """
+    pair_to_add = sbas_network.remove_list[10]
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs(pair_to_add)
+    assert len(sbas_network.subset_stack) == 160
+    assert len(sbas_network.remove_list) == removed_list_size - 1
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 146
+
+def test_add_multiburst_pair_object(multiburst_sbas_network):
+    """
+    Tests adding a single S1MultiBurstProduct pair using a Pair object
+    """
+    pair_to_add = multiburst_sbas_network.remove_list[10]
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.add_pairs(pair_to_add)
+    assert len(multiburst_sbas_network.subset_stack) == 100
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size - 1
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 97
+
+def test_add_pair_objects(sbas_network):
+    """
+    Tests adding a multiple pairs using Pair objects
+    """
+
+    pair_to_add_1 = sbas_network.remove_list[10]
+    pair_to_add_2 = sbas_network.remove_list[-1]
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.add_pairs([pair_to_add_1, pair_to_add_2])
+    assert len(sbas_network.subset_stack) == 161
+    assert len(sbas_network.remove_list) == removed_list_size - 2
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 146
+
+def test_add_multiburst_pair_objects(multiburst_sbas_network):
+    """
+    Tests adding multiple S1MultiBurstProduct pairs using a Pair objects
+    """
+    pairs_to_add = multiburst_sbas_network.remove_list[10:12]
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.add_pairs(pairs_to_add)
+    assert len(multiburst_sbas_network.subset_stack) == 101
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size - 2
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 98
+
+def test_remove_pair_date_strings(sbas_network):
+    """
+    Tests removing a single pair using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs(("2025-01-06", "2025-01-18"))
+    assert len(sbas_network.subset_stack) == 158
+    assert len(sbas_network.remove_list) == removed_list_size + 1
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 144
+
+def test_remove_multiburst_pair_date_strings(multiburst_sbas_network):
+    """
+    Tests removing a single S1MultiBurstProduct pair using date pair strings
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs(("2023-02-20", "2024-02-15"))
+    assert len(multiburst_sbas_network.subset_stack) == 98
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 1
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 95
+
+def test_remove_pairs_date_strings(sbas_network):
+    """
+    Tests a multiple pairs using date pair strings
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs([("2025-01-06", "2025-01-18"), ("2025-01-06", "2025-01-30")])
+    assert len(sbas_network.subset_stack) == 157
+    assert len(sbas_network.remove_list) == removed_list_size + 2
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 143
+
+def test_remove_multiburst_pairs_date_strings(multiburst_sbas_network):
+    """
+    Tests removing multiple S1MultiBurstProduct pairs using date pair strings
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs([("2023-02-20", "2024-02-15"), ("2023-03-04", "2024-02-15")])
+    assert len(multiburst_sbas_network.subset_stack) == 97
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 2
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 94
+
+def test_remove_pair_object(sbas_network):
+    """
+    Tests removing a single pair using a Pair object
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs(sbas_network.subset_stack[0])
+    assert len(sbas_network.subset_stack) == 158
+    assert len(sbas_network.remove_list) == removed_list_size + 1
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 144
+
+def test_remove_multiburst_pair_object(multiburst_sbas_network):
+    """
+    Tests removing a single S1MultiBurstProduct pair using a Pair object
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs(multiburst_sbas_network.subset_stack[0])
+    assert len(multiburst_sbas_network.subset_stack) == 98
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 1
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 95
+
+def test_remove_pair_objects(sbas_network):
+    """
+    Tests removing multiple pairs using pair objects
+    """
+    removed_list_size = len(sbas_network.remove_list)
+    sbas_network.remove_pairs(sbas_network.subset_stack[:3])
+    assert len(sbas_network.subset_stack) == 156
+    assert len(sbas_network.remove_list) == removed_list_size + 3
+    assert len(sbas_network.connected_substacks) == 4
+    assert len(max(sbas_network.connected_substacks, key=lambda s: len(s))) == 142
+
+def test_remove_multiburst_pair_objects(multiburst_sbas_network):
+    """
+    Tests removing multiple S1MultiBurstProduct pairs using pair objects
+    """
+    removed_list_size = len(multiburst_sbas_network.remove_list)
+    multiburst_sbas_network.remove_pairs(multiburst_sbas_network.subset_stack[:3])
+    assert len(multiburst_sbas_network.subset_stack) == 96
+    assert len(multiburst_sbas_network.remove_list) == removed_list_size + 3
+    assert len(multiburst_sbas_network.connected_substacks) == 3
+    assert len(max(multiburst_sbas_network.connected_substacks, key=lambda s: len(s))) == 93


=====================================
tests/yml_tests/test_ASFSearchResults.yml
=====================================
@@ -2,9 +2,6 @@ tests:
 - Test ASFSearchResults_intersection simple-polygon:
     wkt: POLYGON ((0 0, 50 0, 50 50, 0 50, 0 0))
 
-- Test ASFSearchResults_intersection Shovel_Creek Polygon:
-    wkt: POLYGON ((-148.395929999329 65.02006999976498, -148.398010619511 65.02049651421811, -148.3980473296276 65.02074794119113, -148.3982428597838 65.02104161295625, -148.3992698433036 65.02120374777655, -148.4007460405182 65.02123858637134, -148.401412730549 65.02108323434425, -148.4027226255657 65.0207780217462, -148.4035199986349 65.0207700013126, -148.4086000003617 65.02056000058639, -148.4120399989118 65.02099999942624, -148.4150700005966 65.02205999978662, -148.4207299999013 65.02348000026927, -148.4247500012678 65.02348000026927, -148.4283700011887 65.02275000067596, -148.4360600005286 65.02072999998933, -148.4453999984648 65.01838999919386, -148.4505993951639 65.01648358639204, -148.4509054577393 65.01644310572868, -148.4524066683864 65.01582945088057, -148.4524399995483 65.0158299996333, -148.4554199992516 65.01481999994485, -148.4574399986286 65.01414000102335, -148.4595599993493 65.01347999948933, -148.4620200014952 65.01214000165317, -148.4626900010681 65.01101999996274, -148.4630200005255 65.01047999977919, -148.4648500004927 65.00898999992751, -148.466480000392 65.00734000002149, -148.4677900355436 65.00472812040925, -148.4678953842795 65.0045180620574, -148.4689400012282 65.00142999997701, -148.4691890681716 65.00087774780837, -148.4696833359056 64.9997817550319, -148.470480000442 64.9987799984213, -148.4725000011287 64.99773999937747, -148.4759300016398 64.99630000019761, -148.4771114544676 64.99570064042348, -148.4788537666308 64.99430364564563, -148.4826219690773 64.99391567746977, -148.4874281274788 64.99320716567104, -148.4913011914632 64.99292186009308, -148.4943174586139 64.99262299154805, -148.4981470362368 64.99216857452501, -148.5015947304217 64.99144294923741, -148.5039482954939 64.990973367518, -148.5048332384966 64.99045220828117, -148.5053359562367 64.98921814329481, -148.5042842447928 64.9883712934228, -148.5010520624355 64.98800007464683, -148.4973591294795 64.98818001315345, -148.4903337063593 64.98897527503073, -148.485345891161 64.98929340361769, -148.4795349390187 64.98966013414639, -148.4775199989061 64.98850000147519, -148.4745600005193 64.98700000096528, -148.471699999547 64.9833199997143, -148.4681499989951 64.97882000080398, -148.4666722602962 64.9756643308163, -148.4665600004192 64.97416000052954, -148.4661999989871 64.97277999875075, -148.4650700005675 64.97143000025636, -148.4640093414419 64.97080265016427, -148.4628142313506 64.97009573223681, -148.4620099995273 64.96962000160562, -148.4618567455953 64.96961620748476, -148.4614782594474 64.96942664943458, -148.4598182575734 64.96893576851335, -148.4536700006213 64.96761000157716, -148.4487799996138 64.96622999979837, -148.4423399987343 64.96448999920693, -148.4402099999748 64.96339000145235, -148.4397699998252 64.96224000040655, -148.4397849536643 64.96133779461235, -148.4396582494107 64.96122947161047, -148.4379060963693 64.95777518584453, -148.4351494364053 64.95236794152066, -148.4341252896358 64.95051261379939, -148.4336461918369 64.95000396848212, -148.4326677303688 64.94967417071433, -148.4312261504144 64.9496943226431, -148.4274077338195 64.95021227580196, -148.4249869485031 64.9502836608043, -148.4239955946201 64.95031288352391, -148.4233534465399 64.95033180959939, -148.4193875700035 64.95055001018432, -148.410199567404 64.95105270173099, -148.4071979777517 64.95096232255025, -148.3997900949375 64.95123385692324, -148.3944654857017 64.9530024044434, -148.3860846014435 64.95415602411396, -148.380667186204 64.95455384495511, -148.3795556764293 64.95500717756943, -148.3788123705647 64.95541219113124, -148.3774486833746 64.95607947575331, -148.3766577250807 64.95675944717169, -148.3766052713925 64.95727565060821, -148.3770170284574 64.95794499796432, -148.377050976475 64.95800018100971, -148.3771632101586 64.95806187181716, -148.3772045434187 64.95807053268055, -148.3774508535018 64.95828005668602, -148.377498737743 64.95832078880647, -148.377759414932 64.95856235525622, -148.3781711340164 64.95878103911025, -148.3784735543929 64.95901422234715, -148.3788887925669 64.95936592831441, -148.3792663134863 64.95965258940328, -148.3797080397841 64.95992131452897, -148.3797919439446 64.96002399153332, -148.3799253235983 64.96023662863001, -148.3799373699648 64.96025583366571, -148.3799253864626 64.96027401060854, -148.3798222785761 64.96043041037359, -148.3798023047627 64.96046070571492, -148.3797408130255 64.96055398058127, -148.3797688924012 64.96085547632907, -148.3800383705885 64.96131891044644, -148.3801248718294 64.96147992942593, -148.3804082652857 64.96191838547173, -148.3804958561739 64.96223228774596, -148.3804993752636 64.96251140643164, -148.3804642550893 64.96266856580667, -148.3804734764924 64.96285187671958, -148.3804406181223 64.96297794185318, -148.3803955247928 64.96345177084009, -148.3803961940354 64.96349963150726, -148.380437265361 64.96386935856634, -148.3804609036377 64.96397647797937, -148.3803516036201 64.96426590640596, -148.3803191643452 64.96442038357196, -148.3802623363513 64.96484149038787, -148.3803492553776 64.96490510903305, -148.3809197277082 64.96508850507468, -148.3811571032064 64.96517140209716, -148.3813156063053 64.96542520612559, -148.3816272441559 64.96598654218172, -148.3816793795937 64.96658065147938, -148.3820580739796 64.96716864198771, -148.3823038326906 64.96757156007368, -148.3823237803105 64.96761866636962, -148.3823864782559 64.96775411792504, -148.3824091368976 64.96780183714759, -148.3819600004736 64.96810000108889, -148.3805500006492 64.96962000029595, -148.3777400003488 64.97000999977365, -148.3746299999464 64.96986999841641, -148.3716999996053 64.96940999956973, -148.3693700688807 64.96870474361651, -148.3704556510715 64.96824846031035, -148.3716986624298 64.96719965110043, -148.3728913037886 64.96588657488957, -148.3722037716317 64.96468081454253, -148.3700530198037 64.96407850407655, -148.3674836154858 64.96350482435821, -148.3659655231618 64.96283775452241, -148.3646722033587 64.96195656111172, -148.3631116881271 64.96117245240436, -148.3612595533871 64.9608537213681, -148.359609841609 64.96051427524395, -148.3579713393167 64.96011922435986, -148.3560216693461 64.95962893933955, -148.3542673671323 64.95948162084278, -148.3520203714107 64.95948445628346, -148.3501949120776 64.95936251661789, -148.3483878064931 64.95882129058094, -148.3469311181582 64.958180732443, -148.3458400418918 64.95769335620503, -148.344821788648 64.95684466755296, -148.3441971115972 64.95601021111054, -148.343851605619 64.95510186688193, -148.3411043373156 64.95463851003529, -148.3382125322595 64.95358196459068, -148.3351337138467 64.95279853822257, -148.3308052859461 64.95166178058383, -148.3302523252447 64.95080186149119, -148.329953998904 64.94933527858154, -148.3236780331795 64.9477077055052, -148.3213589203488 64.94709154525384, -148.3184873025826 64.94659524097932, -148.313846778446 64.94655529204294, -148.3083189591352 64.94649584994295, -148.3075757462573 64.94648784260607, -148.3053740442451 64.94646410217501, -148.2992930494466 64.94732037644945, -148.2930874877798 64.94839646089616, -148.2897545745913 64.94912953560021, -148.2873323656611 64.94940456417908, -148.2865662178006 64.94965351456165, -148.2850427977293 64.94964716396032, -148.2842981455215 64.94964405479811, -148.2807296235829 64.94962910357827, -148.2749596864503 64.94986141719272, -148.2686122807172 64.95065066112551, -148.2618036790968 64.9518252565087, -148.2610336441288 64.95214683739204, -148.2596114984027 64.95249326406997, -148.2583534480766 64.95265094731394, -148.2578890343243 64.95276207825339, -148.2571120384476 64.95299071561749, -148.2565297921623 64.95326090757629, -148.251326658968 64.9547869836631, -148.248432115387 64.95545683786241, -148.2443829633328 64.95607704893041, -148.2411535352165 64.95683790309516, -148.2380841556124 64.95745650850483, -148.2366640726204 64.95779057318521, -148.2316172082239 64.95784155742098, -148.2249859886296 64.95784259337182, -148.2183133820788 64.95779126469222, -148.2150862406504 64.95759969760462, -148.2111793085385 64.95712510638839, -148.2070109946338 64.95657001877908, -148.203830876992 64.95661712507496, -148.2014863408011 64.95638876012276, -148.1993577983972 64.95619194255863, -148.1960149578922 64.95595001463931, -148.1936230456129 64.95541336328802, -148.1908710166504 64.95500470752734, -148.1889280613701 64.95480992126505, -148.1869174313892 64.95422134140415, -148.1853585545578 64.95369196135385, -148.183965305443 64.95316872759599, -148.1812561433669 64.95309146609378, -148.1783299096435 64.95352461403746, -148.1748649867186 64.95440904102924, -148.1721725557071 64.95532220354249, -148.1669249971162 64.95675283856491, -148.163271104184 64.95800712227327, -148.157881333509 64.95931432984224, -148.1525901994989 64.95961150367128, -148.1488088846126 64.95987073498196, -148.1463068825834 64.96013064077397, -148.1443847157326 64.96051093426973, -148.144343724297 64.96154064976611, -148.1450132864394 64.9620813519341, -148.1469237880384 64.96167409228411, -148.1506507528309 64.96089282163678, -148.1546971323087 64.96108099143424, -148.1582184182938 64.96128626555287, -148.1620292361697 64.96260715788844, -148.1672635330181 64.96335495461966, -148.1727892764982 64.96311903940619, -148.1809728206329 64.96180335563764, -148.1844446966085 64.96056988131352, -148.1848876919788 64.96045006986554, -148.1873364715422 64.96255566549979, -148.1886712398565 64.9649254705094, -148.1895612093818 64.96650534007927, -148.1900985876013 64.96810893436418, -148.1906662965232 64.96956634039947, -148.191603369725 64.97007991794294, -148.1959102102958 64.97027664121066, -148.1978054136118 64.96994185228147, -148.199281080409 64.96911271441854, -148.2007944264804 64.96810082356313, -148.2017371234153 64.96732556169263, -148.2040386421075 64.96586411138901, -148.2066731947678 64.96489373845753, -148.2099223255953 64.96431436035471, -148.2128187027177 64.96375869256059, -148.2163599284647 64.96344779205543, -148.2186145635052 64.96305242161128, -148.220782868872 64.96265383068283, -148.2243163452876 64.96237929977946, -148.2276396310745 64.96228106387412, -148.2291398463707 64.96259422618346, -148.2295934330614 64.96334749341617, -148.2297506487523 64.96427395565235, -148.2306506883484 64.96497004258924, -148.2327925802428 64.96512270454934, -148.2352217055529 64.96518624985288, -148.2366696387279 64.96785253587478, -148.2367990815065 64.96809087005312, -148.2402036193674 64.97435802561159, -148.2386825868289 64.97560729458451, -148.239508957354 64.97555546037137, -148.23961858348 64.97550091775571, -148.2417614825124 64.97548188690649, -148.2432022923794 64.97522692119873, -148.2443149664529 64.97495986852459, -148.2449653589207 64.97436780624486, -148.2454844881653 64.97377091389347, -148.2463116575907 64.97296135694222, -148.2467222961953 64.97224847476679, -148.2467704109389 64.97172686500272, -148.2484462375842 64.97117562259149, -148.2496482195264 64.97016615986865, -148.2505066364248 64.96921430832384, -148.2513935648908 64.96812301596151, -148.251922689555 64.96715905911492, -148.252401799141 64.96643911649579, -148.2523076258394 64.96613705235012, -148.2520008481829 64.965152998581, -148.2522470194407 64.96436125841274, -148.2518461313468 64.96388994530639, -148.2518315009967 64.96315185848619, -148.2517274514558 64.96244560456262, -148.2511406226268 64.96207281679921, -148.2511797294439 64.96147719352035, -148.2513296659758 64.96074515869617, -148.2506534637945 64.96040420251973, -148.2490794288151 64.95999510147044, -148.2482999733736 64.95973987513787, -148.2479919214059 64.95963900417172, -148.2475446211425 64.95899036142623, -148.2474729558703 64.95853114838292, -148.2496941746203 64.95861286146157, -148.2509676240742 64.95887042163037, -148.2516471292492 64.95892198736067, -148.2523550176438 64.95876706490606, -148.25480858275 64.9577460325375, -148.2569387334316 64.95662729468091, -148.2584837277358 64.9557762879088, -148.2604817259266 64.9547931980585, -148.2622952620025 64.95407049595968, -148.2642207789952 64.95354471096005, -148.2663159797598 64.95349983634588, -148.2674565616418 64.95302202464524, -148.2680631364011 64.9521945395889, -148.2691240810352 64.95177589364732, -148.271238896763 64.95153967328019, -148.2727945177488 64.95130479139829, -148.2744288814764 64.95148267764824, -148.2756123773931 64.95183399595248, -148.2763401584014 64.95247659194064, -148.2759734710919 64.95330308950406, -148.2744004982568 64.95388942720581, -148.2721344703763 64.95431036900305, -148.2708771888278 64.95432028977126, -148.2703607365535 64.95393739264676, -148.2693001966082 64.95395451137438, -148.2676469644307 64.9542858624136, -148.2660163974433 64.9545060406038, -148.2658114546718 64.95486249544308, -148.2662023813976 64.95521281053828, -148.2655213596219 64.95563579804372, -148.2644889095296 64.95592453365362, -148.2637095719587 64.95614247623314, -148.2639175309057 64.95674715458676, -148.2657138447899 64.95769106296871, -148.2672879897818 64.95809999637993, -148.269387397214 64.95796624215984, -148.2706965706012 64.95804934349121, -148.2711048072668 64.95848574597079, -148.2712022128398 64.95922683979876, -148.27151397249 64.95972994651163, -148.271790171916 64.9604073509721, -148.2722634194084 64.96133781687678, -148.2736346765047 64.96233629144842, -148.2756957838781 64.96279808192691, -148.2778280326548 64.96291124547793, -148.2793914173785 64.96296844934778, -148.2814739732564 64.96332558259735, -148.2830444891462 64.96334788893722, -148.284768282542 64.96302458321537, -148.2866849893687 64.96256783104644, -148.2888952933091 64.96229737715322, -148.2896954075225 64.96162420817313, -148.2899536041921 64.96152670699405, -148.2899635236506 64.96152864007047, -148.2924390362464 64.9615839016962, -148.2936689338553 64.96124247796678, -148.2965727224136 64.96082163439502, -148.2972407509296 64.96038945167982, -148.2977654554495 64.9598466815392, -148.2986829634557 64.95900216550331, -148.2989537146446 64.95848525353398, -148.30001885154 64.95813778173755, -148.3017138255953 64.95795373609837, -148.3029222249321 64.95771682422424, -148.3042951466221 64.95748589755289, -148.3049983385316 64.95687937910952, -148.3056475195525 64.95613041676989, -148.3060428048679 64.95540732569833, -148.3054252301704 64.95436639678712, -148.3041797775828 64.95396983847013, -148.3017659466267 64.95402234323552, -148.3009733185006 64.95380783330734, -148.301256199875 64.95372288926694, -148.3003198090124 64.95312881664012, -148.2982891227089 64.95271880143952, -148.298091060956 64.95206765329073, -148.2992883031939 64.95202733109772, -148.3012477380817 64.95246273429728, -148.3033214693872 64.95298626535077, -148.304439814342 64.953334977407, -148.3053917038673 64.95320167764322, -148.30772272162 64.95278264403868, -148.3086997673322 64.95251889959695, -148.3093157887583 64.9527521614142, -148.3123310592483 64.95300237301126, -148.3141195596271 64.95317279150942, -148.3165474093163 64.95305037381343, -148.3177177901738 64.95340898044435, -148.3189869583087 64.95327952064002, -148.3197081542843 64.95323709249385, -148.3201915936472 64.9535161509346, -148.3213444668044 64.95403801477516, -148.3212197047949 64.95494094350852, -148.3213536764206 64.95550769244062, -148.321974209668 64.95612723426603, -148.3238170404954 64.95643997748022, -148.3266635204101 64.95629747464869, -148.327605206278 64.95628193014733, -148.3290006163522 64.95699947606607, -148.3314802976352 64.95846119092352, -148.3326199103597 64.95903442142418, -148.3327216915481 64.96049389019345, -148.3342890995853 64.96189448918966, -148.3364409554671 64.96236438130143, -148.3402520392065 64.96345421861776, -148.3449330924643 64.96449142674982, -148.3483806779464 64.96509197963547, -148.3502456671207 64.96501938842493, -148.3513416559681 64.96449907261712, -148.3524610552092 64.96484744939715, -148.3530638031058 64.96579305904351, -148.3537972405891 64.96589468307121, -148.3533126264502 64.96671188981878, -148.3539871247477 64.96720437246933, -148.3533599999193 64.96727000015193, -148.3498800000459 64.96771000161118, -148.3464500008445 64.96823999851716, -148.3447900015899 64.96853000058024, -148.3400000006164 64.96950000156482, -148.3366000007703 64.97006000044553, -148.3348299995138 64.97023999919702, -148.3311600002308 64.97043000122613, -148.3275299996517 64.97057999931258, -148.3240800004434 64.97095999944179, -148.3209300000275 64.97153000029039, -148.3208900916909 64.97152527761182, -148.3197333183293 64.97187038283028, -148.3194400014854 64.97185000039917, -148.3165000004861 64.97253000063029, -148.3142100003624 64.97340000027123, -148.3131390131606 64.97428978251332, -148.3136603033646 64.97503578368367, -148.3138100002265 64.97525000024524, -148.3157199989112 64.97607000052398, -148.3173927425877 64.97628215435157, -148.3181154158738 64.97710949927301, -148.318506832417 64.97752678315527, -148.3187389443419 64.97826073664947, -148.3191775248066 64.97838722480719, -148.3187036827229 64.9785124478214, -148.3174808822287 64.97901466526673, -148.3183191301726 64.97940472760871, -148.3179133845039 64.98006608334396, -148.3178643739444 64.98039869559773, -148.317717597652 64.98046658639413, -148.3165037173362 64.98102803770149, -148.3158305797883 64.98133936777919, -148.3136403766995 64.98169043855529, -148.3124228974041 64.98159245803612, -148.3106442287358 64.9817736328734, -148.3085689899975 64.9821898415147, -148.3075063283829 64.98248161818384, -148.3074353009211 64.9823643173778, -148.3075113274024 64.98152061988714, -148.307689970643 64.98064034848585, -148.3053761881787 64.98031430947776, -148.3052377492606 64.98037990703784, -148.304154185275 64.98023807737798, -148.3033326487505 64.98101592847075, -148.3035788815629 64.9822540966606, -148.303609042008 64.9829224774785, -148.3029990450748 64.98388363555517, -148.30328332256 64.98452614903402, -148.303235581073 64.98557802025795, -148.3029986141926 64.98634992936718, -148.3001099994984 64.98611999935645, -148.2988772743069 64.9865277226304, -148.298759997075 64.98649000013705, -148.2985074044935 64.98665005257834, -148.2976941778403 64.98716532090884, -148.2961399988037 64.98814999939168, -148.29416000075 64.99019000139481, -148.2919799986993 64.99236999951654, -148.2910500003476 64.99376000064387, -148.2943157993754 64.99484862651326, -148.2946053050727 64.99503986356336, -148.2946899989657 64.99503000042074, -148.296969998431 64.99563999997326, -148.3006600003402 64.99654000158887, -148.3006688655125 64.99656069048336, -148.303190430118 64.99696088445086, -148.3032105912145 64.99718197417303, -148.3038899994737 64.99720999985215, -148.3063199996449 64.99755000127738, -148.3073614236123 64.99776908065252, -148.3077700007926 64.99793999944546, -148.3085600004063 64.99809999949986, -148.3094099961114 64.99820000346284, -148.3121299983457 64.99851999964261, -148.3139300002672 64.99865999969018, -148.3157000002141 64.99879000038925, -148.316639999224 64.99889999977177, -148.3180141624833 64.99914803731269, -148.3194200014786 64.99951999998257, -148.3211799994576 65.00009999887004, -148.3229000000423 65.00068999972541, -148.3241044886974 65.00118402124099, -148.3253100002067 65.00175000008574, -148.3259799997796 65.00217999957709, -148.3273699995973 65.00380999947635, -148.3293199996053 65.00625000030578, -148.3312600002648 65.0080600002662, -148.3343199999953 65.00923999935765, -148.3350104396249 65.00939097184039, -148.335234252156 65.01018466211087, -148.3351465892357 65.01100225914081, -148.3339866936152 65.01174824459508, -148.334658432433 65.01226500464242, -148.3368734105941 65.01244359287676, -148.3390489073719 65.01281770733829, -148.3417658200891 65.01281737992019, -148.3440400975958 65.01270253344023, -148.3452138914596 65.01304038438343, -148.3470812878118 65.01340325923667, -148.3486601947724 65.01365721256769, -148.3506178891056 65.01395763962284, -148.3519985090498 65.01404025375609, -148.3538791959572 65.01433786239636, -148.3545136981701 65.01465620053091, -148.3556942656594 65.01496138169676, -148.35727017478 65.01446004435132, -148.3590641024411 65.0140322045097, -148.361102294477 65.01354747904861, -148.3619877351552 65.01377632857964, -148.3634815618695 65.01445385091068, -148.364793324479 65.01410708764695, -148.3662673162052 65.01333936556028, -148.3668481362573 65.01302032806069, -148.3708081886807 65.01304589286542, -148.3711290400765 65.0134813091617, -148.3721097764455 65.01400898663792, -148.3738183724032 65.01400470138992, -148.3752070520711 65.0136606203352, -148.376363068442 65.01370212385268, -148.3766764533957 65.01407449514028, -148.3768917281725 65.01493578153088, -148.3783168455452 65.0151839028909, -148.3797186062208 65.01477459229397, -148.381435142722 65.01434373103825, -148.382481453077 65.01454539962884, -148.3830196105516 65.01495864186217, -148.3845231733703 65.01481557325218, -148.3849148151772 65.01482634661716, -148.3854207822145 65.01577727746229, -148.387758416432 65.01701172749227, -148.3907954156963 65.01809066440546, -148.3921436592297 65.01856960242435, -148.395929999329 65.02006999976498))
-
 - Test ASFSearchResults_intersection complex-polygon:
     wkt: POLYGON ((0 0, 5 0, 5 5, 5 5.1, 0 5, 0 5, 0 0))
 


=====================================
tests/yml_tests/test_known_bugs.yml
=====================================
@@ -1,4 +1,5 @@
 # To exclude from the pipeline, but still keep track of
 
 tests:
-    [] # placeholder until this file has tests
+- Test ASFSearchResults_intersection Shovel_Creek Polygon:
+    wkt: POLYGON ((-148.395929999329 65.02006999976498, -148.398010619511 65.02049651421811, -148.3980473296276 65.02074794119113, -148.3982428597838 65.02104161295625, -148.3992698433036 65.02120374777655, -148.4007460405182 65.02123858637134, -148.401412730549 65.02108323434425, -148.4027226255657 65.0207780217462, -148.4035199986349 65.0207700013126, -148.4086000003617 65.02056000058639, -148.4120399989118 65.02099999942624, -148.4150700005966 65.02205999978662, -148.4207299999013 65.02348000026927, -148.4247500012678 65.02348000026927, -148.4283700011887 65.02275000067596, -148.4360600005286 65.02072999998933, -148.4453999984648 65.01838999919386, -148.4505993951639 65.01648358639204, -148.4509054577393 65.01644310572868, -148.4524066683864 65.01582945088057, -148.4524399995483 65.0158299996333, -148.4554199992516 65.01481999994485, -148.4574399986286 65.01414000102335, -148.4595599993493 65.01347999948933, -148.4620200014952 65.01214000165317, -148.4626900010681 65.01101999996274, -148.4630200005255 65.01047999977919, -148.4648500004927 65.00898999992751, -148.466480000392 65.00734000002149, -148.4677900355436 65.00472812040925, -148.4678953842795 65.0045180620574, -148.4689400012282 65.00142999997701, -148.4691890681716 65.00087774780837, -148.4696833359056 64.9997817550319, -148.470480000442 64.9987799984213, -148.4725000011287 64.99773999937747, -148.4759300016398 64.99630000019761, -148.4771114544676 64.99570064042348, -148.4788537666308 64.99430364564563, -148.4826219690773 64.99391567746977, -148.4874281274788 64.99320716567104, -148.4913011914632 64.99292186009308, -148.4943174586139 64.99262299154805, -148.4981470362368 64.99216857452501, -148.5015947304217 64.99144294923741, -148.5039482954939 64.990973367518, -148.5048332384966 64.99045220828117, -148.5053359562367 64.98921814329481, -148.5042842447928 64.9883712934228, -148.5010520624355 64.98800007464683, -148.4973591294795 64.98818001315345, -148.4903337063593 64.98897527503073, -148.485345891161 64.98929340361769, -148.4795349390187 64.98966013414639, -148.4775199989061 64.98850000147519, -148.4745600005193 64.98700000096528, -148.471699999547 64.9833199997143, -148.4681499989951 64.97882000080398, -148.4666722602962 64.9756643308163, -148.4665600004192 64.97416000052954, -148.4661999989871 64.97277999875075, -148.4650700005675 64.97143000025636, -148.4640093414419 64.97080265016427, -148.4628142313506 64.97009573223681, -148.4620099995273 64.96962000160562, -148.4618567455953 64.96961620748476, -148.4614782594474 64.96942664943458, -148.4598182575734 64.96893576851335, -148.4536700006213 64.96761000157716, -148.4487799996138 64.96622999979837, -148.4423399987343 64.96448999920693, -148.4402099999748 64.96339000145235, -148.4397699998252 64.96224000040655, -148.4397849536643 64.96133779461235, -148.4396582494107 64.96122947161047, -148.4379060963693 64.95777518584453, -148.4351494364053 64.95236794152066, -148.4341252896358 64.95051261379939, -148.4336461918369 64.95000396848212, -148.4326677303688 64.94967417071433, -148.4312261504144 64.9496943226431, -148.4274077338195 64.95021227580196, -148.4249869485031 64.9502836608043, -148.4239955946201 64.95031288352391, -148.4233534465399 64.95033180959939, -148.4193875700035 64.95055001018432, -148.410199567404 64.95105270173099, -148.4071979777517 64.95096232255025, -148.3997900949375 64.95123385692324, -148.3944654857017 64.9530024044434, -148.3860846014435 64.95415602411396, -148.380667186204 64.95455384495511, -148.3795556764293 64.95500717756943, -148.3788123705647 64.95541219113124, -148.3774486833746 64.95607947575331, -148.3766577250807 64.95675944717169, -148.3766052713925 64.95727565060821, -148.3770170284574 64.95794499796432, -148.377050976475 64.95800018100971, -148.3771632101586 64.95806187181716, -148.3772045434187 64.95807053268055, -148.3774508535018 64.95828005668602, -148.377498737743 64.95832078880647, -148.377759414932 64.95856235525622, -148.3781711340164 64.95878103911025, -148.3784735543929 64.95901422234715, -148.3788887925669 64.95936592831441, -148.3792663134863 64.95965258940328, -148.3797080397841 64.95992131452897, -148.3797919439446 64.96002399153332, -148.3799253235983 64.96023662863001, -148.3799373699648 64.96025583366571, -148.3799253864626 64.96027401060854, -148.3798222785761 64.96043041037359, -148.3798023047627 64.96046070571492, -148.3797408130255 64.96055398058127, -148.3797688924012 64.96085547632907, -148.3800383705885 64.96131891044644, -148.3801248718294 64.96147992942593, -148.3804082652857 64.96191838547173, -148.3804958561739 64.96223228774596, -148.3804993752636 64.96251140643164, -148.3804642550893 64.96266856580667, -148.3804734764924 64.96285187671958, -148.3804406181223 64.96297794185318, -148.3803955247928 64.96345177084009, -148.3803961940354 64.96349963150726, -148.380437265361 64.96386935856634, -148.3804609036377 64.96397647797937, -148.3803516036201 64.96426590640596, -148.3803191643452 64.96442038357196, -148.3802623363513 64.96484149038787, -148.3803492553776 64.96490510903305, -148.3809197277082 64.96508850507468, -148.3811571032064 64.96517140209716, -148.3813156063053 64.96542520612559, -148.3816272441559 64.96598654218172, -148.3816793795937 64.96658065147938, -148.3820580739796 64.96716864198771, -148.3823038326906 64.96757156007368, -148.3823237803105 64.96761866636962, -148.3823864782559 64.96775411792504, -148.3824091368976 64.96780183714759, -148.3819600004736 64.96810000108889, -148.3805500006492 64.96962000029595, -148.3777400003488 64.97000999977365, -148.3746299999464 64.96986999841641, -148.3716999996053 64.96940999956973, -148.3693700688807 64.96870474361651, -148.3704556510715 64.96824846031035, -148.3716986624298 64.96719965110043, -148.3728913037886 64.96588657488957, -148.3722037716317 64.96468081454253, -148.3700530198037 64.96407850407655, -148.3674836154858 64.96350482435821, -148.3659655231618 64.96283775452241, -148.3646722033587 64.96195656111172, -148.3631116881271 64.96117245240436, -148.3612595533871 64.9608537213681, -148.359609841609 64.96051427524395, -148.3579713393167 64.96011922435986, -148.3560216693461 64.95962893933955, -148.3542673671323 64.95948162084278, -148.3520203714107 64.95948445628346, -148.3501949120776 64.95936251661789, -148.3483878064931 64.95882129058094, -148.3469311181582 64.958180732443, -148.3458400418918 64.95769335620503, -148.344821788648 64.95684466755296, -148.3441971115972 64.95601021111054, -148.343851605619 64.95510186688193, -148.3411043373156 64.95463851003529, -148.3382125322595 64.95358196459068, -148.3351337138467 64.95279853822257, -148.3308052859461 64.95166178058383, -148.3302523252447 64.95080186149119, -148.329953998904 64.94933527858154, -148.3236780331795 64.9477077055052, -148.3213589203488 64.94709154525384, -148.3184873025826 64.94659524097932, -148.313846778446 64.94655529204294, -148.3083189591352 64.94649584994295, -148.3075757462573 64.94648784260607, -148.3053740442451 64.94646410217501, -148.2992930494466 64.94732037644945, -148.2930874877798 64.94839646089616, -148.2897545745913 64.94912953560021, -148.2873323656611 64.94940456417908, -148.2865662178006 64.94965351456165, -148.2850427977293 64.94964716396032, -148.2842981455215 64.94964405479811, -148.2807296235829 64.94962910357827, -148.2749596864503 64.94986141719272, -148.2686122807172 64.95065066112551, -148.2618036790968 64.9518252565087, -148.2610336441288 64.95214683739204, -148.2596114984027 64.95249326406997, -148.2583534480766 64.95265094731394, -148.2578890343243 64.95276207825339, -148.2571120384476 64.95299071561749, -148.2565297921623 64.95326090757629, -148.251326658968 64.9547869836631, -148.248432115387 64.95545683786241, -148.2443829633328 64.95607704893041, -148.2411535352165 64.95683790309516, -148.2380841556124 64.95745650850483, -148.2366640726204 64.95779057318521, -148.2316172082239 64.95784155742098, -148.2249859886296 64.95784259337182, -148.2183133820788 64.95779126469222, -148.2150862406504 64.95759969760462, -148.2111793085385 64.95712510638839, -148.2070109946338 64.95657001877908, -148.203830876992 64.95661712507496, -148.2014863408011 64.95638876012276, -148.1993577983972 64.95619194255863, -148.1960149578922 64.95595001463931, -148.1936230456129 64.95541336328802, -148.1908710166504 64.95500470752734, -148.1889280613701 64.95480992126505, -148.1869174313892 64.95422134140415, -148.1853585545578 64.95369196135385, -148.183965305443 64.95316872759599, -148.1812561433669 64.95309146609378, -148.1783299096435 64.95352461403746, -148.1748649867186 64.95440904102924, -148.1721725557071 64.95532220354249, -148.1669249971162 64.95675283856491, -148.163271104184 64.95800712227327, -148.157881333509 64.95931432984224, -148.1525901994989 64.95961150367128, -148.1488088846126 64.95987073498196, -148.1463068825834 64.96013064077397, -148.1443847157326 64.96051093426973, -148.144343724297 64.96154064976611, -148.1450132864394 64.9620813519341, -148.1469237880384 64.96167409228411, -148.1506507528309 64.96089282163678, -148.1546971323087 64.96108099143424, -148.1582184182938 64.96128626555287, -148.1620292361697 64.96260715788844, -148.1672635330181 64.96335495461966, -148.1727892764982 64.96311903940619, -148.1809728206329 64.96180335563764, -148.1844446966085 64.96056988131352, -148.1848876919788 64.96045006986554, -148.1873364715422 64.96255566549979, -148.1886712398565 64.9649254705094, -148.1895612093818 64.96650534007927, -148.1900985876013 64.96810893436418, -148.1906662965232 64.96956634039947, -148.191603369725 64.97007991794294, -148.1959102102958 64.97027664121066, -148.1978054136118 64.96994185228147, -148.199281080409 64.96911271441854, -148.2007944264804 64.96810082356313, -148.2017371234153 64.96732556169263, -148.2040386421075 64.96586411138901, -148.2066731947678 64.96489373845753, -148.2099223255953 64.96431436035471, -148.2128187027177 64.96375869256059, -148.2163599284647 64.96344779205543, -148.2186145635052 64.96305242161128, -148.220782868872 64.96265383068283, -148.2243163452876 64.96237929977946, -148.2276396310745 64.96228106387412, -148.2291398463707 64.96259422618346, -148.2295934330614 64.96334749341617, -148.2297506487523 64.96427395565235, -148.2306506883484 64.96497004258924, -148.2327925802428 64.96512270454934, -148.2352217055529 64.96518624985288, -148.2366696387279 64.96785253587478, -148.2367990815065 64.96809087005312, -148.2402036193674 64.97435802561159, -148.2386825868289 64.97560729458451, -148.239508957354 64.97555546037137, -148.23961858348 64.97550091775571, -148.2417614825124 64.97548188690649, -148.2432022923794 64.97522692119873, -148.2443149664529 64.97495986852459, -148.2449653589207 64.97436780624486, -148.2454844881653 64.97377091389347, -148.2463116575907 64.97296135694222, -148.2467222961953 64.97224847476679, -148.2467704109389 64.97172686500272, -148.2484462375842 64.97117562259149, -148.2496482195264 64.97016615986865, -148.2505066364248 64.96921430832384, -148.2513935648908 64.96812301596151, -148.251922689555 64.96715905911492, -148.252401799141 64.96643911649579, -148.2523076258394 64.96613705235012, -148.2520008481829 64.965152998581, -148.2522470194407 64.96436125841274, -148.2518461313468 64.96388994530639, -148.2518315009967 64.96315185848619, -148.2517274514558 64.96244560456262, -148.2511406226268 64.96207281679921, -148.2511797294439 64.96147719352035, -148.2513296659758 64.96074515869617, -148.2506534637945 64.96040420251973, -148.2490794288151 64.95999510147044, -148.2482999733736 64.95973987513787, -148.2479919214059 64.95963900417172, -148.2475446211425 64.95899036142623, -148.2474729558703 64.95853114838292, -148.2496941746203 64.95861286146157, -148.2509676240742 64.95887042163037, -148.2516471292492 64.95892198736067, -148.2523550176438 64.95876706490606, -148.25480858275 64.9577460325375, -148.2569387334316 64.95662729468091, -148.2584837277358 64.9557762879088, -148.2604817259266 64.9547931980585, -148.2622952620025 64.95407049595968, -148.2642207789952 64.95354471096005, -148.2663159797598 64.95349983634588, -148.2674565616418 64.95302202464524, -148.2680631364011 64.9521945395889, -148.2691240810352 64.95177589364732, -148.271238896763 64.95153967328019, -148.2727945177488 64.95130479139829, -148.2744288814764 64.95148267764824, -148.2756123773931 64.95183399595248, -148.2763401584014 64.95247659194064, -148.2759734710919 64.95330308950406, -148.2744004982568 64.95388942720581, -148.2721344703763 64.95431036900305, -148.2708771888278 64.95432028977126, -148.2703607365535 64.95393739264676, -148.2693001966082 64.95395451137438, -148.2676469644307 64.9542858624136, -148.2660163974433 64.9545060406038, -148.2658114546718 64.95486249544308, -148.2662023813976 64.95521281053828, -148.2655213596219 64.95563579804372, -148.2644889095296 64.95592453365362, -148.2637095719587 64.95614247623314, -148.2639175309057 64.95674715458676, -148.2657138447899 64.95769106296871, -148.2672879897818 64.95809999637993, -148.269387397214 64.95796624215984, -148.2706965706012 64.95804934349121, -148.2711048072668 64.95848574597079, -148.2712022128398 64.95922683979876, -148.27151397249 64.95972994651163, -148.271790171916 64.9604073509721, -148.2722634194084 64.96133781687678, -148.2736346765047 64.96233629144842, -148.2756957838781 64.96279808192691, -148.2778280326548 64.96291124547793, -148.2793914173785 64.96296844934778, -148.2814739732564 64.96332558259735, -148.2830444891462 64.96334788893722, -148.284768282542 64.96302458321537, -148.2866849893687 64.96256783104644, -148.2888952933091 64.96229737715322, -148.2896954075225 64.96162420817313, -148.2899536041921 64.96152670699405, -148.2899635236506 64.96152864007047, -148.2924390362464 64.9615839016962, -148.2936689338553 64.96124247796678, -148.2965727224136 64.96082163439502, -148.2972407509296 64.96038945167982, -148.2977654554495 64.9598466815392, -148.2986829634557 64.95900216550331, -148.2989537146446 64.95848525353398, -148.30001885154 64.95813778173755, -148.3017138255953 64.95795373609837, -148.3029222249321 64.95771682422424, -148.3042951466221 64.95748589755289, -148.3049983385316 64.95687937910952, -148.3056475195525 64.95613041676989, -148.3060428048679 64.95540732569833, -148.3054252301704 64.95436639678712, -148.3041797775828 64.95396983847013, -148.3017659466267 64.95402234323552, -148.3009733185006 64.95380783330734, -148.301256199875 64.95372288926694, -148.3003198090124 64.95312881664012, -148.2982891227089 64.95271880143952, -148.298091060956 64.95206765329073, -148.2992883031939 64.95202733109772, -148.3012477380817 64.95246273429728, -148.3033214693872 64.95298626535077, -148.304439814342 64.953334977407, -148.3053917038673 64.95320167764322, -148.30772272162 64.95278264403868, -148.3086997673322 64.95251889959695, -148.3093157887583 64.9527521614142, -148.3123310592483 64.95300237301126, -148.3141195596271 64.95317279150942, -148.3165474093163 64.95305037381343, -148.3177177901738 64.95340898044435, -148.3189869583087 64.95327952064002, -148.3197081542843 64.95323709249385, -148.3201915936472 64.9535161509346, -148.3213444668044 64.95403801477516, -148.3212197047949 64.95494094350852, -148.3213536764206 64.95550769244062, -148.321974209668 64.95612723426603, -148.3238170404954 64.95643997748022, -148.3266635204101 64.95629747464869, -148.327605206278 64.95628193014733, -148.3290006163522 64.95699947606607, -148.3314802976352 64.95846119092352, -148.3326199103597 64.95903442142418, -148.3327216915481 64.96049389019345, -148.3342890995853 64.96189448918966, -148.3364409554671 64.96236438130143, -148.3402520392065 64.96345421861776, -148.3449330924643 64.96449142674982, -148.3483806779464 64.96509197963547, -148.3502456671207 64.96501938842493, -148.3513416559681 64.96449907261712, -148.3524610552092 64.96484744939715, -148.3530638031058 64.96579305904351, -148.3537972405891 64.96589468307121, -148.3533126264502 64.96671188981878, -148.3539871247477 64.96720437246933, -148.3533599999193 64.96727000015193, -148.3498800000459 64.96771000161118, -148.3464500008445 64.96823999851716, -148.3447900015899 64.96853000058024, -148.3400000006164 64.96950000156482, -148.3366000007703 64.97006000044553, -148.3348299995138 64.97023999919702, -148.3311600002308 64.97043000122613, -148.3275299996517 64.97057999931258, -148.3240800004434 64.97095999944179, -148.3209300000275 64.97153000029039, -148.3208900916909 64.97152527761182, -148.3197333183293 64.97187038283028, -148.3194400014854 64.97185000039917, -148.3165000004861 64.97253000063029, -148.3142100003624 64.97340000027123, -148.3131390131606 64.97428978251332, -148.3136603033646 64.97503578368367, -148.3138100002265 64.97525000024524, -148.3157199989112 64.97607000052398, -148.3173927425877 64.97628215435157, -148.3181154158738 64.97710949927301, -148.318506832417 64.97752678315527, -148.3187389443419 64.97826073664947, -148.3191775248066 64.97838722480719, -148.3187036827229 64.9785124478214, -148.3174808822287 64.97901466526673, -148.3183191301726 64.97940472760871, -148.3179133845039 64.98006608334396, -148.3178643739444 64.98039869559773, -148.317717597652 64.98046658639413, -148.3165037173362 64.98102803770149, -148.3158305797883 64.98133936777919, -148.3136403766995 64.98169043855529, -148.3124228974041 64.98159245803612, -148.3106442287358 64.9817736328734, -148.3085689899975 64.9821898415147, -148.3075063283829 64.98248161818384, -148.3074353009211 64.9823643173778, -148.3075113274024 64.98152061988714, -148.307689970643 64.98064034848585, -148.3053761881787 64.98031430947776, -148.3052377492606 64.98037990703784, -148.304154185275 64.98023807737798, -148.3033326487505 64.98101592847075, -148.3035788815629 64.9822540966606, -148.303609042008 64.9829224774785, -148.3029990450748 64.98388363555517, -148.30328332256 64.98452614903402, -148.303235581073 64.98557802025795, -148.3029986141926 64.98634992936718, -148.3001099994984 64.98611999935645, -148.2988772743069 64.9865277226304, -148.298759997075 64.98649000013705, -148.2985074044935 64.98665005257834, -148.2976941778403 64.98716532090884, -148.2961399988037 64.98814999939168, -148.29416000075 64.99019000139481, -148.2919799986993 64.99236999951654, -148.2910500003476 64.99376000064387, -148.2943157993754 64.99484862651326, -148.2946053050727 64.99503986356336, -148.2946899989657 64.99503000042074, -148.296969998431 64.99563999997326, -148.3006600003402 64.99654000158887, -148.3006688655125 64.99656069048336, -148.303190430118 64.99696088445086, -148.3032105912145 64.99718197417303, -148.3038899994737 64.99720999985215, -148.3063199996449 64.99755000127738, -148.3073614236123 64.99776908065252, -148.3077700007926 64.99793999944546, -148.3085600004063 64.99809999949986, -148.3094099961114 64.99820000346284, -148.3121299983457 64.99851999964261, -148.3139300002672 64.99865999969018, -148.3157000002141 64.99879000038925, -148.316639999224 64.99889999977177, -148.3180141624833 64.99914803731269, -148.3194200014786 64.99951999998257, -148.3211799994576 65.00009999887004, -148.3229000000423 65.00068999972541, -148.3241044886974 65.00118402124099, -148.3253100002067 65.00175000008574, -148.3259799997796 65.00217999957709, -148.3273699995973 65.00380999947635, -148.3293199996053 65.00625000030578, -148.3312600002648 65.0080600002662, -148.3343199999953 65.00923999935765, -148.3350104396249 65.00939097184039, -148.335234252156 65.01018466211087, -148.3351465892357 65.01100225914081, -148.3339866936152 65.01174824459508, -148.334658432433 65.01226500464242, -148.3368734105941 65.01244359287676, -148.3390489073719 65.01281770733829, -148.3417658200891 65.01281737992019, -148.3440400975958 65.01270253344023, -148.3452138914596 65.01304038438343, -148.3470812878118 65.01340325923667, -148.3486601947724 65.01365721256769, -148.3506178891056 65.01395763962284, -148.3519985090498 65.01404025375609, -148.3538791959572 65.01433786239636, -148.3545136981701 65.01465620053091, -148.3556942656594 65.01496138169676, -148.35727017478 65.01446004435132, -148.3590641024411 65.0140322045097, -148.361102294477 65.01354747904861, -148.3619877351552 65.01377632857964, -148.3634815618695 65.01445385091068, -148.364793324479 65.01410708764695, -148.3662673162052 65.01333936556028, -148.3668481362573 65.01302032806069, -148.3708081886807 65.01304589286542, -148.3711290400765 65.0134813091617, -148.3721097764455 65.01400898663792, -148.3738183724032 65.01400470138992, -148.3752070520711 65.0136606203352, -148.376363068442 65.01370212385268, -148.3766764533957 65.01407449514028, -148.3768917281725 65.01493578153088, -148.3783168455452 65.0151839028909, -148.3797186062208 65.01477459229397, -148.381435142722 65.01434373103825, -148.382481453077 65.01454539962884, -148.3830196105516 65.01495864186217, -148.3845231733703 65.01481557325218, -148.3849148151772 65.01482634661716, -148.3854207822145 65.01577727746229, -148.387758416432 65.01701172749227, -148.3907954156963 65.01809066440546, -148.3921436592297 65.01856960242435, -148.395929999329 65.02006999976498))



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/5ab9bd0abdf28d8633ab73a8886aaa735ef8cb5c

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/5ab9bd0abdf28d8633ab73a8886aaa735ef8cb5c
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/c60fd0b7/attachment-0001.htm>

From gitlab at salsa.debian.org  Sat Aug  8 17:14:50 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:14:50 +0000
Subject: [Git][debian-gis-team/python-affine] Deleted tag debian/3.0.0-1
Message-ID: <6a7755fa3d2b6_537fb4dc4321bd@godard.mail>



Antonio Valentino deleted tag debian/3.0.0-1 at Debian GIS Project / python-affine

-- 

You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/395a63b7/attachment.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  8 17:19:22 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 08 Aug 2026 16:19:22 +0000
Subject: stac-validator_4.5.2-1_source.changes ACCEPTED into unstable
Message-ID: <E1wsjla-0000000BGd3-1qTW@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Sat, 08 Aug 2026 15:16:59 +0000
Source: stac-validator
Architecture: source
Version: 4.5.2-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Changes:
 stac-validator (4.5.2-1) unstable; urgency=medium
 .
   * New upstream release.
   * debian/control:
     - Refresh all patches.
Checksums-Sha1:
 2ffc6e56d3df3216a05354b349ed3daad59bac1c 2729 stac-validator_4.5.2-1.dsc
 c5fadfaf6765250281a32778e34cb0ca45f73b2a 12292053 stac-validator_4.5.2.orig.tar.gz
 4fbe9b3e4dc9e71c2ebbc534a75dc42911d54d34 20360 stac-validator_4.5.2-1.debian.tar.xz
 04a5f5740f6c488e3b9603d0c8926eabcb095ff9 8646 stac-validator_4.5.2-1_amd64.buildinfo
Checksums-Sha256:
 368fe2c6249a9d05b6400202fead99ff2f2cd05d89a5cb9100948f7d34f2e8b3 2729 stac-validator_4.5.2-1.dsc
 1decaff087300e260a03dd1322602ac6995711b68c70c2deeea18825caff3c18 12292053 stac-validator_4.5.2.orig.tar.gz
 bbf2595b98f2a90ca9d8948789fdb70c65047a52485ccf43544ba47a2b8204eb 20360 stac-validator_4.5.2-1.debian.tar.xz
 2378626dc7207df0a902e9de681d9df7ba5376df9a9479bf99abd41b99fede19 8646 stac-validator_4.5.2-1_amd64.buildinfo
Files:
 844c1bc479029d83aeb88cb595af6256 2729 python optional stac-validator_4.5.2-1.dsc
 1be360d2a3087feb464c645b3821a325 12292053 python optional stac-validator_4.5.2.orig.tar.gz
 f50636e7e7a7cb2352c1892fa48bbdc3 20360 python optional stac-validator_4.5.2-1.debian.tar.xz
 2f649ac2fbf1a7f44799024f9e706c1e 8646 python optional stac-validator_4.5.2-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmp3Uk8dHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBLHgQ/+NrwVTZCO3Qj6SD/m
4b0pCR31Yovt/ObO7sY83UP+8FPT2hDmRxkMs22y9qGe1aDmyBoNHUAxKnYbQCov
TM4suKAOCuy5D+4v1kgzI/oHRON4RMQIRPzyY81/sTUBKMsmKd10Sfx+FtL+bFCQ
p2TP6co16xdwwdtn9i1/t1uj38Vo+xLsqIL2jpZzuJJbU/vBqwhsPVnH1G0Sq7Uk
HicMKLqIifjGvwe/mZfIrJjTno/YZjbR5KuTrEsOf7M7u+MGdojEa3FomrdpvZC0
83EmaGQFrPB1pdS/CUjvrWLdoMi+HOxai2Dm4dgU4SDIcOJSETLd86Qs2lb1ulf3
IGn3m1EndN7Rly7d01HAIiiv6/oK3d+37FwnsbjYi1hocFX4XPO6rvbEzj5q8pYn
jqVoQ+sO9YVQgzm1yvyEULinKeVczj05yKXIltvfkQEHobskeog9fDMuwK45HoeF
7qNToyRIl5WFXdv9Amq2AlNHjBHiavo0d8QQ9ujeLucFPKjTFdBprorExfFP41Gw
iJJdvZVwN3L/XxxGLqyOwaw6GkE5NvnHv66Y8hwk4Gv/lD5OZHSeG1v6MG3EKRaT
DGzmraBtXEekYoiw/JNxxjoS24PqmU4PnRF0jCAcscLfPHAMDRhAf9z5EUCcmqRf
rGhRJQJy5VT0MiBjKxzoqrSpayI=
=cHHa
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/9829ebcf/attachment.sig>

From gitlab at salsa.debian.org  Sat Aug  8 17:26:58 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:26:58 +0000
Subject: [Git][debian-gis-team/python-affine][master] Fix test command
Message-ID: <6a7758d2746cf_53712f819443336b@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / python-affine


Commits:
3a9ce0d0 by Antonio Valentino at 2026-08-08T16:17:10+00:00
Fix test command

- - - - -


2 changed files:

- debian/changelog
- debian/rules


Changes:

=====================================
debian/changelog
=====================================
@@ -8,6 +8,8 @@ python-affine (3.0.0-1) unstable; urgency=medium
   * Update d/copyright.
   * debian/control:
     - Add dependency on python3-attrs.
+  * debian/rules:
+    - Fix test command.
 
  -- Antonio Valentino <antonio.valentino at tiscali.it>  Sat, 08 Aug 2026 15:51:32 +0000
 


=====================================
debian/rules
=====================================
@@ -1,11 +1,7 @@
 #!/usr/bin/make -f
 
 export PYBUILD_NAME=affine
-ifeq ($(PYBUILD_AUTOPKGTEST),1)
-export PYBUILD_TEST_ARGS=-v --pyargs ${PYBUILD_NAME}
-else
-export PYBUILD_TEST_ARGS=-v
-endif
+export PYBUILD_TEST_ARGS=-v tests
 
 %:
 	dh $@ --buildsystem pybuild



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/commit/3a9ce0d01e22f46004db5acee7363e1bfa863cad

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/commit/3a9ce0d01e22f46004db5acee7363e1bfa863cad
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/c2c719d6/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  8 17:37:00 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 08 Aug 2026 16:37:00 +0000
Subject: Processing of asf-search_12.3.0-1_source.changes
Message-ID: <E1wsk2e-001isL-0h@usper.debian.org>

asf-search_12.3.0-1_source.changes uploaded successfully to localhost
along with the files:
  asf-search_12.3.0-1.dsc
  asf-search_12.3.0.orig.tar.gz
  asf-search_12.3.0-1.debian.tar.xz
  asf-search_12.3.0-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From gitlab at salsa.debian.org  Sat Aug  8 17:38:30 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sat, 08 Aug 2026 16:38:30 +0000
Subject: [Git][debian-gis-team/python-affine] Pushed new tag debian/3.0.0-1
Message-ID: <6a775b86a2c57_537faf644360c8@godard.mail>



Antonio Valentino pushed new tag debian/3.0.0-1 at Debian GIS Project / python-affine

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-affine/-/tree/debian/3.0.0-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/eecf5306/attachment.htm>

From ftpmaster at ftp-master.debian.org  Sat Aug  8 17:47:02 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 08 Aug 2026 16:47:02 +0000
Subject: Processing of python-affine_3.0.0-1_source.changes
Message-ID: <E1wskCM-001jHU-0w@usper.debian.org>

python-affine_3.0.0-1_source.changes uploaded successfully to localhost
along with the files:
  python-affine_3.0.0-1.dsc
  python-affine_3.0.0.orig.tar.gz
  python-affine_3.0.0-1.debian.tar.xz
  python-affine_3.0.0-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Sat Aug  8 17:48:46 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 08 Aug 2026 16:48:46 +0000
Subject: asf-search_12.3.0-1_source.changes ACCEPTED into unstable
Message-ID: <E1wskE2-0000000BL1n-0kNx@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Sat, 08 Aug 2026 16:04:26 +0000
Source: asf-search
Architecture: source
Version: 12.3.0-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Changes:
 asf-search (12.3.0-1) unstable; urgency=medium
 .
   * New upstream release.
Checksums-Sha1:
 876e47247890d39fbadd49980f038abe791cd886 2635 asf-search_12.3.0-1.dsc
 9a9c494d7df93f902172d6e19df81be89f147921 1549429 asf-search_12.3.0.orig.tar.gz
 2f2202f6c5c706a612b82ebcdc73336429337ea7 4208 asf-search_12.3.0-1.debian.tar.xz
 b724dd05954113973f462d365f43fbd6598a6a9b 12446 asf-search_12.3.0-1_amd64.buildinfo
Checksums-Sha256:
 48b3172a497e3687ee2d716a74e28319711b74204717295a0c18d101025c883f 2635 asf-search_12.3.0-1.dsc
 e79c2dc728b514721a84e056ba66cdaeb0dcdfabd62518de823998843a6fa00d 1549429 asf-search_12.3.0.orig.tar.gz
 ab79fe2992a0cdfc96de19d955578a31de1dfd7e3232fbe151e6d310fbaad0f9 4208 asf-search_12.3.0-1.debian.tar.xz
 9b1f684aefb46f3938bcc38b6f495957024baf13786471fe79d1703efcf5114c 12446 asf-search_12.3.0-1_amd64.buildinfo
Files:
 b8981ff9dff2bd50427e7095c8ed7328 2635 python optional asf-search_12.3.0-1.dsc
 dc3095ea5134ccfa41e3e9170662f566 1549429 python optional asf-search_12.3.0.orig.tar.gz
 b67df66f2cdf97df2c1764679016ba8b 4208 python optional asf-search_12.3.0-1.debian.tar.xz
 18daf76354007183ceae33c093132d1f 12446 python optional asf-search_12.3.0-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmp3WU4dHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBLETBAAy5QC0qeITeO3Si8+
tgePeWDimSyVaGlMRMJTUUd5uni7gZBsCnu9D/p1IVEod+rOc4bGzPgKEeah7uCN
DjQVFuM6r9+XcTLMXSAFzuhG8vr7G1Jwm6SsGwfBWZgIKwOVG1u2wGixQ9Ihf+Qb
ePMQ0X8W1xCC+TJStdmZvYp6T0fcpv3YiqIjVjkJH4iuo3CE+mYsp+IEosBcesvJ
9dv4E+JNQtFB3jwN3I9pmDtfw1ntjidwUrHJHj7iNbbHvfNLKgvo/srv+c1Eli+V
M7MBO9IlyIoMRTX+qM44IGSWIeLt3HM2ELZEdf92EL/mUP4LlfM8pUBcG4pjMAmw
7cwXxkr7jRf4kkJNP1X4HGIYvm447IBLtph4oiclWJM3Me49S0QNpnpL4d4WxPSe
mdgbmGmosN+gyTq80rtrN7P9acz+JP/AaFRNqxlXLFLrwDNWEnmQW+tSO9HgG9Dv
pwGEicDrzcO8/N7t/qQSS6nI8lsbNR/KGeR9BwYPVZRBi43TaybuY3Ce2pokOlvn
744q4YEYM0vAADAIe5FstNCAVTRVH4vISsJKkHPj4wSOBkmHYfoWrQL+A9ki4f8d
TQwI3Exgeaz5jwEAtwyyPlt8KBZbclveSXVYGWNG50m62twkuaCviOUL2zhDJKGt
IV7fhTpqmPa6bHE7qzyFxJUNE0c=
=JMQu
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/e22085d9/attachment.sig>

From ftpmaster at ftp-master.debian.org  Sat Aug  8 17:49:33 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Sat, 08 Aug 2026 16:49:33 +0000
Subject: python-affine_3.0.0-1_source.changes ACCEPTED into unstable
Message-ID: <E1wskEn-0000000BLIk-2z9T@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Sat, 08 Aug 2026 15:51:32 +0000
Source: python-affine
Architecture: source
Version: 3.0.0-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Changes:
 python-affine (3.0.0-1) unstable; urgency=medium
 .
   [ Bas Couwenberg ]
   * Bump Standards-Version to 4.7.4, no changes.
 .
   [ Antonio Valentino ]
   * New upstream release.
   * Update d/copyright.
   * debian/control:
     - Add dependency on python3-attrs.
   * debian/rules:
     - Fix test command.
Checksums-Sha1:
 43c770748a923235493ac3a3b07e8e6c98ff3c27 2223 python-affine_3.0.0-1.dsc
 834a3923e35477341cf414c9f19c233bf60860d2 20893 python-affine_3.0.0.orig.tar.gz
 dea54eaa8343d78b53d01ab469cb63df7cc5de8b 4000 python-affine_3.0.0-1.debian.tar.xz
 ad6e39d92d2f176c2639f816bf60f737dc12663d 7215 python-affine_3.0.0-1_amd64.buildinfo
Checksums-Sha256:
 1c480fee63097e7eeb8dc8b73105dbab75ac14c3687aacf7a96854e033461ba8 2223 python-affine_3.0.0-1.dsc
 37b280049c3b355ad732f5b239701d9342531e515fbd1041ead30288fb83164e 20893 python-affine_3.0.0.orig.tar.gz
 3d458000a153b2ee8085c4af278989f1e7ce42b8da37a4c0ceedb5a4e01cc205 4000 python-affine_3.0.0-1.debian.tar.xz
 3475d2127a4be2c0dbf907f74321dba88d146f1f07159efb9ef902bc62b60ca9 7215 python-affine_3.0.0-1_amd64.buildinfo
Files:
 9c66d33d3efab6b5d88418b7dcddc65b 2223 python optional python-affine_3.0.0-1.dsc
 ff6babb041a3a040ce698a73f686ae44 20893 python optional python-affine_3.0.0.orig.tar.gz
 8b1634c6bbeb0efa0a0e7b3caeca72b6 4000 python optional python-affine_3.0.0-1.debian.tar.xz
 89be9569e5cd2a3528a25845939b341b 7215 python optional python-affine_3.0.0-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmp3W2odHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBK+wxAAi5SNJHgl8AdYAFIq
BRIjNOjPgzKlnaf5UxAcdj6AYU+yB73V++HDc88+A+Shz8LsfP/J9rU8dIrcjM9P
n7LCJrHZ/5hnZXXIhb8OaYQTlBzA4GXijo0agYq51QVisxL/BPA1FbzzOCiO+SeI
fFM7kA/03DKiFWguIfdf23BvHgwwpPdSQ+w1btqqzlp1a5iis1aEzwdjl0LvxZ0e
ythU6tX4iN+F3cw18eE6NoxcteZzpBxjCRea9qALopRK4jclg0x0RjUaGdGqGx4k
I5dnXdix0LGJP80+ejillispB75g8kvs9hxpwlLny6lOMBudAHVK2/ItGrQe7FxG
EM5ob4KLcpdAiHU1o+yVwuul4IascBc59Py2k/aRAZOXu6u3tjNB2hD2Uu0Ztt6I
kliGT+rt/SYPpSvF19/pb7DvUElzLC0RSPASXjTT/dxS2djeGrjkL4l+zmmgcG+l
sibBHb6d281uyTewesYI2yzfSBHfM1dp4sfMJR4qzLgeD+h45CJrormqrynvbMko
IJ+rEdGNR+mJ8BDwDCYXH0Th/m1GK5LBMAOpzgZZvu1eDGny6W8gwu6Ry7A+7igf
IqB+e2AzJ090xW2dFDjkkVMUbMs3rcWcv2vJXwn4imEYyNO5c0IyfvKL7qvWwEl0
Q54sTFXfAHweSm9s5Vx8WD5+wgQ=
=/S1W
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260808/6e38eb0e/attachment.sig>

From noreply at release.debian.org  Sun Aug  9 05:39:04 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Sun, 09 Aug 2026 04:39:04 +0000
Subject: gmtsar is marked for autoremoval from testing
Message-ID: <E1wsvJQ-000000033mR-2ncx@respighi.debian.org>

gmtsar 6.7+ds-1 is marked for autoremoval from testing on 2026-08-22

It is affected by these RC bugs:
1139600: gmtsar: FTBFS against HDF5 2.1.0
 https://bugs.debian.org/1139600



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From gitlab at salsa.debian.org  Sun Aug  9 13:42:35 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Sun, 09 Aug 2026 12:42:35 +0000
Subject: [Git][debian-gis-team/libapache2-mod-tile][master] explicitly add
 procps B-D
Message-ID: <6a7875bbf2af7_5372d93ddc5931ec@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / libapache2-mod-tile


Commits:
7d110007 by Pino Toscano at 2026-08-09T14:21:45+02:00
explicitly add procps B-D

- - - - -


2 changed files:

- debian/changelog
- debian/control


Changes:

=====================================
debian/changelog
=====================================
@@ -9,6 +9,9 @@ libapache2-mod-tile (0.8.1-3) UNRELEASED; urgency=medium
   * Stop deleting system users on purge
   * Install and use sysusers.d/tmpfiles.d config files
 
+  [ Pino Toscano ]
+  * Explicitly add the procps build dependency, needed for ps, kill, etc.
+
  -- Bas Couwenberg <sebastic at debian.org>  Fri, 19 Jun 2026 05:17:03 +0200
 
 libapache2-mod-tile (0.8.1-2) unstable; urgency=medium


=====================================
debian/control
=====================================
@@ -15,7 +15,8 @@ Build-Depends: apache2,
                libcurl4-gnutls-dev | libcurl-ssl-dev,
                libglib2.0-dev,
                libiniparser-dev,
-               libmapnik-dev (>= 3.1)
+               libmapnik-dev (>= 3.1),
+               procps,
 Standards-Version: 4.7.4
 Vcs-Browser: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile
 Vcs-Git: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile.git



View it on GitLab: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile/-/commit/7d110007408043dfd8384ccfa6a50d11f2b3dfec

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile/-/commit/7d110007408043dfd8384ccfa6a50d11f2b3dfec
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260809/c26aff42/attachment-0001.htm>

From gitlab at salsa.debian.org  Sun Aug  9 13:46:03 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Sun, 09 Aug 2026 12:46:03 +0000
Subject: [Git][debian-gis-team/libapache2-mod-tile][master] Mark procps
 dependency as nocheck.
Message-ID: <6a78768b83274_53712f1ec5938e5@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / libapache2-mod-tile


Commits:
8331b783 by Bas Couwenberg at 2026-08-09T14:45:53+02:00
Mark procps dependency as nocheck.

- - - - -


1 changed file:

- debian/control


Changes:

=====================================
debian/control
=====================================
@@ -16,7 +16,7 @@ Build-Depends: apache2,
                libglib2.0-dev,
                libiniparser-dev,
                libmapnik-dev (>= 3.1),
-               procps,
+               procps <!nocheck>,
 Standards-Version: 4.7.4
 Vcs-Browser: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile
 Vcs-Git: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile.git



View it on GitLab: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile/-/commit/8331b7830d56107c80c6174ba1a904086537225e

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile/-/commit/8331b7830d56107c80c6174ba1a904086537225e
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260809/ed863329/attachment.htm>

From gitlab at salsa.debian.org  Sun Aug  9 13:58:23 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Sun, 09 Aug 2026 12:58:23 +0000
Subject: [Git][debian-gis-team/libapache2-mod-tile][master] Revert "Mark
 procps dependency as nocheck."
Message-ID: <6a78796fa9c8d_537fb2ac598474@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / libapache2-mod-tile


Commits:
1908cbc2 by Bas Couwenberg at 2026-08-09T14:58:13+02:00
Revert "Mark procps dependency as nocheck."

This reverts commit 8331b7830d56107c80c6174ba1a904086537225e.

- - - - -


1 changed file:

- debian/control


Changes:

=====================================
debian/control
=====================================
@@ -16,7 +16,7 @@ Build-Depends: apache2,
                libglib2.0-dev,
                libiniparser-dev,
                libmapnik-dev (>= 3.1),
-               procps <!nocheck>,
+               procps,
 Standards-Version: 4.7.4
 Vcs-Browser: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile
 Vcs-Git: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile.git



View it on GitLab: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile/-/commit/1908cbc2e40c9c83e638d5a8f0562ecdd1a189c0

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/libapache2-mod-tile/-/commit/1908cbc2e40c9c83e638d5a8f0562ecdd1a189c0
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260809/922c8104/attachment-0001.htm>

From bunk at debian.org  Sun Aug  9 14:24:56 2026
From: bunk at debian.org (Adrian Bunk)
Date: Sun, 09 Aug 2026 16:24:56 +0300
Subject: Bug#1143991: RM: mapnik-doc -- NBS; binary-all package no longer built
Message-ID: <178628189695.750488.12739094292070481511.reportbug@localhost>

Package: ftp.debian.org
Severity: normal
X-Debbugs-Cc: mapnik at packages.debian.org
Control: affects -1 + src:mapnik
User: ftp.debian.org at packages.debian.org
Usertags: remove
Control: block 1143826 by -1

mapnik (4.3.0+ds2-1~exp1) experimental; urgency=medium
...
  * Drop mapnik-doc package, demo examples are gone now.

 -- Bas Couwenberg <sebastic at debian.org>  Tue, 04 Aug 2026 20:06:23 +0200


Since this was the only binary-all package,
it needs manual removal.


From gitlab at salsa.debian.org  Sun Aug  9 18:58:38 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sun, 09 Aug 2026 17:58:38 +0000
Subject: [Git][debian-gis-team/pystac][master] 9 commits: New upstream version
 1.15.2
Message-ID: <6a78bfcee0201_53738c4080665776@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / pystac


Commits:
870088c5 by Antonio Valentino at 2026-08-01T20:23:46+02:00
New upstream version 1.15.2
- - - - -
e367e74c by Antonio Valentino at 2026-08-01T20:23:56+02:00
Update upstream source from tag 'upstream/1.15.2'

Update to upstream version '1.15.2'
with Debian dir 9624a5b011c297890aeef8829a9ad7e8066f25ce
- - - - -
947bde51 by Antonio Valentino at 2026-08-01T20:24:33+02:00
New upstream release

- - - - -
95983d55 by Antonio Valentino at 2026-08-01T20:46:06+00:00
Update d/copyright file

- - - - -
fa67bb2b by Antonio Valentino at 2026-08-01T20:49:55+00:00
Drop 0003-Include-package-data.patch

- - - - -
2f22626d by Antonio Valentino at 2026-08-01T20:53:10+00:00
Refresh all patches

- - - - -
24f14201 by Antonio Valentino at 2026-08-09T17:48:04+00:00
Remove python3-pystac.lintian-overrides

- - - - -
b7dc0f77 by Antonio Valentino at 2026-08-09T17:54:38+00:00
Add new packages

Starting from pystac v1.15.x pacjkage has been split in several
sub-packages for pystac-core, pystac extensions, pytest-pystac and
the main pystac package.

- - - - -
18ec29e6 by Antonio Valentino at 2026-08-09T17:54:53+00:00
New 0004-allow-warnings.patch

- - - - -


601 changed files:

- .github/dependabot.yml
- .github/workflows/continuous-integration.yml
- .github/workflows/release-please.yml
- .github/workflows/release.yml
- .pre-commit-config.yaml
- .release-please-manifest.json
- CHANGELOG.md
- README.md
- asv.conf.json
- benchmarks/item.py
- + conftest.py
- pystac/extensions/__init__.py ? core/README.md
- + core/pyproject.toml
- pystac/__init__.py ? core/pystac/__init__.py
- pystac/asset.py ? core/pystac/asset.py
- pystac/cache.py ? core/pystac/cache.py
- pystac/catalog.py ? core/pystac/catalog.py
- pystac/client.py ? core/pystac/client.py
- pystac/collection.py ? core/pystac/collection.py
- pystac/common_metadata.py ? core/pystac/common_metadata.py
- pystac/errors.py ? core/pystac/errors.py
- + core/pystac/extensions/__init__.py
- pystac/extensions/base.py ? core/pystac/extensions/base.py
- pystac/extensions/hooks.py ? core/pystac/extensions/hooks.py
- pystac/html/JSON.jinja2 ? core/pystac/html/JSON.jinja2
- pystac/html/Macros.jinja2 ? core/pystac/html/Macros.jinja2
- pystac/html/__init__.py ? core/pystac/html/__init__.py
- pystac/html/jinja_env.py ? core/pystac/html/jinja_env.py
- pystac/item.py ? core/pystac/item.py
- pystac/item_assets.py ? core/pystac/item_assets.py
- pystac/item_collection.py ? core/pystac/item_collection.py
- pystac/layout.py ? core/pystac/layout.py
- pystac/link.py ? core/pystac/link.py
- pystac/media_type.py ? core/pystac/media_type.py
- pystac/provider.py ? core/pystac/provider.py
- pystac/py.typed ? core/pystac/py.typed
- pystac/rel_type.py ? core/pystac/rel_type.py
- pystac/serialization/__init__.py ? core/pystac/serialization/__init__.py
- pystac/serialization/common_properties.py ? core/pystac/serialization/common_properties.py
- pystac/serialization/identify.py ? core/pystac/serialization/identify.py
- pystac/serialization/migrate.py ? core/pystac/serialization/migrate.py
- pystac/stac_io.py ? core/pystac/stac_io.py
- pystac/stac_object.py ? core/pystac/stac_object.py
- pystac/static/__init__.py ? core/pystac/static/__init__.py
- pystac/static/fields-normalized.json ? core/pystac/static/fields-normalized.json
- pystac/summaries.py ? core/pystac/summaries.py
- pystac/utils.py ? core/pystac/utils.py
- pystac/validation/__init__.py ? core/pystac/validation/__init__.py
- pystac/validation/jsonschemas/__init__.py ? core/pystac/validation/jsonschemas/__init__.py
- pystac/validation/jsonschemas/geojson/Feature.json ? core/pystac/validation/jsonschemas/geojson/Feature.json
- pystac/validation/jsonschemas/geojson/Geometry.json ? core/pystac/validation/jsonschemas/geojson/Geometry.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/bands.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/bands.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/basics.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/basics.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/catalog.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/catalog.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/collection.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/collection.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/common.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/common.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/data-values.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/data-values.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/datetime.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/datetime.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/instrument.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/instrument.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/item.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/item.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/licensing.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/licensing.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/provider.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/provider.json
- pystac/validation/local_validator.py ? core/pystac/validation/local_validator.py
- pystac/validation/schema_uri_map.py ? core/pystac/validation/schema_uri_map.py
- pystac/validation/stac_validator.py ? core/pystac/validation/stac_validator.py
- pystac/version.py ? core/pystac/version.py
- debian/changelog
- debian/control
- debian/copyright
- ? debian/patches/0003-Include-package-data.patch
- debian/patches/0004-Workaround-for-doc-build-issue.patch ? debian/patches/0003-Workaround-for-doc-build-issue.patch
- + debian/patches/0004-allow-warnings.patch
- debian/patches/series
- + debian/python3-pystac-core.install
- + debian/python3-pystac-ext-classification.install
- + debian/python3-pystac-ext-datacube.install
- + debian/python3-pystac-ext-eo.install
- + debian/python3-pystac-ext-file.install
- + debian/python3-pystac-ext-grid.install
- + debian/python3-pystac-ext-item-assets.install
- + debian/python3-pystac-ext-label.install
- + debian/python3-pystac-ext-mgrs.install
- + debian/python3-pystac-ext-mlm.install
- + debian/python3-pystac-ext-pointcloud.install
- + debian/python3-pystac-ext-projection.install
- + debian/python3-pystac-ext-raster.install
- + debian/python3-pystac-ext-render.install
- + debian/python3-pystac-ext-sar.install
- + debian/python3-pystac-ext-sat.install
- + debian/python3-pystac-ext-scientific.install
- + debian/python3-pystac-ext-storage.install
- + debian/python3-pystac-ext-table.install
- + debian/python3-pystac-ext-timestamps.install
- + debian/python3-pystac-ext-version.install
- + debian/python3-pystac-ext-view.install
- + debian/python3-pystac-ext-xarray-assets.install
- + debian/python3-pystac.install
- ? debian/python3-pystac.lintian-overrides
- + debian/python3-pytest-pystac.install
- debian/rules
- docs/tutorials/creating-a-landsat-stac.ipynb
- + extensions/classification/README.md
- + extensions/classification/pyproject.toml
- pystac/extensions/classification.py ? extensions/classification/pystac/extensions/classification.py
- + extensions/classification/pystac/extensions/py.typed
- tests/extensions/cassettes/test_classification/test_apply_bitfields.yaml ? extensions/classification/tests/cassettes/test_classification/test_apply_bitfields.yaml
- tests/extensions/cassettes/test_classification/test_apply_classes.yaml ? extensions/classification/tests/cassettes/test_classification/test_apply_classes.yaml
- tests/extensions/cassettes/test_classification/test_validate_classification.yaml ? extensions/classification/tests/cassettes/test_classification/test_validate_classification.yaml
- tests/data-files/classification/classification_landsat_example.json ? extensions/classification/tests/data-files/classification_landsat_example.json
- tests/data-files/classification/collection-item-assets-raster-bands.json ? extensions/classification/tests/data-files/collection-item-assets-raster-bands.json
- + extensions/classification/tests/data-files/item/sample-item.json
- tests/extensions/test_classification.py ? extensions/classification/tests/test_classification.py
- + extensions/datacube/README.md
- + extensions/datacube/pyproject.toml
- pystac/extensions/datacube.py ? extensions/datacube/pystac/extensions/datacube.py
- + extensions/datacube/pystac/extensions/py.typed
- tests/extensions/cassettes/test_datacube/test_set_dimensions.yaml ? extensions/datacube/tests/cassettes/test_datacube/test_set_dimensions.yaml
- tests/extensions/cassettes/test_datacube/test_set_variables.yaml ? extensions/datacube/tests/cassettes/test_datacube/test_set_variables.yaml
- tests/extensions/cassettes/test_datacube/test_validate.yaml ? extensions/datacube/tests/cassettes/test_datacube/test_validate.yaml
- tests/data-files/datacube/item.json ? extensions/datacube/tests/data-files/item.json
- tests/extensions/test_datacube.py ? extensions/datacube/tests/test_datacube.py
- + extensions/eo/README.md
- + extensions/eo/pyproject.toml
- pystac/extensions/eo.py ? extensions/eo/pystac/extensions/eo.py
- + extensions/eo/pystac/extensions/py.typed
- tests/extensions/cassettes/test_eo/test_asset_bands.yaml ? extensions/eo/tests/cassettes/test_eo/test_asset_bands.yaml
- tests/extensions/cassettes/test_eo/test_bands.yaml ? extensions/eo/tests/cassettes/test_eo/test_bands.yaml
- tests/extensions/cassettes/test_eo/test_cloud_cover.yaml ? extensions/eo/tests/cassettes/test_eo/test_cloud_cover.yaml
- tests/extensions/cassettes/test_eo/test_set_field[cloud_cover-7.8].yaml ? extensions/eo/tests/cassettes/test_eo/test_set_field[cloud_cover-7.8].yaml
- tests/extensions/cassettes/test_eo/test_set_field[snow_cover-99].yaml ? extensions/eo/tests/cassettes/test_eo/test_set_field[snow_cover-99].yaml
- tests/extensions/cassettes/test_eo/test_validate_eo.yaml ? extensions/eo/tests/cassettes/test_eo/test_validate_eo.yaml
- tests/data-files/eo/eo-collection.json ? extensions/eo/tests/data-files/eo-collection.json
- tests/data-files/eo/eo-landsat-example.json ? extensions/eo/tests/data-files/eo-landsat-example.json
- tests/data-files/eo/eo-sentinel2-item.json ? extensions/eo/tests/data-files/eo-sentinel2-item.json
- + extensions/eo/tests/data-files/examples/0.8.1/item-spec/examples/landsat8-sample.json
- + extensions/eo/tests/data-files/examples/0.8.1/item-spec/examples/sentinel2-sample.json
- + extensions/eo/tests/data-files/examples/0.9.0/item-spec/examples/landsat8-sample.json
- + extensions/eo/tests/data-files/item/sample-item.json
- tests/data-files/eo/sample-bands-in-item-properties.json ? extensions/eo/tests/data-files/sample-bands-in-item-properties.json
- tests/extensions/test_eo.py ? extensions/eo/tests/test_eo.py
- + extensions/file/README.md
- + extensions/file/pyproject.toml
- pystac/extensions/file.py ? extensions/file/pystac/extensions/file.py
- + extensions/file/pystac/extensions/py.typed
- tests/extensions/cassettes/test_file/test_migrate_from_v1_0_0.yaml ? extensions/file/tests/cassettes/test_file/test_migrate_from_v1_0_0.yaml
- tests/extensions/cassettes/test_file/test_migrate_from_v2_0_0.yaml ? extensions/file/tests/cassettes/test_file/test_migrate_from_v2_0_0.yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[calibrations-local_path-different-file.xml].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[calibrations-local_path-different-file.xml].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[measurement-header_size-8192].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[measurement-header_size-8192].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[thumbnail-byte_order-little-endian].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[thumbnail-byte_order-little-endian].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[thumbnail-checksum-90e40210163700a8a6501eccd00b6d3b44ddaed0].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[thumbnail-checksum-90e40210163700a8a6501eccd00b6d3b44ddaed0].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[thumbnail-size-1].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[thumbnail-size-1].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-byte_order-big-endian].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-byte_order-big-endian].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-checksum-90e40210163700a8a6501eccd00b6d3b44ddaedb].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-checksum-90e40210163700a8a6501eccd00b6d3b44ddaedb].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-header_size-4092].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-header_size-4092].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-local_path-a-path].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-local_path-a-path].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-size-129302].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-size-129302].yaml
- tests/extensions/cassettes/test_file/test_validate_catalog.yaml ? extensions/file/tests/cassettes/test_file/test_validate_catalog.yaml
- tests/extensions/cassettes/test_file/test_validate_collection.yaml ? extensions/file/tests/cassettes/test_file/test_validate_collection.yaml
- tests/extensions/cassettes/test_file/test_validate_item.yaml ? extensions/file/tests/cassettes/test_file/test_validate_item.yaml
- tests/data-files/file/catalog.json ? extensions/file/tests/data-files/catalog.json
- tests/data-files/file/collection.json ? extensions/file/tests/data-files/collection.json
- + extensions/file/tests/data-files/examples/1.0.0-beta.2/extensions/checksum/examples/sentinel1.json
- tests/data-files/file/item.json ? extensions/file/tests/data-files/item.json
- tests/extensions/test_file.py ? extensions/file/tests/test_file.py
- + extensions/grid/README.md
- + extensions/grid/pyproject.toml
- pystac/extensions/grid.py ? extensions/grid/pystac/extensions/grid.py
- + extensions/grid/pystac/extensions/py.typed
- tests/extensions/cassettes/test_grid/test_attributes.yaml ? extensions/grid/tests/cassettes/test_grid/test_attributes.yaml
- tests/extensions/cassettes/test_grid/test_modify.yaml ? extensions/grid/tests/cassettes/test_grid/test_modify.yaml
- tests/data-files/grid/example-landsat.json ? extensions/grid/tests/data-files/example-landsat.json
- tests/data-files/grid/example-sentinel2.json ? extensions/grid/tests/data-files/example-sentinel2.json
- tests/extensions/test_grid.py ? extensions/grid/tests/test_grid.py
- + extensions/item_assets/README.md
- + extensions/item_assets/pyproject.toml
- pystac/extensions/item_assets.py ? extensions/item_assets/pystac/extensions/item_assets.py
- + extensions/item_assets/pystac/extensions/py.typed
- + extensions/label/README.md
- + extensions/label/pyproject.toml
- pystac/extensions/label.py ? extensions/label/pystac/extensions/label.py
- + extensions/label/pystac/extensions/py.typed
- + extensions/mgrs/README.md
- + extensions/mgrs/pyproject.toml
- pystac/extensions/mgrs.py ? extensions/mgrs/pystac/extensions/mgrs.py
- + extensions/mgrs/pystac/extensions/py.typed
- tests/extensions/cassettes/test_mgrs/test_set_field[grid_square-ZA].yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_set_field[grid_square-ZA].yaml
- tests/extensions/cassettes/test_mgrs/test_set_field[latitude_band-C].yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_set_field[latitude_band-C].yaml
- tests/extensions/cassettes/test_mgrs/test_set_field[utm_zone-59].yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_set_field[utm_zone-59].yaml
- tests/extensions/cassettes/test_mgrs/test_validate.yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_validate.yaml
- tests/data-files/mgrs/item.json ? extensions/mgrs/tests/data-files/item.json
- tests/extensions/test_mgrs.py ? extensions/mgrs/tests/test_mgrs.py
- + extensions/mlm/README.md
- + extensions/mlm/pyproject.toml
- pystac/extensions/mlm.py ? extensions/mlm/pystac/extensions/mlm.py
- + extensions/mlm/pystac/extensions/py.typed
- tests/extensions/cassettes/test_mlm/test_apply.yaml ? extensions/mlm/tests/cassettes/test_mlm/test_apply.yaml
- tests/extensions/cassettes/test_mlm/test_validate_mlm.yaml ? extensions/mlm/tests/cassettes/test_mlm/test_validate_mlm.yaml
- tests/data-files/mlm/collection.json ? extensions/mlm/tests/data-files/collection.json
- + extensions/mlm/tests/data-files/item/sample-item.json
- tests/data-files/mlm/item_basic.json ? extensions/mlm/tests/data-files/item_basic.json
- tests/extensions/test_mlm.py ? extensions/mlm/tests/test_mlm.py
- + extensions/pointcloud/README.md
- + extensions/pointcloud/pyproject.toml
- pystac/extensions/pointcloud.py ? extensions/pointcloud/pystac/extensions/pointcloud.py
- + extensions/pointcloud/pystac/extensions/py.typed
- tests/extensions/cassettes/test_pointcloud/test_count.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_count.yaml
- tests/extensions/cassettes/test_pointcloud/test_density.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_density.yaml
- tests/extensions/cassettes/test_pointcloud/test_encoding.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_encoding.yaml
- tests/extensions/cassettes/test_pointcloud/test_schemas.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_schemas.yaml
- tests/extensions/cassettes/test_pointcloud/test_statistics.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_statistics.yaml
- tests/extensions/cassettes/test_pointcloud/test_type.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_type.yaml
- tests/extensions/cassettes/test_pointcloud/test_validate_pointcloud.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_validate_pointcloud.yaml
- + extensions/pointcloud/tests/data-files/collections/multi-extent.json
- tests/data-files/pointcloud/example-laz-no-statistics.json ? extensions/pointcloud/tests/data-files/example-laz-no-statistics.json
- tests/data-files/pointcloud/example-laz.json ? extensions/pointcloud/tests/data-files/example-laz.json
- + extensions/pointcloud/tests/data-files/item/sample-item.json
- tests/extensions/test_pointcloud.py ? extensions/pointcloud/tests/test_pointcloud.py
- + extensions/projection/README.md
- + extensions/projection/pyproject.toml
- pystac/extensions/projection.py ? extensions/projection/pystac/extensions/projection.py
- + extensions/projection/pystac/extensions/py.typed
- tests/extensions/cassettes/test_projection/test_bbox.yaml ? extensions/projection/tests/cassettes/test_projection/test_bbox.yaml
- tests/extensions/cassettes/test_projection/test_centroid.yaml ? extensions/projection/tests/cassettes/test_projection/test_centroid.yaml
- tests/extensions/cassettes/test_projection/test_epsg.yaml ? extensions/projection/tests/cassettes/test_projection/test_epsg.yaml
- tests/extensions/cassettes/test_projection/test_geometry.yaml ? extensions/projection/tests/cassettes/test_projection/test_geometry.yaml
- tests/extensions/cassettes/test_projection/test_partial_apply.yaml ? extensions/projection/tests/cassettes/test_projection/test_partial_apply.yaml
- tests/extensions/cassettes/test_projection/test_projjson.yaml ? extensions/projection/tests/cassettes/test_projection/test_projjson.yaml
- tests/extensions/cassettes/test_projection/test_shape.yaml ? extensions/projection/tests/cassettes/test_projection/test_shape.yaml
- tests/extensions/cassettes/test_projection/test_transform.yaml ? extensions/projection/tests/cassettes/test_projection/test_transform.yaml
- tests/extensions/cassettes/test_projection/test_validate_proj.yaml ? extensions/projection/tests/cassettes/test_projection/test_validate_proj.yaml
- tests/extensions/cassettes/test_projection/test_wkt2.yaml ? extensions/projection/tests/cassettes/test_projection/test_wkt2.yaml
- + extensions/projection/tests/conftest.py
- tests/data-files/projection/another-1.1.json ? extensions/projection/tests/data-files/another-1.1.json
- tests/data-files/projection/collection-with-summaries.json ? extensions/projection/tests/data-files/collection-with-summaries.json
- tests/data-files/projection/example-landsat8.json ? extensions/projection/tests/data-files/example-landsat8.json
- tests/data-files/projection/example-with-version-1.1.json ? extensions/projection/tests/data-files/example-with-version-1.1.json
- tests/data-files/projection/example-with-version-1.2.json ? extensions/projection/tests/data-files/example-with-version-1.2.json
- tests/data-files/projection/optional-epsg.json ? extensions/projection/tests/data-files/optional-epsg.json
- tests/extensions/test_projection.py ? extensions/projection/tests/test_projection.py
- + extensions/raster/README.md
- + extensions/raster/pyproject.toml
- + extensions/raster/pystac/extensions/py.typed
- pystac/extensions/raster.py ? extensions/raster/pystac/extensions/raster.py
- tests/extensions/cassettes/test_raster/test_asset_bands.yaml ? extensions/raster/tests/cassettes/test_raster/test_asset_bands.yaml
- tests/extensions/cassettes/test_raster/test_validate_raster.yaml ? extensions/raster/tests/cassettes/test_raster/test_validate_raster.yaml
- tests/data-files/raster/gdalinfo.json ? extensions/raster/tests/data-files/gdalinfo.json
- tests/data-files/raster/landsat-collection-example.json ? extensions/raster/tests/data-files/landsat-collection-example.json
- tests/data-files/raster/raster-planet-example.json ? extensions/raster/tests/data-files/raster-planet-example.json
- tests/data-files/raster/raster-sentinel2-example.json ? extensions/raster/tests/data-files/raster-sentinel2-example.json
- tests/extensions/test_raster.py ? extensions/raster/tests/test_raster.py
- + extensions/render/README.md
- + extensions/render/pyproject.toml
- + extensions/render/pystac/extensions/py.typed
- pystac/extensions/render.py ? extensions/render/pystac/extensions/render.py
- tests/extensions/cassettes/test_render/test_collection_validate.yaml ? extensions/render/tests/cassettes/test_render/test_collection_validate.yaml
- tests/extensions/cassettes/test_render/test_item_validate.yaml ? extensions/render/tests/cassettes/test_render/test_item_validate.yaml
- tests/data-files/render/collection.json ? extensions/render/tests/data-files/collection.json
- tests/data-files/render/item.json ? extensions/render/tests/data-files/item.json
- tests/extensions/test_render.py ? extensions/render/tests/test_render.py
- + extensions/sar/README.md
- + extensions/sar/pyproject.toml
- + extensions/sar/pystac/extensions/py.typed
- pystac/extensions/sar.py ? extensions/sar/pystac/extensions/sar.py
- tests/extensions/cassettes/test_sar/test_all.yaml ? extensions/sar/tests/cassettes/test_sar/test_all.yaml
- tests/extensions/cassettes/test_sar/test_required.yaml ? extensions/sar/tests/cassettes/test_sar/test_required.yaml
- + extensions/sar/tests/data-files/collections/multi-extent.json
- tests/data-files/sar/sentinel-1.json ? extensions/sar/tests/data-files/sentinel-1.json
- tests/extensions/test_sar.py ? extensions/sar/tests/test_sar.py
- + extensions/sat/README.md
- + extensions/sat/pyproject.toml
- + extensions/sat/pystac/extensions/py.typed
- pystac/extensions/sat.py ? extensions/sat/pystac/extensions/sat.py
- tests/extensions/cassettes/test_sat/test_absolute_orbit.yaml ? extensions/sat/tests/cassettes/test_sat/test_absolute_orbit.yaml
- tests/extensions/cassettes/test_sat/test_anx_datetime.yaml ? extensions/sat/tests/cassettes/test_sat/test_anx_datetime.yaml
- tests/extensions/cassettes/test_sat/test_both.yaml ? extensions/sat/tests/cassettes/test_sat/test_both.yaml
- tests/extensions/cassettes/test_sat/test_clear_orbit_state.yaml ? extensions/sat/tests/cassettes/test_sat/test_clear_orbit_state.yaml
- tests/extensions/cassettes/test_sat/test_clear_relative_orbit.yaml ? extensions/sat/tests/cassettes/test_sat/test_clear_relative_orbit.yaml
- tests/extensions/cassettes/test_sat/test_modify.yaml ? extensions/sat/tests/cassettes/test_sat/test_modify.yaml
- tests/extensions/cassettes/test_sat/test_no_args_fails.yaml ? extensions/sat/tests/cassettes/test_sat/test_no_args_fails.yaml
- tests/extensions/cassettes/test_sat/test_orbit_state.yaml ? extensions/sat/tests/cassettes/test_sat/test_orbit_state.yaml
- tests/extensions/cassettes/test_sat/test_platform_international_designator.yaml ? extensions/sat/tests/cassettes/test_sat/test_platform_international_designator.yaml
- tests/extensions/cassettes/test_sat/test_relative_orbit.yaml ? extensions/sat/tests/cassettes/test_sat/test_relative_orbit.yaml
- tests/extensions/cassettes/test_sat/test_relative_orbit_no_negative.yaml ? extensions/sat/tests/cassettes/test_sat/test_relative_orbit_no_negative.yaml
- + extensions/sat/tests/data-files/collections/multi-extent.json
- tests/data-files/sat/sentinel-1.json ? extensions/sat/tests/data-files/sentinel-1.json
- tests/extensions/test_sat.py ? extensions/sat/tests/test_sat.py
- + extensions/scientific/README.md
- + extensions/scientific/pyproject.toml
- + extensions/scientific/pystac/extensions/py.typed
- pystac/extensions/scientific.py ? extensions/scientific/pystac/extensions/scientific.py
- tests/extensions/cassettes/test_scientific/test_citation.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_citation.yaml
- tests/extensions/cassettes/test_scientific/test_collection_citation.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_citation.yaml
- tests/extensions/cassettes/test_scientific/test_collection_doi.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_doi.yaml
- tests/extensions/cassettes/test_scientific/test_collection_publications.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_publications.yaml
- tests/extensions/cassettes/test_scientific/test_collection_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_all_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_all_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_all_publications_with_none.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_all_publications_with_none.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_all_publications_with_some.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_all_publications_with_some.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_publication_forward.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_publication_forward.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_publication_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_publication_one.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_publication_reverse.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_publication_reverse.yaml
- tests/extensions/cassettes/test_scientific/test_doi.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_doi.yaml
- tests/extensions/cassettes/test_scientific/test_publications.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_publications.yaml
- tests/extensions/cassettes/test_scientific/test_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_remove_all_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_all_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_remove_all_publications_with_none.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_all_publications_with_none.yaml
- tests/extensions/cassettes/test_scientific/test_remove_all_publications_with_some.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_all_publications_with_some.yaml
- tests/extensions/cassettes/test_scientific/test_remove_publication_forward.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_publication_forward.yaml
- tests/extensions/cassettes/test_scientific/test_remove_publication_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_publication_one.yaml
- tests/extensions/cassettes/test_scientific/test_remove_publication_reverse.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_publication_reverse.yaml
- tests/data-files/scientific/collection.json ? extensions/scientific/tests/data-files/collection.json
- tests/data-files/scientific/item.json ? extensions/scientific/tests/data-files/item.json
- tests/extensions/test_scientific.py ? extensions/scientific/tests/test_scientific.py
- + extensions/storage/README.md
- + extensions/storage/pyproject.toml
- + extensions/storage/pystac/extensions/py.typed
- + extensions/storage/pystac/extensions/storage.py
- + extensions/storage/tests/cassettes/test_storage/test_validate_storage.yaml
- tests/data-files/storage/collection-naip.json ? extensions/storage/tests/data-files/collection-naip.json
- tests/data-files/storage/item-naip.json ? extensions/storage/tests/data-files/item-naip.json
- + extensions/storage/tests/data-files/item-v1.0.0.json
- + extensions/storage/tests/test_storage.py
- + extensions/table/README.md
- + extensions/table/pyproject.toml
- + extensions/table/pystac/extensions/py.typed
- pystac/extensions/table.py ? extensions/table/pystac/extensions/table.py
- tests/extensions/cassettes/test_table/test_validate.yaml ? extensions/table/tests/cassettes/test_table/test_validate.yaml
- tests/data-files/table/README.md ? extensions/table/tests/data-files/README.md
- tests/data-files/table/collection-2.json ? extensions/table/tests/data-files/collection-2.json
- tests/data-files/table/collection.json ? extensions/table/tests/data-files/collection.json
- tests/data-files/table/item.json ? extensions/table/tests/data-files/item.json
- tests/data-files/table/table-collection.json ? extensions/table/tests/data-files/table-collection.json
- tests/extensions/test_table.py ? extensions/table/tests/test_table.py
- + extensions/timestamps/README.md
- + extensions/timestamps/pyproject.toml
- + extensions/timestamps/pystac/extensions/py.typed
- pystac/extensions/timestamps.py ? extensions/timestamps/pystac/extensions/timestamps.py
- tests/extensions/cassettes/test_timestamps/test_expires.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_expires.yaml
- tests/extensions/cassettes/test_timestamps/test_published.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_published.yaml
- tests/extensions/cassettes/test_timestamps/test_unpublished.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_unpublished.yaml
- tests/extensions/cassettes/test_timestamps/test_validate_timestamps.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_validate_timestamps.yaml
- + extensions/timestamps/tests/conftest.py
- + extensions/timestamps/tests/data-files/collections/multi-extent.json
- tests/data-files/timestamps/example-landsat8.json ? extensions/timestamps/tests/data-files/example-landsat8.json
- tests/extensions/test_timestamps.py ? extensions/timestamps/tests/test_timestamps.py
- + extensions/version/README.md
- + extensions/version/pyproject.toml
- + extensions/version/pystac/extensions/py.typed
- pystac/extensions/version.py ? extensions/version/pystac/extensions/version.py
- tests/extensions/cassettes/test_version/test_add_deprecated_version.yaml ? extensions/version/tests/cassettes/test_version/test_add_deprecated_version.yaml
- tests/extensions/cassettes/test_version/test_add_not_deprecated_version.yaml ? extensions/version/tests/cassettes/test_version/test_add_not_deprecated_version.yaml
- tests/extensions/cassettes/test_version/test_add_version.yaml ? extensions/version/tests/cassettes/test_version/test_add_version.yaml
- tests/extensions/cassettes/test_version/test_all_links.yaml ? extensions/version/tests/cassettes/test_version/test_all_links.yaml
- tests/extensions/cassettes/test_version/test_assets.yaml ? extensions/version/tests/cassettes/test_version/test_assets.yaml
- tests/extensions/cassettes/test_version/test_catalog_add_version.yaml ? extensions/version/tests/cassettes/test_version/test_catalog_add_version.yaml
- tests/extensions/cassettes/test_version/test_catalog_validate_all.yaml ? extensions/version/tests/cassettes/test_version/test_catalog_validate_all.yaml
- tests/extensions/cassettes/test_version/test_collection_add_version.yaml ? extensions/version/tests/cassettes/test_version/test_collection_add_version.yaml
- tests/extensions/cassettes/test_version/test_collection_validate_all.yaml ? extensions/version/tests/cassettes/test_version/test_collection_validate_all.yaml
- tests/extensions/cassettes/test_version/test_latest.yaml ? extensions/version/tests/cassettes/test_version/test_latest.yaml
- tests/extensions/cassettes/test_version/test_optional_version.yaml ? extensions/version/tests/cassettes/test_version/test_optional_version.yaml
- tests/extensions/cassettes/test_version/test_predecessor.yaml ? extensions/version/tests/cassettes/test_version/test_predecessor.yaml
- tests/extensions/cassettes/test_version/test_successor.yaml ? extensions/version/tests/cassettes/test_version/test_successor.yaml
- tests/extensions/cassettes/test_version/test_version_in_properties.yaml ? extensions/version/tests/cassettes/test_version/test_version_in_properties.yaml
- + extensions/version/tests/conftest.py
- + extensions/version/tests/data-files/catalogs/test-case-1/catalog.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-1/area-1-1-imagery/area-1-1-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-1/area-1-1-labels/area-1-1-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-1/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-2/area-1-2-imagery/area-1-2-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-2/area-1-2-labels/area-1-2-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-2/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/catalog.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-1/area-2-1-imagery/area-2-1-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-1/area-2-1-labels/area-2-1-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-1/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-2/area-2-2-imagery/area-2-2-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-2/area-2-2-labels/area-2-2-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-2/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/catalog.json
- tests/data-files/version/collection.json ? extensions/version/tests/data-files/collection.json
- tests/data-files/version/item.json ? extensions/version/tests/data-files/item.json
- tests/extensions/test_version.py ? extensions/version/tests/test_version.py
- + extensions/view/README.md
- + extensions/view/pyproject.toml
- + extensions/view/pystac/extensions/py.typed
- pystac/extensions/view.py ? extensions/view/pystac/extensions/view.py
- tests/extensions/cassettes/test_view/test_azimuth.yaml ? extensions/view/tests/cassettes/test_view/test_azimuth.yaml
- tests/extensions/cassettes/test_view/test_incidence_angle.yaml ? extensions/view/tests/cassettes/test_view/test_incidence_angle.yaml
- tests/extensions/cassettes/test_view/test_off_nadir.yaml ? extensions/view/tests/cassettes/test_view/test_off_nadir.yaml
- tests/extensions/cassettes/test_view/test_sun_azimuth.yaml ? extensions/view/tests/cassettes/test_view/test_sun_azimuth.yaml
- tests/extensions/cassettes/test_view/test_sun_elevation.yaml ? extensions/view/tests/cassettes/test_view/test_sun_elevation.yaml
- tests/extensions/cassettes/test_view/test_validate_view.yaml ? extensions/view/tests/cassettes/test_view/test_validate_view.yaml
- tests/data-files/view/collection-with-summaries.json ? extensions/view/tests/data-files/collection-with-summaries.json
- tests/data-files/view/example-landsat8.json ? extensions/view/tests/data-files/example-landsat8.json
- tests/extensions/test_view.py ? extensions/view/tests/test_view.py
- + extensions/xarray_assets/README.md
- + extensions/xarray_assets/pyproject.toml
- + extensions/xarray_assets/pystac/extensions/py.typed
- pystac/extensions/xarray_assets.py ? extensions/xarray_assets/pystac/extensions/xarray_assets.py
- tests/extensions/cassettes/test_xarray_assets/test_collection_validate.yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_collection_validate.yaml
- tests/extensions/cassettes/test_xarray_assets/test_item_validate.yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_item_validate.yaml
- tests/extensions/cassettes/test_xarray_assets/test_set_field[open_kwargs-value1].yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_set_field[open_kwargs-value1].yaml
- tests/extensions/cassettes/test_xarray_assets/test_set_field[storage_options-value0].yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_set_field[storage_options-value0].yaml
- tests/data-files/xarray-assets/collection.json ? extensions/xarray_assets/tests/data-files/collection.json
- tests/data-files/xarray-assets/item.json ? extensions/xarray_assets/tests/data-files/item.json
- tests/extensions/test_xarray_assets.py ? extensions/xarray_assets/tests/test_xarray_assets.py
- pyproject.toml
- pystac/extensions/ext.py
- ? pystac/extensions/storage.py
- + pytest-pystac/README.md
- + pytest-pystac/pyproject.toml
- + pytest-pystac/pytest_pystac/__init__.py
- + pytest-pystac/pytest_pystac/data-files/item/sample-item.json
- + pytest-pystac/pytest_pystac/plugin.py
- + pytest-pystac/pytest_pystac/py.typed
- release-please-config.json
- scripts/pull-static
- tests/cassettes/test_catalog/TestCatalog.test_read_remote.yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat0].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat1].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat3].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat4].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat5].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat6].yaml
- tests/cassettes/test_catalog/test_validate_all_with_max_n.yaml
- tests/cassettes/test_catalog/test_validate_all_with_recusive_off.yaml
- tests/cassettes/test_item/test_non_hierarchical_relative_link.yaml
- tests/cassettes/test_item/test_null_geometry.yaml
- + tests/cassettes/test_stac_io/test_custom_stac_io.yaml
- tests/cassettes/test_stac_io/test_proj_json_schema_is_readable.yaml
- tests/cassettes/test_stac_io/test_retry_stac_io.yaml
- tests/cassettes/test_stac_io/test_retry_stac_io_404.yaml
- tests/cassettes/test_stac_io/test_urls_with_non_ascii_characters.yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog0].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog1].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog3].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog4].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog5].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog6].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog0].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog1].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog3].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog4].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog5].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog6].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog0].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog1].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog3].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog4].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog5].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog6].yaml
- tests/conftest.py
- ? tests/extensions/cassettes/test_storage/test_asset_platform.yaml
- ? tests/extensions/cassettes/test_storage/test_asset_region.yaml
- ? tests/extensions/cassettes/test_storage/test_asset_requester_pays.yaml
- ? tests/extensions/cassettes/test_storage/test_asset_tier.yaml
- ? tests/extensions/cassettes/test_storage/test_validate_storage.yaml
- + tests/extensions/data-files/eo-landsat-example.json
- tests/extensions/test_ext.py
- ? tests/extensions/test_storage.py
- tests/test_item.py
- tests/test_item_assets.py
- tests/test_stac_io.py
- tests/test_version.py ? tests/test_stac_version.py
- tests/test_utils.py
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all.yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_deprecated_dict_arg.yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case0].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case1].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case2].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case3].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case4].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case5].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case6].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_custom_validator.yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example0].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example100].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example101].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example102].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example103].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example104].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example105].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example106].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example107].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example108].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example109].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example10].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example110].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example111].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example112].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example113].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example114].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example115].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example116].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example117].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example118].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example119].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example11].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example120].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example121].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example122].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example123].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example124].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example12].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example13].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example14].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example15].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example16].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example17].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example18].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example19].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example1].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example20].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example21].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example22].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example23].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example24].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example25].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example26].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example27].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example28].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example29].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example2].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example30].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example31].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example32].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example33].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example34].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example35].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example36].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example37].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example38].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example39].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example3].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example40].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example41].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example42].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example43].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example44].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example45].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example46].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example47].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example48].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example49].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example4].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example50].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example51].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example52].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example53].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example54].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example55].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example56].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example57].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example58].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example59].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example5].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example60].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example61].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example62].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example63].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example64].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example65].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example66].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example67].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example68].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example69].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example6].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example70].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example71].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example72].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example73].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example74].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example75].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example76].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example77].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example78].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example79].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example7].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example80].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example81].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example82].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example83].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example84].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example85].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example86].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example87].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example88].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example89].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example8].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example90].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example91].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example92].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example93].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example94].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example95].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example96].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example97].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example98].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example99].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example9].yaml
- uv.lock


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/compare/ad30a751804b2306d157254f3735dc78f96dffb4...18ec29e6630814a06dadaf37ce4e67db5c72d8b4

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/compare/ad30a751804b2306d157254f3735dc78f96dffb4...18ec29e6630814a06dadaf37ce4e67db5c72d8b4
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260809/eff3b42c/attachment-0001.htm>

From gitlab at salsa.debian.org  Sun Aug  9 18:58:45 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sun, 09 Aug 2026 17:58:45 +0000
Subject: [Git][debian-gis-team/pystac][pristine-tar] pristine-tar data for
 pystac_1.15.2.orig.tar.gz
Message-ID: <6a78bfd5aa3c1_537faec4665913@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / pystac


Commits:
e700da01 by Antonio Valentino at 2026-08-01T20:23:56+02:00
pristine-tar data for pystac_1.15.2.orig.tar.gz

- - - - -


2 changed files:

- + pystac_1.15.2.orig.tar.gz.delta
- + pystac_1.15.2.orig.tar.gz.id


Changes:

=====================================
pystac_1.15.2.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/pystac_1.15.2.orig.tar.gz.delta differ


=====================================
pystac_1.15.2.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+d83ed810a684c5b51d61ed7fb82ba565235dc1c3



View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/e700da01dec13f2d4ccb582be6accab6c2d72203

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/e700da01dec13f2d4ccb582be6accab6c2d72203
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260809/e9103538/attachment.htm>

From gitlab at salsa.debian.org  Sun Aug  9 18:58:54 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Sun, 09 Aug 2026 17:58:54 +0000
Subject: [Git][debian-gis-team/pystac][upstream] New upstream version 1.15.2
Message-ID: <6a78bfded0e62_53712f1ec666126@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / pystac


Commits:
870088c5 by Antonio Valentino at 2026-08-01T20:23:46+02:00
New upstream version 1.15.2
- - - - -


567 changed files:

- .github/dependabot.yml
- .github/workflows/continuous-integration.yml
- .github/workflows/release-please.yml
- .github/workflows/release.yml
- .pre-commit-config.yaml
- .release-please-manifest.json
- CHANGELOG.md
- README.md
- asv.conf.json
- benchmarks/item.py
- + conftest.py
- pystac/extensions/__init__.py ? core/README.md
- + core/pyproject.toml
- pystac/__init__.py ? core/pystac/__init__.py
- pystac/asset.py ? core/pystac/asset.py
- pystac/cache.py ? core/pystac/cache.py
- pystac/catalog.py ? core/pystac/catalog.py
- pystac/client.py ? core/pystac/client.py
- pystac/collection.py ? core/pystac/collection.py
- pystac/common_metadata.py ? core/pystac/common_metadata.py
- pystac/errors.py ? core/pystac/errors.py
- + core/pystac/extensions/__init__.py
- pystac/extensions/base.py ? core/pystac/extensions/base.py
- pystac/extensions/hooks.py ? core/pystac/extensions/hooks.py
- pystac/html/JSON.jinja2 ? core/pystac/html/JSON.jinja2
- pystac/html/Macros.jinja2 ? core/pystac/html/Macros.jinja2
- pystac/html/__init__.py ? core/pystac/html/__init__.py
- pystac/html/jinja_env.py ? core/pystac/html/jinja_env.py
- pystac/item.py ? core/pystac/item.py
- pystac/item_assets.py ? core/pystac/item_assets.py
- pystac/item_collection.py ? core/pystac/item_collection.py
- pystac/layout.py ? core/pystac/layout.py
- pystac/link.py ? core/pystac/link.py
- pystac/media_type.py ? core/pystac/media_type.py
- pystac/provider.py ? core/pystac/provider.py
- pystac/py.typed ? core/pystac/py.typed
- pystac/rel_type.py ? core/pystac/rel_type.py
- pystac/serialization/__init__.py ? core/pystac/serialization/__init__.py
- pystac/serialization/common_properties.py ? core/pystac/serialization/common_properties.py
- pystac/serialization/identify.py ? core/pystac/serialization/identify.py
- pystac/serialization/migrate.py ? core/pystac/serialization/migrate.py
- pystac/stac_io.py ? core/pystac/stac_io.py
- pystac/stac_object.py ? core/pystac/stac_object.py
- pystac/static/__init__.py ? core/pystac/static/__init__.py
- pystac/static/fields-normalized.json ? core/pystac/static/fields-normalized.json
- pystac/summaries.py ? core/pystac/summaries.py
- pystac/utils.py ? core/pystac/utils.py
- pystac/validation/__init__.py ? core/pystac/validation/__init__.py
- pystac/validation/jsonschemas/__init__.py ? core/pystac/validation/jsonschemas/__init__.py
- pystac/validation/jsonschemas/geojson/Feature.json ? core/pystac/validation/jsonschemas/geojson/Feature.json
- pystac/validation/jsonschemas/geojson/Geometry.json ? core/pystac/validation/jsonschemas/geojson/Geometry.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/bands.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/bands.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/basics.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/basics.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/catalog.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/catalog.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/collection.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/collection.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/common.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/common.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/data-values.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/data-values.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/datetime.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/datetime.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/instrument.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/instrument.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/item.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/item.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/licensing.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/licensing.json
- pystac/validation/jsonschemas/stac-spec/v1.1.0/provider.json ? core/pystac/validation/jsonschemas/stac-spec/v1.1.0/provider.json
- pystac/validation/local_validator.py ? core/pystac/validation/local_validator.py
- pystac/validation/schema_uri_map.py ? core/pystac/validation/schema_uri_map.py
- pystac/validation/stac_validator.py ? core/pystac/validation/stac_validator.py
- pystac/version.py ? core/pystac/version.py
- docs/tutorials/creating-a-landsat-stac.ipynb
- + extensions/classification/README.md
- + extensions/classification/pyproject.toml
- pystac/extensions/classification.py ? extensions/classification/pystac/extensions/classification.py
- + extensions/classification/pystac/extensions/py.typed
- tests/extensions/cassettes/test_classification/test_apply_bitfields.yaml ? extensions/classification/tests/cassettes/test_classification/test_apply_bitfields.yaml
- tests/extensions/cassettes/test_classification/test_apply_classes.yaml ? extensions/classification/tests/cassettes/test_classification/test_apply_classes.yaml
- tests/extensions/cassettes/test_classification/test_validate_classification.yaml ? extensions/classification/tests/cassettes/test_classification/test_validate_classification.yaml
- tests/data-files/classification/classification_landsat_example.json ? extensions/classification/tests/data-files/classification_landsat_example.json
- tests/data-files/classification/collection-item-assets-raster-bands.json ? extensions/classification/tests/data-files/collection-item-assets-raster-bands.json
- + extensions/classification/tests/data-files/item/sample-item.json
- tests/extensions/test_classification.py ? extensions/classification/tests/test_classification.py
- + extensions/datacube/README.md
- + extensions/datacube/pyproject.toml
- pystac/extensions/datacube.py ? extensions/datacube/pystac/extensions/datacube.py
- + extensions/datacube/pystac/extensions/py.typed
- tests/extensions/cassettes/test_datacube/test_set_dimensions.yaml ? extensions/datacube/tests/cassettes/test_datacube/test_set_dimensions.yaml
- tests/extensions/cassettes/test_datacube/test_set_variables.yaml ? extensions/datacube/tests/cassettes/test_datacube/test_set_variables.yaml
- tests/extensions/cassettes/test_datacube/test_validate.yaml ? extensions/datacube/tests/cassettes/test_datacube/test_validate.yaml
- tests/data-files/datacube/item.json ? extensions/datacube/tests/data-files/item.json
- tests/extensions/test_datacube.py ? extensions/datacube/tests/test_datacube.py
- + extensions/eo/README.md
- + extensions/eo/pyproject.toml
- pystac/extensions/eo.py ? extensions/eo/pystac/extensions/eo.py
- + extensions/eo/pystac/extensions/py.typed
- tests/extensions/cassettes/test_eo/test_asset_bands.yaml ? extensions/eo/tests/cassettes/test_eo/test_asset_bands.yaml
- tests/extensions/cassettes/test_eo/test_bands.yaml ? extensions/eo/tests/cassettes/test_eo/test_bands.yaml
- tests/extensions/cassettes/test_eo/test_cloud_cover.yaml ? extensions/eo/tests/cassettes/test_eo/test_cloud_cover.yaml
- tests/extensions/cassettes/test_eo/test_set_field[cloud_cover-7.8].yaml ? extensions/eo/tests/cassettes/test_eo/test_set_field[cloud_cover-7.8].yaml
- tests/extensions/cassettes/test_eo/test_set_field[snow_cover-99].yaml ? extensions/eo/tests/cassettes/test_eo/test_set_field[snow_cover-99].yaml
- tests/extensions/cassettes/test_eo/test_validate_eo.yaml ? extensions/eo/tests/cassettes/test_eo/test_validate_eo.yaml
- tests/data-files/eo/eo-collection.json ? extensions/eo/tests/data-files/eo-collection.json
- tests/data-files/eo/eo-landsat-example.json ? extensions/eo/tests/data-files/eo-landsat-example.json
- tests/data-files/eo/eo-sentinel2-item.json ? extensions/eo/tests/data-files/eo-sentinel2-item.json
- + extensions/eo/tests/data-files/examples/0.8.1/item-spec/examples/landsat8-sample.json
- + extensions/eo/tests/data-files/examples/0.8.1/item-spec/examples/sentinel2-sample.json
- + extensions/eo/tests/data-files/examples/0.9.0/item-spec/examples/landsat8-sample.json
- + extensions/eo/tests/data-files/item/sample-item.json
- tests/data-files/eo/sample-bands-in-item-properties.json ? extensions/eo/tests/data-files/sample-bands-in-item-properties.json
- tests/extensions/test_eo.py ? extensions/eo/tests/test_eo.py
- + extensions/file/README.md
- + extensions/file/pyproject.toml
- pystac/extensions/file.py ? extensions/file/pystac/extensions/file.py
- + extensions/file/pystac/extensions/py.typed
- tests/extensions/cassettes/test_file/test_migrate_from_v1_0_0.yaml ? extensions/file/tests/cassettes/test_file/test_migrate_from_v1_0_0.yaml
- tests/extensions/cassettes/test_file/test_migrate_from_v2_0_0.yaml ? extensions/file/tests/cassettes/test_file/test_migrate_from_v2_0_0.yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[calibrations-local_path-different-file.xml].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[calibrations-local_path-different-file.xml].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[measurement-header_size-8192].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[measurement-header_size-8192].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[thumbnail-byte_order-little-endian].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[thumbnail-byte_order-little-endian].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[thumbnail-checksum-90e40210163700a8a6501eccd00b6d3b44ddaed0].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[thumbnail-checksum-90e40210163700a8a6501eccd00b6d3b44ddaed0].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_asset[thumbnail-size-1].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_asset[thumbnail-size-1].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-byte_order-big-endian].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-byte_order-big-endian].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-checksum-90e40210163700a8a6501eccd00b6d3b44ddaedb].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-checksum-90e40210163700a8a6501eccd00b6d3b44ddaedb].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-header_size-4092].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-header_size-4092].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-local_path-a-path].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-local_path-a-path].yaml
- tests/extensions/cassettes/test_file/test_set_field_on_link[about-size-129302].yaml ? extensions/file/tests/cassettes/test_file/test_set_field_on_link[about-size-129302].yaml
- tests/extensions/cassettes/test_file/test_validate_catalog.yaml ? extensions/file/tests/cassettes/test_file/test_validate_catalog.yaml
- tests/extensions/cassettes/test_file/test_validate_collection.yaml ? extensions/file/tests/cassettes/test_file/test_validate_collection.yaml
- tests/extensions/cassettes/test_file/test_validate_item.yaml ? extensions/file/tests/cassettes/test_file/test_validate_item.yaml
- tests/data-files/file/catalog.json ? extensions/file/tests/data-files/catalog.json
- tests/data-files/file/collection.json ? extensions/file/tests/data-files/collection.json
- + extensions/file/tests/data-files/examples/1.0.0-beta.2/extensions/checksum/examples/sentinel1.json
- tests/data-files/file/item.json ? extensions/file/tests/data-files/item.json
- tests/extensions/test_file.py ? extensions/file/tests/test_file.py
- + extensions/grid/README.md
- + extensions/grid/pyproject.toml
- pystac/extensions/grid.py ? extensions/grid/pystac/extensions/grid.py
- + extensions/grid/pystac/extensions/py.typed
- tests/extensions/cassettes/test_grid/test_attributes.yaml ? extensions/grid/tests/cassettes/test_grid/test_attributes.yaml
- tests/extensions/cassettes/test_grid/test_modify.yaml ? extensions/grid/tests/cassettes/test_grid/test_modify.yaml
- tests/data-files/grid/example-landsat.json ? extensions/grid/tests/data-files/example-landsat.json
- tests/data-files/grid/example-sentinel2.json ? extensions/grid/tests/data-files/example-sentinel2.json
- tests/extensions/test_grid.py ? extensions/grid/tests/test_grid.py
- + extensions/item_assets/README.md
- + extensions/item_assets/pyproject.toml
- pystac/extensions/item_assets.py ? extensions/item_assets/pystac/extensions/item_assets.py
- + extensions/item_assets/pystac/extensions/py.typed
- + extensions/label/README.md
- + extensions/label/pyproject.toml
- pystac/extensions/label.py ? extensions/label/pystac/extensions/label.py
- + extensions/label/pystac/extensions/py.typed
- + extensions/mgrs/README.md
- + extensions/mgrs/pyproject.toml
- pystac/extensions/mgrs.py ? extensions/mgrs/pystac/extensions/mgrs.py
- + extensions/mgrs/pystac/extensions/py.typed
- tests/extensions/cassettes/test_mgrs/test_set_field[grid_square-ZA].yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_set_field[grid_square-ZA].yaml
- tests/extensions/cassettes/test_mgrs/test_set_field[latitude_band-C].yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_set_field[latitude_band-C].yaml
- tests/extensions/cassettes/test_mgrs/test_set_field[utm_zone-59].yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_set_field[utm_zone-59].yaml
- tests/extensions/cassettes/test_mgrs/test_validate.yaml ? extensions/mgrs/tests/cassettes/test_mgrs/test_validate.yaml
- tests/data-files/mgrs/item.json ? extensions/mgrs/tests/data-files/item.json
- tests/extensions/test_mgrs.py ? extensions/mgrs/tests/test_mgrs.py
- + extensions/mlm/README.md
- + extensions/mlm/pyproject.toml
- pystac/extensions/mlm.py ? extensions/mlm/pystac/extensions/mlm.py
- + extensions/mlm/pystac/extensions/py.typed
- tests/extensions/cassettes/test_mlm/test_apply.yaml ? extensions/mlm/tests/cassettes/test_mlm/test_apply.yaml
- tests/extensions/cassettes/test_mlm/test_validate_mlm.yaml ? extensions/mlm/tests/cassettes/test_mlm/test_validate_mlm.yaml
- tests/data-files/mlm/collection.json ? extensions/mlm/tests/data-files/collection.json
- + extensions/mlm/tests/data-files/item/sample-item.json
- tests/data-files/mlm/item_basic.json ? extensions/mlm/tests/data-files/item_basic.json
- tests/extensions/test_mlm.py ? extensions/mlm/tests/test_mlm.py
- + extensions/pointcloud/README.md
- + extensions/pointcloud/pyproject.toml
- pystac/extensions/pointcloud.py ? extensions/pointcloud/pystac/extensions/pointcloud.py
- + extensions/pointcloud/pystac/extensions/py.typed
- tests/extensions/cassettes/test_pointcloud/test_count.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_count.yaml
- tests/extensions/cassettes/test_pointcloud/test_density.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_density.yaml
- tests/extensions/cassettes/test_pointcloud/test_encoding.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_encoding.yaml
- tests/extensions/cassettes/test_pointcloud/test_schemas.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_schemas.yaml
- tests/extensions/cassettes/test_pointcloud/test_statistics.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_statistics.yaml
- tests/extensions/cassettes/test_pointcloud/test_type.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_type.yaml
- tests/extensions/cassettes/test_pointcloud/test_validate_pointcloud.yaml ? extensions/pointcloud/tests/cassettes/test_pointcloud/test_validate_pointcloud.yaml
- + extensions/pointcloud/tests/data-files/collections/multi-extent.json
- tests/data-files/pointcloud/example-laz-no-statistics.json ? extensions/pointcloud/tests/data-files/example-laz-no-statistics.json
- tests/data-files/pointcloud/example-laz.json ? extensions/pointcloud/tests/data-files/example-laz.json
- + extensions/pointcloud/tests/data-files/item/sample-item.json
- tests/extensions/test_pointcloud.py ? extensions/pointcloud/tests/test_pointcloud.py
- + extensions/projection/README.md
- + extensions/projection/pyproject.toml
- pystac/extensions/projection.py ? extensions/projection/pystac/extensions/projection.py
- + extensions/projection/pystac/extensions/py.typed
- tests/extensions/cassettes/test_projection/test_bbox.yaml ? extensions/projection/tests/cassettes/test_projection/test_bbox.yaml
- tests/extensions/cassettes/test_projection/test_centroid.yaml ? extensions/projection/tests/cassettes/test_projection/test_centroid.yaml
- tests/extensions/cassettes/test_projection/test_epsg.yaml ? extensions/projection/tests/cassettes/test_projection/test_epsg.yaml
- tests/extensions/cassettes/test_projection/test_geometry.yaml ? extensions/projection/tests/cassettes/test_projection/test_geometry.yaml
- tests/extensions/cassettes/test_projection/test_partial_apply.yaml ? extensions/projection/tests/cassettes/test_projection/test_partial_apply.yaml
- tests/extensions/cassettes/test_projection/test_projjson.yaml ? extensions/projection/tests/cassettes/test_projection/test_projjson.yaml
- tests/extensions/cassettes/test_projection/test_shape.yaml ? extensions/projection/tests/cassettes/test_projection/test_shape.yaml
- tests/extensions/cassettes/test_projection/test_transform.yaml ? extensions/projection/tests/cassettes/test_projection/test_transform.yaml
- tests/extensions/cassettes/test_projection/test_validate_proj.yaml ? extensions/projection/tests/cassettes/test_projection/test_validate_proj.yaml
- tests/extensions/cassettes/test_projection/test_wkt2.yaml ? extensions/projection/tests/cassettes/test_projection/test_wkt2.yaml
- + extensions/projection/tests/conftest.py
- tests/data-files/projection/another-1.1.json ? extensions/projection/tests/data-files/another-1.1.json
- tests/data-files/projection/collection-with-summaries.json ? extensions/projection/tests/data-files/collection-with-summaries.json
- tests/data-files/projection/example-landsat8.json ? extensions/projection/tests/data-files/example-landsat8.json
- tests/data-files/projection/example-with-version-1.1.json ? extensions/projection/tests/data-files/example-with-version-1.1.json
- tests/data-files/projection/example-with-version-1.2.json ? extensions/projection/tests/data-files/example-with-version-1.2.json
- tests/data-files/projection/optional-epsg.json ? extensions/projection/tests/data-files/optional-epsg.json
- tests/extensions/test_projection.py ? extensions/projection/tests/test_projection.py
- + extensions/raster/README.md
- + extensions/raster/pyproject.toml
- + extensions/raster/pystac/extensions/py.typed
- pystac/extensions/raster.py ? extensions/raster/pystac/extensions/raster.py
- tests/extensions/cassettes/test_raster/test_asset_bands.yaml ? extensions/raster/tests/cassettes/test_raster/test_asset_bands.yaml
- tests/extensions/cassettes/test_raster/test_validate_raster.yaml ? extensions/raster/tests/cassettes/test_raster/test_validate_raster.yaml
- tests/data-files/raster/gdalinfo.json ? extensions/raster/tests/data-files/gdalinfo.json
- tests/data-files/raster/landsat-collection-example.json ? extensions/raster/tests/data-files/landsat-collection-example.json
- tests/data-files/raster/raster-planet-example.json ? extensions/raster/tests/data-files/raster-planet-example.json
- tests/data-files/raster/raster-sentinel2-example.json ? extensions/raster/tests/data-files/raster-sentinel2-example.json
- tests/extensions/test_raster.py ? extensions/raster/tests/test_raster.py
- + extensions/render/README.md
- + extensions/render/pyproject.toml
- + extensions/render/pystac/extensions/py.typed
- pystac/extensions/render.py ? extensions/render/pystac/extensions/render.py
- tests/extensions/cassettes/test_render/test_collection_validate.yaml ? extensions/render/tests/cassettes/test_render/test_collection_validate.yaml
- tests/extensions/cassettes/test_render/test_item_validate.yaml ? extensions/render/tests/cassettes/test_render/test_item_validate.yaml
- tests/data-files/render/collection.json ? extensions/render/tests/data-files/collection.json
- tests/data-files/render/item.json ? extensions/render/tests/data-files/item.json
- tests/extensions/test_render.py ? extensions/render/tests/test_render.py
- + extensions/sar/README.md
- + extensions/sar/pyproject.toml
- + extensions/sar/pystac/extensions/py.typed
- pystac/extensions/sar.py ? extensions/sar/pystac/extensions/sar.py
- tests/extensions/cassettes/test_sar/test_all.yaml ? extensions/sar/tests/cassettes/test_sar/test_all.yaml
- tests/extensions/cassettes/test_sar/test_required.yaml ? extensions/sar/tests/cassettes/test_sar/test_required.yaml
- + extensions/sar/tests/data-files/collections/multi-extent.json
- tests/data-files/sar/sentinel-1.json ? extensions/sar/tests/data-files/sentinel-1.json
- tests/extensions/test_sar.py ? extensions/sar/tests/test_sar.py
- + extensions/sat/README.md
- + extensions/sat/pyproject.toml
- + extensions/sat/pystac/extensions/py.typed
- pystac/extensions/sat.py ? extensions/sat/pystac/extensions/sat.py
- tests/extensions/cassettes/test_sat/test_absolute_orbit.yaml ? extensions/sat/tests/cassettes/test_sat/test_absolute_orbit.yaml
- tests/extensions/cassettes/test_sat/test_anx_datetime.yaml ? extensions/sat/tests/cassettes/test_sat/test_anx_datetime.yaml
- tests/extensions/cassettes/test_sat/test_both.yaml ? extensions/sat/tests/cassettes/test_sat/test_both.yaml
- tests/extensions/cassettes/test_sat/test_clear_orbit_state.yaml ? extensions/sat/tests/cassettes/test_sat/test_clear_orbit_state.yaml
- tests/extensions/cassettes/test_sat/test_clear_relative_orbit.yaml ? extensions/sat/tests/cassettes/test_sat/test_clear_relative_orbit.yaml
- tests/extensions/cassettes/test_sat/test_modify.yaml ? extensions/sat/tests/cassettes/test_sat/test_modify.yaml
- tests/extensions/cassettes/test_sat/test_no_args_fails.yaml ? extensions/sat/tests/cassettes/test_sat/test_no_args_fails.yaml
- tests/extensions/cassettes/test_sat/test_orbit_state.yaml ? extensions/sat/tests/cassettes/test_sat/test_orbit_state.yaml
- tests/extensions/cassettes/test_sat/test_platform_international_designator.yaml ? extensions/sat/tests/cassettes/test_sat/test_platform_international_designator.yaml
- tests/extensions/cassettes/test_sat/test_relative_orbit.yaml ? extensions/sat/tests/cassettes/test_sat/test_relative_orbit.yaml
- tests/extensions/cassettes/test_sat/test_relative_orbit_no_negative.yaml ? extensions/sat/tests/cassettes/test_sat/test_relative_orbit_no_negative.yaml
- + extensions/sat/tests/data-files/collections/multi-extent.json
- tests/data-files/sat/sentinel-1.json ? extensions/sat/tests/data-files/sentinel-1.json
- tests/extensions/test_sat.py ? extensions/sat/tests/test_sat.py
- + extensions/scientific/README.md
- + extensions/scientific/pyproject.toml
- + extensions/scientific/pystac/extensions/py.typed
- pystac/extensions/scientific.py ? extensions/scientific/pystac/extensions/scientific.py
- tests/extensions/cassettes/test_scientific/test_citation.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_citation.yaml
- tests/extensions/cassettes/test_scientific/test_collection_citation.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_citation.yaml
- tests/extensions/cassettes/test_scientific/test_collection_doi.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_doi.yaml
- tests/extensions/cassettes/test_scientific/test_collection_publications.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_publications.yaml
- tests/extensions/cassettes/test_scientific/test_collection_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_all_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_all_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_all_publications_with_none.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_all_publications_with_none.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_all_publications_with_some.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_all_publications_with_some.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_publication_forward.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_publication_forward.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_publication_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_publication_one.yaml
- tests/extensions/cassettes/test_scientific/test_collection_remove_publication_reverse.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_collection_remove_publication_reverse.yaml
- tests/extensions/cassettes/test_scientific/test_doi.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_doi.yaml
- tests/extensions/cassettes/test_scientific/test_publications.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_publications.yaml
- tests/extensions/cassettes/test_scientific/test_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_remove_all_publications_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_all_publications_one.yaml
- tests/extensions/cassettes/test_scientific/test_remove_all_publications_with_none.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_all_publications_with_none.yaml
- tests/extensions/cassettes/test_scientific/test_remove_all_publications_with_some.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_all_publications_with_some.yaml
- tests/extensions/cassettes/test_scientific/test_remove_publication_forward.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_publication_forward.yaml
- tests/extensions/cassettes/test_scientific/test_remove_publication_one.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_publication_one.yaml
- tests/extensions/cassettes/test_scientific/test_remove_publication_reverse.yaml ? extensions/scientific/tests/cassettes/test_scientific/test_remove_publication_reverse.yaml
- tests/data-files/scientific/collection.json ? extensions/scientific/tests/data-files/collection.json
- tests/data-files/scientific/item.json ? extensions/scientific/tests/data-files/item.json
- tests/extensions/test_scientific.py ? extensions/scientific/tests/test_scientific.py
- + extensions/storage/README.md
- + extensions/storage/pyproject.toml
- + extensions/storage/pystac/extensions/py.typed
- + extensions/storage/pystac/extensions/storage.py
- + extensions/storage/tests/cassettes/test_storage/test_validate_storage.yaml
- tests/data-files/storage/collection-naip.json ? extensions/storage/tests/data-files/collection-naip.json
- tests/data-files/storage/item-naip.json ? extensions/storage/tests/data-files/item-naip.json
- + extensions/storage/tests/data-files/item-v1.0.0.json
- + extensions/storage/tests/test_storage.py
- + extensions/table/README.md
- + extensions/table/pyproject.toml
- + extensions/table/pystac/extensions/py.typed
- pystac/extensions/table.py ? extensions/table/pystac/extensions/table.py
- tests/extensions/cassettes/test_table/test_validate.yaml ? extensions/table/tests/cassettes/test_table/test_validate.yaml
- tests/data-files/table/README.md ? extensions/table/tests/data-files/README.md
- tests/data-files/table/collection-2.json ? extensions/table/tests/data-files/collection-2.json
- tests/data-files/table/collection.json ? extensions/table/tests/data-files/collection.json
- tests/data-files/table/item.json ? extensions/table/tests/data-files/item.json
- tests/data-files/table/table-collection.json ? extensions/table/tests/data-files/table-collection.json
- tests/extensions/test_table.py ? extensions/table/tests/test_table.py
- + extensions/timestamps/README.md
- + extensions/timestamps/pyproject.toml
- + extensions/timestamps/pystac/extensions/py.typed
- pystac/extensions/timestamps.py ? extensions/timestamps/pystac/extensions/timestamps.py
- tests/extensions/cassettes/test_timestamps/test_expires.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_expires.yaml
- tests/extensions/cassettes/test_timestamps/test_published.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_published.yaml
- tests/extensions/cassettes/test_timestamps/test_unpublished.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_unpublished.yaml
- tests/extensions/cassettes/test_timestamps/test_validate_timestamps.yaml ? extensions/timestamps/tests/cassettes/test_timestamps/test_validate_timestamps.yaml
- + extensions/timestamps/tests/conftest.py
- + extensions/timestamps/tests/data-files/collections/multi-extent.json
- tests/data-files/timestamps/example-landsat8.json ? extensions/timestamps/tests/data-files/example-landsat8.json
- tests/extensions/test_timestamps.py ? extensions/timestamps/tests/test_timestamps.py
- + extensions/version/README.md
- + extensions/version/pyproject.toml
- + extensions/version/pystac/extensions/py.typed
- pystac/extensions/version.py ? extensions/version/pystac/extensions/version.py
- tests/extensions/cassettes/test_version/test_add_deprecated_version.yaml ? extensions/version/tests/cassettes/test_version/test_add_deprecated_version.yaml
- tests/extensions/cassettes/test_version/test_add_not_deprecated_version.yaml ? extensions/version/tests/cassettes/test_version/test_add_not_deprecated_version.yaml
- tests/extensions/cassettes/test_version/test_add_version.yaml ? extensions/version/tests/cassettes/test_version/test_add_version.yaml
- tests/extensions/cassettes/test_version/test_all_links.yaml ? extensions/version/tests/cassettes/test_version/test_all_links.yaml
- tests/extensions/cassettes/test_version/test_assets.yaml ? extensions/version/tests/cassettes/test_version/test_assets.yaml
- tests/extensions/cassettes/test_version/test_catalog_add_version.yaml ? extensions/version/tests/cassettes/test_version/test_catalog_add_version.yaml
- tests/extensions/cassettes/test_version/test_catalog_validate_all.yaml ? extensions/version/tests/cassettes/test_version/test_catalog_validate_all.yaml
- tests/extensions/cassettes/test_version/test_collection_add_version.yaml ? extensions/version/tests/cassettes/test_version/test_collection_add_version.yaml
- tests/extensions/cassettes/test_version/test_collection_validate_all.yaml ? extensions/version/tests/cassettes/test_version/test_collection_validate_all.yaml
- tests/extensions/cassettes/test_version/test_latest.yaml ? extensions/version/tests/cassettes/test_version/test_latest.yaml
- tests/extensions/cassettes/test_version/test_optional_version.yaml ? extensions/version/tests/cassettes/test_version/test_optional_version.yaml
- tests/extensions/cassettes/test_version/test_predecessor.yaml ? extensions/version/tests/cassettes/test_version/test_predecessor.yaml
- tests/extensions/cassettes/test_version/test_successor.yaml ? extensions/version/tests/cassettes/test_version/test_successor.yaml
- tests/extensions/cassettes/test_version/test_version_in_properties.yaml ? extensions/version/tests/cassettes/test_version/test_version_in_properties.yaml
- + extensions/version/tests/conftest.py
- + extensions/version/tests/data-files/catalogs/test-case-1/catalog.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-1/area-1-1-imagery/area-1-1-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-1/area-1-1-labels/area-1-1-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-1/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-2/area-1-2-imagery/area-1-2-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-2/area-1-2-labels/area-1-2-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/area-1-2/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-1/catalog.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-1/area-2-1-imagery/area-2-1-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-1/area-2-1-labels/area-2-1-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-1/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-2/area-2-2-imagery/area-2-2-imagery.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-2/area-2-2-labels/area-2-2-labels.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/area-2-2/collection.json
- + extensions/version/tests/data-files/catalogs/test-case-1/country-2/catalog.json
- tests/data-files/version/collection.json ? extensions/version/tests/data-files/collection.json
- tests/data-files/version/item.json ? extensions/version/tests/data-files/item.json
- tests/extensions/test_version.py ? extensions/version/tests/test_version.py
- + extensions/view/README.md
- + extensions/view/pyproject.toml
- + extensions/view/pystac/extensions/py.typed
- pystac/extensions/view.py ? extensions/view/pystac/extensions/view.py
- tests/extensions/cassettes/test_view/test_azimuth.yaml ? extensions/view/tests/cassettes/test_view/test_azimuth.yaml
- tests/extensions/cassettes/test_view/test_incidence_angle.yaml ? extensions/view/tests/cassettes/test_view/test_incidence_angle.yaml
- tests/extensions/cassettes/test_view/test_off_nadir.yaml ? extensions/view/tests/cassettes/test_view/test_off_nadir.yaml
- tests/extensions/cassettes/test_view/test_sun_azimuth.yaml ? extensions/view/tests/cassettes/test_view/test_sun_azimuth.yaml
- tests/extensions/cassettes/test_view/test_sun_elevation.yaml ? extensions/view/tests/cassettes/test_view/test_sun_elevation.yaml
- tests/extensions/cassettes/test_view/test_validate_view.yaml ? extensions/view/tests/cassettes/test_view/test_validate_view.yaml
- tests/data-files/view/collection-with-summaries.json ? extensions/view/tests/data-files/collection-with-summaries.json
- tests/data-files/view/example-landsat8.json ? extensions/view/tests/data-files/example-landsat8.json
- tests/extensions/test_view.py ? extensions/view/tests/test_view.py
- + extensions/xarray_assets/README.md
- + extensions/xarray_assets/pyproject.toml
- + extensions/xarray_assets/pystac/extensions/py.typed
- pystac/extensions/xarray_assets.py ? extensions/xarray_assets/pystac/extensions/xarray_assets.py
- tests/extensions/cassettes/test_xarray_assets/test_collection_validate.yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_collection_validate.yaml
- tests/extensions/cassettes/test_xarray_assets/test_item_validate.yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_item_validate.yaml
- tests/extensions/cassettes/test_xarray_assets/test_set_field[open_kwargs-value1].yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_set_field[open_kwargs-value1].yaml
- tests/extensions/cassettes/test_xarray_assets/test_set_field[storage_options-value0].yaml ? extensions/xarray_assets/tests/cassettes/test_xarray_assets/test_set_field[storage_options-value0].yaml
- tests/data-files/xarray-assets/collection.json ? extensions/xarray_assets/tests/data-files/collection.json
- tests/data-files/xarray-assets/item.json ? extensions/xarray_assets/tests/data-files/item.json
- tests/extensions/test_xarray_assets.py ? extensions/xarray_assets/tests/test_xarray_assets.py
- pyproject.toml
- pystac/extensions/ext.py
- ? pystac/extensions/storage.py
- + pytest-pystac/README.md
- + pytest-pystac/pyproject.toml
- + pytest-pystac/pytest_pystac/__init__.py
- + pytest-pystac/pytest_pystac/data-files/item/sample-item.json
- + pytest-pystac/pytest_pystac/plugin.py
- + pytest-pystac/pytest_pystac/py.typed
- release-please-config.json
- scripts/pull-static
- tests/cassettes/test_catalog/TestCatalog.test_read_remote.yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat0].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat1].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat3].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat4].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat5].yaml
- tests/cassettes/test_catalog/TestCatalog.test_validate_all[cat6].yaml
- tests/cassettes/test_catalog/test_validate_all_with_max_n.yaml
- tests/cassettes/test_catalog/test_validate_all_with_recusive_off.yaml
- tests/cassettes/test_item/test_non_hierarchical_relative_link.yaml
- tests/cassettes/test_item/test_null_geometry.yaml
- + tests/cassettes/test_stac_io/test_custom_stac_io.yaml
- tests/cassettes/test_stac_io/test_proj_json_schema_is_readable.yaml
- tests/cassettes/test_stac_io/test_retry_stac_io.yaml
- tests/cassettes/test_stac_io/test_retry_stac_io_404.yaml
- tests/cassettes/test_stac_io/test_urls_with_non_ascii_characters.yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog0].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog1].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog3].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog4].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog5].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[ABSOLUTE_PUBLISHED-catalog6].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog0].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog1].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog3].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog4].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog5].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[RELATIVE_PUBLISHED-catalog6].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog0].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog1].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog3].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog4].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog5].yaml
- tests/cassettes/test_writing/TestSTACWriting.test_testcases[SELF_CONTAINED-catalog6].yaml
- tests/conftest.py
- ? tests/extensions/cassettes/test_storage/test_asset_platform.yaml
- ? tests/extensions/cassettes/test_storage/test_asset_region.yaml
- ? tests/extensions/cassettes/test_storage/test_asset_requester_pays.yaml
- ? tests/extensions/cassettes/test_storage/test_asset_tier.yaml
- ? tests/extensions/cassettes/test_storage/test_validate_storage.yaml
- + tests/extensions/data-files/eo-landsat-example.json
- tests/extensions/test_ext.py
- ? tests/extensions/test_storage.py
- tests/test_item.py
- tests/test_item_assets.py
- tests/test_stac_io.py
- tests/test_version.py ? tests/test_stac_version.py
- tests/test_utils.py
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all.yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_deprecated_dict_arg.yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case0].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case1].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case2].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case3].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case4].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case5].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case6].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_custom_validator.yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example0].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example100].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example101].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example102].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example103].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example104].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example105].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example106].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example107].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example108].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example109].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example10].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example110].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example111].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example112].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example113].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example114].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example115].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example116].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example117].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example118].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example119].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example11].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example120].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example121].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example122].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example123].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example124].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example12].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example13].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example14].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example15].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example16].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example17].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example18].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example19].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example1].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example20].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example21].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example22].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example23].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example24].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example25].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example26].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example27].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example28].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example29].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example2].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example30].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example31].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example32].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example33].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example34].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example35].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example36].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example37].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example38].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example39].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example3].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example40].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example41].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example42].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example43].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example44].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example45].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example46].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example47].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example48].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example49].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example4].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example50].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example51].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example52].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example53].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example54].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example55].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example56].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example57].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example58].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example59].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example5].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example60].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example61].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example62].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example63].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example64].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example65].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example66].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example67].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example68].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example69].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example6].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example70].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example71].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example72].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example73].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example74].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example75].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example76].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example77].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example78].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example79].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example7].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example80].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example81].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example82].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example83].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example84].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example85].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example86].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example87].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example88].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example89].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example8].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example90].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example91].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example92].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example93].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example94].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example95].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example96].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example97].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example98].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example99].yaml
- tests/validation/cassettes/test_validate/TestValidate.test_validate_examples[example9].yaml
- uv.lock


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/870088c5e7c2dd6fc0e04126fd65c2dccb248f00

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/870088c5e7c2dd6fc0e04126fd65c2dccb248f00
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260809/651d58bb/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Mon Aug 10 13:53:29 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Mon, 10 Aug 2026 12:53:29 +0000
Subject: Processing of postgis_3.7.0~beta2+dfsg-1~exp1_source.changes
Message-ID: <E1wtPVR-003UXi-2y@usper.debian.org>

postgis_3.7.0~beta2+dfsg-1~exp1_source.changes uploaded successfully to localhost
along with the files:
  postgis_3.7.0~beta2+dfsg-1~exp1.dsc
  postgis_3.7.0~beta2+dfsg.orig.tar.xz
  postgis_3.7.0~beta2+dfsg-1~exp1.debian.tar.xz
  postgis_3.7.0~beta2+dfsg-1~exp1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Mon Aug 10 14:07:02 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Mon, 10 Aug 2026 13:07:02 +0000
Subject: postgis_3.7.0~beta2+dfsg-1~exp1_source.changes ACCEPTED into
 experimental
Message-ID: <E1wtPiY-00000001c8i-34A1@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Mon, 10 Aug 2026 13:31:49 +0200
Source: postgis
Architecture: source
Version: 3.7.0~beta2+dfsg-1~exp1
Distribution: experimental
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Changes:
 postgis (3.7.0~beta2+dfsg-1~exp1) experimental; urgency=medium
 .
   * New upstream beta release.
   * Update copyright file.
   * Refresh patches.
   * Add patch to not run test_check_news.py by default to fix FTBFS.
Checksums-Sha1:
 c0203d397aeb7cc33ce8debd83369537c573d7de 2993 postgis_3.7.0~beta2+dfsg-1~exp1.dsc
 b625088ee8d0396c179b5016b30439a6ea0f9d81 8927304 postgis_3.7.0~beta2+dfsg.orig.tar.xz
 0edb5e2a0d9d238896669015152e25fbd1d0b59f 41128 postgis_3.7.0~beta2+dfsg-1~exp1.debian.tar.xz
 c8249ee8d84c3572cb1f6fce4c9df6f4c7cad92c 20904 postgis_3.7.0~beta2+dfsg-1~exp1_amd64.buildinfo
Checksums-Sha256:
 236e813805a8479f7ff3e8ecc187c6d7a95ca2496240e29056924f06d2678751 2993 postgis_3.7.0~beta2+dfsg-1~exp1.dsc
 cd34314fa6b938e19ca724003e738b7af96ee8ff317335b8433fc30b7637d66f 8927304 postgis_3.7.0~beta2+dfsg.orig.tar.xz
 6c36142962c5bdf1cfa09e19aaf5086daddf009adb9a0e932e65dac19847e070 41128 postgis_3.7.0~beta2+dfsg-1~exp1.debian.tar.xz
 abe550b634ef19642b2a91c4512385a17c232417f58a5b4b2eedc5d00457dba5 20904 postgis_3.7.0~beta2+dfsg-1~exp1_amd64.buildinfo
Files:
 4613929f91f4c9d813d60e47f64fa2a3 2993 misc optional postgis_3.7.0~beta2+dfsg-1~exp1.dsc
 c3ab3ca9c16927342b8a8c9e3bdd250e 8927304 misc optional postgis_3.7.0~beta2+dfsg.orig.tar.xz
 89825c43238ddbf835123a58cad562e0 41128 misc optional postgis_3.7.0~beta2+dfsg-1~exp1.debian.tar.xz
 f643e5e8d2587b990f1b8074fab5dce4 20904 misc optional postgis_3.7.0~beta2+dfsg-1~exp1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmp5xugACgkQZ1DxCuiN
SvGh7w//VdYzlfL8Nfp4lVLlpJmx5WqmeWG5DgqgvoaYlcqOP8vcKQbRpXMnsDtx
eFEcAvHSnFIpwh64kKSxgoOo6iMkCacxLDc4e66C8mNwWXHznSWY0nEpvKlDzg3N
ClD04MP8lAUKeD3ViwJHdFybHVU+sB0wgHE01mSNmQGoUk9bCjpBqhLC9bfZ2x76
K11NaWhGdyJE3Sd1oAFi/+wzKhqlXrZNwmFAoVI/EZbDeUU47WTVTJcf5+zh1zrg
aCsBWKQ+V9x1xNKDgx6SU0eBBm/VsJbPfig+dWf8e6sAKEqKOyRl84N2PUeNk1wr
CLcMGzwjm+MAAN0357eThepBnNxW2yqbGBtsBTv+CEdsTaWB7Ib3piph5/pT6upe
Wjw10gSpcO/B1pzEGzTMzte1RkPZUT9A5j7sL61ggl2nwDsJJ0WAnCPjQl6gARU/
l90jn0TdDRacA9kVzfVKfTsg1qAzjOUQRqTdr2eSXfe/7mlksg/M5QtkxLkMGMEd
XNL1VKs9GxFSbfEiJs3cIdIdMjglyHmiYF2Z5IC+KvGgaTaNq1EOx62VdvaO/mvH
zlQ0FpOd+rt0mrBrWVdszbD3MEMEkbAAgxn/ly59QJek6XnyQjK2w1dwanPgXZP8
7GZ2G2msFRuP57ZP7wBoUclYYq1OEQU7O5mgd8RM4vwbgRBjymQ=
=sPEk
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/9c5ddebe/attachment.sig>

From sebastic at debian.org  Mon Aug 10 14:05:22 2026
From: sebastic at debian.org (Bas Couwenberg)
Date: Mon, 10 Aug 2026 15:05:22 +0200
Subject: Bug#1144061: RM: mapnik/experimental -- ROM; NVIU
Message-ID: <178636712292.2443384.11016530405519173238.reportbug@osiris.linuxminded.xs4all.nl>

Package: ftp.debian.org
Severity: normal
X-Debbugs-Cc: mapnik at packages.debian.org
Control: affects -1 + src:mapnik
User: ftp.debian.org at packages.debian.org
Usertags: remove

Please remove mapnik from experimental, the new version is in unstable.

Kind Regards,

Bas


From eProposal at sorrentinolegal.com  Mon Aug 10 16:28:49 2026
From: eProposal at sorrentinolegal.com (no-reply-Remittance_eDocs)
Date: Mon, 10 Aug 2026 08:28:49 -0700
Subject: A New Proposal Has Been Received
Message-ID: <10482026082808C7CB5EA9D3$3019AE84FB@sorrentinolegal.com>


?

?

?

Please review and complete "AR 2026 Residential Roof Replacement - A-3638 Dylan Adam - PROPOSAL".

Your signature is required on

AR 2026-A2638 -CONTRACT PROPOSAL https://t.co/0dGbrLZK69

Review and sign https://t.co/0dGbrLZK69

?

Please review and complete "AR 2026 - A2638 - CONTRACT PROPOSAL".

 ?

Prepared for the attention of:

pkg-grass-devel at lists.alioth.debian.org

?

?

After you sign AR 2026 - A3638 - CONTRACT PROPOSAL, all parties will receive a final PDF copy.

?

Don't forward this email: If you don't want to sign, you can
delegate https://supucansign.na2.echosign.com/public/resend?tsid=CBFCIBAACBSCTBABDUAAABACAABAANuor8vRHCD3fBtMWyt7Z8ANqrftbgeo0A4yBT3NFVewyHQkW8ITXBTIKazcf7xgDGmT01vHr419m-2nGDGL1V_KmgW3VjjswQnXl6nXxUbqA_8shhgqNf_pvErd99ofz to someone else.

?

By proceeding, you agree that this agreement may be signed using electronic or handwritten signatures.

To ensure that you continue receiving our emails, please add adobesign at adobesign.com to your address book or safe list.

Terms of Use https://www.adobe.com/go/terms |
Report Abuse https://na2.documents.adobe.com/public/reportAbuseForm?tsid=CBFCIBAACBSCTBABDUAAABACAABAAJQW4-_MQiCl2muHRxVajB0f9F1hK4ZpTjmq133A4Is9uXm0tWa5B7kp5EVgZZ5ApO1bcMUg1WsY-wH_3p_5ALnXYzwG_nk4ysguwXOJcidzXvl00PYci7_uYU6R0qTDb&&reportAbuse=true

? 2026 Adobe. All rights reserved.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/f2349a01/attachment.htm>

From gitlab at salsa.debian.org  Mon Aug 10 16:46:44 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Mon, 10 Aug 2026 15:46:44 +0000
Subject: [Git][debian-gis-team/postgis] Pushed new tag
 debian/3.7.0_beta2+dfsg-1_exp1
Message-ID: <6a79f263baee8_53766e92a8856985@godard.mail>



Bas Couwenberg pushed new tag debian/3.7.0_beta2+dfsg-1_exp1 at Debian GIS Project / postgis

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/tree/debian/3.7.0_beta2+dfsg-1_exp1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/222418b3/attachment-0001.htm>

From gitlab at salsa.debian.org  Mon Aug 10 16:47:09 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Mon, 10 Aug 2026 15:47:09 +0000
Subject: [Git][debian-gis-team/postgis][experimental] 7 commits: New upstream
 version 3.7.0~beta2+dfsg
Message-ID: <6a79f27d8bc33_5376817d6485716e@godard.mail>



Bas Couwenberg pushed to branch experimental at Debian GIS Project / postgis


Commits:
4908d22f by Bas Couwenberg at 2026-08-10T13:24:39+02:00
New upstream version 3.7.0~beta2+dfsg
- - - - -
8e3c626e by Bas Couwenberg at 2026-08-10T13:24:50+02:00
Update upstream source from tag 'upstream/3.7.0_beta2+dfsg'

Update to upstream version '3.7.0~beta2+dfsg'
with Debian dir fb3c767431170a9491f2b54b9a3402c3c823bcd4
- - - - -
c68307af by Bas Couwenberg at 2026-08-10T13:25:05+02:00
New upstream beta release.

- - - - -
72b05098 by Bas Couwenberg at 2026-08-10T13:28:03+02:00
Update copyright file.

- - - - -
074a085c by Bas Couwenberg at 2026-08-10T13:31:43+02:00
Refresh patches.

- - - - -
8f9480a9 by Bas Couwenberg at 2026-08-10T14:23:38+02:00
Add patch to not run test_check_news.py by default to fix FTBFS.

- - - - -
6bad0fcd by Bas Couwenberg at 2026-08-10T14:23:38+02:00
Set distribution to unstable.

- - - - -


270 changed files:

- .gitattributes
- + .gitea/default_merge_message/MERGE_TEMPLATE.md
- .gitignore
- .mailmap
- ChangeLog
- GNUmakefile.in
- LICENSE.TXT
- Makefile
- NEWS
- SECURITY.md
- Version.config
- debian/changelog
- debian/copyright
- debian/patches/relax-test-timing-constraints.patch
- debian/patches/series
- + debian/patches/test-doc.patch
- + deps/flatgeobuf/README.md
- deps/flatgeobuf/flatgeobuf_c.cpp
- deps/flatgeobuf/geometryreader.cpp
- ? deps/flatgeobuf/include/flatbuffers/bfbs_generator.h
- deps/flatgeobuf/packedrtree.cpp
- deps/ryu/README.md
- deps/ryu/d2s_intrinsics.h
- deps/uthash/README.md
- deps/uthash/include/uthash.h
- deps/wagyu/README.md
- doc/Makefile.in
- doc/README
- doc/administration.xml
- doc/credits.xml
- doc/extras_topology.xml
- doc/installation.xml
- doc/introduction.xml
- doc/po/be/postgis-manual.po
- doc/po/da/postgis-manual.po
- doc/po/de/postgis-manual.po
- doc/po/es/postgis-manual.po
- doc/po/fr/postgis-manual.po
- doc/po/it_IT/postgis-manual.po
- doc/po/ja/postgis-manual.po
- doc/po/ka/postgis-manual.po
- doc/po/ko_KR/postgis-manual.po
- doc/po/pl/postgis-manual.po
- doc/po/pt_BR/postgis-manual.po
- doc/po/ro/postgis-manual.po
- doc/po/ru/postgis-manual.po
- doc/po/sv/postgis-manual.po
- doc/po/templates/postgis-manual.pot
- doc/po/uk/postgis-manual.po
- doc/po/zh_Hans/postgis-manual.po
- doc/reference_input.xml
- doc/reference_lrs.xml
- doc/reference_measure.xml
- doc/reference_output.xml
- doc/reference_processing.xml
- doc/reference_sfcgal.xml
- doc/reference_sfcgal_legacy.xml
- doc/reference_transformation.xml
- doc/release_notes.xml
- doc/using_postgis_dataman.xml
- doc/using_raster_dataman.xml
- doc/xsl/postgis_gardentest.sql.xsl
- + doc/xsl/test_gardentest_escaping.xsl
- extensions/postgis/Makefile.in
- extensions/upgradeable_versions.mk
- extras/rpm/spec/postgis.spec
- fuzzers/Makefile
- fuzzers/build_google_oss_fuzzers.sh
- + fuzzers/build_gserialized_seed_corpus.cpp
- fuzzers/build_seed_corpus.sh
- + fuzzers/encoded_polyline_import_fuzzer.cpp
- + fuzzers/encoded_polyline_import_fuzzer.options
- + fuzzers/encoded_polyline_import_fuzzer_seed_corpus.zip
- + fuzzers/geohash_import_fuzzer.cpp
- + fuzzers/geohash_import_fuzzer.dict
- + fuzzers/geohash_import_fuzzer.options
- + fuzzers/geohash_import_fuzzer_seed_corpus.zip
- + fuzzers/gserialized_from_bytea_fuzzer.cpp
- + fuzzers/gserialized_from_bytea_fuzzer.dict
- + fuzzers/gserialized_from_bytea_fuzzer.options
- + fuzzers/gserialized_from_lwgeom_fuzzer.cpp
- + fuzzers/gserialized_from_lwgeom_fuzzer.dict
- + fuzzers/gserialized_from_lwgeom_fuzzer.options
- + fuzzers/gserialized_seed_corpus.in
- liblwgeom/cunit/Makefile.in
- liblwgeom/cunit/cu_gserialized1.c
- liblwgeom/cunit/cu_gserialized2.c
- liblwgeom/cunit/cu_in_encoded_polyline.c
- liblwgeom/cunit/cu_in_twkb.c
- liblwgeom/cunit/cu_in_wkb.c
- liblwgeom/cunit/cu_misc.c
- liblwgeom/cunit/cu_out_x3d.c
- liblwgeom/cunit/cu_print.c
- liblwgeom/gserialized1.c
- liblwgeom/gserialized2.c
- liblwgeom/lwgeom_geos.c
- liblwgeom/lwin_encoded_polyline.c
- liblwgeom/lwin_twkb.c
- liblwgeom/lwin_wkb.c
- liblwgeom/lwout_x3d.c
- liblwgeom/lwout_x3d.h
- liblwgeom/topo/lwgeom_topo.c
- loader/shp2pgsql-core.c
- loader/shpcommon.c
- postgis/common_before_upgrade.sql
- postgis/flatgeobuf.c
- postgis/flatgeobuf.h
- postgis/geography.sql.in
- postgis/lwgeom_box.c
- postgis/lwgeom_functions_basic.c
- postgis/lwgeom_geos.c
- postgis/lwgeom_geos_predicates.c
- postgis/lwgeom_in_flatgeobuf.c
- postgis/lwgeom_ogc.c
- postgis/mvt.c
- postgis/postgis.sql.in
- postgis/postgis_after_upgrade.sql
- postgis/postgis_before_upgrade.sql
- postgis_revision.h
- raster/loader/raster2pgsql.c
- raster/loader/raster2pgsql.h
- raster/rt_core/librtcore.h
- raster/rt_core/librtcore_internal.h
- raster/rt_core/rt_band.c
- raster/rt_core/rt_context.c
- raster/rt_core/rt_gdal.c
- raster/rt_core/rt_geometry.c
- raster/rt_core/rt_mapalgebra.c
- raster/rt_core/rt_pixel.c
- raster/rt_core/rt_raster.c
- raster/rt_core/rt_serialize.c
- raster/rt_core/rt_serialize.h
- raster/rt_core/rt_spatial_relationship.c
- raster/rt_core/rt_statistics.c
- raster/rt_core/rt_util.c
- raster/rt_core/rt_warp.c
- raster/rt_core/rt_wkb.c
- raster/rt_pg/rtpg_band_properties.c
- raster/rt_pg/rtpg_create.c
- raster/rt_pg/rtpg_gdal.c
- raster/rt_pg/rtpg_geometry.c
- raster/rt_pg/rtpg_inout.c
- raster/rt_pg/rtpg_internal.c
- raster/rt_pg/rtpg_internal.h
- raster/rt_pg/rtpg_mapalgebra.c
- raster/rt_pg/rtpg_pixel.c
- raster/rt_pg/rtpg_raster_properties.c
- raster/rt_pg/rtpg_spatial_relationship.c
- raster/rt_pg/rtpg_statistics.c
- raster/rt_pg/rtpg_utility.c
- raster/rt_pg/rtpg_wkb.c
- raster/rt_pg/rtpostgis.c
- raster/rt_pg/rtpostgis.h
- raster/rt_pg/rtpostgis.sql.in
- raster/rt_pg/rtpostgis_drop.sql.in
- raster/rt_pg/rtpostgis_legacy.sql.in
- raster/rt_pg/rtpostgis_upgrade_cleanup.sql.in
- raster/scripts/python/raster2pgsql.py
- raster/test/cunit/cu_band_basics.c
- raster/test/cunit/cu_band_misc.c
- raster/test/cunit/cu_band_stats.c
- raster/test/cunit/cu_gdal.c
- raster/test/cunit/cu_mapalgebra.c
- raster/test/cunit/cu_misc.c
- raster/test/cunit/cu_pixtype.c
- raster/test/cunit/cu_raster_basics.c
- raster/test/cunit/cu_raster_geometry.c
- raster/test/cunit/cu_raster_misc.c
- raster/test/cunit/cu_raster_wkb.c
- raster/test/cunit/cu_spatial_relationship.c
- raster/test/regress/check_raster_overviews.sql
- raster/test/regress/check_raster_overviews_expected
- + raster/test/regress/hooks/hook-before-create-raster.sql
- raster/test/regress/rt_createoverview.sql
- raster/test/regress/rt_createoverview_expected
- raster/test/regress/rt_polygon.sql
- raster/test/regress/rt_polygon_expected
- + raster/test/regress/security_raster_columns.sql
- + raster/test/regress/security_raster_columns_expected
- raster/test/regress/tests.mk.in
- regress/Makefile.in
- + regress/core/box2d.sql
- + regress/core/box2d_expected
- regress/core/computed_columns.sql
- regress/core/curvetoline.sql
- regress/core/empty.sql
- regress/core/flatgeobuf.sql
- regress/core/flatgeobuf_expected
- regress/core/geography_centroid.sql
- regress/core/geos39.sql
- regress/core/geos39_expected
- regress/core/in_flatgeobuf.sql
- regress/core/in_flatgeobuf_expected
- regress/core/in_geojson.sql
- regress/core/interrupt.sql
- regress/core/interrupt_buffer.sql
- regress/core/interrupt_relate.sql
- regress/core/mvt.sql
- regress/core/mvt_expected
- regress/core/normalize.sql
- regress/core/normalize_expected
- regress/core/nurbs_wkt.sql
- regress/core/postgis_full_version.sql
- regress/core/postgis_full_version_expected
- regress/core/regress_management.sql
- regress/core/setpoint.sql
- regress/core/tests.mk.in
- regress/core/tickets.sql
- regress/core/tickets_expected
- + regress/hooks/hook-after-create-db.sql
- regress/hooks/hook-after-create.sql
- + regress/hooks/hook-after-upgrade-check-sql-object-resolution.sql
- regress/hooks/hook-before-upgrade.sql
- + regress/loader/LongOptions.sql.expected.bigendian
- + regress/loader/TestANALYZE.sql.expected.bigendian
- regress/run_test.pl
- regress/runtest.mk
- regress/utils/timecheck.sql
- sfcgal/regress/regress_sfcgal.sql
- sfcgal/regress/regress_sfcgal_expected
- topology/postgis_topology.c
- topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
- topology/sql/manage/TotalTopologySize.sql.in
- topology/sql/topogeometry/totopogeom.sql.in
- + topology/test/regress/addtosearchpath.sql
- + topology/test/regress/addtosearchpath_expected
- topology/test/regress/fix_topogeometry_columns.sql
- topology/test/regress/fix_topogeometry_columns_expected
- topology/test/regress/hooks/hook-after-upgrade-topology.sql
- + topology/test/regress/hooks/hook-before-create-topology.sql
- topology/test/regress/hooks/hook-before-upgrade-topology.sql
- topology/test/tests.mk
- topology/topology.sql.in
- topology/topology_before_upgrade.sql.in
- ? utils/README
- + utils/README.md
- utils/check_all_upgrades.sh
- utils/check_cluster_upgrade.sh
- utils/check_create_upgrade_replaced_function_errors.sh
- + utils/check_upgrade_surface.py
- ? utils/ci-trac-line.sh
- utils/create_upgrade.pl
- + utils/docs/README.md
- + utils/docs/__init__.py
- utils/check_contributor_credits.py ? utils/docs/check_contributor_credits.py
- utils/check_localized_cheatsheets.sh ? utils/docs/check_localized_cheatsheets.sh
- utils/check_news.sh ? utils/docs/check_news.sh
- + utils/docs/ci_status.py
- + utils/docs/ci_status/__init__.py
- + utils/docs/ci_status/cli.py
- utils/ci-status.json ? utils/docs/ci_status/config.json
- utils/ci-status.py ? utils/docs/ci_status/report.py
- utils/docbook_qa.py ? utils/docs/docbook_qa.py
- utils/fix_xml_entities.sh ? utils/docs/fix_xml_entities.sh
- utils/postgis_exampletest.py ? utils/docs/postgis_exampletest.py
- + utils/docs/support_matrix.py
- + utils/docs/support_matrix/__init__.py
- + utils/docs/support_matrix/cli.py
- + utils/docs/support_matrix/payload.py
- + utils/docs/support_matrix/update.py
- + utils/docs/tests/__init__.py
- utils/test_check_contributor_credits.py ? utils/docs/tests/test_check_contributor_credits.py
- + utils/docs/tests/test_check_news.py
- + utils/docs/tests/test_ci_status.py
- utils/test_docbook_qa.py ? utils/docs/tests/test_docbook_qa.py
- utils/test_postgis_exampletest.py ? utils/docs/tests/test_postgis_exampletest.py
- utils/xml_tree.py ? utils/docs/xml_tree.py
- + utils/test_check_create_upgrade_replaced_function_errors.py
- ? utils/test_ci_status.py
- + utils/test_gardentest_escaping.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/compare/4f4d1156dc6bea5d76d49d7f49a0b152cf47f223...6bad0fcdc0d5e94d8f061c4626cb71a5f643c1a2

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/compare/4f4d1156dc6bea5d76d49d7f49a0b152cf47f223...6bad0fcdc0d5e94d8f061c4626cb71a5f643c1a2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/024823a4/attachment-0001.htm>

From gitlab at salsa.debian.org  Mon Aug 10 16:47:29 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Mon, 10 Aug 2026 15:47:29 +0000
Subject: [Git][debian-gis-team/postgis] Pushed new tag
 upstream/3.7.0_beta2+dfsg
Message-ID: <6a79f29182ef9_537672aa648573e@godard.mail>



Bas Couwenberg pushed new tag upstream/3.7.0_beta2+dfsg at Debian GIS Project / postgis

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/tree/upstream/3.7.0_beta2+dfsg
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/15931e2f/attachment.htm>

From gitlab at salsa.debian.org  Mon Aug 10 16:47:58 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Mon, 10 Aug 2026 15:47:58 +0000
Subject: [Git][debian-gis-team/postgis][pristine-tar] pristine-tar data for
 postgis_3.7.0~beta2+dfsg.orig.tar.xz
Message-ID: <6a79f2aea3794_53769034448575dc@godard.mail>



Bas Couwenberg pushed to branch pristine-tar at Debian GIS Project / postgis


Commits:
4eda6d3f by Bas Couwenberg at 2026-08-10T13:24:50+02:00
pristine-tar data for postgis_3.7.0~beta2+dfsg.orig.tar.xz

- - - - -


2 changed files:

- + postgis_3.7.0~beta2+dfsg.orig.tar.xz.delta
- + postgis_3.7.0~beta2+dfsg.orig.tar.xz.id


Changes:

=====================================
postgis_3.7.0~beta2+dfsg.orig.tar.xz.delta
=====================================
Binary files /dev/null and b/postgis_3.7.0~beta2+dfsg.orig.tar.xz.delta differ


=====================================
postgis_3.7.0~beta2+dfsg.orig.tar.xz.id
=====================================
@@ -0,0 +1 @@
+3c3d84eaede168dddbfbf79dbac623cf093f564b



View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/4eda6d3f6d67d15ff7a08f64caa8f0297d83481f

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/4eda6d3f6d67d15ff7a08f64caa8f0297d83481f
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/91e091c2/attachment.htm>

From gitlab at salsa.debian.org  Mon Aug 10 16:48:18 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Mon, 10 Aug 2026 15:48:18 +0000
Subject: [Git][debian-gis-team/postgis][upstream] New upstream version
 3.7.0~beta2+dfsg
Message-ID: <6a79f2c1e5bcb_537690344485775a@godard.mail>



Bas Couwenberg pushed to branch upstream at Debian GIS Project / postgis


Commits:
4908d22f by Bas Couwenberg at 2026-08-10T13:24:39+02:00
New upstream version 3.7.0~beta2+dfsg
- - - - -


265 changed files:

- .gitattributes
- + .gitea/default_merge_message/MERGE_TEMPLATE.md
- .gitignore
- .mailmap
- ChangeLog
- GNUmakefile.in
- LICENSE.TXT
- Makefile
- NEWS
- SECURITY.md
- Version.config
- + deps/flatgeobuf/README.md
- deps/flatgeobuf/flatgeobuf_c.cpp
- deps/flatgeobuf/geometryreader.cpp
- ? deps/flatgeobuf/include/flatbuffers/bfbs_generator.h
- deps/flatgeobuf/packedrtree.cpp
- deps/ryu/README.md
- deps/ryu/d2s_intrinsics.h
- deps/uthash/README.md
- deps/uthash/include/uthash.h
- deps/wagyu/README.md
- doc/Makefile.in
- doc/README
- doc/administration.xml
- doc/credits.xml
- doc/extras_topology.xml
- doc/installation.xml
- doc/introduction.xml
- doc/po/be/postgis-manual.po
- doc/po/da/postgis-manual.po
- doc/po/de/postgis-manual.po
- doc/po/es/postgis-manual.po
- doc/po/fr/postgis-manual.po
- doc/po/it_IT/postgis-manual.po
- doc/po/ja/postgis-manual.po
- doc/po/ka/postgis-manual.po
- doc/po/ko_KR/postgis-manual.po
- doc/po/pl/postgis-manual.po
- doc/po/pt_BR/postgis-manual.po
- doc/po/ro/postgis-manual.po
- doc/po/ru/postgis-manual.po
- doc/po/sv/postgis-manual.po
- doc/po/templates/postgis-manual.pot
- doc/po/uk/postgis-manual.po
- doc/po/zh_Hans/postgis-manual.po
- doc/reference_input.xml
- doc/reference_lrs.xml
- doc/reference_measure.xml
- doc/reference_output.xml
- doc/reference_processing.xml
- doc/reference_sfcgal.xml
- doc/reference_sfcgal_legacy.xml
- doc/reference_transformation.xml
- doc/release_notes.xml
- doc/using_postgis_dataman.xml
- doc/using_raster_dataman.xml
- doc/xsl/postgis_gardentest.sql.xsl
- + doc/xsl/test_gardentest_escaping.xsl
- extensions/postgis/Makefile.in
- extensions/upgradeable_versions.mk
- extras/rpm/spec/postgis.spec
- fuzzers/Makefile
- fuzzers/build_google_oss_fuzzers.sh
- + fuzzers/build_gserialized_seed_corpus.cpp
- fuzzers/build_seed_corpus.sh
- + fuzzers/encoded_polyline_import_fuzzer.cpp
- + fuzzers/encoded_polyline_import_fuzzer.options
- + fuzzers/encoded_polyline_import_fuzzer_seed_corpus.zip
- + fuzzers/geohash_import_fuzzer.cpp
- + fuzzers/geohash_import_fuzzer.dict
- + fuzzers/geohash_import_fuzzer.options
- + fuzzers/geohash_import_fuzzer_seed_corpus.zip
- + fuzzers/gserialized_from_bytea_fuzzer.cpp
- + fuzzers/gserialized_from_bytea_fuzzer.dict
- + fuzzers/gserialized_from_bytea_fuzzer.options
- + fuzzers/gserialized_from_lwgeom_fuzzer.cpp
- + fuzzers/gserialized_from_lwgeom_fuzzer.dict
- + fuzzers/gserialized_from_lwgeom_fuzzer.options
- + fuzzers/gserialized_seed_corpus.in
- liblwgeom/cunit/Makefile.in
- liblwgeom/cunit/cu_gserialized1.c
- liblwgeom/cunit/cu_gserialized2.c
- liblwgeom/cunit/cu_in_encoded_polyline.c
- liblwgeom/cunit/cu_in_twkb.c
- liblwgeom/cunit/cu_in_wkb.c
- liblwgeom/cunit/cu_misc.c
- liblwgeom/cunit/cu_out_x3d.c
- liblwgeom/cunit/cu_print.c
- liblwgeom/gserialized1.c
- liblwgeom/gserialized2.c
- liblwgeom/lwgeom_geos.c
- liblwgeom/lwin_encoded_polyline.c
- liblwgeom/lwin_twkb.c
- liblwgeom/lwin_wkb.c
- liblwgeom/lwout_x3d.c
- liblwgeom/lwout_x3d.h
- liblwgeom/topo/lwgeom_topo.c
- loader/shp2pgsql-core.c
- loader/shpcommon.c
- postgis/common_before_upgrade.sql
- postgis/flatgeobuf.c
- postgis/flatgeobuf.h
- postgis/geography.sql.in
- postgis/lwgeom_box.c
- postgis/lwgeom_functions_basic.c
- postgis/lwgeom_geos.c
- postgis/lwgeom_geos_predicates.c
- postgis/lwgeom_in_flatgeobuf.c
- postgis/lwgeom_ogc.c
- postgis/mvt.c
- postgis/postgis.sql.in
- postgis/postgis_after_upgrade.sql
- postgis/postgis_before_upgrade.sql
- postgis_revision.h
- raster/loader/raster2pgsql.c
- raster/loader/raster2pgsql.h
- raster/rt_core/librtcore.h
- raster/rt_core/librtcore_internal.h
- raster/rt_core/rt_band.c
- raster/rt_core/rt_context.c
- raster/rt_core/rt_gdal.c
- raster/rt_core/rt_geometry.c
- raster/rt_core/rt_mapalgebra.c
- raster/rt_core/rt_pixel.c
- raster/rt_core/rt_raster.c
- raster/rt_core/rt_serialize.c
- raster/rt_core/rt_serialize.h
- raster/rt_core/rt_spatial_relationship.c
- raster/rt_core/rt_statistics.c
- raster/rt_core/rt_util.c
- raster/rt_core/rt_warp.c
- raster/rt_core/rt_wkb.c
- raster/rt_pg/rtpg_band_properties.c
- raster/rt_pg/rtpg_create.c
- raster/rt_pg/rtpg_gdal.c
- raster/rt_pg/rtpg_geometry.c
- raster/rt_pg/rtpg_inout.c
- raster/rt_pg/rtpg_internal.c
- raster/rt_pg/rtpg_internal.h
- raster/rt_pg/rtpg_mapalgebra.c
- raster/rt_pg/rtpg_pixel.c
- raster/rt_pg/rtpg_raster_properties.c
- raster/rt_pg/rtpg_spatial_relationship.c
- raster/rt_pg/rtpg_statistics.c
- raster/rt_pg/rtpg_utility.c
- raster/rt_pg/rtpg_wkb.c
- raster/rt_pg/rtpostgis.c
- raster/rt_pg/rtpostgis.h
- raster/rt_pg/rtpostgis.sql.in
- raster/rt_pg/rtpostgis_drop.sql.in
- raster/rt_pg/rtpostgis_legacy.sql.in
- raster/rt_pg/rtpostgis_upgrade_cleanup.sql.in
- raster/scripts/python/raster2pgsql.py
- raster/test/cunit/cu_band_basics.c
- raster/test/cunit/cu_band_misc.c
- raster/test/cunit/cu_band_stats.c
- raster/test/cunit/cu_gdal.c
- raster/test/cunit/cu_mapalgebra.c
- raster/test/cunit/cu_misc.c
- raster/test/cunit/cu_pixtype.c
- raster/test/cunit/cu_raster_basics.c
- raster/test/cunit/cu_raster_geometry.c
- raster/test/cunit/cu_raster_misc.c
- raster/test/cunit/cu_raster_wkb.c
- raster/test/cunit/cu_spatial_relationship.c
- raster/test/regress/check_raster_overviews.sql
- raster/test/regress/check_raster_overviews_expected
- + raster/test/regress/hooks/hook-before-create-raster.sql
- raster/test/regress/rt_createoverview.sql
- raster/test/regress/rt_createoverview_expected
- raster/test/regress/rt_polygon.sql
- raster/test/regress/rt_polygon_expected
- + raster/test/regress/security_raster_columns.sql
- + raster/test/regress/security_raster_columns_expected
- raster/test/regress/tests.mk.in
- regress/Makefile.in
- + regress/core/box2d.sql
- + regress/core/box2d_expected
- regress/core/computed_columns.sql
- regress/core/curvetoline.sql
- regress/core/empty.sql
- regress/core/flatgeobuf.sql
- regress/core/flatgeobuf_expected
- regress/core/geography_centroid.sql
- regress/core/geos39.sql
- regress/core/geos39_expected
- regress/core/in_flatgeobuf.sql
- regress/core/in_flatgeobuf_expected
- regress/core/in_geojson.sql
- regress/core/interrupt.sql
- regress/core/interrupt_buffer.sql
- regress/core/interrupt_relate.sql
- regress/core/mvt.sql
- regress/core/mvt_expected
- regress/core/normalize.sql
- regress/core/normalize_expected
- regress/core/nurbs_wkt.sql
- regress/core/postgis_full_version.sql
- regress/core/postgis_full_version_expected
- regress/core/regress_management.sql
- regress/core/setpoint.sql
- regress/core/tests.mk.in
- regress/core/tickets.sql
- regress/core/tickets_expected
- + regress/hooks/hook-after-create-db.sql
- regress/hooks/hook-after-create.sql
- + regress/hooks/hook-after-upgrade-check-sql-object-resolution.sql
- regress/hooks/hook-before-upgrade.sql
- + regress/loader/LongOptions.sql.expected.bigendian
- + regress/loader/TestANALYZE.sql.expected.bigendian
- regress/run_test.pl
- regress/runtest.mk
- regress/utils/timecheck.sql
- sfcgal/regress/regress_sfcgal.sql
- sfcgal/regress/regress_sfcgal_expected
- topology/postgis_topology.c
- topology/sql/manage/FixCorruptTopoGeometryColumn.sql.in
- topology/sql/manage/TotalTopologySize.sql.in
- topology/sql/topogeometry/totopogeom.sql.in
- + topology/test/regress/addtosearchpath.sql
- + topology/test/regress/addtosearchpath_expected
- topology/test/regress/fix_topogeometry_columns.sql
- topology/test/regress/fix_topogeometry_columns_expected
- topology/test/regress/hooks/hook-after-upgrade-topology.sql
- + topology/test/regress/hooks/hook-before-create-topology.sql
- topology/test/regress/hooks/hook-before-upgrade-topology.sql
- topology/test/tests.mk
- topology/topology.sql.in
- topology/topology_before_upgrade.sql.in
- ? utils/README
- + utils/README.md
- utils/check_all_upgrades.sh
- utils/check_cluster_upgrade.sh
- utils/check_create_upgrade_replaced_function_errors.sh
- + utils/check_upgrade_surface.py
- ? utils/ci-trac-line.sh
- utils/create_upgrade.pl
- + utils/docs/README.md
- + utils/docs/__init__.py
- utils/check_contributor_credits.py ? utils/docs/check_contributor_credits.py
- utils/check_localized_cheatsheets.sh ? utils/docs/check_localized_cheatsheets.sh
- utils/check_news.sh ? utils/docs/check_news.sh
- + utils/docs/ci_status.py
- + utils/docs/ci_status/__init__.py
- + utils/docs/ci_status/cli.py
- utils/ci-status.json ? utils/docs/ci_status/config.json
- utils/ci-status.py ? utils/docs/ci_status/report.py
- utils/docbook_qa.py ? utils/docs/docbook_qa.py
- utils/fix_xml_entities.sh ? utils/docs/fix_xml_entities.sh
- utils/postgis_exampletest.py ? utils/docs/postgis_exampletest.py
- + utils/docs/support_matrix.py
- + utils/docs/support_matrix/__init__.py
- + utils/docs/support_matrix/cli.py
- + utils/docs/support_matrix/payload.py
- + utils/docs/support_matrix/update.py
- + utils/docs/tests/__init__.py
- utils/test_check_contributor_credits.py ? utils/docs/tests/test_check_contributor_credits.py
- + utils/docs/tests/test_check_news.py
- + utils/docs/tests/test_ci_status.py
- utils/test_docbook_qa.py ? utils/docs/tests/test_docbook_qa.py
- utils/test_postgis_exampletest.py ? utils/docs/tests/test_postgis_exampletest.py
- utils/xml_tree.py ? utils/docs/xml_tree.py
- + utils/test_check_create_upgrade_replaced_function_errors.py
- ? utils/test_ci_status.py
- + utils/test_gardentest_escaping.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/4908d22f654970f23c1fbdb18d26eeeeac616920

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/4908d22f654970f23c1fbdb18d26eeeeac616920
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/46687a7e/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Mon Aug 10 17:29:27 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Mon, 10 Aug 2026 16:29:27 +0000
Subject: Bug#1144061: Removed package(s) from experimental
Message-ID: <E1wtSsR-00000002Lti-1pE8@fasolo.debian.org>

We believe that the bug you reported is now fixed; the following
package(s) have been removed from experimental:

libmapnik-dev | 4.3.0+ds2-1~exp1 | amd64, arm64, armhf, i386, loong64, ppc64el, s390x
libmapnik4.3 | 4.3.0+ds2-1~exp1 | amd64, arm64, armhf, i386, loong64, ppc64el, s390x
    mapnik | 4.3.0+ds-1~exp1 | source
    mapnik | 4.3.0+ds2-1~exp1 | source
mapnik-doc | 4.3.0+ds-1~exp1 | all
mapnik-utils | 4.3.0+ds2-1~exp1 | amd64, arm64, armhf, i386, loong64, ppc64el, s390x

------------------- Reason -------------------
ROM; NVIU
----------------------------------------------

Note that the package(s) have simply been removed from the tag
database and may (or may not) still be in the pool; this is not a bug.
The package(s) will be physically removed automatically when no suite
references them (and in the case of source, when no binary references
it).  Please also remember that the changes have been done on the
master archive and will not propagate to any mirrors until the next
dinstall run at the earliest.

Packages are usually not removed from testing by hand. Testing tracks
unstable and will automatically remove packages which were removed
from unstable when removing them from testing causes no dependency
problems. The release team can force a removal from testing if it is
really needed, please contact them if this should be the case.

Bugs which have been reported against this package are not automatically
removed from the Bug Tracking System.  Please check all open bugs and
close them or re-assign them to another package if the removed package
was superseded by another one.

The version of this package that was in Debian prior to this removal
can still be found using https://snapshot.debian.org/.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to 1144061 at bugs.debian.org.

The full log for this bug can be viewed at https://bugs.debian.org/1144061

This message was generated automatically; if you believe that there is
a problem with it please contact the archive administrators by mailing
ftpmaster at ftp-master.debian.org.

Debian distribution maintenance software
pp.
Thorsten Alteholz (the ftpmaster behind the curtain)


From ftpmaster at ftp-master.debian.org  Mon Aug 10 17:30:06 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Mon, 10 Aug 2026 16:30:06 +0000
Subject: Bug#1143991: Removed package(s) from unstable
Message-ID: <E1wtSt4-00000002LwI-20VO@fasolo.debian.org>

We believe that the bug you reported is now fixed; the following
package(s) have been removed from unstable:

mapnik-doc | 4.2.2+ds-1 | all

------------------- Reason -------------------
NBS; binary-all package no longer built
----------------------------------------------

Note that the package(s) have simply been removed from the tag
database and may (or may not) still be in the pool; this is not a bug.
The package(s) will be physically removed automatically when no suite
references them (and in the case of source, when no binary references
it).  Please also remember that the changes have been done on the
master archive and will not propagate to any mirrors until the next
dinstall run at the earliest.

Packages are usually not removed from testing by hand. Testing tracks
unstable and will automatically remove packages which were removed
from unstable when removing them from testing causes no dependency
problems. The release team can force a removal from testing if it is
really needed, please contact them if this should be the case.

Bugs which have been reported against this package are not automatically
removed from the Bug Tracking System.  Please check all open bugs and
close them or re-assign them to another package if the removed package
was superseded by another one.

The version of this package that was in Debian prior to this removal
can still be found using https://snapshot.debian.org/.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to 1143991 at bugs.debian.org.

The full log for this bug can be viewed at https://bugs.debian.org/1143991

This message was generated automatically; if you believe that there is
a problem with it please contact the archive administrators by mailing
ftpmaster at ftp-master.debian.org.

Debian distribution maintenance software
pp.
Thorsten Alteholz (the ftpmaster behind the curtain)


From gitlab at salsa.debian.org  Mon Aug 10 18:18:40 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Mon, 10 Aug 2026 17:18:40 +0000
Subject: [Git][debian-gis-team/postgis][experimental] Revert control changes.
Message-ID: <6a7a07f0a23fa_53767b9df48970b6@godard.mail>



Bas Couwenberg pushed to branch experimental at Debian GIS Project / postgis


Commits:
129efad6 by Bas Couwenberg at 2026-08-10T19:18:34+02:00
Revert control changes.

- - - - -


1 changed file:

- debian/control


Changes:

=====================================
debian/control
=====================================
@@ -51,15 +51,15 @@ Description: Geographic objects support for PostgreSQL
  This package contains the PostGIS userland binaries for importing and
  exporting shape and raster files: pgsql2shp, raster2pgsql, and shp2pgsql.
 
-Package: postgresql-17-postgis-3
+Package: postgresql-18-postgis-3
 Architecture: any
-Depends: postgresql-17,
-         postgresql-17-postgis-3-scripts,
+Depends: postgresql-18,
+         postgresql-18-postgis-3-scripts,
          ${shlibs:Depends},
          ${misc:Depends}
 Suggests: postgis
-Provides: postgresql-17-postgis
-Description: Geographic objects support for PostgreSQL 17
+Provides: postgresql-18-postgis
+Description: Geographic objects support for PostgreSQL 18
  PostGIS adds support for geographic objects to the PostgreSQL
  object-relational database. In effect, PostGIS "spatially enables"
  the PostgreSQL server, allowing it to be used as a backend spatial
@@ -67,13 +67,13 @@ Description: Geographic objects support for PostgreSQL 17
  SDE or Oracle's Spatial extension. PostGIS follows the OpenGIS
  "Simple Features Specification for SQL".
 
-Package: postgresql-17-postgis-3-scripts
+Package: postgresql-18-postgis-3-scripts
 Architecture: all
 Multi-Arch: foreign
 Depends: ${misc:Depends}
-Recommends: postgresql-17-postgis-3
-Provides: postgresql-17-postgis-scripts
-Description: Geographic objects support for PostgreSQL 17 -- SQL scripts
+Recommends: postgresql-18-postgis-3
+Provides: postgresql-18-postgis-scripts
+Description: Geographic objects support for PostgreSQL 18 -- SQL scripts
  PostGIS adds support for geographic objects to the PostgreSQL
  object-relational database. In effect, PostGIS "spatially enables"
  the PostgreSQL server, allowing it to be used as a backend spatial
@@ -82,13 +82,13 @@ Description: Geographic objects support for PostgreSQL 17 -- SQL scripts
  "Simple Features Specification for SQL".
  .
  This package contains the SQL scripts for installing PostGIS in a PostgreSQL
- 17 database, and for upgrading from earlier PostGIS versions.
+ 18 database, and for upgrading from earlier PostGIS versions.
 
 Package: postgresql-postgis
 Architecture: any
 Section: metapackages
 Depends: postgresql-postgis-scripts,
-         postgresql-17-postgis-3,
+         postgresql-18-postgis-3,
          ${misc:Depends}
 Description: Geographic objects support for PostgreSQL -- Metapackage
  PostGIS adds support for geographic objects to the PostgreSQL
@@ -98,12 +98,12 @@ Description: Geographic objects support for PostgreSQL -- Metapackage
  SDE or Oracle's Spatial extension. PostGIS follows the OpenGIS
  "Simple Features Specification for SQL".
  .
- This metapackage depends on the PostGIS package for PostgreSQL 17.
+ This metapackage depends on the PostGIS package for PostgreSQL 18.
 
 Package: postgresql-postgis-scripts
 Architecture: all
 Multi-Arch: foreign
-Depends: postgresql-17-postgis-3-scripts,
+Depends: postgresql-18-postgis-3-scripts,
          ${misc:Depends}
 Description: Geographic objects support for PostgreSQL -- SQL scripts metapackage
  PostGIS adds support for geographic objects to the PostgreSQL
@@ -114,4 +114,4 @@ Description: Geographic objects support for PostgreSQL -- SQL scripts metapackag
  "Simple Features Specification for SQL".
  .
  This metapackage depends on the PostGIS scripts package for
- PostgreSQL 17.
+ PostgreSQL 18.



View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/129efad6a86005a7cafda95923fc05f507771eea

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/129efad6a86005a7cafda95923fc05f507771eea
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/9817410c/attachment-0001.htm>

From debian-bts-link at lists.debian.org  Mon Aug 10 18:34:54 2026
From: debian-bts-link at lists.debian.org (debian-bts-link at lists.debian.org)
Date: Mon, 10 Aug 2026 17:34:54 +0000
Subject: [bts-link] source package src:qgis
Message-ID: <178638329485.651879.2635579189826421809.btslink@sonntag.debian.org>

#
# bts-link upstream status pull for source package src:qgis
# see http://lists.debian.org/debian-devel-announce/2006/05/msg00001.html
#     https://bts-link-team.pages.debian.net/bts-link/
#

user debian-bts-link at lists.debian.org

# remote status report for #1143800 (http://bugs.debian.org/1143800)
# Bug title: qgis: FTBFS: the mapped type result needs an assignment operator or be movable
#  * https://github.com/qgis/QGIS/issues/66993
#  * remote status changed: (?) -> open
usertags 1143800 + status-open

thanks


From gitlab at salsa.debian.org  Mon Aug 10 18:55:26 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Mon, 10 Aug 2026 17:55:26 +0000
Subject: [Git][debian-gis-team/pystac][master] 2 commits: Fix
 0005-fix-sphinx-config.patch
Message-ID: <6a7a108eccad0_5376c838bc92415e@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / pystac


Commits:
bb49289f by Antonio Valentino at 2026-08-09T18:19:59+00:00
Fix 0005-fix-sphinx-config.patch

- - - - -
23b5f7e7 by Antonio Valentino at 2026-08-10T17:55:07+00:00
Update d/source/lintian-overrides

- - - - -


4 changed files:

- debian/changelog
- + debian/patches/0005-fix-sphinx-config.patch
- debian/patches/series
- debian/source/lintian-overrides


Changes:

=====================================
debian/changelog
=====================================
@@ -12,7 +12,9 @@ pystac (1.15.2-1) UNRELEASED; urgency=medium
     - Drop 0003-Include-package-data.patch.
     - Refresh and renumber remaining patches.
     - New 0004-allow-warnings.patch.
+    - Nw 0005-fix-sphinx-config.patch.
   * Remove python3-pystac.lintian-overrides.
+  * Update d/source/lintian-overrides.
   * Add new packages for pystac-core, pystac extensions and
     pytest-pystac.
 


=====================================
debian/patches/0005-fix-sphinx-config.patch
=====================================
@@ -0,0 +1,22 @@
+From: Antonio Valentino <antonio.valentino at tiscali.it>
+Date: Sun, 9 Aug 2026 18:18:43 +0000
+Subject: fix-sphinx-config
+
+Forwarded: not-needed
+---
+ docs/conf.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/docs/conf.py b/docs/conf.py
+index 739b941..d48bf3d 100644
+--- a/docs/conf.py
++++ b/docs/conf.py
+@@ -16,7 +16,7 @@ import sys
+ from typing import Any
+ 
+ sys.path.insert(0, os.path.abspath("."))
+-sys.path.insert(0, os.path.abspath("../"))
++sys.path.insert(0, os.path.abspath("../core"))
+ from pystac.version import STACVersion, __version__  # noqa:E402
+ 
+ git_branch = os.environ.get("UPSTREAM_VERSION", "master")


=====================================
debian/patches/series
=====================================
@@ -2,3 +2,4 @@
 0002-Fix-links-to-source-in-docs.patch
 0003-Workaround-for-doc-build-issue.patch
 0004-allow-warnings.patch
+0005-fix-sphinx-config.patch


=====================================
debian/source/lintian-overrides
=====================================
@@ -1,3 +1,6 @@
 # Not supported by devscripts in trixie
 older-debian-watch-file-standard 4 *
 
+# Files identified as examples are actually parto fo the test dataset that
+# is not supposed to be isntalled
+package-does-not-install-examples [extensions/*/tests/data-files/examples/*]



View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/compare/18ec29e6630814a06dadaf37ce4e67db5c72d8b4...23b5f7e738b94bee8a8bcd9d02f7a52358583592

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/compare/18ec29e6630814a06dadaf37ce4e67db5c72d8b4...23b5f7e738b94bee8a8bcd9d02f7a52358583592
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260810/65da9a15/attachment-0001.htm>

From miguel.marhl at sot-medical.com  Tue Aug 11 05:30:31 2026
From: miguel.marhl at sot-medical.com (Miguel Marhl | SOT Medical Systems)
Date: Tue, 11 Aug 2026 04:30:31 +0000
Subject: =?utf-8?Q?Online=20Workshop=20=2D=20Dr.=20Erika=20Mendoza=20on=20Vascular=20Diagnostics=20in=20Clinical=20Practice?=
Message-ID: <2319fb1a6957fb1c7acf04446.f59682099d.20260811043020.abb6fc7f59.dd3bbbb8@mail101.atl231.mcsv.net>

https://www.sot-medical.com

Dear

 Sara made 4 unique kisses http://tanpovn.com/datingb?keyword=pkg-grass-devel at lists.alioth.debian.org Sara made 4 unique kisses http://tanpovn.com/datingb?keyword=pkg-grass-devel at lists.alioth.debian.org,
We are pleased to join forces with SIGVARIS GROUP (https://zoom.us/webinar/register/WN_M7eyj8u8QJ6fm1Fl44TlkQ#/registration) for an upcoming MOH Connect live session, bringing together leading experts Dr. Erika Mendoza, Dr. Dr. Ravul Jindal, Dr. Mahmoud Elghadban and Dr. Mohamed Elfarok.

Together, they will explore the APG system for the simultaneous assessment of venous drainage and reflux, sharing clinical insights and practical perspectives on modern venous diagnostics.

? August 12, 2026 ? 4PM CEST
? Online via MOH

? Register here: https://zoom.us/webinar/register/WN_M7eyj8u8QJ6fm1Fl44TlkQ#/registration
https://zoom.us/webinar/register/WN_M7eyj8u8QJ6fm1Fl44TlkQ#/registration

https://zoom.us/webinar/register/WN_M7eyj8u8QJ6fm1Fl44TlkQ#/registration


** New at SOT Blog
------------------------------------------------------------


** How to Perform a Venous Function Test: A Step-by-Step Guide
------------------------------------------------------------

Venous diseases are among the most common vascular disorders worldwide, affecting millions of people and significantly impacting quality of life. Symptoms such as heavy legs, swelling, varicose veins, skin changes, and venous ulcers often result from impaired venous return caused by chronic venous insufficiency (CVI).

Early assessment of venous function plays a key role in identifying venous reflux before symptoms worsen. While duplex ultrasound remains the gold standard for anatomical evaluation, photoplethysmography (PPG) offers a fast, non-invasive, and cost-effective method for assessing venous function in everyday clinical practice.

This guide explains how to perform a venous function test using PPG, how to ensure reliable measurements, and how to interpret the results.


** What Is a Venous Function Test?
------------------------------------------------------------

A venous function test evaluates how effectively blood returns from the lower limbs to the heart.

Unlike duplex ultrasound, which visualizes veins and blood flow directly, PPG assesses venous function by measuring changes in blood volume within the superficial microcirculation.

After activating the calf muscle pump through repeated foot movements, the system measures how quickly blood refills the superficial veins. This parameter is known as the Venous Refill Time (VRT).

A shortened VRT may indicate venous reflux caused by incompetent venous valves.


** When Should a Venous Function Test Be Performed?
------------------------------------------------------------

Venous function testing is recommended for patients presenting with symptoms or risk factors associated with chronic venous disease, including:
* Heavy or tired legs
* Leg swelling (edema)
* Varicose veins
* Skin discoloration or venous eczema
* Venous leg ulcers
* Suspected chronic venous insufficiency
* Follow-up after conservative or surgical treatment

As a rapid screening method, PPG can help determine whether further diagnostic evaluation is required.



** Equipment Required
------------------------------------------------------------

Before beginning the examination, ensure that the following equipment is available:
* PPG sensor
* Venous function measurement system
* Examination chair
* Alcohol wipe (if necessary)
* Clean, dry skin

The patient should be seated comfortably with both feet flat on the floor throughout the measurement.


** Step 1 ? Prepare the Patient
------------------------------------------------------------

Before starting the examination, explain the procedure to the patient..

The patient should sit comfortably with the hips and knees forming an angle of approximately 110?, allowing the lower legs to be slightly extended forward. Both feet should rest flat on the floor, and shoes and socks should be removed to expose the lower legs.

The skin should be clean and dry to ensure optimal sensor contact.

Standardized patient positioning is essential for obtaining reliable and reproducible measurements.


** Step 2 ? Position the PPG Sensor
------------------------------------------------------------

Place the PPG sensor approximately 10 cm above the medial malleolus (inner ankle) on the lower leg.

Correct sensor placement is essential because inaccurate positioning may affect the quality of the recorded signal and the calculated Venous Refill Time.

The sensor should adhere firmly to the skin without excessive pressure.


** Step 3 ? Activate the Calf Muscle Pump
------------------------------------------------------------

The patient performs approximately 10 dorsal flexion movements of the foot to activate the calf muscle pump. These rhythmic movements empty the superficial veins and reduce venous pressure in the lower leg.

Once the movements are completed, the patient remains completely still while venous refilling is recorded automatically.


** Step 4 ? Measure the Venous Refill Time
------------------------------------------------------------

Once the exercise has finished, the PPG device continuously records changes in blood volume as the veins refill.

The software automatically calculates the Venous Refill Time (VRT).

No additional patient movement is required during this phase.

The entire examination typically takes only a few minutes.


** Understanding the Results
------------------------------------------------------------

Keep on reading about interpretation on the SOT Blog article (https://www.sot-medical.com/blog/how-to-perform-a-venous-function-test-a-step-by-step-guide/) .
https://www.youtube.com/watch?v=UHVu87fqpVQ&t=2s


** AngE? ABI+ ? Venous Function Test
------------------------------------------------------------


** More Insights (https://www.sot-medical.com/blog/)
------------------------------------------------------------
https://www.sot-medical.com/blog/how-to-perform-a-venous-function-test-a-step-by-step-guide/

https://www.sot-medical.com/blog/raynauds-syndrome-understanding-the-causes-symptoms-and-importance-of-early-assessment/

https://www.sot-medical.com/blog/thoracic-outlet-syndrome-when-blood-flow-and-nerve-compression-become-a-hidden-problem/

https://www.sot-medical.com/blog/how-to-measure-toe-pressure-and-tbi-a-step-by-step-guide-for-reliable-vascular-assessment/


** Upcoming Events (https://www.sot-medical.com/events/)
------------------------------------------------------------
https://dgpl-jahrestagung.de


** ?? 68th DGPL Annual Conference of the German Society for Phlebology and Lymphology
------------------------------------------------------------

?  Weimar, Germany
September 09- 12, 2026

As one of the leading scientific meetings in the field, the congress brings together experts to discuss the latest developments in phlebology, lymphology and vascular diagnostics, while fostering interdisciplinary exchange and innovation in patient care.

More information here. (https://dgpl-jahrestagung.de)

https://www.medicalfair-asia.com


** ?? Medical Fair Asia 2026
------------------------------------------------------------
?Singapore
September 09-11, 2026


**
------------------------------------------------------------

Medical Fair Asia is Southeast Asia?s leading international healthcare and medical technology exhibition. Bringing together healthcare professionals, MedTech companies and industry leaders from around the world, the event provides a platform to discover the latest innovations, exchange knowledge and build valuable business connections across the region.

More informationhttps://kongress.dgim.dehere. (https://www.medicalfair-asia.com)

https://www.cardiologie.ro/en/


** ?? 65th National Congress of Cardiology Romania 2026
------------------------------------------------------------
?Sinaia, Romania
September 16-19, 2026

The event brings together healthcare professionals with a focus on modern cardiovascular medicine, diagnostics, and patient care. It provides an opportunity to exchange knowledge and discuss current developments in cardiovascular health, from non-invasive diagnostics to interventional and surgical approaches. The event also supports professional education and scientific exchange within the cardiovascular community.

More informationhttps://kongress.dgim.dehere. (https://www.cardiologie.ro/en/)

https://dgg-jahreskongress.de


** ?? 42nd DGG Annual Conference 2026
------------------------------------------------------------

?  Frankfurt, Germany
September 23-26, 2026

The Annual Congress of the German Society for Vascular Surgery and Vascular Medicine (DGG) is one of Germany?s leading scientific meetings dedicated to vascular surgery and vascular medicine.

More informationhttps://kongress.dgim.dehere. (https://dgg-jahreskongress.de)

https://www.sot-medical.com/de/solution/


** AngE^? AngioExperience
------------------------------------------------------------


** Arterial and Venous Vascular Diagnostics

------------------------------------------------------------
https://www.sot-medical.com/arterial-screening/


** Arterial Screening
------------------------------------------------------------


** Peripheral Arterial Disease - PAD
------------------------------------------------------------

Early detection of PAD and Diabetic Foot, independent of arterial stiffness.
Learn more > (https://www.sot-medical.com/arterial-screening/)

https://www.sot-medical.com/venous-screening/


** Venous Screening
------------------------------------------------------------


** Chronic Venous Insufficiency - CVI
------------------------------------------------------------


** Deep Vein Thrombosis - DVT
------------------------------------------------------------

Hemodynamic assessment of CVI and DVT in 3 minutes.
Learn more > (https://www.sot-medical.com/venous-screening/)

============================================================
38 Years Experience | Excellent Service | Made in Austria
** Contact us (https://www.sot-medical.com/contact/)
** LinkedIn (https://www.linkedin.com/company/sonotechnik-austria)
** LinkedIn (https://www.linkedin.com/company/sonotechnik-austria)
** YouTube (https://www.youtube.com/user/Sonotechnik/)
** YouTube (https://www.youtube.com/user/Sonotechnik/)
** Instagram (http://instagram.com/sotmedicalsystems/)
** Instagram (http://instagram.com/sotmedicalsystems/)
** SOT Website (https://www.sot-medical.com/)
** SOT Website (https://www.sot-medical.com/)
** SOT Shop (https://sot-medical.com/shop/)
** SOT Shop (https://sot-medical.com/shop/)
? 2026 SOT Medical Systems
You are receiving this email because you opted in via our website.

** www.sot-medical.com (https://www.sot-medical.com)

SOT Medical Systems . Alte Hollenburger Str. 4 . Maria Rain 9161 . Austria
** View online (https://mailchi.mp/sot-medical/53-jahrestagung-der-dga-besuchen-sie-uns-am-sot-stand-17451590?e=f59682099d)
You can ** unsubscribe from this list (https://sot-medical.us19.list-manage.com/unsubscribe?u=2319fb1a6957fb1c7acf04446&id=1567a68acf&t=b&e=f59682099d&c=abb6fc7f59)
.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/e0fce689/attachment-0001.htm>

From noreply at release.debian.org  Tue Aug 11 05:39:30 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Tue, 11 Aug 2026 04:39:30 +0000
Subject: universal-pathlib 0.3.10-3 MIGRATED to testing
Message-ID: <E1wteGw-00000005kis-2JRo@respighi.debian.org>

FYI: The status of the universal-pathlib source package
in Debian's testing distribution has changed.

  Previous version: 0.3.10-2
  Current version:  0.3.10-3

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From antonio.valentino at tiscali.it  Tue Aug 11 06:41:47 2026
From: antonio.valentino at tiscali.it (Antonio Valentino)
Date: Tue, 11 Aug 2026 07:41:47 +0200
Subject: pystac upstream split
Message-ID: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>

Dear Bas,
I'm working on the update of pystac.
With w 1.15.x the package has been split into:
* pystac-core
* pytest-pytsac
* 22 extensions (each with a single python module)

Everything is in a single repository and we currently get the the source 
tarball directly from github.

The original idea was (the one currently implemented in salsa and still 
not fully working) was to generate multiple python packages from a 
single source but I realized that pystac(-core) and the extensions are 
versioned (and also released) independently.

This is an issue for the current implementation because all the debian 
packages now have the same version.
Do you know if it is possible to control the version of the individual 
packages generated form the same source tarball?

In any case the single source approach would have limitations because I 
would not be able to update the extensions independently.

Unless you have a different advice, I think that the cleanest solution 
would be to have 25 independent packages and to get the source tarballs 
from PyPI.

If you agree with the approach I would kindly ask you to create new 
salsa repositories for

pystac-core

pystac-ext-classification
pystac-ext-datacube
pystac-ext-eo
pystac-ext-file
pystac-ext-grid
pystac-ext-item_assets
pystac-ext-label
pystac-ext-mgrs
pystac-ext-mlm
pystac-ext-pointcloud
pystac-ext-projection
pystac-ext-raster
pystac-ext-render
pystac-ext-sar
pystac-ext-sat
pystac-ext-scientific
pystac-ext-storage
pystac-ext-table
pystac-ext-timestamps
pystac-ext-version
pystac-ext-view
pystac-ext-xarray_assets

pytest-pystac


Of course I will need again your help for the review of the new packages 
and the first upload.


kind regards
-- 
Antonio Valentino




From gitlab at salsa.debian.org  Tue Aug 11 18:34:00 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 17:34:00 +0000
Subject: [Git][debian-gis-team/eodag] Pushed new tag debian/4.6.0+ds-1
Message-ID: <6a7b5d08d37d1_537765c0a0116458a@godard.mail>



Antonio Valentino pushed new tag debian/4.6.0+ds-1 at Debian GIS Project / eodag

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/tree/debian/4.6.0+ds-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/fb2a8563/attachment.htm>

From gitlab at salsa.debian.org  Tue Aug 11 18:34:04 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 17:34:04 +0000
Subject: [Git][debian-gis-team/eodag] Pushed new tag upstream/4.6.0+ds
Message-ID: <6a7b5d0c3c563_5376c7bfe01164710@godard.mail>



Antonio Valentino pushed new tag upstream/4.6.0+ds at Debian GIS Project / eodag

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/tree/upstream/4.6.0+ds
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/5c264d81/attachment.htm>

From gitlab at salsa.debian.org  Tue Aug 11 18:34:14 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 17:34:14 +0000
Subject: [Git][debian-gis-team/eodag][master] 5 commits: New upstream version
 4.6.0+ds
Message-ID: <6a7b5d16d7fb0_5376c6b820116493e@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / eodag


Commits:
3aa06d57 by Antonio Valentino at 2026-08-11T17:22:21+00:00
New upstream version 4.6.0+ds
- - - - -
55988d51 by Antonio Valentino at 2026-08-11T17:22:27+00:00
Update upstream source from tag 'upstream/4.6.0+ds'

Update to upstream version '4.6.0+ds'
with Debian dir 8207ac9fffd725a9949a0428ee48bd373625060b
- - - - -
b8882d02 by Antonio Valentino at 2026-08-11T17:28:57+00:00
New upstream release

- - - - -
cc971e67 by Antonio Valentino at 2026-08-11T17:29:04+00:00
Refresh all patches

- - - - -
8a6197d2 by Antonio Valentino at 2026-08-11T17:29:24+00:00
Set distribution to unstable

- - - - -


67 changed files:

- .github/workflows/fetch.yml
- .pre-commit-config.yaml
- CHANGES.rst
- debian/changelog
- debian/patches/0001-System-importlib.metadata.patch
- debian/patches/0002-no-mypy-boto3-s3.patch
- docs/_static/collections_information.csv
- docs/api_reference/eoproduct.rst
- ? docs/notebooks/tutos/tuto_eocat.ipynb
- docs/notebooks/tutos/tuto_stac_client.ipynb
- docs/providers.rst
- docs/tutos.rst
- eodag/api/collection.py
- eodag/api/core.py
- eodag/api/product/_assets.py
- eodag/api/product/_product.py
- eodag/api/product/drivers/__init__.py
- eodag/api/product/metadata_mapping.py
- eodag/api/provider.py
- eodag/api/search_result.py
- eodag/plugins/authentication/__init__.py
- eodag/plugins/authentication/aws_auth.py
- eodag/plugins/authentication/openid_connect.py
- eodag/plugins/authentication/sas_auth.py
- eodag/plugins/crunch/__init__.py
- eodag/plugins/download/__init__.py
- eodag/plugins/download/http.py
- eodag/plugins/manager.py
- eodag/plugins/search/__init__.py
- eodag/plugins/search/base.py
- eodag/plugins/search/build_search_result.py
- eodag/plugins/search/cop_marine.py
- eodag/plugins/search/qssearch.py
- eodag/resources/collections.yml
- eodag/resources/ext_collections.json
- eodag/resources/ext_product_types.json
- eodag/resources/providers/dedl.yml
- + eodag/resources/providers/dedt_leonardo.yml
- eodag/resources/providers/dedt_lumi.yml
- eodag/resources/providers/dedt_mn5.yml
- ? eodag/resources/providers/eocat.yml
- eodag/resources/providers/wekeo_cmems.yml
- eodag/resources/providers/wekeo_main.yml
- eodag/resources/user_conf_template.yml
- eodag/types/__init__.py
- eodag/types/queryables.py
- eodag/types/search_args.py
- eodag/utils/__init__.py
- eodag/utils/logging.py
- eodag/utils/repr.py
- eodag/utils/s3.py
- eodag/utils/streamresponse.py
- pyproject.toml
- tests/context.py
- tests/integration/test_core_config.py
- tests/integration/test_search_stac_static.py
- tests/test_config.py
- tests/test_end_to_end.py
- tests/units/test_auth_plugins.py
- tests/units/test_collection.py
- tests/units/test_core.py
- tests/units/test_download_plugins.py
- tests/units/test_eoproduct.py
- tests/units/test_eoproduct_driver_sentinel1.py
- tests/units/test_metadata_mapping.py
- tests/units/test_search_plugins.py
- tests/units/test_utils_s3.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/compare/88712720d6a8d844c34a13b4528b2fd46a9283fa...8a6197d2954fe0e547a329bd7d69c19330af1476

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/compare/88712720d6a8d844c34a13b4528b2fd46a9283fa...8a6197d2954fe0e547a329bd7d69c19330af1476
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/09fbf1f4/attachment-0001.htm>

From gitlab at salsa.debian.org  Tue Aug 11 18:34:21 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 17:34:21 +0000
Subject: [Git][debian-gis-team/eodag][pristine-tar] pristine-tar data for
 eodag_4.6.0+ds.orig.tar.xz
Message-ID: <6a7b5d1d7e497_5376c7a528116531f@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / eodag


Commits:
b116b8cb by Antonio Valentino at 2026-08-11T17:22:27+00:00
pristine-tar data for eodag_4.6.0+ds.orig.tar.xz

- - - - -


2 changed files:

- + eodag_4.6.0+ds.orig.tar.xz.delta
- + eodag_4.6.0+ds.orig.tar.xz.id


Changes:

=====================================
eodag_4.6.0+ds.orig.tar.xz.delta
=====================================
Binary files /dev/null and b/eodag_4.6.0+ds.orig.tar.xz.delta differ


=====================================
eodag_4.6.0+ds.orig.tar.xz.id
=====================================
@@ -0,0 +1 @@
+028897bf2dc4dfad7fd52bc08600039f570e4ead



View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/commit/b116b8cbe126b7f71289b0d9e7b5bcced6ba0ec9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/commit/b116b8cbe126b7f71289b0d9e7b5bcced6ba0ec9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/6ce79da0/attachment.htm>

From gitlab at salsa.debian.org  Tue Aug 11 18:34:21 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 17:34:21 +0000
Subject: [Git][debian-gis-team/eodag][upstream] New upstream version 4.6.0+ds
Message-ID: <6a7b5d1d5e348_5376cc4f881165194@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / eodag


Commits:
3aa06d57 by Antonio Valentino at 2026-08-11T17:22:21+00:00
New upstream version 4.6.0+ds
- - - - -


64 changed files:

- .github/workflows/fetch.yml
- .pre-commit-config.yaml
- CHANGES.rst
- docs/_static/collections_information.csv
- docs/api_reference/eoproduct.rst
- ? docs/notebooks/tutos/tuto_eocat.ipynb
- docs/notebooks/tutos/tuto_stac_client.ipynb
- docs/providers.rst
- docs/tutos.rst
- eodag/api/collection.py
- eodag/api/core.py
- eodag/api/product/_assets.py
- eodag/api/product/_product.py
- eodag/api/product/drivers/__init__.py
- eodag/api/product/metadata_mapping.py
- eodag/api/provider.py
- eodag/api/search_result.py
- eodag/plugins/authentication/__init__.py
- eodag/plugins/authentication/aws_auth.py
- eodag/plugins/authentication/openid_connect.py
- eodag/plugins/authentication/sas_auth.py
- eodag/plugins/crunch/__init__.py
- eodag/plugins/download/__init__.py
- eodag/plugins/download/http.py
- eodag/plugins/manager.py
- eodag/plugins/search/__init__.py
- eodag/plugins/search/base.py
- eodag/plugins/search/build_search_result.py
- eodag/plugins/search/cop_marine.py
- eodag/plugins/search/qssearch.py
- eodag/resources/collections.yml
- eodag/resources/ext_collections.json
- eodag/resources/ext_product_types.json
- eodag/resources/providers/dedl.yml
- + eodag/resources/providers/dedt_leonardo.yml
- eodag/resources/providers/dedt_lumi.yml
- eodag/resources/providers/dedt_mn5.yml
- ? eodag/resources/providers/eocat.yml
- eodag/resources/providers/wekeo_cmems.yml
- eodag/resources/providers/wekeo_main.yml
- eodag/resources/user_conf_template.yml
- eodag/types/__init__.py
- eodag/types/queryables.py
- eodag/types/search_args.py
- eodag/utils/__init__.py
- eodag/utils/logging.py
- eodag/utils/repr.py
- eodag/utils/s3.py
- eodag/utils/streamresponse.py
- pyproject.toml
- tests/context.py
- tests/integration/test_core_config.py
- tests/integration/test_search_stac_static.py
- tests/test_config.py
- tests/test_end_to_end.py
- tests/units/test_auth_plugins.py
- tests/units/test_collection.py
- tests/units/test_core.py
- tests/units/test_download_plugins.py
- tests/units/test_eoproduct.py
- tests/units/test_eoproduct_driver_sentinel1.py
- tests/units/test_metadata_mapping.py
- tests/units/test_search_plugins.py
- tests/units/test_utils_s3.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/commit/3aa06d5762e9a4bd1cf38c76fbb26f0038d2aff1

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/commit/3aa06d5762e9a4bd1cf38c76fbb26f0038d2aff1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/c8c6c458/attachment.htm>

From ftpmaster at ftp-master.debian.org  Tue Aug 11 19:07:33 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Tue, 11 Aug 2026 18:07:33 +0000
Subject: Processing of eodag_4.6.0+ds-1_source.changes
Message-ID: <E1wtqsv-004o2i-1f@usper.debian.org>

eodag_4.6.0+ds-1_source.changes uploaded successfully to localhost
along with the files:
  eodag_4.6.0+ds-1.dsc
  eodag_4.6.0+ds.orig.tar.xz
  eodag_4.6.0+ds-1.debian.tar.xz
  eodag_4.6.0+ds-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From gitlab at salsa.debian.org  Tue Aug 11 19:23:10 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Tue, 11 Aug 2026 18:23:10 +0000
Subject: [Git][debian-gis-team/postgis][experimental] Mark test-doc.patch as
 Applied-Upstream.
Message-ID: <6a7b688e1a5e7_5376cc4f881170893@godard.mail>



Bas Couwenberg pushed to branch experimental at Debian GIS Project / postgis


Commits:
32da5b68 by Bas Couwenberg at 2026-08-11T20:23:01+02:00
Mark test-doc.patch as Applied-Upstream.

- - - - -


1 changed file:

- debian/patches/test-doc.patch


Changes:

=====================================
debian/patches/test-doc.patch
=====================================
@@ -1,6 +1,7 @@
 Description: Don't run test_check_news.py when not using git.
 Author: Bas Couwenberg <sebastic at debian.org>
 Forwarded: https://trac.osgeo.org/postgis/ticket/6111
+Applied-Upstream: https://trac.osgeo.org/postgis/changeset/b45a1f078a93b84ef5dc95685e408b5970a4e71a/git
 
 --- a/GNUmakefile.in
 +++ b/GNUmakefile.in



View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/32da5b68c159a4791ef9d734050c41b2551add3f

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/postgis/-/commit/32da5b68c159a4791ef9d734050c41b2551add3f
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/0f11fa39/attachment.htm>

From ftpmaster at ftp-master.debian.org  Tue Aug 11 19:31:26 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Tue, 11 Aug 2026 18:31:26 +0000
Subject: eodag_4.6.0+ds-1_source.changes ACCEPTED into unstable
Message-ID: <E1wtrG2-00000007ATw-1CGW@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Tue, 11 Aug 2026 17:29:07 +0000
Source: eodag
Architecture: source
Version: 4.6.0+ds-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Changes:
 eodag (4.6.0+ds-1) unstable; urgency=medium
 .
   * New upstream release.
   * debian/patches:
     - Refresh all patches.
Checksums-Sha1:
 c0da5450bd53a75644558dcef06767267c7ad594 4239 eodag_4.6.0+ds-1.dsc
 e667b0b8fd40e2eae490f5429dd99537eabd77ad 14728392 eodag_4.6.0+ds.orig.tar.xz
 3d1be04998a386047f956a320fcbee482683d1c5 9620 eodag_4.6.0+ds-1.debian.tar.xz
 d17f51e797d93d417513a95a831aff29ba1fc218 11577 eodag_4.6.0+ds-1_amd64.buildinfo
Checksums-Sha256:
 2bb308c4e47cd0f99d3e59628c07eb5f592638049864cf16d759c83fdd37a133 4239 eodag_4.6.0+ds-1.dsc
 d8c2a8647d81a4d3d861d83cb81e1f3adf788b3908c801f464e527cfa61d3542 14728392 eodag_4.6.0+ds.orig.tar.xz
 3faaad280cb4e252248ff90e082c418fd12c5be92ef0415d896425d0cc6ee6a7 9620 eodag_4.6.0+ds-1.debian.tar.xz
 5ccdfa2f70e6200baef5762777d3c127c0edab15a6b4184e4fe1803e24a4f060 11577 eodag_4.6.0+ds-1_amd64.buildinfo
Files:
 ce4c8d7404ca32fd539d2d4916c28913 4239 python optional eodag_4.6.0+ds-1.dsc
 8bc309dfc8b3acd9cf25b0f744156965 14728392 python optional eodag_4.6.0+ds.orig.tar.xz
 32b7d180d0933a67576f54b289588fc3 9620 python optional eodag_4.6.0+ds-1.debian.tar.xz
 acd68a05442c8f827882fea3dec1255f 11577 python optional eodag_4.6.0+ds-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmp7YpEdHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBKWCQ//YUqguB+gmugMaFT7
ot3eBCwli8rMjjG4gKEkytPW5f0Ad05FGR7IKtoGx3bKo0KWdepIW8saPmSybREZ
JyFzJqtdaaIXD7uqw+SUCDQuSUSuhyEkkhGto/fGao5Y8MmSWiA8fZoaNT5mcazK
gG+Vj1tI47veEPexOpcWXapAjfIQ17vuFr4xvtyx+2wccrLcCGE9d2RfuqiANJxn
xmcKj7cw3I+VVTGw9mdcnBlzdlK80snbL4yR5dlnGV9VZSkh93//rSJaK/w4BCag
QS4vbbcVefAofVlRvNlLVsRNSsEpv7O5wOE5bzd3b2k0O2ir0YFE9CRBFPWAXMTu
+vHavStqQ8+/j4faqevMR/I8Lg2SIZFsX4fFIJHGbCO2O2zws4zuicRbnacP/SWx
/DPSXyvFKPWFPVTafh+nQx3hbtbN/2A8mQhZpp6WqvzKxEyf6DKHi7V+7BJ0VzVB
Zj9mSy/Yz5ez1vnbkqN+g4EXk1dz30FBPZ18fNOUIdkZQDRV2pCGtHeRgZVFQ6iq
RYC/GbpUhkojDtW7MMSQC12al/uyIVvw7Y8aool9Wt4xSgciGpg5g8cwoDvoiK6M
6AqE4THMbHv9eyWGNWf7P3XmtlAQU3y7AN0druLRLtZGOsSsjq1PBiQuMcHyYQcB
WOWHkb23O1RHQKQuWcgQBVdGmys=
=JqEv
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/bd6a47b8/attachment.sig>

From sebastic at xs4all.nl  Tue Aug 11 19:35:07 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Tue, 11 Aug 2026 20:35:07 +0200
Subject: pystac upstream split
In-Reply-To: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>
References: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>
Message-ID: <e76ab300-1d4f-4552-a47a-3cd079dfe51c@xs4all.nl>

On 8/11/26 7:41 AM, Antonio Valentino wrote:
> * 22 extensions (each with a single python module)

If these are very small, that would be an argument to keep building those from the same source as the Archive Team has complained about lots of small packages (in the Node.js ecosystem) in the past.
  
> Everything is in a single repository and we currently get the the source tarball directly from github.
> 
> The original idea was (the one currently implemented in salsa and still not fully working) was to generate multiple python packages from a single source but I realized that pystac(-core) and the extensions are versioned (and also released) independently.
> 
> This is an issue for the current implementation because all the debian packages now have the same version.
> Do you know if it is possible to control the version of the individual packages generated form the same source tarball?

Binary packages don't have to use the same version of the source package, this can sometimes be used instead of an epoch.
  
> In any case the single source approach would have limitations because I would not be able to update the extensions independently.

What criteria does pystac upstream use to tag a new release?

If only changes to core result in a new release which then also includes accumulated updates to the extensions, there is an argument for splittings the extensions off.

Updating the extensions with cherry-picked patches is also an option, but uscan won't inform you about available updates.

Is the pystac repo now some kind of monorepo in which all the related projects live?

> Unless you have a different advice, I think that the cleanest solution would be to have 25 independent packages and to get the source tarballs from PyPI.

My gut feeling right now is that we don't want all of these separate extension packages, but I don't have enough information to formulate what I think would be the best solution.

> Of course I will need again your help for the review of the new packages and the first upload.

That's of course no problem if it comes to that.

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From antonio.valentino at tiscali.it  Tue Aug 11 21:48:30 2026
From: antonio.valentino at tiscali.it (Antonio Valentino)
Date: Tue, 11 Aug 2026 22:48:30 +0200
Subject: pystac upstream split
In-Reply-To: <e76ab300-1d4f-4552-a47a-3cd079dfe51c@xs4all.nl>
References: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>
 <e76ab300-1d4f-4552-a47a-3cd079dfe51c@xs4all.nl>
Message-ID: <b79d6c54-62ad-4df5-b533-870977c0bfd7@tiscali.it>

Dear Bas,

Il 11/08/26 20:35, Sebastiaan Couwenberg ha scritto:
> On 8/11/26 7:41 AM, Antonio Valentino wrote:
>> * 22 extensions (each with a single python module)
> 
> If these are very small, that would be an argument to keep building 
> those from the same source as the Archive Team has complained about lots 
> of small packages (in the Node.js ecosystem) in the past.
> 
>> Everything is in a single repository and we currently get the the 
>> source tarball directly from github.
>>
>> The original idea was (the one currently implemented in salsa and 
>> still not fully working) was to generate multiple python packages from 
>> a single source but I realized that pystac(-core) and the extensions 
>> are versioned (and also released) independently.
>>
>> This is an issue for the current implementation because all the debian 
>> packages now have the same version.
>> Do you know if it is possible to control the version of the individual 
>> packages generated form the same source tarball?
> 
> Binary packages don't have to use the same version of the source 
> package, this can sometimes be used instead of an epoch.

How can I do it?
Right now I have 26 packages with version 1.15.2-1.
I guess that I could make the debian version independent from the 
upstream version but I don't know how to control the version of the 
different generated packages

E.g the pystac version is 1.15.2 but the version of 
pystac-ext-xarray-assets in the source archive is 1.0.0, and today it 
has been bumped to 1.0.1.

Please note that the version of the installed package (and the dist-info 
directory) is correct, just it does not matches the one of the debian 
binary package for the various extensions.


>> In any case the single source approach would have limitations because 
>> I would not be able to update the extensions independently.
> 
> What criteria does pystac upstream use to tag a new release?

In y understanding they have multiple project in a monorepo and they 
plan to have version the various components independently:

$ grep version $(find . -name pyproject.toml)
./pyproject.toml:version = "1.15.2"
./core/pyproject.toml:dynamic = ["version"]  # __version__ = "1.15.2"
./extensions/datacube/pyproject.toml:version = "2.2.0"
./extensions/sat/pyproject.toml:version = "1.0.0"
./extensions/xarray_assets/pyproject.toml:version = "1.0.0"
./extensions/item_assets/pyproject.toml:version = "1.0.0"
./extensions/raster/pyproject.toml:version = "1.1.0"
./extensions/pointcloud/pyproject.toml:version = "1.0.0"
./extensions/eo/pyproject.toml:version = "1.1.0"
./extensions/classification/pyproject.toml:version = "2.0.0"
./extensions/render/pyproject.toml:version = "2.0.0"
./extensions/version/pyproject.toml:version = "1.2.0"
./extensions/mlm/pyproject.toml:version = "1.4.0"
./extensions/scientific/pyproject.toml:version = "1.0.0"
./extensions/file/pyproject.toml:version = "2.1.0"
./extensions/mgrs/pyproject.toml:version = "1.0.0"
./extensions/timestamps/pyproject.toml:version = "1.1.0"
./extensions/sar/pyproject.toml:version = "1.0.0"
./extensions/view/pyproject.toml:version = "1.0.0"
./extensions/projection/pyproject.toml:version = "2.0.0"
./extensions/table/pyproject.toml:version = "1.2.0"
./extensions/label/pyproject.toml:version = "1.0.1"
./extensions/grid/pyproject.toml:version = "1.1.0"
./extensions/storage/pyproject.toml:version = "2.0.0"
./pytest-pystac/pyproject.toml:version = "0.1.0"


> If only changes to core result in a new release which then also includes 
> accumulated updates to the extensions, there is an argument for 
> splittings the extensions off.

Apparently no, they tag and release extensions independently on 
pystac-core, etc.

> Updating the extensions with cherry-picked patches is also an option, 
> but uscan won't inform you about available updates.

I didn't consider this. Indeed it is an option.
The fact that uscan would not help in this case is not a big issue for 
me, I'm registered to github release notifications in any case.

> Is the pystac repo now some kind of monorepo in which all the related 
> projects live?

yes

>> Unless you have a different advice, I think that the cleanest solution 
>> would be to have 25 independent packages and to get the source 
>> tarballs from PyPI.
> 
> My gut feeling right now is that we don't want all of these separate 
> extension packages, but I don't have enough information to formulate 
> what I think would be the best solution.

For the time being I would like to keep the single source package.
Probably it is also a good idea to have only

python3-pystac-core
python3-pystac (which includes all the extensions and depends on 
pystac-core)
python3-pystac-doc

python3-pytest-pystac would also be needed for autopkgtests
This one would be the only one with a mismatch between the debian 
package version and the python package version.

For the mime being non of the packages in debian has a direct dependency 
on the pystac extensions so they would not be impacted.

Switching to a with multiple extension packages or even multiple source 
packages would be always possible int the future if needed.

>> Of course I will need again your help for the review of the new 
>> packages and the first upload.
> 
> That's of course no problem if it comes to that.

If the above plan sounds good for you then no new repository is needed.
I will still need you to sponsor the first upload.

I will first re-organize the package to include all the extensions in 
python-pystac, and then I will introduce patches to the new versions of 
the extensions released in the meanwhile,

kind regards
-- 
Antonio Valentino



From gitlab at salsa.debian.org  Tue Aug 11 21:56:34 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 20:56:34 +0000
Subject: [Git][debian-gis-team/asf-search] Pushed new tag debian/12.3.1-1
Message-ID: <6a7b8c8263a9a_53767b9df41221844@godard.mail>



Antonio Valentino pushed new tag debian/12.3.1-1 at Debian GIS Project / asf-search

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/tree/debian/12.3.1-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/38395a3f/attachment.htm>

From gitlab at salsa.debian.org  Tue Aug 11 21:56:37 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 20:56:37 +0000
Subject: [Git][debian-gis-team/asf-search] Pushed new tag upstream/12.3.1
Message-ID: <6a7b8c8591345_537773e9b41222041@godard.mail>



Antonio Valentino pushed new tag upstream/12.3.1 at Debian GIS Project / asf-search

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/tree/upstream/12.3.1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/40b0fd49/attachment.htm>

From gitlab at salsa.debian.org  Tue Aug 11 21:56:50 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 20:56:50 +0000
Subject: [Git][debian-gis-team/asf-search][master] 4 commits: New upstream
 version 12.3.1
Message-ID: <6a7b8c9212e7a_5376a1fe7c122224e@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / asf-search


Commits:
ac3d2bab by Antonio Valentino at 2026-08-11T20:50:02+00:00
New upstream version 12.3.1
- - - - -
b5b97038 by Antonio Valentino at 2026-08-11T20:50:05+00:00
Update upstream source from tag 'upstream/12.3.1'

Update to upstream version '12.3.1'
with Debian dir 45080da0cc136b484669ef04dec520e0359a1805
- - - - -
8035966f by Antonio Valentino at 2026-08-11T20:51:47+00:00
New upstream release

- - - - -
efc41cea by Antonio Valentino at 2026-08-11T20:52:26+00:00
Set distribution to unstable

- - - - -


3 changed files:

- CHANGELOG.md
- asf_search/CMR/subquery.py
- debian/changelog


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -25,6 +25,15 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 -
 
 -->
+
+---
+
+## [v12.3.1](https://github.com/asfadmin/Discovery-asf_search/compare/v12.3.0...v12.3.1)
+
+### Fixed
+
+- `dataMaturity` no longer duplicates searches with multiple options selected.
+
 =======
 ## [v12.3.0](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.3...v12.3.0)
 ### Added


=====================================
asf_search/CMR/subquery.py
=====================================
@@ -41,6 +41,7 @@ def build_subqueries(opts: ASFSearchOptions) -> List[ASFSearchOptions]:
         'linestring',
         'point',
         'bbox',
+        'dataMaturity',
     ]  # these parameters will dodge the subquery system
     skip_param_names = [
         'maxResults',


=====================================
debian/changelog
=====================================
@@ -1,3 +1,9 @@
+asf-search (12.3.1-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Tue, 11 Aug 2026 20:52:12 +0000
+
 asf-search (12.3.0-1) unstable; urgency=medium
 
   * New upstream release.



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/8864c8abb6c01d4c19523201814cd714bc374655...efc41cea788e6d0ae20d5a5cc29ddcb93cbb2127

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/8864c8abb6c01d4c19523201814cd714bc374655...efc41cea788e6d0ae20d5a5cc29ddcb93cbb2127
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/4731a514/attachment-0001.htm>

From gitlab at salsa.debian.org  Tue Aug 11 21:56:53 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 20:56:53 +0000
Subject: [Git][debian-gis-team/asf-search][upstream] New upstream version
 12.3.1
Message-ID: <6a7b8c95e02b7_53768c7b88122249d@godard.mail>



Antonio Valentino pushed to branch upstream at Debian GIS Project / asf-search


Commits:
ac3d2bab by Antonio Valentino at 2026-08-11T20:50:02+00:00
New upstream version 12.3.1
- - - - -


2 changed files:

- CHANGELOG.md
- asf_search/CMR/subquery.py


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -25,6 +25,15 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 -
 
 -->
+
+---
+
+## [v12.3.1](https://github.com/asfadmin/Discovery-asf_search/compare/v12.3.0...v12.3.1)
+
+### Fixed
+
+- `dataMaturity` no longer duplicates searches with multiple options selected.
+
 =======
 ## [v12.3.0](https://github.com/asfadmin/Discovery-asf_search/compare/v12.2.3...v12.3.0)
 ### Added


=====================================
asf_search/CMR/subquery.py
=====================================
@@ -41,6 +41,7 @@ def build_subqueries(opts: ASFSearchOptions) -> List[ASFSearchOptions]:
         'linestring',
         'point',
         'bbox',
+        'dataMaturity',
     ]  # these parameters will dodge the subquery system
     skip_param_names = [
         'maxResults',



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/ac3d2babd330b32e074eaf26782d1044c2995554

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/ac3d2babd330b32e074eaf26782d1044c2995554
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/3e63a380/attachment-0001.htm>

From gitlab at salsa.debian.org  Tue Aug 11 21:56:55 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Tue, 11 Aug 2026 20:56:55 +0000
Subject: [Git][debian-gis-team/asf-search][pristine-tar] pristine-tar data for
 asf-search_12.3.1.orig.tar.gz
Message-ID: <6a7b8c971ec18_5376987690122267c@godard.mail>



Antonio Valentino pushed to branch pristine-tar at Debian GIS Project / asf-search


Commits:
43d71530 by Antonio Valentino at 2026-08-11T20:50:05+00:00
pristine-tar data for asf-search_12.3.1.orig.tar.gz

- - - - -


2 changed files:

- + asf-search_12.3.1.orig.tar.gz.delta
- + asf-search_12.3.1.orig.tar.gz.id


Changes:

=====================================
asf-search_12.3.1.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/asf-search_12.3.1.orig.tar.gz.delta differ


=====================================
asf-search_12.3.1.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+b2ec79de85cdee6e94273738a6bc6c1a7c15ff9a



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/43d71530668c4c1c5774e9606e2451f1c2d26174

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/43d71530668c4c1c5774e9606e2451f1c2d26174
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/ad9a1e0f/attachment.htm>

From ftpmaster at ftp-master.debian.org  Tue Aug 11 22:40:58 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Tue, 11 Aug 2026 21:40:58 +0000
Subject: Processing of asf-search_12.3.1-1_source.changes
Message-ID: <E1wtuDS-0050Co-0w@usper.debian.org>

asf-search_12.3.1-1_source.changes uploaded successfully to localhost
along with the files:
  asf-search_12.3.1-1.dsc
  asf-search_12.3.1.orig.tar.gz
  asf-search_12.3.1-1.debian.tar.xz
  asf-search_12.3.1-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Tue Aug 11 22:51:21 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Tue, 11 Aug 2026 21:51:21 +0000
Subject: asf-search_12.3.1-1_source.changes ACCEPTED into unstable
Message-ID: <E1wtuNV-00000007w15-1rMo@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Tue, 11 Aug 2026 20:52:12 +0000
Source: asf-search
Architecture: source
Version: 12.3.1-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Antonio Valentino <antonio.valentino at tiscali.it>
Changes:
 asf-search (12.3.1-1) unstable; urgency=medium
 .
   * New upstream release.
Checksums-Sha1:
 a878f285221e8374ea2bc54fa5c9bd74fd96d5d5 2635 asf-search_12.3.1-1.dsc
 855261678e49a18d9f5e5908a6471fae88e70349 1549486 asf-search_12.3.1.orig.tar.gz
 9b30e3c284682cd271579d5f7a4d1c383ec7bfe9 4220 asf-search_12.3.1-1.debian.tar.xz
 c72ed530ea15c181361cdffe6c164480ebdff15f 12425 asf-search_12.3.1-1_amd64.buildinfo
Checksums-Sha256:
 f572bc41713548133f26efe959cabfa183b0538523a81b461da8f187c89a73a8 2635 asf-search_12.3.1-1.dsc
 cb90054936464451bfd813a9b38f4af90fe728d86fefab3d87732e602513930b 1549486 asf-search_12.3.1.orig.tar.gz
 142b8c3a660adad24cf9811657ad8b1294d005953c0fade931ad85779e4ffab1 4220 asf-search_12.3.1-1.debian.tar.xz
 adcd14bb3884964dfeca4c617cce32c95344e0e35ebbed4cffeaf197447f7f2c 12425 asf-search_12.3.1-1_amd64.buildinfo
Files:
 9f187c485008e16db5a94899560d9413 2635 python optional asf-search_12.3.1-1.dsc
 f3959c027070f74f1a7f396d2b4a87dc 1549486 python optional asf-search_12.3.1.orig.tar.gz
 8b89696eea0e355e91fff0bafd7d3db9 4220 python optional asf-search_12.3.1-1.debian.tar.xz
 7f2848f39d1dafb7ee626a15f7ab025b 12425 python optional asf-search_12.3.1-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJRBAEBCgA7FiEEO3DyCaX/1okDxHLF6/SKslePmBIFAmp7jKEdHGFudG9uaW8u
dmFsZW50aW5vQHRpc2NhbGkuaXQACgkQ6/SKslePmBKaRw/+M2xE22SGcRJauOcO
9riAd2i6Thm59JJZ1zGuS6gy4pECnu/u6Oz6Tu523emozjo3sE+AG9bmjjdehla/
PwUcRolT3xc3CqQXjzGd3vsn0DClNRPmwCeWD83YOR/ATzJMUswFSmJLu6DkN122
XWu4iXSoXxKqGGTD80wPDxMfIlfWws1p6bn0CZ3Q0P++J8afJ7JS7tjI+/+BmJpQ
kZgA7/iNzgkixDqkTy1hU1MVpzr1vVHpYAw3vOaQnr19zF6HbbFDIVrgl6J4ztWk
RH7eHj2JNkobsUIKab4AvaUCNd5ZAhtEF1y5/UVdBPWti4cnYJi5zG5L2KUZt+R+
pYUdrKdL/4SWpcSCkBFleH2rxMZQy1By2I3Lm+BeC6WDHNlmYopwBSyci7tJ2Vj8
L+LykaBZYKkxLe5KpKQr7LT26w4r3qZK88vUKFGZ+39BKSXmF+dyvUUsvh0Z1JW9
MAaZXakTOnP5HDjUU98xWvr3LN6YVE+lS9j+7Q+OCGZP+moaFP/B39FIS9vaj0+T
THzOdZydONXGojrqWN7NwnU2KqVVQoU5MdWhKoZWKZGvSGYNQR1Vl6UJoBqA/5Mc
8orOSpUbmAaFDobi0AHIaQM5/8yurVv5op4vOeV+FiW1pNh0ZPt1lRDJmpeP3GAB
FhOPq43jR6+yPL1OXTbHQqqmfkg=
=Xfwu
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260811/61e5eff7/attachment.sig>

From noreply at release.debian.org  Wed Aug 12 05:39:19 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Wed, 12 Aug 2026 04:39:19 +0000
Subject: mapnik 4.3.0+ds2-1 MIGRATED to testing
Message-ID: <E1wu0kJ-000000075zp-1pxW@respighi.debian.org>

FYI: The status of the mapnik source package
in Debian's testing distribution has changed.

  Previous version: 4.2.2+ds-1
  Current version:  4.3.0+ds2-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Wed Aug 12 05:39:22 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Wed, 12 Aug 2026 04:39:22 +0000
Subject: rasterio 1.5.1-1 MIGRATED to testing
Message-ID: <E1wu0kM-0000000764H-0uSc@respighi.debian.org>

FYI: The status of the rasterio source package
in Debian's testing distribution has changed.

  Previous version: 1.5.0-2
  Current version:  1.5.1-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Wed Aug 12 05:39:26 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Wed, 12 Aug 2026 04:39:26 +0000
Subject: stac-validator 4.5.2-1 MIGRATED to testing
Message-ID: <E1wu0kQ-000000076B0-2LrC@respighi.debian.org>

FYI: The status of the stac-validator source package
in Debian's testing distribution has changed.

  Previous version: 4.5.1-1
  Current version:  4.5.2-1

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Wed Aug 12 05:39:32 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Wed, 12 Aug 2026 04:39:32 +0000
Subject: universal-pathlib is marked for autoremoval from testing
Message-ID: <E1wu0kW-000000076D3-28l7@respighi.debian.org>

universal-pathlib 0.3.10-3 is marked for autoremoval from testing on 2026-09-05

It (build-)depends on packages with these RC bugs:
1128867: chromium: FTBFS with glibc 2.43 due to SYS_SECCOMP symbol collision
 https://bugs.debian.org/1128867
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1141793: node-yarnpkg: FTBFS: RollupError: Could not resolve "./libzipSync" from "../yarnpkg-libzip/sources/sync.ts"
 https://bugs.debian.org/1141793
1143321: httpcore: FTBFS: E   ModuleNotFoundError: No module named 'certifi'
 https://bugs.debian.org/1143321
1143345: node-ipydatagrid: FTBFS: dh_auto_build: error: cd ./bqplot/js && sh -ex ../../debian/nodejs/bqplot/js/build returned exit code 1
 https://bugs.debian.org/1143345
1143428: towncrier: FTBFS: E   twisted.trial.unittest.FailTest: 0 != 1 : Loading template...
 https://bugs.debian.org/1143428



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From sebastic at xs4all.nl  Wed Aug 12 06:10:05 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Wed, 12 Aug 2026 07:10:05 +0200
Subject: pystac upstream split
In-Reply-To: <b79d6c54-62ad-4df5-b533-870977c0bfd7@tiscali.it>
References: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>
 <e76ab300-1d4f-4552-a47a-3cd079dfe51c@xs4all.nl>
 <b79d6c54-62ad-4df5-b533-870977c0bfd7@tiscali.it>
Message-ID: <46cf9c10-89f8-4e60-a1db-7fa9aeae7213@xs4all.nl>

On 8/11/26 10:48 PM, Antonio Valentino wrote:
> Dear Bas,
> 
> Il 11/08/26 20:35, Sebastiaan Couwenberg ha scritto:
>> On 8/11/26 7:41 AM, Antonio Valentino wrote:
>>> * 22 extensions (each with a single python module)
>>
>> If these are very small, that would be an argument to keep building those from the same source as the Archive Team has complained about lots of small packages (in the Node.js ecosystem) in the past.
>>
>>> Everything is in a single repository and we currently get the the source tarball directly from github.
>>>
>>> The original idea was (the one currently implemented in salsa and still not fully working) was to generate multiple python packages from a single source but I realized that pystac(-core) and the extensions are versioned (and also released) independently.
>>>
>>> This is an issue for the current implementation because all the debian packages now have the same version.
>>> Do you know if it is possible to control the version of the individual packages generated form the same source tarball?
>>
>> Binary packages don't have to use the same version of the source package, this can sometimes be used instead of an epoch.
> 
> How can I do it?

Using substvars in d/control, e.g:

  Package: pystac-ext-eo
  Version: ${pystac-ext-eo:Version}

and generating the pystac-ext-eo.substvars file in d/rules using the .toml files.

https://www.debian.org/doc/debian-policy/ch-source.html#variable-substitutions-debian-substvars

> Right now I have 26 packages with version 1.15.2-1.
> I guess that I could make the debian version independent from the upstream version but I don't know how to control the version of the different generated packages
> 
> E.g the pystac version is 1.15.2 but the version of pystac-ext-xarray-assets in the source archive is 1.0.0, and today it has been bumped to 1.0.1.
> 
> Please note that the version of the installed package (and the dist-info directory) is correct, just it does not matches the one of the debian binary package for the various extensions.
> 
> 
>>> In any case the single source approach would have limitations because I would not be able to update the extensions independently.
>>
>> What criteria does pystac upstream use to tag a new release?
> 
> In y understanding they have multiple project in a monorepo and they plan to have version the various components independently:
> 
> $ grep version $(find . -name pyproject.toml)
> ./pyproject.toml:version = "1.15.2"
> ./core/pyproject.toml:dynamic = ["version"]? # __version__ = "1.15.2"
> ./extensions/datacube/pyproject.toml:version = "2.2.0"
> ./extensions/sat/pyproject.toml:version = "1.0.0"
> ./extensions/xarray_assets/pyproject.toml:version = "1.0.0"
> ./extensions/item_assets/pyproject.toml:version = "1.0.0"
> ./extensions/raster/pyproject.toml:version = "1.1.0"
> ./extensions/pointcloud/pyproject.toml:version = "1.0.0"
> ./extensions/eo/pyproject.toml:version = "1.1.0"
> ./extensions/classification/pyproject.toml:version = "2.0.0"
> ./extensions/render/pyproject.toml:version = "2.0.0"
> ./extensions/version/pyproject.toml:version = "1.2.0"
> ./extensions/mlm/pyproject.toml:version = "1.4.0"
> ./extensions/scientific/pyproject.toml:version = "1.0.0"
> ./extensions/file/pyproject.toml:version = "2.1.0"
> ./extensions/mgrs/pyproject.toml:version = "1.0.0"
> ./extensions/timestamps/pyproject.toml:version = "1.1.0"
> ./extensions/sar/pyproject.toml:version = "1.0.0"
> ./extensions/view/pyproject.toml:version = "1.0.0"
> ./extensions/projection/pyproject.toml:version = "2.0.0"
> ./extensions/table/pyproject.toml:version = "1.2.0"
> ./extensions/label/pyproject.toml:version = "1.0.1"
> ./extensions/grid/pyproject.toml:version = "1.1.0"
> ./extensions/storage/pyproject.toml:version = "2.0.0"
> ./pytest-pystac/pyproject.toml:version = "0.1.0"
> 
> 
>> If only changes to core result in a new release which then also includes accumulated updates to the extensions, there is an argument for splittings the extensions off.
> 
> Apparently no, they tag and release extensions independently on pystac-core, etc.
> 
>> Updating the extensions with cherry-picked patches is also an option, but uscan won't inform you about available updates.
> 
> I didn't consider this. Indeed it is an option.
> The fact that uscan would not help in this case is not a big issue for me, I'm registered to github release notifications in any case.
> 
>> Is the pystac repo now some kind of monorepo in which all the related projects live?
> 
> yes
> 
>>> Unless you have a different advice, I think that the cleanest solution would be to have 25 independent packages and to get the source tarballs from PyPI.
>>
>> My gut feeling right now is that we don't want all of these separate extension packages, but I don't have enough information to formulate what I think would be the best solution.
> 
> For the time being I would like to keep the single source package.
> Probably it is also a good idea to have only
> 
> python3-pystac-core
> python3-pystac (which includes all the extensions and depends on pystac-core)

May rename it to python3-pystac-extensions if it only contains those.

That could also be split into its own source package which bundles all the extension like nodejs packages do (using the checksum version and multiple upstream tarballs).

https://wiki.debian.org/Javascript/GroupSourcesTutorial

> python3-pystac-doc
> 
> python3-pytest-pystac would also be needed for autopkgtests
> This one would be the only one with a mismatch between the debian package version and the python package version.

pytest-pystac also doesn't have tags in the upstream repo, unlike core and the extensions. Possibly because it hasn't been blessed as stable yet.
  
> For the mime being non of the packages in debian has a direct dependency on the pystac extensions so they would not be impacted.
> 
> Switching to a with multiple extension packages or even multiple source packages would be always possible int the future if needed.
> 
>>> Of course I will need again your help for the review of the new packages and the first upload.
>>
>> That's of course no problem if it comes to that.
> 
> If the above plan sounds good for you then no new repository is needed.
> I will still need you to sponsor the first upload.
> 
> I will first re-organize the package to include all the extensions in python-pystac, and then I will introduce patches to the new versions of the extensions released in the meanwhile,
> 
> kind regards

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From gitlab at salsa.debian.org  Wed Aug 12 11:27:48 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 12 Aug 2026 10:27:48 +0000
Subject: [Git][debian-gis-team/josm][upstream] New upstream version
 0.0.svn19613+dfsg
Message-ID: <6a7c4aa4a9069_5376a1fe7c13506e@godard.mail>



Bas Couwenberg pushed to branch upstream at Debian GIS Project / josm


Commits:
7c9660b9 by Bas Couwenberg at 2026-08-12T07:30:26+02:00
New upstream version 0.0.svn19613+dfsg
- - - - -


224 changed files:

- .github/workflows/ant-test.yml
- .github/workflows/ant.yml
- .github/workflows/checkstyle-analysis.yml
- .github/workflows/codeql-analysis.yml
- .github/workflows/pmd-analysis.yml
- .github/workflows/spotbugs-analysis.yml
- REVISION
- build.xml
- i18n/po/af.po
- i18n/po/ak.po
- i18n/po/am.po
- i18n/po/ar.po
- i18n/po/as.po
- i18n/po/ast.po
- i18n/po/awa.po
- i18n/po/az.po
- i18n/po/be.po
- i18n/po/bg.po
- i18n/po/bn.po
- i18n/po/br.po
- i18n/po/bs.po
- i18n/po/ca.po
- i18n/po/ca at valencia.po
- i18n/po/ceb.po
- i18n/po/ckb.po
- i18n/po/co.po
- i18n/po/cs.po
- i18n/po/cy.po
- i18n/po/da.po
- i18n/po/de.po
- i18n/po/de_DE.po
- i18n/po/dv.po
- i18n/po/el.po
- i18n/po/en_AU.po
- i18n/po/en_CA.po
- i18n/po/en_GB.po
- i18n/po/en_US.po
- i18n/po/eo.po
- i18n/po/es.po
- i18n/po/et.po
- i18n/po/eu.po
- i18n/po/fa.po
- i18n/po/ff.po
- i18n/po/fi.po
- i18n/po/fil.po
- i18n/po/fo.po
- i18n/po/fr.po
- i18n/po/ga.po
- i18n/po/gl.po
- i18n/po/gu.po
- i18n/po/ha.po
- i18n/po/he.po
- i18n/po/hi.po
- i18n/po/hil.po
- i18n/po/hne.po
- i18n/po/hr.po
- i18n/po/ht.po
- i18n/po/hu.po
- i18n/po/hy.po
- i18n/po/ia.po
- i18n/po/id.po
- i18n/po/is.po
- i18n/po/it.po
- i18n/po/ja.po
- i18n/po/jv.po
- i18n/po/ka.po
- i18n/po/kk.po
- i18n/po/km.po
- i18n/po/kn.po
- i18n/po/ko.po
- i18n/po/ku.po
- i18n/po/ky.po
- i18n/po/la.po
- i18n/po/lb.po
- i18n/po/lo.po
- i18n/po/lt.po
- i18n/po/lv.po
- i18n/po/mg.po
- i18n/po/mk.po
- i18n/po/ml.po
- i18n/po/mr.po
- i18n/po/ms.po
- i18n/po/my.po
- i18n/po/nb.po
- i18n/po/nds.po
- i18n/po/ne.po
- i18n/po/nl.po
- i18n/po/nn.po
- i18n/po/ny.po
- i18n/po/oc.po
- i18n/po/om.po
- i18n/po/or.po
- i18n/po/pa.po
- i18n/po/pl.po
- i18n/po/ps.po
- i18n/po/pt.po
- i18n/po/pt_BR.po
- i18n/po/rm.po
- i18n/po/ro.po
- i18n/po/ru.po
- i18n/po/rw.po
- i18n/po/sd.po
- + i18n/po/shn.po
- i18n/po/si.po
- i18n/po/sk.po
- i18n/po/skr.po
- i18n/po/sl.po
- i18n/po/so.po
- i18n/po/sq.po
- i18n/po/sr.po
- i18n/po/sr at latin.po
- i18n/po/st.po
- i18n/po/sv.po
- i18n/po/ta.po
- i18n/po/te.po
- i18n/po/th.po
- i18n/po/tk.po
- i18n/po/tl.po
- i18n/po/tr.po
- i18n/po/ug.po
- i18n/po/uk.po
- i18n/po/ur.po
- i18n/po/uz.po
- i18n/po/vi.po
- i18n/po/wae.po
- i18n/po/xh.po
- i18n/po/yo.po
- i18n/po/zh_CN.po
- i18n/po/zh_HK.po
- i18n/po/zh_TW.po
- i18n/po/zu.po
- ivy.xml
- nodist/pom.xml
- pom.xml
- resources/META-INF/resources/webjars/tag2link/2026.3.21/index.json ? resources/META-INF/resources/webjars/tag2link/2026.6.26/index.json
- resources/data/defaultpresets.xml
- resources/data/validator/combinations.mapcss
- resources/data/validator/deprecated.mapcss
- resources/data/validator/geometry.mapcss
- resources/data/validator/ignoretags.cfg
- resources/images/presets/nautical/waterway_ditch.svg
- resources/images/presets/nautical/waterway_drain.svg
- + resources/images/presets/shop/games.svg
- resources/images/presets/tower/antenna.svg
- resources/images/presets/tower/communication.svg
- resources/images/presets/tower/communications_tower.svg
- resources/images/presets/tower/mast_communication.svg
- resources/images/presets/tower/water_tower.svg
- resources/styles/standard/elemstyles.mapcss
- src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
- src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
- src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java
- src/org/openstreetmap/josm/command/RotateCommand.java
- src/org/openstreetmap/josm/command/ScaleCommand.java
- src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java
- src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
- src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
- src/org/openstreetmap/josm/data/validation/tests/ConnectivityRelations.java
- src/org/openstreetmap/josm/gui/MapView.java
- src/org/openstreetmap/josm/gui/SelectionManager.java
- src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
- src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
- src/org/openstreetmap/josm/gui/autofilter/AutoFilterRule.java
- src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
- src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
- src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
- src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
- src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
- src/org/openstreetmap/josm/gui/mappaint/RenderingHelper.java
- src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java
- src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
- src/org/openstreetmap/josm/io/DiffResultProcessor.java
- src/org/openstreetmap/josm/io/GeoJSONReader.java
- src/org/openstreetmap/josm/io/OsmApi.java
- src/org/openstreetmap/josm/io/UrlPatterns.java
- src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
- src/org/openstreetmap/josm/plugins/PluginHandler.java
- src/org/openstreetmap/josm/tools/ImageProvider.java
- src/org/openstreetmap/josm/tools/ImageResource.java
- src/org/openstreetmap/josm/tools/ReflectionUtils.java
- src/org/openstreetmap/josm/tools/Tag2Link.java
- src/org/openstreetmap/josm/tools/TextTagParser.java
- ? test/data/ImageProviderTest-java21/cursor-crosshair-10.png
- ? test/data/ImageProviderTest-java21/cursor-crosshair-15.png
- ? test/data/ImageProviderTest-java21/cursor-crosshair-30.png
- ? test/data/ImageProviderTest-java21/cursor-normal-selection-10.png
- ? test/data/ImageProviderTest-java21/cursor-normal-selection-15.png
- ? test/data/ImageProviderTest-java21/cursor-normal-selection-30.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-08x08.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-16x16.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-24x24.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-36x27.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-default.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-null.png
- ? test/data/ImageProviderTest-java21/housenumber_small-BOUNDED-08x08.png
- ? test/data/ImageProviderTest-java21/housenumber_small-BOUNDED-16x16.png
- ? test/data/ImageProviderTest-java21/housenumber_small-BOUNDED-24x24.png
- ? test/data/ImageProviderTest-java21/housenumber_small-PADDED-08x08.png
- ? test/data/ImageProviderTest-java21/housenumber_small-PADDED-16x16.png
- ? test/data/ImageProviderTest-java21/housenumber_small-PADDED-24x24.png
- + test/data/ImageProviderTest/housenumber_small-AUTO-08x08-java21.png
- test/data/ImageProviderTest/housenumber_small-AUTO-08x08.png
- test/data/ImageProviderTest/housenumber_small-AUTO-36x27.png
- + test/data/ImageProviderTest/housenumber_small-AUTO-default-java21.png
- test/data/ImageProviderTest/housenumber_small-AUTO-default.png
- + test/data/ImageProviderTest/housenumber_small-AUTO-null-java21.png
- test/data/ImageProviderTest/housenumber_small-AUTO-null.png
- + test/data/ImageProviderTest/housenumber_small-BOUNDED-08x08-java21.png
- test/data/ImageProviderTest/housenumber_small-BOUNDED-08x08.png
- + test/data/ImageProviderTest/housenumber_small-BOUNDED-16x16-java21.png
- test/data/ImageProviderTest/housenumber_small-BOUNDED-16x16.png
- + test/data/ImageProviderTest/housenumber_small-BOUNDED-24x24-java21.png
- test/data/ImageProviderTest/housenumber_small-BOUNDED-24x24.png
- + test/data/ImageProviderTest/housenumber_small-PADDED-08x08-java21.png
- test/data/ImageProviderTest/housenumber_small-PADDED-08x08.png
- test/data/renderer/way-repeat-image-clamp/reference.png
- test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java
- test/unit/org/openstreetmap/josm/data/validation/tests/ConnectivityRelationsTest.java
- test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
- test/unit/org/openstreetmap/josm/gui/tagging/presets/PresetClassificationsTest.java
- test/unit/org/openstreetmap/josm/io/remotecontrol/AddTagsDialogTest.java
- test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
- test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
- test/unit/org/openstreetmap/josm/tools/UtilsTest.java


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/commit/7c9660b98f21d685aca2638bf506257b3c362481

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/commit/7c9660b98f21d685aca2638bf506257b3c362481
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/ed8e99a1/attachment-0001.htm>

From gitlab at salsa.debian.org  Wed Aug 12 11:27:46 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 12 Aug 2026 10:27:46 +0000
Subject: [Git][debian-gis-team/josm][pristine-tar] pristine-tar data for
 josm_0.0.svn19613+dfsg.orig.tar.gz
Message-ID: <6a7c4aa2d3c8_537765c0a013502f5@godard.mail>



Bas Couwenberg pushed to branch pristine-tar at Debian GIS Project / josm


Commits:
6d31c1d3 by Bas Couwenberg at 2026-08-12T07:35:55+02:00
pristine-tar data for josm_0.0.svn19613+dfsg.orig.tar.gz

- - - - -


2 changed files:

- + josm_0.0.svn19613+dfsg.orig.tar.gz.delta
- + josm_0.0.svn19613+dfsg.orig.tar.gz.id


Changes:

=====================================
josm_0.0.svn19613+dfsg.orig.tar.gz.delta
=====================================
Binary files /dev/null and b/josm_0.0.svn19613+dfsg.orig.tar.gz.delta differ


=====================================
josm_0.0.svn19613+dfsg.orig.tar.gz.id
=====================================
@@ -0,0 +1 @@
+8f3cd6b155ce2ac60492d2cc0107f300d121b260



View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/commit/6d31c1d3f120deae0b0da4f25656bb6a7de33e31

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/commit/6d31c1d3f120deae0b0da4f25656bb6a7de33e31
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/2e574221/attachment.htm>

From gitlab at salsa.debian.org  Wed Aug 12 11:27:47 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 12 Aug 2026 10:27:47 +0000
Subject: [Git][debian-gis-team/josm][master] 6 commits: New upstream version
 0.0.svn19613+dfsg
Message-ID: <6a7c4aa321515_53769f6c5c135042d@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / josm


Commits:
7c9660b9 by Bas Couwenberg at 2026-08-12T07:30:26+02:00
New upstream version 0.0.svn19613+dfsg
- - - - -
b812fdbd by Bas Couwenberg at 2026-08-12T07:35:55+02:00
Update upstream source from tag 'upstream/0.0.svn19613+dfsg'

Update to upstream version '0.0.svn19613+dfsg'
with Debian dir 24ec4e5b78b8166cb764bbe02225ed07d8261dd3
- - - - -
5290181b by Bas Couwenberg at 2026-08-12T07:46:37+02:00
New tested snapshot.

- - - - -
a01de268 by Bas Couwenberg at 2026-08-12T08:06:49+02:00
Fix get-orig-source output.

- - - - -
0d240575 by Bas Couwenberg at 2026-08-12T12:02:21+02:00
Add patch to fix ivy dependencies.

- - - - -
b2ab133c by Bas Couwenberg at 2026-08-12T12:09:05+02:00
Set distribution to unstable.

- - - - -


229 changed files:

- .github/workflows/ant-test.yml
- .github/workflows/ant.yml
- .github/workflows/checkstyle-analysis.yml
- .github/workflows/codeql-analysis.yml
- .github/workflows/pmd-analysis.yml
- .github/workflows/spotbugs-analysis.yml
- REVISION
- build.xml
- debian/changelog
- debian/patches/00-build.patch
- + debian/patches/ivy-deps.patch
- debian/patches/series
- debian/rules
- i18n/po/af.po
- i18n/po/ak.po
- i18n/po/am.po
- i18n/po/ar.po
- i18n/po/as.po
- i18n/po/ast.po
- i18n/po/awa.po
- i18n/po/az.po
- i18n/po/be.po
- i18n/po/bg.po
- i18n/po/bn.po
- i18n/po/br.po
- i18n/po/bs.po
- i18n/po/ca.po
- i18n/po/ca at valencia.po
- i18n/po/ceb.po
- i18n/po/ckb.po
- i18n/po/co.po
- i18n/po/cs.po
- i18n/po/cy.po
- i18n/po/da.po
- i18n/po/de.po
- i18n/po/de_DE.po
- i18n/po/dv.po
- i18n/po/el.po
- i18n/po/en_AU.po
- i18n/po/en_CA.po
- i18n/po/en_GB.po
- i18n/po/en_US.po
- i18n/po/eo.po
- i18n/po/es.po
- i18n/po/et.po
- i18n/po/eu.po
- i18n/po/fa.po
- i18n/po/ff.po
- i18n/po/fi.po
- i18n/po/fil.po
- i18n/po/fo.po
- i18n/po/fr.po
- i18n/po/ga.po
- i18n/po/gl.po
- i18n/po/gu.po
- i18n/po/ha.po
- i18n/po/he.po
- i18n/po/hi.po
- i18n/po/hil.po
- i18n/po/hne.po
- i18n/po/hr.po
- i18n/po/ht.po
- i18n/po/hu.po
- i18n/po/hy.po
- i18n/po/ia.po
- i18n/po/id.po
- i18n/po/is.po
- i18n/po/it.po
- i18n/po/ja.po
- i18n/po/jv.po
- i18n/po/ka.po
- i18n/po/kk.po
- i18n/po/km.po
- i18n/po/kn.po
- i18n/po/ko.po
- i18n/po/ku.po
- i18n/po/ky.po
- i18n/po/la.po
- i18n/po/lb.po
- i18n/po/lo.po
- i18n/po/lt.po
- i18n/po/lv.po
- i18n/po/mg.po
- i18n/po/mk.po
- i18n/po/ml.po
- i18n/po/mr.po
- i18n/po/ms.po
- i18n/po/my.po
- i18n/po/nb.po
- i18n/po/nds.po
- i18n/po/ne.po
- i18n/po/nl.po
- i18n/po/nn.po
- i18n/po/ny.po
- i18n/po/oc.po
- i18n/po/om.po
- i18n/po/or.po
- i18n/po/pa.po
- i18n/po/pl.po
- i18n/po/ps.po
- i18n/po/pt.po
- i18n/po/pt_BR.po
- i18n/po/rm.po
- i18n/po/ro.po
- i18n/po/ru.po
- i18n/po/rw.po
- i18n/po/sd.po
- + i18n/po/shn.po
- i18n/po/si.po
- i18n/po/sk.po
- i18n/po/skr.po
- i18n/po/sl.po
- i18n/po/so.po
- i18n/po/sq.po
- i18n/po/sr.po
- i18n/po/sr at latin.po
- i18n/po/st.po
- i18n/po/sv.po
- i18n/po/ta.po
- i18n/po/te.po
- i18n/po/th.po
- i18n/po/tk.po
- i18n/po/tl.po
- i18n/po/tr.po
- i18n/po/ug.po
- i18n/po/uk.po
- i18n/po/ur.po
- i18n/po/uz.po
- i18n/po/vi.po
- i18n/po/wae.po
- i18n/po/xh.po
- i18n/po/yo.po
- i18n/po/zh_CN.po
- i18n/po/zh_HK.po
- i18n/po/zh_TW.po
- i18n/po/zu.po
- ivy.xml
- nodist/pom.xml
- pom.xml
- resources/META-INF/resources/webjars/tag2link/2026.3.21/index.json ? resources/META-INF/resources/webjars/tag2link/2026.6.26/index.json
- resources/data/defaultpresets.xml
- resources/data/validator/combinations.mapcss
- resources/data/validator/deprecated.mapcss
- resources/data/validator/geometry.mapcss
- resources/data/validator/ignoretags.cfg
- resources/images/presets/nautical/waterway_ditch.svg
- resources/images/presets/nautical/waterway_drain.svg
- + resources/images/presets/shop/games.svg
- resources/images/presets/tower/antenna.svg
- resources/images/presets/tower/communication.svg
- resources/images/presets/tower/communications_tower.svg
- resources/images/presets/tower/mast_communication.svg
- resources/images/presets/tower/water_tower.svg
- resources/styles/standard/elemstyles.mapcss
- src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
- src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
- src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java
- src/org/openstreetmap/josm/command/RotateCommand.java
- src/org/openstreetmap/josm/command/ScaleCommand.java
- src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java
- src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
- src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
- src/org/openstreetmap/josm/data/validation/tests/ConnectivityRelations.java
- src/org/openstreetmap/josm/gui/MapView.java
- src/org/openstreetmap/josm/gui/SelectionManager.java
- src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
- src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
- src/org/openstreetmap/josm/gui/autofilter/AutoFilterRule.java
- src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
- src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
- src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
- src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
- src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
- src/org/openstreetmap/josm/gui/mappaint/RenderingHelper.java
- src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java
- src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
- src/org/openstreetmap/josm/io/DiffResultProcessor.java
- src/org/openstreetmap/josm/io/GeoJSONReader.java
- src/org/openstreetmap/josm/io/OsmApi.java
- src/org/openstreetmap/josm/io/UrlPatterns.java
- src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
- src/org/openstreetmap/josm/plugins/PluginHandler.java
- src/org/openstreetmap/josm/tools/ImageProvider.java
- src/org/openstreetmap/josm/tools/ImageResource.java
- src/org/openstreetmap/josm/tools/ReflectionUtils.java
- src/org/openstreetmap/josm/tools/Tag2Link.java
- src/org/openstreetmap/josm/tools/TextTagParser.java
- ? test/data/ImageProviderTest-java21/cursor-crosshair-10.png
- ? test/data/ImageProviderTest-java21/cursor-crosshair-15.png
- ? test/data/ImageProviderTest-java21/cursor-crosshair-30.png
- ? test/data/ImageProviderTest-java21/cursor-normal-selection-10.png
- ? test/data/ImageProviderTest-java21/cursor-normal-selection-15.png
- ? test/data/ImageProviderTest-java21/cursor-normal-selection-30.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-08x08.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-16x16.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-24x24.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-36x27.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-default.png
- ? test/data/ImageProviderTest-java21/housenumber_small-AUTO-null.png
- ? test/data/ImageProviderTest-java21/housenumber_small-BOUNDED-08x08.png
- ? test/data/ImageProviderTest-java21/housenumber_small-BOUNDED-16x16.png
- ? test/data/ImageProviderTest-java21/housenumber_small-BOUNDED-24x24.png
- ? test/data/ImageProviderTest-java21/housenumber_small-PADDED-08x08.png
- ? test/data/ImageProviderTest-java21/housenumber_small-PADDED-16x16.png
- ? test/data/ImageProviderTest-java21/housenumber_small-PADDED-24x24.png
- + test/data/ImageProviderTest/housenumber_small-AUTO-08x08-java21.png
- test/data/ImageProviderTest/housenumber_small-AUTO-08x08.png
- test/data/ImageProviderTest/housenumber_small-AUTO-36x27.png
- + test/data/ImageProviderTest/housenumber_small-AUTO-default-java21.png
- test/data/ImageProviderTest/housenumber_small-AUTO-default.png
- + test/data/ImageProviderTest/housenumber_small-AUTO-null-java21.png
- test/data/ImageProviderTest/housenumber_small-AUTO-null.png
- + test/data/ImageProviderTest/housenumber_small-BOUNDED-08x08-java21.png
- test/data/ImageProviderTest/housenumber_small-BOUNDED-08x08.png
- + test/data/ImageProviderTest/housenumber_small-BOUNDED-16x16-java21.png
- test/data/ImageProviderTest/housenumber_small-BOUNDED-16x16.png
- + test/data/ImageProviderTest/housenumber_small-BOUNDED-24x24-java21.png
- test/data/ImageProviderTest/housenumber_small-BOUNDED-24x24.png
- + test/data/ImageProviderTest/housenumber_small-PADDED-08x08-java21.png
- test/data/ImageProviderTest/housenumber_small-PADDED-08x08.png
- test/data/renderer/way-repeat-image-clamp/reference.png
- test/functional/org/openstreetmap/josm/tools/ImageProviderTest.java
- test/unit/org/openstreetmap/josm/data/validation/tests/ConnectivityRelationsTest.java
- test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
- test/unit/org/openstreetmap/josm/gui/tagging/presets/PresetClassificationsTest.java
- test/unit/org/openstreetmap/josm/io/remotecontrol/AddTagsDialogTest.java
- test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
- test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
- test/unit/org/openstreetmap/josm/tools/UtilsTest.java


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/compare/4249ca8bed231a41d98a511c8661cf09d8105f91...b2ab133cde47de2a3c0fe470b1f19774e53e3266

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/compare/4249ca8bed231a41d98a511c8661cf09d8105f91...b2ab133cde47de2a3c0fe470b1f19774e53e3266
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/17cf4624/attachment-0001.htm>

From gitlab at salsa.debian.org  Wed Aug 12 11:27:55 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 12 Aug 2026 10:27:55 +0000
Subject: [Git][debian-gis-team/josm] Pushed new tag debian/0.0.svn19613+dfsg-1
Message-ID: <6a7c4aab7e376_53769876901350897@godard.mail>



Bas Couwenberg pushed new tag debian/0.0.svn19613+dfsg-1 at Debian GIS Project / josm

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/tree/debian/0.0.svn19613+dfsg-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/1a0d5c82/attachment.htm>

From gitlab at salsa.debian.org  Wed Aug 12 11:27:57 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 12 Aug 2026 10:27:57 +0000
Subject: [Git][debian-gis-team/josm] Pushed new tag upstream/0.0.svn19613+dfsg
Message-ID: <6a7c4aad31bd_53768c7b8813510a2@godard.mail>



Bas Couwenberg pushed new tag upstream/0.0.svn19613+dfsg at Debian GIS Project / josm

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/josm/-/tree/upstream/0.0.svn19613+dfsg
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/feb43eba/attachment.htm>

From ftpmaster at ftp-master.debian.org  Wed Aug 12 11:36:02 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Wed, 12 Aug 2026 10:36:02 +0000
Subject: Processing of josm_0.0.svn19613+dfsg-1_source.changes
Message-ID: <E1wu6JX-005Xiw-05@usper.debian.org>

josm_0.0.svn19613+dfsg-1_source.changes uploaded successfully to localhost
along with the files:
  josm_0.0.svn19613+dfsg-1.dsc
  josm_0.0.svn19613+dfsg.orig.tar.gz
  josm_0.0.svn19613+dfsg-1.debian.tar.xz
  josm_0.0.svn19613+dfsg-1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Wed Aug 12 11:52:41 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Wed, 12 Aug 2026 10:52:41 +0000
Subject: josm_0.0.svn19613+dfsg-1_source.changes ACCEPTED into unstable
Message-ID: <E1wu6Zd-0000000ANl0-3pVX@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Wed, 12 Aug 2026 12:08:50 +0200
Source: josm
Architecture: source
Version: 0.0.svn19613+dfsg-1
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Changes:
 josm (0.0.svn19613+dfsg-1) unstable; urgency=medium
 .
   * New tested snapshot.
   * Bump Standards-Version to 4.7.4, no changes.
   * Add patch to fix ivy dependencies.
Checksums-Sha1:
 b9975e807001d4a1b5082ec22aaa50b8d1b8f3f5 2233 josm_0.0.svn19613+dfsg-1.dsc
 1a468bf27d39931c24cac8949295ad14192f6688 64630712 josm_0.0.svn19613+dfsg.orig.tar.gz
 e9a06f2fed599b68884cef9122658c9c495e9b80 326968 josm_0.0.svn19613+dfsg-1.debian.tar.xz
 a5cc67d961a7e8183129035c5f50feff3415646c 12565 josm_0.0.svn19613+dfsg-1_amd64.buildinfo
Checksums-Sha256:
 9432ac14b310c2650e6e754e7dc91e2026e9b756a1db59b01497a222b671d850 2233 josm_0.0.svn19613+dfsg-1.dsc
 f422e6931148588c00f1f0256aeef1f6c32114afda40dd2f90311c2393e9c085 64630712 josm_0.0.svn19613+dfsg.orig.tar.gz
 d1d61dc56b3a0ee620e81e12ade714313c054113a43cdacbea8a6d026d5a7630 326968 josm_0.0.svn19613+dfsg-1.debian.tar.xz
 84dbfb80578ea2ed1dd675dae02723fdf8aee23baf9df080d0aca92f2ee9bb6b 12565 josm_0.0.svn19613+dfsg-1_amd64.buildinfo
Files:
 4e89d33897db58b6af2863f12aaaa395 2233 utils optional josm_0.0.svn19613+dfsg-1.dsc
 bba0ed14594c78ac9e97b3e7f81479bb 64630712 utils optional josm_0.0.svn19613+dfsg.orig.tar.gz
 2b6bbeaa4fbc560db5bbb4913757a8e9 326968 utils optional josm_0.0.svn19613+dfsg-1.debian.tar.xz
 621ab04e8cc0b14bbb2934923da7237a 12565 utils optional josm_0.0.svn19613+dfsg-1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmp8SogACgkQZ1DxCuiN
SvEG4A//Zm8t0TOvcwhg+WdmLJE/WOWpMoMNX1SDbKLQCP6DKzXc6NmymGk0ckeH
bChD64YFGg0XtvQYOvZgXq95uGxYdKSJiUiBTsgvJ36waynN/fNezkjxCUpD5cPa
FTd+uOmrDQF/XGXDyMpXN/HGniW0QqJT5Egw0qQjFZQ7RZY6gBN5PVp8lciJyf8x
tkOLGpJTiOK0ivimwycidzbggeidnKo5/kqJAgIdEL2RoVXMooS3/7a6QcyGrLUl
+6l7OOYpbPjaAw7lZMhVfH729PUQ8TwA1EvCXKI3lUr71AJ7IiczMXN1Jjsqybqz
tunFUI88RdqgO2eKOp6RQ8oAMf6xMaL5Jwm42Sfn0/i5JTNkM2nExmk8poeaYe4N
vyfwPcZPDo1kdyDH+1btYWZ+oCXFcy/BpESSQmyd2BQLVixcIbLWLJ/iItqHJJcQ
8VZUnv4vLWKN6oURVYER07+gtc+alIssk+OYw3Q0BrkAao+KXHULwbJlESUOUGDF
5W6zNwE2yR0do08wvNXDxb4vSJGG8pOmoy9IpAsmEv9Bh4sRBgFerKOvnMMoVqyd
YNP6f8YTDBWVYkziCSTrVWZO/qernNoaC76L9JfIBe3zrjmqbljmnsRSSLyy2VEC
IJcVv8IIz3f040LFYexddEZAe6mt+K8aIoj1GRY31heDvGQ6bZg=
=yo9Y
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/4b6975d6/attachment.sig>

From gitlab at salsa.debian.org  Wed Aug 12 13:10:33 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 12 Aug 2026 12:10:33 +0000
Subject: [Git][debian-gis-team/qgis] Pushed new tag debian/3.44.13+dfsg-2
Message-ID: <6a7c62b9182bf_53769f6c5c1384328@godard.mail>



Bas Couwenberg pushed new tag debian/3.44.13+dfsg-2 at Debian GIS Project / qgis

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/tree/debian/3.44.13+dfsg-2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/6e3eb7b3/attachment.htm>

From gitlab at salsa.debian.org  Wed Aug 12 13:10:30 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Wed, 12 Aug 2026 12:10:30 +0000
Subject: [Git][debian-gis-team/qgis][master] 2 commits: Add upstream patch to
 fix FTBFS with SIP 6.11. (closes: #1143800)
Message-ID: <6a7c62b68de50_5376c7bfe01384168@godard.mail>



Bas Couwenberg pushed to branch master at Debian GIS Project / qgis


Commits:
9c00011d by Bas Couwenberg at 2026-08-12T12:44:53+02:00
Add upstream patch to fix FTBFS with SIP 6.11. (closes: #1143800)

- - - - -
a899d17f by Bas Couwenberg at 2026-08-12T12:45:04+02:00
Set distribution to unstable.

- - - - -


3 changed files:

- debian/changelog
- + debian/patches/pr67016-sip6.11.patch
- debian/patches/series


Changes:

=====================================
debian/changelog
=====================================
@@ -1,3 +1,10 @@
+qgis (3.44.13+dfsg-2) unstable; urgency=medium
+
+  * Add upstream patch to fix FTBFS with SIP 6.11.
+    (closes: #1143800)
+
+ -- Bas Couwenberg <sebastic at debian.org>  Wed, 12 Aug 2026 12:44:54 +0200
+
 qgis (3.44.13+dfsg-1) unstable; urgency=medium
 
   * Move from experimental to unstable.


=====================================
debian/patches/pr67016-sip6.11.patch
=====================================
@@ -0,0 +1,964 @@
+Description: fix build with SIP 6.11
+Author: "Juergen E. Fischer" <jef at norbit.de>
+Origin: https://github.com/qgis/QGIS/pull/67016
+Bug: https://github.com/qgis/QGIS/issues/66993
+
+--- a/python/CMakeLists.txt
++++ b/python/CMakeLists.txt
+@@ -127,6 +127,14 @@ if(NOT WITH_QTWEBENGINE)
+   set(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} HAVE_WEBENGINE_SIP)
+ endif()
+ 
++# sip 6.11 has support for the Movable Mapped Type Annotation
++# Including the annotation with older sip versions will throw a parser error,
++# so we need to generate a file without it for older versions
++if(${SIP_VERSION_STR} VERSION_LESS 6.11.0)
++  set(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} MOVABLE_MAPPED_TYPE)
++else()
++  set(SIP_MOVABLE_STR "Movable,")
++endif()
+ # Deprecated annotation supports message only since version 6.9.0 with abi-version 12.16 / 13.9 and above
+ if(${SIP_VERSION_STR} VERSION_LESS 6.9.0)
+   set(sipabi "")
+--- a/python/core/conversions.sip
++++ b/python/core/conversions.sip
+@@ -1241,6 +1241,44 @@ which are not wrapped by PyQt:
+     %End
+ };
+ 
++%If (MOVABLE_MAPPED_TYPE)
++template <TYPE>
++%MappedType std::unique_ptr<TYPE> /@SIP_MOVABLE_STR at NoRelease,AllowNone,TypeHint="Optional[TYPE]",TypeHintValue="TYPE"/
++{
++%TypeHeaderCode
++#include <memory>
++#include <utility>      // For std::move().
++%End
++
++%ConvertFromTypeCode
++  const sipTypeDef *sip_type = sipFindType("TYPE*");
++  return sipConvertFromNewType(sipCpp->release(), sip_type, NULL);
++%End
++
++%ConvertToTypeCode
++  const sipTypeDef *sip_type = sipFindType("TYPE");
++
++  if (sipIsErr == NULL)
++    return sipCanConvertToType(sipPy, sip_type, 0);
++
++  if (sipPy == Py_None)
++    return 1;
++
++  int state;
++  TYPE *type_ = reinterpret_cast<TYPE *>(sipConvertToType(sipPy, sip_type, sipTransferObj, 0, &state, sipIsErr));
++
++  sipReleaseType(type_, sip_type, state);
++
++  if (*sipIsErr)
++    return 0;
++
++  *sipCppPtr = new std::unique_ptr<TYPE>(type_);
++  return sipGetState(sipTransferObj);
++%End
++};
++%End
++
++%If (!MOVABLE_MAPPED_TYPE)
+ template <TYPE>
+ %MappedType std::unique_ptr< TYPE > /NoRelease,AllowNone,TypeHint="Optional[TYPE]",TypeHintValue="TYPE"/
+ {
+@@ -1258,7 +1296,7 @@ template <TYPE>
+   return 0;
+ %End
+ };
+-
++%End
+ 
+ template <TYPE>
+ %MappedType QVector< QVector<TYPE> >
+--- a/python/core/core.sip.in
++++ b/python/core/core.sip.in
+@@ -97,6 +97,7 @@ done:
+ %Feature ANDROID
+ %Feature VECTOR_MAPPED_TYPE
+ %Feature HAVE_WEBENGINE_SIP
++%Feature MOVABLE_MAPPED_TYPE
+ 
+ %Import QtXml/QtXmlmod.sip
+ %Import QtNetwork/QtNetworkmod.sip
+--- a/python/PyQt6/analysis/class_map.yaml
++++ b/python/PyQt6/analysis/class_map.yaml
+@@ -295,12 +295,12 @@ QgsRasterCalcNode.setRight: src/analysis
+ QgsRasterCalcNode.toString: src/analysis/raster/qgsrastercalcnode.h#L125
+ QgsRasterCalcNode.type: src/analysis/raster/qgsrastercalcnode.h#L96
+ QgsRasterCalcNode: src/analysis/raster/qgsrastercalcnode.h#L38
+-QgsRasterCalculator.creationOptions: src/analysis/raster/qgsrastercalculator.h#L177
+-QgsRasterCalculator.lastError: src/analysis/raster/qgsrastercalculator.h#L161
+-QgsRasterCalculator.noDataValue: src/analysis/raster/qgsrastercalculator.h#L193
+-QgsRasterCalculator.processCalculation: src/analysis/raster/qgsrastercalculator.h#L155
+-QgsRasterCalculator.setCreationOptions: src/analysis/raster/qgsrastercalculator.h#L169
+-QgsRasterCalculator.setNoDataValue: src/analysis/raster/qgsrastercalculator.h#L185
++QgsRasterCalculator.creationOptions: src/analysis/raster/qgsrastercalculator.h#L178
++QgsRasterCalculator.lastError: src/analysis/raster/qgsrastercalculator.h#L162
++QgsRasterCalculator.noDataValue: src/analysis/raster/qgsrastercalculator.h#L194
++QgsRasterCalculator.processCalculation: src/analysis/raster/qgsrastercalculator.h#L156
++QgsRasterCalculator.setCreationOptions: src/analysis/raster/qgsrastercalculator.h#L170
++QgsRasterCalculator.setNoDataValue: src/analysis/raster/qgsrastercalculator.h#L186
+ QgsRasterCalculator: src/analysis/raster/qgsrastercalculator.h#L74
+ QgsRasterCalculatorEntry: src/analysis/raster/qgsrastercalculator.h#L39
+ QgsRasterMatrix.absoluteValue: src/analysis/raster/qgsrastermatrix.h#L147
+--- a/python/PyQt6/core/class_map.yaml
++++ b/python/PyQt6/core/class_map.yaml
+@@ -3579,57 +3579,57 @@ QgsDropShadowEffect.create: src/core/eff
+ QgsDropShadowEffect.exteriorShadow: src/core/effects/qgsshadoweffect.h#L272
+ QgsDropShadowEffect.type: src/core/effects/qgsshadoweffect.h#L267
+ QgsDropShadowEffect: src/core/effects/qgsshadoweffect.h#L253
+-QgsDxfExport.QgsDxfExport.buildDataDefinedBlocks: src/core/dxf/qgsdxfexport.h#L110
+-QgsDxfExport.QgsDxfExport.dataDefinedBlocksMaximumNumberOfClasses: src/core/dxf/qgsdxfexport.h#L117
+-QgsDxfExport.QgsDxfExport.layer: src/core/dxf/qgsdxfexport.h#L88
+-QgsDxfExport.QgsDxfExport.layerOutputAttributeIndex: src/core/dxf/qgsdxfexport.h#L95
+-QgsDxfExport.QgsDxfExport.overriddenName: src/core/dxf/qgsdxfexport.h#L123
+-QgsDxfExport.QgsDxfExport.splitLayerAttribute: src/core/dxf/qgsdxfexport.h#L103
+-QgsDxfExport.addLayers: src/core/dxf/qgsdxfexport.h#L240
+-QgsDxfExport.clipValueToMapUnitScale: src/core/dxf/qgsdxfexport.h#L540
+-QgsDxfExport.closestColorMatch: src/core/dxf/qgsdxfexport.h#L347
+-QgsDxfExport.destinationCrs: src/core/dxf/qgsdxfexport.h#L286
+-QgsDxfExport.dxfEncoding: src/core/dxf/qgsdxfexport.h#L546
+-QgsDxfExport.dxfLayerName: src/core/dxf/qgsdxfexport.h#L543
+-QgsDxfExport.encodings: src/core/dxf/qgsdxfexport.h#L549
+-QgsDxfExport.extent: src/core/dxf/qgsdxfexport.h#L312
+-QgsDxfExport.feedbackMessage: src/core/dxf/qgsdxfexport.h#L254
+-QgsDxfExport.flags: src/core/dxf/qgsdxfexport.h#L233
+-QgsDxfExport.force2d: src/core/dxf/qgsdxfexport.h#L341
+-QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L355
+-QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L363
+-QgsDxfExport.layerTitleAsName: src/core/dxf/qgsdxfexport.h#L327
+-QgsDxfExport.mapUnitScaleFactor: src/core/dxf/qgsdxfexport.h#L532
+-QgsDxfExport.mapUnits: src/core/dxf/qgsdxfexport.h#L274
+-QgsDxfExport.registerDxfLayer: src/core/dxf/qgsdxfexport.h#L566
+-QgsDxfExport.setDestinationCrs: src/core/dxf/qgsdxfexport.h#L280
+-QgsDxfExport.setExtent: src/core/dxf/qgsdxfexport.h#L305
+-QgsDxfExport.setFlags: src/core/dxf/qgsdxfexport.h#L227
+-QgsDxfExport.setForce2d: src/core/dxf/qgsdxfexport.h#L334
+-QgsDxfExport.setLayerTitleAsName: src/core/dxf/qgsdxfexport.h#L320
+-QgsDxfExport.setMapSettings: src/core/dxf/qgsdxfexport.h#L221
+-QgsDxfExport.setSymbologyExport: src/core/dxf/qgsdxfexport.h#L292
+-QgsDxfExport.setSymbologyScale: src/core/dxf/qgsdxfexport.h#L261
+-QgsDxfExport.symbologyExport: src/core/dxf/qgsdxfexport.h#L299
+-QgsDxfExport.symbologyScale: src/core/dxf/qgsdxfexport.h#L268
+-QgsDxfExport.writeCircle: src/core/dxf/qgsdxfexport.h#L511
+-QgsDxfExport.writeDouble: src/core/dxf/qgsdxfexport.h#L430
+-QgsDxfExport.writeFilledCircle: src/core/dxf/qgsdxfexport.h#L505
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L371
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L379
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L387
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L394
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L402
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L412
+-QgsDxfExport.writeGroupCode: src/core/dxf/qgsdxfexport.h#L418
+-QgsDxfExport.writeHandle: src/core/dxf/qgsdxfexport.h#L444
+-QgsDxfExport.writeInt: src/core/dxf/qgsdxfexport.h#L424
+-QgsDxfExport.writeLine: src/core/dxf/qgsdxfexport.h#L493
+-QgsDxfExport.writeMText: src/core/dxf/qgsdxfexport.h#L523
+-QgsDxfExport.writePoint: src/core/dxf/qgsdxfexport.h#L499
+-QgsDxfExport.writeString: src/core/dxf/qgsdxfexport.h#L436
+-QgsDxfExport.writeText: src/core/dxf/qgsdxfexport.h#L517
+-QgsDxfExport.writeToFile: src/core/dxf/qgsdxfexport.h#L248
++QgsDxfExport.QgsDxfExport.buildDataDefinedBlocks: src/core/dxf/qgsdxfexport.h#L112
++QgsDxfExport.QgsDxfExport.dataDefinedBlocksMaximumNumberOfClasses: src/core/dxf/qgsdxfexport.h#L119
++QgsDxfExport.QgsDxfExport.layer: src/core/dxf/qgsdxfexport.h#L90
++QgsDxfExport.QgsDxfExport.layerOutputAttributeIndex: src/core/dxf/qgsdxfexport.h#L97
++QgsDxfExport.QgsDxfExport.overriddenName: src/core/dxf/qgsdxfexport.h#L125
++QgsDxfExport.QgsDxfExport.splitLayerAttribute: src/core/dxf/qgsdxfexport.h#L105
++QgsDxfExport.addLayers: src/core/dxf/qgsdxfexport.h#L242
++QgsDxfExport.clipValueToMapUnitScale: src/core/dxf/qgsdxfexport.h#L542
++QgsDxfExport.closestColorMatch: src/core/dxf/qgsdxfexport.h#L349
++QgsDxfExport.destinationCrs: src/core/dxf/qgsdxfexport.h#L288
++QgsDxfExport.dxfEncoding: src/core/dxf/qgsdxfexport.h#L548
++QgsDxfExport.dxfLayerName: src/core/dxf/qgsdxfexport.h#L545
++QgsDxfExport.encodings: src/core/dxf/qgsdxfexport.h#L551
++QgsDxfExport.extent: src/core/dxf/qgsdxfexport.h#L314
++QgsDxfExport.feedbackMessage: src/core/dxf/qgsdxfexport.h#L256
++QgsDxfExport.flags: src/core/dxf/qgsdxfexport.h#L235
++QgsDxfExport.force2d: src/core/dxf/qgsdxfexport.h#L343
++QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L357
++QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L365
++QgsDxfExport.layerTitleAsName: src/core/dxf/qgsdxfexport.h#L329
++QgsDxfExport.mapUnitScaleFactor: src/core/dxf/qgsdxfexport.h#L534
++QgsDxfExport.mapUnits: src/core/dxf/qgsdxfexport.h#L276
++QgsDxfExport.registerDxfLayer: src/core/dxf/qgsdxfexport.h#L568
++QgsDxfExport.setDestinationCrs: src/core/dxf/qgsdxfexport.h#L282
++QgsDxfExport.setExtent: src/core/dxf/qgsdxfexport.h#L307
++QgsDxfExport.setFlags: src/core/dxf/qgsdxfexport.h#L229
++QgsDxfExport.setForce2d: src/core/dxf/qgsdxfexport.h#L336
++QgsDxfExport.setLayerTitleAsName: src/core/dxf/qgsdxfexport.h#L322
++QgsDxfExport.setMapSettings: src/core/dxf/qgsdxfexport.h#L223
++QgsDxfExport.setSymbologyExport: src/core/dxf/qgsdxfexport.h#L294
++QgsDxfExport.setSymbologyScale: src/core/dxf/qgsdxfexport.h#L263
++QgsDxfExport.symbologyExport: src/core/dxf/qgsdxfexport.h#L301
++QgsDxfExport.symbologyScale: src/core/dxf/qgsdxfexport.h#L270
++QgsDxfExport.writeCircle: src/core/dxf/qgsdxfexport.h#L513
++QgsDxfExport.writeDouble: src/core/dxf/qgsdxfexport.h#L432
++QgsDxfExport.writeFilledCircle: src/core/dxf/qgsdxfexport.h#L507
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L373
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L381
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L389
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L396
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L404
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L414
++QgsDxfExport.writeGroupCode: src/core/dxf/qgsdxfexport.h#L420
++QgsDxfExport.writeHandle: src/core/dxf/qgsdxfexport.h#L446
++QgsDxfExport.writeInt: src/core/dxf/qgsdxfexport.h#L426
++QgsDxfExport.writeLine: src/core/dxf/qgsdxfexport.h#L495
++QgsDxfExport.writeMText: src/core/dxf/qgsdxfexport.h#L525
++QgsDxfExport.writePoint: src/core/dxf/qgsdxfexport.h#L501
++QgsDxfExport.writeString: src/core/dxf/qgsdxfexport.h#L438
++QgsDxfExport.writeText: src/core/dxf/qgsdxfexport.h#L519
++QgsDxfExport.writeToFile: src/core/dxf/qgsdxfexport.h#L250
+ QgsDxfExport: src/core/dxf/qgsdxfexport.h#L62
+ QgsEditFormConfig.QgsEditFormConfig: src/core/editform/qgseditformconfig.h#L303
+ QgsEditFormConfig.addTab: src/core/editform/qgseditformconfig.h#L101
+@@ -8860,45 +8860,45 @@ QgsMapBoxGlStyleConversionContext.sprite
+ QgsMapBoxGlStyleConversionContext.targetUnit: src/core/vectortile/qgsmapboxglstyleconverter.h#L70
+ QgsMapBoxGlStyleConversionContext.warnings: src/core/vectortile/qgsmapboxglstyleconverter.h#L53
+ QgsMapBoxGlStyleConversionContext: src/core/vectortile/qgsmapboxglstyleconverter.h#L41
+-QgsMapBoxGlStyleConverter.colorAsHslaComponents: src/core/vectortile/qgsmapboxglstyleconverter.h#L733
+-QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L399
+-QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L412
+-QgsMapBoxGlStyleConverter.errorMessage: src/core/vectortile/qgsmapboxglstyleconverter.h#L420
+-QgsMapBoxGlStyleConverter.interpolateExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L741
+-QgsMapBoxGlStyleConverter.labeling: src/core/vectortile/qgsmapboxglstyleconverter.h#L440
+-QgsMapBoxGlStyleConverter.parseArrayStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L629
+-QgsMapBoxGlStyleConverter.parseCapStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L748
+-QgsMapBoxGlStyleConverter.parseCircleLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L524
+-QgsMapBoxGlStyleConverter.parseColor: src/core/vectortile/qgsmapboxglstyleconverter.h#L721
+-QgsMapBoxGlStyleConverter.parseColorExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L708
+-QgsMapBoxGlStyleConverter.parseExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L762
+-QgsMapBoxGlStyleConverter.parseFillLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L500
+-QgsMapBoxGlStyleConverter.parseInterpolateByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L579
+-QgsMapBoxGlStyleConverter.parseInterpolateColorByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L567
+-QgsMapBoxGlStyleConverter.parseInterpolateListByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L698
+-QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L588
+-QgsMapBoxGlStyleConverter.parseInterpolatePointByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L604
+-QgsMapBoxGlStyleConverter.parseInterpolateStringByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L612
+-QgsMapBoxGlStyleConverter.parseJoinStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L755
+-QgsMapBoxGlStyleConverter.parseLabelStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L664
+-QgsMapBoxGlStyleConverter.parseLayers: src/core/vectortile/qgsmapboxglstyleconverter.h#L487
+-QgsMapBoxGlStyleConverter.parseLineLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L512
+-QgsMapBoxGlStyleConverter.parseMatchList: src/core/vectortile/qgsmapboxglstyleconverter.h#L680
+-QgsMapBoxGlStyleConverter.parseOpacityStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L596
+-QgsMapBoxGlStyleConverter.parsePointStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L622
+-QgsMapBoxGlStyleConverter.parseRasterSource: src/core/vectortile/qgsmapboxglstyleconverter.h#L481
+-QgsMapBoxGlStyleConverter.parseSources: src/core/vectortile/qgsmapboxglstyleconverter.h#L473
+-QgsMapBoxGlStyleConverter.parseStepList: src/core/vectortile/qgsmapboxglstyleconverter.h#L688
+-QgsMapBoxGlStyleConverter.parseStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L639
+-QgsMapBoxGlStyleConverter.parseStringStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L651
+-QgsMapBoxGlStyleConverter.parseSymbolLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L538
+-QgsMapBoxGlStyleConverter.parseSymbolLayerAsRenderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L555
+-QgsMapBoxGlStyleConverter.parseValueList: src/core/vectortile/qgsmapboxglstyleconverter.h#L671
+-QgsMapBoxGlStyleConverter.renderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L434
+-QgsMapBoxGlStyleConverter.retrieveSprite: src/core/vectortile/qgsmapboxglstyleconverter.h#L770
+-QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64: src/core/vectortile/qgsmapboxglstyleconverter.h#L784
+-QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64WithProperties: src/core/vectortile/qgsmapboxglstyleconverter.h#L794
+-QgsMapBoxGlStyleConverter.warnings: src/core/vectortile/qgsmapboxglstyleconverter.h#L428
++QgsMapBoxGlStyleConverter.colorAsHslaComponents: src/core/vectortile/qgsmapboxglstyleconverter.h#L734
++QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L400
++QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L413
++QgsMapBoxGlStyleConverter.errorMessage: src/core/vectortile/qgsmapboxglstyleconverter.h#L421
++QgsMapBoxGlStyleConverter.interpolateExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L742
++QgsMapBoxGlStyleConverter.labeling: src/core/vectortile/qgsmapboxglstyleconverter.h#L441
++QgsMapBoxGlStyleConverter.parseArrayStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L630
++QgsMapBoxGlStyleConverter.parseCapStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L749
++QgsMapBoxGlStyleConverter.parseCircleLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L525
++QgsMapBoxGlStyleConverter.parseColor: src/core/vectortile/qgsmapboxglstyleconverter.h#L722
++QgsMapBoxGlStyleConverter.parseColorExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L709
++QgsMapBoxGlStyleConverter.parseExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L763
++QgsMapBoxGlStyleConverter.parseFillLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L501
++QgsMapBoxGlStyleConverter.parseInterpolateByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L580
++QgsMapBoxGlStyleConverter.parseInterpolateColorByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L568
++QgsMapBoxGlStyleConverter.parseInterpolateListByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L699
++QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L589
++QgsMapBoxGlStyleConverter.parseInterpolatePointByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L605
++QgsMapBoxGlStyleConverter.parseInterpolateStringByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L613
++QgsMapBoxGlStyleConverter.parseJoinStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L756
++QgsMapBoxGlStyleConverter.parseLabelStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L665
++QgsMapBoxGlStyleConverter.parseLayers: src/core/vectortile/qgsmapboxglstyleconverter.h#L488
++QgsMapBoxGlStyleConverter.parseLineLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L513
++QgsMapBoxGlStyleConverter.parseMatchList: src/core/vectortile/qgsmapboxglstyleconverter.h#L681
++QgsMapBoxGlStyleConverter.parseOpacityStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L597
++QgsMapBoxGlStyleConverter.parsePointStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L623
++QgsMapBoxGlStyleConverter.parseRasterSource: src/core/vectortile/qgsmapboxglstyleconverter.h#L482
++QgsMapBoxGlStyleConverter.parseSources: src/core/vectortile/qgsmapboxglstyleconverter.h#L474
++QgsMapBoxGlStyleConverter.parseStepList: src/core/vectortile/qgsmapboxglstyleconverter.h#L689
++QgsMapBoxGlStyleConverter.parseStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L640
++QgsMapBoxGlStyleConverter.parseStringStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L652
++QgsMapBoxGlStyleConverter.parseSymbolLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L539
++QgsMapBoxGlStyleConverter.parseSymbolLayerAsRenderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L556
++QgsMapBoxGlStyleConverter.parseValueList: src/core/vectortile/qgsmapboxglstyleconverter.h#L672
++QgsMapBoxGlStyleConverter.renderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L435
++QgsMapBoxGlStyleConverter.retrieveSprite: src/core/vectortile/qgsmapboxglstyleconverter.h#L771
++QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64: src/core/vectortile/qgsmapboxglstyleconverter.h#L785
++QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64WithProperties: src/core/vectortile/qgsmapboxglstyleconverter.h#L795
++QgsMapBoxGlStyleConverter.warnings: src/core/vectortile/qgsmapboxglstyleconverter.h#L429
+ QgsMapBoxGlStyleConverter: src/core/vectortile/qgsmapboxglstyleconverter.h#L351
+ QgsMapBoxGlStyleRasterSource.attribution: src/core/vectortile/qgsmapboxglstyleconverter.h#L252
+ QgsMapBoxGlStyleRasterSource.maximumZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L266
+@@ -9558,10 +9558,11 @@ QgsMapSettings.visiblePolygonWithBuffer:
+ QgsMapSettings.writeXml: src/core/qgsmapsettings.h#L646
+ QgsMapSettings.zRange: src/core/qgsmapsettings.h#L843
+ QgsMapSettings: src/core/qgsmapsettings.h#L90
+-QgsMapSettingsUtils.containsAdvancedEffects: src/core/qgsmapsettingsutils.h#L51
+-QgsMapSettingsUtils.worldFileContent: src/core/qgsmapsettingsutils.h#L71
+-QgsMapSettingsUtils.worldFileParameters: src/core/qgsmapsettingsutils.h#L64
+-QgsMapSettingsUtils: src/core/qgsmapsettingsutils.h#L31
++QgsMapSettingsUtils.containsAdvancedEffects: src/core/qgsmapsettingsutils.h#L52
++QgsMapSettingsUtils.isValidExtent: src/core/qgsmapsettingsutils.h#L86
++QgsMapSettingsUtils.worldFileContent: src/core/qgsmapsettingsutils.h#L72
++QgsMapSettingsUtils.worldFileParameters: src/core/qgsmapsettingsutils.h#L65
++QgsMapSettingsUtils: src/core/qgsmapsettingsutils.h#L32
+ QgsMapThemeCollection.MapThemeLayerRecord.layer: src/core/qgsmapthemecollection.h#L76
+ QgsMapThemeCollection.MapThemeLayerRecord.setLayer: src/core/qgsmapthemecollection.h#L79
+ QgsMapThemeCollection.MapThemeLayerRecord: src/core/qgsmapthemecollection.h#L56
+@@ -10561,45 +10562,45 @@ QgsNativeMetadataValidator.validate: src
+ QgsNativeMetadataValidator: src/core/metadata/qgslayermetadatavalidator.h#L125
+ QgsNativeProjectMetadataValidator.validate: src/core/metadata/qgslayermetadatavalidator.h#L149
+ QgsNativeProjectMetadataValidator: src/core/metadata/qgslayermetadatavalidator.h#L142
+-QgsNetworkAccessManager.abortAuthBrowser: src/core/network/qgsnetworkaccessmanager.h#L744
+-QgsNetworkAccessManager.authBrowserAborted: src/core/network/qgsnetworkaccessmanager.h#L924
+-QgsNetworkAccessManager.blockingGet: src/core/network/qgsnetworkaccessmanager.h#L483
+-QgsNetworkAccessManager.blockingPost: src/core/network/qgsnetworkaccessmanager.h#L505
+-QgsNetworkAccessManager.cacheLoadControlFromName: src/core/network/qgsnetworkaccessmanager.h#L406
+-QgsNetworkAccessManager.cacheLoadControlName: src/core/network/qgsnetworkaccessmanager.h#L399
+-QgsNetworkAccessManager.cookiesChanged: src/core/network/qgsnetworkaccessmanager.h#L931
+-QgsNetworkAccessManager.createRequest: src/core/network/qgsnetworkaccessmanager.h#L951
+-QgsNetworkAccessManager.downloadProgress: src/core/network/qgsnetworkaccessmanager.h#L837
+-QgsNetworkAccessManager.excludeList: src/core/network/qgsnetworkaccessmanager.h#L368
+-QgsNetworkAccessManager.finished: src/core/network/qgsnetworkaccessmanager.h#L808
+-QgsNetworkAccessManager.insertProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L331
+-QgsNetworkAccessManager.instance: src/core/network/qgsnetworkaccessmanager.h#L280
+-QgsNetworkAccessManager.noProxyList: src/core/network/qgsnetworkaccessmanager.h#L379
+-QgsNetworkAccessManager.preprocessRequest: src/core/network/qgsnetworkaccessmanager.h#L757
+-QgsNetworkAccessManager.removeAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L655
+-QgsNetworkAccessManager.removeProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L339
+-QgsNetworkAccessManager.removeReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L712
+-QgsNetworkAccessManager.removeRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L563
+-QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L764
+-QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L778
+-QgsNetworkAccessManager.requestAuthCloseBrowser: src/core/network/qgsnetworkaccessmanager.h#L736
+-QgsNetworkAccessManager.requestAuthDetailsAdded: src/core/network/qgsnetworkaccessmanager.h#L871
+-QgsNetworkAccessManager.requestAuthOpenBrowser: src/core/network/qgsnetworkaccessmanager.h#L728
+-QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L792
+-QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L904
+-QgsNetworkAccessManager.requestEncounteredSslErrors: src/core/network/qgsnetworkaccessmanager.h#L889
+-QgsNetworkAccessManager.requestRequiresAuth: src/core/network/qgsnetworkaccessmanager.h#L854
+-QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L821
+-QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L909
+-QgsNetworkAccessManager.setAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L591
+-QgsNetworkAccessManager.setFallbackProxyAndExcludes: src/core/network/qgsnetworkaccessmanager.h#L392
+-QgsNetworkAccessManager.setReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L680
+-QgsNetworkAccessManager.setRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L521
+-QgsNetworkAccessManager.setTimeout: src/core/network/qgsnetworkaccessmanager.h#L461
+-QgsNetworkAccessManager.setupDefaultProxyAndCache: src/core/network/qgsnetworkaccessmanager.h#L415
+-QgsNetworkAccessManager.timeout: src/core/network/qgsnetworkaccessmanager.h#L452
+-QgsNetworkAccessManager.useSystemProxy: src/core/network/qgsnetworkaccessmanager.h#L444
+-QgsNetworkAccessManager: src/core/network/qgsnetworkaccessmanager.h#L256
++QgsNetworkAccessManager.abortAuthBrowser: src/core/network/qgsnetworkaccessmanager.h#L745
++QgsNetworkAccessManager.authBrowserAborted: src/core/network/qgsnetworkaccessmanager.h#L925
++QgsNetworkAccessManager.blockingGet: src/core/network/qgsnetworkaccessmanager.h#L484
++QgsNetworkAccessManager.blockingPost: src/core/network/qgsnetworkaccessmanager.h#L506
++QgsNetworkAccessManager.cacheLoadControlFromName: src/core/network/qgsnetworkaccessmanager.h#L407
++QgsNetworkAccessManager.cacheLoadControlName: src/core/network/qgsnetworkaccessmanager.h#L400
++QgsNetworkAccessManager.cookiesChanged: src/core/network/qgsnetworkaccessmanager.h#L932
++QgsNetworkAccessManager.createRequest: src/core/network/qgsnetworkaccessmanager.h#L952
++QgsNetworkAccessManager.downloadProgress: src/core/network/qgsnetworkaccessmanager.h#L838
++QgsNetworkAccessManager.excludeList: src/core/network/qgsnetworkaccessmanager.h#L369
++QgsNetworkAccessManager.finished: src/core/network/qgsnetworkaccessmanager.h#L809
++QgsNetworkAccessManager.insertProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L332
++QgsNetworkAccessManager.instance: src/core/network/qgsnetworkaccessmanager.h#L281
++QgsNetworkAccessManager.noProxyList: src/core/network/qgsnetworkaccessmanager.h#L380
++QgsNetworkAccessManager.preprocessRequest: src/core/network/qgsnetworkaccessmanager.h#L758
++QgsNetworkAccessManager.removeAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L656
++QgsNetworkAccessManager.removeProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L340
++QgsNetworkAccessManager.removeReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L713
++QgsNetworkAccessManager.removeRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L564
++QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L765
++QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L779
++QgsNetworkAccessManager.requestAuthCloseBrowser: src/core/network/qgsnetworkaccessmanager.h#L737
++QgsNetworkAccessManager.requestAuthDetailsAdded: src/core/network/qgsnetworkaccessmanager.h#L872
++QgsNetworkAccessManager.requestAuthOpenBrowser: src/core/network/qgsnetworkaccessmanager.h#L729
++QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L793
++QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L905
++QgsNetworkAccessManager.requestEncounteredSslErrors: src/core/network/qgsnetworkaccessmanager.h#L890
++QgsNetworkAccessManager.requestRequiresAuth: src/core/network/qgsnetworkaccessmanager.h#L855
++QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L822
++QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L910
++QgsNetworkAccessManager.setAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L592
++QgsNetworkAccessManager.setFallbackProxyAndExcludes: src/core/network/qgsnetworkaccessmanager.h#L393
++QgsNetworkAccessManager.setReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L681
++QgsNetworkAccessManager.setRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L522
++QgsNetworkAccessManager.setTimeout: src/core/network/qgsnetworkaccessmanager.h#L462
++QgsNetworkAccessManager.setupDefaultProxyAndCache: src/core/network/qgsnetworkaccessmanager.h#L416
++QgsNetworkAccessManager.timeout: src/core/network/qgsnetworkaccessmanager.h#L453
++QgsNetworkAccessManager.useSystemProxy: src/core/network/qgsnetworkaccessmanager.h#L445
++QgsNetworkAccessManager: src/core/network/qgsnetworkaccessmanager.h#L257
+ QgsNetworkContentFetcher.cancel: src/core/network/qgsnetworkcontentfetcher.h#L97
+ QgsNetworkContentFetcher.contentAsString: src/core/network/qgsnetworkcontentfetcher.h#L91
+ QgsNetworkContentFetcher.contentDispositionFilename: src/core/network/qgsnetworkcontentfetcher.h#L85
+@@ -10637,13 +10638,13 @@ QgsNetworkReplyContent.request: src/core
+ QgsNetworkReplyContent.requestId: src/core/network/qgsnetworkreply.h#L135
+ QgsNetworkReplyContent.setContent: src/core/network/qgsnetworkreply.h#L148
+ QgsNetworkReplyContent: src/core/network/qgsnetworkreply.h#L28
+-QgsNetworkRequestParameters.content: src/core/network/qgsnetworkaccessmanager.h#L96
+-QgsNetworkRequestParameters.initiatorClassName: src/core/network/qgsnetworkaccessmanager.h#L106
+-QgsNetworkRequestParameters.initiatorRequestId: src/core/network/qgsnetworkaccessmanager.h#L117
+-QgsNetworkRequestParameters.operation: src/core/network/qgsnetworkaccessmanager.h#L72
+-QgsNetworkRequestParameters.originatingThreadId: src/core/network/qgsnetworkaccessmanager.h#L85
+-QgsNetworkRequestParameters.request: src/core/network/qgsnetworkaccessmanager.h#L80
+-QgsNetworkRequestParameters.requestId: src/core/network/qgsnetworkaccessmanager.h#L90
++QgsNetworkRequestParameters.content: src/core/network/qgsnetworkaccessmanager.h#L97
++QgsNetworkRequestParameters.initiatorClassName: src/core/network/qgsnetworkaccessmanager.h#L107
++QgsNetworkRequestParameters.initiatorRequestId: src/core/network/qgsnetworkaccessmanager.h#L118
++QgsNetworkRequestParameters.operation: src/core/network/qgsnetworkaccessmanager.h#L73
++QgsNetworkRequestParameters.originatingThreadId: src/core/network/qgsnetworkaccessmanager.h#L86
++QgsNetworkRequestParameters.request: src/core/network/qgsnetworkaccessmanager.h#L81
++QgsNetworkRequestParameters.requestId: src/core/network/qgsnetworkaccessmanager.h#L91
+ QgsNetworkRequestParameters: src/core/network/qgsnetworkaccessmanager.h#L47
+ QgsNewsFeedModel.columnCount: src/core/network/qgsnewsfeedmodel.h#L72
+ QgsNewsFeedModel.data: src/core/network/qgsnewsfeedmodel.h#L67
+@@ -12052,22 +12053,22 @@ QgsProcessingFeatureBasedAlgorithm.sourc
+ QgsProcessingFeatureBasedAlgorithm.sourceFlags: src/core/processing/qgsprocessingalgorithm.h#L1271
+ QgsProcessingFeatureBasedAlgorithm.supportInPlaceEdit: src/core/processing/qgsprocessingalgorithm.h#L1224
+ QgsProcessingFeatureBasedAlgorithm: src/core/processing/qgsprocessingalgorithm.h#L1183
+-QgsProcessingFeatureSource.allFeatureIds: src/core/processing/qgsprocessingutils.h#L732
+-QgsProcessingFeatureSource.createExpressionContextScope: src/core/processing/qgsprocessingutils.h#L738
+-QgsProcessingFeatureSource.fields: src/core/processing/qgsprocessingutils.h#L724
+-QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L718
+-QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L722
+-QgsProcessingFeatureSource.hasFeatures: src/core/processing/qgsprocessingutils.h#L720
+-QgsProcessingFeatureSource.hasSpatialIndex: src/core/processing/qgsprocessingutils.h#L733
+-QgsProcessingFeatureSource.invalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L754
+-QgsProcessingFeatureSource.maximumValue: src/core/processing/qgsprocessingutils.h#L730
+-QgsProcessingFeatureSource.minimumValue: src/core/processing/qgsprocessingutils.h#L729
+-QgsProcessingFeatureSource.setInvalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L746
+-QgsProcessingFeatureSource.sourceCrs: src/core/processing/qgsprocessingutils.h#L723
+-QgsProcessingFeatureSource.sourceExtent: src/core/processing/qgsprocessingutils.h#L731
+-QgsProcessingFeatureSource.sourceName: src/core/processing/qgsprocessingutils.h#L727
+-QgsProcessingFeatureSource.wkbType: src/core/processing/qgsprocessingutils.h#L725
+-QgsProcessingFeatureSource: src/core/processing/qgsprocessingutils.h#L692
++QgsProcessingFeatureSource.allFeatureIds: src/core/processing/qgsprocessingutils.h#L752
++QgsProcessingFeatureSource.createExpressionContextScope: src/core/processing/qgsprocessingutils.h#L758
++QgsProcessingFeatureSource.fields: src/core/processing/qgsprocessingutils.h#L744
++QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L738
++QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L742
++QgsProcessingFeatureSource.hasFeatures: src/core/processing/qgsprocessingutils.h#L740
++QgsProcessingFeatureSource.hasSpatialIndex: src/core/processing/qgsprocessingutils.h#L753
++QgsProcessingFeatureSource.invalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L774
++QgsProcessingFeatureSource.maximumValue: src/core/processing/qgsprocessingutils.h#L750
++QgsProcessingFeatureSource.minimumValue: src/core/processing/qgsprocessingutils.h#L749
++QgsProcessingFeatureSource.setInvalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L766
++QgsProcessingFeatureSource.sourceCrs: src/core/processing/qgsprocessingutils.h#L743
++QgsProcessingFeatureSource.sourceExtent: src/core/processing/qgsprocessingutils.h#L751
++QgsProcessingFeatureSource.sourceName: src/core/processing/qgsprocessingutils.h#L747
++QgsProcessingFeatureSource.wkbType: src/core/processing/qgsprocessingutils.h#L745
++QgsProcessingFeatureSource: src/core/processing/qgsprocessingutils.h#L712
+ QgsProcessingFeatureSourceDefinition.QVariant: src/core/processing/qgsprocessingparameters.h#L188
+ QgsProcessingFeatureSourceDefinition.loadVariant: src/core/processing/qgsprocessingparameters.h#L166
+ QgsProcessingFeatureSourceDefinition.toVariant: src/core/processing/qgsprocessingparameters.h#L158
+@@ -13237,6 +13238,8 @@ QgsProcessingUtils.preprocessQgisProcess
+ QgsProcessingUtils.removePointerValuesFromMap: src/core/processing/qgsprocessingutils.h#L599
+ QgsProcessingUtils.resolveDefaultEncoding: src/core/processing/qgsprocessingutils.h#L618
+ QgsProcessingUtils.stringToPythonLiteral: src/core/processing/qgsprocessingutils.h#L333
++QgsProcessingUtils.supportedImageFileFilters: src/core/processing/qgsprocessingutils.h#L638
++QgsProcessingUtils.supportedImageFormats: src/core/processing/qgsprocessingutils.h#L628
+ QgsProcessingUtils.tempFolder: src/core/processing/qgsprocessingutils.h#L414
+ QgsProcessingUtils.variantToCrs: src/core/processing/qgsprocessingutils.h#L303
+ QgsProcessingUtils.variantToPythonLiteral: src/core/processing/qgsprocessingutils.h#L326
+@@ -19823,6 +19826,7 @@ QgsVectorTileUtils.formatXYZUrlTemplate:
+ QgsVectorTileUtils.loadSprites: src/core/vectortile/qgsvectortileutils.h#L102
+ QgsVectorTileUtils.makeQgisFields: src/core/vectortile/qgsvectortileutils.h#L70
+ QgsVectorTileUtils.makeVectorLayerForTile: src/core/vectortile/qgsvectortileutils.h#L90
++QgsVectorTileUtils.resolveMapboxUri: src/core/vectortile/qgsvectortileutils.h#L109
+ QgsVectorTileUtils.scaleToZoom: src/core/vectortile/qgsvectortileutils.h#L80
+ QgsVectorTileUtils.scaleToZoomLevel: src/core/vectortile/qgsvectortileutils.h#L88
+ QgsVectorTileUtils.sortTilesByDistanceFromCenter: src/core/vectortile/qgsvectortileutils.h#L60
+--- a/python/PyQt6/server/class_map.yaml
++++ b/python/PyQt6/server/class_map.yaml
+@@ -337,23 +337,23 @@ QgsServerRequest.setParameter: src/serve
+ QgsServerRequest.setUrl: src/server/qgsserverrequest.h#L192
+ QgsServerRequest.url: src/server/qgsserverrequest.h#L115
+ QgsServerRequest: src/server/qgsserverrequest.h#L34
+-QgsServerResponse.clear: src/server/qgsserverresponse.h#L173
+-QgsServerResponse.data: src/server/qgsserverresponse.h#L184
+-QgsServerResponse.feedback: src/server/qgsserverresponse.h#L197
+-QgsServerResponse.finish: src/server/qgsserverresponse.h#L159
+-QgsServerResponse.flush: src/server/qgsserverresponse.h#L168
+-QgsServerResponse.header: src/server/qgsserverresponse.h#L63
+-QgsServerResponse.headersSent: src/server/qgsserverresponse.h#L73
+-QgsServerResponse.io: src/server/qgsserverresponse.h#L154
+-QgsServerResponse.removeHeader: src/server/qgsserverresponse.h#L58
+-QgsServerResponse.sendError: src/server/qgsserverresponse.h#L96
+-QgsServerResponse.setHeader: src/server/qgsserverresponse.h#L52
+-QgsServerResponse.setStatusCode: src/server/qgsserverresponse.h#L80
+-QgsServerResponse.statusCode: src/server/qgsserverresponse.h#L85
+-QgsServerResponse.truncate: src/server/qgsserverresponse.h#L191
+-QgsServerResponse.write: src/server/qgsserverresponse.h#L103
+-QgsServerResponse.write: src/server/qgsserverresponse.h#L111
+-QgsServerResponse.write: src/server/qgsserverresponse.h#L149
++QgsServerResponse.clear: src/server/qgsserverresponse.h#L175
++QgsServerResponse.data: src/server/qgsserverresponse.h#L186
++QgsServerResponse.feedback: src/server/qgsserverresponse.h#L199
++QgsServerResponse.finish: src/server/qgsserverresponse.h#L161
++QgsServerResponse.flush: src/server/qgsserverresponse.h#L170
++QgsServerResponse.header: src/server/qgsserverresponse.h#L64
++QgsServerResponse.headersSent: src/server/qgsserverresponse.h#L75
++QgsServerResponse.io: src/server/qgsserverresponse.h#L156
++QgsServerResponse.removeHeader: src/server/qgsserverresponse.h#L59
++QgsServerResponse.sendError: src/server/qgsserverresponse.h#L98
++QgsServerResponse.setHeader: src/server/qgsserverresponse.h#L53
++QgsServerResponse.setStatusCode: src/server/qgsserverresponse.h#L82
++QgsServerResponse.statusCode: src/server/qgsserverresponse.h#L87
++QgsServerResponse.truncate: src/server/qgsserverresponse.h#L193
++QgsServerResponse.write: src/server/qgsserverresponse.h#L105
++QgsServerResponse.write: src/server/qgsserverresponse.h#L113
++QgsServerResponse.write: src/server/qgsserverresponse.h#L151
+ QgsServerResponse: src/server/qgsserverresponse.h#L41
+ QgsServerSettings.allowedExtraSqlTokens: src/server/qgsserversettings.h#L350
+ QgsServerSettings.apiResourcesDirectory: src/server/qgsserversettings.h#L252
+--- a/python/analysis/class_map.yaml
++++ b/python/analysis/class_map.yaml
+@@ -295,12 +295,12 @@ QgsRasterCalcNode.setRight: src/analysis
+ QgsRasterCalcNode.toString: src/analysis/raster/qgsrastercalcnode.h#L125
+ QgsRasterCalcNode.type: src/analysis/raster/qgsrastercalcnode.h#L96
+ QgsRasterCalcNode: src/analysis/raster/qgsrastercalcnode.h#L38
+-QgsRasterCalculator.creationOptions: src/analysis/raster/qgsrastercalculator.h#L177
+-QgsRasterCalculator.lastError: src/analysis/raster/qgsrastercalculator.h#L161
+-QgsRasterCalculator.noDataValue: src/analysis/raster/qgsrastercalculator.h#L193
+-QgsRasterCalculator.processCalculation: src/analysis/raster/qgsrastercalculator.h#L155
+-QgsRasterCalculator.setCreationOptions: src/analysis/raster/qgsrastercalculator.h#L169
+-QgsRasterCalculator.setNoDataValue: src/analysis/raster/qgsrastercalculator.h#L185
++QgsRasterCalculator.creationOptions: src/analysis/raster/qgsrastercalculator.h#L178
++QgsRasterCalculator.lastError: src/analysis/raster/qgsrastercalculator.h#L162
++QgsRasterCalculator.noDataValue: src/analysis/raster/qgsrastercalculator.h#L194
++QgsRasterCalculator.processCalculation: src/analysis/raster/qgsrastercalculator.h#L156
++QgsRasterCalculator.setCreationOptions: src/analysis/raster/qgsrastercalculator.h#L170
++QgsRasterCalculator.setNoDataValue: src/analysis/raster/qgsrastercalculator.h#L186
+ QgsRasterCalculator: src/analysis/raster/qgsrastercalculator.h#L74
+ QgsRasterCalculatorEntry: src/analysis/raster/qgsrastercalculator.h#L39
+ QgsRasterMatrix.absoluteValue: src/analysis/raster/qgsrastermatrix.h#L147
+--- a/python/core/class_map.yaml
++++ b/python/core/class_map.yaml
+@@ -3579,57 +3579,57 @@ QgsDropShadowEffect.create: src/core/eff
+ QgsDropShadowEffect.exteriorShadow: src/core/effects/qgsshadoweffect.h#L272
+ QgsDropShadowEffect.type: src/core/effects/qgsshadoweffect.h#L267
+ QgsDropShadowEffect: src/core/effects/qgsshadoweffect.h#L253
+-QgsDxfExport.QgsDxfExport.buildDataDefinedBlocks: src/core/dxf/qgsdxfexport.h#L110
+-QgsDxfExport.QgsDxfExport.dataDefinedBlocksMaximumNumberOfClasses: src/core/dxf/qgsdxfexport.h#L117
+-QgsDxfExport.QgsDxfExport.layer: src/core/dxf/qgsdxfexport.h#L88
+-QgsDxfExport.QgsDxfExport.layerOutputAttributeIndex: src/core/dxf/qgsdxfexport.h#L95
+-QgsDxfExport.QgsDxfExport.overriddenName: src/core/dxf/qgsdxfexport.h#L123
+-QgsDxfExport.QgsDxfExport.splitLayerAttribute: src/core/dxf/qgsdxfexport.h#L103
+-QgsDxfExport.addLayers: src/core/dxf/qgsdxfexport.h#L240
+-QgsDxfExport.clipValueToMapUnitScale: src/core/dxf/qgsdxfexport.h#L540
+-QgsDxfExport.closestColorMatch: src/core/dxf/qgsdxfexport.h#L347
+-QgsDxfExport.destinationCrs: src/core/dxf/qgsdxfexport.h#L286
+-QgsDxfExport.dxfEncoding: src/core/dxf/qgsdxfexport.h#L546
+-QgsDxfExport.dxfLayerName: src/core/dxf/qgsdxfexport.h#L543
+-QgsDxfExport.encodings: src/core/dxf/qgsdxfexport.h#L549
+-QgsDxfExport.extent: src/core/dxf/qgsdxfexport.h#L312
+-QgsDxfExport.feedbackMessage: src/core/dxf/qgsdxfexport.h#L254
+-QgsDxfExport.flags: src/core/dxf/qgsdxfexport.h#L233
+-QgsDxfExport.force2d: src/core/dxf/qgsdxfexport.h#L341
+-QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L355
+-QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L363
+-QgsDxfExport.layerTitleAsName: src/core/dxf/qgsdxfexport.h#L327
+-QgsDxfExport.mapUnitScaleFactor: src/core/dxf/qgsdxfexport.h#L532
+-QgsDxfExport.mapUnits: src/core/dxf/qgsdxfexport.h#L274
+-QgsDxfExport.registerDxfLayer: src/core/dxf/qgsdxfexport.h#L566
+-QgsDxfExport.setDestinationCrs: src/core/dxf/qgsdxfexport.h#L280
+-QgsDxfExport.setExtent: src/core/dxf/qgsdxfexport.h#L305
+-QgsDxfExport.setFlags: src/core/dxf/qgsdxfexport.h#L227
+-QgsDxfExport.setForce2d: src/core/dxf/qgsdxfexport.h#L334
+-QgsDxfExport.setLayerTitleAsName: src/core/dxf/qgsdxfexport.h#L320
+-QgsDxfExport.setMapSettings: src/core/dxf/qgsdxfexport.h#L221
+-QgsDxfExport.setSymbologyExport: src/core/dxf/qgsdxfexport.h#L292
+-QgsDxfExport.setSymbologyScale: src/core/dxf/qgsdxfexport.h#L261
+-QgsDxfExport.symbologyExport: src/core/dxf/qgsdxfexport.h#L299
+-QgsDxfExport.symbologyScale: src/core/dxf/qgsdxfexport.h#L268
+-QgsDxfExport.writeCircle: src/core/dxf/qgsdxfexport.h#L511
+-QgsDxfExport.writeDouble: src/core/dxf/qgsdxfexport.h#L430
+-QgsDxfExport.writeFilledCircle: src/core/dxf/qgsdxfexport.h#L505
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L371
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L379
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L387
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L394
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L402
+-QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L412
+-QgsDxfExport.writeGroupCode: src/core/dxf/qgsdxfexport.h#L418
+-QgsDxfExport.writeHandle: src/core/dxf/qgsdxfexport.h#L444
+-QgsDxfExport.writeInt: src/core/dxf/qgsdxfexport.h#L424
+-QgsDxfExport.writeLine: src/core/dxf/qgsdxfexport.h#L493
+-QgsDxfExport.writeMText: src/core/dxf/qgsdxfexport.h#L523
+-QgsDxfExport.writePoint: src/core/dxf/qgsdxfexport.h#L499
+-QgsDxfExport.writeString: src/core/dxf/qgsdxfexport.h#L436
+-QgsDxfExport.writeText: src/core/dxf/qgsdxfexport.h#L517
+-QgsDxfExport.writeToFile: src/core/dxf/qgsdxfexport.h#L248
++QgsDxfExport.QgsDxfExport.buildDataDefinedBlocks: src/core/dxf/qgsdxfexport.h#L112
++QgsDxfExport.QgsDxfExport.dataDefinedBlocksMaximumNumberOfClasses: src/core/dxf/qgsdxfexport.h#L119
++QgsDxfExport.QgsDxfExport.layer: src/core/dxf/qgsdxfexport.h#L90
++QgsDxfExport.QgsDxfExport.layerOutputAttributeIndex: src/core/dxf/qgsdxfexport.h#L97
++QgsDxfExport.QgsDxfExport.overriddenName: src/core/dxf/qgsdxfexport.h#L125
++QgsDxfExport.QgsDxfExport.splitLayerAttribute: src/core/dxf/qgsdxfexport.h#L105
++QgsDxfExport.addLayers: src/core/dxf/qgsdxfexport.h#L242
++QgsDxfExport.clipValueToMapUnitScale: src/core/dxf/qgsdxfexport.h#L542
++QgsDxfExport.closestColorMatch: src/core/dxf/qgsdxfexport.h#L349
++QgsDxfExport.destinationCrs: src/core/dxf/qgsdxfexport.h#L288
++QgsDxfExport.dxfEncoding: src/core/dxf/qgsdxfexport.h#L548
++QgsDxfExport.dxfLayerName: src/core/dxf/qgsdxfexport.h#L545
++QgsDxfExport.encodings: src/core/dxf/qgsdxfexport.h#L551
++QgsDxfExport.extent: src/core/dxf/qgsdxfexport.h#L314
++QgsDxfExport.feedbackMessage: src/core/dxf/qgsdxfexport.h#L256
++QgsDxfExport.flags: src/core/dxf/qgsdxfexport.h#L235
++QgsDxfExport.force2d: src/core/dxf/qgsdxfexport.h#L343
++QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L357
++QgsDxfExport.layerName: src/core/dxf/qgsdxfexport.h#L365
++QgsDxfExport.layerTitleAsName: src/core/dxf/qgsdxfexport.h#L329
++QgsDxfExport.mapUnitScaleFactor: src/core/dxf/qgsdxfexport.h#L534
++QgsDxfExport.mapUnits: src/core/dxf/qgsdxfexport.h#L276
++QgsDxfExport.registerDxfLayer: src/core/dxf/qgsdxfexport.h#L568
++QgsDxfExport.setDestinationCrs: src/core/dxf/qgsdxfexport.h#L282
++QgsDxfExport.setExtent: src/core/dxf/qgsdxfexport.h#L307
++QgsDxfExport.setFlags: src/core/dxf/qgsdxfexport.h#L229
++QgsDxfExport.setForce2d: src/core/dxf/qgsdxfexport.h#L336
++QgsDxfExport.setLayerTitleAsName: src/core/dxf/qgsdxfexport.h#L322
++QgsDxfExport.setMapSettings: src/core/dxf/qgsdxfexport.h#L223
++QgsDxfExport.setSymbologyExport: src/core/dxf/qgsdxfexport.h#L294
++QgsDxfExport.setSymbologyScale: src/core/dxf/qgsdxfexport.h#L263
++QgsDxfExport.symbologyExport: src/core/dxf/qgsdxfexport.h#L301
++QgsDxfExport.symbologyScale: src/core/dxf/qgsdxfexport.h#L270
++QgsDxfExport.writeCircle: src/core/dxf/qgsdxfexport.h#L513
++QgsDxfExport.writeDouble: src/core/dxf/qgsdxfexport.h#L432
++QgsDxfExport.writeFilledCircle: src/core/dxf/qgsdxfexport.h#L507
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L373
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L381
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L389
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L396
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L404
++QgsDxfExport.writeGroup: src/core/dxf/qgsdxfexport.h#L414
++QgsDxfExport.writeGroupCode: src/core/dxf/qgsdxfexport.h#L420
++QgsDxfExport.writeHandle: src/core/dxf/qgsdxfexport.h#L446
++QgsDxfExport.writeInt: src/core/dxf/qgsdxfexport.h#L426
++QgsDxfExport.writeLine: src/core/dxf/qgsdxfexport.h#L495
++QgsDxfExport.writeMText: src/core/dxf/qgsdxfexport.h#L525
++QgsDxfExport.writePoint: src/core/dxf/qgsdxfexport.h#L501
++QgsDxfExport.writeString: src/core/dxf/qgsdxfexport.h#L438
++QgsDxfExport.writeText: src/core/dxf/qgsdxfexport.h#L519
++QgsDxfExport.writeToFile: src/core/dxf/qgsdxfexport.h#L250
+ QgsDxfExport: src/core/dxf/qgsdxfexport.h#L62
+ QgsEditFormConfig.QgsEditFormConfig: src/core/editform/qgseditformconfig.h#L303
+ QgsEditFormConfig.addTab: src/core/editform/qgseditformconfig.h#L101
+@@ -8860,45 +8860,45 @@ QgsMapBoxGlStyleConversionContext.sprite
+ QgsMapBoxGlStyleConversionContext.targetUnit: src/core/vectortile/qgsmapboxglstyleconverter.h#L70
+ QgsMapBoxGlStyleConversionContext.warnings: src/core/vectortile/qgsmapboxglstyleconverter.h#L53
+ QgsMapBoxGlStyleConversionContext: src/core/vectortile/qgsmapboxglstyleconverter.h#L41
+-QgsMapBoxGlStyleConverter.colorAsHslaComponents: src/core/vectortile/qgsmapboxglstyleconverter.h#L733
+-QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L399
+-QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L412
+-QgsMapBoxGlStyleConverter.errorMessage: src/core/vectortile/qgsmapboxglstyleconverter.h#L420
+-QgsMapBoxGlStyleConverter.interpolateExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L741
+-QgsMapBoxGlStyleConverter.labeling: src/core/vectortile/qgsmapboxglstyleconverter.h#L440
+-QgsMapBoxGlStyleConverter.parseArrayStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L629
+-QgsMapBoxGlStyleConverter.parseCapStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L748
+-QgsMapBoxGlStyleConverter.parseCircleLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L524
+-QgsMapBoxGlStyleConverter.parseColor: src/core/vectortile/qgsmapboxglstyleconverter.h#L721
+-QgsMapBoxGlStyleConverter.parseColorExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L708
+-QgsMapBoxGlStyleConverter.parseExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L762
+-QgsMapBoxGlStyleConverter.parseFillLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L500
+-QgsMapBoxGlStyleConverter.parseInterpolateByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L579
+-QgsMapBoxGlStyleConverter.parseInterpolateColorByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L567
+-QgsMapBoxGlStyleConverter.parseInterpolateListByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L698
+-QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L588
+-QgsMapBoxGlStyleConverter.parseInterpolatePointByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L604
+-QgsMapBoxGlStyleConverter.parseInterpolateStringByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L612
+-QgsMapBoxGlStyleConverter.parseJoinStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L755
+-QgsMapBoxGlStyleConverter.parseLabelStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L664
+-QgsMapBoxGlStyleConverter.parseLayers: src/core/vectortile/qgsmapboxglstyleconverter.h#L487
+-QgsMapBoxGlStyleConverter.parseLineLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L512
+-QgsMapBoxGlStyleConverter.parseMatchList: src/core/vectortile/qgsmapboxglstyleconverter.h#L680
+-QgsMapBoxGlStyleConverter.parseOpacityStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L596
+-QgsMapBoxGlStyleConverter.parsePointStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L622
+-QgsMapBoxGlStyleConverter.parseRasterSource: src/core/vectortile/qgsmapboxglstyleconverter.h#L481
+-QgsMapBoxGlStyleConverter.parseSources: src/core/vectortile/qgsmapboxglstyleconverter.h#L473
+-QgsMapBoxGlStyleConverter.parseStepList: src/core/vectortile/qgsmapboxglstyleconverter.h#L688
+-QgsMapBoxGlStyleConverter.parseStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L639
+-QgsMapBoxGlStyleConverter.parseStringStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L651
+-QgsMapBoxGlStyleConverter.parseSymbolLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L538
+-QgsMapBoxGlStyleConverter.parseSymbolLayerAsRenderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L555
+-QgsMapBoxGlStyleConverter.parseValueList: src/core/vectortile/qgsmapboxglstyleconverter.h#L671
+-QgsMapBoxGlStyleConverter.renderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L434
+-QgsMapBoxGlStyleConverter.retrieveSprite: src/core/vectortile/qgsmapboxglstyleconverter.h#L770
+-QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64: src/core/vectortile/qgsmapboxglstyleconverter.h#L784
+-QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64WithProperties: src/core/vectortile/qgsmapboxglstyleconverter.h#L794
+-QgsMapBoxGlStyleConverter.warnings: src/core/vectortile/qgsmapboxglstyleconverter.h#L428
++QgsMapBoxGlStyleConverter.colorAsHslaComponents: src/core/vectortile/qgsmapboxglstyleconverter.h#L734
++QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L400
++QgsMapBoxGlStyleConverter.convert: src/core/vectortile/qgsmapboxglstyleconverter.h#L413
++QgsMapBoxGlStyleConverter.errorMessage: src/core/vectortile/qgsmapboxglstyleconverter.h#L421
++QgsMapBoxGlStyleConverter.interpolateExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L742
++QgsMapBoxGlStyleConverter.labeling: src/core/vectortile/qgsmapboxglstyleconverter.h#L441
++QgsMapBoxGlStyleConverter.parseArrayStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L630
++QgsMapBoxGlStyleConverter.parseCapStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L749
++QgsMapBoxGlStyleConverter.parseCircleLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L525
++QgsMapBoxGlStyleConverter.parseColor: src/core/vectortile/qgsmapboxglstyleconverter.h#L722
++QgsMapBoxGlStyleConverter.parseColorExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L709
++QgsMapBoxGlStyleConverter.parseExpression: src/core/vectortile/qgsmapboxglstyleconverter.h#L763
++QgsMapBoxGlStyleConverter.parseFillLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L501
++QgsMapBoxGlStyleConverter.parseInterpolateByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L580
++QgsMapBoxGlStyleConverter.parseInterpolateColorByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L568
++QgsMapBoxGlStyleConverter.parseInterpolateListByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L699
++QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L589
++QgsMapBoxGlStyleConverter.parseInterpolatePointByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L605
++QgsMapBoxGlStyleConverter.parseInterpolateStringByZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L613
++QgsMapBoxGlStyleConverter.parseJoinStyle: src/core/vectortile/qgsmapboxglstyleconverter.h#L756
++QgsMapBoxGlStyleConverter.parseLabelStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L665
++QgsMapBoxGlStyleConverter.parseLayers: src/core/vectortile/qgsmapboxglstyleconverter.h#L488
++QgsMapBoxGlStyleConverter.parseLineLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L513
++QgsMapBoxGlStyleConverter.parseMatchList: src/core/vectortile/qgsmapboxglstyleconverter.h#L681
++QgsMapBoxGlStyleConverter.parseOpacityStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L597
++QgsMapBoxGlStyleConverter.parsePointStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L623
++QgsMapBoxGlStyleConverter.parseRasterSource: src/core/vectortile/qgsmapboxglstyleconverter.h#L482
++QgsMapBoxGlStyleConverter.parseSources: src/core/vectortile/qgsmapboxglstyleconverter.h#L474
++QgsMapBoxGlStyleConverter.parseStepList: src/core/vectortile/qgsmapboxglstyleconverter.h#L689
++QgsMapBoxGlStyleConverter.parseStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L640
++QgsMapBoxGlStyleConverter.parseStringStops: src/core/vectortile/qgsmapboxglstyleconverter.h#L652
++QgsMapBoxGlStyleConverter.parseSymbolLayer: src/core/vectortile/qgsmapboxglstyleconverter.h#L539
++QgsMapBoxGlStyleConverter.parseSymbolLayerAsRenderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L556
++QgsMapBoxGlStyleConverter.parseValueList: src/core/vectortile/qgsmapboxglstyleconverter.h#L672
++QgsMapBoxGlStyleConverter.renderer: src/core/vectortile/qgsmapboxglstyleconverter.h#L435
++QgsMapBoxGlStyleConverter.retrieveSprite: src/core/vectortile/qgsmapboxglstyleconverter.h#L771
++QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64: src/core/vectortile/qgsmapboxglstyleconverter.h#L785
++QgsMapBoxGlStyleConverter.retrieveSpriteAsBase64WithProperties: src/core/vectortile/qgsmapboxglstyleconverter.h#L795
++QgsMapBoxGlStyleConverter.warnings: src/core/vectortile/qgsmapboxglstyleconverter.h#L429
+ QgsMapBoxGlStyleConverter: src/core/vectortile/qgsmapboxglstyleconverter.h#L351
+ QgsMapBoxGlStyleRasterSource.attribution: src/core/vectortile/qgsmapboxglstyleconverter.h#L252
+ QgsMapBoxGlStyleRasterSource.maximumZoom: src/core/vectortile/qgsmapboxglstyleconverter.h#L266
+@@ -9558,10 +9558,11 @@ QgsMapSettings.visiblePolygonWithBuffer:
+ QgsMapSettings.writeXml: src/core/qgsmapsettings.h#L646
+ QgsMapSettings.zRange: src/core/qgsmapsettings.h#L843
+ QgsMapSettings: src/core/qgsmapsettings.h#L90
+-QgsMapSettingsUtils.containsAdvancedEffects: src/core/qgsmapsettingsutils.h#L51
+-QgsMapSettingsUtils.worldFileContent: src/core/qgsmapsettingsutils.h#L71
+-QgsMapSettingsUtils.worldFileParameters: src/core/qgsmapsettingsutils.h#L64
+-QgsMapSettingsUtils: src/core/qgsmapsettingsutils.h#L31
++QgsMapSettingsUtils.containsAdvancedEffects: src/core/qgsmapsettingsutils.h#L52
++QgsMapSettingsUtils.isValidExtent: src/core/qgsmapsettingsutils.h#L86
++QgsMapSettingsUtils.worldFileContent: src/core/qgsmapsettingsutils.h#L72
++QgsMapSettingsUtils.worldFileParameters: src/core/qgsmapsettingsutils.h#L65
++QgsMapSettingsUtils: src/core/qgsmapsettingsutils.h#L32
+ QgsMapThemeCollection.MapThemeLayerRecord.layer: src/core/qgsmapthemecollection.h#L76
+ QgsMapThemeCollection.MapThemeLayerRecord.setLayer: src/core/qgsmapthemecollection.h#L79
+ QgsMapThemeCollection.MapThemeLayerRecord: src/core/qgsmapthemecollection.h#L56
+@@ -10561,45 +10562,45 @@ QgsNativeMetadataValidator.validate: src
+ QgsNativeMetadataValidator: src/core/metadata/qgslayermetadatavalidator.h#L125
+ QgsNativeProjectMetadataValidator.validate: src/core/metadata/qgslayermetadatavalidator.h#L149
+ QgsNativeProjectMetadataValidator: src/core/metadata/qgslayermetadatavalidator.h#L142
+-QgsNetworkAccessManager.abortAuthBrowser: src/core/network/qgsnetworkaccessmanager.h#L744
+-QgsNetworkAccessManager.authBrowserAborted: src/core/network/qgsnetworkaccessmanager.h#L924
+-QgsNetworkAccessManager.blockingGet: src/core/network/qgsnetworkaccessmanager.h#L483
+-QgsNetworkAccessManager.blockingPost: src/core/network/qgsnetworkaccessmanager.h#L505
+-QgsNetworkAccessManager.cacheLoadControlFromName: src/core/network/qgsnetworkaccessmanager.h#L406
+-QgsNetworkAccessManager.cacheLoadControlName: src/core/network/qgsnetworkaccessmanager.h#L399
+-QgsNetworkAccessManager.cookiesChanged: src/core/network/qgsnetworkaccessmanager.h#L931
+-QgsNetworkAccessManager.createRequest: src/core/network/qgsnetworkaccessmanager.h#L951
+-QgsNetworkAccessManager.downloadProgress: src/core/network/qgsnetworkaccessmanager.h#L837
+-QgsNetworkAccessManager.excludeList: src/core/network/qgsnetworkaccessmanager.h#L368
+-QgsNetworkAccessManager.finished: src/core/network/qgsnetworkaccessmanager.h#L808
+-QgsNetworkAccessManager.insertProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L331
+-QgsNetworkAccessManager.instance: src/core/network/qgsnetworkaccessmanager.h#L280
+-QgsNetworkAccessManager.noProxyList: src/core/network/qgsnetworkaccessmanager.h#L379
+-QgsNetworkAccessManager.preprocessRequest: src/core/network/qgsnetworkaccessmanager.h#L757
+-QgsNetworkAccessManager.removeAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L655
+-QgsNetworkAccessManager.removeProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L339
+-QgsNetworkAccessManager.removeReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L712
+-QgsNetworkAccessManager.removeRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L563
+-QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L764
+-QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L778
+-QgsNetworkAccessManager.requestAuthCloseBrowser: src/core/network/qgsnetworkaccessmanager.h#L736
+-QgsNetworkAccessManager.requestAuthDetailsAdded: src/core/network/qgsnetworkaccessmanager.h#L871
+-QgsNetworkAccessManager.requestAuthOpenBrowser: src/core/network/qgsnetworkaccessmanager.h#L728
+-QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L792
+-QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L904
+-QgsNetworkAccessManager.requestEncounteredSslErrors: src/core/network/qgsnetworkaccessmanager.h#L889
+-QgsNetworkAccessManager.requestRequiresAuth: src/core/network/qgsnetworkaccessmanager.h#L854
+-QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L821
+-QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L909
+-QgsNetworkAccessManager.setAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L591
+-QgsNetworkAccessManager.setFallbackProxyAndExcludes: src/core/network/qgsnetworkaccessmanager.h#L392
+-QgsNetworkAccessManager.setReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L680
+-QgsNetworkAccessManager.setRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L521
+-QgsNetworkAccessManager.setTimeout: src/core/network/qgsnetworkaccessmanager.h#L461
+-QgsNetworkAccessManager.setupDefaultProxyAndCache: src/core/network/qgsnetworkaccessmanager.h#L415
+-QgsNetworkAccessManager.timeout: src/core/network/qgsnetworkaccessmanager.h#L452
+-QgsNetworkAccessManager.useSystemProxy: src/core/network/qgsnetworkaccessmanager.h#L444
+-QgsNetworkAccessManager: src/core/network/qgsnetworkaccessmanager.h#L256
++QgsNetworkAccessManager.abortAuthBrowser: src/core/network/qgsnetworkaccessmanager.h#L745
++QgsNetworkAccessManager.authBrowserAborted: src/core/network/qgsnetworkaccessmanager.h#L925
++QgsNetworkAccessManager.blockingGet: src/core/network/qgsnetworkaccessmanager.h#L484
++QgsNetworkAccessManager.blockingPost: src/core/network/qgsnetworkaccessmanager.h#L506
++QgsNetworkAccessManager.cacheLoadControlFromName: src/core/network/qgsnetworkaccessmanager.h#L407
++QgsNetworkAccessManager.cacheLoadControlName: src/core/network/qgsnetworkaccessmanager.h#L400
++QgsNetworkAccessManager.cookiesChanged: src/core/network/qgsnetworkaccessmanager.h#L932
++QgsNetworkAccessManager.createRequest: src/core/network/qgsnetworkaccessmanager.h#L952
++QgsNetworkAccessManager.downloadProgress: src/core/network/qgsnetworkaccessmanager.h#L838
++QgsNetworkAccessManager.excludeList: src/core/network/qgsnetworkaccessmanager.h#L369
++QgsNetworkAccessManager.finished: src/core/network/qgsnetworkaccessmanager.h#L809
++QgsNetworkAccessManager.insertProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L332
++QgsNetworkAccessManager.instance: src/core/network/qgsnetworkaccessmanager.h#L281
++QgsNetworkAccessManager.noProxyList: src/core/network/qgsnetworkaccessmanager.h#L380
++QgsNetworkAccessManager.preprocessRequest: src/core/network/qgsnetworkaccessmanager.h#L758
++QgsNetworkAccessManager.removeAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L656
++QgsNetworkAccessManager.removeProxyFactory: src/core/network/qgsnetworkaccessmanager.h#L340
++QgsNetworkAccessManager.removeReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L713
++QgsNetworkAccessManager.removeRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L564
++QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L765
++QgsNetworkAccessManager.requestAboutToBeCreated: src/core/network/qgsnetworkaccessmanager.h#L779
++QgsNetworkAccessManager.requestAuthCloseBrowser: src/core/network/qgsnetworkaccessmanager.h#L737
++QgsNetworkAccessManager.requestAuthDetailsAdded: src/core/network/qgsnetworkaccessmanager.h#L872
++QgsNetworkAccessManager.requestAuthOpenBrowser: src/core/network/qgsnetworkaccessmanager.h#L729
++QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L793
++QgsNetworkAccessManager.requestCreated: src/core/network/qgsnetworkaccessmanager.h#L905
++QgsNetworkAccessManager.requestEncounteredSslErrors: src/core/network/qgsnetworkaccessmanager.h#L890
++QgsNetworkAccessManager.requestRequiresAuth: src/core/network/qgsnetworkaccessmanager.h#L855
++QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L822
++QgsNetworkAccessManager.requestTimedOut: src/core/network/qgsnetworkaccessmanager.h#L910
++QgsNetworkAccessManager.setAdvancedRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L592
++QgsNetworkAccessManager.setFallbackProxyAndExcludes: src/core/network/qgsnetworkaccessmanager.h#L393
++QgsNetworkAccessManager.setReplyPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L681
++QgsNetworkAccessManager.setRequestPreprocessor: src/core/network/qgsnetworkaccessmanager.h#L522
++QgsNetworkAccessManager.setTimeout: src/core/network/qgsnetworkaccessmanager.h#L462
++QgsNetworkAccessManager.setupDefaultProxyAndCache: src/core/network/qgsnetworkaccessmanager.h#L416
++QgsNetworkAccessManager.timeout: src/core/network/qgsnetworkaccessmanager.h#L453
++QgsNetworkAccessManager.useSystemProxy: src/core/network/qgsnetworkaccessmanager.h#L445
++QgsNetworkAccessManager: src/core/network/qgsnetworkaccessmanager.h#L257
+ QgsNetworkContentFetcher.cancel: src/core/network/qgsnetworkcontentfetcher.h#L97
+ QgsNetworkContentFetcher.contentAsString: src/core/network/qgsnetworkcontentfetcher.h#L91
+ QgsNetworkContentFetcher.contentDispositionFilename: src/core/network/qgsnetworkcontentfetcher.h#L85
+@@ -10637,13 +10638,13 @@ QgsNetworkReplyContent.request: src/core
+ QgsNetworkReplyContent.requestId: src/core/network/qgsnetworkreply.h#L135
+ QgsNetworkReplyContent.setContent: src/core/network/qgsnetworkreply.h#L148
+ QgsNetworkReplyContent: src/core/network/qgsnetworkreply.h#L28
+-QgsNetworkRequestParameters.content: src/core/network/qgsnetworkaccessmanager.h#L96
+-QgsNetworkRequestParameters.initiatorClassName: src/core/network/qgsnetworkaccessmanager.h#L106
+-QgsNetworkRequestParameters.initiatorRequestId: src/core/network/qgsnetworkaccessmanager.h#L117
+-QgsNetworkRequestParameters.operation: src/core/network/qgsnetworkaccessmanager.h#L72
+-QgsNetworkRequestParameters.originatingThreadId: src/core/network/qgsnetworkaccessmanager.h#L85
+-QgsNetworkRequestParameters.request: src/core/network/qgsnetworkaccessmanager.h#L80
+-QgsNetworkRequestParameters.requestId: src/core/network/qgsnetworkaccessmanager.h#L90
++QgsNetworkRequestParameters.content: src/core/network/qgsnetworkaccessmanager.h#L97
++QgsNetworkRequestParameters.initiatorClassName: src/core/network/qgsnetworkaccessmanager.h#L107
++QgsNetworkRequestParameters.initiatorRequestId: src/core/network/qgsnetworkaccessmanager.h#L118
++QgsNetworkRequestParameters.operation: src/core/network/qgsnetworkaccessmanager.h#L73
++QgsNetworkRequestParameters.originatingThreadId: src/core/network/qgsnetworkaccessmanager.h#L86
++QgsNetworkRequestParameters.request: src/core/network/qgsnetworkaccessmanager.h#L81
++QgsNetworkRequestParameters.requestId: src/core/network/qgsnetworkaccessmanager.h#L91
+ QgsNetworkRequestParameters: src/core/network/qgsnetworkaccessmanager.h#L47
+ QgsNewsFeedModel.columnCount: src/core/network/qgsnewsfeedmodel.h#L72
+ QgsNewsFeedModel.data: src/core/network/qgsnewsfeedmodel.h#L67
+@@ -12052,22 +12053,22 @@ QgsProcessingFeatureBasedAlgorithm.sourc
+ QgsProcessingFeatureBasedAlgorithm.sourceFlags: src/core/processing/qgsprocessingalgorithm.h#L1271
+ QgsProcessingFeatureBasedAlgorithm.supportInPlaceEdit: src/core/processing/qgsprocessingalgorithm.h#L1224
+ QgsProcessingFeatureBasedAlgorithm: src/core/processing/qgsprocessingalgorithm.h#L1183
+-QgsProcessingFeatureSource.allFeatureIds: src/core/processing/qgsprocessingutils.h#L732
+-QgsProcessingFeatureSource.createExpressionContextScope: src/core/processing/qgsprocessingutils.h#L738
+-QgsProcessingFeatureSource.fields: src/core/processing/qgsprocessingutils.h#L724
+-QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L718
+-QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L722
+-QgsProcessingFeatureSource.hasFeatures: src/core/processing/qgsprocessingutils.h#L720
+-QgsProcessingFeatureSource.hasSpatialIndex: src/core/processing/qgsprocessingutils.h#L733
+-QgsProcessingFeatureSource.invalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L754
+-QgsProcessingFeatureSource.maximumValue: src/core/processing/qgsprocessingutils.h#L730
+-QgsProcessingFeatureSource.minimumValue: src/core/processing/qgsprocessingutils.h#L729
+-QgsProcessingFeatureSource.setInvalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L746
+-QgsProcessingFeatureSource.sourceCrs: src/core/processing/qgsprocessingutils.h#L723
+-QgsProcessingFeatureSource.sourceExtent: src/core/processing/qgsprocessingutils.h#L731
+-QgsProcessingFeatureSource.sourceName: src/core/processing/qgsprocessingutils.h#L727
+-QgsProcessingFeatureSource.wkbType: src/core/processing/qgsprocessingutils.h#L725
+-QgsProcessingFeatureSource: src/core/processing/qgsprocessingutils.h#L692
++QgsProcessingFeatureSource.allFeatureIds: src/core/processing/qgsprocessingutils.h#L752
++QgsProcessingFeatureSource.createExpressionContextScope: src/core/processing/qgsprocessingutils.h#L758
++QgsProcessingFeatureSource.fields: src/core/processing/qgsprocessingutils.h#L744
++QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L738
++QgsProcessingFeatureSource.getFeatures: src/core/processing/qgsprocessingutils.h#L742
++QgsProcessingFeatureSource.hasFeatures: src/core/processing/qgsprocessingutils.h#L740
++QgsProcessingFeatureSource.hasSpatialIndex: src/core/processing/qgsprocessingutils.h#L753
++QgsProcessingFeatureSource.invalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L774
++QgsProcessingFeatureSource.maximumValue: src/core/processing/qgsprocessingutils.h#L750
++QgsProcessingFeatureSource.minimumValue: src/core/processing/qgsprocessingutils.h#L749
++QgsProcessingFeatureSource.setInvalidGeometryCheck: src/core/processing/qgsprocessingutils.h#L766
++QgsProcessingFeatureSource.sourceCrs: src/core/processing/qgsprocessingutils.h#L743
++QgsProcessingFeatureSource.sourceExtent: src/core/processing/qgsprocessingutils.h#L751
++QgsProcessingFeatureSource.sourceName: src/core/processing/qgsprocessingutils.h#L747
++QgsProcessingFeatureSource.wkbType: src/core/processing/qgsprocessingutils.h#L745
++QgsProcessingFeatureSource: src/core/processing/qgsprocessingutils.h#L712
+ QgsProcessingFeatureSourceDefinition.QVariant: src/core/processing/qgsprocessingparameters.h#L188
+ QgsProcessingFeatureSourceDefinition.loadVariant: src/core/processing/qgsprocessingparameters.h#L166
+ QgsProcessingFeatureSourceDefinition.toVariant: src/core/processing/qgsprocessingparameters.h#L158
+@@ -13237,6 +13238,8 @@ QgsProcessingUtils.preprocessQgisProcess
+ QgsProcessingUtils.removePointerValuesFromMap: src/core/processing/qgsprocessingutils.h#L599
+ QgsProcessingUtils.resolveDefaultEncoding: src/core/processing/qgsprocessingutils.h#L618
+ QgsProcessingUtils.stringToPythonLiteral: src/core/processing/qgsprocessingutils.h#L333
++QgsProcessingUtils.supportedImageFileFilters: src/core/processing/qgsprocessingutils.h#L638
++QgsProcessingUtils.supportedImageFormats: src/core/processing/qgsprocessingutils.h#L628
+ QgsProcessingUtils.tempFolder: src/core/processing/qgsprocessingutils.h#L414
+ QgsProcessingUtils.variantToCrs: src/core/processing/qgsprocessingutils.h#L303
+ QgsProcessingUtils.variantToPythonLiteral: src/core/processing/qgsprocessingutils.h#L326
+@@ -19824,6 +19827,7 @@ QgsVectorTileUtils.formatXYZUrlTemplate:
+ QgsVectorTileUtils.loadSprites: src/core/vectortile/qgsvectortileutils.h#L102
+ QgsVectorTileUtils.makeQgisFields: src/core/vectortile/qgsvectortileutils.h#L70
+ QgsVectorTileUtils.makeVectorLayerForTile: src/core/vectortile/qgsvectortileutils.h#L90
++QgsVectorTileUtils.resolveMapboxUri: src/core/vectortile/qgsvectortileutils.h#L109
+ QgsVectorTileUtils.scaleToZoom: src/core/vectortile/qgsvectortileutils.h#L80
+ QgsVectorTileUtils.scaleToZoomLevel: src/core/vectortile/qgsvectortileutils.h#L88
+ QgsVectorTileUtils.sortTilesByDistanceFromCenter: src/core/vectortile/qgsvectortileutils.h#L60
+--- a/python/server/class_map.yaml
++++ b/python/server/class_map.yaml
+@@ -337,23 +337,23 @@ QgsServerRequest.setParameter: src/serve
+ QgsServerRequest.setUrl: src/server/qgsserverrequest.h#L192
+ QgsServerRequest.url: src/server/qgsserverrequest.h#L115
+ QgsServerRequest: src/server/qgsserverrequest.h#L34
+-QgsServerResponse.clear: src/server/qgsserverresponse.h#L173
+-QgsServerResponse.data: src/server/qgsserverresponse.h#L184
+-QgsServerResponse.feedback: src/server/qgsserverresponse.h#L197
+-QgsServerResponse.finish: src/server/qgsserverresponse.h#L159
+-QgsServerResponse.flush: src/server/qgsserverresponse.h#L168
+-QgsServerResponse.header: src/server/qgsserverresponse.h#L63
+-QgsServerResponse.headersSent: src/server/qgsserverresponse.h#L73
+-QgsServerResponse.io: src/server/qgsserverresponse.h#L154
+-QgsServerResponse.removeHeader: src/server/qgsserverresponse.h#L58
+-QgsServerResponse.sendError: src/server/qgsserverresponse.h#L96
+-QgsServerResponse.setHeader: src/server/qgsserverresponse.h#L52
+-QgsServerResponse.setStatusCode: src/server/qgsserverresponse.h#L80
+-QgsServerResponse.statusCode: src/server/qgsserverresponse.h#L85
+-QgsServerResponse.truncate: src/server/qgsserverresponse.h#L191
+-QgsServerResponse.write: src/server/qgsserverresponse.h#L103
+-QgsServerResponse.write: src/server/qgsserverresponse.h#L111
+-QgsServerResponse.write: src/server/qgsserverresponse.h#L149
++QgsServerResponse.clear: src/server/qgsserverresponse.h#L175
++QgsServerResponse.data: src/server/qgsserverresponse.h#L186
++QgsServerResponse.feedback: src/server/qgsserverresponse.h#L199
++QgsServerResponse.finish: src/server/qgsserverresponse.h#L161
++QgsServerResponse.flush: src/server/qgsserverresponse.h#L170
++QgsServerResponse.header: src/server/qgsserverresponse.h#L64
++QgsServerResponse.headersSent: src/server/qgsserverresponse.h#L75
++QgsServerResponse.io: src/server/qgsserverresponse.h#L156
++QgsServerResponse.removeHeader: src/server/qgsserverresponse.h#L59
++QgsServerResponse.sendError: src/server/qgsserverresponse.h#L98
++QgsServerResponse.setHeader: src/server/qgsserverresponse.h#L53
++QgsServerResponse.setStatusCode: src/server/qgsserverresponse.h#L82
++QgsServerResponse.statusCode: src/server/qgsserverresponse.h#L87
++QgsServerResponse.truncate: src/server/qgsserverresponse.h#L193
++QgsServerResponse.write: src/server/qgsserverresponse.h#L105
++QgsServerResponse.write: src/server/qgsserverresponse.h#L113
++QgsServerResponse.write: src/server/qgsserverresponse.h#L151
+ QgsServerResponse: src/server/qgsserverresponse.h#L41
+ QgsServerSettings.allowedExtraSqlTokens: src/server/qgsserversettings.h#L350
+ QgsServerSettings.apiResourcesDirectory: src/server/qgsserversettings.h#L252


=====================================
debian/patches/series
=====================================
@@ -2,3 +2,4 @@ developersmap-use-debian-package.patch
 exclude-elvensword-resources.patch
 exclude-cc-by-nc-resources.patch
 spelling-errors.patch
+pr67016-sip6.11.patch



View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/compare/5e34b622e5e229541cdfd720c66e574cae2db13b...a899d17f3331c61c87b61c47cb5e768d9abef0a2

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/compare/5e34b622e5e229541cdfd720c66e574cae2db13b...a899d17f3331c61c87b61c47cb5e768d9abef0a2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/d583ec31/attachment-0001.htm>

From ftpmaster at ftp-master.debian.org  Wed Aug 12 13:22:09 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Wed, 12 Aug 2026 12:22:09 +0000
Subject: Processing of qgis_3.44.13+dfsg-2_source.changes
Message-ID: <E1wu7yD-005c56-0E@usper.debian.org>

qgis_3.44.13+dfsg-2_source.changes uploaded successfully to localhost
along with the files:
  qgis_3.44.13+dfsg-2.dsc
  qgis_3.44.13+dfsg-2.debian.tar.xz
  qgis_3.44.13+dfsg-2_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Wed Aug 12 13:34:28 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Wed, 12 Aug 2026 12:34:28 +0000
Subject: qgis_3.44.13+dfsg-2_source.changes ACCEPTED into unstable
Message-ID: <E1wu8A8-0000000AdBe-4ADv@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Wed, 12 Aug 2026 12:44:54 +0200
Source: qgis
Architecture: source
Version: 3.44.13+dfsg-2
Distribution: unstable
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Closes: 1143800
Changes:
 qgis (3.44.13+dfsg-2) unstable; urgency=medium
 .
   * Add upstream patch to fix FTBFS with SIP 6.11.
     (closes: #1143800)
Checksums-Sha1:
 aea74c0cb274e5d47dcd82c2abe75b08a7ad2179 5365 qgis_3.44.13+dfsg-2.dsc
 1771a26adc55603d32280760ab26f9fa5a58d513 136748 qgis_3.44.13+dfsg-2.debian.tar.xz
 d7388dc9aa0f5329e411aacfe950e128ff4d7e34 44487 qgis_3.44.13+dfsg-2_amd64.buildinfo
Checksums-Sha256:
 dbf03f9a376ec28874c13539a56706d9d71df884f790ede3687921aa72520962 5365 qgis_3.44.13+dfsg-2.dsc
 253e60be54e2b407d6d74b614875e09c65efaa67e4412d97da6e983c7cfbb59e 136748 qgis_3.44.13+dfsg-2.debian.tar.xz
 ecfb378d9ea9dae4dfbf621184179eff62e1d583dd1b086287813fb3a2704bd0 44487 qgis_3.44.13+dfsg-2_amd64.buildinfo
Files:
 5fcdac5e6d36f4181aab033eb6242ed2 5365 science optional qgis_3.44.13+dfsg-2.dsc
 ae96fcbf4407cd08dea9f7a101262d0a 136748 science optional qgis_3.44.13+dfsg-2.debian.tar.xz
 0b4637cb453005454d46c37bc8270abd 44487 science optional qgis_3.44.13+dfsg-2_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmp8YqAACgkQZ1DxCuiN
SvG9Jw//Vw20J2+rwdO/281Han/9YK59CyuZjQJt2poxMyvipJP71Hvf06fP9YPM
zOGwmqMtm5NUSH/vRpkYTWqtyLzNwsPP+tfdCRlBf42J7LO/+G5N9DusJhdY68VE
JZmMXpMa6kV39wQ9PTyLy3lwzQ2s+1G8J73xghh9W60s6LWsIR2vD8KkeNtP2yni
X3dF5P5ZvOasU75BZKhYh6YWhEsCspw5cRgPk2UpH68WjQgqccfsXsYeBS9tQFix
4lCfqp+CyPnuY49/PoUw0uYDxLa+DeyEUECBIv80r6qa18RZwzbGNR4wndYqEHhl
w+8ENOhixE+dAtOext3577zfrwK0WluvYyb+zeaT+PxRqbaVhHoIDtHxpp3PNEXz
jno2tE+qr3iLjc3MMF0REekEGAAf3zGa8SYpYHj7z7tFyQLfXeoaNHj9PuNOa/jQ
rdnN8ZU9CcTtPMlAKGirAsS54ANekfT17u2x3ZYHbxUSmmZPEtZ0sEAYZG26xA/G
C9VR/VEIgdYQOGpdoWdfUDXBzH4lo4WIh/mkXMymiYjAa3/DShjpcin3nLQ8ZH3z
oHFEt5xoP7IPZUCnx9AgAUKsgfg2tSuGNKh8O6nhLio5ZniTPuNdCl84eL7KejMg
p48LvO/fCwFKIj9eNEKPeeKf0nDbj0UNCYjdOqA05gs3qa2VBd4=
=X2CO
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/bbe4af61/attachment.sig>

From owner at bugs.debian.org  Wed Aug 12 13:35:04 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Wed, 12 Aug 2026 12:35:04 +0000
Subject: Bug#1143800: marked as done (qgis: FTBFS: the mapped type result
 needs an assignment operator or be movable)
References: <E1wu8A9-0000000AdBn-0IG3@fasolo.debian.org>
 <E1wrvMq-000Hkf-09@paradis.debian.org>
Message-ID: <handler.1143800.D1143800.17865380713357656.ackdone@bugs.debian.org>

Your message dated Wed, 12 Aug 2026 12:34:29 +0000
with message-id <E1wu8A9-0000000AdBn-0IG3 at fasolo.debian.org>
and subject line Bug#1143800: fixed in qgis 3.44.13+dfsg-2
has caused the Debian Bug report #1143800,
regarding qgis: FTBFS: the mapped type result needs an assignment operator or be movable
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner at bugs.debian.org
immediately.)


-- 
1143800: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1143800
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems
-------------- next part --------------
An embedded message was scrubbed...
From: Santiago Vila <sanvila at debian.org>
Subject: qgis: FTBFS: the mapped type result needs an assignment operator or be movable
Date: Thu, 06 Aug 2026 10:30:28 +0000
Size: 18831
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/8fd11911/attachment-0002.eml>
-------------- next part --------------
An embedded message was scrubbed...
From: Debian FTP Masters <ftpmaster at ftp-master.debian.org>
Subject: Bug#1143800: fixed in qgis 3.44.13+dfsg-2
Date: Wed, 12 Aug 2026 12:34:29 +0000
Size: 6638
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260812/8fd11911/attachment-0003.eml>

From gitlab at salsa.debian.org  Thu Aug 13 04:18:11 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 03:18:11 +0000
Subject: [Git][debian-gis-team/geos][experimental] 6 commits: New upstream
 version 3.15.0~beta3
Message-ID: <6a7d377384545_537703627015517c0@godard.mail>



Bas Couwenberg pushed to branch experimental at Debian GIS Project / geos


Commits:
5b4b946c by Bas Couwenberg at 2026-08-13T04:52:10+02:00
New upstream version 3.15.0~beta3
- - - - -
ca3b8797 by Bas Couwenberg at 2026-08-13T04:52:17+02:00
Update upstream source from tag 'upstream/3.15.0_beta3'

Update to upstream version '3.15.0~beta3'
with Debian dir 71c8610714f9172a2e54f7aed1eb9363b85fc038
- - - - -
eef8889c by Bas Couwenberg at 2026-08-13T04:55:47+02:00
New upstream beta release.

- - - - -
f42258bf by Bas Couwenberg at 2026-08-13T04:57:01+02:00
Update symbols for other architectures.

- - - - -
bf8ffdef by Bas Couwenberg at 2026-08-13T05:07:33+02:00
Update symbols for amd64.

- - - - -
7156311b by Bas Couwenberg at 2026-08-13T05:07:33+02:00
Set distribution to experimental.

- - - - -


38 changed files:

- NEWS.md
- Version.txt
- capi/geos_ts_c.cpp
- debian/changelog
- debian/libgeos-c1t64.symbols
- debian/libgeos3.15.0.symbols
- include/geos/geom/CircularArc.h
- include/geos/geom/CircularString.h
- include/geos/geom/CompoundCurve.h
- include/geos/geom/CurvePolygon.h
- include/geos/geom/Geometry.h
- include/geos/geom/MultiCurve.h
- include/geos/geom/MultiSurface.h
- + include/geos/noding/DirectionIndependentArcString.h
- release.md
- src/algorithm/CircularArcIntersector.cpp
- src/algorithm/RayCrossingCounter.cpp
- src/geom/CircularArc.cpp
- src/geom/CircularString.cpp
- src/geom/Geometry.cpp
- src/geom/GeometryFactory.cpp
- + src/noding/DirectionIndependentArcString.cpp
- src/noding/GeometryNoder.cpp
- src/operation/polygonize/EdgeRing.cpp
- src/operation/split/GeometrySplitter.cpp
- src/operation/valid/IsSimpleOp.cpp
- tests/unit/algorithm/LocatePointInRingTest.cpp
- tests/unit/algorithm/locate/SimplePointInAreaLocatorTest.cpp
- tests/unit/capi/GEOSNodeTest.cpp
- tests/unit/capi/GEOSSplitTest.cpp
- tests/unit/geom/Geometry/normalizeTest.cpp
- tests/unit/geom/GeometryFactoryTest.cpp
- + tests/unit/noding/DirectionIndependentArcStringTest.cpp
- tests/unit/operation/polygonize/PolygonizeTest.cpp
- tests/unit/operation/split/GeometrySplitterTest.cpp
- tests/unit/operation/valid/IsSimpleOpTest.cpp
- tests/xmltester/tests/general/TestOverlayCurvesAA.xml
- + tests/xmltester/tests/general/TestOverlayCurvesLA.xml


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/compare/76cf00c462d9564b9214c321821d45fd266fa9ff...7156311b3cb8a01c6b4f98c4d891c873b36a9975

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/compare/76cf00c462d9564b9214c321821d45fd266fa9ff...7156311b3cb8a01c6b4f98c4d891c873b36a9975
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/7799b53e/attachment.htm>

From gitlab at salsa.debian.org  Thu Aug 13 04:18:13 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 03:18:13 +0000
Subject: [Git][debian-gis-team/geos][pristine-tar] pristine-tar data for
 geos_3.15.0~beta3.orig.tar.bz2
Message-ID: <6a7d3775a5ede_5376866e6415519a9@godard.mail>



Bas Couwenberg pushed to branch pristine-tar at Debian GIS Project / geos


Commits:
265443a3 by Bas Couwenberg at 2026-08-13T04:52:17+02:00
pristine-tar data for geos_3.15.0~beta3.orig.tar.bz2

- - - - -


2 changed files:

- + geos_3.15.0~beta3.orig.tar.bz2.delta
- + geos_3.15.0~beta3.orig.tar.bz2.id


Changes:

=====================================
geos_3.15.0~beta3.orig.tar.bz2.delta
=====================================
Binary files /dev/null and b/geos_3.15.0~beta3.orig.tar.bz2.delta differ


=====================================
geos_3.15.0~beta3.orig.tar.bz2.id
=====================================
@@ -0,0 +1 @@
+c728ac35af29c4954d63a2e67de97c53cf50b5ff



View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/commit/265443a33ca4088c463cc116b9a6fdb9df430c51

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/commit/265443a33ca4088c463cc116b9a6fdb9df430c51
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/da040fd8/attachment.htm>

From gitlab at salsa.debian.org  Thu Aug 13 04:18:14 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 03:18:14 +0000
Subject: [Git][debian-gis-team/geos][upstream] New upstream version
 3.15.0~beta3
Message-ID: <6a7d3776ab908_537a77f5d8155212a@godard.mail>



Bas Couwenberg pushed to branch upstream at Debian GIS Project / geos


Commits:
5b4b946c by Bas Couwenberg at 2026-08-13T04:52:10+02:00
New upstream version 3.15.0~beta3
- - - - -


35 changed files:

- NEWS.md
- Version.txt
- capi/geos_ts_c.cpp
- include/geos/geom/CircularArc.h
- include/geos/geom/CircularString.h
- include/geos/geom/CompoundCurve.h
- include/geos/geom/CurvePolygon.h
- include/geos/geom/Geometry.h
- include/geos/geom/MultiCurve.h
- include/geos/geom/MultiSurface.h
- + include/geos/noding/DirectionIndependentArcString.h
- release.md
- src/algorithm/CircularArcIntersector.cpp
- src/algorithm/RayCrossingCounter.cpp
- src/geom/CircularArc.cpp
- src/geom/CircularString.cpp
- src/geom/Geometry.cpp
- src/geom/GeometryFactory.cpp
- + src/noding/DirectionIndependentArcString.cpp
- src/noding/GeometryNoder.cpp
- src/operation/polygonize/EdgeRing.cpp
- src/operation/split/GeometrySplitter.cpp
- src/operation/valid/IsSimpleOp.cpp
- tests/unit/algorithm/LocatePointInRingTest.cpp
- tests/unit/algorithm/locate/SimplePointInAreaLocatorTest.cpp
- tests/unit/capi/GEOSNodeTest.cpp
- tests/unit/capi/GEOSSplitTest.cpp
- tests/unit/geom/Geometry/normalizeTest.cpp
- tests/unit/geom/GeometryFactoryTest.cpp
- + tests/unit/noding/DirectionIndependentArcStringTest.cpp
- tests/unit/operation/polygonize/PolygonizeTest.cpp
- tests/unit/operation/split/GeometrySplitterTest.cpp
- tests/unit/operation/valid/IsSimpleOpTest.cpp
- tests/xmltester/tests/general/TestOverlayCurvesAA.xml
- + tests/xmltester/tests/general/TestOverlayCurvesLA.xml


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/commit/5b4b946c367a5732527d4ddb4dafd5a6083f5a0d

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/commit/5b4b946c367a5732527d4ddb4dafd5a6083f5a0d
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/689c3a44/attachment-0001.htm>

From gitlab at salsa.debian.org  Thu Aug 13 04:18:17 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 03:18:17 +0000
Subject: [Git][debian-gis-team/geos] Pushed new tag debian/3.15.0_beta3-1_exp1
Message-ID: <6a7d3779908d2_537a54f47015523e3@godard.mail>



Bas Couwenberg pushed new tag debian/3.15.0_beta3-1_exp1 at Debian GIS Project / geos

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/tree/debian/3.15.0_beta3-1_exp1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/95235748/attachment.htm>

From gitlab at salsa.debian.org  Thu Aug 13 04:18:19 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 03:18:19 +0000
Subject: [Git][debian-gis-team/geos] Pushed new tag upstream/3.15.0_beta3
Message-ID: <6a7d377b14df6_53765ae06415525dd@godard.mail>



Bas Couwenberg pushed new tag upstream/3.15.0_beta3 at Debian GIS Project / geos

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/geos/-/tree/upstream/3.15.0_beta3
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/601ff303/attachment.htm>

From ftpmaster at ftp-master.debian.org  Thu Aug 13 04:25:25 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Thu, 13 Aug 2026 03:25:25 +0000
Subject: Processing of geos_3.15.0~beta3-1~exp1_source.changes
Message-ID: <E1wuM4L-006Ct4-2s@usper.debian.org>

geos_3.15.0~beta3-1~exp1_source.changes uploaded successfully to localhost
along with the files:
  geos_3.15.0~beta3-1~exp1.dsc
  geos_3.15.0~beta3.orig.tar.bz2
  geos_3.15.0~beta3-1~exp1.debian.tar.xz
  geos_3.15.0~beta3-1~exp1_amd64.buildinfo

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Thu Aug 13 04:37:27 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Thu, 13 Aug 2026 03:37:27 +0000
Subject: geos_3.15.0~beta3-1~exp1_source.changes ACCEPTED into experimental
Message-ID: <E1wuMFz-0000000DT64-3PuC@fasolo.debian.org>

Thank you for your contribution to Debian.



Accepted:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Thu, 13 Aug 2026 04:57:55 +0200
Source: geos
Architecture: source
Version: 3.15.0~beta3-1~exp1
Distribution: experimental
Urgency: medium
Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
Changed-By: Bas Couwenberg <sebastic at debian.org>
Changes:
 geos (3.15.0~beta3-1~exp1) experimental; urgency=medium
 .
   * New upstream beta release.
   * Update symbols for other architectures.
Checksums-Sha1:
 4e09a3fbea9e8e14e85054fd631bf49ab6ded742 2390 geos_3.15.0~beta3-1~exp1.dsc
 67f6864a75b2a59df9a83b1fb7e09d259db0b824 7120544 geos_3.15.0~beta3.orig.tar.bz2
 fa2303623494433e611e98de5b61dc57e8a940c8 84024 geos_3.15.0~beta3-1~exp1.debian.tar.xz
 806fd5484bdf3ae2b097eda34cc9b3a09683c78e 11529 geos_3.15.0~beta3-1~exp1_amd64.buildinfo
Checksums-Sha256:
 29e067b56a4ac6718a1df64bf4cd3b1447fb94dbae441d866f279dd963f35584 2390 geos_3.15.0~beta3-1~exp1.dsc
 439a1eb81c49680475c65a9a75280de3d5f74bd835e0022b4ffc7e456c148560 7120544 geos_3.15.0~beta3.orig.tar.bz2
 70aea181034ede85d296ade8478ee28ee94a6719add7e7cb4968fc8d73d59f97 84024 geos_3.15.0~beta3-1~exp1.debian.tar.xz
 bdd1984d38879758ed6c431a9f907b784bc0abf3663215537c331625112e5a7a 11529 geos_3.15.0~beta3-1~exp1_amd64.buildinfo
Files:
 1fd7a8d2d3eef61bcf7e6babf81041c6 2390 science optional geos_3.15.0~beta3-1~exp1.dsc
 3643982b792334018586d4ec87d5a174 7120544 science optional geos_3.15.0~beta3.orig.tar.bz2
 d6a7f579004a379093ac8302e2bdb303 84024 science optional geos_3.15.0~beta3-1~exp1.debian.tar.xz
 1b9aac2bcfe73270036210b5e99177ed 11529 science optional geos_3.15.0~beta3-1~exp1_amd64.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgYLeQXBWQI1hRlDRZ1DxCuiNSvEFAmp9N2EACgkQZ1DxCuiN
SvFXbw//RHC7kGRt6SMo6Z5Z/3vcO9dOkdlVpFLExTFoFBkPv9E2dFSBtbLdrQsw
ilnb8gh2Y+GjUImOMz1MkWw5q2X/j3xg48pK7D6eAiuVFg33UVpVOo0Qh765XjZE
wnZSXVU3CKBNcZhRfPlc1qG3G7VmvUaUHPAzWbiEeTFCccCvA2x8GVQH0Co9HsUX
4GAVAkVCqkDnlOfCNw+j0vFTbOfFwtzAN5yc89K8PWygURLjNAIoRhfpHds+Da91
fn+bd8Mc9IygRdSMY8QFSc7yPjS0594o3tgYUBiIAF4oXXXJM4uO58mWkOqMiQNl
Ft9e6QTl1FQtFWEbvXum/sOxxJ+Ci1CO/VVWG3cMysJA1qj2iG06L+t/VSdwYUtu
ZIJb0Kz3fZ/RCzo/Xkj1vGIM0P1/gIC67xnpC7nRNyq+WupX2xJSPywLKuByb2UR
qjf6nPyNf0t2XLe2CeYV0G6L5XxbK0YSpQ0/f+M9/GmPo56ZZfp4Zo41xVqlppap
b35RHJ+vjeTaYFXH3X/UkqrkUcgn2iPCEC1M3iJq+X3jch+flGVKJ4ui4obTB+a7
ioUfYlFjrMwo9TBCHyUJnjg5LjTyCAUATXqQG/CrkdCGhwnG4noIm+sx/niFsnLg
O01eIxCONi0Hcm3BgD16RAaOtQDM590fLV4KLnz12tvjGfIgcG8=
=B6/O
-----END PGP SIGNATURE-----

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/8cf31753/attachment.sig>

From noreply at release.debian.org  Thu Aug 13 05:39:14 2026
From: noreply at release.debian.org (Debian testing watch)
Date: Thu, 13 Aug 2026 04:39:14 +0000
Subject: gmtsar 6.7+ds-2 MIGRATED to testing
Message-ID: <E1wuNDm-00000008RXG-3Kkr@respighi.debian.org>

FYI: The status of the gmtsar source package
in Debian's testing distribution has changed.

  Previous version: 6.7+ds-1
  Current version:  6.7+ds-2

-- 
This email is automatically generated once a day.  As the installation of
new packages into testing happens multiple times a day you will receive
later changes on the next day.
See https://release.debian.org/testing-watch/ for more information.


From noreply at release.debian.org  Thu Aug 13 05:39:41 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Thu, 13 Aug 2026 04:39:41 +0000
Subject: rasterio is marked for autoremoval from testing
Message-ID: <E1wuNED-00000008Rlp-3His@respighi.debian.org>

rasterio 1.5.1-1 is marked for autoremoval from testing on 2026-09-05

It (build-)depends on packages with these RC bugs:
1128867: chromium: FTBFS with glibc 2.43 due to SYS_SECCOMP symbol collision
 https://bugs.debian.org/1128867
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1141793: node-yarnpkg: FTBFS: RollupError: Could not resolve "./libzipSync" from "../yarnpkg-libzip/sources/sync.ts"
 https://bugs.debian.org/1141793
1143321: httpcore: FTBFS: E   ModuleNotFoundError: No module named 'certifi'
 https://bugs.debian.org/1143321
1143345: node-ipydatagrid: FTBFS: dh_auto_build: error: cd ./bqplot/js && sh -ex ../../debian/nodejs/bqplot/js/build returned exit code 1
 https://bugs.debian.org/1143345
1143428: towncrier: FTBFS: E   twisted.trial.unittest.FailTest: 0 != 1 : Loading template...
 https://bugs.debian.org/1143428



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From noreply at release.debian.org  Thu Aug 13 05:39:46 2026
From: noreply at release.debian.org (Debian testing autoremoval watch)
Date: Thu, 13 Aug 2026 04:39:46 +0000
Subject: stac-validator is marked for autoremoval from testing
Message-ID: <E1wuNEI-00000008Rm5-1WXF@respighi.debian.org>

stac-validator 4.5.2-1 is marked for autoremoval from testing on 2026-09-05

It (build-)depends on packages with these RC bugs:
1128867: chromium: FTBFS with glibc 2.43 due to SYS_SECCOMP symbol collision
 https://bugs.debian.org/1128867
1135849: node-playwright: playwright crashes at invocation
 https://bugs.debian.org/1135849
1138720: node-playwright: FTBFS: [ERROR] No matching export in "../../../../../../../usr/share/nodejs/rimraf/dist/esm/index.js" for import "default"
 https://bugs.debian.org/1138720
1141793: node-yarnpkg: FTBFS: RollupError: Could not resolve "./libzipSync" from "../yarnpkg-libzip/sources/sync.ts"
 https://bugs.debian.org/1141793
1143321: httpcore: FTBFS: E   ModuleNotFoundError: No module named 'certifi'
 https://bugs.debian.org/1143321
1143345: node-ipydatagrid: FTBFS: dh_auto_build: error: cd ./bqplot/js && sh -ex ../../debian/nodejs/bqplot/js/build returned exit code 1
 https://bugs.debian.org/1143345
1143428: towncrier: FTBFS: E   twisted.trial.unittest.FailTest: 0 != 1 : Loading template...
 https://bugs.debian.org/1143428
1143752: fastapi: FTBFS: E   ModuleNotFoundError: No module named 'httpx2'
 https://bugs.debian.org/1143752



For more information on the autoremoval process, including hints to prevent
autoremoval can be found on the wiki: https://wiki.debian.org/Autoremoval

This mail is generated by:
https://salsa.debian.org/release-team/release-tools/-/blob/master/mailer/mail_autoremovals.pl

Autoremoval data is generated by:
https://salsa.debian.org/qa/udd/-/blob/master/udd/testing_autoremovals_gatherer.pl


From gitlab at salsa.debian.org  Thu Aug 13 11:31:25 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Thu, 13 Aug 2026 10:31:25 +0000
Subject: [Git][debian-gis-team/pystac][master] 8 commits: Update pattern for
 GitHub archive URLs in d/watch.
Message-ID: <6a7d9cfd4e2cd_537765c0a01628450@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / pystac


Commits:
cfba37dd by Antonio Valentino at 2026-08-13T09:32:16+00:00
Update pattern for GitHub archive URLs in d/watch.

Changes-By: lintian-brush

- - - - -
56f8a065 by Antonio Valentino at 2026-08-13T09:32:32+00:00
Switch off verbose messages in d/rules

- - - - -
eac860ab by Antonio Valentino at 2026-08-13T09:52:27+00:00
Drop 0004-allow-warnings.patch

- - - - -
d535043f by Antonio Valentino at 2026-08-13T09:52:27+00:00
New 0005-noproxy.patch

- - - - -
85666976 by Antonio Valentino at 2026-08-13T10:25:37+00:00
python3-pystac-core Replaces: python3-pystac (<< 1.15)

- - - - -
7f6572da by Antonio Valentino at 2026-08-13T10:25:40+00:00
Drop packages for stac extensions and pytest-pystac

- - - - -
3e469230 by Antonio Valentino at 2026-08-13T10:25:40+00:00
Set distribution to unstable

- - - - -
fd09f6b3 by Antonio Valentino at 2026-08-13T10:26:16+00:00
Add d/py3dist-overrides

- - - - -


32 changed files:

- debian/changelog
- debian/control
- ? debian/patches/0004-allow-warnings.patch
- debian/patches/0005-fix-sphinx-config.patch ? debian/patches/0004-fix-sphinx-config.patch
- + debian/patches/0005-noproxy.patch
- debian/patches/series
- + debian/py3dist-overrides
- ? debian/python3-pystac-ext-classification.install
- ? debian/python3-pystac-ext-datacube.install
- ? debian/python3-pystac-ext-eo.install
- ? debian/python3-pystac-ext-file.install
- ? debian/python3-pystac-ext-grid.install
- ? debian/python3-pystac-ext-item-assets.install
- ? debian/python3-pystac-ext-label.install
- ? debian/python3-pystac-ext-mgrs.install
- ? debian/python3-pystac-ext-mlm.install
- ? debian/python3-pystac-ext-pointcloud.install
- ? debian/python3-pystac-ext-projection.install
- ? debian/python3-pystac-ext-raster.install
- ? debian/python3-pystac-ext-render.install
- ? debian/python3-pystac-ext-sar.install
- ? debian/python3-pystac-ext-sat.install
- ? debian/python3-pystac-ext-scientific.install
- ? debian/python3-pystac-ext-storage.install
- ? debian/python3-pystac-ext-table.install
- ? debian/python3-pystac-ext-timestamps.install
- ? debian/python3-pystac-ext-version.install
- ? debian/python3-pystac-ext-view.install
- ? debian/python3-pystac-ext-xarray-assets.install
- debian/python3-pystac.install
- debian/rules
- debian/watch


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/compare/23b5f7e738b94bee8a8bcd9d02f7a52358583592...fd09f6b32f523f6b53b5426e5c6ac90c8044629f

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/compare/23b5f7e738b94bee8a8bcd9d02f7a52358583592...fd09f6b32f523f6b53b5426e5c6ac90c8044629f
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/93e10563/attachment.htm>

From gitlab at salsa.debian.org  Thu Aug 13 18:19:44 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Thu, 13 Aug 2026 17:19:44 +0000
Subject: [Git][debian-gis-team/pystac][master] Fix d/watch
Message-ID: <6a7dfcb0a5def_53767b9df41744972@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / pystac


Commits:
7689c878 by Antonio Valentino at 2026-08-13T17:16:21+00:00
Fix d/watch

- - - - -


1 changed file:

- debian/watch


Changes:

=====================================
debian/watch
=====================================
@@ -1,8 +1,10 @@
 version=4
 opts=\
 pgpmode=none,\
+searchmode=plain,\
 dversionmangle=s/\+(debian|dfsg|ds|deb)\d*$//,\
 uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|c|beta|b|alpha|a)\.?\d*)$/$1~$2/;s/RC/rc/;s/rc\./rc/;s/\-/\./g,\
-filenamemangle=s/(?:.*?)?(?:rel|v|@PACKAGE@)?[\-\_]?(\d\S*)\.(tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))/@PACKAGE at -$1.$2/ \
-https://github.com/stac-utils/pystac/tags \
-(?:.*?/archive/refs/tags/(?:.*?/)?)?(?:rel|v|@PACKAGE@)?[\-\_]?(\d\S*)\.(?:tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))
+downloadurlmangle=s:tags:tarball/refs/tags/:g,\
+filenamemangle=s/(?:.*?)?(?:rel|v|@PACKAGE@)?[\-\_]?(\d\S*)/@PACKAGE at -$1.tar.gz/ \
+https://api.github.com/repos/stac-utils/pystac/tags \
+(?:https://api.github.com/)?(?:repos/stac-utils/pystac/tarball/refs/tags/)?v at ANY_VERSION@ 



View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/7689c878fdd1e0c6e6f25604459d714d46f865a9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/7689c878fdd1e0c6e6f25604459d714d46f865a9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/ad8edb05/attachment.htm>

From gitlab at salsa.debian.org  Thu Aug 13 18:43:38 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Thu, 13 Aug 2026 17:43:38 +0000
Subject: [Git][debian-gis-team/pystac][master] Versioned dependency of pystac
 on pystac-core
Message-ID: <6a7e024a48d1c_53766f6e08174706@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / pystac


Commits:
3f1f5c55 by Antonio Valentino at 2026-08-13T17:43:15+00:00
Versioned dependency of pystac on pystac-core

- - - - -


1 changed file:

- debian/control


Changes:

=====================================
debian/control
=====================================
@@ -69,7 +69,8 @@ Description: ${source:Synopsis} - core
 
 Package: python3-pystac
 Architecture: all
-Depends: ${python3:Depends},
+Depends: python3-pystac-core (= ${source:Version}),
+         ${python3:Depends},
          ${misc:Depends}
 Recommends: python3-jinja2,
             python3-jsonschema,



View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/3f1f5c55aba7031bd15a2f0e9b59661fd4fcda09

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/3f1f5c55aba7031bd15a2f0e9b59661fd4fcda09
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/ce690833/attachment-0001.htm>

From antonio.valentino at tiscali.it  Thu Aug 13 18:45:07 2026
From: antonio.valentino at tiscali.it (Antonio Valentino)
Date: Thu, 13 Aug 2026 19:45:07 +0200
Subject: pystac upstream split
In-Reply-To: <46cf9c10-89f8-4e60-a1db-7fa9aeae7213@xs4all.nl>
References: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>
 <e76ab300-1d4f-4552-a47a-3cd079dfe51c@xs4all.nl>
 <b79d6c54-62ad-4df5-b533-870977c0bfd7@tiscali.it>
 <46cf9c10-89f8-4e60-a1db-7fa9aeae7213@xs4all.nl>
Message-ID: <8ee01668-0840-4787-aee6-2976d38a4eac@tiscali.it>

Dear Bas,

Il 12/08/26 07:10, Sebastiaan Couwenberg ha scritto:
> On 8/11/26 10:48 PM, Antonio Valentino wrote:
>> Dear Bas,

[...]

>>>> This is an issue for the current implementation because all the 
>>>> debian packages now have the same version.
>>>> Do you know if it is possible to control the version of the 
>>>> individual packages generated form the same source tarball?
>>>
>>> Binary packages don't have to use the same version of the source 
>>> package, this can sometimes be used instead of an epoch.
>>
>> How can I do it?
> 
> Using substvars in d/control, e.g:
> 
>  ?Package: pystac-ext-eo
>  ?Version: ${pystac-ext-eo:Version}
> 
> and generating the pystac-ext-eo.substvars file in d/rules using 
> the .toml files.
> 
> https://www.debian.org/doc/debian-policy/ch-source.html#variable- 
> substitutions-debian-substvars

thanks

[...]

>>>> Unless you have a different advice, I think that the cleanest 
>>>> solution would be to have 25 independent packages and to get the 
>>>> source tarballs from PyPI.
>>>
>>> My gut feeling right now is that we don't want all of these separate 
>>> extension packages, but I don't have enough information to formulate 
>>> what I think would be the best solution.
>>
>> For the time being I would like to keep the single source package.
>> Probably it is also a good idea to have only
>>
>> python3-pystac-core
>> python3-pystac (which includes all the extensions and depends on 
>> pystac-core)
> 
> May rename it to python3-pystac-extensions if it only contains those.
> 
> That could also be split into its own source package which bundles all 
> the extension like nodejs packages do (using the checksum version and 
> multiple upstream tarballs).
> 
> https://wiki.debian.org/Javascript/GroupSourcesTutorial


The upstream pystac is mostly a virtual package depending on all the 
extensions. It only provides a single python module: 
pystac/extensions/ext.py.

The debian version now provides the entire content of the 
pystac/extensions sub-package.

I decided to keep the name such that packages currently depending on 
pystac keep working.

>> python3-pystac-doc
>>
>> python3-pytest-pystac would also be needed for autopkgtests
>> This one would be the only one with a mismatch between the debian 
>> package version and the python package version.
> 
> pytest-pystac also doesn't have tags in the upstream repo, unlike core 
> and the extensions. Possibly because it hasn't been blessed as stable yet.

I managed to remove also the pytest-pystac package (it is only used at 
build time and in autopkgtest)

The only new package now is python3-pystac-core.


Please feel free to review an upload.


kind regards
-- 
Antonio Valentino



From gitlab at salsa.debian.org  Thu Aug 13 19:00:47 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 18:00:47 +0000
Subject: [Git][debian-gis-team/gdal][experimental] 13 commits: Revert "Update
 branch in gbp.conf & Vcs-Git URL."
Message-ID: <6a7e064f4e23a_537765c0a017523b2@godard.mail>



Bas Couwenberg pushed to branch experimental at Debian GIS Project / gdal


Commits:
b45e4d68 by Bas Couwenberg at 2026-07-22T15:14:50+02:00
Revert "Update branch in gbp.conf & Vcs-Git URL."

This reverts commit ee140950b31dbd876f74b11c7eef156081352a2e.

- - - - -
381ed76d by Bas Couwenberg at 2026-07-22T15:15:51+02:00
Update symbols for other architectures.

- - - - -
38590f5c by Bas Couwenberg at 2026-07-22T15:18:23+02:00
Strip pre-releases from symbols version.

- - - - -
af7c823c by Bas Couwenberg at 2026-07-22T15:18:35+02:00
New upstream version 3.13.2+dfsg
- - - - -
4807eea7 by Bas Couwenberg at 2026-07-22T15:18:48+02:00
Update upstream source from tag 'upstream/3.13.2+dfsg'

Update to upstream version '3.13.2+dfsg'
with Debian dir 53cf4ce2faa56b233813ce299e8198bedcb5a362
- - - - -
9eab173c by Bas Couwenberg at 2026-07-22T15:19:03+02:00
New upstream release.

- - - - -
74ed2571 by Bas Couwenberg at 2026-07-22T15:20:04+02:00
Set distribution to unstable.

- - - - -
8c14404f by Bas Couwenberg at 2026-08-05T20:51:31+02:00
Drop KML support, libkml is dead upstream.

- - - - -
b818f01b by Bas Couwenberg at 2026-08-05T20:52:18+02:00
Update lintian overrides.

- - - - -
7d7f2353 by Bas Couwenberg at 2026-08-13T18:11:37+02:00
Update branch in gbp.conf & Vcs-Git URL.

- - - - -
6acdc449 by Bas Couwenberg at 2026-08-13T18:12:18+02:00
New upstream version 3.13.3~rc1+dfsg
- - - - -
3d14a3d8 by Bas Couwenberg at 2026-08-13T18:12:31+02:00
Update upstream source from tag 'upstream/3.13.3_rc1+dfsg'

Update to upstream version '3.13.3~rc1+dfsg'
with Debian dir 9c59c3da523f7e4d778cef3e3e8d65cd0470a4ab
- - - - -
9947ccee by Bas Couwenberg at 2026-08-13T18:12:45+02:00
New upstream release candidate.

- - - - -


178 changed files:

- CITATION.cff
- NEWS.md
- VERSION
- debian/changelog
- debian/control
- debian/libgdal39.lintian-overrides
- debian/libgdal39.symbols
- debian/rules
- frmts/gdalg/gdalgdriver.cpp
- frmts/gif/giflib/dgif_lib.c
- frmts/gif/giflib/egif_lib.c
- frmts/gif/giflib/gifalloc.c
- frmts/gtiff/cogdriver.cpp
- frmts/hdf4/hdf4drivercore.cpp
- frmts/hdf5/hdf5drivercore.cpp
- frmts/hdf5/s100.cpp
- frmts/netcdf/netcdfdrivercore.cpp
- frmts/raw/doq2dataset.cpp
- frmts/raw/envidataset.cpp
- frmts/zarr/zarr_v2_array.cpp
- gcore/gdal_version.h.in
- gcore/gdalnodatavaluesmaskband.cpp
- man/man1/gdal-config.1
- man/man1/gdal-convert.1
- man/man1/gdal-dataset-check.1
- man/man1/gdal-dataset-copy.1
- man/man1/gdal-dataset-delete.1
- man/man1/gdal-dataset-identify.1
- man/man1/gdal-dataset-rename.1
- man/man1/gdal-dataset.1
- man/man1/gdal-info.1
- man/man1/gdal-mdim-convert.1
- man/man1/gdal-mdim-info.1
- man/man1/gdal-mdim-mosaic.1
- man/man1/gdal-mdim.1
- man/man1/gdal-pipeline.1
- man/man1/gdal-raster-as-features.1
- man/man1/gdal-raster-aspect.1
- man/man1/gdal-raster-calc.1
- man/man1/gdal-raster-clean-collar.1
- man/man1/gdal-raster-clip.1
- man/man1/gdal-raster-color-blend.1
- man/man1/gdal-raster-color-map.1
- man/man1/gdal-raster-compare.1
- man/man1/gdal-raster-contour.1
- man/man1/gdal-raster-convert.1
- man/man1/gdal-raster-create.1
- man/man1/gdal-raster-edit.1
- man/man1/gdal-raster-fill-nodata.1
- man/man1/gdal-raster-footprint.1
- man/man1/gdal-raster-hillshade.1
- man/man1/gdal-raster-index.1
- man/man1/gdal-raster-info.1
- man/man1/gdal-raster-mosaic.1
- man/man1/gdal-raster-neighbors.1
- man/man1/gdal-raster-nodata-to-alpha.1
- man/man1/gdal-raster-overview-add.1
- man/man1/gdal-raster-overview-delete.1
- man/man1/gdal-raster-overview-refresh.1
- man/man1/gdal-raster-pansharpen.1
- man/man1/gdal-raster-pipeline.1
- man/man1/gdal-raster-pixel-info.1
- man/man1/gdal-raster-polygonize.1
- man/man1/gdal-raster-proximity.1
- man/man1/gdal-raster-read.1
- man/man1/gdal-raster-reclassify.1
- man/man1/gdal-raster-reproject.1
- man/man1/gdal-raster-resize.1
- man/man1/gdal-raster-rgb-to-palette.1
- man/man1/gdal-raster-roughness.1
- man/man1/gdal-raster-scale.1
- man/man1/gdal-raster-select.1
- man/man1/gdal-raster-set-type.1
- man/man1/gdal-raster-sieve.1
- man/man1/gdal-raster-slope.1
- man/man1/gdal-raster-stack.1
- man/man1/gdal-raster-tile.1
- man/man1/gdal-raster-tpi.1
- man/man1/gdal-raster-tri.1
- man/man1/gdal-raster-unscale.1
- man/man1/gdal-raster-update.1
- man/man1/gdal-raster-viewshed.1
- man/man1/gdal-raster-write.1
- man/man1/gdal-raster-zonal-stats.1
- man/man1/gdal-raster.1
- man/man1/gdal-vector-buffer.1
- man/man1/gdal-vector-check-coverage.1
- man/man1/gdal-vector-check-geometry.1
- man/man1/gdal-vector-clean-coverage.1
- man/man1/gdal-vector-clip.1
- man/man1/gdal-vector-combine.1
- man/man1/gdal-vector-concat.1
- man/man1/gdal-vector-convert.1
- man/man1/gdal-vector-create.1
- man/man1/gdal-vector-dissolve.1
- man/man1/gdal-vector-edit.1
- man/man1/gdal-vector-explode-collections.1
- man/man1/gdal-vector-export-schema.1
- man/man1/gdal-vector-filter.1
- man/man1/gdal-vector-grid.1
- man/man1/gdal-vector-index.1
- man/man1/gdal-vector-info.1
- man/man1/gdal-vector-layer-algebra.1
- man/man1/gdal-vector-make-point.1
- man/man1/gdal-vector-make-valid.1
- man/man1/gdal-vector-partition.1
- man/man1/gdal-vector-pipeline.1
- man/man1/gdal-vector-rasterize.1
- man/man1/gdal-vector-read.1
- man/man1/gdal-vector-rename-layer.1
- man/man1/gdal-vector-segmentize.1
- man/man1/gdal-vector-select.1
- man/man1/gdal-vector-set-field-type.1
- man/man1/gdal-vector-set-geom-type.1
- man/man1/gdal-vector-simplify.1
- man/man1/gdal-vector-sort.1
- man/man1/gdal-vector-sql.1
- man/man1/gdal-vector-swap-xy.1
- man/man1/gdal-vector-update.1
- man/man1/gdal-vector-write.1
- man/man1/gdal-vector.1
- man/man1/gdal-vsi-copy.1
- man/man1/gdal-vsi-delete.1
- man/man1/gdal-vsi-list.1
- man/man1/gdal-vsi-move.1
- man/man1/gdal-vsi-sozip.1
- man/man1/gdal-vsi-sync.1
- man/man1/gdal-vsi.1
- man/man1/gdal.1
- man/man1/gdal2tiles.1
- man/man1/gdal_calc.1
- man/man1/gdal_contour.1
- man/man1/gdal_create.1
- man/man1/gdal_edit.1
- man/man1/gdal_fillnodata.1
- man/man1/gdal_footprint.1
- man/man1/gdal_grid.1
- man/man1/gdal_merge.1
- man/man1/gdal_pansharpen.1
- man/man1/gdal_polygonize.1
- man/man1/gdal_proximity.1
- man/man1/gdal_rasterize.1
- man/man1/gdal_retile.1
- man/man1/gdal_sieve.1
- man/man1/gdal_translate.1
- man/man1/gdal_viewshed.1
- man/man1/gdaladdo.1
- man/man1/gdalbuildvrt.1
- man/man1/gdalcompare.1
- man/man1/gdaldem.1
- man/man1/gdalinfo.1
- man/man1/gdallocationinfo.1
- man/man1/gdalmanage.1
- man/man1/gdalmdiminfo.1
- man/man1/gdalmdimtranslate.1
- man/man1/gdalmove.1
- man/man1/gdalsrsinfo.1
- man/man1/gdaltindex.1
- man/man1/gdaltransform.1
- man/man1/gdalwarp.1
- man/man1/gnmanalyse.1
- man/man1/gnmmanage.1
- man/man1/nearblack.1
- man/man1/ogr2ogr.1
- man/man1/ogr_layer_algebra.1
- man/man1/ogrinfo.1
- man/man1/ogrlineref.1
- man/man1/ogrmerge.1
- man/man1/ogrtindex.1
- man/man1/pct2rgb.1
- man/man1/rgb2pct.1
- man/man1/sozip.1
- port/cpl_vsil_unix_stdio_64.cpp
- swig/python/README.rst
- swig/python/gdal-utils/osgeo_utils/__init__.py
- swig/python/gdal-utils/osgeo_utils/samples/validate_s102.py
- swig/python/gdal-utils/osgeo_utils/samples/validate_s104.py
- swig/python/gdal-utils/osgeo_utils/samples/validate_s111.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/compare/8a4f6158f374d8bbafe673695d09b24c78499917...9947ccee8a30942cef3faf83dbe2a0d4f64c0cc2

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/compare/8a4f6158f374d8bbafe673695d09b24c78499917...9947ccee8a30942cef3faf83dbe2a0d4f64c0cc2
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/062558c3/attachment-0001.htm>

From gitlab at salsa.debian.org  Thu Aug 13 19:00:49 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 18:00:49 +0000
Subject: [Git][debian-gis-team/gdal][pristine-tar] pristine-tar data for
 gdal_3.13.3~rc1+dfsg.orig.tar.xz
Message-ID: <6a7e0651a0e40_53769994a817525f2@godard.mail>



Bas Couwenberg pushed to branch pristine-tar at Debian GIS Project / gdal


Commits:
c0f5829b by Bas Couwenberg at 2026-08-13T18:12:31+02:00
pristine-tar data for gdal_3.13.3~rc1+dfsg.orig.tar.xz

- - - - -


2 changed files:

- + gdal_3.13.3~rc1+dfsg.orig.tar.xz.delta
- + gdal_3.13.3~rc1+dfsg.orig.tar.xz.id


Changes:

=====================================
gdal_3.13.3~rc1+dfsg.orig.tar.xz.delta
=====================================
Binary files /dev/null and b/gdal_3.13.3~rc1+dfsg.orig.tar.xz.delta differ


=====================================
gdal_3.13.3~rc1+dfsg.orig.tar.xz.id
=====================================
@@ -0,0 +1 @@
+fbf3aa412d4380168d0aacf4901ea13ccb76a94a



View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/commit/c0f5829bd33669760e9a095c1f394401009ce330

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/commit/c0f5829bd33669760e9a095c1f394401009ce330
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/91b34815/attachment.htm>

From gitlab at salsa.debian.org  Thu Aug 13 19:00:51 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 18:00:51 +0000
Subject: [Git][debian-gis-team/gdal][upstream] New upstream version
 3.13.3~rc1+dfsg
Message-ID: <6a7e06531753d_537672a82017527d@godard.mail>



Bas Couwenberg pushed to branch upstream at Debian GIS Project / gdal


Commits:
6acdc449 by Bas Couwenberg at 2026-08-13T18:12:18+02:00
New upstream version 3.13.3~rc1+dfsg
- - - - -


173 changed files:

- CITATION.cff
- NEWS.md
- VERSION
- frmts/gdalg/gdalgdriver.cpp
- frmts/gif/giflib/dgif_lib.c
- frmts/gif/giflib/egif_lib.c
- frmts/gif/giflib/gifalloc.c
- frmts/gtiff/cogdriver.cpp
- frmts/hdf4/hdf4drivercore.cpp
- frmts/hdf5/hdf5drivercore.cpp
- frmts/hdf5/s100.cpp
- frmts/netcdf/netcdfdrivercore.cpp
- frmts/raw/doq2dataset.cpp
- frmts/raw/envidataset.cpp
- frmts/zarr/zarr_v2_array.cpp
- gcore/gdal_version.h.in
- gcore/gdalnodatavaluesmaskband.cpp
- man/man1/gdal-config.1
- man/man1/gdal-convert.1
- man/man1/gdal-dataset-check.1
- man/man1/gdal-dataset-copy.1
- man/man1/gdal-dataset-delete.1
- man/man1/gdal-dataset-identify.1
- man/man1/gdal-dataset-rename.1
- man/man1/gdal-dataset.1
- man/man1/gdal-info.1
- man/man1/gdal-mdim-convert.1
- man/man1/gdal-mdim-info.1
- man/man1/gdal-mdim-mosaic.1
- man/man1/gdal-mdim.1
- man/man1/gdal-pipeline.1
- man/man1/gdal-raster-as-features.1
- man/man1/gdal-raster-aspect.1
- man/man1/gdal-raster-calc.1
- man/man1/gdal-raster-clean-collar.1
- man/man1/gdal-raster-clip.1
- man/man1/gdal-raster-color-blend.1
- man/man1/gdal-raster-color-map.1
- man/man1/gdal-raster-compare.1
- man/man1/gdal-raster-contour.1
- man/man1/gdal-raster-convert.1
- man/man1/gdal-raster-create.1
- man/man1/gdal-raster-edit.1
- man/man1/gdal-raster-fill-nodata.1
- man/man1/gdal-raster-footprint.1
- man/man1/gdal-raster-hillshade.1
- man/man1/gdal-raster-index.1
- man/man1/gdal-raster-info.1
- man/man1/gdal-raster-mosaic.1
- man/man1/gdal-raster-neighbors.1
- man/man1/gdal-raster-nodata-to-alpha.1
- man/man1/gdal-raster-overview-add.1
- man/man1/gdal-raster-overview-delete.1
- man/man1/gdal-raster-overview-refresh.1
- man/man1/gdal-raster-pansharpen.1
- man/man1/gdal-raster-pipeline.1
- man/man1/gdal-raster-pixel-info.1
- man/man1/gdal-raster-polygonize.1
- man/man1/gdal-raster-proximity.1
- man/man1/gdal-raster-read.1
- man/man1/gdal-raster-reclassify.1
- man/man1/gdal-raster-reproject.1
- man/man1/gdal-raster-resize.1
- man/man1/gdal-raster-rgb-to-palette.1
- man/man1/gdal-raster-roughness.1
- man/man1/gdal-raster-scale.1
- man/man1/gdal-raster-select.1
- man/man1/gdal-raster-set-type.1
- man/man1/gdal-raster-sieve.1
- man/man1/gdal-raster-slope.1
- man/man1/gdal-raster-stack.1
- man/man1/gdal-raster-tile.1
- man/man1/gdal-raster-tpi.1
- man/man1/gdal-raster-tri.1
- man/man1/gdal-raster-unscale.1
- man/man1/gdal-raster-update.1
- man/man1/gdal-raster-viewshed.1
- man/man1/gdal-raster-write.1
- man/man1/gdal-raster-zonal-stats.1
- man/man1/gdal-raster.1
- man/man1/gdal-vector-buffer.1
- man/man1/gdal-vector-check-coverage.1
- man/man1/gdal-vector-check-geometry.1
- man/man1/gdal-vector-clean-coverage.1
- man/man1/gdal-vector-clip.1
- man/man1/gdal-vector-combine.1
- man/man1/gdal-vector-concat.1
- man/man1/gdal-vector-convert.1
- man/man1/gdal-vector-create.1
- man/man1/gdal-vector-dissolve.1
- man/man1/gdal-vector-edit.1
- man/man1/gdal-vector-explode-collections.1
- man/man1/gdal-vector-export-schema.1
- man/man1/gdal-vector-filter.1
- man/man1/gdal-vector-grid.1
- man/man1/gdal-vector-index.1
- man/man1/gdal-vector-info.1
- man/man1/gdal-vector-layer-algebra.1
- man/man1/gdal-vector-make-point.1
- man/man1/gdal-vector-make-valid.1
- man/man1/gdal-vector-partition.1
- man/man1/gdal-vector-pipeline.1
- man/man1/gdal-vector-rasterize.1
- man/man1/gdal-vector-read.1
- man/man1/gdal-vector-rename-layer.1
- man/man1/gdal-vector-segmentize.1
- man/man1/gdal-vector-select.1
- man/man1/gdal-vector-set-field-type.1
- man/man1/gdal-vector-set-geom-type.1
- man/man1/gdal-vector-simplify.1
- man/man1/gdal-vector-sort.1
- man/man1/gdal-vector-sql.1
- man/man1/gdal-vector-swap-xy.1
- man/man1/gdal-vector-update.1
- man/man1/gdal-vector-write.1
- man/man1/gdal-vector.1
- man/man1/gdal-vsi-copy.1
- man/man1/gdal-vsi-delete.1
- man/man1/gdal-vsi-list.1
- man/man1/gdal-vsi-move.1
- man/man1/gdal-vsi-sozip.1
- man/man1/gdal-vsi-sync.1
- man/man1/gdal-vsi.1
- man/man1/gdal.1
- man/man1/gdal2tiles.1
- man/man1/gdal_calc.1
- man/man1/gdal_contour.1
- man/man1/gdal_create.1
- man/man1/gdal_edit.1
- man/man1/gdal_fillnodata.1
- man/man1/gdal_footprint.1
- man/man1/gdal_grid.1
- man/man1/gdal_merge.1
- man/man1/gdal_pansharpen.1
- man/man1/gdal_polygonize.1
- man/man1/gdal_proximity.1
- man/man1/gdal_rasterize.1
- man/man1/gdal_retile.1
- man/man1/gdal_sieve.1
- man/man1/gdal_translate.1
- man/man1/gdal_viewshed.1
- man/man1/gdaladdo.1
- man/man1/gdalbuildvrt.1
- man/man1/gdalcompare.1
- man/man1/gdaldem.1
- man/man1/gdalinfo.1
- man/man1/gdallocationinfo.1
- man/man1/gdalmanage.1
- man/man1/gdalmdiminfo.1
- man/man1/gdalmdimtranslate.1
- man/man1/gdalmove.1
- man/man1/gdalsrsinfo.1
- man/man1/gdaltindex.1
- man/man1/gdaltransform.1
- man/man1/gdalwarp.1
- man/man1/gnmanalyse.1
- man/man1/gnmmanage.1
- man/man1/nearblack.1
- man/man1/ogr2ogr.1
- man/man1/ogr_layer_algebra.1
- man/man1/ogrinfo.1
- man/man1/ogrlineref.1
- man/man1/ogrmerge.1
- man/man1/ogrtindex.1
- man/man1/pct2rgb.1
- man/man1/rgb2pct.1
- man/man1/sozip.1
- port/cpl_vsil_unix_stdio_64.cpp
- swig/python/README.rst
- swig/python/gdal-utils/osgeo_utils/__init__.py
- swig/python/gdal-utils/osgeo_utils/samples/validate_s102.py
- swig/python/gdal-utils/osgeo_utils/samples/validate_s104.py
- swig/python/gdal-utils/osgeo_utils/samples/validate_s111.py


The diff was not included because it is too large.


View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/commit/6acdc449767e2003263ad72384623ae8f397b9b9

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/commit/6acdc449767e2003263ad72384623ae8f397b9b9
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/3ed9ca71/attachment-0001.htm>

From gitlab at salsa.debian.org  Thu Aug 13 19:00:52 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Thu, 13 Aug 2026 18:00:52 +0000
Subject: [Git][debian-gis-team/gdal] Pushed new tag upstream/3.13.3_rc1+dfsg
Message-ID: <6a7e0654b1576_53767b9df4175293e@godard.mail>



Bas Couwenberg pushed new tag upstream/3.13.3_rc1+dfsg at Debian GIS Project / gdal

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gdal/-/tree/upstream/3.13.3_rc1+dfsg
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260813/78f5c4ed/attachment.htm>

From sebastic at xs4all.nl  Thu Aug 13 19:13:46 2026
From: sebastic at xs4all.nl (Sebastiaan Couwenberg)
Date: Thu, 13 Aug 2026 20:13:46 +0200
Subject: pystac upstream split
In-Reply-To: <8ee01668-0840-4787-aee6-2976d38a4eac@tiscali.it>
References: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>
 <e76ab300-1d4f-4552-a47a-3cd079dfe51c@xs4all.nl>
 <b79d6c54-62ad-4df5-b533-870977c0bfd7@tiscali.it>
 <46cf9c10-89f8-4e60-a1db-7fa9aeae7213@xs4all.nl>
 <8ee01668-0840-4787-aee6-2976d38a4eac@tiscali.it>
Message-ID: <df32a8c7-44e4-4c89-ad9f-986110977fe2@xs4all.nl>

On 8/13/26 7:45 PM, Antonio Valentino wrote:
> Please feel free to review an upload.

Files moved from python3-pystac to python3-pystac-core, but you only used Replaces instead Breaks+Replaces:

  https://www.debian.org/doc/debian-policy/ch-relationships.html#overwriting-files-in-other-packages

Kind Regards,

Bas

-- 
  PGP Key ID: 4096R/6750F10AE88D4AF1
Fingerprint: 8182 DE41 7056 408D 6146  50D1 6750 F10A E88D 4AF1


From gitlab at salsa.debian.org  Fri Aug 14 07:02:14 2026
From: gitlab at salsa.debian.org (Antonio Valentino (@antonio.valentino))
Date: Fri, 14 Aug 2026 06:02:14 +0000
Subject: [Git][debian-gis-team/pystac][master] pystac-core breaks pystac (<<
 1.15)
Message-ID: <6a7eaf6628a15_537765c0a01831731@godard.mail>



Antonio Valentino pushed to branch master at Debian GIS Project / pystac


Commits:
71fa40ac by Antonio Valentino at 2026-08-14T06:01:59+00:00
pystac-core breaks pystac (<< 1.15)

- - - - -


2 changed files:

- debian/changelog
- debian/control


Changes:

=====================================
debian/changelog
=====================================
@@ -17,7 +17,7 @@ pystac (1.15.2-1) unstable; urgency=medium
   * Update pattern for GitHub archive URLs in d/watch.
   * debian/control:
     - Add new package for pystac-core.
-    - python3-pystac-core "Replaces: python3-pystac (<< 1.15)".
+    - python3-pystac-core Breaks/Replaces: python3-pystac (<< 1.15).
   * Add d/py3dist-overrides (for pystac-core).
 
  -- Antonio Valentino <antonio.valentino at tiscali.it>  Thu, 13 Aug 2026 09:56:34 +0000


=====================================
debian/control
=====================================
@@ -61,6 +61,7 @@ Depends: python3-dateutil,
          ${misc:Depends}
 Recommends: python3-jinja2,
             python3-urllib3
+Breaks: python3-pystac (<< 1.15)
 Replaces: python3-pystac (<< 1.15)
 Description: ${source:Synopsis} - core
  ${source:Extended-Description}



View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/71fa40acc3e897114d9c0a57624be4b6387df4eb

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/commit/71fa40acc3e897114d9c0a57624be4b6387df4eb
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260814/715b0e3a/attachment-0001.htm>

From antonio.valentino at tiscali.it  Fri Aug 14 07:03:06 2026
From: antonio.valentino at tiscali.it (Antonio Valentino)
Date: Fri, 14 Aug 2026 08:03:06 +0200
Subject: pystac upstream split
In-Reply-To: <df32a8c7-44e4-4c89-ad9f-986110977fe2@xs4all.nl>
References: <47433020-e437-4ebf-a677-a4c0230d15a7@tiscali.it>
 <e76ab300-1d4f-4552-a47a-3cd079dfe51c@xs4all.nl>
 <b79d6c54-62ad-4df5-b533-870977c0bfd7@tiscali.it>
 <46cf9c10-89f8-4e60-a1db-7fa9aeae7213@xs4all.nl>
 <8ee01668-0840-4787-aee6-2976d38a4eac@tiscali.it>
 <df32a8c7-44e4-4c89-ad9f-986110977fe2@xs4all.nl>
Message-ID: <242edd24-15df-4749-89b5-4adf9c81d84d@tiscali.it>

Il 13/08/26 20:13, Sebastiaan Couwenberg ha scritto:
> On 8/13/26 7:45 PM, Antonio Valentino wrote:
>> Please feel free to review an upload.
> 
> Files moved from python3-pystac to python3-pystac-core, but you only 
> used Replaces instead Breaks+Replaces:
> 
>  ?https://www.debian.org/doc/debian-policy/ch- 
> relationships.html#overwriting-files-in-other-packages
> 
> Kind Regards,
> 
> Bas
> 

Thanks Bas.
It should be fixed now.

cheers
-- 
Antonio Valentino



From gitlab at salsa.debian.org  Fri Aug 14 07:43:45 2026
From: gitlab at salsa.debian.org (Bas Couwenberg (@sebastic))
Date: Fri, 14 Aug 2026 06:43:45 +0000
Subject: [Git][debian-gis-team/pystac] Pushed new tag debian/1.15.2-1
Message-ID: <6a7eb92140d2b_5379a6203018401c1@godard.mail>



Bas Couwenberg pushed new tag debian/1.15.2-1 at Debian GIS Project / pystac

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pystac/-/tree/debian/1.15.2-1
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260814/4c09209b/attachment.htm>

From ftpmaster at ftp-master.debian.org  Fri Aug 14 07:52:54 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 14 Aug 2026 06:52:54 +0000
Subject: Processing of pystac_1.15.2-1_amd64.changes
Message-ID: <E1wulmg-007bP8-2p@usper.debian.org>

pystac_1.15.2-1_amd64.changes uploaded successfully to localhost
along with the files:
  pystac_1.15.2-1.dsc
  pystac_1.15.2.orig.tar.gz
  pystac_1.15.2-1.debian.tar.xz
  pystac_1.15.2-1_amd64.buildinfo
  python-pystac-doc_1.15.2-1_all.deb
  python3-pystac-core_1.15.2-1_all.deb
  python3-pystac_1.15.2-1_all.deb

Greetings,

	Your Debian queue daemon (running on host usper.debian.org)


From ftpmaster at ftp-master.debian.org  Fri Aug 14 08:04:54 2026
From: ftpmaster at ftp-master.debian.org (Debian FTP Masters)
Date: Fri, 14 Aug 2026 07:04:54 +0000
Subject: pystac_1.15.2-1_amd64.changes is NEW
Message-ID: <E1wulyI-00000000pSQ-0KaQ@fasolo.debian.org>

binary:python3-pystac-core is NEW.
binary:python3-pystac-core is NEW.

Your package has been put into the NEW queue, which requires manual action
from the ftpteam to process. The upload was otherwise valid (it had a good
OpenPGP signature and file hashes are valid), so please be patient.

Packages are routinely processed through to the archive, and do feel
free to browse the NEW queue[1].

If there is an issue with the upload, you will receive an email from a
member of the ftpteam.

If you have any questions, you may reply to this email.

[1]: https://ftp-master.debian.org/new.html
     or https://ftp-master.debian.org/backports-new.html for *-backports
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260814/292f6a8d/attachment.sig>

From antonio.valentino at tiscali.it  Fri Aug 14 11:46:48 2026
From: antonio.valentino at tiscali.it (Antonio Valentino)
Date: Fri, 14 Aug 2026 12:46:48 +0200
Subject: Bug#1134248: pyresample: FTBFS with GDAL 3.13.0
In-Reply-To: <177650355965.3141582.3203496424981203838.reportbug@osiris.linuxminded.xs4all.nl>
References: <177650355965.3141582.3203496424981203838.reportbug@osiris.linuxminded.xs4all.nl>
 <177650355965.3141582.3203496424981203838.reportbug@osiris.linuxminded.xs4all.nl>
 <177650355965.3141582.3203496424981203838.reportbug@osiris.linuxminded.xs4all.nl>
Message-ID: <b3b5d0c5-42e5-4b33-852b-f5b03b5a4297@tiscali.it>

Hi Bas,

On Sat, 18 Apr 2026 11:12:39 +0200 Bas Couwenberg <sebastic at debian.org> 
wrote:
> Source: pyresample
> Version: 1.35.0-2
> Severity: important
> Tags: upstream ftbfs
> Usertags: gdal-3.13
> 
> Dear Maintainer,
> 
> Your package FTBFS with GDAL 3.13.0 due to test failures:
> 
>  FAILED test/test_utils/test_rasterio.py::TestFromRasterio::test_get_area_def_from_raster_non_georef_respects_proj_dict[True-False]
>  FAILED test/test_utils/test_rasterio.py::TestFromRasterio::test_get_area_def_from_raster_non_georef_respects_proj_dict[True-True]
>  = 2 failed, 1120 passed, 25 skipped, 15 deselected, 465 warnings in 143.55s (0:02:23) =
> 
> https://ci.debian.net/packages/p/pyresample/unstable/amd64/70369723/
> 
> This may be an issue in rasterio.
> 
> Kind Regards,
> 
> Bas

I'm not able to reproduce this issue with the version of gdal currently 
in unstable (3.13.2).

Is this still an issue?
Probably it has been fixed by recent versions of rasterio.


kind regards
-- 
Antonio Valentino


From owner at bugs.debian.org  Fri Aug 14 12:15:06 2026
From: owner at bugs.debian.org (Debian Bug Tracking System)
Date: Fri, 14 Aug 2026 11:15:06 +0000
Subject: Bug#1134248: marked as done (pyresample: FTBFS with GDAL 3.13.0)
References: <5400eae8-3d6a-4684-b500-0ff37d89d5db@xs4all.nl>
 <177650355965.3141582.3203496424981203838.reportbug@osiris.linuxminded.xs4all.nl>
Message-ID: <handler.1134248.D1134248.1786705944662330.ackdone@bugs.debian.org>

Your message dated Fri, 14 Aug 2026 13:01:10 +0200
with message-id <5400eae8-3d6a-4684-b500-0ff37d89d5db at xs4all.nl>
and subject line Re: Bug#1134248: pyresample: FTBFS with GDAL 3.13.0
has caused the Debian Bug report #1134248,
regarding pyresample: FTBFS with GDAL 3.13.0
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner at bugs.debian.org
immediately.)


-- 
1134248: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1134248
Debian Bug Tracking System
Contact owner at bugs.debian.org with problems
-------------- next part --------------
An embedded message was scrubbed...
From: Bas Couwenberg <sebastic at debian.org>
Subject: pyresample: FTBFS with GDAL 3.13.0
Date: Sat, 18 Apr 2026 11:12:39 +0200
Size: 3300
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260814/fd525a00/attachment.eml>
-------------- next part --------------
An embedded message was scrubbed...
From: Sebastiaan Couwenberg <sebastic at xs4all.nl>
Subject: Re: Bug#1134248: pyresample: FTBFS with GDAL 3.13.0
Date: Fri, 14 Aug 2026 13:01:10 +0200
Size: 7642
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260814/fd525a00/attachment-0001.eml>

