eodag 3.0.0b3__py3-none-any.whl → 3.1.0b1__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 (77) hide show
  1. eodag/api/core.py +292 -198
  2. eodag/api/product/_assets.py +6 -6
  3. eodag/api/product/_product.py +18 -18
  4. eodag/api/product/metadata_mapping.py +51 -14
  5. eodag/api/search_result.py +29 -3
  6. eodag/cli.py +57 -20
  7. eodag/config.py +413 -117
  8. eodag/plugins/apis/base.py +10 -4
  9. eodag/plugins/apis/ecmwf.py +49 -16
  10. eodag/plugins/apis/usgs.py +30 -7
  11. eodag/plugins/authentication/aws_auth.py +14 -5
  12. eodag/plugins/authentication/base.py +10 -1
  13. eodag/plugins/authentication/generic.py +14 -3
  14. eodag/plugins/authentication/header.py +12 -4
  15. eodag/plugins/authentication/keycloak.py +41 -22
  16. eodag/plugins/authentication/oauth.py +11 -1
  17. eodag/plugins/authentication/openid_connect.py +178 -163
  18. eodag/plugins/authentication/qsauth.py +12 -4
  19. eodag/plugins/authentication/sas_auth.py +19 -2
  20. eodag/plugins/authentication/token.py +93 -15
  21. eodag/plugins/authentication/token_exchange.py +19 -19
  22. eodag/plugins/crunch/base.py +4 -1
  23. eodag/plugins/crunch/filter_date.py +5 -2
  24. eodag/plugins/crunch/filter_latest_intersect.py +5 -4
  25. eodag/plugins/crunch/filter_latest_tpl_name.py +1 -1
  26. eodag/plugins/crunch/filter_overlap.py +5 -7
  27. eodag/plugins/crunch/filter_property.py +6 -6
  28. eodag/plugins/download/aws.py +50 -34
  29. eodag/plugins/download/base.py +41 -50
  30. eodag/plugins/download/creodias_s3.py +40 -2
  31. eodag/plugins/download/http.py +221 -195
  32. eodag/plugins/download/s3rest.py +25 -25
  33. eodag/plugins/manager.py +168 -23
  34. eodag/plugins/search/base.py +106 -39
  35. eodag/plugins/search/build_search_result.py +1065 -324
  36. eodag/plugins/search/cop_marine.py +112 -29
  37. eodag/plugins/search/creodias_s3.py +45 -24
  38. eodag/plugins/search/csw.py +41 -1
  39. eodag/plugins/search/data_request_search.py +109 -9
  40. eodag/plugins/search/qssearch.py +549 -257
  41. eodag/plugins/search/static_stac_search.py +20 -21
  42. eodag/resources/ext_product_types.json +1 -1
  43. eodag/resources/product_types.yml +577 -87
  44. eodag/resources/providers.yml +1619 -2776
  45. eodag/resources/stac.yml +3 -163
  46. eodag/resources/user_conf_template.yml +112 -97
  47. eodag/rest/config.py +1 -2
  48. eodag/rest/constants.py +0 -1
  49. eodag/rest/core.py +138 -98
  50. eodag/rest/errors.py +181 -0
  51. eodag/rest/server.py +55 -329
  52. eodag/rest/stac.py +93 -544
  53. eodag/rest/types/eodag_search.py +19 -8
  54. eodag/rest/types/queryables.py +6 -8
  55. eodag/rest/types/stac_search.py +11 -2
  56. eodag/rest/utils/__init__.py +3 -0
  57. eodag/types/__init__.py +71 -18
  58. eodag/types/download_args.py +3 -3
  59. eodag/types/queryables.py +180 -73
  60. eodag/types/search_args.py +3 -3
  61. eodag/types/whoosh.py +126 -0
  62. eodag/utils/__init__.py +147 -66
  63. eodag/utils/exceptions.py +47 -26
  64. eodag/utils/logging.py +37 -77
  65. eodag/utils/repr.py +65 -6
  66. eodag/utils/requests.py +11 -13
  67. eodag/utils/stac_reader.py +1 -1
  68. {eodag-3.0.0b3.dist-info → eodag-3.1.0b1.dist-info}/METADATA +80 -81
  69. eodag-3.1.0b1.dist-info/RECORD +108 -0
  70. {eodag-3.0.0b3.dist-info → eodag-3.1.0b1.dist-info}/WHEEL +1 -1
  71. {eodag-3.0.0b3.dist-info → eodag-3.1.0b1.dist-info}/entry_points.txt +4 -2
  72. eodag/resources/constraints/climate-dt.json +0 -13
  73. eodag/resources/constraints/extremes-dt.json +0 -8
  74. eodag/utils/constraints.py +0 -244
  75. eodag-3.0.0b3.dist-info/RECORD +0 -110
  76. {eodag-3.0.0b3.dist-info → eodag-3.1.0b1.dist-info}/LICENSE +0 -0
  77. {eodag-3.0.0b3.dist-info → eodag-3.1.0b1.dist-info}/top_level.txt +0 -0
eodag/utils/exceptions.py CHANGED
@@ -17,24 +17,18 @@
17
17
  # limitations under the License.
18
18
  from __future__ import annotations
19
19
 
20
- from typing import TYPE_CHECKING
20
+ from typing import TYPE_CHECKING, Annotated
21
21
 
22
22
  if TYPE_CHECKING:
23
- from typing import Optional, Set, Tuple
23
+ from typing import Optional, Set
24
+
25
+ from typing_extensions import Doc, Self
24
26
 
25
27
 
26
28
  class EodagError(Exception):
27
29
  """General EODAG error"""
28
30
 
29
31
 
30
- class ValidationError(EodagError):
31
- """Error validating data"""
32
-
33
- def __init__(self, message: str, parameters: Set[str] = set()) -> None:
34
- self.message = message
35
- self.parameters = parameters
36
-
37
-
38
32
  class PluginNotFoundError(EodagError):
39
33
  """Error when looking for a plugin class that was not defined"""
40
34
 
@@ -72,35 +66,62 @@ class AuthenticationError(EodagError):
72
66
  authenticating a user"""
73
67
 
74
68
 
75
- class DownloadError(EodagError):
76
- """An error indicating something wrong with the download process"""
77
-
78
-
79
69
  class NotAvailableError(EodagError):
80
70
  """An error indicating that the product is not available for download"""
81
71
 
82
72
 
73
+ class NoMatchingProductType(EodagError):
74
+ """An error indicating that eodag was unable to derive a product type from a set
75
+ of search parameters"""
76
+
77
+
78
+ class STACOpenerError(EodagError):
79
+ """An error indicating that a STAC file could not be opened"""
80
+
81
+
83
82
  class RequestError(EodagError):
84
83
  """An error indicating that a request has failed. Usually eodag functions
