eodag 3.0.0b3__py3-none-any.whl → 3.1.0__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 (94) hide show
  1. eodag/api/core.py +347 -247
  2. eodag/api/product/_assets.py +44 -15
  3. eodag/api/product/_product.py +58 -47
  4. eodag/api/product/drivers/__init__.py +81 -4
  5. eodag/api/product/drivers/base.py +65 -4
  6. eodag/api/product/drivers/generic.py +65 -0
  7. eodag/api/product/drivers/sentinel1.py +97 -0
  8. eodag/api/product/drivers/sentinel2.py +95 -0
  9. eodag/api/product/metadata_mapping.py +129 -93
  10. eodag/api/search_result.py +28 -12
  11. eodag/cli.py +61 -24
  12. eodag/config.py +457 -167
  13. eodag/plugins/apis/base.py +10 -4
  14. eodag/plugins/apis/ecmwf.py +53 -23
  15. eodag/plugins/apis/usgs.py +41 -17
  16. eodag/plugins/authentication/aws_auth.py +30 -18
  17. eodag/plugins/authentication/base.py +14 -3
  18. eodag/plugins/authentication/generic.py +14 -3
  19. eodag/plugins/authentication/header.py +14 -6
  20. eodag/plugins/authentication/keycloak.py +44 -25
  21. eodag/plugins/authentication/oauth.py +18 -4
  22. eodag/plugins/authentication/openid_connect.py +192 -171
  23. eodag/plugins/authentication/qsauth.py +12 -4
  24. eodag/plugins/authentication/sas_auth.py +22 -5
  25. eodag/plugins/authentication/token.py +95 -17
  26. eodag/plugins/authentication/token_exchange.py +19 -19
  27. eodag/plugins/base.py +4 -4
  28. eodag/plugins/crunch/base.py +8 -5
  29. eodag/plugins/crunch/filter_date.py +9 -6
  30. eodag/plugins/crunch/filter_latest_intersect.py +9 -8
  31. eodag/plugins/crunch/filter_latest_tpl_name.py +8 -8
  32. eodag/plugins/crunch/filter_overlap.py +9 -11
  33. eodag/plugins/crunch/filter_property.py +10 -10
  34. eodag/plugins/download/aws.py +181 -105
  35. eodag/plugins/download/base.py +49 -67
  36. eodag/plugins/download/creodias_s3.py +40 -2
  37. eodag/plugins/download/http.py +247 -223
  38. eodag/plugins/download/s3rest.py +29 -28
  39. eodag/plugins/manager.py +176 -41
  40. eodag/plugins/search/__init__.py +6 -5
  41. eodag/plugins/search/base.py +123 -60
  42. eodag/plugins/search/build_search_result.py +1046 -355
  43. eodag/plugins/search/cop_marine.py +132 -39
  44. eodag/plugins/search/creodias_s3.py +19 -68
  45. eodag/plugins/search/csw.py +48 -8
  46. eodag/plugins/search/data_request_search.py +124 -23
  47. eodag/plugins/search/qssearch.py +531 -310
  48. eodag/plugins/search/stac_list_assets.py +85 -0
  49. eodag/plugins/search/static_stac_search.py +23 -24
  50. eodag/resources/ext_product_types.json +1 -1
  51. eodag/resources/product_types.yml +1295 -355
  52. eodag/resources/providers.yml +1819 -3010
  53. eodag/resources/stac.yml +3 -163
  54. eodag/resources/stac_api.yml +2 -2
  55. eodag/resources/user_conf_template.yml +115 -99
  56. eodag/rest/cache.py +2 -2
  57. eodag/rest/config.py +3 -4
  58. eodag/rest/constants.py +0 -1
  59. eodag/rest/core.py +157 -117
  60. eodag/rest/errors.py +181 -0
  61. eodag/rest/server.py +57 -339
  62. eodag/rest/stac.py +133 -581
  63. eodag/rest/types/collections_search.py +3 -3
  64. eodag/rest/types/eodag_search.py +41 -30
  65. eodag/rest/types/queryables.py +42 -32
  66. eodag/rest/types/stac_search.py +15 -16
  67. eodag/rest/utils/__init__.py +14 -21
  68. eodag/rest/utils/cql_evaluate.py +6 -6
  69. eodag/rest/utils/rfc3339.py +2 -2
  70. eodag/types/__init__.py +153 -32
  71. eodag/types/bbox.py +2 -2
  72. eodag/types/download_args.py +4 -4
  73. eodag/types/queryables.py +183 -73
  74. eodag/types/search_args.py +6 -6
  75. eodag/types/whoosh.py +127 -3
  76. eodag/utils/__init__.py +228 -106
  77. eodag/utils/exceptions.py +47 -26
  78. eodag/utils/import_system.py +2 -2
  79. eodag/utils/logging.py +37 -77
  80. eodag/utils/repr.py +65 -6
  81. eodag/utils/requests.py +13 -15
  82. eodag/utils/rest.py +2 -2
  83. eodag/utils/s3.py +231 -0
  84. eodag/utils/stac_reader.py +11 -11
  85. {eodag-3.0.0b3.dist-info → eodag-3.1.0.dist-info}/METADATA +81 -81
  86. eodag-3.1.0.dist-info/RECORD +113 -0
  87. {eodag-3.0.0b3.dist-info → eodag-3.1.0.dist-info}/WHEEL +1 -1
  88. {eodag-3.0.0b3.dist-info → eodag-3.1.0.dist-info}/entry_points.txt +5 -2
  89. eodag/resources/constraints/climate-dt.json +0 -13
  90. eodag/resources/constraints/extremes-dt.json +0 -8
  91. eodag/utils/constraints.py +0 -244
  92. eodag-3.0.0b3.dist-info/RECORD +0 -110
  93. {eodag-3.0.0b3.dist-info → eodag-3.1.0.dist-info}/LICENSE +0 -0
  94. {eodag-3.0.0b3.dist-info → eodag-3.1.0.dist-info}/top_level.txt +0 -0
eodag/utils/s3.py ADDED
@@ -0,0 +1,231 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2024, CS GROUP - France, https://www.csgroup.eu/
3
+ #
4
+ # This file is part of EODAG project
5
+ # https://www.github.com/CS-SI/EODAG
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ from __future__ import annotations
19
+
20
+ import io
21
+ import logging
22
+ import os
23
+ import zipfile
24
+ from typing import TYPE_CHECKING, List, Optional
25
+ from urllib.parse import urlparse
26
+
27
+ import boto3
28
+ import botocore
29
+
30
+ from eodag.plugins.authentication.aws_auth import AwsAuth
31
+ from eodag.utils import get_bucket_name_and_prefix, guess_file_type
32
+ from eodag.utils.exceptions import (
33
+ AuthenticationError,
34
+ MisconfiguredError,
35
+ NotAvailableError,
36
+ )
37
+
38
+ if TYPE_CHECKING:
39
+ from zipfile import ZipFile, ZipInfo
40
+
41
+ from mypy_boto3_s3.client import S3Client
42
+
43
+ from eodag.api.product import EOProduct # type: ignore
44
+
45
+ logger = logging.getLogger("eodag.utils.s3")
46
+
47
+
48
+ def fetch(
49
+ bucket_name: str, key_name: str, start: int, len: int, client_s3: S3Client
50
+ ) -> bytes:
51
+ """
52
+ Range-fetches a S3 key.
53
+
54
+ :param bucket_name: Bucket name of the object to fetch
55
+ :param key_name: Key name of the object to fetch
56
+ :param start: Bucket name to fetch
57
+ :param len: Bucket name to fetch
58
+ :param client_s3: s3 client used to fetch the object
59
+ :returns: Object bytes
60
+ """
61
+ end = start + len - 1
62
+ s3_object = client_s3.get_object(
63
+ Bucket=bucket_name, Key=key_name, Range="bytes=%d-%d" % (start, end)
64
+ )
65
+ return s3_object["Body"].read()
66
+
67
+
68
+ def parse_int(bytes: bytes) -> int:
69
+ """
70
+ Parses 2 or 4 little-endian bits into their corresponding integer value.
71
+
72
+ :param bytes: bytes to parse
73
+ :returns: parsed int
74
+ """
75
+ val = (bytes[0]) + ((bytes[1]) << 8)
76
+ if len(bytes) > 3:
77
+ val += ((bytes[2]) << 16) + ((bytes[3]) << 24)
78
+ return val
79
+
80
+
81
+ def open_s3_zipped_object(
82
+ bucket_name: str, key_name: str, client_s3: S3Client, partial: bool = True
83
+ ) -> ZipFile:
84
+ """
85
+ Open s3 zipped object, without downloading it.
86
+
87
+ See https://stackoverflow.com/questions/41789176/how-to-count-files-inside-zip-in-aws-s3-without-downloading-it;
88
+ Based on https://stackoverflow.com/questions/51351000/read-zip-files-from-s3-without-downloading-the-entire-file
89
+
90
+ :param bucket_name: Bucket name of the object to fetch
91
+ :param key_name: Key name of the object to fetch
92
+ :param client_s3: s3 client used to fetch the object
93
+ :param partial: fetch partial data if only content info is needed
94
+ :returns: List of files in zip
95
+ """
96
+ response = client_s3.head_object(Bucket=bucket_name, Key=key_name)
97
+ size = response["ContentLength"]
98
+
99
+ # End Of Central Directory bytes
100
+ eocd = fetch(bucket_name, key_name, size - 22, 22, client_s3)
101
+
102
+ # start offset and size of the central directory
103
+ cd_start = parse_int(eocd[16:20])
104
+ cd_size = parse_int(eocd[12:16])
105
+
106
+ # fetch central directory, append EOCD, and open as zipfile
107
+ cd = fetch(bucket_name, key_name, cd_start, cd_size, client_s3)
108
+
109
+ zip_data = (
110
+ cd + eocd if partial else fetch(bucket_name, key_name, 0, size, client_s3)
111
+ )
112
+
113
+ zip = zipfile.ZipFile(io.BytesIO(zip_data))
114
+
115
+ return zip
116
+
117
+
118
+ def list_files_in_s3_zipped_object(
119
+ bucket_name: str, key_name: str, client_s3: S3Client
120
+ ) -> List[ZipInfo]:
121
+ """
122
+ List files in s3 zipped object, without downloading it.
123
+
124
+ See https://stackoverflow.com/questions/41789176/how-to-count-files-inside-zip-in-aws-s3-without-downloading-it;
125
+ Based on https://stackoverflow.com/questions/51351000/read-zip-files-from-s3-without-downloading-the-entire-file
126
+
127
+ :param bucket_name: Bucket name of the object to fetch
128
+ :param key_name: Key name of the object to fetch
129
+ :param client_s3: s3 client used to fetch the object
130
+ :returns: List of files in zip
131
+ """
132
+ with open_s3_zipped_object(bucket_name, key_name, client_s3) as zip_file:
133
+ logger.debug("Found %s files in %s" % (len(zip_file.filelist), key_name))
134
+ return zip_file.filelist
135
+
136
+
137
+ def update_assets_from_s3(
138
+ product: EOProduct,
139
+ auth: AwsAuth,
140
+ s3_endpoint: Optional[str] = None,
141
+ content_url: Optional[str] = None,
142
+ ) -> None:
143
+ """Update ``EOProduct.assets`` using content listed in its ``remote_location`` or given
144
+ ``content_url``.
145
+
146
+ If url points to a zipped archive, its content will also be be listed.
147
+
148
+ :param product: product to update
149
+ :param auth: Authentication plugin
150
+ :param s3_endpoint: s3 endpoint if not hosted on AWS
151
+ :param content_url: s3 URL pointing to the content that must be listed (defaults to
152
+ ``product.remote_location`` if empty)
153
+ """
154
+ required_creds = ["aws_access_key_id", "aws_secret_access_key"]
155
+
156
+ if content_url is None:
157
+ content_url = product.remote_location
158
+
159
+ bucket, prefix = get_bucket_name_and_prefix(content_url)
160
+
161
+ if bucket is None or prefix is None:
162
+ logger.debug(f"No s3 prefix could guessed from {content_url}")
163
+ return None
164
+
165
+ try:
166
+ auth_dict = auth.authenticate()
167
+
168
+ if not all(x in auth_dict for x in required_creds):
169
+ raise MisconfiguredError(
170
+ f"Incomplete credentials for {product.provider}, missing "
171
+ f"{[x for x in required_creds if x not in auth_dict]}"
172
+ )
173
+ if not getattr(auth, "s3_client", None):
174
+ auth.s3_client = boto3.client(
175
+ service_name="s3",
176
+ endpoint_url=s3_endpoint,
177
+ aws_access_key_id=auth_dict.get("aws_access_key_id"),
178
+ aws_secret_access_key=auth_dict.get("aws_secret_access_key"),
179
+ aws_session_token=auth_dict.get("aws_session_token"),
180
+ )
181
+
182
+ logger.debug("Listing assets in %s", prefix)
183
+
184
+ if prefix.endswith(".zip"):
185
+ # List prefix zip content
186
+ assets_urls = [
187
+ f"zip+s3://{bucket}/{prefix}!{f.filename}"
188
+ for f in list_files_in_s3_zipped_object(bucket, prefix, auth.s3_client)
189
+ ]
190
+ else:
191
+ # List files in prefix
192
+ assets_urls = [
193
+ f"s3://{bucket}/{obj['Key']}"
194
+ for obj in auth.s3_client.list_objects(
195
+ Bucket=bucket, Prefix=prefix, MaxKeys=300
196
+ ).get("Contents", [])
197
+ ]
198
+
199
+ for asset_url in assets_urls:
200
+ out_of_zip_url = asset_url.split("!")[-1]
201
+ key, roles = product.driver.guess_asset_key_and_roles(
202
+ out_of_zip_url, product
203
+ )
204
+ parsed_url = urlparse(out_of_zip_url)
205
+ title = os.path.basename(parsed_url.path)
206
+
207
+ if key and key not in product.assets:
208
+ product.assets[key] = {
209
+ "title": title,
210
+ "roles": roles,
211
+ "href": asset_url,
212
+ }
213
+ if mime_type := guess_file_type(asset_url):
214
+ product.assets[key]["type"] = mime_type
215
+
216
+ # sort assets
217
+ product.assets.data = dict(sorted(product.assets.data.items()))
218
+
219
+ # update driver
220
+ product.driver = product.get_driver()
221
+
222
+ except botocore.exceptions.ClientError as e:
223
+ if hasattr(auth.config, "auth_error_code") and str(
224
+ auth.config.auth_error_code
225
+ ) in str(e):
226
+ raise AuthenticationError(
227
+ f"Authentication failed on {s3_endpoint} s3"
228
+ ) from e
229
+ raise NotAvailableError(
230
+ f"assets for product {prefix} could not be found"
231
+ ) from e
@@ -20,7 +20,7 @@ from __future__ import annotations
20
20
  import logging
