eodag 2.12.1__py3-none-any.whl → 3.0.0b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. eodag/api/core.py +440 -321
  2. eodag/api/product/__init__.py +5 -1
  3. eodag/api/product/_assets.py +57 -2
  4. eodag/api/product/_product.py +89 -68
  5. eodag/api/product/metadata_mapping.py +181 -66
  6. eodag/api/search_result.py +48 -1
  7. eodag/cli.py +20 -6
  8. eodag/config.py +95 -6
  9. eodag/plugins/apis/base.py +8 -165
  10. eodag/plugins/apis/ecmwf.py +36 -24
  11. eodag/plugins/apis/usgs.py +40 -24
  12. eodag/plugins/authentication/aws_auth.py +2 -2
  13. eodag/plugins/authentication/header.py +31 -6
  14. eodag/plugins/authentication/keycloak.py +13 -84
  15. eodag/plugins/authentication/oauth.py +3 -3
  16. eodag/plugins/authentication/openid_connect.py +256 -46
  17. eodag/plugins/authentication/qsauth.py +3 -0
  18. eodag/plugins/authentication/sas_auth.py +8 -1
  19. eodag/plugins/authentication/token.py +92 -46
  20. eodag/plugins/authentication/token_exchange.py +120 -0
  21. eodag/plugins/download/aws.py +86 -91
  22. eodag/plugins/download/base.py +72 -40
  23. eodag/plugins/download/http.py +607 -264
  24. eodag/plugins/download/s3rest.py +28 -15
  25. eodag/plugins/manager.py +74 -57
  26. eodag/plugins/search/__init__.py +36 -0
  27. eodag/plugins/search/base.py +225 -18
  28. eodag/plugins/search/build_search_result.py +389 -32
  29. eodag/plugins/search/cop_marine.py +378 -0
  30. eodag/plugins/search/creodias_s3.py +15 -14
  31. eodag/plugins/search/csw.py +5 -7
  32. eodag/plugins/search/data_request_search.py +44 -20
  33. eodag/plugins/search/qssearch.py +508 -203
  34. eodag/plugins/search/static_stac_search.py +99 -36
  35. eodag/resources/constraints/climate-dt.json +13 -0
  36. eodag/resources/constraints/extremes-dt.json +8 -0
  37. eodag/resources/ext_product_types.json +1 -1
  38. eodag/resources/product_types.yml +1897 -34
  39. eodag/resources/providers.yml +3539 -3277
  40. eodag/resources/stac.yml +48 -54
  41. eodag/resources/stac_api.yml +71 -25
  42. eodag/resources/stac_provider.yml +5 -0
  43. eodag/resources/user_conf_template.yml +51 -3
  44. eodag/rest/__init__.py +6 -0
  45. eodag/rest/cache.py +70 -0
  46. eodag/rest/config.py +68 -0
  47. eodag/rest/constants.py +27 -0
  48. eodag/rest/core.py +757 -0
  49. eodag/rest/server.py +397 -258
  50. eodag/rest/stac.py +438 -307
  51. eodag/rest/types/collections_search.py +44 -0
  52. eodag/rest/types/eodag_search.py +232 -43
  53. eodag/rest/types/{stac_queryables.py → queryables.py} +81 -43
  54. eodag/rest/types/stac_search.py +277 -0
  55. eodag/rest/utils/__init__.py +216 -0
  56. eodag/rest/utils/cql_evaluate.py +119 -0
  57. eodag/rest/utils/rfc3339.py +65 -0
  58. eodag/types/__init__.py +99 -9
  59. eodag/types/bbox.py +15 -14
  60. eodag/types/download_args.py +31 -0
  61. eodag/types/search_args.py +58 -7
  62. eodag/types/whoosh.py +81 -0
  63. eodag/utils/__init__.py +72 -9
  64. eodag/utils/constraints.py +37 -37
  65. eodag/utils/exceptions.py +23 -17
  66. eodag/utils/repr.py +113 -0
  67. eodag/utils/requests.py +138 -0
  68. eodag/utils/rest.py +104 -0
  69. eodag/utils/stac_reader.py +100 -16
  70. {eodag-2.12.1.dist-info → eodag-3.0.0b2.dist-info}/METADATA +65 -44
  71. eodag-3.0.0b2.dist-info/RECORD +110 -0
  72. {eodag-2.12.1.dist-info → eodag-3.0.0b2.dist-info}/WHEEL +1 -1
  73. {eodag-2.12.1.dist-info → eodag-3.0.0b2.dist-info}/entry_points.txt +6 -5
  74. eodag/plugins/apis/cds.py +0 -540
  75. eodag/rest/utils.py +0 -1133
  76. eodag-2.12.1.dist-info/RECORD +0 -94
  77. {eodag-2.12.1.dist-info → eodag-3.0.0b2.dist-info}/LICENSE +0 -0
  78. {eodag-2.12.1.dist-info → eodag-3.0.0b2.dist-info}/top_level.txt +0 -0
@@ -27,8 +27,9 @@ from urllib.request import urlopen
27
27
  import concurrent.futures
28
28
  import orjson
29
29
  import pystac
30
+ from pystac.stac_object import STACObjectType
30
31
 
31
- from eodag.utils import HTTP_REQ_TIMEOUT
32
+ from eodag.utils import HTTP_REQ_TIMEOUT, get_ssl_context
32
33
  from eodag.utils.exceptions import STACOpenerError
33
34
 
34
35
  logger = logging.getLogger("eodag.utils.stac_reader")
@@ -38,10 +39,11 @@ class _TextOpener:
38
39
  """Exhaust read methods for pystac.StacIO in the order defined
39
40
  in the openers list"""
40
41
 
41
- def __init__(self, timeout: int) -> None:
42
+ def __init__(self, timeout: int, ssl_verify: bool) -> None:
42
43
  self.openers = [self.read_local_json, self.read_http_remote_json]
43
44
  # Only used by read_http_remote_json
44
45
  self.timeout = timeout
46
+ self.ssl_verify = ssl_verify
45
47
 
46
48
  @staticmethod
47
49
  def read_local_json(url: str, as_json: bool = False) -> Any:
@@ -54,13 +56,14 @@ class _TextOpener:
54
56
  with open(url) as f:
55
57
  return f.read()
56
58
  except OSError:
57
- logger.debug("read_local_json is not the right STAC opener")
58
- raise STACOpenerError
59
+ raise STACOpenerError("read_local_json is not the right STAC opener")
59
60
 
60
61
  def read_http_remote_json(self, url: str, as_json: bool = False) -> Any:
61
62
  """Read JSON remote HTTP file"""
63
+ ssl_ctx = get_ssl_context(self.ssl_verify)
64
+
62
65
  try:
63
- res = urlopen(url, timeout=self.timeout)
66
+ res = urlopen(url, timeout=self.timeout, context=ssl_ctx)
64
67
  content_type = res.getheader("Content-Type")
65
68
  if content_type is None:
66
69
  encoding = "utf-8"
@@ -79,17 +82,19 @@ class _TextOpener:
79
82
  f"{url} with a timeout of {self.timeout} seconds"
80
83
  ) from None
81
84
  else:
82
- logger.debug("read_http_remote_json is not the right STAC opener")
83
- raise STACOpenerError
85
+ raise STACOpenerError(
86
+ "read_http_remote_json is not the right STAC opener"
87
+ )
84
88
 
85
89
  def __call__(self, url: str, as_json: bool = False) -> Any:
90
+ openers = self.openers[:]
86
91
  res = None
87
- while self.openers:
92
+ while openers:
88
93
  try:
89
- res = self.openers[0](url, as_json)
94
+ res = openers[0](url, as_json)
90
95
  except STACOpenerError:
91
96
  # Remove the opener that just failed
92
- self.openers.pop(0)
97
+ openers.pop(0)
93
98
  if res is not None:
94
99
  break
95
100
  if res is None:
@@ -102,6 +107,7 @@ def fetch_stac_items(
102
107
  recursive: bool = False,
103
108
  max_connections: int = 100,
104
109
  timeout: int = HTTP_REQ_TIMEOUT,
110
+ ssl_verify: bool = True,
105
111
  ) -> List[Dict[str, Any]]:
106
112
  """Fetch STAC item from a single item file or items from a catalog.
107
113
 
@@ -112,14 +118,16 @@ def fetch_stac_items(
112
118
  :param max_connections: (optional) Maximum number of connections for HTTP requests
113
119
  :type max_connections: int
114
120
  :param timeout: (optional) Timeout in seconds for each internal HTTP request
115
- :type timeout: float
121
+ :type timeout: int
122
+ :param ssl_verify: (optional) SSL Verification for HTTP request
123
+ :type ssl_verify: bool
116
124
  :returns: The items found in `stac_path`
117
125
  :rtype: :class:`list`
118
126
  """
119
127
 
120
128
  # URI opener used by PySTAC internally, instantiated here
121
129
  # to retrieve the timeout.
122
- _text_opener = _TextOpener(timeout)
130
+ _text_opener = _TextOpener(timeout, ssl_verify)
123
131
  pystac.StacIO.read_text = _text_opener
124
132
 
125
133
  stac_obj = pystac.read_file(stac_path)
@@ -142,6 +150,8 @@ def _fetch_stac_items_from_catalog(
142
150
  _text_opener: Callable[[str, bool], Any],
143
151
  ) -> List[Any]:
144
152
  """Fetch items from a STAC catalog"""
153
+ items: List[Dict[Any, Any]] = []
154
+
145
155
  # pystac cannot yet return links from a single file catalog, see:
146
156
  # https://github.com/stac-utils/pystac/issues/256
147
157
  extensions: Optional[Union[List[str], str]] = getattr(cat, "stac_extensions", None)