85
84
  and methods should catch and skip this"""
86
85
 
87
- history: Set[Tuple[str, Exception]] = set()
88
- parameters: Set[str] = set()
86
+ status_code: Annotated[Optional[int], Doc("HTTP status code")] = None
89
87
 
90
- def __str__(self):
91
- repr = super().__str__()
92
- for err_tuple in self.history:
93
- repr += f"- {str(err_tuple)}"
94
- return repr
88
+ @classmethod
89
+ def from_error(cls, error: Exception, msg: Optional[str] = None) -> Self:
90
+ """Generate a RequestError from an Exception"""
91
+ status_code = getattr(error, "code", None)
92
+ text = getattr(error, "msg", None)
95
93
 
94
+ response = getattr(error, "response", None)
95
+ # Explicitly test for None because response objects are considered false if they
96
+ # have a status code other than 200
97
+ if response is not None:
98
+ status_code = response.status_code
99
+ text = " ".join([text or "", response.text])
96
100
 
97
- class NoMatchingProductType(EodagError):
98
- """An error indicating that eodag was unable to derive a product type from a set
99
- of search parameters"""
101
+ text = text or str(error)
100
102
 
103
+ e = cls(msg, text) if msg else cls(text)
104
+ e.status_code = status_code
105
+ return e
101
106
 
102
- class STACOpenerError(EodagError):
103
- """An error indicating that a STAC file could not be opened"""
107
+
108
+ class ValidationError(RequestError):
109
+ """Error validating data"""
110
+
111
+ def __init__(self, message: str, parameters: Set[str] = set()) -> None:
112
+ self.message = message
113
+ self.parameters = parameters
114
+
115
+ @classmethod
116
+ def from_error(cls, error: Exception, msg: Optional[str] = None) -> Self:
117
+ """Override parent from_error to handle ValidationError specificities."""
118
+ setattr(error, "msg", msg)
119
+ validation_error = super().from_error(error)
120
+ return validation_error
121
+
122
+
123
+ class DownloadError(RequestError):
124
+ """An error indicating something wrong with the download process"""
104
125
 
105
126
 
106
127
  class TimeOutError(RequestError):
eodag/utils/logging.py CHANGED
@@ -37,88 +37,48 @@ def setup_logging(verbose: int, no_progress_bar: bool = False) -> None:
37
37
  global disable_tqdm
38
38
  disable_tqdm = no_progress_bar
39
39
 
40
+ if verbose > 3:
41
+ raise ValueError("'verbose' must be one of: 0, 1, 2, 3")
42
+
40
43
  if verbose < 1:
41
44
  disable_tqdm = True
42
45
 
43
- if verbose <= 1:
44
- logging.config.dictConfig(
45
- {
46
- "version": 1,
47
- "disable_existing_loggers": False,
48
- "handlers": {
49
- "null": {"level": "DEBUG", "class": "logging.NullHandler"}
50
- },
51
- "loggers": {
52
- "eodag": {"handlers": ["null"], "propagate": True, "level": "INFO"}
53
- },
54
- }
55
- )
56
- elif verbose == 2:
57
- logging.config.dictConfig(
58
- {
59
- "version": 1,
60
- "disable_existing_loggers": False,
61
- "formatters": {
62
- "standard": {
63
- "format": "%(asctime)-15s %(name)-32s [%(levelname)-8s] %(message)s"
64
- }
65
- },
66
- "handlers": {
67
- "console": {
68
- "level": "DEBUG",
69
- "class": "logging.StreamHandler",
70
- "formatter": "standard",
71
- }
72
- },
73
- "loggers": {
74
- "eodag": {
75
- "handlers": ["console"],
76
- "propagate": True,
77
- "level": "INFO",
78
- },
79
- "sentinelsat": {
80
- "handlers": ["console"],
81
- "propagate": True,
82
- "level": "INFO",
83
- },
84
- },
85
- }
86
- )
87
- elif verbose == 3:
88
- logging.config.dictConfig(
89
- {
90
- "version": 1,
91
- "disable_existing_loggers": False,
92
- "formatters": {
93
- "verbose": {
94
- "format": (
95
- "%(asctime)-15s %(name)-32s [%(levelname)-8s] (tid=%(thread)d) %(message)s"
96
- )
97
- }
98
- },
99
- "handlers": {
100
- "console": {
101
- "level": "DEBUG",
102
- "class": "logging.StreamHandler",
103
- "formatter": "verbose",
104
- }
46
+ level = "DEBUG" if verbose == 3 else "INFO"
47
+
48
+ handlers = {
49
+ "console": {
50
+ "level": level,
51
+ "class": "logging.StreamHandler",
52
+ "formatter": "standard",
53
+ },
54
+ "null": {"level": level, "class": "logging.NullHandler"},
55
+ }
56
+ handler = "console" if verbose > 1 else "null"
57
+
58
+ logging.config.dictConfig(
59
+ {
60
+ "version": 1,
61
+ "disable_existing_loggers": False,
62
+ "formatters": {
63
+ "standard": {
64
+ "format": "%(asctime)-15s %(name)-32s [%(levelname)-8s] %(message)s"
65
+ }
66
+ },
67
+ "handlers": handlers,
68
+ "loggers": {
69
+ "eodag": {
70
+ "handlers": [handler],
71
+ "propagate": True,
72
+ "level": f"{level}",
105
73
  },
106
- "loggers": {
107
- "eodag": {
108
- "handlers": ["console"],
109
- "propagate": True,
110
- "level": "DEBUG",
111
- },
112
- "sentinelsat": {
113
- "handlers": ["console"],
114
- "propagate": True,
115
- "level": "DEBUG",
116
- },
74
+ "eodag-cube": {
75
+ "handlers": [handler],
76
+ "propagate": True,
77
+ "level": f"{level}",
117
78
  },
118
- }
119
- )
120
- else:
121
- raise ValueError("'verbose' must be one of: 0, 1, 2, 3")
79
+ },
80
+ }
81
+ )
122
82
 
123
83
 
124
84
  def get_logging_verbose() -> Optional[int]:
eodag/utils/repr.py CHANGED
@@ -18,12 +18,21 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import collections.abc
21
+ import re
21
22
  from typing import Any, Optional
22
23
  from urllib.parse import urlparse
23
24
 
24
25
 
25
26
  def str_as_href(link: str) -> str:
26
- """URL to html link"""
27
+ """URL to html link
28
+
29
+ :param link: URL to format
30
+ :returns: HMLT formatted link
31
+
32
+ >>> str_as_href("http://foo.bar")
33
+ "<a href='http://foo.bar' target='_blank'>http://foo.bar</a>"
34
+
35
+ """
27
36
  if urlparse(link).scheme in ("file", "http", "https", "s3"):
28
37
  return f"<a href='{link}' target='_blank'>{link}</a>"
29
38
  else:
@@ -31,7 +40,13 @@ def str_as_href(link: str) -> str:
31
40
 
32
41
 
33
42
  def html_table(input: Any, depth: Optional[int] = None) -> str:
34
- """Transform input to HTML table"""
43
+ """Transform input object to HTML table
44
+
45
+ :param input: input object to represent
46
+ :param depth: maximum depth level until which nested objects should be represented
47
+ in new tables (unlimited by default)
48
+ :returns: HTML table
49
+ """
35
50
  if isinstance(input, collections.abc.Mapping):
36
51
  return dict_to_html_table(input, depth=depth)
37
52
  elif isinstance(input, collections.abc.Sequence) and not isinstance(input, str):
@@ -47,7 +62,14 @@ def dict_to_html_table(
47
62
  depth: Optional[int] = None,
48
63
  brackets: bool = True,
49
64
  ) -> str:
50
- """Transform input dict to HTML table"""
65
+ """Transform input dict to HTML table
66
+
67
+ :param input_dict: input dict to represent
68
+ :param depth: maximum depth level until which nested objects should be represented
69
+ in new tables (unlimited by default)
70
+ :param brackets: whether surrounding brackets should be displayed or not
71
+ :returns: HTML table
72
+ """
51
73
  opening_bracket = "<span style='color: grey;'>{</span>" if brackets else ""
52
74
  closing_bracket = "<span style='color: grey;'>}</span>" if brackets else ""
53
75
  indent = "10px" if brackets else "0"
@@ -90,7 +112,13 @@ def dict_to_html_table(
90
112
  def list_to_html_table(
91
113
  input_list: collections.abc.Sequence, depth: Optional[int] = None
92
114
  ) -> str:
93
- """Transform input list to HTML table"""
115
+ """Transform input list to HTML table
116
+
117
+ :param input_list: input list to represent
118
+ :param depth: maximum depth level until which nested objects should be represented
119
+ in new tables (unlimited by default)
120
+ :returns: HTML table
121
+ """
94
122
  if depth is not None:
95
123
  depth -= 1
96
124
  separator = (
@@ -103,11 +131,42 @@ def list_to_html_table(
103
131
  + separator.join(
104
132
  [
105
133
  f"""<span style='text-align: left;'>{
106
- html_table(v, depth=depth)
107
- }</span>
134
+ html_table(v, depth=depth)
135
+ }</span>
108
136
  """
109
137
  for v in input_list
110
138
  ]
111
139
  )
112
140
  + "<span style='color: grey;'>]</span>"
113
141
  )
142
+
143
+
144
+ def remove_class_repr(type_repr: str) -> str:
145
+ """Removes class tag from type representation
146
+
147
+ :param type_repr: input type representation
148
+ :returns: type without class tag
149
+
150
+ >>> remove_class_repr(str(type("foo")))
151
+ 'str'
152
+ """
153
+ return re.sub(r"<class '(\w+)'>", r"\1", type_repr)
154
+
155
+
156
+ def shorter_type_repr(long_type: str) -> str:
157
+ """Shorten long type representation
158
+
159
+ :param long_type: long type representation
160
+ :returns: type reprensentation shortened
161
+
162
+ >>> import typing
163
+ >>> shorter_type_repr(str(typing.Literal["foo", "bar"]))
164
+ "Literal['foo', ...]"
165
+ """
166
+ # shorten lists
167
+ shorter = re.sub(r",[^\[^\]]+\]", ", ...]", str(long_type))
168
+ # remove class prefix
169
+ shorter = remove_class_repr(shorter)
170
+ # remove parent objects
171
+ shorter = re.sub(r"\w+\.", "", shorter)
172
+ return shorter
eodag/utils/requests.py CHANGED
@@ -30,7 +30,7 @@ logger = logging.getLogger("eodag.utils.requests")
30
30
 
31
31
 
32
32
  def fetch_json(
33
- file_url: str,
33
+ url: str,
34
34
  req_session: Optional[requests.Session] = None,
35
35
  auth: Optional[requests.auth.AuthBase] = None,
36
36
  timeout: float = HTTP_REQ_TIMEOUT,
@@ -38,34 +38,32 @@ def fetch_json(
38
38
  """