21
21
  import re
22
22
  import socket
23
- from typing import Any, Callable, Dict, List, Optional, Union
23
+ from typing import Any, Callable, Optional, Union
24
24
  from urllib.error import URLError
25
25
  from urllib.request import urlopen
26
26
 
@@ -108,12 +108,12 @@ def fetch_stac_items(
108
108
  max_connections: int = 100,
109
109
  timeout: int = HTTP_REQ_TIMEOUT,
110
110
  ssl_verify: bool = True,
111
- ) -> List[Dict[str, Any]]:
111
+ ) -> list[dict[str, Any]]:
112
112
  """Fetch STAC item from a single item file or items from a catalog.
113
113
 
114
114
  :param stac_path: A STAC object filepath
115
115
  :param recursive: (optional) Browse recursively in child nodes if True
116
- :param max_connections: (optional) Maximum number of connections for HTTP requests
116
+ :param max_connections: (optional) Maximum number of connections for concurrent HTTP requests
117
117
  :param timeout: (optional) Timeout in seconds for each internal HTTP request
118
118
  :param ssl_verify: (optional) SSL Verification for HTTP request
119
119
  :returns: The items found in `stac_path`
@@ -142,13 +142,13 @@ def _fetch_stac_items_from_catalog(
142
142
  recursive: bool,
143
143
  max_connections: int,
144
144
  _text_opener: Callable[[str, bool], Any],
145
- ) -> List[Any]:
145
+ ) -> list[Any]:
146
146
  """Fetch items from a STAC catalog"""
147
- items: List[Dict[Any, Any]] = []
147
+ items: list[dict[Any, Any]] = []
148
148
 
149
149
  # pystac cannot yet return links from a single file catalog, see:
150
150
  # https://github.com/stac-utils/pystac/issues/256
151
- extensions: Optional[Union[List[str], str]] = getattr(cat, "stac_extensions", None)
151
+ extensions: Optional[Union[list[str], str]] = getattr(cat, "stac_extensions", None)
152
152
  if extensions:
153
153
  extensions = extensions if isinstance(extensions, list) else [extensions]
154
154
  if "single-file-stac" in extensions:
@@ -157,7 +157,7 @@ def _fetch_stac_items_from_catalog(
157
157
 
158
158
  # Making the links absolutes allow for both relative and absolute links to be handled.
159
159
  if not recursive:
160
- hrefs: List[Optional[str]] = [
160
+ hrefs: list[Optional[str]] = [
161
161
  link.get_absolute_href() for link in cat.get_item_links()
162
162
  ]
163
163
  else:
@@ -188,7 +188,7 @@ def fetch_stac_collections(
188
188
  max_connections: int = 100,
189
189
  timeout: int = HTTP_REQ_TIMEOUT,
190
190
  ssl_verify: bool = True,
191
- ) -> List[Dict[str, Any]]:
191
+ ) -> list[dict[str, Any]]:
192
192
  """Fetch STAC collection(s) from a catalog.
193
193
 
194
194
  :param stac_path: A STAC object filepath
@@ -217,12 +217,12 @@ def _fetch_stac_collections_from_catalog(
217
217
  collection: Optional[str],
218
218
  max_connections: int,
219
219
  _text_opener: Callable[[str, bool], Any],
220
- ) -> List[Any]:
220
+ ) -> list[Any]:
221
221
  """Fetch collections from a STAC catalog"""
222
- collections: List[Dict[Any, Any]] = []
222
+ collections: list[dict[Any, Any]] = []
223
223
 
224
224
  # Making the links absolutes allow for both relative and absolute links to be handled.
225
- hrefs: List[Optional[str]] = [
225
+ hrefs: list[Optional[str]] = [
226
226
  link.get_absolute_href()
227
227
  for link in cat.get_child_links()
228
228
  if collection is not None and link.title == collection
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: eodag
3
- Version: 3.0.0b3
3
+ Version: 3.1.0
4
4
  Summary: Earth Observation Data Access Gateway
5
5
  Home-page: https://github.com/CS-SI/eodag
6
6
  Author: CS GROUP - France
@@ -18,11 +18,11 @@ Classifier: Operating System :: Microsoft :: Windows
18
18
  Classifier: Operating System :: POSIX :: Linux
19
19
  Classifier: Programming Language :: Python
20
20
  Classifier: Programming Language :: Python :: 3
21
- Classifier: Programming Language :: Python :: 3.8
22
21
  Classifier: Programming Language :: Python :: 3.9
23
22
  Classifier: Programming Language :: Python :: 3.10
24
23
  Classifier: Programming Language :: Python :: 3.11
25
24
  Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
27
  Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
28
28
  Classifier: Topic :: Scientific/Engineering :: GIS
@@ -36,91 +36,96 @@ Requires-Dist: boto3
36
36
  Requires-Dist: botocore
37
37
  Requires-Dist: click
38
38
  Requires-Dist: geojson
39
- Requires-Dist: jsonpath-ng <1.6.0
39
+ Requires-Dist: jsonpath-ng
40
40
  Requires-Dist: lxml
41
- Requires-Dist: pydantic >=2.1.0
42
- Requires-Dist: pydantic-core
43
- Requires-Dist: pyproj >=2.1.0
41
+ Requires-Dist: orjson
42
+ Requires-Dist: pydantic!=2.10.0,>=2.1.0
43
+ Requires-Dist: pydantic_core
44
+ Requires-Dist: PyJWT[crypto]>=2.5.0
45
+ Requires-Dist: pyproj>=2.1.0
44
46
  Requires-Dist: pyshp
45
- Requires-Dist: pystac >=1.0.0b1
47
+ Requires-Dist: pystac>=1.0.0b1
46
48
  Requires-Dist: python-dateutil
47
49
  Requires-Dist: PyYAML
48
50
  Requires-Dist: requests
49
51
  Requires-Dist: setuptools
50
- Requires-Dist: shapely >=2.0.0
52
+ Requires-Dist: shapely>=2.0.6
51
53
  Requires-Dist: stream-zip
52
54
  Requires-Dist: tqdm
53
- Requires-Dist: typing-extensions >=4.8.0
55
+ Requires-Dist: typing_extensions>=4.8.0
54
56
  Requires-Dist: urllib3
55
57
  Requires-Dist: Whoosh
56
- Requires-Dist: orjson ; python_version < "3.12" or platform_system != "Windows"
57
- Requires-Dist: orjson <3.10.0 ; python_version >= "3.12" and platform_system == "Windows"
58
58
  Provides-Extra: all
59
- Requires-Dist: eodag[all-providers,csw,server,tutorials] ; extra == 'all'
59
+ Requires-Dist: eodag[all-providers,csw,server,tutorials]; extra == "all"
60
60
  Provides-Extra: all-providers
61
- Requires-Dist: eodag[ecmwf,usgs] ; extra == 'all-providers'
61
+ Requires-Dist: eodag[ecmwf,usgs]; extra == "all-providers"
62
62
  Provides-Extra: csw
63
- Requires-Dist: OWSLib >=0.27.1 ; extra == 'csw'
64
- Provides-Extra: dev
65
- Requires-Dist: eodag[all-providers,csw,server,stubs] ; extra == 'dev'
66
- Requires-Dist: pytest ; extra == 'dev'
67
- Requires-Dist: pytest-cov ; extra == 'dev'
68
- Requires-Dist: py >=1.8.2 ; extra == 'dev'
69
- Requires-Dist: pytest-html <3.2.0 ; extra == 'dev'
70
- Requires-Dist: pytest-xdist ; extra == 'dev'
71
- Requires-Dist: pytest-socket ; extra == 'dev'
72
- Requires-Dist: pytest-instafail ; extra == 'dev'
73
- Requires-Dist: tox ; extra == 'dev'
74
- Requires-Dist: faker ; extra == 'dev'
75
- Requires-Dist: moto ; extra == 'dev'
76
- Requires-Dist: twine ; extra == 'dev'
77
- Requires-Dist: wheel ; extra == 'dev'
78
- Requires-Dist: flake8 ; extra == 'dev'
79
- Requires-Dist: pre-commit ; extra == 'dev'
80
- Requires-Dist: responses <0.24.0 ; extra == 'dev'
81
- Requires-Dist: fastapi[all] ; extra == 'dev'
82
- Requires-Dist: stdlib-list ; extra == 'dev'
83
- Requires-Dist: mypy ; extra == 'dev'
84
- Provides-Extra: docs
85
- Requires-Dist: eodag[all,stubs] ; extra == 'docs'
86
- Requires-Dist: sphinx ; extra == 'docs'
87
- Requires-Dist: sphinx-book-theme >=1.0.0 ; extra == 'docs'
88
- Requires-Dist: sphinx-copybutton ; extra == 'docs'
89
- Requires-Dist: sphinx-tabs ; extra == 'docs'
90
- Requires-Dist: nbsphinx ; extra == 'docs'
91
- Requires-Dist: sphinx-autodoc-typehints ; extra == 'docs'
63
+ Requires-Dist: OWSLib>=0.27.1; extra == "csw"
92
64
  Provides-Extra: ecmwf
93
- Requires-Dist: ecmwf-api-client ; extra == 'ecmwf'
94
- Provides-Extra: notebook
95
- Requires-Dist: tqdm[notebook] ; extra == 'notebook'
65
+ Requires-Dist: ecmwf-api-client; extra == "ecmwf"
66
+ Provides-Extra: usgs
67
+ Requires-Dist: usgs>=0.3.1; extra == "usgs"
96
68
  Provides-Extra: server
97
- Requires-Dist: fastapi >=0.93.0 ; extra == 'server'
98
- Requires-Dist: pygeofilter ; extra == 'server'
99
- Requires-Dist: starlette ; extra == 'server'
100
- Requires-Dist: uvicorn[standard] ; extra == 'server'
101
- Requires-Dist: pydantic-settings ; extra == 'server'
102
- Requires-Dist: cachetools ; extra == 'server'
103
- Provides-Extra: stubs
104
- Requires-Dist: boto3-stubs[essential] ; extra == 'stubs'
105
- Requires-Dist: types-lxml ; extra == 'stubs'
106
- Requires-Dist: types-cachetools ; extra == 'stubs'
107
- Requires-Dist: types-requests ; extra == 'stubs'
108
- Requires-Dist: types-python-dateutil ; extra == 'stubs'
109
- Requires-Dist: types-setuptools ; extra == 'stubs'
110
- Requires-Dist: types-tqdm ; extra == 'stubs'
69
+ Requires-Dist: fastapi>=0.93.0; extra == "server"
70
+ Requires-Dist: pygeofilter; extra == "server"
71
+ Requires-Dist: starlette; extra == "server"
72
+ Requires-Dist: uvicorn[standard]; extra == "server"
73
+ Requires-Dist: pydantic-settings; extra == "server"
74
+ Requires-Dist: cachetools; extra == "server"
75
+ Provides-Extra: notebook
76
+ Requires-Dist: tqdm[notebook]; extra == "notebook"
111
77
  Provides-Extra: tutorials
112
- Requires-Dist: eodag[ecmwf,notebook] ; extra == 'tutorials'
113
- Requires-Dist: eodag-cube >=0.2.0 ; extra == 'tutorials'
114
- Requires-Dist: jupyter ; extra == 'tutorials'
115
- Requires-Dist: ipyleaflet >=0.10.0 ; extra == 'tutorials'
116
- Requires-Dist: ipywidgets ; extra == 'tutorials'
117
- Requires-Dist: matplotlib ; extra == 'tutorials'
118
- Requires-Dist: folium ; extra == 'tutorials'
119
- Requires-Dist: imageio ; extra == 'tutorials'
120
- Requires-Dist: rasterio ; extra == 'tutorials'
121
- Requires-Dist: netcdf4 ; extra == 'tutorials'
122
- Provides-Extra: usgs
123
- Requires-Dist: usgs >=0.3.1 ; extra == 'usgs'
78
+ Requires-Dist: eodag[ecmwf,notebook]; extra == "tutorials"
79
+ Requires-Dist: eodag-cube>=0.6.0b2; extra == "tutorials"
80
+ Requires-Dist: jupyter; extra == "tutorials"
81
+ Requires-Dist: ipyleaflet>=0.10.0; extra == "tutorials"
82
+ Requires-Dist: ipywidgets; extra == "tutorials"
83
+ Requires-Dist: matplotlib; extra == "tutorials"
84
+ Requires-Dist: folium; extra == "tutorials"
85
+ Requires-Dist: imageio; extra == "tutorials"
86
+ Requires-Dist: rasterio; extra == "tutorials"
87
+ Requires-Dist: netcdf4; extra == "tutorials"
88
+ Requires-Dist: cartopy; extra == "tutorials"
89
+ Provides-Extra: dev
90
+ Requires-Dist: eodag[all-providers,csw,server,stubs]; extra == "dev"
91
+ Requires-Dist: pytest; extra == "dev"
92
+ Requires-Dist: pytest-cov; extra == "dev"
93
+ Requires-Dist: py>=1.8.2; extra == "dev"
94
+ Requires-Dist: pytest-html!=3.2.0; extra == "dev"
95
+ Requires-Dist: pytest-xdist; extra == "dev"
96
+ Requires-Dist: pytest-socket; extra == "dev"
97
+ Requires-Dist: pytest-instafail; extra == "dev"
98
+ Requires-Dist: tox; extra == "dev"
99
+ Requires-Dist: tox-uv; extra == "dev"
100
+ Requires-Dist: faker; extra == "dev"
101
+ Requires-Dist: moto>=5; extra == "dev"
102
+ Requires-Dist: twine; extra == "dev"
103
+ Requires-Dist: wheel; extra == "dev"
104
+ Requires-Dist: flake8; extra == "dev"
105
+ Requires-Dist: pre-commit; extra == "dev"
106
+ Requires-Dist: responses!=0.24.0; extra == "dev"
107
+ Requires-Dist: fastapi[all]; extra == "dev"
108
+ Requires-Dist: stdlib-list; extra == "dev"
109
+ Requires-Dist: mypy; extra == "dev"
110
+ Provides-Extra: stubs
111
+ Requires-Dist: boto3-stubs[essential]; extra == "stubs"
112
+ Requires-Dist: types-lxml; extra == "stubs"
113
+ Requires-Dist: types-cachetools; extra == "stubs"
114
+ Requires-Dist: types-requests; extra == "stubs"
115
+ Requires-Dist: types-python-dateutil; extra == "stubs"
116
+ Requires-Dist: types-PyYAML; extra == "stubs"
117
+ Requires-Dist: types-setuptools; extra == "stubs"
118
+ Requires-Dist: types-tqdm; extra == "stubs"
119
+ Requires-Dist: types-urllib3; extra == "stubs"
120
+ Provides-Extra: docs
121
+ Requires-Dist: eodag[all,stubs]; extra == "docs"
122
+ Requires-Dist: sphinx; extra == "docs"
123
+ Requires-Dist: sphinx-book-theme>=1.0.0; extra == "docs"
124
+ Requires-Dist: sphinx-copybutton; extra == "docs"
125
+ Requires-Dist: sphinx-tabs; extra == "docs"
126
+ Requires-Dist: nbsphinx; extra == "docs"
127
+ Requires-Dist: sphinx_autodoc_typehints; extra == "docs"
128
+ Requires-Dist: sphinxemoji; extra == "docs"
124
129
 
125
130
  .. image:: https://eodag.readthedocs.io/en/latest/_static/eodag_bycs.png
126
131
  :target: https://github.com/CS-SI/eodag
@@ -298,25 +303,20 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
298
303
  | jq ".numberMatched"
299
304
  6
300
305
 
301
- # browse for items
302
- $ curl "http://127.0.0.1:5000/catalogs/S2_MSI_L1C/country/FRA/year/2021/month/01/day/25/cloud_cover/10/items" \
303
- | jq ".numberMatched"
304
- 9
305
-
306
306
  # get download link
307
- $ curl "http://127.0.0.1:5000/catalogs/S2_MSI_L1C/country/FRA/year/2021/month/01/day/25/cloud_cover/10/items" \
307
+ $ curl "http://127.0.0.1:5000/collections/S2_MSI_L1C/items" \
308
308
  | jq ".features[0].assets.downloadLink.href"
309
- "http://127.0.0.1:5000/catalogs/S2_MSI_L1C/country/FRA/year/2021/month/01/day/25/cloud_cover/10/items/S2A_MSIL1C_20210125T105331_N0209_R051_T31UCR_20210125T130733/download"
309
+ "http://127.0.0.1:5002/collections/S2_MSI_L1C/items/S2B_MSIL1C_20240917T115259_N0511_R137_T21CWS_20240917T145134/download"
310
310
 
311
311
  # download
312
- $ wget "http://127.0.0.1:5000/catalogs/S2_MSI_L1C/country/FRA/year/2021/month/01/day/25/cloud_cover/10/items/S2A_MSIL1C_20210125T105331_N0209_R051_T31UCR_20210125T130733/download"
312
+ $ wget "http://127.0.0.1:5002/collections/S2_MSI_L1C/items/S2B_MSIL1C_20240917T115259_N0511_R137_T21CWS_20240917T145134/download"
313
313
 
314
314
 
315
315
  ``eodag-server`` is available on `https://hub.docker.com/r/csspace/eodag-server <https://hub.docker.com/r/csspace/eodag-server>`_:
316
316
 
317
317
  .. code-block:: bash
318
318
 
319
- docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b3
319
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.1.0
320
320
 
321
321
  You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
322
322
  Simply run:
@@ -0,0 +1,113 @@
1
+ eodag/__init__.py,sha256=qADIO6H3KR0CMs0qePdJROjSzcGnHaYpv-RFIk18WGQ,1608
2
+ eodag/cli.py,sha256=63QvLzyZEf6dsTB1jK_80lOTtp6fbjoSJROqKIL-mR4,29959
3
+ eodag/config.py,sha256=nHQQVsSFIGNHVxkE8fDdejQ1N2ut-58-TFv-SCfGunU,45659
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=tGMdrgJnm_7D5b2VoMCt-QeMOnOOfnhYiOwufDxpF6k,109426
8
+ eodag/api/search_result.py,sha256=ri3-5Jxr1Ik8V0uQtuXvnd3L3tSGS_niqpmHeaI2Obw,8176
9
+ eodag/api/product/__init__.py,sha256=klSKudmnHHeXvcwIX6Y30UTiP39tMfTwLNexSnAZnx0,1154
10
+ eodag/api/product/_assets.py,sha256=rFBvk0xFdy3Wp7yQNHhuE5yYzvfMSqX2N96f_TRq-ho,7198
11
+ eodag/api/product/_product.py,sha256=1Jz-oPg65Njc7DOWw4ADT9QmNXReiD1LeXFDosnXsOA,23458
12
+ eodag/api/product/metadata_mapping.py,sha256=PCaL_nEXJTkBOzayAzo2Cowq1vlA30lIMD-e_xILbIQ,72041
13
+ eodag/api/product/drivers/__init__.py,sha256=Sy9bGmDhWCAxvxRUf3QGijjQoQvzS1LSUMN34Usq6fM,3357
14
+ eodag/api/product/drivers/base.py,sha256=iPAE5Jx3isxmHHFPP-jysdUylYbsbIq6UejU3qsMROE,4111
15
+ eodag/api/product/drivers/generic.py,sha256=RER088E5_mqyGw1Pa4Kxea5YMFakAHFNcZEQINRiDwM,2069
16
+ eodag/api/product/drivers/sentinel1.py,sha256=xpvhOvVhpuwVihPMo_q79VI67ru-FqKtbRa5kA79D3k,3253
17
+ eodag/api/product/drivers/sentinel2.py,sha256=dMfIrcwF4h8KoyUj94yPUhRiN7FIef4mTzfbkkhLIc8,3124
18
+ eodag/plugins/__init__.py,sha256=KQkD5aVwb9I6C-Rmi5ABEG1-j8w5FP1zKN12vagsT9Y,739
19
+ eodag/plugins/base.py,sha256=bBp4k8QYJFEE6CRctrVwjws6suBwQdCLrLmvoGAmG3A,2670
20
+ eodag/plugins/manager.py,sha256=EYz5zliB3e3pxTvP4QIwtMtXfwPhxXJxjdYIsJsvFx0,20373
21
+ eodag/plugins/apis/__init__.py,sha256=PyY4f7P2iu3MkLPnw5eOrVew2fuavbBL3Asci3Ulwoo,744
22
+ eodag/plugins/apis/base.py,sha256=oCEKVtIbOjzNgM3lzaCCtO-DhU2PvGfKaATG6OxR-V8,2818
23
+ eodag/plugins/apis/ecmwf.py,sha256=CnFeuxx2GghuSQF9oGhCWC2ixL3q9aO_lpMRZehLueI,11455
24
+ eodag/plugins/apis/usgs.py,sha256=42vrVZ_fKi1-Z8nUt5-9wapUE7v75_hzgZHbKD23Auo,19625
25
+ eodag/plugins/authentication/__init__.py,sha256=_LVw42Bb1IhGAZH5xHRaS4b1iFoF9e27KDZOyoSoJHY,1039
26
+ eodag/plugins/authentication/aws_auth.py,sha256=6qeULjxljV9WTPqZjJJ6E0DWeiaGmzGR3rM0at75CFQ,3199
27
+ eodag/plugins/authentication/base.py,sha256=7vwX7O9xxvcKA9cMZ85F2eOkcdb7HyNbanUC5J0f9SA,2643
28
+ eodag/plugins/authentication/generic.py,sha256=LlOVPjvwRpbMDl62Brd7Ao34WmktKWoo0LP7D4T6zPg,2385
29
+ eodag/plugins/authentication/header.py,sha256=U_KnUqgZTLHXM5OKdGbH6jRqoQ0uIfOoxO6krUeAAcQ,4284
30
+ eodag/plugins/authentication/keycloak.py,sha256=f0AnWkvtsmLmWqgGfT3XB6AqbfCPU_ZHkDu07Zwf3E4,7178
31
+ eodag/plugins/authentication/oauth.py,sha256=fCMx7OxS3JNO9lLZhQNnL9lsBB9nFwZJLEYXI49QRtw,1952
32
+ eodag/plugins/authentication/openid_connect.py,sha256=LbpQzekxin_bLrKfk7bzU3LGxlfaABSm1fwx7S1O58M,24913
33
+ eodag/plugins/authentication/qsauth.py,sha256=bkepO_sFRIhYm3Dzecx3VJP0Ap37vUuJSRmEY8HrV1U,3947
34
+ eodag/plugins/authentication/sas_auth.py,sha256=gZp5UDeAi6iEi-IXv_RjrmAVpQCD5s9A0b3V7HV6KnU,4773
35
+ eodag/plugins/authentication/token.py,sha256=5mipX9SuNSNJtLntLRLm8KS7kqwylurvzkQq57fxWg0,12879
36
+ eodag/plugins/authentication/token_exchange.py,sha256=m0KHc4KOhlw0YYXCWEAwB7n7cJLScq3pXa6M6fiXNAQ,4902
37
+ eodag/plugins/crunch/__init__.py,sha256=58D7kJhEpHJWobIKaNFPynfbSqAWgS90BiHzitqS5Ds,746
38
+ eodag/plugins/crunch/base.py,sha256=XW4HISgR0UswiEZmE4t42HxnSxknZBtVpuK8XVLYHzU,1415
39
+ eodag/plugins/crunch/filter_date.py,sha256=zdOFuXiAZxdLedsUd8hbsJCsItVoN7zPTEtnOugRs70,4440
40
+ eodag/plugins/crunch/filter_latest_intersect.py,sha256=EkOyHEXFMrLQ7ZlTbzNs9lXZVDsbYTwgkPPK4JAkalY,4426
41
+ eodag/plugins/crunch/filter_latest_tpl_name.py,sha256=pP4EDP73mQg1zvkVm1Uo4nGAgwhNsMWe7_ecOBDbA0E,3679
42
+ eodag/plugins/crunch/filter_overlap.py,sha256=mkm5_ljgK_7QOOp-KgJjDjbVfss4gwRjIYUTMyKrw5o,7272
43
+ eodag/plugins/crunch/filter_property.py,sha256=5V0_S11iAnvZqRzYN0Jox96zZwIxPGC13IWQwNYyYrU,3193
44
+ eodag/plugins/download/__init__.py,sha256=zqszaeNgYP0YHlZDkLMf6odcwNw0KrAahGpcA-l0kAw,740
45
+ eodag/plugins/download/aws.py,sha256=icMIeW6GEd62bZU_5YsxalU-BWOK_PoXEISLPLk_7EQ,58586
46
+ eodag/plugins/download/base.py,sha256=ulkGfiY2qMtzyEPdUlP8CZ6w5Bqi2hckuX-sGqpkVeQ,29994
47
+ eodag/plugins/download/creodias_s3.py,sha256=RoEhYHtsPDbfrZhBllYoek0r7YzP8Upf5CPgc-PnlZM,4151
48
+ eodag/plugins/download/http.py,sha256=FhvkCVxj_ENV31Nm2ulT3DRlPQYBM6eQtf2of9M0T2o,56707
49
+ eodag/plugins/download/s3rest.py,sha256=BYkKglGhTVyR0A-8ls5gLhWOPwc_DgB4aydj79wpqoM,14825
50
+ eodag/plugins/search/__init__.py,sha256=bBrl3TffoU1wVpaeXmTEIailoh9W6fla4IP-8SWqA9U,2019
51
+ eodag/plugins/search/base.py,sha256=b9zAPLQITBSOJ9n5zBxtiHlPkQwACjjJkD894oYZ7L8,18555
52
+ eodag/plugins/search/build_search_result.py,sha256=FbVJvviyhSU-cuY7ctoJbXR0QKMbUFfTVpt7WsHx4mE,45426
53
+ eodag/plugins/search/cop_marine.py,sha256=pRWNY9MXY-XzlpQjqOI8ImOiNUehv9pwNl6oR9r171w,19720
54
+ eodag/plugins/search/creodias_s3.py,sha256=rBZf3Uza7z3VuBdoUJQ9kuufGgACKVsEvK3phUo7C7M,3379
55
+ eodag/plugins/search/csw.py,sha256=de8CNjz4bjEny27V0RXC7V8LRz0Ik3yqQVjTAc_JlyA,12548
56
+ eodag/plugins/search/data_request_search.py,sha256=yrKu3EXhn6Utyai3qv5NPnH-V4EuGIAIxw6XzJA4IIw,26715
57
+ eodag/plugins/search/qssearch.py,sha256=wGxniSj8fpPHFhRv5cKJnIZC7wyTeVayKsyzoA9DJGE,91271
58
+ eodag/plugins/search/stac_list_assets.py,sha256=OOCMyjD8XD-m39k0SyKMrRi4K8Ii5mOQsA6zSAeQDGI,3435
59
+ eodag/plugins/search/static_stac_search.py,sha256=rfcKBD-0-gDFg6jbR_XCsVH1t9Yf9HIlnFE_Drr0BAs,9259
60
+ eodag/resources/ext_product_types.json,sha256=aC6kxOIy4wmnNWGV9vM_nEQBGgO_boz8srJBox-fqlw,3198079
61
+ eodag/resources/locations_conf_template.yml,sha256=_eBv-QKHYMIKhY0b0kp4Ee33RsayxN8LWH3kDXxfFSk,986
62
+ eodag/resources/product_types.yml,sha256=d8KND-mMtaWjvbBFVHQlxcfyBM4mG5lMQqJQELV_hUg,409966
63
+ eodag/resources/providers.yml,sha256=b7xFSnZur34MNdP1ZMgRQYMuQ2B-jBAAjEGmNp-zpWk,224280
64
+ eodag/resources/stac.yml,sha256=XgQFkJEfu_f2ZiVM5L1flkew7wq55p_PJmDuVkOG3fs,10442
65
+ eodag/resources/stac_api.yml,sha256=2FdQL_qBTIUlu6KH836T4CXBKO9AvVxA_Ub3J1RP81A,68881
66
+ eodag/resources/stac_provider.yml,sha256=2yfdnuhJYV1f5el3aFkunoPqHAcD8oCDzvASbmldIvY,6703
67
+ eodag/resources/user_conf_template.yml,sha256=VitU2oHwcWNd7CoONfHabMBGwCPfYjwyU3cX63oJaIs,7765
68
+ eodag/resources/shp/ne_110m_admin_0_map_units.VERSION.txt,sha256=CHSo_jbv-4d4D0MYRbWn2FvmV_K9mYzo7qznF4YNO3g,7
69
+ eodag/resources/shp/ne_110m_admin_0_map_units.cpg,sha256=FG1nif_gM6UpfBrQRuamLuNTGbhrAhRE8FtuoqqKH0o,6
70
+ eodag/resources/shp/ne_110m_admin_0_map_units.dbf,sha256=uEEO22hZ_crWxMNhuQ_ix889c1Us1awYXAglxbf1K-s,393747
71
+ eodag/resources/shp/ne_110m_admin_0_map_units.prj,sha256=oaohy2UQUlLMiTy3HhYS1Kurl_7z3A3LYcOmVf_TbNo,148
72
+ eodag/resources/shp/ne_110m_admin_0_map_units.shp,sha256=GMVJQ1pe0JfaJnVfAew0MvembDJDkfUs0To2Qc82Aos,181628
73
+ eodag/resources/shp/ne_110m_admin_0_map_units.shx,sha256=N74fDl6sQAljmHQ_e9DO7suO6BXuwC0LwmriAnDBH-U,1564
74
+ eodag/rest/__init__.py,sha256=v4SI9gLuFP81YXi5_k98lvVNGzz6h8YZ_aUdhKAbE2M,916
75
+ eodag/rest/cache.py,sha256=dSgpw6uWDq45qxfD25LXkB-9Qk0OEb5L8UOl7yuMPEU,2097
76
+ eodag/rest/config.py,sha256=qWXukdSB6cSpkZszkPSGPGn5oiVfKEC3rPGp0q-2c4E,2112
77
+ eodag/rest/constants.py,sha256=XsNgjzv0Qvw1hhjeuscDuyQpCm99g3O-hEyslPSiFzQ,945
78
+ eodag/rest/core.py,sha256=P4o9Fjb-1xE1mhKMai1m0D2J90pSkw_hxE3XI4iGXBg,26550
79
+ eodag/rest/errors.py,sha256=R_zs9NILVnZ5qIpVgPtjprv_BalJxZEqr-LSZ0VVV8k,6192
80
+ eodag/rest/server.py,sha256=dqwP_mf856gPKxZCtdmH5WoYYji7edSab3Q_PzEQuUE,18308
81
+ eodag/rest/server.wsgi,sha256=ssM4JQi8tZpOYj03CTdM0weyUF1b3Lbh38pdD-vBfXs,152
82
+ eodag/rest/stac.py,sha256=t0xuFmJYbPvzBvJBs_8PQLCOJc5fJ8mbV9AbJxbMgVk,35827
83
+ eodag/rest/templates/README,sha256=qFgCBE6XC4YiXkpPoSHkYbMTQr8Zg5Wc5eAKVcooXmw,57
84
+ eodag/rest/types/__init__.py,sha256=Bu0C3dzXHe8kocnz2PIHV0GjQWlAQas6ToIfwusNPQs,742
85
+ eodag/rest/types/collections_search.py,sha256=TRZI72a1W29a2e_mg9cQpFUcTTEG3_SSsfYrZZuXMLA,1527
86
+ eodag/rest/types/eodag_search.py,sha256=uN96xejktaQRojKZm2BGAgxvcWcwBkle4_I2z7jlDzw,14281
87
+ eodag/rest/types/queryables.py,sha256=e3IMM2eIYnUsjrErw54CNZjMLuFDTMxSbLRHDFFvVMw,6470
88
+ eodag/rest/types/stac_search.py,sha256=a_m7ATLPFttvUo9_hfsIAQKtNhBvX3U86lNWv_8_oIM,8765
89
+ eodag/rest/utils/__init__.py,sha256=VRTxZFU15mB4izpYd8e30_xR1iZlJRsoW1jeCZ7bk1o,6560
90
+ eodag/rest/utils/cql_evaluate.py,sha256=aMcdowtYbQpU1H9oX1IM2PMot6XTy49Q6H2k-YBEtco,4087
91
+ eodag/rest/utils/rfc3339.py,sha256=_kaK7_8sxXyCAAs99ltVoinUw02frtZckl72ytI6IjQ,2234
92
+ eodag/types/__init__.py,sha256=FPDFHvjMnHBFNPx-B4TN-6qZhZ8VI5ICort6U6hCTYo,15612
93
+ eodag/types/bbox.py,sha256=jbfX58KOKIl0OoGZc93kAYhG_mEOjuBQGJtR2hl3-_Y,4354
94
+ eodag/types/download_args.py,sha256=urSl5KbLRN1XetMa2XzxYltny8CCFmHpjxU3j3BEGO8,1565
95
+ eodag/types/queryables.py,sha256=9Jllvoq0SgCKQUmnhVNqj55_xdMq2Yw49-1SWFh_nI8,9880
96
+ eodag/types/search_args.py,sha256=EtG8nXnApBnYrFo5FVvsvvEqRlqTxJ0lrmIem9Wtg8c,5649
97
+ eodag/types/whoosh.py,sha256=VXpWAZaXLR_RRnI9gh5iwkqn1n63krVGj2SX0rB2mQo,7225
98
+ eodag/utils/__init__.py,sha256=bdV7WMU9Zz9c6a7D63bTTNKuZmu7aEIyCm9QoS8rj9Y,52779
99
+ eodag/utils/exceptions.py,sha256=hYeq5GzMqW50o6mSUUlvOpsfU0eRjwhpqXTSE5MFv9Q,4452
100
+ eodag/utils/import_system.py,sha256=1vwcSRlsZwuaP8ssrpRBP5jldZ54eLv2ttNCdLf0TtA,3901
101
+ eodag/utils/logging.py,sha256=KoMsyS1f6O1hr_SMDOIxvt842mOJgmu_yLUk0-0EKFs,3507
102
+ eodag/utils/notebook.py,sha256=AUxtayvu26qYf3x3Eu3ujRl1XDgy24EfQaETbqmXSZw,2703
103
+ eodag/utils/repr.py,sha256=o6NhScogBPI69m83GsHh3hXONb9-byPfuWgJ1U39Kfw,5463
104
+ eodag/utils/requests.py,sha256=avNHKrOZ7Kp6lUA7u4kqupIth9MoirLzDsMrrmQDt4s,4560
105
+ eodag/utils/rest.py,sha256=a9tlG_Y9iQXLeyeLyecxFNbopGHV-8URecMSRs0UXu0,3348
106
+ eodag/utils/s3.py,sha256=2mspYgEYGA1IDbruMMDdJ2DoxyX3riSlV7PDIu7carg,7989
107
+ eodag/utils/stac_reader.py,sha256=d1tv82_E5dEmK9Vlw3TQfU1ndXg_iUGatxMeWMnIWPo,9236
108
+ eodag-3.1.0.dist-info/LICENSE,sha256=4MAecetnRTQw5DlHtiikDSzKWO1xVLwzM5_DsPMYlnE,10172
109
+ eodag-3.1.0.dist-info/METADATA,sha256=guSGMofcDDNoLt9gTTAz0F9iCFOdHibm81PEGyJ6gaw,15454
110
+ eodag-3.1.0.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
111
+ eodag-3.1.0.dist-info/entry_points.txt,sha256=krdrBOQso6kAcSekV9ItEYAkE8syTC4Ev75bI781VgE,2561
112
+ eodag-3.1.0.dist-info/top_level.txt,sha256=025IMTmVe5eDjIPP4KEFQKespOPMQdne4U4jOy8nftM,6
113
+ eodag-3.1.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (76.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5