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.
- {eodag-3.3.0 → eodag-3.3.1}/CHANGES.rst +25 -1
- {eodag-3.3.0/eodag.egg-info → eodag-3.3.1}/PKG-INFO +2 -2
- {eodag-3.3.0 → eodag-3.3.1}/README.rst +1 -1
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/Chart.yaml +2 -2
- {eodag-3.3.0 → eodag-3.3.1}/docs/stac_rest.rst +1 -1
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/search_result.py +5 -7
- {eodag-3.3.0 → eodag-3.3.1}/eodag/config.py +3 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/token.py +97 -60
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/base.py +9 -7
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/qssearch.py +15 -14
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/ext_product_types.json +1 -1
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/errors.py +18 -3
- {eodag-3.3.0 → eodag-3.3.1}/eodag/types/queryables.py +3 -0
- {eodag-3.3.0 → eodag-3.3.1/eodag.egg-info}/PKG-INFO +2 -2
- {eodag-3.3.0 → eodag-3.3.1}/pyproject.toml +1 -1
- {eodag-3.3.0 → eodag-3.3.1}/.dockerignore +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.editorconfig +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.gitattributes +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/pull_request_template.md +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/changelog.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/deploy.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/fetch.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/github-pages.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/lint-pr-title.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.github/workflows/test.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.gitignore +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/.pre-commit-config.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/BREAKING_CHANGES.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/CODE_OF_CONDUCT.md +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/CONTRIBUTING.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/LICENSE +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/MANIFEST.in +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/NOTICE +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/Chart.lock +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/README.md +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/NOTES.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/_helpers.tpl +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/configmap.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/deployment.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/extra-list.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/hpa.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/ingress.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/pv.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/pvc.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/secret.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/service.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/templates/serviceaccount.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/charts/eodag-server/values.yaml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docker/run-stac-server.sh +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docker/stac-browser.dockerfile +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docker/stac-server.dockerfile +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docker-compose.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/Makefile +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/custom.css +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/download_methods.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_advanced_calls_graph.svg +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_bycs.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_fetch_product_types.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_logo_160.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_logo_160r.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_main_calls_graph.svg +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_overview.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_stac_client.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/eodag_stac_server.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/favicon-32x32.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/params_mapping_extra.csv +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/params_mapping_offline_infos.json +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/params_mapping_opensearch.csv +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/product_types_information.csv +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_1.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_1_none.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_2.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/progress_2_none.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/stac_browser_example.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/_static/stac_browser_example_600.png +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/add_product_type.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/add_provider.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/assets.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/call_graphs.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/core.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/eoproduct.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/exceptions.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/index.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/searchresult.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/types.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_reference/utils.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/api_user_guide.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/breaking_changes.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/changelog.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/cli_user_guide.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/conf.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/contribute.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/drivers.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/configure.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/index.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/install.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/overview.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/product_storage_status.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/product_types.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/providers.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/register.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/getting_started_guide/side_projects.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/index.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/make.bat +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/1_overview.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/2_providers_products_available.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/3_configuration.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/4_search.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/5_queryables.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/6_serialize_deserialize.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/7_crunch.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/8_download.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/9_post_process.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/data/crunch_search_results.geojson +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/api_user_guide/data/download_search_results.geojson +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/intro_notebooks.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.cpg +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.dbf +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.prj +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qix +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qpj +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shp +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shx +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/auxdata/sentinel2_tiling_grid_centroids.zip +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_burnt_areas_snappy.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_cds.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_cop_dem.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_ecmwf.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_meteoblue.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_search_location_tile.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_ship_detection.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_stac_client.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/notebooks/tutos/tuto_wekeo.ipynb +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/params_mapping.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/plugins.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/api.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/auth.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/crunch.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/download.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/plugins_reference/search.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/stac.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/docs/tutos.rst +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/core.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/_assets.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/_product.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/base.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/generic.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/sentinel1.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/drivers/sentinel2.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/api/product/metadata_mapping.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/cli.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/crunch.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/base.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/ecmwf.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/apis/usgs.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/aws_auth.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/base.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/generic.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/header.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/keycloak.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/oauth.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/openid_connect.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/qsauth.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/sas_auth.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/authentication/token_exchange.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/base.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/base.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_date.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_latest_intersect.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_latest_tpl_name.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_overlap.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/crunch/filter_property.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/aws.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/base.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/creodias_s3.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/http.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/download/s3rest.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/manager.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/build_search_result.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/cop_marine.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/creodias_s3.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/csw.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/data_request_search.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/stac_list_assets.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/plugins/search/static_stac_search.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/py.typed +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/locations_conf_template.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/product_types.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/providers.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.VERSION.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.cpg +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.dbf +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.prj +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.shp +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/shp/ne_110m_admin_0_map_units.shx +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/stac.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/stac_api.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/stac_provider.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/resources/user_conf_template.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/cache.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/config.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/constants.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/core.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/server.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/server.wsgi +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/stac.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/templates/README +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/collections_search.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/eodag_search.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/queryables.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/types/stac_search.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/utils/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/utils/cql_evaluate.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/rest/utils/rfc3339.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/types/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/types/bbox.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/types/download_args.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/types/search_args.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/types/whoosh.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/__init__.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/exceptions.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/import_system.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/logging.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/notebook.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/repr.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/requests.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/rest.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/s3.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag/utils/stac_reader.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/SOURCES.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/dependency_links.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/entry_points.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/requires.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/eodag.egg-info/top_level.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/get_pypi_latest_version.sh +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/pytest.ini +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/readthedocs.yml +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/requirements-dev.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/requirements-docs.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/requirements-tutorials.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/requirements.txt +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/setup.cfg +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/setup.py +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/tox.ini +0 -0
- {eodag-3.3.0 → eodag-3.3.1}/utils/params_mapping_to_csv.py +0 -0
- {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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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} 
|
|
195
193
|
{type(p).__name__}(id=<span style='color: black;'>{
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
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
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1835
|
-
f"Cannot fetch global queryables
|
|
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
|
-
|
|
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 (
|
|
1868
|
-
|
|
1869
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1889
|
+
raise MisconfiguredError(
|
|
1889
1890
|
"Incomplete %s discover_queryables configuration: %s",
|
|
1890
1891
|
self.provider,
|
|
1891
1892
|
e,
|