39
39
  Fetches http/distant or local json file
40
40
 
41
- :param file_url: url from which the file can be fetched
41
+ :param url: url from which the file can be fetched
42
42
  :param req_session: (optional) requests session
43
43
  :param auth: (optional) authenticated object if request needs authentication
44
44
  :param timeout: (optional) authenticated object
45
45
  :returns: json file content
46
46
  """
47
47
  if req_session is None:
48
- req_session = requests.Session()
48
+ req_session = requests.sessions.Session()
49
49
  try:
50
- if not file_url.lower().startswith("http"):
51
- file_url = path_to_uri(os.path.abspath(file_url))
50
+ if not url.lower().startswith("http"):
51
+ url = path_to_uri(os.path.abspath(url))
52
52
  req_session.mount("file://", LocalFileAdapter())
53
53
 
54
54
  headers = USER_AGENT
55
- logger.debug(f"fetching {file_url}")
55
+ logger.debug(f"fetching {url}")
56
56
  res = req_session.get(
57
- file_url,
57
+ url,
58
58
  headers=headers,
59
59
  auth=auth,
60
60
  timeout=timeout,
61
61
  )
62
62
  res.raise_for_status()
63
63
  except requests.exceptions.Timeout as exc:
64
- raise TimeOutError(exc, timeout=HTTP_REQ_TIMEOUT) from exc
64
+ raise TimeOutError(exc, timeout=timeout) from exc
65
65
  except requests.exceptions.RequestException as exc:
66
- raise RequestError(
67
- f"Unable to fetch {file_url}: {str(exc)}",
68
- ) from exc
66
+ raise RequestError.from_error(exc, f"Unable to fetch {url}") from exc
69
67
  else:
70
68
  return res.json()
71
69
 
@@ -102,8 +100,8 @@ class LocalFileAdapter(requests.adapters.BaseAdapter):
102
100
  ) -> requests.Response:
103
101
  """Wraps a file, described in request, in a Response object.
