Skip to content

Commit d77c373

Browse files
committed
Merge branch 'develop'
2 parents 00aaee8 + 58d1c9c commit d77c373

17 files changed

Lines changed: 821 additions & 34 deletions

CHANGES.rst

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,56 @@ Release history
33
===============
44

55

6+
v4.0.2 (2026-03-23)
7+
===================
8+
9+
Bug Fixes
10+
---------
11+
12+
* **crunch**: Minor fixes and improved crunches test coverage (`#2001`_, `c638016`_)
13+
14+
* **plugins**: Order of values of EcmwfSearch bbox is N-W-S-E (`#2056`_, `b56678c`_)
15+
16+
* **plugins**: Replace deprecated items_per_page in CopMarineSearch (`#2100`_, `b2df124`_)
17+
18+
* **providers**: Queried orbit number parsing (`#2104`_, `bb03961`_)
19+
20+
Build System
21+
------------
22+
23+
* Fixed deprecated project.license expression (`#2105`_, `b595765`_)
24+
25+
* Updated package discovery pattern (`#2103`_, `64b22c7`_)
26+
27+
Documentation
28+
-------------
29+
30+
* Tutorials typos fixes (`#1996`_, `5026718`_)
31+
32+
Performance Improvements
33+
------------------------
34+
35+
* **plugins**: Stop fetching when search page limit is reached on CopMarineSearch (`#2014`_,
36+
`a6eaa0a`_)
37+
38+
.. _#1996: https://github.com/CS-SI/eodag/pull/1996
39+
.. _#2001: https://github.com/CS-SI/eodag/pull/2001
40+
.. _#2014: https://github.com/CS-SI/eodag/pull/2014
41+
.. _#2056: https://github.com/CS-SI/eodag/pull/2056
42+
.. _#2100: https://github.com/CS-SI/eodag/pull/2100
43+
.. _#2103: https://github.com/CS-SI/eodag/pull/2103
44+
.. _#2104: https://github.com/CS-SI/eodag/pull/2104
45+
.. _#2105: https://github.com/CS-SI/eodag/pull/2105
46+
.. _5026718: https://github.com/CS-SI/eodag/commit/5026718b7d812e04cb630fe28726bb124babbf37
47+
.. _64b22c7: https://github.com/CS-SI/eodag/commit/64b22c70a2cf0c37ecf6ad681daaa40734b4b815
48+
.. _a6eaa0a: https://github.com/CS-SI/eodag/commit/a6eaa0ac30a38934b22453e9c0eae990cedabe56
49+
.. _b2df124: https://github.com/CS-SI/eodag/commit/b2df12454fe565e64a3b270a0490c09f394a9e59
50+
.. _b56678c: https://github.com/CS-SI/eodag/commit/b56678cf67f581a6ae095fcbbdc227215cc51ce2
51+
.. _b595765: https://github.com/CS-SI/eodag/commit/b595765b397772e7010bc550c4f0f4d516e5c4d0
52+
.. _bb03961: https://github.com/CS-SI/eodag/commit/bb03961083f3815a0787cb98882e3dd2a63e9daa
53+
.. _c638016: https://github.com/CS-SI/eodag/commit/c6380163b38e18f8181b9f521ee38524ec8c34ff
54+
55+
656
v4.0.1 (2026-03-18)
757
===================
858

