eodag 3.4.3__tar.gz → 3.5.1__tar.gz

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 (263) hide show
  1. {eodag-3.4.3 → eodag-3.5.1}/.github/workflows/deploy.yml +6 -0
  2. {eodag-3.4.3 → eodag-3.5.1}/CHANGES.rst +83 -0
  3. {eodag-3.4.3/eodag.egg-info → eodag-3.5.1}/PKG-INFO +3 -3
  4. {eodag-3.4.3 → eodag-3.5.1}/README.rst +1 -1
  5. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/Chart.yaml +2 -2
  6. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/configure.rst +20 -0
  7. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/register.rst +1 -1
  8. {eodag-3.4.3 → eodag-3.5.1}/docs/stac_rest.rst +1 -1
  9. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/core.py +90 -27
  10. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/_product.py +33 -0
  11. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/metadata_mapping.py +31 -2
  12. {eodag-3.4.3 → eodag-3.5.1}/eodag/config.py +56 -10
  13. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/keycloak.py +3 -1
  14. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/openid_connect.py +21 -3
  15. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/token.py +14 -2
  16. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/token_exchange.py +1 -0
  17. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/download/aws.py +1 -1
  18. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/manager.py +1 -1
  19. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/base.py +3 -2
  20. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/build_search_result.py +13 -6
  21. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/data_request_search.py +14 -1
  22. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/qssearch.py +8 -2
  23. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/ext_product_types.json +1 -1
  24. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/providers.yml +4 -0
  25. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/core.py +3 -1
  26. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/errors.py +9 -4
  27. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/server.py +3 -1
  28. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/stac.py +22 -1
  29. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/__init__.py +3 -0
  30. eodag-3.5.1/eodag/utils/cache.py +68 -0
  31. eodag-3.5.1/eodag/utils/env.py +29 -0
  32. {eodag-3.4.3 → eodag-3.5.1/eodag.egg-info}/PKG-INFO +3 -3
  33. {eodag-3.4.3 → eodag-3.5.1}/eodag.egg-info/SOURCES.txt +2 -0
  34. {eodag-3.4.3 → eodag-3.5.1}/eodag.egg-info/requires.txt +1 -1
  35. {eodag-3.4.3 → eodag-3.5.1}/pyproject.toml +1 -1
  36. {eodag-3.4.3 → eodag-3.5.1}/setup.cfg +1 -1
  37. {eodag-3.4.3 → eodag-3.5.1}/.dockerignore +0 -0
  38. {eodag-3.4.3 → eodag-3.5.1}/.editorconfig +0 -0
  39. {eodag-3.4.3 → eodag-3.5.1}/.gitattributes +0 -0
  40. {eodag-3.4.3 → eodag-3.5.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  41. {eodag-3.4.3 → eodag-3.5.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  42. {eodag-3.4.3 → eodag-3.5.1}/.github/pull_request_template.md +0 -0
  43. {eodag-3.4.3 → eodag-3.5.1}/.github/workflows/changelog.yml +0 -0
  44. {eodag-3.4.3 → eodag-3.5.1}/.github/workflows/fetch.yml +0 -0
  45. {eodag-3.4.3 → eodag-3.5.1}/.github/workflows/github-pages.yml +0 -0
  46. {eodag-3.4.3 → eodag-3.5.1}/.github/workflows/lint-pr-title.yml +0 -0
  47. {eodag-3.4.3 → eodag-3.5.1}/.github/workflows/publish.yml +0 -0
  48. {eodag-3.4.3 → eodag-3.5.1}/.github/workflows/test.yml +0 -0
  49. {eodag-3.4.3 → eodag-3.5.1}/.gitignore +0 -0
  50. {eodag-3.4.3 → eodag-3.5.1}/.pre-commit-config.yaml +0 -0
  51. {eodag-3.4.3 → eodag-3.5.1}/BREAKING_CHANGES.rst +0 -0
  52. {eodag-3.4.3 → eodag-3.5.1}/CODE_OF_CONDUCT.md +0 -0
  53. {eodag-3.4.3 → eodag-3.5.1}/CONTRIBUTING.rst +0 -0
  54. {eodag-3.4.3 → eodag-3.5.1}/LICENSE +0 -0
  55. {eodag-3.4.3 → eodag-3.5.1}/MANIFEST.in +0 -0
  56. {eodag-3.4.3 → eodag-3.5.1}/NOTICE +0 -0
  57. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/Chart.lock +0 -0
  58. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/README.md +0 -0
  59. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/NOTES.txt +0 -0
  60. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/_helpers.tpl +0 -0
  61. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/configmap.yaml +0 -0
  62. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/deployment.yaml +0 -0
  63. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/extra-list.yaml +0 -0
  64. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/hpa.yaml +0 -0
  65. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/ingress.yaml +0 -0
  66. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/pv.yaml +0 -0
  67. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/pvc.yaml +0 -0
  68. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/secret.yaml +0 -0
  69. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/service.yaml +0 -0
  70. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/templates/serviceaccount.yaml +0 -0
  71. {eodag-3.4.3 → eodag-3.5.1}/charts/eodag-server/values.yaml +0 -0
  72. {eodag-3.4.3 → eodag-3.5.1}/docker/run-stac-server.sh +0 -0
  73. {eodag-3.4.3 → eodag-3.5.1}/docker/stac-browser.dockerfile +0 -0
  74. {eodag-3.4.3 → eodag-3.5.1}/docker/stac-server.dockerfile +0 -0
  75. {eodag-3.4.3 → eodag-3.5.1}/docker-compose.yml +0 -0
  76. {eodag-3.4.3 → eodag-3.5.1}/docs/Makefile +0 -0
  77. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/custom.css +0 -0
  78. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/download_methods.png +0 -0
  79. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_advanced_calls_graph.svg +0 -0
  80. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_bycs.png +0 -0
  81. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_fetch_product_types.png +0 -0
  82. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_logo_160.png +0 -0
  83. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_logo_160r.png +0 -0
  84. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_main_calls_graph.svg +0 -0
  85. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_overview.png +0 -0
  86. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_stac_client.png +0 -0
  87. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/eodag_stac_server.png +0 -0
  88. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/favicon-32x32.png +0 -0
  89. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/params_mapping_extra.csv +0 -0
  90. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/params_mapping_offline_infos.json +0 -0
  91. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/params_mapping_opensearch.csv +0 -0
  92. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/product_types_information.csv +0 -0
  93. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/progress_1.png +0 -0
  94. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/progress_1_none.png +0 -0
  95. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/progress_2.png +0 -0
  96. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/progress_2_none.png +0 -0
  97. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/stac_browser_example.png +0 -0
  98. {eodag-3.4.3 → eodag-3.5.1}/docs/_static/stac_browser_example_600.png +0 -0
  99. {eodag-3.4.3 → eodag-3.5.1}/docs/add_product_type.rst +0 -0
  100. {eodag-3.4.3 → eodag-3.5.1}/docs/add_provider.rst +0 -0
  101. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/assets.rst +0 -0
  102. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/call_graphs.rst +0 -0
  103. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/core.rst +0 -0
  104. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/eoproduct.rst +0 -0
  105. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/exceptions.rst +0 -0
  106. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/index.rst +0 -0
  107. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/searchresult.rst +0 -0
  108. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/types.rst +0 -0
  109. {eodag-3.4.3 → eodag-3.5.1}/docs/api_reference/utils.rst +0 -0
  110. {eodag-3.4.3 → eodag-3.5.1}/docs/api_user_guide.rst +0 -0
  111. {eodag-3.4.3 → eodag-3.5.1}/docs/breaking_changes.rst +0 -0
  112. {eodag-3.4.3 → eodag-3.5.1}/docs/changelog.rst +0 -0
  113. {eodag-3.4.3 → eodag-3.5.1}/docs/cli_user_guide.rst +0 -0
  114. {eodag-3.4.3 → eodag-3.5.1}/docs/conf.py +0 -0
  115. {eodag-3.4.3 → eodag-3.5.1}/docs/contribute.rst +0 -0
  116. {eodag-3.4.3 → eodag-3.5.1}/docs/drivers.rst +0 -0
  117. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/index.rst +0 -0
  118. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/install.rst +0 -0
  119. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/overview.rst +0 -0
  120. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/product_storage_status.rst +0 -0
  121. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/product_types.rst +0 -0
  122. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/providers.rst +0 -0
  123. {eodag-3.4.3 → eodag-3.5.1}/docs/getting_started_guide/side_projects.rst +0 -0
  124. {eodag-3.4.3 → eodag-3.5.1}/docs/index.rst +0 -0
  125. {eodag-3.4.3 → eodag-3.5.1}/docs/make.bat +0 -0
  126. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/1_overview.ipynb +0 -0
  127. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/2_providers_products_available.ipynb +0 -0
  128. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/3_configuration.ipynb +0 -0
  129. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/4_search.ipynb +0 -0
  130. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/5_queryables.ipynb +0 -0
  131. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/6_serialize_deserialize.ipynb +0 -0
  132. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/7_crunch.ipynb +0 -0
  133. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/8_download.ipynb +0 -0
  134. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/9_post_process.ipynb +0 -0
  135. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/data/crunch_search_results.geojson +0 -0
  136. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/api_user_guide/data/download_search_results.geojson +0 -0
  137. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/intro_notebooks.ipynb +0 -0
  138. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.cpg +0 -0
  139. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.dbf +0 -0
  140. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.prj +0 -0
  141. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qix +0 -0
  142. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qpj +0 -0
  143. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shp +0 -0
  144. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shx +0 -0
  145. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/auxdata/sentinel2_tiling_grid_centroids.zip +0 -0
  146. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_burnt_areas_snappy.ipynb +0 -0
  147. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_cds.ipynb +0 -0
  148. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_cop_dem.ipynb +0 -0
  149. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_ecmwf.ipynb +0 -0
  150. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_meteoblue.ipynb +0 -0
  151. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_search_location_tile.ipynb +0 -0
  152. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_ship_detection.ipynb +0 -0
  153. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_stac_client.ipynb +0 -0
  154. {eodag-3.4.3 → eodag-3.5.1}/docs/notebooks/tutos/tuto_wekeo.ipynb +0 -0
  155. {eodag-3.4.3 → eodag-3.5.1}/docs/params_mapping.rst +0 -0
  156. {eodag-3.4.3 → eodag-3.5.1}/docs/plugins.rst +0 -0
  157. {eodag-3.4.3 → eodag-3.5.1}/docs/plugins_reference/api.rst +0 -0
  158. {eodag-3.4.3 → eodag-3.5.1}/docs/plugins_reference/auth.rst +0 -0
  159. {eodag-3.4.3 → eodag-3.5.1}/docs/plugins_reference/crunch.rst +0 -0
  160. {eodag-3.4.3 → eodag-3.5.1}/docs/plugins_reference/download.rst +0 -0
  161. {eodag-3.4.3 → eodag-3.5.1}/docs/plugins_reference/search.rst +0 -0
  162. {eodag-3.4.3 → eodag-3.5.1}/docs/stac.rst +0 -0
  163. {eodag-3.4.3 → eodag-3.5.1}/docs/tutos.rst +0 -0
  164. {eodag-3.4.3 → eodag-3.5.1}/eodag/__init__.py +0 -0
  165. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/__init__.py +0 -0
  166. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/__init__.py +0 -0
  167. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/_assets.py +0 -0
  168. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/drivers/__init__.py +0 -0
  169. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/drivers/base.py +0 -0
  170. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/drivers/generic.py +0 -0
  171. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/drivers/sentinel1.py +0 -0
  172. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/product/drivers/sentinel2.py +0 -0
  173. {eodag-3.4.3 → eodag-3.5.1}/eodag/api/search_result.py +0 -0
  174. {eodag-3.4.3 → eodag-3.5.1}/eodag/cli.py +0 -0
  175. {eodag-3.4.3 → eodag-3.5.1}/eodag/crunch.py +0 -0
  176. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/__init__.py +0 -0
  177. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/apis/__init__.py +0 -0
  178. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/apis/base.py +0 -0
  179. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/apis/ecmwf.py +0 -0
  180. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/apis/usgs.py +0 -0
  181. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/__init__.py +0 -0
  182. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/aws_auth.py +0 -0
  183. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/base.py +0 -0
  184. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/generic.py +0 -0
  185. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/header.py +0 -0
  186. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/oauth.py +0 -0
  187. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/qsauth.py +0 -0
  188. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/authentication/sas_auth.py +0 -0
  189. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/base.py +0 -0
  190. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/crunch/__init__.py +0 -0
  191. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/crunch/base.py +0 -0
  192. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/crunch/filter_date.py +0 -0
  193. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/crunch/filter_latest_intersect.py +0 -0
  194. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/crunch/filter_latest_tpl_name.py +0 -0
  195. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/crunch/filter_overlap.py +0 -0
  196. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/crunch/filter_property.py +0 -0
  197. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/download/__init__.py +0 -0
  198. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/download/base.py +0 -0
  199. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/download/creodias_s3.py +0 -0
  200. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/download/http.py +0 -0
  201. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/download/s3rest.py +0 -0
  202. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/__init__.py +0 -0
  203. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/cop_marine.py +0 -0
  204. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/creodias_s3.py +0 -0
  205. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/csw.py +0 -0
  206. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/stac_list_assets.py +0 -0
  207. {eodag-3.4.3 → eodag-3.5.1}/eodag/plugins/search/static_stac_search.py +0 -0
  208. {eodag-3.4.3 → eodag-3.5.1}/eodag/py.typed +0 -0
  209. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/locations_conf_template.yml +0 -0
  210. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/product_types.yml +0 -0
  211. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/shp/ne_110m_admin_0_map_units.VERSION.txt +0 -0
  212. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/shp/ne_110m_admin_0_map_units.cpg +0 -0
  213. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/shp/ne_110m_admin_0_map_units.dbf +0 -0
  214. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/shp/ne_110m_admin_0_map_units.prj +0 -0
  215. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/shp/ne_110m_admin_0_map_units.shp +0 -0
  216. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/shp/ne_110m_admin_0_map_units.shx +0 -0
  217. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/stac.yml +0 -0
  218. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/stac_api.yml +0 -0
  219. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/stac_provider.yml +0 -0
  220. {eodag-3.4.3 → eodag-3.5.1}/eodag/resources/user_conf_template.yml +0 -0
  221. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/__init__.py +0 -0
  222. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/cache.py +0 -0
  223. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/config.py +0 -0
  224. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/constants.py +0 -0
  225. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/server.wsgi +0 -0
  226. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/templates/README +0 -0
  227. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/types/__init__.py +0 -0
  228. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/types/collections_search.py +0 -0
  229. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/types/eodag_search.py +0 -0
  230. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/types/queryables.py +0 -0
  231. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/types/stac_search.py +0 -0
  232. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/utils/__init__.py +0 -0
  233. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/utils/cql_evaluate.py +0 -0
  234. {eodag-3.4.3 → eodag-3.5.1}/eodag/rest/utils/rfc3339.py +0 -0
  235. {eodag-3.4.3 → eodag-3.5.1}/eodag/types/__init__.py +0 -0
  236. {eodag-3.4.3 → eodag-3.5.1}/eodag/types/bbox.py +0 -0
  237. {eodag-3.4.3 → eodag-3.5.1}/eodag/types/download_args.py +0 -0
  238. {eodag-3.4.3 → eodag-3.5.1}/eodag/types/queryables.py +0 -0
  239. {eodag-3.4.3 → eodag-3.5.1}/eodag/types/search_args.py +0 -0
  240. {eodag-3.4.3 → eodag-3.5.1}/eodag/types/whoosh.py +0 -0
  241. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/exceptions.py +0 -0
  242. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/import_system.py +0 -0
  243. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/logging.py +0 -0
  244. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/notebook.py +0 -0
  245. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/repr.py +0 -0
  246. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/requests.py +0 -0
  247. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/rest.py +0 -0
  248. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/s3.py +0 -0
  249. {eodag-3.4.3 → eodag-3.5.1}/eodag/utils/stac_reader.py +0 -0
  250. {eodag-3.4.3 → eodag-3.5.1}/eodag.egg-info/dependency_links.txt +0 -0
  251. {eodag-3.4.3 → eodag-3.5.1}/eodag.egg-info/entry_points.txt +0 -0
  252. {eodag-3.4.3 → eodag-3.5.1}/eodag.egg-info/top_level.txt +0 -0
  253. {eodag-3.4.3 → eodag-3.5.1}/get_pypi_latest_version.sh +0 -0
  254. {eodag-3.4.3 → eodag-3.5.1}/pytest.ini +0 -0
  255. {eodag-3.4.3 → eodag-3.5.1}/readthedocs.yml +0 -0
  256. {eodag-3.4.3 → eodag-3.5.1}/requirements-dev.txt +0 -0
  257. {eodag-3.4.3 → eodag-3.5.1}/requirements-docs.txt +0 -0
  258. {eodag-3.4.3 → eodag-3.5.1}/requirements-tutorials.txt +0 -0
  259. {eodag-3.4.3 → eodag-3.5.1}/requirements.txt +0 -0
  260. {eodag-3.4.3 → eodag-3.5.1}/setup.py +0 -0
  261. {eodag-3.4.3 → eodag-3.5.1}/tox.ini +0 -0
  262. {eodag-3.4.3 → eodag-3.5.1}/utils/params_mapping_to_csv.py +0 -0
  263. {eodag-3.4.3 → eodag-3.5.1}/utils/product_types_information_to_csv.py +0 -0
@@ -33,9 +33,12 @@ jobs:
33
33
  source .venv/bin/activate
34
34
  uv pip install python-semantic-release packaging
35
35
  - name: Set Git config
36
+ env:
37
+ TOKEN: ${{ secrets.USER_TOKEN }}
36
38
  run: |
37
39
  git config user.name "github-actions[bot]"
38
40
  git config user.email "'github-actions[bot]@users.noreply.github.com"
41
+ git remote set-url origin https://$TOKEN@github.com/${{ github.repository }}.git
39
42
  - name: Git merge develop in master
40
43
  run: |
41
44
  git checkout master
@@ -62,9 +65,12 @@ jobs:
62
65
  # Get history and tags for SCM versioning to work
63
66
  fetch-depth: 0
64
67
  - name: Set Git config
68
+ env:
69
+ TOKEN: ${{ secrets.USER_TOKEN }}
65
70
  run: |
66
71
  git config user.name "github-actions[bot]"
67
72
  git config user.email "'github-actions[bot]@users.noreply.github.com"
73
+ git remote set-url origin https://$TOKEN@github.com/${{ github.repository }}.git
68
74
  - name: Git merge master in develop
69
75
  run: |
70
76
  git checkout develop
@@ -3,6 +3,89 @@ Release history
3
3
  ===============
4
4
 
5
5
 
6
+ v3.5.1 (2025-06-23)
7
+ ===================
8
+
9
+ Bug Fixes
10
+ ---------
11
+
12
+ * **core**: Enable count with search iterator (`#1700`_, `bbcc7ba`_)
13
+
14
+ * **plugins**: Lru caching when fetching constraints with ECMWF (`#1698`_, `e23f47e`_)
15
+
16
+ Refactoring
17
+ -----------
18
+
19
+ * **core**: Register downloader using manager from search to EOProduct (`#1699`_, `fd0c149`_)
20
+
21
+ .. _#1698: https://github.com/CS-SI/eodag/pull/1698
22
+ .. _#1699: https://github.com/CS-SI/eodag/pull/1699
23
+ .. _#1700: https://github.com/CS-SI/eodag/pull/1700
24
+ .. _bbcc7ba: https://github.com/CS-SI/eodag/commit/bbcc7ba311fcf25a0231203035166276e704ec8e
25
+ .. _e23f47e: https://github.com/CS-SI/eodag/commit/e23f47ee97a50c0ba1d573801a17177c88f06eae
26
+ .. _fd0c149: https://github.com/CS-SI/eodag/commit/fd0c149277735a3ecdc11588e8ac8e166b591ae8
27
+
28
+
29
+ v3.5.0 (2025-06-20)
30
+ ===================
31
+
32
+ Bug Fixes
33
+ ---------
34
+
35
+ * **core**: Always validate PluginConfig before loading (`#1690`_, `59ac437`_)
36
+
37
+ * **core**: Skip provider empty conf on init (`#1687`_, `0a4104e`_)
38
+
39
+ * **plugins**: Raise errors when metadata discovery is not allowed (`#1534`_, `855ffa3`_)
40
+
41
+ Build System
42
+ ------------
43
+
44
+ * Update usgs to 0.3.6 (`#1688`_, `e63cfb1`_)
45
+
46
+ Continuous Integration
47
+ ----------------------
48
+
49
+ * Use personal access token for deploy github action (`#1693`_, `ff777d7`_)
50
+
51
+ Documentation
52
+ -------------
53
+
54
+ * Dead-links and out-of-date param fix (`#1692`_, `445a20e`_)
55
+
56
+ Features
57
+ --------
58
+
59
+ * **core**: Add env variable to whitelist providers (`#1672`_, `b93c4c8`_)
60
+
61
+ * **core**: Add strict product types mode (`#1677`_, `5077fa5`_)
62
+
63
+ * **plugins**: Auth token expiration margin (`#1665`_, `ef5fc18`_)
64
+
65
+ * **server**: Added bbox filter support for collections search (`#1671`_, `5717f0d`_)
66
+
67
+ .. _#1534: https://github.com/CS-SI/eodag/pull/1534
68
+ .. _#1665: https://github.com/CS-SI/eodag/pull/1665
69
+ .. _#1671: https://github.com/CS-SI/eodag/pull/1671
70
+ .. _#1672: https://github.com/CS-SI/eodag/pull/1672
71
+ .. _#1677: https://github.com/CS-SI/eodag/pull/1677
72
+ .. _#1687: https://github.com/CS-SI/eodag/pull/1687
73
+ .. _#1688: https://github.com/CS-SI/eodag/pull/1688
74
+ .. _#1690: https://github.com/CS-SI/eodag/pull/1690
75
+ .. _#1692: https://github.com/CS-SI/eodag/pull/1692
76
+ .. _#1693: https://github.com/CS-SI/eodag/pull/1693
77
+ .. _0a4104e: https://github.com/CS-SI/eodag/commit/0a4104e0518abc70e2133ca98472eea87d673a1c
78
+ .. _445a20e: https://github.com/CS-SI/eodag/commit/445a20e060730642e703615c73225c0df3cc84d0
79
+ .. _5077fa5: https://github.com/CS-SI/eodag/commit/5077fa591496811fb100c1e6b6a3e452cbdbe2a5
80
+ .. _5717f0d: https://github.com/CS-SI/eodag/commit/5717f0deddbf022f2c6d5207ade77de6afb0f9d5
81
+ .. _59ac437: https://github.com/CS-SI/eodag/commit/59ac437de01a8996d247b1f8239f332ed5dc5456
82
+ .. _855ffa3: https://github.com/CS-SI/eodag/commit/855ffa39fa9b914eb39cc20d6e5c2cbbc1b2097a
83
+ .. _b93c4c8: https://github.com/CS-SI/eodag/commit/b93c4c88f323af0eecb0950c90c6862ca9a7c3f4
84
+ .. _e63cfb1: https://github.com/CS-SI/eodag/commit/e63cfb19ca64a2ed65f500ae9678e117a2ea4cf8
85
+ .. _ef5fc18: https://github.com/CS-SI/eodag/commit/ef5fc188e515759c9227584b25805db75f537833
86
+ .. _ff777d7: https://github.com/CS-SI/eodag/commit/ff777d7a1e33f612c5227dba4fecfcec55ff18fc
87
+
88
+
6
89
  v3.4.3 (2025-06-12)
7
90
  ===================
8
91
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eodag
3
- Version: 3.4.3
3
+ Version: 3.5.1
4
4
  Summary: Earth Observation Data Access Gateway
5
5
  Home-page: https://github.com/CS-SI/eodag
6
6
  Author: CS GROUP - France
@@ -64,7 +64,7 @@ Requires-Dist: OWSLib>=0.27.1; extra == "csw"
64
64
  Provides-Extra: ecmwf
65
65
  Requires-Dist: ecmwf-api-client; extra == "ecmwf"
66
66
  Provides-Extra: usgs
67
- Requires-Dist: usgs>=0.3.1; extra == "usgs"
67
+ Requires-Dist: usgs>=0.3.6; extra == "usgs"
68
68
  Provides-Extra: server
69
69
  Requires-Dist: fastapi>=0.93.0; extra == "server"
70
70
  Requires-Dist: pygeofilter; extra == "server"
@@ -317,7 +317,7 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
317
317
 
318
318
  .. code-block:: bash
319
319
 
320
- docker run -p 5000:5000 --rm csspace/eodag-server:3.4.3
320
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.5.1
321
321
 
322
322
  You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
323
323
  Simply run:
@@ -187,7 +187,7 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
187
187
 
188
188
  .. code-block:: bash
189
189
 
190
- docker run -p 5000:5000 --rm csspace/eodag-server:3.4.3
190
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.5.1
191
191
 
192
192
  You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
193
193
  Simply run:
@@ -1,5 +1,5 @@
1
1
  apiVersion: v2
2
- appVersion: 3.4.3
2
+ appVersion: 3.5.1
3
3
  dependencies:
4
4
  - name: common
5
5
  repository: oci://registry-1.docker.io/bitnamicharts
@@ -15,4 +15,4 @@ name: eodag-server
15
15
  sources:
16
16
  - https://github.com/CS-SI/eodag
17
17
  type: application
18
- version: 3.4.3
18
+ version: 3.5.1
@@ -157,6 +157,26 @@ Some EODAG core settings can be overriden using environment variables:
157
157
  <https://eodag.readthedocs.io/en/stable/notebooks/api_user_guide/2_providers_products_available.html#Product-types-discovery>`_
158
158
  in place of https://cs-si.github.io/eodag/eodag/resources/ext_product_types.json.
159
159
  If the file is not readable, only user-modified providers will be fetched.
160
+ * ``EODAG_PROVIDERS_WHITELIST`` to restrict EODAG to only use a specific list of providers.
161
+
162
+ If this environment variable is set (as a comma-separated list of provider names), EODAG will only load and use the specified providers.
163
+ All other providers will be ignored, regardless of their presence in configuration files.
164
+
165
+ This is useful for restricting EODAG to a subset of providers, for example in controlled or production environments.
166
+ * ``EODAG_STRICT_PRODUCT_TYPES`` to control how product types are listed.
167
+
168
+ If this environment variable is set to a truthy value (such as ``1``, ``true``, ``yes``, or ``on``), EODAG will only list product types that are present in the main product types configuration file.
169
+ Product types defined only in provider configurations (but not in the main product types configuration) will be ignored.
170
+ If not set, EODAG will also include product types defined only in provider configurations, with minimal metadata.
171
+
172
+ This is useful if you want to strictly control which product types are available, for example to ensure consistency across environments.
173
+
174
+ Example usage:
175
+
176
+ .. code-block:: bash
177
+
178
+ export EODAG_PROVIDERS_WHITELIST=peps,creodias,theia
179
+ export EODAG_STRICT_PRODUCT_TYPES=true
160
180
 
161
181
  CLI configuration
162
182
  ^^^^^^^^^^^^^^^^^
@@ -150,7 +150,7 @@ No authentication needed.
150
150
 
151
151
  ``ecmwf``
152
152
  ^^^^^^^^^
153
- Create an account `here <https://apps.ecmwf.int/registration/>`__.
153
+ Create an account `here <https://www.ecmwf.int/user/login>`__.
154
154
 
155
155
  Then use *email* as ``username`` and *key* as ``password`` from `here <https://api.ecmwf.int/v1/key/>`__ in eodag credentials.
156
156
  EODAG can be used to request for public datasets as for operational archive. Please note that for public datasets you
@@ -115,7 +115,7 @@ available on `https://hub.docker.com/r/csspace/eodag-server <https://hub.docker.
115
115
 
116
116
  .. code-block:: bash
117
117
 
118
- $ docker run -p 5000:5000 --rm csspace/eodag-server:3.4.3
118
+ $ docker run -p 5000:5000 --rm csspace/eodag-server:3.5.1
119
119
 
120
120
  Example
121
121
  -------
@@ -36,7 +36,7 @@ from whoosh.index import exists_in, open_dir
36
36
  from whoosh.qparser import QueryParser
37
37
 
38
38
  from eodag.api.product.metadata_mapping import (
39
- ONLINE_STATUS,
39
+ NOT_AVAILABLE,
40
40
  mtd_cfg_as_conversion_and_querypath,
41
41
  )
42
42
  from eodag.api.search_result import SearchResult
@@ -79,6 +79,7 @@ from eodag.utils import (
79
79
  string_to_jsonpath,
80
80
  uri_to_path,
81
81
  )
82
+ from eodag.utils.env import is_env_var_true
82
83
  from eodag.utils.exceptions import (
83
84
  AuthenticationError,
84
85
  EodagError,
@@ -175,12 +176,19 @@ class EODataAccessGateway:
175
176
  share_credentials(self.providers_config)
176
177
 
177
178
  # init updated providers conf
179
+ strict_mode = is_env_var_true("EODAG_STRICT_PRODUCT_TYPES")
180
+ available_product_types = set(self.product_types_config.source.keys())
181
+
178
182
  for provider in self.providers_config.keys():
179
183
  provider_config_init(
180
184
  self.providers_config[provider],
181
185
  load_stac_provider_config(),
182
186
  )
183
187
 
188
+ self._sync_provider_product_types(
189
+ provider, available_product_types, strict_mode
190
+ )
191
+
184
192
  # re-build _plugins_manager using up-to-date providers_config
185
193
  self._plugins_manager.rebuild(self.providers_config)
186
194
 
@@ -226,6 +234,61 @@ class EODataAccessGateway:
226
234
  )
227
235
  self.set_locations_conf(locations_conf_path)
228
236
 
237
+ def _sync_provider_product_types(
238
+ self,
239
+ provider: str,
240
+ available_product_types: set[str],
241
+ strict_mode: bool,
242
+ ) -> None:
243
+ """
244
+ Synchronize product types for a provider based on strict or permissive mode.
245
+
246
+ In strict mode, removes product types not in available_product_types.
247
+ In permissive mode, adds empty product type configs for missing types.
248
+
249
+ :param provider: The provider name whose product types should be synchronized.
250
+ :param available_product_types: The set of available product type IDs.
251
+ :param strict_mode: If True, remove unknown product types; if False, add empty configs for them.
252
+ :returns: None
253
+ """
254
+ provider_products = self.providers_config[provider].products
255
+ products_to_remove: list[str] = []
256
+ products_to_add: list[str] = []
257
+
258
+ for product_id in provider_products:
259
+ if product_id == GENERIC_PRODUCT_TYPE:
260
+ continue
261
+
262
+ if product_id not in available_product_types:
263
+ if strict_mode:
264
+ products_to_remove.append(product_id)
265
+ continue
266
+
267
+ empty_product = {
268
+ "title": product_id,
269
+ "abstract": NOT_AVAILABLE,
270
+ }
271
+ self.product_types_config.source[
272
+ product_id
273
+ ] = empty_product # will update available_product_types
274
+ products_to_add.append(product_id)
275
+
276
+ if products_to_add:
277
+ logger.debug(
278
+ "Product types permissive mode, %s added (provider %s)",
279
+ ", ".join(products_to_add),
280
+ provider,
281
+ )
282
+
283
+ if products_to_remove:
284
+ logger.debug(
285
+ "Product types strict mode, ignoring %s (provider %s)",
286
+ ", ".join(products_to_remove),
287
+ provider,
288
+ )
289
+ for id in products_to_remove:
290
+ del self.providers_config[provider].products[id]
291
+
229
292
  def get_version(self) -> str:
230
293
  """Get eodag package version"""
231
294
  return version("eodag")
@@ -608,11 +671,14 @@ class EODataAccessGateway:
608
671
  for product_type_id in p.products: # type: ignore
609
672
  if product_type_id == GENERIC_PRODUCT_TYPE:
610
673
  continue
674
+
611
675
  config = self.product_types_config[product_type_id]
612
676
  config["_id"] = product_type_id
677
+
613
678
  if "alias" in config:
614
679
  product_type_id = config["alias"]
615
680
  product_type = {"ID": product_type_id, **config}
681
+
616
682
  if product_type not in product_types:
617
683
  product_types.append(product_type)
618
684
 
@@ -620,11 +686,18 @@ class EODataAccessGateway:
620
686
  return sorted(product_types, key=itemgetter("ID"))
621
687
 
622
688
  def fetch_product_types_list(self, provider: Optional[str] = None) -> None:
623
- """Fetch product types list and update if needed
689
+ """Fetch product types list and update if needed.
690
+
691
+ If strict mode is enabled (by setting the ``EODAG_STRICT_PRODUCT_TYPES`` environment variable
692
+ to a truthy value), this method will not fetch or update product types and will return immediately.
624
693
 
625
694
  :param provider: The name of a provider or provider-group for which product types
626
695
  list should be updated. Defaults to all providers (None value).
627
696
  """
697
+ strict_mode = is_env_var_true("EODAG_STRICT_PRODUCT_TYPES")
698
+ if strict_mode:
699
+ return
700
+
628
701
  providers_to_fetch = list(self.providers_config.keys())
629
702
  # check if some providers are grouped under a group name which is not a provider name
630
703
  if provider is not None and provider not in self.providers_config:
@@ -1321,7 +1394,11 @@ class EODataAccessGateway:
1321
1394
  prev_product = None
1322
1395
  next_page_url = None
1323
1396
  next_page_query_obj = None
1397
+ number_matched = None
1324
1398
  while True:
1399
+ # if count is enabled, it will only be performed on 1st iteration
1400
+ if iteration == 2:
1401
+ kwargs["count"] = False
1325
1402
  if iteration > 1 and next_page_url:
1326
1403
  pagination_config["next_page_url_tpl"] = next_page_url
1327
1404
  if iteration > 1 and next_page_query_obj:
@@ -1329,11 +1406,13 @@ class EODataAccessGateway:
1329
1406
  logger.info("Iterate search over multiple pages: page #%s", iteration)
1330
1407
  try:
1331
1408
  # remove unwanted kwargs for _do_search
1332
- kwargs.pop("count", None)
1333
1409
  kwargs.pop("raise_errors", None)
1334
1410
  search_result = self._do_search(
1335
- search_plugin, count=False, raise_errors=True, **kwargs
1411
+ search_plugin, raise_errors=True, **kwargs
1336
1412
  )
1413
+ # if count is enabled, it will only be performed on 1st iteration
1414
+ if iteration == 1:
1415
+ number_matched = search_result.number_matched
1337
1416
  except Exception:
1338
1417
  logger.warning(
1339
1418
  "error at retrieval of data from %s, for params: %s",
@@ -1388,6 +1467,8 @@ class EODataAccessGateway:
1388
1467
  )
1389
1468
  last_page_with_products = iteration - 1
1390
1469
  break
1470
+ # use count got from 1st iteration
1471
+ search_result.number_matched = number_matched
1391
1472
  yield search_result
1392
1473
  prev_product = product
1393
1474
  # Prevent a last search if the current one returned less than the
@@ -1475,6 +1556,9 @@ class EODataAccessGateway:
1475
1556
  )
1476
1557
  self.fetch_product_types_list()
1477
1558
 
1559
+ # remove unwanted count
1560
+ kwargs.pop("count", None)
1561
+
1478
1562
  search_plugins, search_kwargs = self._prepare_search(
1479
1563
  start=start, end=end, geom=geom, locations=locations, **kwargs
1480
1564
  )
@@ -1497,6 +1581,7 @@ class EODataAccessGateway:
1497
1581
  for page_results in self.search_iter_page_plugin(
1498
1582
  items_per_page=itp,
1499
1583
  search_plugin=search_plugin,
1584
+ count=False,
1500
1585
  **search_kwargs,
1501
1586
  ):
1502
1587
  all_results.data.extend(page_results.data)
@@ -1907,29 +1992,7 @@ class EODataAccessGateway:
1907
1992
  logger.debug("product type %s not found", eo_product.product_type)
1908
1993
 
1909
1994
  if eo_product.search_intersection is not None:
1910
- download_plugin = self._plugins_manager.get_download_plugin(
1911
- eo_product
1912
- )
1913
- if len(eo_product.assets) > 0:
1914
- matching_url = next(iter(eo_product.assets.values()))["href"]
1915
- elif eo_product.properties.get("storageStatus") != ONLINE_STATUS:
1916
- matching_url = eo_product.properties.get(
1917
- "orderLink"
1918
- ) or eo_product.properties.get("downloadLink")
1919
- else:
1920
- matching_url = eo_product.properties.get("downloadLink")
1921
-
1922
- try:
1923
- auth_plugin = next(
1924
- self._plugins_manager.get_auth_plugins(
1925
- search_plugin.provider,
1926
- matching_url=matching_url,
1927
- matching_conf=download_plugin.config,
1928
- )
1929
- )
1930
- except StopIteration:
1931
- auth_plugin = None
1932
- eo_product.register_downloader(download_plugin, auth_plugin)
1995
+ eo_product._register_downloader_from_manager(self._plugins_manager)
1933
1996
 
1934
1997
  results.extend(res)
1935
1998
  total_results = (
@@ -43,6 +43,7 @@ from eodag.api.product.metadata_mapping import (
43
43
  DEFAULT_GEOMETRY,
44
44
  NOT_AVAILABLE,
45
45
  NOT_MAPPED,
46
+ ONLINE_STATUS,
46
47
  )
47
48
  from eodag.utils import (
48
49
  DEFAULT_DOWNLOAD_TIMEOUT,
@@ -62,6 +63,7 @@ if TYPE_CHECKING:
62
63
  from eodag.plugins.apis.base import Api
63
64
  from eodag.plugins.authentication.base import Authentication
64
65
  from eodag.plugins.download.base import Download
66
+ from eodag.plugins.manager import PluginManager
65
67
  from eodag.types.download_args import DownloadConf
66
68
  from eodag.utils import Unpack
67
69
 
@@ -238,6 +240,37 @@ class EOProduct:
238
240
  f"Unable to get {e.args[0]} key from EOProduct.properties"
239
241
  )
240
242
 
243
+ def _register_downloader_from_manager(self, plugins_manager: PluginManager) -> None:
244
+ """Register the downloader and authenticator for this EOProduct using the
245
+ provided plugins manager.
246
+ This method is typically called after the EOProduct has been created and
247
+ before any download operation is performed.
248
+
249
+ :param plugins_manager: The plugins manager instance to use for retrieving
250
+ the download and authentication plugins.
251
+ """
252
+ download_plugin = plugins_manager.get_download_plugin(self)
253
+ if len(self.assets) > 0:
254
+ matching_url = next(iter(self.assets.values()))["href"]
255
+ elif self.properties.get("storageStatus") != ONLINE_STATUS:
256
+ matching_url = self.properties.get("orderLink") or self.properties.get(
257
+ "downloadLink"
258
+ )
259
+ else:
260
+ matching_url = self.properties.get("downloadLink")
261
+
262
+ try:
263
+ auth_plugin = next(
264
+ plugins_manager.get_auth_plugins(
265
+ self.provider,
266
+ matching_url=matching_url,
267
+ matching_conf=download_plugin.config,
268
+ )
269
+ )
270
+ except StopIteration:
271
+ auth_plugin = None
272
+ self.register_downloader(download_plugin, auth_plugin)
273
+
241
274
  def register_downloader(
242
275
  self, downloader: Union[Api, Download], authenticator: Optional[Authentication]
243
276
  ) -> None:
@@ -54,6 +54,7 @@ from eodag.utils import (
54
54
  string_to_jsonpath,
55
55
  update_nested_dict,
56
56
  )
57
+ from eodag.utils.exceptions import ValidationError
57
58
 
58
59
  if TYPE_CHECKING:
59
60
  from shapely.geometry.base import BaseGeometry
@@ -1286,7 +1287,10 @@ def mtd_cfg_as_conversion_and_querypath(
1286
1287
 
1287
1288
 
1288
1289
  def format_query_params(
1289
- product_type: str, config: PluginConfig, query_dict: dict[str, Any]
1290
+ product_type: str,
1291
+ config: PluginConfig,
1292
+ query_dict: dict[str, Any],
1293
+ error_context: str = "",
1290
1294
  ) -> dict[str, Any]:
1291
1295
  """format the search parameters to query parameters"""
1292
1296
  if "raise_errors" in query_dict.keys():
@@ -1299,10 +1303,26 @@ def format_query_params(
1299
1303
  **config.products.get(product_type, {}).get("metadata_mapping", {}),
1300
1304
  )
1301
1305
 
1306
+ # Raise error if non-queryables parameters are used and raise_mtd_discovery_error configured
1307
+ if (
1308
+ raise_mtd_discovery_error := config.products.get(product_type, {})
1309
+ .get("discover_metadata", {})
1310
+ .get("raise_mtd_discovery_error")
1311
+ ) is None:
1312
+ raise_mtd_discovery_error = getattr(config, "discover_metadata", {}).get(
1313
+ "raise_mtd_discovery_error", False
1314
+ )
1315
+
1302
1316
  query_params: dict[str, Any] = {}
1303
1317
  # Get all the search parameters that are recognised as queryables by the
1304
1318
  # provider (they appear in the queryables dictionary)
1305
- queryables = _get_queryables(query_dict, config, product_type_metadata_mapping)
1319
+ queryables = _get_queryables(
1320
+ query_dict,
1321
+ config,
1322
+ product_type_metadata_mapping,
1323
+ raise_mtd_discovery_error,
1324
+ error_context,
1325
+ )
1306
1326
 
1307
1327
  for eodag_search_key, provider_search_key in queryables.items():
1308
1328
  user_input = query_dict[eodag_search_key]
@@ -1438,6 +1458,8 @@ def _get_queryables(
1438
1458
  search_params: dict[str, Any],
1439
1459
  config: PluginConfig,
1440
1460
  metadata_mapping: dict[str, Any],
1461
+ raise_mtd_discovery_error: bool,
1462
+ error_context: str,
1441
1463
  ) -> dict[str, Any]:
1442
1464
  """Retrieve the metadata mappings that are query-able"""
1443
1465
  logger.debug("Retrieving queryable metadata from metadata_mapping")
@@ -1445,6 +1467,13 @@ def _get_queryables(
1445
1467
  for eodag_search_key, user_input in search_params.items():
1446
1468
  if user_input is not None:
1447
1469
  md_mapping = metadata_mapping.get(eodag_search_key, (None, NOT_MAPPED))
1470
+ # raise an error when a query param not allowed by the provider is found
1471
+ if not isinstance(md_mapping, list) and raise_mtd_discovery_error:
1472
+ raise ValidationError(
1473
+ "Search parameters which are not queryable are disallowed for this product type on this provider: "
1474
+ f"please remove '{eodag_search_key}' from your search parameters. {error_context}",
1475
+ {eodag_search_key},
1476
+ )
1448
1477
  _, md_value = md_mapping
1449
1478
  # query param from defined metadata_mapping
1450
1479
  if md_mapping is not None and isinstance(md_mapping, list):