104
102
 
105
- :param req: The PreparedRequest being "sent".
106
- :param kwargs: (not used) additionnal arguments of the request
103
+ :param request: The PreparedRequest being "sent".
104
+ :param kwargs: (not used) additional arguments of the request
107
105
  :returns: a Response object containing the file
108
106
  """
109
107
  response = requests.Response()
@@ -113,7 +113,7 @@ def fetch_stac_items(
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`
@@ -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.0b1
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,95 @@ 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<1.6.0
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<3.10.0; python_version >= "3.12" and platform_system == "Windows"
42
+ Requires-Dist: orjson; python_version < "3.12" or platform_system != "Windows"
43
+ Requires-Dist: pydantic!=2.10.0,>=2.1.0
44
+ Requires-Dist: pydantic_core
45
+ Requires-Dist: PyJWT[crypto]>=2.5.0
46
+ Requires-Dist: pyproj>=2.1.0
44
47
  Requires-Dist: pyshp
45
- Requires-Dist: pystac >=1.0.0b1
48
+ Requires-Dist: pystac>=1.0.0b1
46
49
  Requires-Dist: python-dateutil
47
50
  Requires-Dist: PyYAML
48
51
  Requires-Dist: requests
49
52
  Requires-Dist: setuptools
50
- Requires-Dist: shapely >=2.0.0
53
+ Requires-Dist: shapely>=2.0.6
51
54
  Requires-Dist: stream-zip
52
55
  Requires-Dist: tqdm
53
- Requires-Dist: typing-extensions >=4.8.0
56
+ Requires-Dist: typing_extensions>=4.8.0
54
57
  Requires-Dist: urllib3
55
58
  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
59
  Provides-Extra: all
59
- Requires-Dist: eodag[all-providers,csw,server,tutorials] ; extra == 'all'
60
+ Requires-Dist: eodag[all-providers,csw,server,tutorials]; extra == "all"
60
61
  Provides-Extra: all-providers
61
- Requires-Dist: eodag[ecmwf,usgs] ; extra == 'all-providers'
62
+ Requires-Dist: eodag[ecmwf,usgs]; extra == "all-providers"
62
63
  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'
64
+ Requires-Dist: OWSLib>=0.27.1; extra == "csw"
92
65
  Provides-Extra: ecmwf
93
- Requires-Dist: ecmwf-api-client ; extra == 'ecmwf'
94
- Provides-Extra: notebook
95
- Requires-Dist: tqdm[notebook] ; extra == 'notebook'
66
+ Requires-Dist: ecmwf-api-client; extra == "ecmwf"
67
+ Provides-Extra: usgs
68
+ Requires-Dist: usgs>=0.3.1; extra == "usgs"
96
69
  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'
70
+ Requires-Dist: fastapi>=0.93.0; extra == "server"
71
+ Requires-Dist: pygeofilter; extra == "server"
72
+ Requires-Dist: starlette; extra == "server"
73
+ Requires-Dist: uvicorn[standard]; extra == "server"
74
+ Requires-Dist: pydantic-settings; extra == "server"
75
+ Requires-Dist: cachetools; extra == "server"
76
+ Provides-Extra: notebook
77
+ Requires-Dist: tqdm[notebook]; extra == "notebook"
111
78
  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'
79
+ Requires-Dist: eodag[ecmwf,notebook]; extra == "tutorials"
80
+ Requires-Dist: eodag-cube>=0.2.0; extra == "tutorials"
81
+ Requires-Dist: jupyter; extra == "tutorials"
82
+ Requires-Dist: ipyleaflet>=0.10.0; extra == "tutorials"
83
+ Requires-Dist: ipywidgets; extra == "tutorials"
84
+ Requires-Dist: matplotlib; extra == "tutorials"
85
+ Requires-Dist: folium; extra == "tutorials"
86
+ Requires-Dist: imageio; extra == "tutorials"
87
+ Requires-Dist: rasterio; extra == "tutorials"
88
+ Requires-Dist: netcdf4; 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; 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-setuptools; extra == "stubs"
117
+ Requires-Dist: types-tqdm; extra == "stubs"
118
+ Requires-Dist: types-urllib3; extra == "stubs"
119
+ Provides-Extra: docs
120
+ Requires-Dist: eodag[all,stubs]; extra == "docs"
121
+ Requires-Dist: sphinx; extra == "docs"
122
+ Requires-Dist: sphinx-book-theme>=1.0.0; extra == "docs"
123
+ Requires-Dist: sphinx-copybutton; extra == "docs"
124
+ Requires-Dist: sphinx-tabs; extra == "docs"
125
+ Requires-Dist: nbsphinx; extra == "docs"
126
+ Requires-Dist: sphinx_autodoc_typehints; extra == "docs"
127
+ Requires-Dist: sphinxemoji; extra == "docs"
124
128
 
125
129
  .. image:: https://eodag.readthedocs.io/en/latest/_static/eodag_bycs.png
126
130
  :target: https://github.com/CS-SI/eodag
@@ -298,25 +302,20 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
298
302
  | jq ".numberMatched"
299
303
  6
300
304
 
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
305
  # 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" \
306
+ $ curl "http://127.0.0.1:5000/collections/S2_MSI_L1C/items" \
308
307
  | 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"
308
+ "http://127.0.0.1:5002/collections/S2_MSI_L1C/items/S2B_MSIL1C_20240917T115259_N0511_R137_T21CWS_20240917T145134/download"
310
309
 
311
310
  # 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"
311
+ $ wget "http://127.0.0.1:5002/collections/S2_MSI_L1C/items/S2B_MSIL1C_20240917T115259_N0511_R137_T21CWS_20240917T145134/download"
313
312
 
314
313
 
315
314
  ``eodag-server`` is available on `https://hub.docker.com/r/csspace/eodag-server <https://hub.docker.com/r/csspace/eodag-server>`_:
316
315
 
317
316
  .. code-block:: bash
318
317
 
319
- docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b3
318
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.1.0b1
320
319
 
321
320
  You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
322
321
  Simply run: