eodag 3.3.0__tar.gz → 3.3.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 (260) hide show
  1. {eodag-3.3.0 → eodag-3.3.1}/CHANGES.rst +25 -1
  2. {eodag-3.3.0/eodag.egg-info → eodag-3.3.1}/PKG-INFO +2 -2
  3. {eodag-3.3.0 → eodag-3.3.1}/README.rst +1 -1
  4. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/Chart.yaml +2 -2
  5. {eodag-3.3.0 → eodag-3.3.1}/docs/stac_rest.rst +1 -1
  6. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/search_result.py +5 -7
  7. {eodag-3.3.0 → eodag-3.3.1}/eodag/config.py +3 -0
  8. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/token.py +97 -60
  9. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/base.py +9 -7
  10. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/qssearch.py +15 -14
  11. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/ext_product_types.json +1 -1
  12. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/errors.py +18 -3
  13. {eodag-3.3.0 → eodag-3.3.1}/eodag/types/queryables.py +3 -0
  14. {eodag-3.3.0 → eodag-3.3.1/eodag.egg-info}/PKG-INFO +2 -2
  15. {eodag-3.3.0 → eodag-3.3.1}/pyproject.toml +1 -1
  16. {eodag-3.3.0 → eodag-3.3.1}/.dockerignore +0 -0
  17. {eodag-3.3.0 → eodag-3.3.1}/.editorconfig +0 -0
  18. {eodag-3.3.0 → eodag-3.3.1}/.gitattributes +0 -0
  19. {eodag-3.3.0 → eodag-3.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {eodag-3.3.0 → eodag-3.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  21. {eodag-3.3.0 → eodag-3.3.1}/.github/pull_request_template.md +0 -0
  22. {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/changelog.yml +0 -0
  23. {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/deploy.yml +0 -0
  24. {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/fetch.yml +0 -0
  25. {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/github-pages.yml +0 -0
  26. {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/lint-pr-title.yml +0 -0
  27. {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/test.yml +0 -0
  28. {eodag-3.3.0 → eodag-3.3.1}/.gitignore +0 -0
  29. {eodag-3.3.0 → eodag-3.3.1}/.pre-commit-config.yaml +0 -0
  30. {eodag-3.3.0 → eodag-3.3.1}/BREAKING_CHANGES.rst +0 -0
  31. {eodag-3.3.0 → eodag-3.3.1}/CODE_OF_CONDUCT.md +0 -0
  32. {eodag-3.3.0 → eodag-3.3.1}/CONTRIBUTING.rst +0 -0
  33. {eodag-3.3.0 → eodag-3.3.1}/LICENSE +0 -0
  34. {eodag-3.3.0 → eodag-3.3.1}/MANIFEST.in +0 -0
  35. {eodag-3.3.0 → eodag-3.3.1}/NOTICE +0 -0
  36. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/Chart.lock +0 -0
  37. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/README.md +0 -0
  38. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/NOTES.txt +0 -0
  39. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/_helpers.tpl +0 -0
  40. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/configmap.yaml +0 -0
  41. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/deployment.yaml +0 -0
  42. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/extra-list.yaml +0 -0
  43. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/hpa.yaml +0 -0
  44. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/ingress.yaml +0 -0
  45. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/pv.yaml +0 -0
  46. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/pvc.yaml +0 -0
  47. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/secret.yaml +0 -0
  48. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/service.yaml +0 -0
  49. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/serviceaccount.yaml +0 -0
  50. {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/values.yaml +0 -0
  51. {eodag-3.3.0 → eodag-3.3.1}/docker/run-stac-server.sh +0 -0
  52. {eodag-3.3.0 → eodag-3.3.1}/docker/stac-browser.dockerfile +0 -0
  53. {eodag-3.3.0 → eodag-3.3.1}/docker/stac-server.dockerfile +0 -0
  54. {eodag-3.3.0 → eodag-3.3.1}/docker-compose.yml +0 -0
  55. {eodag-3.3.0 → eodag-3.3.1}/docs/Makefile +0 -0
  56. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/custom.css +0 -0
  57. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/download_methods.png +0 -0
  58. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_advanced_calls_graph.svg +0 -0
  59. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_bycs.png +0 -0
  60. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_fetch_product_types.png +0 -0
  61. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_logo_160.png +0 -0
  62. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_logo_160r.png +0 -0
  63. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_main_calls_graph.svg +0 -0
  64. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_overview.png +0 -0
  65. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_stac_client.png +0 -0
  66. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_stac_server.png +0 -0
  67. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/favicon-32x32.png +0 -0
  68. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/params_mapping_extra.csv +0 -0
  69. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/params_mapping_offline_infos.json +0 -0
  70. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/params_mapping_opensearch.csv +0 -0
  71. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/product_types_information.csv +0 -0
  72. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_1.png +0 -0
  73. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_1_none.png +0 -0
  74. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_2.png +0 -0
  75. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_2_none.png +0 -0
  76. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/stac_browser_example.png +0 -0
  77. {eodag-3.3.0 → eodag-3.3.1}/docs/_static/stac_browser_example_600.png +0 -0
  78. {eodag-3.3.0 → eodag-3.3.1}/docs/add_product_type.rst +0 -0
  79. {eodag-3.3.0 → eodag-3.3.1}/docs/add_provider.rst +0 -0
  80. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/assets.rst +0 -0
  81. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/call_graphs.rst +0 -0
  82. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/core.rst +0 -0
  83. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/eoproduct.rst +0 -0
  84. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/exceptions.rst +0 -0
  85. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/index.rst +0 -0
  86. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/searchresult.rst +0 -0
  87. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/types.rst +0 -0
  88. {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/utils.rst +0 -0
  89. {eodag-3.3.0 → eodag-3.3.1}/docs/api_user_guide.rst +0 -0
  90. {eodag-3.3.0 → eodag-3.3.1}/docs/breaking_changes.rst +0 -0
  91. {eodag-3.3.0 → eodag-3.3.1}/docs/changelog.rst +0 -0
  92. {eodag-3.3.0 → eodag-3.3.1}/docs/cli_user_guide.rst +0 -0
  93. {eodag-3.3.0 → eodag-3.3.1}/docs/conf.py +0 -0
  94. {eodag-3.3.0 → eodag-3.3.1}/docs/contribute.rst +0 -0
  95. {eodag-3.3.0 → eodag-3.3.1}/docs/drivers.rst +0 -0
  96. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/configure.rst +0 -0
  97. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/index.rst +0 -0
  98. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/install.rst +0 -0
  99. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/overview.rst +0 -0
  100. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/product_storage_status.rst +0 -0
  101. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/product_types.rst +0 -0
  102. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/providers.rst +0 -0
  103. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/register.rst +0 -0
  104. {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/side_projects.rst +0 -0
  105. {eodag-3.3.0 → eodag-3.3.1}/docs/index.rst +0 -0
  106. {eodag-3.3.0 → eodag-3.3.1}/docs/make.bat +0 -0
  107. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/1_overview.ipynb +0 -0
  108. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/2_providers_products_available.ipynb +0 -0
  109. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/3_configuration.ipynb +0 -0
  110. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/4_search.ipynb +0 -0
  111. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/5_queryables.ipynb +0 -0
  112. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/6_serialize_deserialize.ipynb +0 -0
  113. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/7_crunch.ipynb +0 -0
  114. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/8_download.ipynb +0 -0
  115. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/9_post_process.ipynb +0 -0
  116. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/data/crunch_search_results.geojson +0 -0
  117. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/data/download_search_results.geojson +0 -0
  118. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/intro_notebooks.ipynb +0 -0
  119. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.cpg +0 -0
  120. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.dbf +0 -0
  121. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.prj +0 -0
  122. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qix +0 -0
  123. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qpj +0 -0
  124. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shp +0 -0
  125. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shx +0 -0
  126. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/sentinel2_tiling_grid_centroids.zip +0 -0
  127. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_burnt_areas_snappy.ipynb +0 -0
  128. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_cds.ipynb +0 -0
  129. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_cop_dem.ipynb +0 -0
  130. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_ecmwf.ipynb +0 -0
  131. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_meteoblue.ipynb +0 -0
  132. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_search_location_tile.ipynb +0 -0
  133. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_ship_detection.ipynb +0 -0
  134. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_stac_client.ipynb +0 -0
  135. {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_wekeo.ipynb +0 -0
  136. {eodag-3.3.0 → eodag-3.3.1}/docs/params_mapping.rst +0 -0
  137. {eodag-3.3.0 → eodag-3.3.1}/docs/plugins.rst +0 -0
  138. {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/api.rst +0 -0
  139. {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/auth.rst +0 -0
  140. {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/crunch.rst +0 -0
  141. {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/download.rst +0 -0
  142. {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/search.rst +0 -0
  143. {eodag-3.3.0 → eodag-3.3.1}/docs/stac.rst +0 -0
  144. {eodag-3.3.0 → eodag-3.3.1}/docs/tutos.rst +0 -0
  145. {eodag-3.3.0 → eodag-3.3.1}/eodag/__init__.py +0 -0
  146. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/__init__.py +0 -0
  147. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/core.py +0 -0
  148. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/__init__.py +0 -0
  149. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/_assets.py +0 -0
  150. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/_product.py +0 -0
  151. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/__init__.py +0 -0
  152. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/base.py +0 -0
  153. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/generic.py +0 -0
  154. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/sentinel1.py +0 -0
  155. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/sentinel2.py +0 -0
  156. {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/metadata_mapping.py +0 -0
  157. {eodag-3.3.0 → eodag-3.3.1}/eodag/cli.py +0 -0
  158. {eodag-3.3.0 → eodag-3.3.1}/eodag/crunch.py +0 -0
  159. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/__init__.py +0 -0
  160. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/__init__.py +0 -0
  161. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/base.py +0 -0
  162. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/ecmwf.py +0 -0
  163. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/usgs.py +0 -0
  164. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/__init__.py +0 -0
  165. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/aws_auth.py +0 -0
  166. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/base.py +0 -0
  167. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/generic.py +0 -0
  168. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/header.py +0 -0
  169. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/keycloak.py +0 -0
  170. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/oauth.py +0 -0
  171. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/openid_connect.py +0 -0
  172. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/qsauth.py +0 -0
  173. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/sas_auth.py +0 -0
  174. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/token_exchange.py +0 -0
  175. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/base.py +0 -0
  176. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/__init__.py +0 -0
  177. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/base.py +0 -0
  178. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_date.py +0 -0
  179. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_latest_intersect.py +0 -0
  180. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_latest_tpl_name.py +0 -0
  181. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_overlap.py +0 -0
  182. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_property.py +0 -0
  183. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/__init__.py +0 -0
  184. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/aws.py +0 -0
  185. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/base.py +0 -0
  186. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/creodias_s3.py +0 -0
  187. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/http.py +0 -0
  188. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/s3rest.py +0 -0
  189. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/manager.py +0 -0
  190. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/__init__.py +0 -0
  191. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/build_search_result.py +0 -0
  192. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/cop_marine.py +0 -0
  193. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/creodias_s3.py +0 -0
  194. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/csw.py +0 -0
  195. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/data_request_search.py +0 -0
  196. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/stac_list_assets.py +0 -0
  197. {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/static_stac_search.py +0 -0
  198. {eodag-3.3.0 → eodag-3.3.1}/eodag/py.typed +0 -0
  199. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/locations_conf_template.yml +0 -0
  200. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/product_types.yml +0 -0
  201. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/providers.yml +0 -0
  202. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.VERSION.txt +0 -0
  203. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.cpg +0 -0
  204. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.dbf +0 -0
  205. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.prj +0 -0
  206. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.shp +0 -0
  207. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.shx +0 -0
  208. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/stac.yml +0 -0
  209. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/stac_api.yml +0 -0
  210. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/stac_provider.yml +0 -0
  211. {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/user_conf_template.yml +0 -0
  212. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/__init__.py +0 -0
  213. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/cache.py +0 -0
  214. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/config.py +0 -0
  215. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/constants.py +0 -0
  216. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/core.py +0 -0
  217. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/server.py +0 -0
  218. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/server.wsgi +0 -0
  219. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/stac.py +0 -0
  220. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/templates/README +0 -0
  221. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/__init__.py +0 -0
  222. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/collections_search.py +0 -0
  223. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/eodag_search.py +0 -0
  224. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/queryables.py +0 -0
  225. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/stac_search.py +0 -0
  226. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/utils/__init__.py +0 -0
  227. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/utils/cql_evaluate.py +0 -0
  228. {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/utils/rfc3339.py +0 -0
  229. {eodag-3.3.0 → eodag-3.3.1}/eodag/types/__init__.py +0 -0
  230. {eodag-3.3.0 → eodag-3.3.1}/eodag/types/bbox.py +0 -0
  231. {eodag-3.3.0 → eodag-3.3.1}/eodag/types/download_args.py +0 -0
  232. {eodag-3.3.0 → eodag-3.3.1}/eodag/types/search_args.py +0 -0
  233. {eodag-3.3.0 → eodag-3.3.1}/eodag/types/whoosh.py +0 -0
  234. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/__init__.py +0 -0
  235. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/exceptions.py +0 -0
  236. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/import_system.py +0 -0
  237. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/logging.py +0 -0
  238. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/notebook.py +0 -0
  239. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/repr.py +0 -0
  240. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/requests.py +0 -0
  241. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/rest.py +0 -0
  242. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/s3.py +0 -0
  243. {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/stac_reader.py +0 -0
  244. {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/SOURCES.txt +0 -0
  245. {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/dependency_links.txt +0 -0
  246. {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/entry_points.txt +0 -0
  247. {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/requires.txt +0 -0
  248. {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/top_level.txt +0 -0
  249. {eodag-3.3.0 → eodag-3.3.1}/get_pypi_latest_version.sh +0 -0
  250. {eodag-3.3.0 → eodag-3.3.1}/pytest.ini +0 -0
  251. {eodag-3.3.0 → eodag-3.3.1}/readthedocs.yml +0 -0
  252. {eodag-3.3.0 → eodag-3.3.1}/requirements-dev.txt +0 -0
  253. {eodag-3.3.0 → eodag-3.3.1}/requirements-docs.txt +0 -0
  254. {eodag-3.3.0 → eodag-3.3.1}/requirements-tutorials.txt +0 -0
  255. {eodag-3.3.0 → eodag-3.3.1}/requirements.txt +0 -0
  256. {eodag-3.3.0 → eodag-3.3.1}/setup.cfg +0 -0
  257. {eodag-3.3.0 → eodag-3.3.1}/setup.py +0 -0
  258. {eodag-3.3.0 → eodag-3.3.1}/tox.ini +0 -0
  259. {eodag-3.3.0 → eodag-3.3.1}/utils/params_mapping_to_csv.py +0 -0
  260. {eodag-3.3.0 → eodag-3.3.1}/utils/product_types_information_to_csv.py +0 -0
@@ -2,7 +2,31 @@
2
2
  Release history
3
3
  ===============
4
4
 
5
- .. _changelog-unreleased:
5
+
6
+ v3.3.1 (2025-04-17)
7
+ ===================
8
+
9
+ Bug Fixes
10
+ ---------
11
+
12
+ * **core**: Missing queryables from metadata-mapping (`#1614`_, `9789c0c`_)
13
+
14
+ * **core**: Provider queryables metadata (`#1613`_, `f1b066a`_)
15
+
16
+ * **core**: Reset errors between SearchResult instances (`#1607`_, `48b0779`_)
17
+
18
+ * **plugins**: Send client_id/client_secret with refresh_token in TokenAuth (`#1597`_, `9b626a9`_, thanks
19
+ `@jgaucher-cs <https://github.com/jgaucher-cs>`_)
20
+
21
+ .. _#1597: https://github.com/CS-SI/eodag/pull/1597
22
+ .. _#1607: https://github.com/CS-SI/eodag/pull/1607
23
+ .. _#1613: https://github.com/CS-SI/eodag/pull/1613
24
+ .. _#1614: https://github.com/CS-SI/eodag/pull/1614
25
+ .. _48b0779: https://github.com/CS-SI/eodag/commit/48b07797b3a17c26e33f6f8ee2f51488a0829162
26
+ .. _9789c0c: https://github.com/CS-SI/eodag/commit/9789c0c4a52aa180422e1f0a0c2b8d86c373a0ee
27
+ .. _9b626a9: https://github.com/CS-SI/eodag/commit/9b626a91c7563d505632c830a98d18993ec95199
28
+ .. _f1b066a: https://github.com/CS-SI/eodag/commit/f1b066a8feffef3d1c20147776128793177fcfeb
29
+
6
30
 
7
31
  v3.3.0 (2025-04-10)
8
32
  ===================
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eodag
3
- Version: 3.3.0
3
+ Version: 3.3.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
@@ -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.3.0
320
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.3.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.3.0
190
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.3.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.3.0
2
+ appVersion: 3.3.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.3.0
18
+ version: 3.3.1
@@ -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.3.0
118
+ $ docker run -p 5000:5000 --rm csspace/eodag-server:3.3.1
119
119
 
120
120
  Example
121
121
  -------
@@ -36,7 +36,7 @@ if TYPE_CHECKING:
36
36
  from eodag.plugins.crunch.base import Crunch
37
37
 
38
38
 
39
- class SearchResult(UserList):
39
+ class SearchResult(UserList[EOProduct]):
40
40
  """An object representing a collection of :class:`~eodag.api.product._product.EOProduct` resulting from a search.
41
41
 
42
42
  :param products: A list of products resulting from a search
@@ -46,8 +46,6 @@ class SearchResult(UserList):
46
46
  :ivar number_matched: Estimated total number of matching results
47
47
  """
48
48
 
49
- data: list[EOProduct]
50
-
51
49
  errors: Annotated[
52
50
  list[tuple[str, Exception]], Doc("Tuple of provider name, exception")
53
51
  ]
@@ -56,11 +54,11 @@ class SearchResult(UserList):
56
54
  self,
57
55
  products: list[EOProduct],
58
56
  number_matched: Optional[int] = None,
59
- errors: list[tuple[str, Exception]] = [],
57
+ errors: Optional[list[tuple[str, Exception]]] = None,
60
58
  ) -> None:
61
59
  super().__init__(products)
62
60
  self.number_matched = number_matched
63
- self.errors = errors
61
+ self.errors = errors if errors is not None else []
64
62
 
65
63
  def crunch(self, cruncher: Crunch, **search_params: Any) -> SearchResult:
66
64
  """Do some crunching with the underlying EO products.
@@ -193,8 +191,8 @@ class SearchResult(UserList):
193
191
  <details><summary style='color: grey; font-family: monospace;'>
194
192
  {i}&ensp;
195
193
  {type(p).__name__}(id=<span style='color: black;'>{
196
- p.properties["id"]
197
- }</span>, provider={p.provider})
194
+ p.properties["id"]
195
+ }</span>, provider={p.provider})
198
196
  </summary>
199
197
  {p._repr_html_()}
200
198
  </details>
@@ -618,6 +618,9 @@ class PluginConfig(yaml.YAMLObject):
618
618
  #: :class:`~eodag.plugins.authentication.token.TokenAuth`
619
619
  #: key to get the expiration time of the token
620
620
  token_expiration_key: str
621
+ #: :class:`~eodag.plugins.authentication.token.TokenAuth`
622
+ #: HTTP method to use
623
+ request_method: str
621
624
  #: :class:`~eodag.plugins.authentication.token_exchange.OIDCTokenExchangeAuth`
622
625
  #: The full :class:`~eodag.plugins.authentication.openid_connect.OIDCAuthorizationCodeFlowAuth` plugin configuration
623
626
  #: used to retrieve subject token
@@ -19,6 +19,7 @@ from __future__ import annotations
19
19
 
20
20
  import logging
21
21
  from datetime import datetime, timedelta
22
+ from threading import Lock
22
23
  from typing import TYPE_CHECKING, Any, Optional
23
24
  from urllib.parse import parse_qs, urlencode, urlparse, urlunparse
24
25
 
@@ -77,6 +78,7 @@ class TokenAuth(Authentication):
77
78
  the token (given in s)
78
79
  * :attr:`~eodag.config.PluginConfig.ssl_verify` (``bool``): if the ssl certificates
79
80
  should be verified in the requests; default: ``True``
81
+ * :attr:`~eodag.config.PluginConfig.request_method` (``str``): HTTP method to use; default: ``POST``
80
82
  * :attr:`~eodag.config.PluginConfig.auth_error_code` (``int``): which error code is
81
83
  returned in case of an authentication error
82
84
  * :attr:`~eodag.config.PluginConfig.req_data` (``dict[str, Any]``): if the credentials
@@ -95,6 +97,19 @@ class TokenAuth(Authentication):
95
97
  self.token = ""
96
98
  self.refresh_token = ""
97
99
  self.token_expiration = datetime.now()
100
+ self.auth_lock = Lock()
101
+
102
+ def __getstate__(self):
103
+ """Exclude attributes that can't be pickled from serialization."""
104
+ state = dict(self.__dict__)
105
+ del state["auth_lock"]
106
+ return state
107
+
108
+ def __setstate__(self, state):
109
+ """Exclude attributes that can't be pickled from deserialization."""
110
+ self.__dict__.update(state)
111
+ # Init them manually
112
+ self.auth_lock = Lock()
98
113
 
99
114
  def validate_config_credentials(self) -> None:
100
115
  """Validate configured credentials"""
@@ -134,61 +149,67 @@ class TokenAuth(Authentication):
134
149
 
135
150
  def authenticate(self) -> AuthBase:
136
151
  """Authenticate"""
137
- self.validate_config_credentials()
138
- if self.token and self.token_expiration > datetime.now():
139
- logger.debug("using existing access token")
140
- return RequestsTokenAuth(
141
- self.token, "header", headers=getattr(self.config, "headers", {})
142
- )
143
- s = requests.Session()
144
- try:
145
- # First get the token
146
- response = self._token_request(session=s)
147
- response.raise_for_status()
148
- except requests.exceptions.Timeout as exc:
149
- raise TimeOutError(exc, timeout=HTTP_REQ_TIMEOUT) from exc
150
- except RequestException as e:
151
- response_text = getattr(e.response, "text", "").strip()
152
- # check if error is identified as auth_error in provider conf
153
- auth_errors = getattr(self.config, "auth_error_code", [None])
154
- if not isinstance(auth_errors, list):
155
- auth_errors = [auth_errors]
156
- if (
157
- e.response is not None
158
- and getattr(e.response, "status_code", None)
159
- and e.response.status_code in auth_errors
160
- ):
161
- raise AuthenticationError(
162
- f"Please check your credentials for {self.provider}.",
163
- f"HTTP Error {e.response.status_code} returned.",
164
- response_text,
165
- ) from e
166
- # other error
167
- else:
168
- raise AuthenticationError(
169
- "Could no get authentication token", str(e), response_text
170
- ) from e
171
- else:
172
- if getattr(self.config, "token_type", "text") == "json":
173
- token = response.json()[self.config.token_key]
152
+
153
+ # Use a thread lock to avoid several threads requesting the token at the same time
154
+ with self.auth_lock:
155
+
156
+ self.validate_config_credentials()
157
+ if self.token and self.token_expiration > datetime.now():
158
+ logger.debug("using existing access token")
159
+ return RequestsTokenAuth(
160
+ self.token, "header", headers=getattr(self.config, "headers", {})
161
+ )
162
+ s = requests.Session()
163
+ try:
164
+ # First get the token
165
+ response = self._token_request(session=s)
166
+ response.raise_for_status()
167
+ except requests.exceptions.Timeout as exc:
168
+ raise TimeOutError(exc, timeout=HTTP_REQ_TIMEOUT) from exc
169
+ except RequestException as e:
170
+ response_text = getattr(e.response, "text", "").strip()
171
+ # check if error is identified as auth_error in provider conf
172
+ auth_errors = getattr(self.config, "auth_error_code", [None])
173
+ if not isinstance(auth_errors, list):
174
+ auth_errors = [auth_errors]
175
+ if (
176
+ e.response is not None
177
+ and getattr(e.response, "status_code", None)
178
+ and e.response.status_code in auth_errors
179
+ ):
180
+ raise AuthenticationError(
181
+ f"Please check your credentials for {self.provider}.",
182
+ f"HTTP Error {e.response.status_code} returned.",
183
+ response_text,
184
+ ) from e
185
+ # other error
186
+ else:
187
+ raise AuthenticationError(
188
+ "Could no get authentication token", str(e), response_text
189
+ ) from e
174
190
  else:
175
- token = response.text
176
- self.token = token
177
- if getattr(self.config, "refresh_token_key", None):
178
- self.refresh_token = response.json()[self.config.refresh_token_key]
179
- if getattr(self.config, "token_expiration_key", None):
180
- expiration_time = response.json()[self.config.token_expiration_key]
181
- self.token_expiration = datetime.now() + timedelta(
182
- seconds=expiration_time
191
+ if getattr(self.config, "token_type", "text") == "json":
192
+ token = response.json()[self.config.token_key]
193
+ else:
194
+ token = response.text
195
+ self.token = token
196
+ if getattr(self.config, "refresh_token_key", None):
197
+ self.refresh_token = response.json()[self.config.refresh_token_key]
198
+ if getattr(self.config, "token_expiration_key", None):
199
+ expiration_time = response.json()[self.config.token_expiration_key]
200
+ self.token_expiration = datetime.now() + timedelta(
201
+ seconds=expiration_time
202
+ )
203
+
204
+ if not hasattr(self.config, "headers"):
205
+ raise MisconfiguredError(
206
+ f"Missing headers configuration for {self}"
207
+ )
208
+ # Return auth class set with obtained token
209
+ return RequestsTokenAuth(
210
+ token, "header", headers=getattr(self.config, "headers", {})
183
211
  )
184
212
 
185
- if not hasattr(self.config, "headers"):
186
- raise MisconfiguredError(f"Missing headers configuration for {self}")
187
- # Return auth class set with obtained token
188
- return RequestsTokenAuth(
189
- token, "header", headers=getattr(self.config, "headers", {})
190
- )
191
-
192
213
  def _token_request(
193
214
  self,
194
215
  session: requests.Session,
@@ -217,14 +238,36 @@ class TokenAuth(Authentication):
217
238
  # append headers to req if some are specified in config
218
239
  req_kwargs: dict[str, Any] = {"headers": dict(headers, **USER_AGENT)}
219
240
  ssl_verify = getattr(self.config, "ssl_verify", True)
241
+ method = getattr(self.config, "request_method", "POST")
242
+
243
+ def set_request_data(call_refresh: bool) -> None:
244
+ """Set the request data contents for POST requests"""
245
+ if method != "POST":
246
+ return
247
+
248
+ # append req_data to credentials if specified in config
249
+ data = dict(getattr(self.config, "req_data", {}), **self.config.credentials)
250
+
251
+ # when refreshing the token, we pass only the client_id/secret if present,
252
+ # not other parameters (username/password, scope, ...)
253
+ if call_refresh:
254
+ data = {
255
+ k: v for k, v in data.items() if k in ["client_id", "client_secret"]
256
+ }
257
+ # the grant type is always refresh_token
258
+ data["grant_type"] = "refresh_token"
259
+ # and we add the old refresh token value to the request
260
+ data["refresh_token"] = self.refresh_token
261
+
262
+ req_kwargs["data"] = data
220
263
 
221
264
  if self.refresh_token:
222
265
  logger.debug("fetching access token with refresh token")
223
266
  session.mount(self.config.refresh_uri, HTTPAdapter(max_retries=retries))
267
+ set_request_data(call_refresh=True)
224
268
  try:
225
269
  response = session.post(
226
270
  self.config.refresh_uri,
227
- data={"refresh_token": self.refresh_token},
228
271
  timeout=HTTP_REQ_TIMEOUT,
229
272
  verify=ssl_verify,
230
273
  **req_kwargs,
@@ -237,14 +280,8 @@ class TokenAuth(Authentication):
237
280
  logger.debug("fetching access token from %s", self.config.auth_uri)
238
281
  # append headers to req if some are specified in config
239
282
  session.mount(self.config.auth_uri, HTTPAdapter(max_retries=retries))
240
- method = getattr(self.config, "request_method", "POST")
241
283
 
242
- # send credentials also as data in POST requests
243
- if method == "POST":
244
- # append req_data to credentials if specified in config
245
- req_kwargs["data"] = dict(
246
- getattr(self.config, "req_data", {}), **self.config.credentials
247
- )
284
+ set_request_data(call_refresh=False)
248
285
 
249
286
  # credentials as auth tuple if possible
250
287
  req_kwargs["auth"] = (
@@ -337,7 +337,9 @@ class Search(PluginTopic):
337
337
  try:
338
338
  filters["productType"] = product_type
339
339
  queryables = self.discover_queryables(**{**default_values, **filters}) or {}
340
- except NotImplementedError:
340
+ except NotImplementedError as e:
341
+ if str(e):
342
+ logger.debug(str(e))
341
343
  queryables = self.queryables_from_metadata_mapping(product_type, alias)
342
344
 
343
345
  return QueryablesDict(**queryables)
@@ -381,12 +383,12 @@ class Search(PluginTopic):
381
383
  for pt in available_product_types:
382
384
  self.config.product_type_config = product_type_configs[pt]
383
385
  pt_queryables = self._get_product_type_queryables(pt, None, filters)
384
- # only use key and type because values and defaults will vary between product types
385
- pt_queryables_neutral = {
386
- k: Annotated[v.__args__[0], Field(default=None)]
387
- for k, v in pt_queryables.items()
388
- }
389
- all_queryables.update(pt_queryables_neutral)
386
+ all_queryables.update(pt_queryables)
387
+ # reset defaults because they may vary between product types
388
+ for k, v in all_queryables.items():
389
+ v.__metadata__[0].default = getattr(
390
+ Queryables.model_fields.get(k, Field(None)), "default", None
391
+ )
390
392
  return QueryablesDict(
391
393
  additional_properties=True,
392
394
  additional_information=additional_info,
@@ -1810,8 +1810,7 @@ class StacSearch(PostJsonSearch):
1810
1810
  not self.config.discover_queryables["fetch_url"]
1811
1811
  and not self.config.discover_queryables["product_type_fetch_url"]
1812
1812
  ):
1813
- logger.info(f"Cannot fetch queryables with {self.provider}")
1814
- return None
1813
+ raise NotImplementedError()
1815
1814
 
1816
1815
  product_type = kwargs.get("productType", None)
1817
1816
  provider_product_type = (
@@ -1823,18 +1822,16 @@ class StacSearch(PostJsonSearch):
1823
1822
  provider_product_type
1824
1823
  and not self.config.discover_queryables["product_type_fetch_url"]
1825
1824
  ):
1826
- logger.info(
1825
+ raise NotImplementedError(
1827
1826
  f"Cannot fetch queryables for a specific product type with {self.provider}"
1828
1827
  )
1829
- return None
1830
1828
  if (
1831
1829
  not provider_product_type
1832
1830
  and not self.config.discover_queryables["fetch_url"]
1833
1831
  ):
1834
- logger.info(
1835
- f"Cannot fetch global queryables with {self.provider}. A product type must be specified"
1832
+ raise ValidationError(
1833
+ f"Cannot fetch global queryables for {self.provider}. A product type must be specified"
1836
1834
  )
1837
- return None
1838
1835
 
1839
1836
  try:
1840
1837
  unparsed_fetch_url = (
@@ -1843,7 +1840,9 @@ class StacSearch(PostJsonSearch):
1843
1840
  else self.config.discover_queryables["fetch_url"]
1844
1841
  )
1845
1842
  if unparsed_fetch_url is None:
1846
- return None
1843
+ raise PluginImplementationError(
1844
+ f"Cannot fetch queryables for {self.provider}: missing url"
1845
+ )
1847
1846
 
1848
1847
  fetch_url = unparsed_fetch_url.format(
1849
1848
  provider_product_type=provider_product_type,
@@ -1864,9 +1863,12 @@ class StacSearch(PostJsonSearch):
1864
1863
  "{} {} instance:".format(self.provider, self.__class__.__name__),
1865
1864
  ),
1866
1865
  )
1867
- except (RequestError, KeyError, AttributeError) as e:
1868
- logger.warning("failure in queryables discovery: %s", e)
1869
- return None
1866
+ except (KeyError, AttributeError) as e:
1867
+ raise PluginImplementationError(
1868
+ "failure in queryables discovery: %s", e
1869
+ ) from e
1870
+ except RequestError as e:
1871
+ raise RequestError("failure in queryables discovery: %s", e) from e
1870
1872
  else:
1871
1873
  json_queryables = dict()
1872
1874
  try:
@@ -1875,17 +1877,16 @@ class StacSearch(PostJsonSearch):
1875
1877
  # extract results from response json
1876
1878
  results_entry = self.config.discover_queryables["results_entry"]
1877
1879
  if not isinstance(results_entry, JSONPath):
1878
- logger.warning(
1880
+ raise MisconfiguredError(
1879
1881
  f"Could not parse {self.provider} discover_queryables.results_entry"
1880
1882
  f" as JSONPath: {results_entry}"
1881
1883
  )
1882
- return None
1883
1884
  json_queryables = [
1884
1885
  match.value for match in results_entry.find(resp_as_json)
1885
1886
  ][0]
1886
1887
 
1887
1888
  except KeyError as e:
1888
- logger.warning(
1889
+ raise MisconfiguredError(
1889
1890
  "Incomplete %s discover_queryables configuration: %s",
1890
1891
  self.provider,
1891
1892
  e,