[Git][debian-gis-team/eodag][upstream] New upstream version 3.10.2+ds
Antonio Valentino (@antonio.valentino)
gitlab at salsa.debian.org
Sat Mar 14 10:17:37 GMT 2026
Antonio Valentino pushed to branch upstream at Debian GIS Project / eodag
Commits:
a6926a70 by Antonio Valentino at 2026-03-14T09:55:01+00:00
New upstream version 3.10.2+ds
- - - - -
19 changed files:
- CHANGES.rst
- Dockerfile
- README.rst
- charts/eodag-server/Chart.yaml
- docs/conf.py
- docs/stac_rest.rst
- eodag/api/product/_product.py
- eodag/api/product/drivers/__init__.py
- eodag/api/product/drivers/base.py
- eodag/config.py
- eodag/plugins/crunch/filter_latest_intersect.py
- eodag/plugins/download/http.py
- eodag/plugins/search/qssearch.py
- eodag/rest/types/stac_search.py
- eodag/types/__init__.py
- eodag/types/download_args.py
- eodag/utils/__init__.py
- pyproject.toml
- setup.cfg
Changes:
=====================================
CHANGES.rst
=====================================
@@ -4,6 +4,49 @@ Release history
.. _changelog-unreleased:
+v3.10.2 (2026-03-12)
+====================
+
+Bug Fixes
+---------
+
+* **core**: Jsonpath-ng 1.8.0 Index indices (`#2059`_, `71bada7`_)
+
+* **core**: Make get_quicklook return empty str on error (`#2063`_, `498fcb7`_)
+
+* **core**: TypedDict from typing_extensions required by pydantic (`#1986`_, `a39b473`_)
+
+* **crunch**: Filter_latest_intersect used geometry (`#2030`_, `baa6d39`_)
+
+* **download**: Wrong filename with dl_url_params (`#2064`_, `ebf5172`_)
+
+* **plugins**: Delete download link when order not finish (`#1952`_, `d842f62`_)
+
+Build System
+------------
+
+* Avoid jsonpath-ng 1.8.0 which breaks assets parsing (`#2078`_, `6f930cc`_)
+
+* Bump alpine version on Dockerfile to prevent certificate error on geodes (`#2004`_, `bdc6b86`_)
+
+.. _#1952: https://github.com/CS-SI/eodag/pull/1952
+.. _#1986: https://github.com/CS-SI/eodag/pull/1986
+.. _#2004: https://github.com/CS-SI/eodag/pull/2004
+.. _#2030: https://github.com/CS-SI/eodag/pull/2030
+.. _#2059: https://github.com/CS-SI/eodag/pull/2059
+.. _#2063: https://github.com/CS-SI/eodag/pull/2063
+.. _#2064: https://github.com/CS-SI/eodag/pull/2064
+.. _#2078: https://github.com/CS-SI/eodag/pull/2078
+.. _498fcb7: https://github.com/CS-SI/eodag/commit/498fcb78bdc262804a78ce1edc3da2b259b94276
+.. _6f930cc: https://github.com/CS-SI/eodag/commit/6f930cc5545cf2733c1dee1f70025207c2a1f0aa
+.. _71bada7: https://github.com/CS-SI/eodag/commit/71bada72f62910e217e0b49174c271f9962a8ad3
+.. _a39b473: https://github.com/CS-SI/eodag/commit/a39b4739c6efbdf36d1546a2740340a1587a407c
+.. _baa6d39: https://github.com/CS-SI/eodag/commit/baa6d39d665236688b8b0b262b3c13d7bc436d90
+.. _bdc6b86: https://github.com/CS-SI/eodag/commit/bdc6b861c8fc9ea8901a1813b04600ebd865f416
+.. _d842f62: https://github.com/CS-SI/eodag/commit/d842f6295840ddf21b3940f926197447013426f2
+.. _ebf5172: https://github.com/CS-SI/eodag/commit/ebf51725920d44df758d9cb0c99e33d586481236
+
+
v3.10.1 (2025-12-11)
====================
=====================================
Dockerfile
=====================================
@@ -15,7 +15,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM python:alpine3.13
+FROM python:alpine3.23
LABEL author="CS GROUP - France"
=====================================
README.rst
=====================================
@@ -185,7 +185,7 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
.. code-block:: bash
- docker run -p 5000:5000 --rm csspace/eodag-server:3.10.1
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.10.2
You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
Simply run:
=====================================
charts/eodag-server/Chart.yaml
=====================================
@@ -1,5 +1,5 @@
apiVersion: v2
-appVersion: 3.10.1
+appVersion: 3.10.2
dependencies:
- name: common
repository: oci://registry-1.docker.io/bitnamicharts
@@ -15,4 +15,4 @@ name: eodag-server
sources:
- https://github.com/CS-SI/eodag
type: application
-version: 3.10.1
+version: 3.10.2
=====================================
docs/conf.py
=====================================
@@ -25,9 +25,16 @@ from datetime import datetime
from importlib.metadata import metadata
from typing import Any
+# Make JsonValue resolvable in pydantic.fields for sphinx_autodoc_typehints:
+# JsonDict (used in Field annotations) contains a forward reference to JsonValue
+# that isn't in the pydantic.fields namespace.
+import pydantic.fields
from docutils import nodes
+from pydantic import JsonValue
from sphinx.writers.html import HTMLTranslator
+pydantic.fields.JsonValue = JsonValue
+
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
=====================================
docs/stac_rest.rst
=====================================
@@ -99,7 +99,7 @@ available on `https://hub.docker.com/r/csspace/eodag-server <https://hub.docker.
.. code-block:: bash
- $ docker run -p 5000:5000 --rm csspace/eodag-server:3.10.1
+ $ docker run -p 5000:5000 --rm csspace/eodag-server:3.10.2
Example
-------
=====================================
eodag/api/product/_product.py
=====================================
@@ -557,7 +557,7 @@ class EOProduct:
f"Failed to get resource with authentication: {e} \n \
Failed to get resource even without authentication. {e_no_auth}"
)
- return str(e)
+ return ""
# close progress bar if needed
if close_progress_callback:
=====================================
eodag/api/product/drivers/__init__.py
=====================================
@@ -18,7 +18,9 @@
"""EODAG drivers package"""
from __future__ import annotations
-from typing import Callable, TypedDict
+from typing import Callable
+
+from typing_extensions import TypedDict
from eodag.api.product.drivers.base import DatasetDriver, NoDriver
from eodag.api.product.drivers.generic import GenericDriver
=====================================
eodag/api/product/drivers/base.py
=====================================
@@ -19,7 +19,9 @@ from __future__ import annotations
import logging
import re
-from typing import TYPE_CHECKING, Optional, TypedDict
+from typing import TYPE_CHECKING, Optional
+
+from typing_extensions import TypedDict
from eodag.utils import _deprecated
=====================================
eodag/config.py
=====================================
@@ -29,7 +29,6 @@ from typing import (
Iterator,
Literal,
Optional,
- TypedDict,
Union,
ValuesView,
get_type_hints,
@@ -42,6 +41,7 @@ import yaml.constructor
import yaml.parser
from annotated_types import Gt
from jsonpath_ng import JSONPath
+from typing_extensions import TypedDict
from eodag.api.product.metadata_mapping import mtd_cfg_as_conversion_and_querypath
from eodag.utils import (
=====================================
eodag/plugins/crunch/filter_latest_intersect.py
=====================================
@@ -20,13 +20,14 @@ from __future__ import annotations
import datetime
import logging
import time
-from typing import TYPE_CHECKING, Any, Union
+from typing import TYPE_CHECKING, Any, Optional, Union
import dateutil.parser
-from shapely import geometry
+from shapely.errors import ShapelyError
from shapely.geometry.base import BaseGeometry
from eodag.plugins.crunch.base import Crunch
+from eodag.utils import get_geometry_from_various
if TYPE_CHECKING:
from datetime import datetime as dt
@@ -70,7 +71,7 @@ class FilterLatestIntersect(Crunch):
# Warning: May crash if startTimeFromAscendingNode is not in the appropriate format
products.sort(key=self.sort_product_by_start_date, reverse=True)
filtered: list[EOProduct] = []
- search_extent: BaseGeometry
+ search_extent: Optional[BaseGeometry]
add_to_filtered = filtered.append
footprint: Union[dict[str, Any], BaseGeometry, Any] = search_params.get(
"geometry"
@@ -80,24 +81,25 @@ class FilterLatestIntersect(Crunch):
"geometry not found in cruncher arguments, filtering disabled."
)
return products
- elif isinstance(footprint, dict):
- search_extent = geometry.box(
- footprint["lonmin"],
- footprint["latmin"],
- footprint["lonmax"],
- footprint["latmax"],
- )
- elif not isinstance(footprint, BaseGeometry):
+ try:
+ search_extent = get_geometry_from_various(geometry=footprint)
+ except (ShapelyError, TypeError):
logger.warning(
"geometry found in cruncher arguments did not match the expected format."
)
return products
- else:
- search_extent = footprint
+ if search_extent is None:
+ logger.warning("Could not build geometry from cruncher arguments")
+ return products
+
logger.debug("Initial requested extent area: %s", search_extent.area)
for product in products:
logger.debug("Uncovered extent area: %s", search_extent.area)
- if product.search_intersection:
+ try:
+ search_intersection = product.geometry.intersection(search_extent)
+ except ShapelyError:
+ search_intersection = None
+ if search_intersection:
logger.debug(
"Product %r intersects the requested extent. Adding it to the final result",
product,
=====================================
eodag/plugins/download/http.py
=====================================
@@ -27,16 +27,7 @@ from email.message import Message
from itertools import chain
from json import JSONDecodeError
from pathlib import Path
-from typing import (
- TYPE_CHECKING,
- Any,
- Iterator,
- Literal,
- Optional,
- TypedDict,
- Union,
- cast,
-)
+from typing import TYPE_CHECKING, Any, Iterator, Literal, Optional, Union, cast
from urllib.parse import parse_qs, urlparse
import geojson
@@ -45,6 +36,7 @@ from lxml import etree
from requests import RequestException
from requests.auth import AuthBase
from requests.structures import CaseInsensitiveDict
+from typing_extensions import TypedDict
from zipstream import ZipStream
from eodag.api.product.metadata_mapping import (
@@ -473,6 +465,8 @@ class HTTPDownload(Download):
if (success_status and success_status != status_dict.get("status")) or (
success_code and success_code != response.status_code
):
+ # Remove the download link if the order has not been completed or was not successful
+ product.properties.pop("downloadLink", None)
return None
product.properties["storageStatus"] = ONLINE_STATUS
@@ -744,6 +738,11 @@ class HTTPDownload(Download):
if not filename:
# default filename extracted from path
filename = str(os.path.basename(self.stream.url))
+
+ # remove http get params and anchors
+ filename = filename.split("?")[0]
+ filename = filename.split("#")[0]
+
filename_extension = os.path.splitext(filename)[1]
if not filename_extension:
if content_type := getattr(product, "headers", {}).get("Content-Type"):
=====================================
eodag/plugins/search/qssearch.py
=====================================
@@ -28,7 +28,6 @@ from typing import (
Callable,
Optional,
Sequence,
- TypedDict,
cast,
get_args,
)
@@ -57,6 +56,7 @@ from pydantic.fields import FieldInfo
from requests import Response
from requests.adapters import HTTPAdapter
from requests.auth import AuthBase
+from typing_extensions import TypedDict
from urllib3 import Retry
from eodag.api.product import EOProduct
=====================================
eodag/rest/types/stac_search.py
=====================================
@@ -19,7 +19,7 @@
from __future__ import annotations
-from typing import TYPE_CHECKING, Annotated, Any, Literal, Optional, Union
+from typing import TYPE_CHECKING, Annotated, Any, Literal, Optional, Union, cast
import geojson
from pydantic import (
@@ -174,7 +174,7 @@ class SearchPostRequest(BaseModel):
return v
if isinstance(v, dict) and v.get("type") in GEOMETRY_TYPES: # type: ignore
- return shape(v)
+ return cast(Geometry, shape(v))
raise ValueError("Not a valid geometry")
=====================================
eodag/types/__init__.py
=====================================
@@ -19,17 +19,7 @@
from __future__ import annotations
-from typing import (
- Annotated,
- Any,
- Literal,
- Optional,
- Type,
- TypedDict,
- Union,
- get_args,
- get_origin,
-)
+from typing import Annotated, Any, Literal, Optional, Type, Union, get_args, get_origin
from annotated_types import Gt, Lt
from pydantic import BaseModel, ConfigDict, Field, create_model
@@ -37,6 +27,7 @@ from pydantic.annotated_handlers import GetJsonSchemaHandler
from pydantic.fields import FieldInfo
from pydantic.json_schema import JsonSchemaValue
from pydantic_core import CoreSchema, PydanticUndefined
+from typing_extensions import TypedDict
from eodag.utils import copy_deepcopy
from eodag.utils.exceptions import ValidationError
=====================================
eodag/types/download_args.py
=====================================
@@ -17,7 +17,9 @@
# limitations under the License.
from __future__ import annotations
-from typing import Optional, TypedDict, Union
+from typing import Optional, Union
+
+from typing_extensions import TypedDict
class DownloadConf(TypedDict, total=False):
=====================================
eodag/utils/__init__.py
=====================================
@@ -905,12 +905,15 @@ def string_to_jsonpath(*args: Any, force: bool = False) -> Union[str, JSONPath]:
Child(Child(Root(), Fields('foo')), Fields('bar'))
>>> string_to_jsonpath("$.foo.bar")
Child(Child(Root(), Fields('foo')), Fields('bar'))
- >>> string_to_jsonpath('$.foo[0][*]')
- Child(Child(Child(Root(), Fields('foo')), Index(index=0)), Slice(start=None,end=None,step=None))
>>> string_to_jsonpath("foo")
'foo'
>>> string_to_jsonpath("foo", force=True)
Fields('foo')
+ >>> string_to_jsonpath('$.foo[0][*]') == Child(
+ ... Child(Child(Root(), Fields('foo')), Index(0)),
+ ... Slice(start=None, end=None, step=None),
+ ... )
+ True
:param args: Last arg as input string value, to be converted
:param force: force conversion even if input string is not detected as a :class:`jsonpath_ng.JSONPath`
@@ -956,7 +959,7 @@ def string_to_jsonpath(*args: Any, force: bool = False) -> Union[str, JSONPath]:
# integer index
parsed_path = Child(
parsed_path,
- Index(index=index),
+ Index(index),
)
elif "[" in path_split:
# unsupported array field
@@ -1061,7 +1064,9 @@ def get_geometry_from_various(
:param locations_config: (optional) EODAG locations configuration
:param query_args: Query kwargs arguments from :meth:`~eodag.api.core.EODataAccessGateway.search`
:returns: shapely Geometry found
- :raises: :class:`ValueError`
+ :raises shapely.errors.ShapelyError: Error while creating shapely geometry
+ :raises TypeError: Unexpected geometry type
+ :raises ValueError: Location name is wrong or its value does not match
"""
geom = None
=====================================
pyproject.toml
=====================================
@@ -3,7 +3,7 @@ requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"]
build-backend = "setuptools.build_meta"
[tool.setuptools_scm]
-fallback_version = "3.10.2.dev0"
+fallback_version = "3.10.3.dev0"
[tool.coverage.report]
exclude_lines = [
=====================================
setup.cfg
=====================================
@@ -45,7 +45,8 @@ install_requires =
click
geojson
importlib_metadata >= 5.0
- jsonpath-ng
+ # temporarily pinned, see https://github.com/h2non/jsonpath-ng/issues/216
+ jsonpath-ng < 1.8.0
lxml
orjson
pydantic >= 2.1.0, != 2.10.0
View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/commit/a6926a70b6413ffc28f4530045b17d359691696a
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/eodag/-/commit/a6926a70b6413ffc28f4530045b17d359691696a
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260314/3c16079c/attachment-0001.htm>
More information about the Pkg-grass-devel
mailing list