@@ -151,8 +161,7 @@ def _fetch_stac_items_from_catalog(
151
161
  items = [feature for feature in cat.to_dict()["features"]]
152
162
  return items
153
163
 
154
- # Making the links absolutes allow for both relative and absolute links
155
- # to be handled.
164
+ # Making the links absolutes allow for both relative and absolute links to be handled.
156
165
  if not recursive:
157
166
  hrefs: List[Optional[str]] = [
158
167
  link.get_absolute_href() for link in cat.get_item_links()
@@ -164,7 +173,6 @@ def _fetch_stac_items_from_catalog(
164
173
  link.get_absolute_href() for link in parent_catalog.get_item_links()
165
174
  ]
166
175
 
167
- items: List[Dict[Any, Any]] = []
168
176
  if hrefs:
169
177
  logger.debug("Fetching %s items", len(hrefs))
170
178
  with concurrent.futures.ThreadPoolExecutor(
@@ -176,5 +184,81 @@ def _fetch_stac_items_from_catalog(
176
184
  for future in concurrent.futures.as_completed(future_to_href):
177
185
  item = future.result()
178
186
  if item:
179
- items.append(future.result())
187
+ items.append(item)
180
188
  return items
189
+
190
+
191
+ def fetch_stac_collections(
192
+ stac_path: str,
193
+ collection: Optional[str] = None,
194
+ max_connections: int = 100,
195
+ timeout: int = HTTP_REQ_TIMEOUT,
196
+ ssl_verify: bool = True,
197
+ ) -> List[Dict[str, Any]]:
198
+ """Fetch STAC collection(s) from a catalog.
199
+
200
+ :param stac_path: A STAC object filepath
201
+ :type stac_path: str
202
+ :param collection: the collection to fetch
203
+ :type collection: Optional[str]
204
+ :param max_connections: (optional) Maximum number of connections for HTTP requests
205
+ :type max_connections: int
206
+ :param timeout: (optional) Timeout in seconds for each internal HTTP request
207
+ :type timeout: int
208
+ :param ssl_verify: (optional) SSL Verification for HTTP request
209
+ :type ssl_verify: bool
210
+ :returns: The collection(s) found in `stac_path`
211
+ :rtype: :class:`list`
212
+ """
213
+
214
+ # URI opener used by PySTAC internally, instantiated here to retrieve the timeout.
215
+ _text_opener = _TextOpener(timeout, ssl_verify)
216
+ pystac.StacIO.read_text = _text_opener
217
+
218
+ stac_obj = pystac.read_file(stac_path)
219
+ if isinstance(stac_obj, pystac.Catalog):
220
+ return _fetch_stac_collections_from_catalog(
221
+ stac_obj, collection, max_connections, _text_opener
222
+ )
223
+ else:
224
+ raise STACOpenerError(f"{stac_path} must be a STAC catalog")
225
+
226
+
227
+ def _fetch_stac_collections_from_catalog(
228
+ cat: pystac.Catalog,
229
+ collection: Optional[str],
230
+ max_connections: int,
231
+ _text_opener: Callable[[str, bool], Any],
232
+ ) -> List[Any]:
233
+ """Fetch collections from a STAC catalog"""
234
+ collections: List[Dict[Any, Any]] = []
235
+
236
+ # Making the links absolutes allow for both relative and absolute links to be handled.
237
+ hrefs: List[Optional[str]] = [
238
+ link.get_absolute_href()
239
+ for link in cat.get_child_links()
240
+ if collection is not None and link.title == collection
241
+ ]
242
+ if len(hrefs) == 0:
243
+ hrefs = [link.get_absolute_href() for link in cat.get_child_links()]
244
+
245
+ if hrefs:
246
+ with concurrent.futures.ThreadPoolExecutor(
247
+ max_workers=max_connections
248
+ ) as executor:
249
+ future_to_href = (
250
+ executor.submit(_text_opener, str(href), True) for href in hrefs
251
+ )
252
+ for future in concurrent.futures.as_completed(future_to_href):
253
+ fetched_collection = future.result()
254
+ if (
255
+ fetched_collection
256
+ and fetched_collection["type"] == STACObjectType.COLLECTION
257
+ and (
258
+ collection is None
259
+ or collection is not None
260
+ and fetched_collection.get("id") == collection
261
+ )
262
+ ):
263
+ collections.append(fetched_collection)
264
+ return collections
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: eodag
3
- Version: 2.12.1
3
+ Version: 3.0.0b2
4
4
  Summary: Earth Observation Data Access Gateway
5
5
  Home-page: https://github.com/CS-SI/eodag
6
- Author: CS GROUP - France (CSSI)
6
+ Author: CS GROUP - France
7
7
  Author-email: eodag@csgroup.space
8
8
  License: Apache 2.0
9
9
  Project-URL: Bug Tracker, https://github.com/CS-SI/eodag/issues/
@@ -30,37 +30,38 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Requires-Python: >=3.6
31
31
  Description-Content-Type: text/x-rst
32
32
  License-File: LICENSE
33
- Requires-Dist: click
34
- Requires-Dist: requests
35
- Requires-Dist: urllib3
36
- Requires-Dist: python-dateutil
37
- Requires-Dist: PyYAML
38
- Requires-Dist: tqdm
39
- Requires-Dist: shapely
40
- Requires-Dist: pyshp
41
- Requires-Dist: OWSLib >=0.27.1
42
- Requires-Dist: orjson
43
- Requires-Dist: geojson
44
- Requires-Dist: pyproj >=2.1.0
45
- Requires-Dist: usgs >=0.3.1
33
+ Requires-Dist: annotated-types
46
34
  Requires-Dist: boto3
47
35
  Requires-Dist: botocore
48
- Requires-Dist: fastapi >=0.93.0
49
- Requires-Dist: starlette
50
- Requires-Dist: uvicorn
36
+ Requires-Dist: click
37
+ Requires-Dist: geojson
51
38
  Requires-Dist: jsonpath-ng <1.6.0
52
39
  Requires-Dist: lxml
53
- Requires-Dist: Whoosh
54
- Requires-Dist: pystac >=1.0.0b1
55
- Requires-Dist: ecmwf-api-client
56
- Requires-Dist: cdsapi
57
- Requires-Dist: stream-zip
58
- Requires-Dist: requests-ftp
59
40
  Requires-Dist: pydantic >=2.1.0
60
- Requires-Dist: typing-extensions
61
- Requires-Dist: annotated-types
41
+ Requires-Dist: pydantic-core
42
+ Requires-Dist: pyproj >=2.1.0
43
+ Requires-Dist: pyshp
44
+ Requires-Dist: pystac >=1.0.0b1
45
+ Requires-Dist: python-dateutil
46
+ Requires-Dist: PyYAML
47
+ Requires-Dist: requests
62
48
  Requires-Dist: setuptools
49
+ Requires-Dist: shapely >=2.0.0
50
+ Requires-Dist: stream-zip
51
+ Requires-Dist: tqdm
52
+ Requires-Dist: typing-extensions >=4.8.0
53
+ Requires-Dist: urllib3
54
+ Requires-Dist: Whoosh
55
+ Requires-Dist: orjson ; python_version < "3.12" or platform_system != "Windows"
56
+ Requires-Dist: orjson <3.10.0 ; python_version >= "3.12" and platform_system == "Windows"
57
+ Provides-Extra: all
58
+ Requires-Dist: eodag[all-providers,csw,server,tutorials] ; extra == 'all'
59
+ Provides-Extra: all-providers
60
+ Requires-Dist: eodag[ecmwf,usgs] ; extra == 'all-providers'
61
+ Provides-Extra: csw
62
+ Requires-Dist: OWSLib >=0.27.1 ; extra == 'csw'
63
63
  Provides-Extra: dev
64
+ Requires-Dist: eodag[all-providers,csw,server] ; extra == 'dev'
64
65
  Requires-Dist: pytest ; extra == 'dev'
65
66
  Requires-Dist: pytest-cov ; extra == 'dev'
66
67
  Requires-Dist: py >=1.8.2 ; extra == 'dev'
@@ -78,20 +79,28 @@ Requires-Dist: pre-commit ; extra == 'dev'
78
79
  Requires-Dist: responses <0.24.0 ; extra == 'dev'
79
80
  Requires-Dist: fastapi[all] ; extra == 'dev'
80
81
  Requires-Dist: stdlib-list ; extra == 'dev'
82
+ Requires-Dist: boto3-stubs[essential] ; extra == 'dev'
83
+ Requires-Dist: types-lxml ; extra == 'dev'
81
84
  Provides-Extra: docs
85
+ Requires-Dist: eodag[all] ; extra == 'docs'
82
86
  Requires-Dist: sphinx ; extra == 'docs'
83
- Requires-Dist: sphinx-book-theme <1.0.0 ; extra == 'docs'
87
+ Requires-Dist: sphinx-book-theme ; extra == 'docs'
84
88
  Requires-Dist: sphinx-copybutton ; extra == 'docs'
85
- Requires-Dist: sphinxcontrib-applehelp <1.0.8 ; extra == 'docs'
86
- Requires-Dist: sphinxcontrib-devhelp <1.0.6 ; extra == 'docs'
87
- Requires-Dist: sphinxcontrib-htmlhelp <2.0.5 ; extra == 'docs'
88
- Requires-Dist: sphinxcontrib-qthelp <1.0.7 ; extra == 'docs'
89
- Requires-Dist: sphinxcontrib-serializinghtml <1.1.10 ; extra == 'docs'
90
- Requires-Dist: sphinxcontrib-jquery ; extra == 'docs'
89
+ Requires-Dist: sphinx-tabs ; extra == 'docs'
91
90
  Requires-Dist: nbsphinx ; extra == 'docs'
91
+ Provides-Extra: ecmwf
92
+ Requires-Dist: ecmwf-api-client ; extra == 'ecmwf'
92
93
  Provides-Extra: notebook
93
94
  Requires-Dist: tqdm[notebook] ; extra == 'notebook'
95
+ Provides-Extra: server
96
+ Requires-Dist: fastapi >=0.93.0 ; extra == 'server'
97
+ Requires-Dist: pygeofilter ; extra == 'server'
98
+ Requires-Dist: starlette ; extra == 'server'
99
+ Requires-Dist: uvicorn[standard] ; extra == 'server'
100
+ Requires-Dist: pydantic-settings ; extra == 'server'
101
+ Requires-Dist: cachetools ; extra == 'server'
94
102
  Provides-Extra: tutorials
103
+ Requires-Dist: eodag[notebook] ; extra == 'tutorials'
95
104
  Requires-Dist: eodag-cube >=0.2.0 ; extra == 'tutorials'
96
105
  Requires-Dist: jupyter ; extra == 'tutorials'
97
106
  Requires-Dist: ipyleaflet >=0.10.0 ; extra == 'tutorials'
@@ -101,38 +110,44 @@ Requires-Dist: folium ; extra == 'tutorials'
101
110
  Requires-Dist: imageio ; extra == 'tutorials'
102
111
  Requires-Dist: rasterio ; extra == 'tutorials'
103
112
  Requires-Dist: netcdf4 ; extra == 'tutorials'
113
+ Provides-Extra: usgs
114
+ Requires-Dist: usgs >=0.3.1 ; extra == 'usgs'
104
115
 
105
116
  .. image:: https://eodag.readthedocs.io/en/latest/_static/eodag_bycs.png
106
117
  :target: https://github.com/CS-SI/eodag
107
118
 
108
119
  |
109
120
 
110
- .. image:: https://badge.fury.io/py/eodag.svg
121
+ .. |pypi-badge| image:: https://badge.fury.io/py/eodag.svg
111
122
  :target: https://badge.fury.io/py/eodag
112
123
 
113
- .. image:: https://img.shields.io/conda/vn/conda-forge/eodag
124
+ .. |conda-badge| image:: https://img.shields.io/conda/vn/conda-forge/eodag
114
125
  :target: https://anaconda.org/conda-forge/eodag
115
126
 
116
- .. image:: https://readthedocs.org/projects/eodag/badge/?version=latest&style=flat
127
+ .. |rtd-badge| image:: https://readthedocs.org/projects/eodag/badge/?version=latest&style=flat
117
128
  :target: https://eodag.readthedocs.io/en/latest/
118
129
 
119
- .. image:: https://github.com/CS-SI/eodag/actions/workflows/test.yml/badge.svg
130
+ .. |gha-badge| image:: https://github.com/CS-SI/eodag/actions/workflows/test.yml/badge.svg
120
131
  :target: https://github.com/CS-SI/eodag/actions
121
132
 
122
- .. image:: https://img.shields.io/github/issues/CS-SI/eodag.svg
133
+ .. |ghi-badge| image:: https://img.shields.io/github/issues/CS-SI/eodag.svg
123
134
  :target: https://github.com/CS-SI/eodag/issues
124
135
 
125
- .. image:: https://mybinder.org/badge_logo.svg
136
+ .. |binder-badge| image:: https://mybinder.org/badge_logo.svg
126
137
  :target: https://mybinder.org/v2/git/https%3A%2F%2Fgithub.com%2FCS-SI%2Feodag.git/master?filepath=docs%2Fnotebooks%2Fintro_notebooks.ipynb
127
138
 
139
+ |pypi-badge| |conda-badge| |rtd-badge| |gha-badge| |ghi-badge| |binder-badge|
140
+
128
141
  |
129
142
 
130
- .. image:: https://img.shields.io/pypi/l/eodag.svg
143
+ .. |license-badge| image:: https://img.shields.io/pypi/l/eodag.svg
131
144
  :target: https://pypi.org/project/eodag/
132
145
 
133
- .. image:: https://img.shields.io/pypi/pyversions/eodag.svg
146
+ .. |versions-badge| image:: https://img.shields.io/pypi/pyversions/eodag.svg
134
147
  :target: https://pypi.org/project/eodag/
135
148
 
149
+ |license-badge| |versions-badge|
150
+
136
151
  |
137
152
 
138
153
  ..
@@ -184,6 +199,9 @@ And with ``conda`` from the `conda-forge channel <https://anaconda.org/conda-for
184
199
 
185
200
  conda install -c conda-forge eodag
186
201
 
202
+ **[New in v3.0.0]** Please note that EODAG comes with a minimal set of dependencies. If you want more features, please install using one of
203
+ the `available extras <https://eodag.readthedocs.io/en/latest/getting_started_guide/install.html#optional-dependencies>`_.
204
+
187
205
  Usage
188
206
  =====
189
207
 
@@ -202,7 +220,7 @@ Example usage for interacting with the api in your Python code:
202
220
 
203
221
  dag = EODataAccessGateway()
204
222
 
205
- search_results, total_count = dag.search(
223
+ search_results = dag.search(
206
224
  productType='S2_MSI_L1C',
207
225
  geom={'lonmin': 1, 'latmin': 43.5, 'lonmax': 2, 'latmax': 44}, # accepts WKT polygons, shapely.geometry, ...
208
226
  start='2021-01-01',
@@ -216,10 +234,13 @@ This will search for Sentinel 2 level-1C products on the default provider and re
216
234
  an estimated total number of products matching the search criteria. And then it will download these products. Please
217
235
  check the `Python API User Guide <https://eodag.readthedocs.io/en/latest/api_user_guide.html>`_ for more details.
218
236
 
237
+ **[New in v3.0.0]** `search() <https://eodag.readthedocs.io/en/latest/notebooks/api_user_guide/4_search.html#search()>`_
238
+ method now returns only a single ``SearchResult`` instead of a 2 values tuple.
239
+
219
240
  STAC REST API
220
241
  -------------
221
242
 
222
- An eodag instance can be exposed through a STAC compliant REST api from the command line:
243
+ An eodag instance can be exposed through a STAC compliant REST api from the command line (``eodag[server]`` needed):
223
244
 
224
245
  .. code-block:: bash
225
246
 
@@ -277,7 +298,7 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
277
298
 
278
299
  .. code-block:: bash
279
300
 
280
- docker run -p 5000:5000 --rm csspace/eodag-server:2.12.1
301
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b2
281
302
 
282
303
  You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
283
304
  Simply run:
@@ -0,0 +1,110 @@
1
+ eodag/__init__.py,sha256=PwOPGPlRIeXvq5KFGlz4-obHsyeSgGPNCpQxiRt2mug,1696
2
+ eodag/cli.py,sha256=v3cyHFuH2LJVu7d_wKeKlPikFjO0H3I81nqTKGel0Gk,28704
3
+ eodag/config.py,sha256=pBM-fxbSphzFyK2q9Yw8MBEYKC3K5X_W7LiliBThgZc,26994
4
+ eodag/crunch.py,sha256=fLVAPGVPw31N_DrnFk4gkCpQZLMY8oBhK6NUSYmdr24,1099
5
+ eodag/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ eodag/api/__init__.py,sha256=ytr30NUVmEtmJTsp3QCwkCIhS1nF6UlFCv0vmySHN7g,735
7
+ eodag/api/core.py,sha256=w57S2sQ2INT1t-3_WWkkgpmzxSgAr34Vx_EtzMZ1LcA,106980
8
+ eodag/api/search_result.py,sha256=8_iZOJQF4x1uXq6IAegUnp5hxArqq9ylu1orJO2lrsc,8043
9
+ eodag/api/product/__init__.py,sha256=1PjvzrIDj22xHX67vzUt9WuAvO2CACku5xKaIx2ivuQ,994
10
+ eodag/api/product/_assets.py,sha256=fnucgOPT9D5NzFhKceiW7kBW-hcuZrOMjwXK6v57W6k,6663
11
+ eodag/api/product/_product.py,sha256=89Wkufl2ZjeiMLoOgUyloFW3cf_lIDfqOFjqssv4-lg,23570
12
+ eodag/api/product/metadata_mapping.py,sha256=AysipreYzax47iHR2e4C_6ZFh9KnhfNhi6uicOYpdEs,70755
13
+ eodag/api/product/drivers/__init__.py,sha256=mURgF0RpptZec5DIoCryNW4N_41g1Lao4BitMZ0dWZw,912
14
+ eodag/api/product/drivers/base.py,sha256=LObZ7LSJo7B5UGtRX9RjCJKle2rslAtSlwAjc__FpUU,1910
15
+ eodag/plugins/__init__.py,sha256=KQkD5aVwb9I6C-Rmi5ABEG1-j8w5FP1zKN12vagsT9Y,739
16
+ eodag/plugins/base.py,sha256=I-kxG83mh805kZldrgl--VTVBzDNtyE8f_MRkm1VLCY,2689
17
+ eodag/plugins/manager.py,sha256=h0TAM545suuwxOOp3_ysvdJEVJRz2P7V-5QSZAxbW1M,15480
18
+ eodag/plugins/apis/__init__.py,sha256=PyY4f7P2iu3MkLPnw5eOrVew2fuavbBL3Asci3Ulwoo,744
19
+ eodag/plugins/apis/base.py,sha256=MMGoyeRw72cS5EkRVmHsSpyh5BcPsL1EmzjKKG7zwMA,2669
20
+ eodag/plugins/apis/ecmwf.py,sha256=rZaQSKelB-MPsGNixK9T52-kLK0zxh2ZZMluPdsWP_I,10007
21
+ eodag/plugins/apis/usgs.py,sha256=M7YNM43zLOo92pIhPECKvi_Oldz4lwTtCgDJCtKO4Bs,16358
22
+ eodag/plugins/authentication/__init__.py,sha256=_LVw42Bb1IhGAZH5xHRaS4b1iFoF9e27KDZOyoSoJHY,1039
23
+ eodag/plugins/authentication/aws_auth.py,sha256=0-obK1rbF3D1o9D2Gejr8v9jaMn2Yh8f0EATq8DiG3c,2393
24
+ eodag/plugins/authentication/base.py,sha256=3UjNfOe1zAZbVG7CXi6CrOPG5ltwtl1ZUk3BtbpzSn4,2166
25
+ eodag/plugins/authentication/generic.py,sha256=cgC7VTFUPzqTbTHgoWTdnzlQ1i26hIUoKQOfkwta9Ps,1846
26
+ eodag/plugins/authentication/header.py,sha256=mAduHrwu4rhJpneuvocQ765XRxMICZij614TfgxM_J4,3922
27
+ eodag/plugins/authentication/keycloak.py,sha256=eJIIldEyh63MKZOWnEAxPyzSEZEU2Aw7R8BITEyqkT8,5964
28
+ eodag/plugins/authentication/oauth.py,sha256=x39Fcx6x1mOwc5BlukrJCVnGVu1XhU6ikRCWsQip5q0,1545
29
+ eodag/plugins/authentication/openid_connect.py,sha256=Xk6gfAMyZSc1IHgVMuRb3q15WvN4m1qawIs0BMZeVdU,22419
30
+ eodag/plugins/authentication/qsauth.py,sha256=54bI9V6cn6LcLR5q2lKBVuY3BqiKG5zdIeYBrgRj6zI,3614
31
+ eodag/plugins/authentication/sas_auth.py,sha256=cOpXqKHKXM-PWXCEbpZzDoa5hWjKT512k8aYC-HgeHM,3939
32
+ eodag/plugins/authentication/token.py,sha256=yBFD4tkDUCtwKg6hAKbEp0Op9SM4B9ELzJnA1SIrYGM,8073
33
+ eodag/plugins/authentication/token_exchange.py,sha256=KsWXNw-zywh3t8AvAyFOYqWHP6PmsdfAeb53xp-gj_M,4447
34
+ eodag/plugins/crunch/__init__.py,sha256=58D7kJhEpHJWobIKaNFPynfbSqAWgS90BiHzitqS5Ds,746
35
+ eodag/plugins/crunch/base.py,sha256=ceVbBFo73BhlQaaww6K_ReVziv_a_W-RUQBeQD908_U,1297
36
+ eodag/plugins/crunch/filter_date.py,sha256=bX1rr-p1Eoa6gksqu2xKYBXZEeLUwWfv6UEVlHvKqXM,4525
37
+ eodag/plugins/crunch/filter_latest_intersect.py,sha256=mXgiOCbeCEgMwYAZ7GQzfKW0ANBSnkOtarmpJi3pp0E,4531
38
+ eodag/plugins/crunch/filter_latest_tpl_name.py,sha256=5I2ewq5al2KzJFyEiY971De1vbARTaJ4_TA0gQvhCbM,3848
39
+ eodag/plugins/crunch/filter_overlap.py,sha256=9Vdb01RXDl90oCIz_2mLlHqBZSkq1c7pYV6r7zMY5IQ,7361
40
+ eodag/plugins/crunch/filter_property.py,sha256=jMyHL1bhj7EhPWq8A-k1FoOpOFKtvGvJ0hZjCxq561Y,3419
41
+ eodag/plugins/download/__init__.py,sha256=zqszaeNgYP0YHlZDkLMf6odcwNw0KrAahGpcA-l0kAw,740
42
+ eodag/plugins/download/aws.py,sha256=QRNkQ1cBn483DhGVtwCBFtktVAgFPuxRrgMREwki17I,56076
43
+ eodag/plugins/download/base.py,sha256=Ypmnl30qZS3_bsPRPI93zm2CbypqZgsokuyAaVLi37o,32017
44
+ eodag/plugins/download/creodias_s3.py,sha256=xAg_wxBiQ2PrIW9PYvLIU9bJAjl1PnRRumirE-b19Uo,2255
45
+ eodag/plugins/download/http.py,sha256=NBfTpczp83UllU0bdmEkHqHf2IMzgmv5fnpsPyW7ibw,55259
46
+ eodag/plugins/download/s3rest.py,sha256=Xp1Ui7sHYR0a2J-yAt4vlnzIPw2xhgPNikyjvqzRSG8,14635
47
+ eodag/plugins/search/__init__.py,sha256=j-Hqf3MTJUd5fkza5GV6R5zmHzfED4qRfNjCfHGHpjk,1882
48
+ eodag/plugins/search/base.py,sha256=NGUNMaLH5p0dqkUESXit8V63k2_hm5YbItMjJU_63gc,16076
49
+ eodag/plugins/search/build_search_result.py,sha256=hceTjAa704g0SU0RkQmX0ZhJG1Tz3GN47_2t0hBgru4,22199
50
+ eodag/plugins/search/cop_marine.py,sha256=RaNSWNXG-COp50jCyOznwX2aqWidmgLmXeZ41zTMdR8,15102
51
+ eodag/plugins/search/creodias_s3.py,sha256=zDlavnkLe9vngnkDJvhkPglRKZm77dLljiAW3Prb6Nk,5645
52
+ eodag/plugins/search/csw.py,sha256=qZkjd_HtZwmCSOqeCEgJUJ9GEgfKks0VmwRi12zjrQU,9664
53
+ eodag/plugins/search/data_request_search.py,sha256=w7rykBm-ZBC24nKD4RFWQKw_rQWvwCffrQbteUJZN04,18619
54
+ eodag/plugins/search/qssearch.py,sha256=Ljn_hxag3PE8CQCDAhdCalMVe_W0ccIh4ZM0LsLEPLY,72473
55
+ eodag/plugins/search/static_stac_search.py,sha256=9dbX_Nw-R6VpeRNctgFyuuNCS0892Wj58rvvKE2MiEE,8691
56
+ eodag/resources/ext_product_types.json,sha256=EfOhi4Dub-sP_i4unfiUH1RZ7ACy4NDM54FitL4AhtU,1550087
57
+ eodag/resources/locations_conf_template.yml,sha256=_eBv-QKHYMIKhY0b0kp4Ee33RsayxN8LWH3kDXxfFSk,986
58
+ eodag/resources/product_types.yml,sha256=L8N9vRaylB3VlQSE7dmtCB9ARu8tCpeWsKcAfCcGkN4,362918
59
+ eodag/resources/providers.yml,sha256=YwJF4qRxr33C_IfBD-S0zk2eyL3ZX_SuTXvNnhm-3uI,255877
60
+ eodag/resources/stac.yml,sha256=PWIwzr-du7XfV7Jz3F9tTeMkZzUbh1gVTYnJkwVoch0,15204
61
+ eodag/resources/stac_api.yml,sha256=3wz1rAfxb_IWJHBdIONA7JPpAYVJpo9pzlSPFwfb41s,68893
62
+ eodag/resources/stac_provider.yml,sha256=2yfdnuhJYV1f5el3aFkunoPqHAcD8oCDzvASbmldIvY,6703
63
+ eodag/resources/user_conf_template.yml,sha256=1bw00c4tPhtumz2Euq5bD8-yX_mrTqOAH2DTmC5myDA,7512
64
+ eodag/resources/constraints/climate-dt.json,sha256=4JjtzvOKdRTi22d2R0rqVpJbfO7TWfpdDqttRSyGsaI,247814
65
+ eodag/resources/constraints/extremes-dt.json,sha256=b7AVXWWdygqHPRdqR8gxStkJy5ou6ds2utfAJzaVyQA,5507
66
+ eodag/resources/shp/ne_110m_admin_0_map_units.VERSION.txt,sha256=CHSo_jbv-4d4D0MYRbWn2FvmV_K9mYzo7qznF4YNO3g,7
67
+ eodag/resources/shp/ne_110m_admin_0_map_units.cpg,sha256=FG1nif_gM6UpfBrQRuamLuNTGbhrAhRE8FtuoqqKH0o,6
68
+ eodag/resources/shp/ne_110m_admin_0_map_units.dbf,sha256=uEEO22hZ_crWxMNhuQ_ix889c1Us1awYXAglxbf1K-s,393747
69
+ eodag/resources/shp/ne_110m_admin_0_map_units.prj,sha256=oaohy2UQUlLMiTy3HhYS1Kurl_7z3A3LYcOmVf_TbNo,148
70
+ eodag/resources/shp/ne_110m_admin_0_map_units.shp,sha256=GMVJQ1pe0JfaJnVfAew0MvembDJDkfUs0To2Qc82Aos,181628
71
+ eodag/resources/shp/ne_110m_admin_0_map_units.shx,sha256=N74fDl6sQAljmHQ_e9DO7suO6BXuwC0LwmriAnDBH-U,1564
72
+ eodag/rest/__init__.py,sha256=v4SI9gLuFP81YXi5_k98lvVNGzz6h8YZ_aUdhKAbE2M,916
73
+ eodag/rest/cache.py,sha256=zGqVt8AAbqwhRmWmAbRPLMJgEb1ZD67WO-QnWwoe3a4,2103
74
+ eodag/rest/config.py,sha256=mNXmixiRBpV_39sUlrl_r2H7PFyYfHyvvv1mxy49xjg,2141
75
+ eodag/rest/constants.py,sha256=HJgCQcMgSdBgwYX9-ozNlrFT-htU2-lxLGuGqp1nR6E,977
76
+ eodag/rest/core.py,sha256=pcC5r3nlQCBcI25jgoP4TaKk24GTMhX97ZawRXfCXWg,25462
77
+ eodag/rest/server.py,sha256=9N2wrwKCMAh5vVh-eff4B21KCwTcONMST9Kj2VfkhM0,26727
78
+ eodag/rest/server.wsgi,sha256=ssM4JQi8tZpOYj03CTdM0weyUF1b3Lbh38pdD-vBfXs,152
79
+ eodag/rest/stac.py,sha256=62tQ8NrAP1d3byRgMvB3G-PotevGnMeW_KNcph2YuBw,54998
80
+ eodag/rest/templates/README,sha256=qFgCBE6XC4YiXkpPoSHkYbMTQr8Zg5Wc5eAKVcooXmw,57
81
+ eodag/rest/types/__init__.py,sha256=Bu0C3dzXHe8kocnz2PIHV0GjQWlAQas6ToIfwusNPQs,742
82
+ eodag/rest/types/collections_search.py,sha256=76dvL9y_Cq0ERoJdAn6btXx-0EFWxlfPYSoO7xkFA7c,1533
83
+ eodag/rest/types/eodag_search.py,sha256=y00Ur1aPe5uXHLZfokQ4xr47mNoExW2kUexlYPjFSe4,13934
84
+ eodag/rest/types/queryables.py,sha256=KdhdvB2WMx__ga2WLhqg9q08LWVTi5fgJESOc9QixcM,6378
85
+ eodag/rest/types/stac_search.py,sha256=mrjAHvxshfNihY7CX_MzaJVgGWe7rW2TLPuPAxy9Uu4,8919
86
+ eodag/rest/utils/__init__.py,sha256=D6SWRK_UF3yY-s1PweehJ1Oesnyw6ySMrhxQzjn3dJs,6544
87
+ eodag/rest/utils/cql_evaluate.py,sha256=cren4gxNyi_3gIEq0CADpqyi5sVnr93rY26CXWCyM3Y,4106
88
+ eodag/rest/utils/rfc3339.py,sha256=qZTC9vo7ZcA-vEVKva3ActhPcXWDZ8iH-ZPXy_zp4Ic,2265
89
+ eodag/types/__init__.py,sha256=d4Zj9Cdrk3HSv3c9mRUv1WhiQAjihdNMUJu-Ckk8eGE,11471
90
+ eodag/types/bbox.py,sha256=okc8oFgvoSTQnXJew740i41HArAoSD36Xjr_XmZ1Q4M,4373
91
+ eodag/types/download_args.py,sha256=0w6CSa_avJjgQkheqH0igGT7ZPariJ7ylrX8BsMX9-4,1005
92
+ eodag/types/queryables.py,sha256=oELD822--6aZiJGG82eIH3HLKHcmUpXW-gL5TtaN-WQ,6010
93
+ eodag/types/search_args.py,sha256=GvcKwYjaR_qiN8e2zX4v8oM70jcdqSmz6TmXrlpPJUo,5695
94
+ eodag/types/whoosh.py,sha256=mbvv-H1SHrUoo4vZtJJKzrHCh_4K-dlL-ulGyiyO1hI,2585
95
+ eodag/utils/__init__.py,sha256=hTBj4rpGCzKxvowfxRvfmyqQ8cTzNaexJgIiXeLaVhY,50147
96
+ eodag/utils/constraints.py,sha256=-UeU617odFupb-cYJoFq1Ztwv-XczA8sNj3Jm-dmi7M,9831
97
+ eodag/utils/exceptions.py,sha256=B4OYQD8yZfgS6HK4h-o-uTK0zDlIWzQXUGuvxJZHTSE,3564
98
+ eodag/utils/import_system.py,sha256=D6VqgkfcQFVfz82aJYILOMRIsY-fM5xcTAcBohyDpuc,4020
99
+ eodag/utils/logging.py,sha256=YcgiOb8iUzMGGoW_ppuZm77bKi96MpDyMANBvu0Bu4k,5143
100
+ eodag/utils/notebook.py,sha256=QkN9a6E9oinkUaBXeze0iYKusgqbMvV680dMrfm69Ao,2621
101
+ eodag/utils/repr.py,sha256=6ocR8WyatAvh0oAM40bj_FvIt_XMmu-sW0nPxbH9UnM,3683
102
+ eodag/utils/requests.py,sha256=Uy7CdkllPtVLRQ-GiZe4cOmLfUAEp8cyzPGVoXhE95g,4914
103
+ eodag/utils/rest.py,sha256=K5aVbbWOKHx7ncyvsDSJVgSOt9H8QW3bwaRQGdz9_B0,3491
104
+ eodag/utils/stac_reader.py,sha256=QPRK10fnJE5MHlcNmHqv2Wugu_a8y5Z3jBAd2zKuLBI,9507
105
+ eodag-3.0.0b2.dist-info/LICENSE,sha256=4MAecetnRTQw5DlHtiikDSzKWO1xVLwzM5_DsPMYlnE,10172
106
+ eodag-3.0.0b2.dist-info/METADATA,sha256=iURP2bGJkxeYDuhuLQ2Bg7jmFyVzgmn7lTUj6ZpB9-0,15081
107
+ eodag-3.0.0b2.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
108
+ eodag-3.0.0b2.dist-info/entry_points.txt,sha256=XKlXM_KuExc_-smc9Gf5MptkNkb-zFgz7bOX9kU7d8Y,2340
109
+ eodag-3.0.0b2.dist-info/top_level.txt,sha256=025IMTmVe5eDjIPP4KEFQKespOPMQdne4U4jOy8nftM,6
110
+ eodag-3.0.0b2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: setuptools (70.1.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -2,9 +2,8 @@
2
2
  eodag = eodag.cli:eodag
3
3
 
4
4
  [eodag.plugins.api]
5
- CdsApi = eodag.plugins.apis.cds:CdsApi
6
- EcmwfApi = eodag.plugins.apis.ecmwf:EcmwfApi
7
- UsgsApi = eodag.plugins.apis.usgs:UsgsApi
5
+ EcmwfApi = eodag.plugins.apis.ecmwf:EcmwfApi [ecmwf]
6
+ UsgsApi = eodag.plugins.apis.usgs:UsgsApi [usgs]
8
7
 
9
8
  [eodag.plugins.auth]
10
9
  AwsAuth = eodag.plugins.authentication.aws_auth:AwsAuth
@@ -14,6 +13,7 @@ HttpQueryStringAuth = eodag.plugins.authentication.qsauth:HttpQueryStringAuth
14
13
  KeycloakOIDCPasswordAuth = eodag.plugins.authentication.keycloak:KeycloakOIDCPasswordAuth
15
14
  OAuth = eodag.plugins.authentication.oauth:OAuth
16
15
  OIDCAuthorizationCodeFlowAuth = eodag.plugins.authentication.openid_connect:OIDCAuthorizationCodeFlowAuth
16
+ OIDCTokenExchangeAuth = eodag.plugins.authentication.token_exchange:OIDCTokenExchangeAuth
17
17
  SASAuth = eodag.plugins.authentication.sas_auth:SASAuth
18
18
  TokenAuth = eodag.plugins.authentication.token:TokenAuth
19
19
 
@@ -31,9 +31,10 @@ HTTPDownload = eodag.plugins.download.http:HTTPDownload
31
31
  S3RestDownload = eodag.plugins.download.s3rest:S3RestDownload
32
32
 
33
33
  [eodag.plugins.search]
34
- AwsSearch = eodag.plugins.search.qssearch:AwsSearch
35
34
  BuildPostSearchResult = eodag.plugins.search.build_search_result:BuildPostSearchResult
36
- CSWSearch = eodag.plugins.search.csw:CSWSearch
35
+ BuildSearchResult = eodag.plugins.search.build_search_result:BuildSearchResult
36
+ CSWSearch = eodag.plugins.search.csw:CSWSearch [csw]
37
+ CopMarineSearch = eodag.plugins.search.cop_marine:CopMarineSearch
37
38
  CreodiasS3Search = eodag.plugins.search.creodias_s3:CreodiasS3Search
38
39
  DataRequestSearch = eodag.plugins.search.data_request_search:DataRequestSearch
39
40
  ODataV4Search = eodag.plugins.search.qssearch:ODataV4Search