eodag 3.0.0b1__tar.gz → 3.0.0b2__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 (248) hide show
  1. {eodag-3.0.0b1 → eodag-3.0.0b2}/CHANGES.rst +21 -1
  2. {eodag-3.0.0b1/eodag.egg-info → eodag-3.0.0b2}/PKG-INFO +3 -2
  3. {eodag-3.0.0b1 → eodag-3.0.0b2}/README.rst +1 -1
  4. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/Chart.yaml +2 -2
  5. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/conf.py +1 -0
  6. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/plugins.rst +99 -19
  7. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/stac_rest.rst +1 -1
  8. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/core.py +6 -2
  9. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/product/_assets.py +50 -0
  10. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/product/_product.py +43 -0
  11. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/search_result.py +27 -0
  12. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/manager.py +1 -0
  13. eodag-3.0.0b2/eodag/resources/ext_product_types.json +1 -0
  14. eodag-3.0.0b2/eodag/utils/repr.py +113 -0
  15. {eodag-3.0.0b1 → eodag-3.0.0b2/eodag.egg-info}/PKG-INFO +3 -2
  16. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag.egg-info/SOURCES.txt +1 -0
  17. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag.egg-info/requires.txt +1 -0
  18. {eodag-3.0.0b1 → eodag-3.0.0b2}/pyproject.toml +1 -1
  19. {eodag-3.0.0b1 → eodag-3.0.0b2}/setup.cfg +1 -0
  20. eodag-3.0.0b1/eodag/resources/ext_product_types.json +0 -1
  21. {eodag-3.0.0b1 → eodag-3.0.0b2}/.dockerignore +0 -0
  22. {eodag-3.0.0b1 → eodag-3.0.0b2}/.editorconfig +0 -0
  23. {eodag-3.0.0b1 → eodag-3.0.0b2}/.gitattributes +0 -0
  24. {eodag-3.0.0b1 → eodag-3.0.0b2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {eodag-3.0.0b1 → eodag-3.0.0b2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  26. {eodag-3.0.0b1 → eodag-3.0.0b2}/.github/pull_request_template.md +0 -0
  27. {eodag-3.0.0b1 → eodag-3.0.0b2}/.github/workflows/deploy.yml +0 -0
  28. {eodag-3.0.0b1 → eodag-3.0.0b2}/.github/workflows/fetch.yml +0 -0
  29. {eodag-3.0.0b1 → eodag-3.0.0b2}/.github/workflows/test.yml +0 -0
  30. {eodag-3.0.0b1 → eodag-3.0.0b2}/.gitignore +0 -0
  31. {eodag-3.0.0b1 → eodag-3.0.0b2}/.pre-commit-config.yaml +0 -0
  32. {eodag-3.0.0b1 → eodag-3.0.0b2}/CODE_OF_CONDUCT.md +0 -0
  33. {eodag-3.0.0b1 → eodag-3.0.0b2}/CONTRIBUTING.rst +0 -0
  34. {eodag-3.0.0b1 → eodag-3.0.0b2}/LICENSE +0 -0
  35. {eodag-3.0.0b1 → eodag-3.0.0b2}/MANIFEST.in +0 -0
  36. {eodag-3.0.0b1 → eodag-3.0.0b2}/NOTICE +0 -0
  37. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/Chart.lock +0 -0
  38. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/README.md +0 -0
  39. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/NOTES.txt +0 -0
  40. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/_helpers.tpl +0 -0
  41. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/configmap.yaml +0 -0
  42. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/deployment.yaml +0 -0
  43. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/extra-list.yaml +0 -0
  44. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/hpa.yaml +0 -0
  45. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/ingress.yaml +0 -0
  46. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/pv.yaml +0 -0
  47. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/pvc.yaml +0 -0
  48. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/secret.yaml +0 -0
  49. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/service.yaml +0 -0
  50. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/templates/serviceaccount.yaml +0 -0
  51. {eodag-3.0.0b1 → eodag-3.0.0b2}/charts/eodag-server/values.yaml +0 -0
  52. {eodag-3.0.0b1 → eodag-3.0.0b2}/docker/run-stac-server.sh +0 -0
  53. {eodag-3.0.0b1 → eodag-3.0.0b2}/docker/stac-browser.dockerfile +0 -0
  54. {eodag-3.0.0b1 → eodag-3.0.0b2}/docker/stac-server.dockerfile +0 -0
  55. {eodag-3.0.0b1 → eodag-3.0.0b2}/docker-compose.yml +0 -0
  56. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/Makefile +0 -0
  57. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/custom.css +0 -0
  58. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/download_methods.png +0 -0
  59. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_advanced_calls_graph.svg +0 -0
  60. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_bycs.png +0 -0
  61. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_fetch_product_types.png +0 -0
  62. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_logo_160.png +0 -0
  63. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_logo_160r.png +0 -0
  64. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_main_calls_graph.svg +0 -0
  65. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_overview.png +0 -0
  66. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_stac_client.png +0 -0
  67. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/eodag_stac_server.png +0 -0
  68. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/favicon-32x32.png +0 -0
  69. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/params_mapping_extra.csv +0 -0
  70. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/params_mapping_offline_infos.json +0 -0
  71. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/params_mapping_opensearch.csv +0 -0
  72. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/product_types_information.csv +0 -0
  73. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/progress_1.png +0 -0
  74. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/progress_1_none.png +0 -0
  75. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/progress_2.png +0 -0
  76. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/progress_2_none.png +0 -0
  77. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/stac_browser_example.png +0 -0
  78. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/_static/stac_browser_example_600.png +0 -0
  79. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/add_provider.rst +0 -0
  80. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/call_graphs.rst +0 -0
  81. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/core.rst +0 -0
  82. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/eoproduct.rst +0 -0
  83. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/exceptions.rst +0 -0
  84. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/index.rst +0 -0
  85. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/searchresult.rst +0 -0
  86. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/types.rst +0 -0
  87. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_reference/utils.rst +0 -0
  88. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/api_user_guide.rst +0 -0
  89. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/changelog.rst +0 -0
  90. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/cli_user_guide.rst +0 -0
  91. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/contribute.rst +0 -0
  92. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/configure.rst +0 -0
  93. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/index.rst +0 -0
  94. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/install.rst +0 -0
  95. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/overview.rst +0 -0
  96. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/product_storage_status.rst +0 -0
  97. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/product_types.rst +0 -0
  98. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/providers.rst +0 -0
  99. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/register.rst +0 -0
  100. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/getting_started_guide/side_projects.rst +0 -0
  101. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/index.rst +0 -0
  102. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/make.bat +0 -0
  103. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/1_overview.ipynb +0 -0
  104. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/2_providers_products_available.ipynb +0 -0
  105. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/3_configuration.ipynb +0 -0
  106. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/4_search.ipynb +0 -0
  107. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/5_serialize_deserialize.ipynb +0 -0
  108. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/6_crunch.ipynb +0 -0
  109. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/7_download.ipynb +0 -0
  110. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/8_post_process.ipynb +0 -0
  111. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/data/crunch_search_results.geojson +0 -0
  112. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/api_user_guide/data/download_search_results.geojson +0 -0
  113. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/intro_notebooks.ipynb +0 -0
  114. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.cpg +0 -0
  115. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.dbf +0 -0
  116. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.prj +0 -0
  117. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qix +0 -0
  118. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.qpj +0 -0
  119. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shp +0 -0
  120. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/Gulf_of_Trieste_seamask_UTM33.shx +0 -0
  121. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/auxdata/sentinel2_tiling_grid_centroids.zip +0 -0
  122. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_burnt_areas_snappy.ipynb +0 -0
  123. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_cds.ipynb +0 -0
  124. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_cop_dem.ipynb +0 -0
  125. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_ecmwf.ipynb +0 -0
  126. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_meteoblue.ipynb +0 -0
  127. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_search_location_tile.ipynb +0 -0
  128. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_ship_detection.ipynb +0 -0
  129. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_stac_client.ipynb +0 -0
  130. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/notebooks/tutos/tuto_wekeo.ipynb +0 -0
  131. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/plugins_reference/api.rst +0 -0
  132. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/plugins_reference/auth.rst +0 -0
  133. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/plugins_reference/crunch.rst +0 -0
  134. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/plugins_reference/download.rst +0 -0
  135. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/plugins_reference/search.rst +0 -0
  136. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/stac.rst +0 -0
  137. {eodag-3.0.0b1 → eodag-3.0.0b2}/docs/tutos.rst +0 -0
  138. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/__init__.py +0 -0
  139. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/__init__.py +0 -0
  140. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/product/__init__.py +0 -0
  141. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/product/drivers/__init__.py +0 -0
  142. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/product/drivers/base.py +0 -0
  143. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/api/product/metadata_mapping.py +0 -0
  144. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/cli.py +0 -0
  145. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/config.py +0 -0
  146. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/crunch.py +0 -0
  147. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/__init__.py +0 -0
  148. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/apis/__init__.py +0 -0
  149. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/apis/base.py +0 -0
  150. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/apis/ecmwf.py +0 -0
  151. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/apis/usgs.py +0 -0
  152. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/__init__.py +0 -0
  153. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/aws_auth.py +0 -0
  154. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/base.py +0 -0
  155. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/generic.py +0 -0
  156. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/header.py +0 -0
  157. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/keycloak.py +0 -0
  158. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/oauth.py +0 -0
  159. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/openid_connect.py +0 -0
  160. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/qsauth.py +0 -0
  161. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/sas_auth.py +0 -0
  162. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/token.py +0 -0
  163. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/authentication/token_exchange.py +0 -0
  164. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/base.py +0 -0
  165. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/crunch/__init__.py +0 -0
  166. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/crunch/base.py +0 -0
  167. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/crunch/filter_date.py +0 -0
  168. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/crunch/filter_latest_intersect.py +0 -0
  169. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/crunch/filter_latest_tpl_name.py +0 -0
  170. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/crunch/filter_overlap.py +0 -0
  171. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/crunch/filter_property.py +0 -0
  172. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/download/__init__.py +0 -0
  173. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/download/aws.py +0 -0
  174. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/download/base.py +0 -0
  175. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/download/creodias_s3.py +0 -0
  176. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/download/http.py +0 -0
  177. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/download/s3rest.py +0 -0
  178. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/__init__.py +0 -0
  179. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/base.py +0 -0
  180. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/build_search_result.py +0 -0
  181. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/cop_marine.py +0 -0
  182. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/creodias_s3.py +0 -0
  183. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/csw.py +0 -0
  184. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/data_request_search.py +0 -0
  185. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/qssearch.py +0 -0
  186. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/plugins/search/static_stac_search.py +0 -0
  187. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/py.typed +0 -0
  188. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/constraints/climate-dt.json +0 -0
  189. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/constraints/extremes-dt.json +0 -0
  190. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/locations_conf_template.yml +0 -0
  191. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/product_types.yml +0 -0
  192. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/providers.yml +0 -0
  193. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/shp/ne_110m_admin_0_map_units.VERSION.txt +0 -0
  194. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/shp/ne_110m_admin_0_map_units.cpg +0 -0
  195. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/shp/ne_110m_admin_0_map_units.dbf +0 -0
  196. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/shp/ne_110m_admin_0_map_units.prj +0 -0
  197. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/shp/ne_110m_admin_0_map_units.shp +0 -0
  198. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/shp/ne_110m_admin_0_map_units.shx +0 -0
  199. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/stac.yml +0 -0
  200. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/stac_api.yml +0 -0
  201. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/stac_provider.yml +0 -0
  202. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/resources/user_conf_template.yml +0 -0
  203. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/__init__.py +0 -0
  204. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/cache.py +0 -0
  205. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/config.py +0 -0
  206. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/constants.py +0 -0
  207. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/core.py +0 -0
  208. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/server.py +0 -0
  209. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/server.wsgi +0 -0
  210. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/stac.py +0 -0
  211. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/templates/README +0 -0
  212. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/types/__init__.py +0 -0
  213. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/types/collections_search.py +0 -0
  214. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/types/eodag_search.py +0 -0
  215. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/types/queryables.py +0 -0
  216. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/types/stac_search.py +0 -0
  217. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/utils/__init__.py +0 -0
  218. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/utils/cql_evaluate.py +0 -0
  219. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/rest/utils/rfc3339.py +0 -0
  220. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/types/__init__.py +0 -0
  221. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/types/bbox.py +0 -0
  222. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/types/download_args.py +0 -0
  223. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/types/queryables.py +0 -0
  224. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/types/search_args.py +0 -0
  225. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/types/whoosh.py +0 -0
  226. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/__init__.py +0 -0
  227. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/constraints.py +0 -0
  228. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/exceptions.py +0 -0
  229. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/import_system.py +0 -0
  230. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/logging.py +0 -0
  231. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/notebook.py +0 -0
  232. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/requests.py +0 -0
  233. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/rest.py +0 -0
  234. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag/utils/stac_reader.py +0 -0
  235. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag.egg-info/dependency_links.txt +0 -0
  236. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag.egg-info/entry_points.txt +0 -0
  237. {eodag-3.0.0b1 → eodag-3.0.0b2}/eodag.egg-info/top_level.txt +0 -0
  238. {eodag-3.0.0b1 → eodag-3.0.0b2}/get_pypi_latest_version.sh +0 -0
  239. {eodag-3.0.0b1 → eodag-3.0.0b2}/pytest.ini +0 -0
  240. {eodag-3.0.0b1 → eodag-3.0.0b2}/readthedocs.yml +0 -0
  241. {eodag-3.0.0b1 → eodag-3.0.0b2}/requirements-dev.txt +0 -0
  242. {eodag-3.0.0b1 → eodag-3.0.0b2}/requirements-docs.txt +0 -0
  243. {eodag-3.0.0b1 → eodag-3.0.0b2}/requirements-tutorials.txt +0 -0
  244. {eodag-3.0.0b1 → eodag-3.0.0b2}/requirements.txt +0 -0
  245. {eodag-3.0.0b1 → eodag-3.0.0b2}/setup.py +0 -0
  246. {eodag-3.0.0b1 → eodag-3.0.0b2}/tox.ini +0 -0
  247. {eodag-3.0.0b1 → eodag-3.0.0b2}/utils/params_mapping_to_csv.py +0 -0
  248. {eodag-3.0.0b1 → eodag-3.0.0b2}/utils/product_types_information_to_csv.py +0 -0
@@ -1,6 +1,26 @@
1
1
  Release history
2
2
  ---------------
3
3
 
4
+ 3.0.0b2 (2024-06-29)
5
+ ++++++++++++++++++++
6
+
7
+ Core features and fixes
8
+ ^^^^^^^^^^^^^^^^^^^^^^^
9
+
10
+ * New :class:`~eodag.api.search_result.SearchResult` HTML representation for notebooks (:pull:`1243`)
11
+
12
+ Plugins new features and fixes
13
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14
+
15
+ * Fixed missing ``products`` configuration in ``Api`` plugin download (:pull:`1241`)
16
+ * Fixed ``pagination`` configuration to be not allways mandatory (:pull:`1240`)
17
+
18
+ Miscellaneous
19
+ ^^^^^^^^^^^^^
20
+
21
+ * **[docs]** Custom mock search plugin example (:pull:`1242`)
22
+ * External product types reference updates (:pull:`1234`)
23
+
4
24
  3.0.0b1 (2024-06-24)
5
25
  ++++++++++++++++++++
6
26
 
@@ -63,7 +83,7 @@ Plugins new features and fixes
63
83
  * Refresh token for :class:`~eodag.plugins.authentication.openid_connect.OIDCAuthorizationCodeFlowAuth` plugin
64
84
  (:pull:`1138`), tests (:pull:`1135`), and fix (:pull:`1232`)
65
85
  * :class:`~eodag.plugins.authentication.header.HTTPHeaderAuth` accepts headers definition in credentials (:pull:`1215`)
66
- * ``flatten_top_dirs`` download plugins option set to true by default (#1220)
86
+ * ``flatten_top_dirs`` download plugins option set to true by default (:pull:`1220`)
67
87
  * ``base_uri`` download plugins setting is not systematically mandatory any more (:pull:`1230`)
68
88
  * Re-login in :class:`~eodag.plugins.apis.usgs.UsgsApi` plugin on api file error (:pull:`1046`)
69
89
  * Allow no auth for :class:`~eodag.plugins.download.http.HTTPDownload` download requests (:pull:`1196`)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: eodag
3
- Version: 3.0.0b1
3
+ Version: 3.0.0b2
4
4
  Summary: Earth Observation Data Access Gateway
5
5
  Home-page: https://github.com/CS-SI/eodag
6
6
  Author: CS GROUP - France
@@ -110,6 +110,7 @@ Requires-Dist: eodag[all]; extra == "docs"
110
110
  Requires-Dist: sphinx; extra == "docs"
111
111
  Requires-Dist: sphinx-book-theme; extra == "docs"
112
112
  Requires-Dist: sphinx-copybutton; extra == "docs"
113
+ Requires-Dist: sphinx-tabs; extra == "docs"
113
114
  Requires-Dist: nbsphinx; extra == "docs"
114
115
 
115
116
  .. image:: https://eodag.readthedocs.io/en/latest/_static/eodag_bycs.png
@@ -297,7 +298,7 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
297
298
 
298
299
  .. code-block:: bash
299
300
 
300
- docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b1
301
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b2
301
302
 
302
303
  You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
303
304
  Simply run:
@@ -183,7 +183,7 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
183
183
 
184
184
  .. code-block:: bash
185
185
 
186
- docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b1
186
+ docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b2
187
187
 
188
188
  You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
189
189
  Simply run:
@@ -1,5 +1,5 @@
1
1
  apiVersion: v2
2
- appVersion: 3.0.0b1
2
+ appVersion: 3.0.0b2
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.0.0b1
18
+ version: 3.0.0b2
@@ -40,6 +40,7 @@ extensions = [
40
40
  "sphinx.ext.viewcode",
41
41
  "nbsphinx",
42
42
  "sphinx_copybutton",
43
+ "sphinx_tabs.tabs",
43
44
  ]
44
45
 
45
46
  # Notebook integration parameters
@@ -108,31 +108,37 @@ named ``your_package.your_module``:
108
108
  def download(self):
109
109
  pass
110
110
 
111
- Then, in the `setup.py <https://setuptools.readthedocs.io/en/latest/userguide/quickstart.html#id2>`_ of your Python project,
111
+ Then, in the `configuration file <https://setuptools.readthedocs.io/en/latest/userguide/quickstart.html#id2>`_ of your Python project,
112
112
  add this:
113
113
 
114
- .. code-block:: python
115
114
 
116
- setup(
117
- ...
118
- entry_points={
119
- ...
120
- 'eodag.plugins.api': [
121
- 'SampleApiPlugin = your_package.your_module:SampleApiPlugin'
122
- ],
123
- ...
124
- },
125
- ...
126
- )
115
+ .. tabs::
116
+ .. tab:: pyproject.toml
117
+ .. code-block:: toml
118
+
119
+ [project.entry-points."eodag.plugins.api"]
120
+ SampleApiPlugin = "your_package.your_module:SampleApiPlugin"
121
+
122
+ .. tab:: setup.py
123
+ .. code-block:: python
124
+
125
+ setup(
126
+ # ...
127
+ entry_points={
128
+ 'eodag.plugins.api': [
129
+ 'SampleApiPlugin = your_package.your_module:SampleApiPlugin'
130
+ ]
131
+ }
132
+ )
127
133
 
128
134
  See `what the PyPa explains <https://packaging.python.org/guides/creating-and-discovering-plugins/#using-package-metadata>`_ to better
129
135
  understand this concept. In EODAG, the name you give to your plugin in the
130
- `setup.py` script's entry point doesn't matter, but we prefer it to be the
131
- same as the class name of the plugin. What matters is that the entry point
132
- must be a class deriving from one of the 5 plugin topics supported. Be
133
- particularly careful with consistency between the entry point name and the
134
- super class of you plugin class. Here is a list of entry point names and the
135
- plugin topic to which they map:
136
+ entry point doesn't matter, but we prefer it to be the same as the class
137
+ name of the plugin. What matters is that the entry point must be a class
138
+ deriving from one of the 5 plugin topics supported. Be particularly careful
139
+ with consistency between the entry point name and the super class of you
140
+ plugin class. Here is a list of entry point names and the plugin topic to
141
+ which they map:
136
142
 
137
143
  * 'eodag.plugins.api' : :class:`~eodag.plugins.apis.base.Api`
138
144
  * 'eodag.plugins.auth' : :class:`~eodag.plugins.auth.base.Authentication`
@@ -140,9 +146,83 @@ plugin topic to which they map:
140
146
  * 'eodag.plugins.download' : :class:`~eodag.plugins.download.base.Download`
141
147
  * 'eodag.plugins.search' : :class:`~eodag.plugins.search.base.Search`
142
148
 
149
+
150
+ Read the :ref:`mock search plugin` section to get an example of how to build a search
151
+ plugin.
152
+
143
153
  As an example of external plugin, you can have a look to
144
154
  `eodag-sentinelsat <https://github.com/CS-SI/eodag-sentinelsat>`_.
145
155
 
156
+ .. _mock search plugin:
157
+
158
+ A sample mock search plugin
159
+ """""""""""""""""""""""""""
160
+
161
+ In this section, we demonstrate the creation of custom search plugin. This plugin will
162
+ return a list of mocked EOProducts on search requests.
163
+
164
+ 1. Create a folder called `eodag_search_mock`. It will be the name of our package.
165
+
166
+ 2. Make an empty `__init.py__` file in the package folder.
167
+
168
+ 3. Make a `mock_search.py` file and paste in it the following class
169
+ definition.
170
+
171
+ It is our search plugin. The `query()` function is the one called by EODAG when
172
+ searching for products.
173
+
174
+ .. code-block:: python
175
+
176
+ # mock_search.py
177
+ from typing import Any, List, Optional, Tuple
178
+ from eodag.plugins.search import PreparedSearch
179
+ from eodag.plugins.search.base import Search
180
+ from eodag.api.product import EOProduct
181
+
182
+ class MockSearch(Search):
183
+ """Implement a Mock search plugin"""
184
+
185
+ def query(
186
+ self,
187
+ prep: PreparedSearch = PreparedSearch(),
188
+ **kwargs: Any,
189
+ ) -> Tuple[List[EOProduct], Optional[int]]:
190
+ """Generate EOProduct from the request"""
191
+ return ([EOProduct(
192
+ provider=self.provider,
193
+ properties={
194
+ **{
195
+ "id": f"mock_{kwargs.get('productType')}_{i}"
196
+ },
197
+ **kwargs
198
+ }
199
+ ) for i in range(0, prep.items_per_page)],
200
+ prep.items_per_page if prep.count else None
201
+ )
202
+
203
+ 4. Create a `pyproject.toml` file in the package folder and paste in it the following
204
+ content.
205
+
206
+ The `projects.entry-points` is crucial for EODAG to detect this new plugin.
207
+
208
+ .. code-block:: toml
209
+
210
+ [project]
211
+ name = "eodag-search-mock"
212
+ version = "0.0.1"
213
+ description = "Mock Search plugin for EODAG"
214
+ requires-python = ">=3.8"
215
+ dependencies = [ "eodag" ]
216
+
217
+ [project.entry-points."eodag.plugins.search"]
218
+ MockSearch = "mock_search:MockSearch"
219
+
220
+ 5. Your plugin is now ready. You need to install it for EODAG to be able to use it.
221
+
222
+ .. code-block:: shell
223
+
224
+ pip install eodag_search_mock
225
+
146
226
  Provider configuration
147
227
  ^^^^^^^^^^^^^^^^^^^^^^
148
228
 
@@ -120,7 +120,7 @@ available on `https://hub.docker.com/r/csspace/eodag-server <https://hub.docker.
120
120
 
121
121
  .. code-block:: bash
122
122
 
123
- $ docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b1
123
+ $ docker run -p 5000:5000 --rm csspace/eodag-server:3.0.0b2
124
124
 
125
125
  Example
126
126
  -------
@@ -1445,8 +1445,12 @@ class EODataAccessGateway:
1445
1445
  start=start, end=end, geom=geom, locations=locations, **kwargs
1446
1446
  )
1447
1447
  for i, search_plugin in enumerate(search_plugins):
1448
- itp = items_per_page or search_plugin.config.pagination.get(
1449
- "max_items_per_page", DEFAULT_MAX_ITEMS_PER_PAGE
1448
+ itp = (
1449
+ items_per_page
1450
+ or getattr(search_plugin.config, "pagination", {}).get(
1451
+ "max_items_per_page"
1452
+ )
1453
+ or DEFAULT_MAX_ITEMS_PER_PAGE
1450
1454
  )
1451
1455
  logger.debug(
1452
1456
  "Searching for all the products with provider %s and a maximum of %s "
@@ -22,6 +22,7 @@ from collections import UserDict
22
22
  from typing import TYPE_CHECKING, Any, Dict, List, Optional
23
23
 
24
24
  from eodag.utils.exceptions import NotAvailableError
25
+ from eodag.utils.repr import dict_to_html_table
25
26
 
26
27
  if TYPE_CHECKING:
27
28
  from eodag.api.product import EOProduct
@@ -84,6 +85,43 @@ class AssetsDict(UserDict):
84
85
  else:
85
86
  return [a for a in self.values() if "href" in a]
86
87
 
88
+ def _repr_html_(self, embeded=False):
89
+ thead = (
90
+ f"""<thead><tr><td style='text-align: left; color: grey;'>
91
+ {type(self).__name__}&ensp;({len(self)})
92
+ </td></tr></thead>
93
+ """
94
+ if not embeded
95
+ else ""
96
+ )
97
+ tr_style = "style='background-color: transparent;'" if embeded else ""
98
+ return (
99
+ f"<table>{thead}"
100
+ + "".join(
101
+ [
102
+ f"""<tr {tr_style}><td style='text-align: left;'>
103
+ <details><summary style='color: grey;'>
104
+ <span style='color: black'>'{k}'</span>:&ensp;
105
+ {{
106
+ {"'roles': '<span style='color: black'>"+str(v['roles'])+"</span>',&ensp;"
107
+ if v.get("roles") else ""}
108
+ {"'type': '"+str(v['type'])+"',&ensp;"
109
+ if v.get("type") else ""}
110
+ {"'title': '<span style='color: black'>"+str(v['title'])+"</span>',&ensp;"
111
+ if v.get("title") else ""}
112
+ ...
113
+ }}
114
+ </summary>
115
+ {dict_to_html_table(v, depth=1)}
116
+ </details>
117
+ </td></tr>
118
+ """
119
+ for k, v in self.items()
120
+ ]
121
+ )
122
+ + "</table>"
123
+ )
124
+
87
125
 
88
126
  class Asset(UserDict):
89
127
  """A UserDict object containg one of the assets of a
@@ -127,3 +165,15 @@ class Asset(UserDict):
127
165
  :rtype: str
128
166
  """
129
167
  return self.product.download(asset=self.key, **kwargs)
168
+
169
+ def _repr_html_(self):
170
+ thead = f"""<thead><tr><td style='text-align: left; color: grey;'>
171
+ {type(self).__name__}&ensp;-&ensp;{self.key}
172
+ </td></tr></thead>
173
+ """
174
+ return f"""<table>{thead}
175
+ <tr><td style='text-align: left;'>
176
+ {dict_to_html_table(self)}
177
+ </details>
178
+ </td></tr>
179
+ </table>"""
@@ -51,6 +51,7 @@ from eodag.utils import (
51
51
  get_geometry_from_various,
52
52
  )
53
53
  from eodag.utils.exceptions import DownloadError, MisconfiguredError
54
+ from eodag.utils.repr import dict_to_html_table
54
55
 
55
56
  if TYPE_CHECKING:
56
57
  from shapely.geometry.base import BaseGeometry
@@ -517,3 +518,45 @@ class EOProduct:
517
518
  )
518
519
  pass
519
520
  return NoDriver()
521
+
522
+ def _repr_html_(self):
523
+ thumbnail = self.properties.get("thumbnail", None)
524
+ thumbnail_html = (
525
+ f"<img src='{thumbnail}' width=100 alt='thumbnail'/>"
526
+ if thumbnail and not thumbnail.startswith("s3")
527
+ else ""
528
+ )
529
+ geom_style = "style='color: grey; text-align: center; min-width:100px; vertical-align: top;'"
530
+ thumbnail_style = (
531
+ "style='padding-top: 1.5em; min-width:100px; vertical-align: top;'"
532
+ )
533
+
534
+ return f"""<table>
535
+ <thead><tr style='background-color: transparent;'><td style='text-align: left; color: grey;'>
536
+ {type(self).__name__}
537
+ </td></tr></thead>
538
+
539
+ <tr style='background-color: transparent;'>
540
+ <td style='text-align: left; vertical-align: top;'>
541
+ {dict_to_html_table({
542
+ "provider": self.provider,
543
+ "product_type": self.product_type,
544
+ "properties[&quot;id&quot;]": self.properties.get('id', None),
545
+ "properties[&quot;startTimeFromAscendingNode&quot;]": self.properties.get(
546
+ 'startTimeFromAscendingNode', None
547
+ ),
548
+ "properties[&quot;completionTimeFromAscendingNode&quot;]": self.properties.get(
549
+ 'completionTimeFromAscendingNode', None
550
+ ),
551
+ }, brackets=False)}
552
+ <details><summary style='color: grey; margin-top: 10px;'>properties:&ensp;({
553
+ len(self.properties)
554
+ })</summary>{dict_to_html_table(self.properties, depth=1)}</details>
555
+ <details><summary style='color: grey; margin-top: 10px;'>assets:&ensp;({
556
+ len(self.assets)
557
+ })</summary>{self.assets._repr_html_(embeded=True)}</details>
558
+ </td>
559
+ <td {geom_style} title='geometry'>geometry<br />{self.geometry._repr_svg_()}</td>
560
+ <td {thumbnail_style} title='properties[&quot;thumbnail&quot;]'>{thumbnail_html}</td>
561
+ </tr>
562
+ </table>"""
@@ -174,6 +174,33 @@ class SearchResult(UserList):
174
174
  """
175
175
  return self.as_geojson_object()
176
176
 
177
+ def _repr_html_(self):
178
+ total_count = f"/{self.number_matched}" if self.number_matched else ""
179
+ return (
180
+ f"""<table>
181
+ <thead><tr><td style='text-align: left; color: grey;'>
182
+ {type(self).__name__}&ensp;({len(self)}{total_count})
183
+ </td></tr></thead>
184
+ """
185
+ + "".join(
186
+ [
187
+ f"""<tr><td style='text-align: left;'>
188
+ <details><summary style='color: grey; font-family: monospace;'>
189
+ {i}&ensp;
190
+ {type(p).__name__}(id=<span style='color: black;'>{
191
+ p.properties['id']
192
+ }</span>, provider={p.provider})
193
+ </summary>
194
+ {p._repr_html_()}
195
+ </details>
196
+ </td></tr>
197
+ """
198
+ for i, p in enumerate(self)
199
+ ]
200
+ )
201
+ + "</table>"
202
+ )
203
+
177
204
 
178
205
  class RawSearchResult(UserList):
179
206
  """An object representing a collection of raw/unparsed search results obtained from a provider.
@@ -242,6 +242,7 @@ class PluginManager:
242
242
  self._build_plugin(product.provider, download, Download),
243
243
  )
244
244
  elif api := getattr(plugin_conf, "api", None):
245
+ plugin_conf.api.products = plugin_conf.products
245
246
  plugin_conf.api.priority = plugin_conf.priority
246
247
  plugin = cast(Api, self._build_plugin(product.provider, api, Api))
247
248
  else: