eodag 3.4.2__tar.gz → 3.4.3__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.4.2 → eodag-3.4.3}/.github/pull_request_template.md +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/CHANGES.rst +57 -0
- {eodag-3.4.2/eodag.egg-info → eodag-3.4.3}/PKG-INFO +2 -2
- {eodag-3.4.2 → eodag-3.4.3}/README.rst +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/Chart.yaml +2 -2
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/ingress.yaml +1 -5
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/configure.rst +9 -4
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/2_providers_products_available.ipynb +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/docs/stac_rest.rst +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/core.py +12 -11
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/_product.py +6 -6
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/metadata_mapping.py +6 -6
- {eodag-3.4.2 → eodag-3.4.3}/eodag/config.py +2 -2
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/apis/ecmwf.py +5 -7
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/apis/usgs.py +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/generic.py +5 -1
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/openid_connect.py +68 -30
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/sas_auth.py +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/crunch/filter_date.py +4 -8
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/crunch/filter_property.py +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/download/aws.py +3 -3
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/download/base.py +14 -7
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/download/http.py +18 -12
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/download/s3rest.py +9 -5
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/base.py +3 -3
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/build_search_result.py +4 -5
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/data_request_search.py +4 -4
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/qssearch.py +22 -29
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/ext_product_types.json +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/providers.yml +2 -1
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/server.py +3 -3
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/stac.py +2 -2
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/types/queryables.py +2 -2
- {eodag-3.4.2 → eodag-3.4.3}/eodag/types/__init__.py +27 -14
- {eodag-3.4.2 → eodag-3.4.3}/eodag/types/queryables.py +23 -5
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/__init__.py +1 -1
- {eodag-3.4.2 → eodag-3.4.3/eodag.egg-info}/PKG-INFO +2 -2
- {eodag-3.4.2 → eodag-3.4.3}/pyproject.toml +1 -1
- {eodag-3.4.2 → eodag-3.4.3}/.dockerignore +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.editorconfig +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.gitattributes +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/workflows/changelog.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/workflows/deploy.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/workflows/fetch.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/workflows/github-pages.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/workflows/lint-pr-title.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/workflows/publish.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.github/workflows/test.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.gitignore +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/.pre-commit-config.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/BREAKING_CHANGES.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/CODE_OF_CONDUCT.md +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/CONTRIBUTING.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/LICENSE +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/MANIFEST.in +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/NOTICE +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/Chart.lock +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/README.md +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/NOTES.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/_helpers.tpl +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/configmap.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/deployment.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/extra-list.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/hpa.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/pv.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/pvc.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/secret.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/service.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/templates/serviceaccount.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/charts/eodag-server/values.yaml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docker/run-stac-server.sh +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docker/stac-browser.dockerfile +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docker/stac-server.dockerfile +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docker-compose.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/Makefile +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/custom.css +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/download_methods.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_advanced_calls_graph.svg +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_bycs.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_fetch_product_types.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_logo_160.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_logo_160r.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_main_calls_graph.svg +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_overview.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_stac_client.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/eodag_stac_server.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/favicon-32x32.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/params_mapping_extra.csv +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/params_mapping_offline_infos.json +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/params_mapping_opensearch.csv +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/product_types_information.csv +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/progress_1.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/progress_1_none.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/progress_2.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/progress_2_none.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/stac_browser_example.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/_static/stac_browser_example_600.png +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/add_product_type.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/add_provider.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/assets.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/call_graphs.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/core.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/eoproduct.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/exceptions.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/index.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/searchresult.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/types.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_reference/utils.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/api_user_guide.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/breaking_changes.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/changelog.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/cli_user_guide.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/conf.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/contribute.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/drivers.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/index.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/install.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/overview.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/product_storage_status.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/product_types.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/providers.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/register.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/getting_started_guide/side_projects.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/index.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/make.bat +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/1_overview.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/3_configuration.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/4_search.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/5_queryables.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/6_serialize_deserialize.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/7_crunch.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/8_download.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/9_post_process.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/data/crunch_search_results.geojson +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/data/download_search_results.geojson +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/intro_notebooks.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.cpg +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.dbf +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.prj +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qix +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qpj +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shp +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shx +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/auxdata/sentinel2_tiling_grid_centroids.zip +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_burnt_areas_snappy.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_cds.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_cop_dem.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_ecmwf.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_meteoblue.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_search_location_tile.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_ship_detection.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_stac_client.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/tutos/tuto_wekeo.ipynb +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/params_mapping.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/plugins.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/plugins_reference/api.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/plugins_reference/auth.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/plugins_reference/crunch.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/plugins_reference/download.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/plugins_reference/search.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/stac.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/docs/tutos.rst +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/_assets.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/drivers/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/drivers/base.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/drivers/generic.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/drivers/sentinel1.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/product/drivers/sentinel2.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/api/search_result.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/cli.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/crunch.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/apis/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/apis/base.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/aws_auth.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/base.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/header.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/keycloak.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/oauth.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/qsauth.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/token.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/authentication/token_exchange.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/base.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/crunch/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/crunch/base.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/crunch/filter_latest_intersect.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/crunch/filter_latest_tpl_name.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/crunch/filter_overlap.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/download/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/download/creodias_s3.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/manager.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/cop_marine.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/creodias_s3.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/csw.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/stac_list_assets.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/plugins/search/static_stac_search.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/py.typed +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/locations_conf_template.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/product_types.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/shp/ne_110m_admin_0_map_units.VERSION.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/shp/ne_110m_admin_0_map_units.cpg +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/shp/ne_110m_admin_0_map_units.dbf +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/shp/ne_110m_admin_0_map_units.prj +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/shp/ne_110m_admin_0_map_units.shp +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/shp/ne_110m_admin_0_map_units.shx +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/stac.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/stac_api.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/stac_provider.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/resources/user_conf_template.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/cache.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/config.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/constants.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/core.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/errors.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/server.wsgi +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/templates/README +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/types/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/types/collections_search.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/types/eodag_search.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/types/stac_search.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/utils/__init__.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/utils/cql_evaluate.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/rest/utils/rfc3339.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/types/bbox.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/types/download_args.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/types/search_args.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/types/whoosh.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/exceptions.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/import_system.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/logging.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/notebook.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/repr.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/requests.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/rest.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/s3.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag/utils/stac_reader.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag.egg-info/SOURCES.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag.egg-info/dependency_links.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag.egg-info/entry_points.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag.egg-info/requires.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/eodag.egg-info/top_level.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/get_pypi_latest_version.sh +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/pytest.ini +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/readthedocs.yml +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/requirements-dev.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/requirements-docs.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/requirements-tutorials.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/requirements.txt +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/setup.cfg +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/setup.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/tox.ini +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/utils/params_mapping_to_csv.py +0 -0
- {eodag-3.4.2 → eodag-3.4.3}/utils/product_types_information_to_csv.py +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
### Your checklist for this pull request
|
|
2
|
-
Please review the [guidelines for contributing](
|
|
2
|
+
Please review the [guidelines for contributing](https://eodag.readthedocs.io/en/latest/contribute.html) to this repository.
|
|
3
3
|
|
|
4
4
|
- [ ] Make sure you are making a pull request against the **develop branch** (left side). Also you should start *your branch* off *our develop*.
|
|
5
5
|
- [ ] Check the commit's or even all commits' message styles matches our requested structure.
|
|
@@ -3,6 +3,63 @@ Release history
|
|
|
3
3
|
===============
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
v3.4.3 (2025-06-12)
|
|
7
|
+
===================
|
|
8
|
+
|
|
9
|
+
Bug Fixes
|
|
10
|
+
---------
|
|
11
|
+
|
|
12
|
+
* **core**: Queryables mismatch when list of possible values contains a single value (`#1666`_,
|
|
13
|
+
`538331d`_)
|
|
14
|
+
|
|
15
|
+
* **plugins**: GenericAuth missing credentials handle (`#1678`_, `576a2ac`_)
|
|
16
|
+
|
|
17
|
+
* **plugins**: Openid_connect requests error handling (#1320) (`#1663`_, `9926083`_)
|
|
18
|
+
|
|
19
|
+
* **plugins**: Order retry (`#1676`_, `3602426`_)
|
|
20
|
+
|
|
21
|
+
* **providers**: Dedl mapping for CORINE collection (`#1661`_, `4c61b54`_)
|
|
22
|
+
|
|
23
|
+
* **providers**: Wekeo_main orderable products download (`#1670`_, `d573846`_)
|
|
24
|
+
|
|
25
|
+
Chores
|
|
26
|
+
------
|
|
27
|
+
|
|
28
|
+
* **deploy**: Remove deprecated common values (`154ea6d`_)
|
|
29
|
+
|
|
30
|
+
Documentation
|
|
31
|
+
-------------
|
|
32
|
+
|
|
33
|
+
* Configuration environment variables defaults (`#1681`_, `6e8eb6b`_)
|
|
34
|
+
|
|
35
|
+
* Updated contribution guidelines link in PR template (`#1667`_, `e5cd082`_)
|
|
36
|
+
|
|
37
|
+
Refactoring
|
|
38
|
+
-----------
|
|
39
|
+
|
|
40
|
+
* Typing fixes following mypy 1.16.0 (`#1673`_, `ece52c0`_)
|
|
41
|
+
|
|
42
|
+
.. _#1661: https://github.com/CS-SI/eodag/pull/1661
|
|
43
|
+
.. _#1663: https://github.com/CS-SI/eodag/pull/1663
|
|
44
|
+
.. _#1666: https://github.com/CS-SI/eodag/pull/1666
|
|
45
|
+
.. _#1667: https://github.com/CS-SI/eodag/pull/1667
|
|
46
|
+
.. _#1670: https://github.com/CS-SI/eodag/pull/1670
|
|
47
|
+
.. _#1673: https://github.com/CS-SI/eodag/pull/1673
|
|
48
|
+
.. _#1676: https://github.com/CS-SI/eodag/pull/1676
|
|
49
|
+
.. _#1678: https://github.com/CS-SI/eodag/pull/1678
|
|
50
|
+
.. _#1681: https://github.com/CS-SI/eodag/pull/1681
|
|
51
|
+
.. _154ea6d: https://github.com/CS-SI/eodag/commit/154ea6d035572e64c3a434bb41c095c9b4cc76b2
|
|
52
|
+
.. _3602426: https://github.com/CS-SI/eodag/commit/360242653ddc2a5c8587b37b3d91800459f4c243
|
|
53
|
+
.. _4c61b54: https://github.com/CS-SI/eodag/commit/4c61b540ee46a8ae70932d64e9d373653763eb16
|
|
54
|
+
.. _538331d: https://github.com/CS-SI/eodag/commit/538331d30085a814307173913ff831ca5a3397af
|
|
55
|
+
.. _576a2ac: https://github.com/CS-SI/eodag/commit/576a2ac95044d10367e91e5ef843fb33a921f5f5
|
|
56
|
+
.. _6e8eb6b: https://github.com/CS-SI/eodag/commit/6e8eb6b94eaad6294fea45d764a0e7c18a4e6823
|
|
57
|
+
.. _9926083: https://github.com/CS-SI/eodag/commit/99260837837c3b5f2eeac8b95dc2b2feae7a0390
|
|
58
|
+
.. _d573846: https://github.com/CS-SI/eodag/commit/d5738465930e08b24d562af3b7bc040464ff970a
|
|
59
|
+
.. _e5cd082: https://github.com/CS-SI/eodag/commit/e5cd082aa81eedb62cd48b7974362c99a6899d9c
|
|
60
|
+
.. _ece52c0: https://github.com/CS-SI/eodag/commit/ece52c07685e5df21cfda0b6ddc6a7416194406c
|
|
61
|
+
|
|
62
|
+
|
|
6
63
|
v3.4.2 (2025-05-15)
|
|
7
64
|
===================
|
|
8
65
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eodag
|
|
3
|
-
Version: 3.4.
|
|
3
|
+
Version: 3.4.3
|
|
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.4.
|
|
320
|
+
docker run -p 5000:5000 --rm csspace/eodag-server:3.4.3
|
|
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.
|
|
190
|
+
docker run -p 5000:5000 --rm csspace/eodag-server:3.4.3
|
|
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.
|
|
2
|
+
appVersion: 3.4.3
|
|
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.
|
|
18
|
+
version: 3.4.3
|
|
@@ -18,7 +18,7 @@ metadata:
|
|
|
18
18
|
{{- end }}
|
|
19
19
|
{{- end }}
|
|
20
20
|
spec:
|
|
21
|
-
{{- if
|
|
21
|
+
{{- if .Values.ingress.ingressClassName }}
|
|
22
22
|
ingressClassName: {{ .Values.ingress.ingressClassName | quote }}
|
|
23
23
|
{{- end }}
|
|
24
24
|
rules:
|
|
@@ -30,9 +30,7 @@ spec:
|
|
|
30
30
|
{{- toYaml .Values.ingress.extraPaths | nindent 10 }}
|
|
31
31
|
{{- end }}
|
|
32
32
|
- path: {{ .Values.ingress.path }}
|
|
33
|
-
{{- if eq "true" (include "common.ingress.supportsPathType" .) }}
|
|
34
33
|
pathType: {{ .Values.ingress.pathType }}
|
|
35
|
-
{{- end }}
|
|
36
34
|
backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" .) "servicePort" .Values.ingress.servicePort "context" $) | nindent 14 }}
|
|
37
35
|
{{- end }}
|
|
38
36
|
{{- range .Values.ingress.extraHosts }}
|
|
@@ -40,9 +38,7 @@ spec:
|
|
|
40
38
|
http:
|
|
41
39
|
paths:
|
|
42
40
|
- path: {{ default "/" .path }}
|
|
43
|
-
{{- if eq "true" (include "common.ingress.supportsPathType" $) }}
|
|
44
41
|
pathType: {{ default "ImplementationSpecific" .pathType }}
|
|
45
|
-
{{- end }}
|
|
46
42
|
backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" $) "servicePort" .Values.ingress.servicePort "context" $) | nindent 14 }}
|
|
47
43
|
{{- end }}
|
|
48
44
|
{{- if .Values.ingress.extraRules }}
|
|
@@ -142,16 +142,21 @@ Core configuration using environment variables
|
|
|
142
142
|
|
|
143
143
|
Some EODAG core settings can be overriden using environment variables:
|
|
144
144
|
|
|
145
|
-
* ``EODAG_CFG_DIR`` customized configuration directory in place of
|
|
145
|
+
* ``EODAG_CFG_DIR`` customized configuration directory in place of `~/.config/eodag`.
|
|
146
146
|
* ``EODAG_CFG_FILE`` for defining the desired path to the `user configuration file\
|
|
147
147
|
<https://eodag.readthedocs.io/en/stable/getting_started_guide/configure.html#yaml-user-configuration-file>`_
|
|
148
|
+
in place of `~/.config/eodag/eodag.yml`.
|
|
148
149
|
* ``EODAG_LOCS_CFG_FILE`` for defining the desired path to the
|
|
149
150
|
`locations <https://eodag.readthedocs.io/en/stable/notebooks/api_user_guide/4_search.html#Locations-search>`_
|
|
150
|
-
configuration file
|
|
151
|
-
* ``EODAG_PROVIDERS_CFG_FILE`` for defining the desired path to the providers configuration file
|
|
152
|
-
|
|
151
|
+
configuration file in place of `~/.config/eodag/locations.yml`.
|
|
152
|
+
* ``EODAG_PROVIDERS_CFG_FILE`` for defining the desired path to the providers configuration file in place of
|
|
153
|
+
`<python-site-packages>/eodag/resources/providers.yml`.
|
|
154
|
+
* ``EODAG_PRODUCT_TYPES_CFG_FILE`` for defining the desired path to the product types configuration file in place of
|
|
155
|
+
`<python-site-packages>/eodag/resources/product_types.yml`.
|
|
153
156
|
* ``EODAG_EXT_PRODUCT_TYPES_CFG_FILE`` for defining the desired path to the `external product types configuration file\
|
|
154
157
|
<https://eodag.readthedocs.io/en/stable/notebooks/api_user_guide/2_providers_products_available.html#Product-types-discovery>`_
|
|
158
|
+
in place of https://cs-si.github.io/eodag/eodag/resources/ext_product_types.json.
|
|
159
|
+
If the file is not readable, only user-modified providers will be fetched.
|
|
155
160
|
|
|
156
161
|
CLI configuration
|
|
157
162
|
^^^^^^^^^^^^^^^^^
|
{eodag-3.4.2 → eodag-3.4.3}/docs/notebooks/api_user_guide/2_providers_products_available.ipynb
RENAMED
|
@@ -702,7 +702,7 @@
|
|
|
702
702
|
"\n",
|
|
703
703
|
"In EODAG, the discovered *EODAG external product types configuration file* can be set to:\n",
|
|
704
704
|
"\n",
|
|
705
|
-
"* a file automatically built from github actions and stored in [eodag/resources/ext_product_types.json](https://
|
|
705
|
+
"* a file automatically built from github actions and stored in [eodag/resources/ext_product_types.json](https://cs-si.github.io/eodag/eodag/resources/ext_product_types.json) (default settings)\n",
|
|
706
706
|
"* a custom remote or local file by setting its path in `EODAG_EXT_PRODUCT_TYPES_CFG_FILE` environment variable (if the file is not readable, only user-modified providers will be fetched).\n",
|
|
707
707
|
"\n",
|
|
708
708
|
"Then, when listing product types using [list_product_types(fetch_providers=True)](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway.list_product_types), EODAG will first read the content of the *EODAG external product types configuration file* using [fetch_product_types_list()](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway.fetch_product_types_list) \n",
|
|
@@ -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.
|
|
118
|
+
$ docker run -p 5000:5000 --rm csspace/eodag-server:3.4.3
|
|
119
119
|
|
|
120
120
|
Example
|
|
121
121
|
-------
|
|
@@ -658,7 +658,7 @@ class EODataAccessGateway:
|
|
|
658
658
|
discovery_conf = getattr(
|
|
659
659
|
provider_search_config, "discover_product_types", {}
|
|
660
660
|
)
|
|
661
|
-
if discovery_conf.get("fetch_url"
|
|
661
|
+
if discovery_conf.get("fetch_url"):
|
|
662
662
|
providers_discovery_configs_fetchable[
|
|
663
663
|
provider_to_fetch
|
|
664
664
|
] = discovery_conf
|
|
@@ -744,7 +744,7 @@ class EODataAccessGateway:
|
|
|
744
744
|
user_discovery_conf == default_discovery_conf
|
|
745
745
|
or user_discovery_conf == default_discovery_conf_parsed
|
|
746
746
|
) and (
|
|
747
|
-
not default_discovery_conf.get("fetch_url"
|
|
747
|
+
not default_discovery_conf.get("fetch_url")
|
|
748
748
|
or "ext_product_types_conf" not in locals()
|
|
749
749
|
or "ext_product_types_conf" in locals()
|
|
750
750
|
and (
|
|
@@ -856,7 +856,7 @@ class EODataAccessGateway:
|
|
|
856
856
|
continue
|
|
857
857
|
if not getattr(
|
|
858
858
|
search_plugin_config, "discover_product_types", {}
|
|
859
|
-
).get("fetch_url"
|
|
859
|
+
).get("fetch_url"):
|
|
860
860
|
# conf has been updated and provider product types are no more discoverable
|
|
861
861
|
continue
|
|
862
862
|
provider_products_config = (
|
|
@@ -980,7 +980,7 @@ class EODataAccessGateway:
|
|
|
980
980
|
product_types = [
|
|
981
981
|
k
|
|
982
982
|
for k, v in self.product_types_config.items()
|
|
983
|
-
if v.get("alias"
|
|
983
|
+
if v.get("alias") == alias_or_id
|
|
984
984
|
]
|
|
985
985
|
|
|
986
986
|
if len(product_types) > 1:
|
|
@@ -1310,8 +1310,8 @@ class EODataAccessGateway:
|
|
|
1310
1310
|
# since it might be modified if the next_page_url mechanism is used by the
|
|
1311
1311
|
# plugin. (same thing for next_page_query_obj, next_page_query_obj with POST reqs)
|
|
1312
1312
|
pagination_config = getattr(search_plugin.config, "pagination", {})
|
|
1313
|
-
prev_next_page_url_tpl = pagination_config.get("next_page_url_tpl"
|
|
1314
|
-
prev_next_page_query_obj = pagination_config.get("next_page_query_obj"
|
|
1313
|
+
prev_next_page_url_tpl = pagination_config.get("next_page_url_tpl")
|
|
1314
|
+
prev_next_page_query_obj = pagination_config.get("next_page_query_obj")
|
|
1315
1315
|
# Page has to be set to a value even if use_next is True, this is required
|
|
1316
1316
|
# internally by the search plugin (see collect_search_urls)
|
|
1317
1317
|
kwargs.update(
|
|
@@ -1549,7 +1549,7 @@ class EODataAccessGateway:
|
|
|
1549
1549
|
:param kwargs: Search criteria to help finding the right product
|
|
1550
1550
|
:returns: A search result with one EO product or None at all
|
|
1551
1551
|
"""
|
|
1552
|
-
product_type = kwargs.get("productType"
|
|
1552
|
+
product_type = kwargs.get("productType")
|
|
1553
1553
|
if product_type is not None:
|
|
1554
1554
|
try:
|
|
1555
1555
|
product_type = self.get_product_type_from_alias(product_type)
|
|
@@ -1686,7 +1686,7 @@ class EODataAccessGateway:
|
|
|
1686
1686
|
* other criteria compatible with the provider
|
|
1687
1687
|
:returns: Search plugins list and the prepared kwargs to make a query.
|
|
1688
1688
|
"""
|
|
1689
|
-
product_type = kwargs.get("productType"
|
|
1689
|
+
product_type: Optional[str] = kwargs.get("productType")
|
|
1690
1690
|
if product_type is None:
|
|
1691
1691
|
try:
|
|
1692
1692
|
guesses = self.guess_product_type(**kwargs)
|
|
@@ -1706,7 +1706,7 @@ class EODataAccessGateway:
|
|
|
1706
1706
|
# By now, only use the best bet
|
|
1707
1707
|
product_type = guesses[0]
|
|
1708
1708
|
except NoMatchingProductType:
|
|
1709
|
-
queried_id = kwargs.get("id"
|
|
1709
|
+
queried_id = kwargs.get("id")
|
|
1710
1710
|
if queried_id is None:
|
|
1711
1711
|
logger.info(
|
|
1712
1712
|
"No product type could be guessed with provided arguments"
|
|
@@ -1750,7 +1750,7 @@ class EODataAccessGateway:
|
|
|
1750
1750
|
product_type
|
|
1751
1751
|
not in self._plugins_manager.product_type_to_provider_config_map.keys()
|
|
1752
1752
|
):
|
|
1753
|
-
if provider:
|
|
1753
|
+
if provider and product_type:
|
|
1754
1754
|
# Try to get specific product type from external provider
|
|
1755
1755
|
logger.debug(f"Fetching {provider} to find {product_type} product type")
|
|
1756
1756
|
self._fetch_external_product_type(provider, product_type)
|
|
@@ -1795,7 +1795,8 @@ class EODataAccessGateway:
|
|
|
1795
1795
|
# Add product_types_config to plugin config. This dict contains product
|
|
1796
1796
|
# type metadata that will also be stored in each product's properties.
|
|
1797
1797
|
for search_plugin in search_plugins:
|
|
1798
|
-
|
|
1798
|
+
if product_type is not None:
|
|
1799
|
+
self._attach_product_type_config(search_plugin, product_type)
|
|
1799
1800
|
|
|
1800
1801
|
return search_plugins, kwargs
|
|
1801
1802
|
|
|
@@ -143,7 +143,7 @@ class EOProduct:
|
|
|
143
143
|
and "defaultGeometry" not in properties
|
|
144
144
|
):
|
|
145
145
|
raise MisconfiguredError(
|
|
146
|
-
f"No geometry available to build EOProduct(id={properties.get('id'
|
|
146
|
+
f"No geometry available to build EOProduct(id={properties.get('id')}, provider={provider})"
|
|
147
147
|
)
|
|
148
148
|
elif not properties["geometry"] or properties["geometry"] == NOT_AVAILABLE:
|
|
149
149
|
product_geometry = properties.pop("defaultGeometry", DEFAULT_GEOMETRY)
|
|
@@ -445,7 +445,7 @@ class EOProduct:
|
|
|
445
445
|
}
|
|
446
446
|
)
|
|
447
447
|
|
|
448
|
-
if self.properties.get("quicklook"
|
|
448
|
+
if self.properties.get("quicklook") is None:
|
|
449
449
|
logger.warning(
|
|
450
450
|
"Missing information to retrieve quicklook for EO product: %s",
|
|
451
451
|
self.properties["id"],
|
|
@@ -555,7 +555,7 @@ class EOProduct:
|
|
|
555
555
|
return NoDriver()
|
|
556
556
|
|
|
557
557
|
def _repr_html_(self):
|
|
558
|
-
thumbnail = self.properties.get("thumbnail"
|
|
558
|
+
thumbnail = self.properties.get("thumbnail")
|
|
559
559
|
thumbnail_html = (
|
|
560
560
|
f"<img src='{thumbnail}' width=100 alt='thumbnail'/>"
|
|
561
561
|
if thumbnail and not thumbnail.startswith("s3")
|
|
@@ -576,12 +576,12 @@ class EOProduct:
|
|
|
576
576
|
{dict_to_html_table({
|
|
577
577
|
"provider": self.provider,
|
|
578
578
|
"product_type": self.product_type,
|
|
579
|
-
"properties["id"]": self.properties.get('id'
|
|
579
|
+
"properties["id"]": self.properties.get('id'),
|
|
580
580
|
"properties["startTimeFromAscendingNode"]": self.properties.get(
|
|
581
|
-
'startTimeFromAscendingNode'
|
|
581
|
+
'startTimeFromAscendingNode'
|
|
582
582
|
),
|
|
583
583
|
"properties["completionTimeFromAscendingNode"]": self.properties.get(
|
|
584
|
-
'completionTimeFromAscendingNode'
|
|
584
|
+
'completionTimeFromAscendingNode'
|
|
585
585
|
),
|
|
586
586
|
}, brackets=False)}
|
|
587
587
|
<details><summary style='color: grey; margin-top: 10px;'>properties: ({len(
|
|
@@ -424,7 +424,7 @@ def format_metadata(search_param: str, *args: Any, **kwargs: Any) -> str:
|
|
|
424
424
|
return Polygon(polygon_args)
|
|
425
425
|
elif len(georss) == 1 and "multisurface" in georss[0].tag.lower():
|
|
426
426
|
# Multipolygon
|
|
427
|
-
from_proj = getattr(georss[0], "attrib", {}).get("srsName"
|
|
427
|
+
from_proj = getattr(georss[0], "attrib", {}).get("srsName")
|
|
428
428
|
if from_proj:
|
|
429
429
|
from_proj = pyproj.CRS(from_proj)
|
|
430
430
|
to_proj = pyproj.CRS(DEFAULT_PROJ)
|
|
@@ -1030,8 +1030,8 @@ def properties_from_json(
|
|
|
1030
1030
|
if not discovery_config:
|
|
1031
1031
|
discovery_config = {}
|
|
1032
1032
|
|
|
1033
|
-
discovery_pattern = discovery_config.get("metadata_pattern"
|
|
1034
|
-
discovery_path = discovery_config.get("metadata_path"
|
|
1033
|
+
discovery_pattern = discovery_config.get("metadata_pattern")
|
|
1034
|
+
discovery_path = discovery_config.get("metadata_path")
|
|
1035
1035
|
if discovery_pattern and discovery_path:
|
|
1036
1036
|
discovery_jsonpath = string_to_jsonpath(discovery_path)
|
|
1037
1037
|
discovered_properties = (
|
|
@@ -1215,8 +1215,8 @@ def properties_from_xml(
|
|
|
1215
1215
|
# adds missing discovered properties
|
|
1216
1216
|
if not discovery_config:
|
|
1217
1217
|
discovery_config = {}
|
|
1218
|
-
discovery_pattern = discovery_config.get("metadata_pattern"
|
|
1219
|
-
discovery_path = discovery_config.get("metadata_path"
|
|
1218
|
+
discovery_pattern = discovery_config.get("metadata_pattern")
|
|
1219
|
+
discovery_path = discovery_config.get("metadata_path")
|
|
1220
1220
|
if discovery_pattern and discovery_path:
|
|
1221
1221
|
discovered_properties = root.xpath(
|
|
1222
1222
|
discovery_path,
|
|
@@ -1524,7 +1524,7 @@ def get_provider_queryable_path(
|
|
|
1524
1524
|
:param metadata_mapping: metadata-mapping configuration
|
|
1525
1525
|
:returns: EODAG configured queryable path or None
|
|
1526
1526
|
"""
|
|
1527
|
-
parameter_conf = metadata_mapping.get(queryable
|
|
1527
|
+
parameter_conf = metadata_mapping.get(queryable)
|
|
1528
1528
|
if isinstance(parameter_conf, list):
|
|
1529
1529
|
return parameter_conf[0]
|
|
1530
1530
|
else:
|
|
@@ -851,7 +851,7 @@ def override_config_from_env(config: dict[str, Any]) -> None:
|
|
|
851
851
|
iter_parts = iter(parts)
|
|
852
852
|
env_type = get_type_hints(PluginConfig).get(next(iter_parts, ""), str)
|
|
853
853
|
child_env_type = (
|
|
854
|
-
get_type_hints(env_type).get(next(iter_parts, "")
|
|
854
|
+
get_type_hints(env_type).get(next(iter_parts, ""))
|
|
855
855
|
if isclass(env_type)
|
|
856
856
|
else None
|
|
857
857
|
)
|
|
@@ -961,7 +961,7 @@ def merge_configs(config: dict[str, Any], other_config: dict[str, Any]) -> None:
|
|
|
961
961
|
other_config = dict(config, **other_config)
|
|
962
962
|
|
|
963
963
|
for provider, new_conf in other_config.items():
|
|
964
|
-
old_conf = config.get(provider
|
|
964
|
+
old_conf = config.get(provider)
|
|
965
965
|
|
|
966
966
|
if old_conf:
|
|
967
967
|
# update non-objects values
|
|
@@ -123,16 +123,14 @@ class EcmwfApi(Api, ECMWFSearch):
|
|
|
123
123
|
# start date
|
|
124
124
|
if "startTimeFromAscendingNode" not in kwargs:
|
|
125
125
|
kwargs["startTimeFromAscendingNode"] = (
|
|
126
|
-
getattr(self.config, "product_type_config", {}).get(
|
|
127
|
-
"missionStartDate", None
|
|
128
|
-
)
|
|
126
|
+
getattr(self.config, "product_type_config", {}).get("missionStartDate")
|
|
129
127
|
or DEFAULT_MISSION_START_DATE
|
|
130
128
|
)
|
|
131
129
|
# end date
|
|
132
130
|
if "completionTimeFromAscendingNode" not in kwargs:
|
|
133
131
|
kwargs["completionTimeFromAscendingNode"] = getattr(
|
|
134
132
|
self.config, "product_type_config", {}
|
|
135
|
-
).get("missionEndDate"
|
|
133
|
+
).get("missionEndDate") or datetime.now(timezone.utc).isoformat(
|
|
136
134
|
timespec="seconds"
|
|
137
135
|
)
|
|
138
136
|
|
|
@@ -149,8 +147,8 @@ class EcmwfApi(Api, ECMWFSearch):
|
|
|
149
147
|
:raises: :class:`~eodag.utils.exceptions.AuthenticationError`
|
|
150
148
|
"""
|
|
151
149
|
# Get credentials from eodag or using ecmwf conf
|
|
152
|
-
email = getattr(self.config, "credentials", {}).get("username"
|
|
153
|
-
key = getattr(self.config, "credentials", {}).get("password"
|
|
150
|
+
email = getattr(self.config, "credentials", {}).get("username")
|
|
151
|
+
key = getattr(self.config, "credentials", {}).get("password")
|
|
154
152
|
url = getattr(self.config, "auth_endpoint", None)
|
|
155
153
|
if not all([email, key, url]):
|
|
156
154
|
key, url, email = get_apikey_values()
|
|
@@ -295,5 +293,5 @@ class EcmwfApi(Api, ECMWFSearch):
|
|
|
295
293
|
arguments)
|
|
296
294
|
:returns: fetched queryable parameters dict
|
|
297
295
|
"""
|
|
298
|
-
product_type = kwargs.get("productType"
|
|
296
|
+
product_type = kwargs.get("productType")
|
|
299
297
|
return self.queryables_from_metadata_mapping(product_type)
|
|
@@ -241,7 +241,7 @@ class UsgsApi(Api):
|
|
|
241
241
|
download_options = api.download_options(
|
|
242
242
|
usgs_dataset, list(results_by_entity_id.keys())
|
|
243
243
|
)
|
|
244
|
-
if download_options.get("data"
|
|
244
|
+
if download_options.get("data") is not None:
|
|
245
245
|
for download_option in download_options["data"]:
|
|
246
246
|
# update results with available downloadSystem
|
|
247
247
|
if (
|
|
@@ -46,7 +46,11 @@ class GenericAuth(Authentication):
|
|
|
46
46
|
"""Authenticate"""
|
|
47
47
|
self.validate_config_credentials()
|
|
48
48
|
method = getattr(self.config, "method", "basic")
|
|
49
|
-
|
|
49
|
+
if not all(x in self.config.credentials for x in ["username", "password"]):
|
|
50
|
+
raise MisconfiguredError(
|
|
51
|
+
f"Missing credentials for provider {self.provider}",
|
|
52
|
+
"You must provide 'username' and 'password' in the configuration.",
|
|
53
|
+
)
|
|
50
54
|
if method == "digest":
|
|
51
55
|
return HTTPDigestAuth(
|
|
52
56
|
self.config.credentials["username"],
|
|
@@ -31,7 +31,12 @@ from requests.auth import AuthBase
|
|
|
31
31
|
|
|
32
32
|
from eodag.plugins.authentication import Authentication
|
|
33
33
|
from eodag.utils import HTTP_REQ_TIMEOUT, USER_AGENT, parse_qs, repeatfunc, urlparse
|
|
34
|
-
from eodag.utils.exceptions import
|
|
34
|
+
from eodag.utils.exceptions import (
|
|
35
|
+
AuthenticationError,
|
|
36
|
+
MisconfiguredError,
|
|
37
|
+
RequestError,
|
|
38
|
+
TimeOutError,
|
|
39
|
+
)
|
|
35
40
|
|
|
36
41
|
if TYPE_CHECKING:
|
|
37
42
|
from requests import PreparedRequest, Response
|
|
@@ -304,12 +309,17 @@ class OIDCAuthorizationCodeFlowAuth(OIDCRefreshTokenBase):
|
|
|
304
309
|
state = self.compute_state()
|
|
305
310
|
authentication_response = self.authenticate_user(state)
|
|
306
311
|
exchange_url = authentication_response.url
|
|
312
|
+
|
|
307
313
|
for err_pattern, err_message in getattr(
|
|
308
314
|
self.config, "exchange_url_error_pattern", {}
|
|
309
315
|
).items():
|
|
310
316
|
if err_pattern in exchange_url:
|
|
311
317
|
raise AuthenticationError(err_message)
|
|
318
|
+
|
|
312
319
|
if not exchange_url.startswith(self.config.redirect_uri):
|
|
320
|
+
if "Invalid username or password" in authentication_response.text:
|
|
321
|
+
raise AuthenticationError("Invalid username or password")
|
|
322
|
+
|
|
313
323
|
raise AuthenticationError(
|
|
314
324
|
f"Could not authenticate user with provider {self.provider}.",
|
|
315
325
|
"Please verify your credentials",
|
|
@@ -369,13 +379,20 @@ class OIDCAuthorizationCodeFlowAuth(OIDCRefreshTokenBase):
|
|
|
369
379
|
"redirect_uri": self.config.redirect_uri,
|
|
370
380
|
}
|
|
371
381
|
ssl_verify = getattr(self.config, "ssl_verify", True)
|
|
372
|
-
|
|
373
|
-
self.
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
382
|
+
try:
|
|
383
|
+
authorization_response = self.session.get(
|
|
384
|
+
self.authorization_endpoint,
|
|
385
|
+
params=params,
|
|
386
|
+
headers=USER_AGENT,
|
|
387
|
+
timeout=HTTP_REQ_TIMEOUT,
|
|
388
|
+
verify=ssl_verify,
|
|
389
|
+
)
|
|
390
|
+
except requests.exceptions.Timeout as exc:
|
|
391
|
+
raise TimeoutError(exc, "The authentication request timed out.") from exc
|
|
392
|
+
except requests.RequestException as exc:
|
|
393
|
+
raise RequestError.from_error(
|
|
394
|
+
exc, "An error occurred while authenticating the user."
|
|
395
|
+
) from exc
|
|
379
396
|
|
|
380
397
|
login_document = etree.HTML(authorization_response.text)
|
|
381
398
|
login_forms = login_document.xpath(self.config.login_form_xpath)
|
|
@@ -413,13 +430,20 @@ class OIDCAuthorizationCodeFlowAuth(OIDCRefreshTokenBase):
|
|
|
413
430
|
auth_uri = getattr(self.config, "authentication_uri", None)
|
|
414
431
|
if not auth_uri:
|
|
415
432
|
raise MisconfiguredError("authentication_uri is missing")
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
433
|
+
try:
|
|
434
|
+
return self.session.post(
|
|
435
|
+
auth_uri,
|
|
436
|
+
data=login_data,
|
|
437
|
+
headers=USER_AGENT,
|
|
438
|
+
timeout=HTTP_REQ_TIMEOUT,
|
|
439
|
+
verify=ssl_verify,
|
|
440
|
+
)
|
|
441
|
+
except requests.exceptions.Timeout as exc:
|
|
442
|
+
raise TimeoutError(exc, "The authentication request timed out.") from exc
|
|
443
|
+
except requests.RequestException as exc:
|
|
444
|
+
raise RequestError.from_error(
|
|
445
|
+
exc, "An error occurred while authenticating the user."
|
|
446
|
+
) from exc
|
|
423
447
|
|
|
424
448
|
def grant_user_consent(self, authentication_response: Response) -> Response:
|
|
425
449
|
"""Grant user consent"""
|
|
@@ -433,13 +457,20 @@ class OIDCAuthorizationCodeFlowAuth(OIDCRefreshTokenBase):
|
|
|
433
457
|
for key, value in self.config.user_consent_form_data.items()
|
|
434
458
|
}
|
|
435
459
|
ssl_verify = getattr(self.config, "ssl_verify", True)
|
|
436
|
-
|
|
437
|
-
self.
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
460
|
+
try:
|
|
461
|
+
return self.session.post(
|
|
462
|
+
self.authorization_endpoint,
|
|
463
|
+
data=user_consent_data,
|
|
464
|
+
headers=USER_AGENT,
|
|
465
|
+
timeout=HTTP_REQ_TIMEOUT,
|
|
466
|
+
verify=ssl_verify,
|
|
467
|
+
)
|
|
468
|
+
except requests.exceptions.Timeout as exc:
|
|
469
|
+
raise TimeoutError(exc, "The authentication request timed out.") from exc
|
|
470
|
+
except requests.RequestException as exc:
|
|
471
|
+
raise RequestError.from_error(
|
|
472
|
+
exc, "An error occurred while authenticating the user."
|
|
473
|
+
) from exc
|
|
443
474
|
|
|
444
475
|
def _prepare_token_post_data(self, token_data: dict[str, Any]) -> dict[str, Any]:
|
|
445
476
|
"""Prepare the common data to post to the token URI"""
|
|
@@ -487,14 +518,21 @@ class OIDCAuthorizationCodeFlowAuth(OIDCRefreshTokenBase):
|
|
|
487
518
|
self.config.token_exchange_post_data_method: token_exchange_data
|
|
488
519
|
}
|
|
489
520
|
ssl_verify = getattr(self.config, "ssl_verify", True)
|
|
490
|
-
|
|
491
|
-
self.
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
521
|
+
try:
|
|
522
|
+
r = self.session.post(
|
|
523
|
+
self.token_endpoint,
|
|
524
|
+
headers=USER_AGENT,
|
|
525
|
+
timeout=HTTP_REQ_TIMEOUT,
|
|
526
|
+
verify=ssl_verify,
|
|
527
|
+
**post_request_kwargs,
|
|
528
|
+
)
|
|
529
|
+
return r
|
|
530
|
+
except requests.exceptions.Timeout as exc:
|
|
531
|
+
raise TimeoutError(exc, "The authentication request timed out.") from exc
|
|
532
|
+
except requests.RequestException as exc:
|
|
533
|
+
raise RequestError.from_error(
|
|
534
|
+
exc, "An error occurred while authenticating the user."
|
|
535
|
+
) from exc
|
|
498
536
|
|
|
499
537
|
def _constant_or_xpath_extracted(
|
|
500
538
|
self, value: str, form_element: Any
|
|
@@ -116,7 +116,7 @@ class SASAuth(Authentication):
|
|
|
116
116
|
headers = deepcopy(USER_AGENT)
|
|
117
117
|
|
|
118
118
|
# update headers with subscription key if exists
|
|
119
|
-
apikey = getattr(self.config, "credentials", {}).get("apikey"
|
|
119
|
+
apikey = getattr(self.config, "credentials", {}).get("apikey")
|
|
120
120
|
ssl_verify = getattr(self.config, "ssl_verify", True)
|
|
121
121
|
if apikey:
|
|
122
122
|
headers_update = format_dict_items(self.config.headers, apikey=apikey)
|
|
@@ -69,7 +69,7 @@ class FilterDate(Crunch):
|
|
|
69
69
|
return []
|
|
70
70
|
|
|
71
71
|
# filter start date
|
|
72
|
-
filter_start_str = self.config.__dict__.get("start"
|
|
72
|
+
filter_start_str = self.config.__dict__.get("start")
|
|
73
73
|
if filter_start_str:
|
|
74
74
|
filter_start = dateutil.parser.parse(filter_start_str)
|
|
75
75
|
if not filter_start.tzinfo:
|
|
@@ -78,7 +78,7 @@ class FilterDate(Crunch):
|
|
|
78
78
|
filter_start = None
|
|
79
79
|
|
|
80
80
|
# filter end date
|
|
81
|
-
filter_end_str = self.config.__dict__.get("end"
|
|
81
|
+
filter_end_str = self.config.__dict__.get("end")
|
|
82
82
|
if filter_end_str:
|
|
83
83
|
filter_end = dateutil.parser.parse(filter_end_str)
|
|
84
84
|
if not filter_end.tzinfo:
|
|
@@ -93,9 +93,7 @@ class FilterDate(Crunch):
|
|
|
93
93
|
for product in products:
|
|
94
94
|
|
|
95
95
|
# product start date
|
|
96
|
-
product_start_str = product.properties.get(
|
|
97
|
-
"startTimeFromAscendingNode", None
|
|
98
|
-
)
|
|
96
|
+
product_start_str = product.properties.get("startTimeFromAscendingNode")
|
|
99
97
|
if product_start_str:
|
|
100
98
|
product_start = dateutil.parser.parse(product_start_str)
|
|
101
99
|
if not product_start.tzinfo:
|
|
@@ -104,9 +102,7 @@ class FilterDate(Crunch):
|
|
|
104
102
|
product_start = None
|
|
105
103
|
|
|
106
104
|
# product end date
|
|
107
|
-
product_end_str = product.properties.get(
|
|
108
|
-
"completionTimeFromAscendingNode", None
|
|
109
|
-
)
|
|
105
|
+
product_end_str = product.properties.get("completionTimeFromAscendingNode")
|
|
110
106
|
if product_end_str:
|
|
111
107
|
product_end = dateutil.parser.parse(product_end_str)
|
|
112
108
|
if not product_end.tzinfo:
|
|
@@ -64,7 +64,7 @@ class FilterProperty(Crunch):
|
|
|
64
64
|
return products
|
|
65
65
|
|
|
66
66
|
property_key = next(iter(self.config.__dict__))
|
|
67
|
-
property_value = self.config.__dict__.get(property_key
|
|
67
|
+
property_value = self.config.__dict__.get(property_key)
|
|
68
68
|
|
|
69
69
|
logger.debug(
|
|
70
70
|
"Start filtering for products matching operator.%s(product.properties['%s'], %s)",
|