docs/getting_started_guide/features_overview.ipynb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
"## Configure"
3131
]
3232
},
33+
{
34+
"cell_type": "markdown",
35+
"metadata": {},
36+
"source": []
37+
},
3338
{
3439
"cell_type": "markdown",
3540
"metadata": {},
@@ -56,7 +61,7 @@
5661
"source": [
5762
"Now we will configure `eodag` to be able to download using *PEPS*. For that we need to fill our credentials:\n",
5863
"\n",
59-
"* in the user configuration file `~/.config/eodag.eodag.yml`:\n",
64+
"* in the user configuration file `~/.config/eodag/eodag.yml`:\n",
6065
"\n",
6166
"```yaml\n",
6267
"peps:\n",

docs/notebooks/tutos/tuto_meteoblue.ipynb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@
5050
}
5151
],
5252
"source": [
53-
"tomorrow = (datetime.date.today() + datetime.timedelta(days=1)).isoformat()\n",
54-
"after_tomorrow = (datetime.date.today() + datetime.timedelta(days=2)).isoformat()\n",
53+
"today = datetime.datetime.now(datetime.timezone.utc).date()\n",
54+
"tomorrow = (today + datetime.timedelta(days=1)).isoformat()\n",
55+
"after_tomorrow = (today + datetime.timedelta(days=2)).isoformat()\n",
5556
"aoi_bbox = [-2, 42, 3, 45]\n",
5657
"\n",
5758
"products_from_collection = dag.search(\n",

docs/notebooks/tutos/tuto_wekeo.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3845,7 +3845,7 @@
38453845
" geom=[0.25, 43.2, 2.8, 43.9],\n",
38463846
" provider=\"wekeo_ecmwf\",\n",
38473847
" **{\n",
3848-
" 'ecmwf:variable': 'wildfire_flux_of_total_carbon_in_aerosols',\n",
3848+
" 'ecmwf:variable': ['wildfire_flux_of_total_carbon_in_aerosols'],\n",
38493849
" 'ecmwf:data_format': 'grib',\n",
38503850
" }\n",
38513851
")\n",

eodag/crunch.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,18 @@
1717
# limitations under the License.
1818
"""Crunch filters import gateway"""
1919

20-
from .plugins.crunch.filter_date import FilterDate # noqa
21-
from .plugins.crunch.filter_latest_intersect import FilterLatestIntersect # noqa
22-
from .plugins.crunch.filter_latest_tpl_name import FilterLatestByName # noqa
23-
from .plugins.crunch.filter_overlap import FilterOverlap # noqa
24-
from .plugins.crunch.filter_property import FilterProperty # noqa
20+
from .plugins.crunch import (
21+
FilterDate,
22+
FilterLatestByName,
23+
FilterLatestIntersect,
24+
FilterOverlap,
25+
FilterProperty,
26+
)
27+
28+
__all__ = [
29+
"FilterDate",
30+
"FilterLatestIntersect",
31+
"FilterLatestByName",
32+
"FilterOverlap",
33+
"FilterProperty",
34+
]

eodag/plugins/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,12 @@ def __init__(self, provider: str, config: PluginConfig) -> None:
6666

6767
def __repr__(self) -> str:
6868
config = getattr(self, "config", None)
69+
priority = ""
70+
if config is not None and hasattr(config, "priority"):
71+
priority = str(config.priority) # is an int
6972
return "{}(provider={}, priority={}, topic={})".format(
7073
self.__class__.__name__,
7174
getattr(self, "provider", ""),
72-
config.priority if config else "",
75+
priority,
7376
self.__class__.mro()[-3].__name__,
7477
)

eodag/plugins/crunch/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,17 @@
1616
# See the License for the specific language governing permissions and
1717
# limitations under the License.
1818
"""EODAG plugins.crunch package"""
19+
from .filter_date import Crunch, FilterDate
20+
from .filter_latest_intersect import FilterLatestIntersect
21+
from .filter_latest_tpl_name import FilterLatestByName
22+
from .filter_overlap import FilterOverlap
23+
from .filter_property import FilterProperty
24+
25+
__all__ = [
26+
"Crunch",
27+
"FilterDate",
28+
"FilterLatestIntersect",
29+
"FilterLatestByName",
30+
"FilterOverlap",
31+
"FilterProperty",
32+
]

eodag/plugins/crunch/base.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
# limitations under the License
1818
from __future__ import annotations
1919

20+
from abc import abstractmethod
2021
from typing import TYPE_CHECKING, Any, Optional
2122

2223
from eodag.config import PluginConfig
@@ -32,10 +33,11 @@ class Crunch(PluginTopic):
3233
:param config: Crunch configuration
3334
"""
3435

35-
def __init__(self, config: Optional[dict[str, Any]]) -> None:
36+
def __init__(self, config: Optional[dict[str, Any]] = None) -> None:
3637
self.config = PluginConfig()
3738
self.config.__dict__ = config if config is not None else {}
3839

40+
@abstractmethod
3941
def proceed(
4042
self, products: list[EOProduct], **search_params: Any
4143
) -> list[EOProduct]:

eodag/plugins/crunch/filter_latest_intersect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def proceed(
6666
:returns: The filtered products
6767
"""
6868
logger.debug("Start filtering for latest products")
69-
if not products:
69+
if not products or (isinstance(products, list) and len(products) == 0):
7070
return []
7171
# Warning: May crash if start_datetime is not in the appropriate format
7272
products.sort(key=self.sort_product_by_start_date, reverse=True)

eodag/plugins/crunch/filter_latest_tpl_name.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ class FilterLatestByName(Crunch):
4242

4343
NAME_PATTERN_CONSTRAINT = re.compile(r"\(\?P<tileid>\\d\{6\}\)")
4444

45-
def __init__(self, config: dict[str, Any]) -> None:
45+
def __init__(self, config: Optional[dict[str, Any]] = None) -> None:
46+
if config is None:
47+
config = {}
4648
super(FilterLatestByName, self).__init__(config)
49+
if "name_pattern" not in config:
50+
raise ValidationError('Required parameter "name_pattern" in config')
4751
name_pattern = config.pop("name_pattern")
4852
if not self.NAME_PATTERN_CONSTRAINT.search(name_pattern):
4953
raise ValidationError(

0 commit comments

Comments
 (0)