From 8b319f6a1e1facf5fcd0186ee004b546d9001e31 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 13:36:41 +0000 Subject: [PATCH 1/4] Initial plan From ccc462c5d909f5f8e6683f5ba28873c88d5c24ee Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 13:42:58 +0000 Subject: [PATCH 2/4] Add validation metadata schema and QA checks --- =0.8.0 | 0 =1.12.0 | 356 ++++++++++++++++++ =3.5.0 | 0 =8.2.0 | 0 .../records/worldcereal_crop_extent.json | 10 +- .../records/worldcereal_crop_type.json | 10 +- docs/catalogue.md | 39 ++ qa/unittests/tests/test_records.py | 49 +++ schemas/record.json | 72 ++++ 9 files changed, 534 insertions(+), 2 deletions(-) create mode 100644 =0.8.0 create mode 100644 =1.12.0 create mode 100644 =3.5.0 create mode 100644 =8.2.0 diff --git a/=0.8.0 b/=0.8.0 new file mode 100644 index 000000000..e69de29bb diff --git a/=1.12.0 b/=1.12.0 new file mode 100644 index 000000000..81cdb25b3 --- /dev/null +++ b/=1.12.0 @@ -0,0 +1,356 @@ +Defaulting to user installation because normal site-packages is not writeable +Processing ./qa/tools + Installing build dependencies: started + Installing build dependencies: finished with status 'done' + Getting requirements to build wheel: started + Getting requirements to build wheel: finished with status 'done' + Preparing metadata (pyproject.toml): started + Preparing metadata (pyproject.toml): finished with status 'done' +Collecting pytest + Downloading pytest-9.1.1-py3-none-any.whl.metadata (7.6 kB) +Collecting moto<5.2.0,>=5.0.13 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading moto-5.1.22-py3-none-any.whl.metadata (12 kB) +Collecting dirty-equals + Downloading dirty_equals-0.11-py3-none-any.whl.metadata (5.7 kB) +Collecting pytest-xdist + Downloading pytest_xdist-3.8.0-py3-none-any.whl.metadata (3.0 kB) +Collecting requests_mock + Downloading requests_mock-1.12.1-py2.py3-none-any.whl.metadata (4.1 kB) +Collecting requests>=2.32.0 (from apex-algorithm-qa-tools==0.2.1) + Downloading requests-2.34.2-py3-none-any.whl.metadata (4.8 kB) +Requirement already satisfied: jsonschema>=4.0.0 in /usr/lib/python3/dist-packages (from apex-algorithm-qa-tools==0.2.1) (4.10.3) +Collecting openeo>=0.30.0 (from apex-algorithm-qa-tools==0.2.1) + Downloading openeo-0.51.0-py3-none-any.whl.metadata (8.9 kB) +Collecting boto3>=1.36.5 (from apex-algorithm-qa-tools==0.2.1) + Downloading boto3-1.43.62-py3-none-any.whl.metadata (6.6 kB) +Collecting pyarrow>=17.0.0 (from apex-algorithm-qa-tools==0.2.1) + Downloading pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (3.0 kB) +Collecting iniconfig>=1.0.1 (from pytest) + Downloading iniconfig-2.3.0-py3-none-any.whl.metadata (2.5 kB) +Requirement already satisfied: packaging>=22 in /usr/lib/python3/dist-packages (from pytest) (24.0) +Collecting pluggy<2,>=1.5 (from pytest) + Downloading pluggy-1.6.0-py3-none-any.whl.metadata (4.8 kB) +Requirement already satisfied: pygments>=2.7.2 in /usr/lib/python3/dist-packages (from pytest) (2.17.2) +Requirement already satisfied: botocore!=1.35.45,!=1.35.46,>=1.20.88 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (1.34.46) +Requirement already satisfied: cryptography>=35.0.0 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (41.0.7) +Collecting xmltodict (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) + Downloading xmltodict-1.0.4-py3-none-any.whl.metadata (14 kB) +Collecting werkzeug!=2.2.0,!=2.2.1,>=0.5 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) + Downloading werkzeug-3.1.8-py3-none-any.whl.metadata (4.0 kB) +Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (2.8.2) +Collecting responses!=0.25.5,>=0.15.0 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) + Downloading responses-0.26.2-py3-none-any.whl.metadata (48 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.4/48.4 kB 14.0 MB/s eta 0:00:00 +Requirement already satisfied: Jinja2>=2.10.1 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (3.1.2) +Collecting execnet>=2.1 (from pytest-xdist) + Downloading execnet-2.1.2-py3-none-any.whl.metadata (2.9 kB) +Collecting antlr4-python3-runtime (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading antlr4_python3_runtime-4.13.2-py3-none-any.whl.metadata (304 bytes) +Collecting aws-sam-translator<=1.103.0 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading aws_sam_translator-1.103.0-py3-none-any.whl.metadata (8.6 kB) +Collecting joserfc>=0.9.0 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading joserfc-1.7.4-py3-none-any.whl.metadata (3.1 kB) +Collecting jsonpath_ng (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading jsonpath_ng-1.8.0-py3-none-any.whl.metadata (18 kB) +Collecting docker>=3.0.0 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading docker-7.2.0-py3-none-any.whl.metadata (3.8 kB) +Collecting graphql-core (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading graphql_core-3.2.11-py3-none-any.whl.metadata (11 kB) +Requirement already satisfied: PyYAML>=5.1 in /usr/lib/python3/dist-packages (from moto[s3,server]<5.2.0,>=5.0.13) (6.0.1) +Collecting cfn-lint<=1.41.0,>=0.40.0 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading cfn_lint-1.41.0-py3-none-any.whl.metadata (24 kB) +Collecting openapi-spec-validator>=0.5.0 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading openapi_spec_validator-0.9.0-py3-none-any.whl.metadata (6.5 kB) +Collecting pydantic<=2.12.4 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading pydantic-2.12.4-py3-none-any.whl.metadata (89 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 89.9/89.9 kB 14.1 MB/s eta 0:00:00 +Requirement already satisfied: pyparsing>=3.0.7 in /usr/lib/python3/dist-packages (from moto[s3,server]<5.2.0,>=5.0.13) (3.1.1) +Collecting py-partiql-parser==0.6.3 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading py_partiql_parser-0.6.3-py2.py3-none-any.whl.metadata (2.9 kB) +Collecting aws-xray-sdk!=0.96,>=0.93 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading aws_xray_sdk-2.15.0-py2.py3-none-any.whl.metadata (23 kB) +Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from moto[s3,server]<5.2.0,>=5.0.13) (68.1.2) +Collecting flask!=2.2.0,!=2.2.1 (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading flask-3.1.3-py3-none-any.whl.metadata (3.2 kB) +Collecting flask-cors (from moto[s3,server]<5.2.0,>=5.0.13) + Downloading flask_cors-6.0.5-py3-none-any.whl.metadata (5.4 kB) +Requirement already satisfied: typing_extensions>=4.4 in /usr/lib/python3/dist-packages (from aws-sam-translator<=1.103.0->moto[s3,server]<5.2.0,>=5.0.13) (4.10.0) +Collecting wrapt (from aws-xray-sdk!=0.96,>=0.93->moto[s3,server]<5.2.0,>=5.0.13) + Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (7.4 kB) +Collecting botocore!=1.35.45,!=1.35.46,>=1.20.88 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) + Downloading botocore-1.43.62-py3-none-any.whl.metadata (5.6 kB) +Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /usr/lib/python3/dist-packages (from boto3>=1.36.5->apex-algorithm-qa-tools==0.2.1) (1.0.1) +Collecting s3transfer<0.20.0,>=0.19.0 (from boto3>=1.36.5->apex-algorithm-qa-tools==0.2.1) + Downloading s3transfer-0.19.2-py3-none-any.whl.metadata (1.7 kB) +Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /usr/lib/python3/dist-packages (from botocore!=1.35.45,!=1.35.46,>=1.20.88->moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (2.0.7) +Requirement already satisfied: jsonpatch in /usr/lib/python3/dist-packages (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) (1.32) +Collecting networkx<4,>=2.4 (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading networkx-3.6.1-py3-none-any.whl.metadata (6.8 kB) +Collecting sympy>=1.0.0 (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading sympy-1.14.0-py3-none-any.whl.metadata (12 kB) +Collecting regex (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (40 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.5/40.5 kB 15.5 MB/s eta 0:00:00 +Collecting blinker>=1.9.0 (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) + Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB) +Requirement already satisfied: click>=8.1.3 in /usr/lib/python3/dist-packages (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) (8.1.6) +Collecting itsdangerous>=2.2.0 (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) + Downloading itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB) +Requirement already satisfied: markupsafe>=2.1.1 in /usr/lib/python3/dist-packages (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) (2.1.5) +Collecting cryptography>=35.0.0 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) + Downloading cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl.metadata (4.3 kB) +Collecting cffi>=2.0.0 (from cryptography>=35.0.0->moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) + Downloading cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.5 kB) +Requirement already satisfied: attrs>=17.4.0 in /usr/lib/python3/dist-packages (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) (23.2.0) +Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/lib/python3/dist-packages (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) (0.20.0) +Collecting jsonschema>=4.0.0 (from apex-algorithm-qa-tools==0.2.1) + Downloading jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB) +Collecting jsonschema-path<0.6.0,>=0.5.0 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading jsonschema_path-0.5.0-py3-none-any.whl.metadata (8.1 kB) +Collecting lazy-object-proxy<2.0,>=1.7.1 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading lazy_object_proxy-1.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (5.1 kB) +Collecting openapi-schema-validator<0.10.0,>=0.9.0 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading openapi_schema_validator-0.9.0-py3-none-any.whl.metadata (10 kB) +Collecting pydantic-settings<3.0.0,>=2.0.0 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading pydantic_settings-2.14.2-py3-none-any.whl.metadata (3.4 kB) +Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) + Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB) +Collecting referencing>=0.28.4 (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) + Downloading referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB) +Collecting rpds-py>=0.25.0 (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) + Downloading rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB) +Collecting shapely>=1.6.4 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (6.8 kB) +Collecting numpy>=1.17.0 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (6.6 kB) +Collecting xarray<2025.01.2,>=0.12.3 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading xarray-2025.1.1-py3-none-any.whl.metadata (11 kB) +Collecting pandas<3.0.0,>0.20.0 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (91 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 91.2/91.2 kB 28.0 MB/s eta 0:00:00 +Collecting pystac>=1.5.0 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac-1.15.2-py3-none-any.whl.metadata (6.3 kB) +Collecting deprecated>=1.2.12 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading deprecated-1.3.1-py2.py3-none-any.whl.metadata (5.9 kB) +Collecting geopandas>=0.14 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading geopandas-1.1.4-py3-none-any.whl.metadata (2.3 kB) +Collecting annotated-types>=0.6.0 (from pydantic<=2.12.4->moto[s3,server]<5.2.0,>=5.0.13) + Downloading annotated_types-0.8.0-py3-none-any.whl.metadata (15 kB) +Collecting pydantic-core==2.41.5 (from pydantic<=2.12.4->moto[s3,server]<5.2.0,>=5.0.13) + Downloading pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.3 kB) +Collecting typing_extensions>=4.4 (from aws-sam-translator<=1.103.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading typing_extensions-4.16.0-py3-none-any.whl.metadata (3.3 kB) +Collecting typing-inspection>=0.4.2 (from pydantic<=2.12.4->moto[s3,server]<5.2.0,>=5.0.13) + Downloading typing_inspection-0.4.2-py3-none-any.whl.metadata (2.6 kB) +Collecting charset_normalizer<4,>=2 (from requests>=2.32.0->apex-algorithm-qa-tools==0.2.1) + Downloading charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (41 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.7/41.7 kB 15.9 MB/s eta 0:00:00 +Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3/dist-packages (from requests>=2.32.0->apex-algorithm-qa-tools==0.2.1) (3.6) +Requirement already satisfied: certifi>=2023.5.7 in /usr/lib/python3/dist-packages (from requests>=2.32.0->apex-algorithm-qa-tools==0.2.1) (2023.11.17) +Collecting pycparser (from cffi>=2.0.0->cryptography>=35.0.0->moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) + Downloading pycparser-3.0-py3-none-any.whl.metadata (8.2 kB) +Collecting pyogrio>=0.7.2 (from geopandas>=0.14->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pyogrio-0.13.0-cp311-abi3-manylinux_2_28_x86_64.whl.metadata (5.8 kB) +Collecting pyproj>=3.5.0 (from geopandas>=0.14->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pyproj-3.7.2-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (31 kB) +Collecting pathable<0.7.0,>=0.6.0 (from jsonschema-path<0.6.0,>=0.5.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading pathable-0.6.0-py3-none-any.whl.metadata (7.2 kB) +Collecting rfc3339-validator (from openapi-schema-validator<0.10.0,>=0.9.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading rfc3339_validator-0.1.4-py2.py3-none-any.whl.metadata (1.5 kB) +Requirement already satisfied: pytz>=2020.1 in /usr/lib/python3/dist-packages (from pandas<3.0.0,>0.20.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) (2024.1) +Collecting tzdata>=2022.7 (from pandas<3.0.0,>0.20.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading tzdata-2026.3-py2.py3-none-any.whl.metadata (1.4 kB) +Collecting python-dotenv>=0.21.0 (from pydantic-settings<3.0.0,>=2.0.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading python_dotenv-1.2.2-py3-none-any.whl.metadata (27 kB) +Collecting pystac-core<2,>=1.15.0 (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_core-1.15.2-py3-none-any.whl.metadata (1.3 kB) +Collecting pystac-ext-classification (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_classification-2.0.0-py3-none-any.whl.metadata (2.1 kB) +Collecting pystac-ext-datacube (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_datacube-2.2.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-eo (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_eo-1.1.0-py3-none-any.whl.metadata (1.9 kB) +Collecting pystac-ext-file (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_file-2.1.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-grid (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_grid-1.1.0-py3-none-any.whl.metadata (1.9 kB) +Collecting pystac-ext-item-assets (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_item_assets-1.0.0-py3-none-any.whl.metadata (1.9 kB) +Collecting pystac-ext-label (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_label-1.0.1-py3-none-any.whl.metadata (1.9 kB) +Collecting pystac-ext-mgrs (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_mgrs-1.0.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-mlm (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_mlm-1.4.0-py3-none-any.whl.metadata (2.1 kB) +Collecting pystac-ext-pointcloud (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_pointcloud-1.0.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-projection (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_projection-2.0.0-py3-none-any.whl.metadata (2.1 kB) +Collecting pystac-ext-raster (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_raster-1.1.0-py3-none-any.whl.metadata (1.9 kB) +Collecting pystac-ext-render (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_render-2.0.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-sar (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_sar-1.0.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-sat (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_sat-1.0.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-scientific (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_scientific-1.0.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-storage (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_storage-2.0.0-py3-none-any.whl.metadata (1.9 kB) +Collecting pystac-ext-table (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_table-1.2.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-timestamps (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_timestamps-1.1.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-version (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_version-1.2.0-py3-none-any.whl.metadata (1.9 kB) +Collecting pystac-ext-view (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_view-1.0.0-py3-none-any.whl.metadata (1.8 kB) +Collecting pystac-ext-xarray-assets (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) + Downloading pystac_ext_xarray_assets-1.0.0-py3-none-any.whl.metadata (1.9 kB) +Collecting mpmath<1.4,>=1.1.0 (from sympy>=1.0.0->cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) + Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB) +Requirement already satisfied: six in /usr/lib/python3/dist-packages (from rfc3339-validator->openapi-schema-validator<0.10.0,>=0.9.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) (1.16.0) +Downloading pytest-9.1.1-py3-none-any.whl (386 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 386.5/386.5 kB 10.6 MB/s eta 0:00:00 +Downloading moto-5.1.22-py3-none-any.whl (6.6 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.6/6.6 MB 54.5 MB/s eta 0:00:00 +Downloading dirty_equals-0.11-py3-none-any.whl (28 kB) +Downloading pytest_xdist-3.8.0-py3-none-any.whl (46 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 46.4/46.4 kB 16.3 MB/s eta 0:00:00 +Downloading requests_mock-1.12.1-py2.py3-none-any.whl (27 kB) +Downloading py_partiql_parser-0.6.3-py2.py3-none-any.whl (23 kB) +Downloading aws_sam_translator-1.103.0-py3-none-any.whl (403 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 403.1/403.1 kB 98.0 MB/s eta 0:00:00 +Downloading aws_xray_sdk-2.15.0-py2.py3-none-any.whl (103 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.2/103.2 kB 38.4 MB/s eta 0:00:00 +Downloading boto3-1.43.62-py3-none-any.whl (140 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 140.0/140.0 kB 53.5 MB/s eta 0:00:00 +Downloading botocore-1.43.62-py3-none-any.whl (15.5 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.5/15.5 MB 143.5 MB/s eta 0:00:00 +Downloading cfn_lint-1.41.0-py3-none-any.whl (5.7 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.7/5.7 MB 158.7 MB/s eta 0:00:00 +Downloading docker-7.2.0-py3-none-any.whl (148 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 148.8/148.8 kB 49.6 MB/s eta 0:00:00 +Downloading execnet-2.1.2-py3-none-any.whl (40 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.7/40.7 kB 13.5 MB/s eta 0:00:00 +Downloading flask-3.1.3-py3-none-any.whl (103 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.4/103.4 kB 36.4 MB/s eta 0:00:00 +Downloading iniconfig-2.3.0-py3-none-any.whl (7.5 kB) +Downloading joserfc-1.7.4-py3-none-any.whl (71 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.0/71.0 kB 25.5 MB/s eta 0:00:00 +Downloading cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl (4.7 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.7/4.7 MB 174.3 MB/s eta 0:00:00 +Downloading openapi_spec_validator-0.9.0-py3-none-any.whl (50 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.3/50.3 kB 19.2 MB/s eta 0:00:00 +Downloading jsonschema-4.26.0-py3-none-any.whl (90 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.6/90.6 kB 34.5 MB/s eta 0:00:00 +Downloading openeo-0.51.0-py3-none-any.whl (349 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 349.2/349.2 kB 96.4 MB/s eta 0:00:00 +Downloading pluggy-1.6.0-py3-none-any.whl (20 kB) +Downloading pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl (50.1 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.1/50.1 MB 99.7 MB/s eta 0:00:00 +Downloading pydantic-2.12.4-py3-none-any.whl (463 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 463.4/463.4 kB 113.7 MB/s eta 0:00:00 +Downloading pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 163.8 MB/s eta 0:00:00 +Downloading requests-2.34.2-py3-none-any.whl (73 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 73.1/73.1 kB 30.4 MB/s eta 0:00:00 +Downloading responses-0.26.2-py3-none-any.whl (35 kB) +Downloading werkzeug-3.1.8-py3-none-any.whl (226 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 226.5/226.5 kB 74.5 MB/s eta 0:00:00 +Downloading antlr4_python3_runtime-4.13.2-py3-none-any.whl (144 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 144.5/144.5 kB 53.3 MB/s eta 0:00:00 +Downloading flask_cors-6.0.5-py3-none-any.whl (16 kB) +Downloading graphql_core-3.2.11-py3-none-any.whl (214 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 214.9/214.9 kB 73.8 MB/s eta 0:00:00 +Downloading jsonpath_ng-1.8.0-py3-none-any.whl (67 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 67.8/67.8 kB 29.0 MB/s eta 0:00:00 +Downloading xmltodict-1.0.4-py3-none-any.whl (13 kB) +Downloading annotated_types-0.8.0-py3-none-any.whl (13 kB) +Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB) +Downloading cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (221 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 221.8/221.8 kB 77.6 MB/s eta 0:00:00 +Downloading charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (224 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 224.3/224.3 kB 72.7 MB/s eta 0:00:00 +Downloading deprecated-1.3.1-py2.py3-none-any.whl (11 kB) +Downloading geopandas-1.1.4-py3-none-any.whl (343 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 343.3/343.3 kB 95.5 MB/s eta 0:00:00 +Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB) +Downloading jsonschema_path-0.5.0-py3-none-any.whl (24 kB) +Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB) +Downloading lazy_object_proxy-1.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (71 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.5/71.5 kB 29.4 MB/s eta 0:00:00 +Downloading networkx-3.6.1-py3-none-any.whl (2.1 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 165.3 MB/s eta 0:00:00 +Downloading numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (16.7 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.7/16.7 MB 135.4 MB/s eta 0:00:00 +Downloading openapi_schema_validator-0.9.0-py3-none-any.whl (19 kB) +Downloading pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (12.4 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.4/12.4 MB 168.4 MB/s eta 0:00:00 +Downloading pydantic_settings-2.14.2-py3-none-any.whl (61 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.7/61.7 kB 26.6 MB/s eta 0:00:00 +Downloading pystac-1.15.2-py3-none-any.whl (5.7 kB) +Downloading referencing-0.37.0-py3-none-any.whl (26 kB) +Downloading rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (366 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 366.2/366.2 kB 100.6 MB/s eta 0:00:00 +Downloading s3transfer-0.19.2-py3-none-any.whl (90 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.2/90.2 kB 38.0 MB/s eta 0:00:00 +Downloading shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (3.1 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.1/3.1 MB 163.1 MB/s eta 0:00:00 +Downloading sympy-1.14.0-py3-none-any.whl (6.3 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.3/6.3 MB 168.8 MB/s eta 0:00:00 +Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 45.6/45.6 kB 18.1 MB/s eta 0:00:00 +Downloading typing_inspection-0.4.2-py3-none-any.whl (14 kB) +Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (172 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 172.4/172.4 kB 66.1 MB/s eta 0:00:00 +Downloading xarray-2025.1.1-py3-none-any.whl (1.2 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 144.1 MB/s eta 0:00:00 +Downloading regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (801 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 801.8/801.8 kB 144.8 MB/s eta 0:00:00 +Downloading mpmath-1.3.0-py3-none-any.whl (536 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 135.2 MB/s eta 0:00:00 +Downloading pathable-0.6.0-py3-none-any.whl (18 kB) +Downloading pyogrio-0.13.0-cp311-abi3-manylinux_2_28_x86_64.whl (33.3 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 33.3/33.3 MB 118.2 MB/s eta 0:00:00 +Downloading pyproj-3.7.2-cp312-cp312-manylinux_2_28_x86_64.whl (9.6 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.6/9.6 MB 153.8 MB/s eta 0:00:00 +Downloading pystac_core-1.15.2-py3-none-any.whl (117 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 117.3/117.3 kB 46.5 MB/s eta 0:00:00 +Downloading python_dotenv-1.2.2-py3-none-any.whl (22 kB) +Downloading tzdata-2026.3-py2.py3-none-any.whl (348 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 348.2/348.2 kB 99.7 MB/s eta 0:00:00 +Downloading pycparser-3.0-py3-none-any.whl (48 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.2/48.2 kB 20.3 MB/s eta 0:00:00 +Downloading pystac_ext_classification-2.0.0-py3-none-any.whl (7.0 kB) +Downloading pystac_ext_datacube-2.2.0-py3-none-any.whl (6.8 kB) +Downloading pystac_ext_eo-1.1.0-py3-none-any.whl (7.4 kB) +Downloading pystac_ext_file-2.1.0-py3-none-any.whl (5.5 kB) +Downloading pystac_ext_grid-1.1.0-py3-none-any.whl (3.3 kB) +Downloading pystac_ext_item_assets-1.0.0-py3-none-any.whl (3.4 kB) +Downloading pystac_ext_label-1.0.1-py3-none-any.whl (7.9 kB) +Downloading pystac_ext_mgrs-1.0.0-py3-none-any.whl (3.8 kB) +Downloading pystac_ext_mlm-1.4.0-py3-none-any.whl (13 kB) +Downloading pystac_ext_pointcloud-1.0.0-py3-none-any.whl (6.2 kB) +Downloading pystac_ext_projection-2.0.0-py3-none-any.whl (7.1 kB) +Downloading pystac_ext_raster-1.1.0-py3-none-any.whl (6.6 kB) +Downloading pystac_ext_render-2.0.0-py3-none-any.whl (5.0 kB) +Downloading pystac_ext_sar-1.0.0-py3-none-any.whl (6.3 kB) +Downloading pystac_ext_sat-1.0.0-py3-none-any.whl (4.6 kB) +Downloading pystac_ext_scientific-1.0.0-py3-none-any.whl (5.2 kB) +Downloading pystac_ext_storage-2.0.0-py3-none-any.whl (7.4 kB) +Downloading pystac_ext_table-1.2.0-py3-none-any.whl (4.4 kB) +Downloading pystac_ext_timestamps-1.1.0-py3-none-any.whl (4.3 kB) +Downloading pystac_ext_version-1.2.0-py3-none-any.whl (5.4 kB) +Downloading pystac_ext_view-1.0.0-py3-none-any.whl (4.5 kB) +Downloading pystac_ext_xarray_assets-1.0.0-py3-none-any.whl (3.6 kB) +Downloading rfc3339_validator-0.1.4-py2.py3-none-any.whl (3.5 kB) +Building wheels for collected packages: apex-algorithm-qa-tools + Building wheel for apex-algorithm-qa-tools (pyproject.toml): started + Building wheel for apex-algorithm-qa-tools (pyproject.toml): finished with status 'done' + Created wheel for apex-algorithm-qa-tools: filename=apex_algorithm_qa_tools-0.2.1-py3-none-any.whl size=28462 sha256=9cde0307ccc0d39547a681ad57735c3cc3af43313bc9848080b1db25388fc31e + Stored in directory: /tmp/pip-ephem-wheel-cache-itsr1phw/wheels/9f/67/ca/d1a0094ed57cb6af62cd6bffda8c7257c3d0e0755cdc8f535e +Successfully built apex-algorithm-qa-tools +Installing collected packages: py-partiql-parser, mpmath, jsonpath_ng, antlr4-python3-runtime, xmltodict, wrapt, werkzeug, tzdata, typing_extensions, sympy, rpds-py, rfc3339-validator, regex, python-dotenv, pystac-core, pyproj, pycparser, pyarrow, pluggy, pathable, numpy, networkx, lazy-object-proxy, itsdangerous, iniconfig, graphql-core, execnet, dirty-equals, charset_normalizer, botocore, blinker, annotated-types, typing-inspection, shapely, s3transfer, requests, referencing, pytest, pystac-ext-xarray-assets, pystac-ext-view, pystac-ext-version, pystac-ext-timestamps, pystac-ext-table, pystac-ext-storage, pystac-ext-scientific, pystac-ext-sat, pystac-ext-sar, pystac-ext-render, pystac-ext-raster, pystac-ext-projection, pystac-ext-pointcloud, pystac-ext-mlm, pystac-ext-mgrs, pystac-ext-label, pystac-ext-item-assets, pystac-ext-grid, pystac-ext-file, pystac-ext-eo, pystac-ext-datacube, pystac-ext-classification, pyogrio, pydantic-core, pandas, flask, deprecated, cffi, aws-xray-sdk, xarray, responses, requests_mock, pytest-xdist, pystac, pydantic, jsonschema-specifications, jsonschema-path, geopandas, flask-cors, docker, cryptography, boto3, pydantic-settings, openeo, moto, jsonschema, joserfc, openapi-schema-validator, aws-sam-translator, apex-algorithm-qa-tools, openapi-spec-validator, cfn-lint +Successfully installed annotated-types-0.8.0 antlr4-python3-runtime-4.13.2 apex-algorithm-qa-tools-0.2.1 aws-sam-translator-1.103.0 aws-xray-sdk-2.15.0 blinker-1.9.0 boto3-1.43.62 botocore-1.43.62 cffi-2.1.0 cfn-lint-1.41.0 charset_normalizer-3.4.9 cryptography-50.0.0 deprecated-1.3.1 dirty-equals-0.11 docker-7.2.0 execnet-2.1.2 flask-3.1.3 flask-cors-6.0.5 geopandas-1.1.4 graphql-core-3.2.11 iniconfig-2.3.0 itsdangerous-2.2.0 joserfc-1.7.4 jsonpath_ng-1.8.0 jsonschema-4.26.0 jsonschema-path-0.5.0 jsonschema-specifications-2025.9.1 lazy-object-proxy-1.12.0 moto-5.1.22 mpmath-1.3.0 networkx-3.6.1 numpy-2.5.1 openapi-schema-validator-0.9.0 openapi-spec-validator-0.9.0 openeo-0.51.0 pandas-2.3.3 pathable-0.6.0 pluggy-1.6.0 py-partiql-parser-0.6.3 pyarrow-25.0.0 pycparser-3.0 pydantic-2.12.4 pydantic-core-2.41.5 pydantic-settings-2.14.2 pyogrio-0.13.0 pyproj-3.7.2 pystac-1.15.2 pystac-core-1.15.2 pystac-ext-classification-2.0.0 pystac-ext-datacube-2.2.0 pystac-ext-eo-1.1.0 pystac-ext-file-2.1.0 pystac-ext-grid-1.1.0 pystac-ext-item-assets-1.0.0 pystac-ext-label-1.0.1 pystac-ext-mgrs-1.0.0 pystac-ext-mlm-1.4.0 pystac-ext-pointcloud-1.0.0 pystac-ext-projection-2.0.0 pystac-ext-raster-1.1.0 pystac-ext-render-2.0.0 pystac-ext-sar-1.0.0 pystac-ext-sat-1.0.0 pystac-ext-scientific-1.0.0 pystac-ext-storage-2.0.0 pystac-ext-table-1.2.0 pystac-ext-timestamps-1.1.0 pystac-ext-version-1.2.0 pystac-ext-view-1.0.0 pystac-ext-xarray-assets-1.0.0 pytest-9.1.1 pytest-xdist-3.8.0 python-dotenv-1.2.2 referencing-0.37.0 regex-2026.7.19 requests-2.34.2 requests_mock-1.12.1 responses-0.26.2 rfc3339-validator-0.1.4 rpds-py-2026.6.3 s3transfer-0.19.2 shapely-2.1.2 sympy-1.14.0 typing-inspection-0.4.2 typing_extensions-4.16.0 tzdata-2026.3 werkzeug-3.1.8 wrapt-2.3.0 xarray-2025.1.1 xmltodict-1.0.4 diff --git a/=3.5.0 b/=3.5.0 new file mode 100644 index 000000000..e69de29bb diff --git a/=8.2.0 b/=8.2.0 new file mode 100644 index 000000000..e69de29bb diff --git a/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json b/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json index fd781a8ca..cf402f42f 100644 --- a/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json +++ b/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json @@ -89,7 +89,15 @@ "name": "GeoTIFF" } ], - "license": "other" + "license": "other", + "validation": { + "status": "accepted", + "document": { + "href": "https://doi.org/10.1038/s43016-023-00841-7", + "reviewed_by": "ESA", + "review_date": "2025-02-17" + } + } }, "linkTemplates": [], "links": [ diff --git a/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json b/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json index 99d11573a..d1b9b74d1 100644 --- a/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json +++ b/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json @@ -87,7 +87,15 @@ "name": "GeoTIFF" } ], - "license": "other" + "license": "other", + "validation": { + "status": "accepted", + "document": { + "href": "https://doi.org/10.1038/s43016-023-00841-7", + "reviewed_by": "ESA", + "review_date": "2025-01-28" + } + } }, "linkTemplates": [], "links": [ diff --git a/docs/catalogue.md b/docs/catalogue.md index d232dbe36..4ef2c3a50 100644 --- a/docs/catalogue.md +++ b/docs/catalogue.md @@ -57,6 +57,45 @@ The following sections demonstrate how the various sections from the record are In those cases where the service is not intended to be publicly available, the `properties.visibility` property in the record can be set to `private`. This ensures that the service will not be listed in the [APEx Algorithm Catalogue](https://algorithm-catalogue.apex.esa.int/). The default value for this property is `public`, meaning that if it is not specified, the service will be visible in the catalogue. +## Validation Metadata and Certification + +Certification in the catalogue is derived from optional validation metadata in the service record. If this field is omitted, the service is treated as **Contributed** by default. + +Use `properties.validation` when a validation document exists: + +```json +"validation": { + "status": "pending", + "document": { + "href": "https://.../validation-report.pdf" + } +} +``` + +When ESA has reviewed and accepted the validation document, set `status` to `accepted` and include ESA review metadata: + +```json +"validation": { + "status": "accepted", + "document": { + "href": "https://.../validation-report.pdf", + "reviewed_by": "ESA", + "review_date": "2026-05-01" + } +} +``` + +A service can only be considered **ESA-validated** when: + +1. `properties.validation.status` is `accepted` with `document.reviewed_by = "ESA"`, and +2. at least one benchmark scenario JSON file exists in the service's `benchmark_scenarios/` folder. + +Suggested review flow: + +1. Algorithm PI adds `validation.status = "pending"` and the validation document URL. +2. ESA reviewer verifies the document and benchmark readiness. +3. ESA reviewer updates the record to `status = "accepted"` and sets `reviewed_by` and `review_date`. + ## Services Overview @tbl-overview-mapping illustrates how the various sections from the record are connected to the general overview of all the services in the APEx Service Catalogue as shown in @fig-overview. diff --git a/qa/unittests/tests/test_records.py b/qa/unittests/tests/test_records.py index 6cf3f4bd9..030d73ba1 100644 --- a/qa/unittests/tests/test_records.py +++ b/qa/unittests/tests/test_records.py @@ -2,6 +2,7 @@ import requests import pytest +from copy import deepcopy from apex_algorithm_qa_tools.common import get_project_root from pathlib import Path from apex_algorithm_qa_tools.records import ( @@ -86,3 +87,51 @@ def test_algorithm_provider_records_(): ) def test_provider_record_validation(record): jsonschema.validate(instance=record["data"], schema=get_provider_ogc_record_schema()) + + +def _has_benchmark_scenarios(record_path: str) -> bool: + service_dir = Path(record_path).parent.parent + benchmark_dir = service_dir / "benchmark_scenarios" + return benchmark_dir.exists() and any(benchmark_dir.glob("*.json")) + + +@pytest.mark.parametrize( + "record", + [ + pytest.param(record, id=record["data"]["id"]) + for record in get_service_ogc_records() + if record["data"].get("properties", {}).get("validation", {}).get("status") + == "accepted" + ], +) +def test_service_record_with_accepted_validation_requires_benchmark_scenarios(record): + assert _has_benchmark_scenarios(record["path"]), ( + f"Service '{record['data']['id']}' has validation.status='accepted' but no benchmark scenario files in " + f"{Path(record['path']).parent.parent / 'benchmark_scenarios'}" + ) + + +@pytest.mark.parametrize( + "invalid_validation", + [ + {"status": "accepted"}, + {"status": "accepted", "document": {"href": "https://example.com/validation-report.pdf"}}, + { + "status": "accepted", + "document": { + "href": "https://example.com/validation-report.pdf", + "reviewed_by": "Other", + "review_date": "2025-01-01", + }, + }, + {"status": "reviewed", "document": {"href": "https://example.com/validation-report.pdf"}}, + ], +) +def test_service_record_validation_rejects_malformed_validation_metadata( + invalid_validation, +): + record = deepcopy(get_service_ogc_records()[0]["data"]) + record["properties"]["validation"] = invalid_validation + + with pytest.raises(jsonschema.ValidationError): + jsonschema.validate(instance=record, schema=get_service_ogc_record_schema()) diff --git a/schemas/record.json b/schemas/record.json index c077d594d..6c1166087 100644 --- a/schemas/record.json +++ b/schemas/record.json @@ -419,6 +419,78 @@ "license": { "type": "string", "description": "License that is applicable for the APEx service." + }, + "validation": { + "type": "object", + "description": "Optional metadata describing the validation document status for this service.", + "required": [ + "status", + "document" + ], + "properties": { + "status": { + "type": "string", + "description": "Validation review status used for certification derivation.", + "enum": [ + "pending", + "accepted" + ] + }, + "document": { + "type": "object", + "description": "Reference to the validation document.", + "required": [ + "href" + ], + "properties": { + "href": { + "type": "string", + "format": "uri", + "description": "URL to the validation report or equivalent validation evidence." + }, + "reviewed_by": { + "type": "string", + "description": "Reviewer organization that accepted the validation document.", + "enum": [ + "ESA" + ] + }, + "review_date": { + "type": "string", + "format": "date", + "description": "Date on which the validation document was accepted." + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "status": { + "const": "accepted" + } + }, + "required": [ + "status" + ] + }, + "then": { + "properties": { + "document": { + "required": [ + "href", + "reviewed_by", + "review_date" + ] + } + }, + "required": [ + "document" + ] + } + } + ] } } }, From 77ff653bf6cf1158dca0e171369437b3ae3a7c47 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 13:44:12 +0000 Subject: [PATCH 3/4] Remove accidental dependency install artifacts --- =0.8.0 | 0 =1.12.0 | 356 -------------------------------------------------------- =3.5.0 | 0 =8.2.0 | 0 4 files changed, 356 deletions(-) delete mode 100644 =0.8.0 delete mode 100644 =1.12.0 delete mode 100644 =3.5.0 delete mode 100644 =8.2.0 diff --git a/=0.8.0 b/=0.8.0 deleted file mode 100644 index e69de29bb..000000000 diff --git a/=1.12.0 b/=1.12.0 deleted file mode 100644 index 81cdb25b3..000000000 --- a/=1.12.0 +++ /dev/null @@ -1,356 +0,0 @@ -Defaulting to user installation because normal site-packages is not writeable -Processing ./qa/tools - Installing build dependencies: started - Installing build dependencies: finished with status 'done' - Getting requirements to build wheel: started - Getting requirements to build wheel: finished with status 'done' - Preparing metadata (pyproject.toml): started - Preparing metadata (pyproject.toml): finished with status 'done' -Collecting pytest - Downloading pytest-9.1.1-py3-none-any.whl.metadata (7.6 kB) -Collecting moto<5.2.0,>=5.0.13 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading moto-5.1.22-py3-none-any.whl.metadata (12 kB) -Collecting dirty-equals - Downloading dirty_equals-0.11-py3-none-any.whl.metadata (5.7 kB) -Collecting pytest-xdist - Downloading pytest_xdist-3.8.0-py3-none-any.whl.metadata (3.0 kB) -Collecting requests_mock - Downloading requests_mock-1.12.1-py2.py3-none-any.whl.metadata (4.1 kB) -Collecting requests>=2.32.0 (from apex-algorithm-qa-tools==0.2.1) - Downloading requests-2.34.2-py3-none-any.whl.metadata (4.8 kB) -Requirement already satisfied: jsonschema>=4.0.0 in /usr/lib/python3/dist-packages (from apex-algorithm-qa-tools==0.2.1) (4.10.3) -Collecting openeo>=0.30.0 (from apex-algorithm-qa-tools==0.2.1) - Downloading openeo-0.51.0-py3-none-any.whl.metadata (8.9 kB) -Collecting boto3>=1.36.5 (from apex-algorithm-qa-tools==0.2.1) - Downloading boto3-1.43.62-py3-none-any.whl.metadata (6.6 kB) -Collecting pyarrow>=17.0.0 (from apex-algorithm-qa-tools==0.2.1) - Downloading pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (3.0 kB) -Collecting iniconfig>=1.0.1 (from pytest) - Downloading iniconfig-2.3.0-py3-none-any.whl.metadata (2.5 kB) -Requirement already satisfied: packaging>=22 in /usr/lib/python3/dist-packages (from pytest) (24.0) -Collecting pluggy<2,>=1.5 (from pytest) - Downloading pluggy-1.6.0-py3-none-any.whl.metadata (4.8 kB) -Requirement already satisfied: pygments>=2.7.2 in /usr/lib/python3/dist-packages (from pytest) (2.17.2) -Requirement already satisfied: botocore!=1.35.45,!=1.35.46,>=1.20.88 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (1.34.46) -Requirement already satisfied: cryptography>=35.0.0 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (41.0.7) -Collecting xmltodict (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) - Downloading xmltodict-1.0.4-py3-none-any.whl.metadata (14 kB) -Collecting werkzeug!=2.2.0,!=2.2.1,>=0.5 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) - Downloading werkzeug-3.1.8-py3-none-any.whl.metadata (4.0 kB) -Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (2.8.2) -Collecting responses!=0.25.5,>=0.15.0 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) - Downloading responses-0.26.2-py3-none-any.whl.metadata (48 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.4/48.4 kB 14.0 MB/s eta 0:00:00 -Requirement already satisfied: Jinja2>=2.10.1 in /usr/lib/python3/dist-packages (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (3.1.2) -Collecting execnet>=2.1 (from pytest-xdist) - Downloading execnet-2.1.2-py3-none-any.whl.metadata (2.9 kB) -Collecting antlr4-python3-runtime (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading antlr4_python3_runtime-4.13.2-py3-none-any.whl.metadata (304 bytes) -Collecting aws-sam-translator<=1.103.0 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading aws_sam_translator-1.103.0-py3-none-any.whl.metadata (8.6 kB) -Collecting joserfc>=0.9.0 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading joserfc-1.7.4-py3-none-any.whl.metadata (3.1 kB) -Collecting jsonpath_ng (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading jsonpath_ng-1.8.0-py3-none-any.whl.metadata (18 kB) -Collecting docker>=3.0.0 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading docker-7.2.0-py3-none-any.whl.metadata (3.8 kB) -Collecting graphql-core (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading graphql_core-3.2.11-py3-none-any.whl.metadata (11 kB) -Requirement already satisfied: PyYAML>=5.1 in /usr/lib/python3/dist-packages (from moto[s3,server]<5.2.0,>=5.0.13) (6.0.1) -Collecting cfn-lint<=1.41.0,>=0.40.0 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading cfn_lint-1.41.0-py3-none-any.whl.metadata (24 kB) -Collecting openapi-spec-validator>=0.5.0 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading openapi_spec_validator-0.9.0-py3-none-any.whl.metadata (6.5 kB) -Collecting pydantic<=2.12.4 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading pydantic-2.12.4-py3-none-any.whl.metadata (89 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 89.9/89.9 kB 14.1 MB/s eta 0:00:00 -Requirement already satisfied: pyparsing>=3.0.7 in /usr/lib/python3/dist-packages (from moto[s3,server]<5.2.0,>=5.0.13) (3.1.1) -Collecting py-partiql-parser==0.6.3 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading py_partiql_parser-0.6.3-py2.py3-none-any.whl.metadata (2.9 kB) -Collecting aws-xray-sdk!=0.96,>=0.93 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading aws_xray_sdk-2.15.0-py2.py3-none-any.whl.metadata (23 kB) -Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from moto[s3,server]<5.2.0,>=5.0.13) (68.1.2) -Collecting flask!=2.2.0,!=2.2.1 (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading flask-3.1.3-py3-none-any.whl.metadata (3.2 kB) -Collecting flask-cors (from moto[s3,server]<5.2.0,>=5.0.13) - Downloading flask_cors-6.0.5-py3-none-any.whl.metadata (5.4 kB) -Requirement already satisfied: typing_extensions>=4.4 in /usr/lib/python3/dist-packages (from aws-sam-translator<=1.103.0->moto[s3,server]<5.2.0,>=5.0.13) (4.10.0) -Collecting wrapt (from aws-xray-sdk!=0.96,>=0.93->moto[s3,server]<5.2.0,>=5.0.13) - Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (7.4 kB) -Collecting botocore!=1.35.45,!=1.35.46,>=1.20.88 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) - Downloading botocore-1.43.62-py3-none-any.whl.metadata (5.6 kB) -Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /usr/lib/python3/dist-packages (from boto3>=1.36.5->apex-algorithm-qa-tools==0.2.1) (1.0.1) -Collecting s3transfer<0.20.0,>=0.19.0 (from boto3>=1.36.5->apex-algorithm-qa-tools==0.2.1) - Downloading s3transfer-0.19.2-py3-none-any.whl.metadata (1.7 kB) -Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /usr/lib/python3/dist-packages (from botocore!=1.35.45,!=1.35.46,>=1.20.88->moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) (2.0.7) -Requirement already satisfied: jsonpatch in /usr/lib/python3/dist-packages (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) (1.32) -Collecting networkx<4,>=2.4 (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading networkx-3.6.1-py3-none-any.whl.metadata (6.8 kB) -Collecting sympy>=1.0.0 (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading sympy-1.14.0-py3-none-any.whl.metadata (12 kB) -Collecting regex (from cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (40 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.5/40.5 kB 15.5 MB/s eta 0:00:00 -Collecting blinker>=1.9.0 (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) - Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB) -Requirement already satisfied: click>=8.1.3 in /usr/lib/python3/dist-packages (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) (8.1.6) -Collecting itsdangerous>=2.2.0 (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) - Downloading itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB) -Requirement already satisfied: markupsafe>=2.1.1 in /usr/lib/python3/dist-packages (from flask!=2.2.0,!=2.2.1->moto[s3,server]<5.2.0,>=5.0.13) (2.1.5) -Collecting cryptography>=35.0.0 (from moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) - Downloading cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl.metadata (4.3 kB) -Collecting cffi>=2.0.0 (from cryptography>=35.0.0->moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) - Downloading cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.5 kB) -Requirement already satisfied: attrs>=17.4.0 in /usr/lib/python3/dist-packages (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) (23.2.0) -Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/lib/python3/dist-packages (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) (0.20.0) -Collecting jsonschema>=4.0.0 (from apex-algorithm-qa-tools==0.2.1) - Downloading jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB) -Collecting jsonschema-path<0.6.0,>=0.5.0 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading jsonschema_path-0.5.0-py3-none-any.whl.metadata (8.1 kB) -Collecting lazy-object-proxy<2.0,>=1.7.1 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading lazy_object_proxy-1.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (5.1 kB) -Collecting openapi-schema-validator<0.10.0,>=0.9.0 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading openapi_schema_validator-0.9.0-py3-none-any.whl.metadata (10 kB) -Collecting pydantic-settings<3.0.0,>=2.0.0 (from openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading pydantic_settings-2.14.2-py3-none-any.whl.metadata (3.4 kB) -Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) - Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB) -Collecting referencing>=0.28.4 (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) - Downloading referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB) -Collecting rpds-py>=0.25.0 (from jsonschema>=4.0.0->apex-algorithm-qa-tools==0.2.1) - Downloading rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB) -Collecting shapely>=1.6.4 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (6.8 kB) -Collecting numpy>=1.17.0 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (6.6 kB) -Collecting xarray<2025.01.2,>=0.12.3 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading xarray-2025.1.1-py3-none-any.whl.metadata (11 kB) -Collecting pandas<3.0.0,>0.20.0 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (91 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 91.2/91.2 kB 28.0 MB/s eta 0:00:00 -Collecting pystac>=1.5.0 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac-1.15.2-py3-none-any.whl.metadata (6.3 kB) -Collecting deprecated>=1.2.12 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading deprecated-1.3.1-py2.py3-none-any.whl.metadata (5.9 kB) -Collecting geopandas>=0.14 (from openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading geopandas-1.1.4-py3-none-any.whl.metadata (2.3 kB) -Collecting annotated-types>=0.6.0 (from pydantic<=2.12.4->moto[s3,server]<5.2.0,>=5.0.13) - Downloading annotated_types-0.8.0-py3-none-any.whl.metadata (15 kB) -Collecting pydantic-core==2.41.5 (from pydantic<=2.12.4->moto[s3,server]<5.2.0,>=5.0.13) - Downloading pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.3 kB) -Collecting typing_extensions>=4.4 (from aws-sam-translator<=1.103.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading typing_extensions-4.16.0-py3-none-any.whl.metadata (3.3 kB) -Collecting typing-inspection>=0.4.2 (from pydantic<=2.12.4->moto[s3,server]<5.2.0,>=5.0.13) - Downloading typing_inspection-0.4.2-py3-none-any.whl.metadata (2.6 kB) -Collecting charset_normalizer<4,>=2 (from requests>=2.32.0->apex-algorithm-qa-tools==0.2.1) - Downloading charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (41 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.7/41.7 kB 15.9 MB/s eta 0:00:00 -Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3/dist-packages (from requests>=2.32.0->apex-algorithm-qa-tools==0.2.1) (3.6) -Requirement already satisfied: certifi>=2023.5.7 in /usr/lib/python3/dist-packages (from requests>=2.32.0->apex-algorithm-qa-tools==0.2.1) (2023.11.17) -Collecting pycparser (from cffi>=2.0.0->cryptography>=35.0.0->moto<5.2.0,>=5.0.13->moto[s3,server]<5.2.0,>=5.0.13) - Downloading pycparser-3.0-py3-none-any.whl.metadata (8.2 kB) -Collecting pyogrio>=0.7.2 (from geopandas>=0.14->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pyogrio-0.13.0-cp311-abi3-manylinux_2_28_x86_64.whl.metadata (5.8 kB) -Collecting pyproj>=3.5.0 (from geopandas>=0.14->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pyproj-3.7.2-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (31 kB) -Collecting pathable<0.7.0,>=0.6.0 (from jsonschema-path<0.6.0,>=0.5.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading pathable-0.6.0-py3-none-any.whl.metadata (7.2 kB) -Collecting rfc3339-validator (from openapi-schema-validator<0.10.0,>=0.9.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading rfc3339_validator-0.1.4-py2.py3-none-any.whl.metadata (1.5 kB) -Requirement already satisfied: pytz>=2020.1 in /usr/lib/python3/dist-packages (from pandas<3.0.0,>0.20.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) (2024.1) -Collecting tzdata>=2022.7 (from pandas<3.0.0,>0.20.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading tzdata-2026.3-py2.py3-none-any.whl.metadata (1.4 kB) -Collecting python-dotenv>=0.21.0 (from pydantic-settings<3.0.0,>=2.0.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading python_dotenv-1.2.2-py3-none-any.whl.metadata (27 kB) -Collecting pystac-core<2,>=1.15.0 (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_core-1.15.2-py3-none-any.whl.metadata (1.3 kB) -Collecting pystac-ext-classification (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_classification-2.0.0-py3-none-any.whl.metadata (2.1 kB) -Collecting pystac-ext-datacube (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_datacube-2.2.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-eo (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_eo-1.1.0-py3-none-any.whl.metadata (1.9 kB) -Collecting pystac-ext-file (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_file-2.1.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-grid (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_grid-1.1.0-py3-none-any.whl.metadata (1.9 kB) -Collecting pystac-ext-item-assets (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_item_assets-1.0.0-py3-none-any.whl.metadata (1.9 kB) -Collecting pystac-ext-label (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_label-1.0.1-py3-none-any.whl.metadata (1.9 kB) -Collecting pystac-ext-mgrs (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_mgrs-1.0.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-mlm (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_mlm-1.4.0-py3-none-any.whl.metadata (2.1 kB) -Collecting pystac-ext-pointcloud (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_pointcloud-1.0.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-projection (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_projection-2.0.0-py3-none-any.whl.metadata (2.1 kB) -Collecting pystac-ext-raster (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_raster-1.1.0-py3-none-any.whl.metadata (1.9 kB) -Collecting pystac-ext-render (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_render-2.0.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-sar (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_sar-1.0.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-sat (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_sat-1.0.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-scientific (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_scientific-1.0.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-storage (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_storage-2.0.0-py3-none-any.whl.metadata (1.9 kB) -Collecting pystac-ext-table (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_table-1.2.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-timestamps (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_timestamps-1.1.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-version (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_version-1.2.0-py3-none-any.whl.metadata (1.9 kB) -Collecting pystac-ext-view (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_view-1.0.0-py3-none-any.whl.metadata (1.8 kB) -Collecting pystac-ext-xarray-assets (from pystac>=1.5.0->openeo>=0.30.0->apex-algorithm-qa-tools==0.2.1) - Downloading pystac_ext_xarray_assets-1.0.0-py3-none-any.whl.metadata (1.9 kB) -Collecting mpmath<1.4,>=1.1.0 (from sympy>=1.0.0->cfn-lint<=1.41.0,>=0.40.0->moto[s3,server]<5.2.0,>=5.0.13) - Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB) -Requirement already satisfied: six in /usr/lib/python3/dist-packages (from rfc3339-validator->openapi-schema-validator<0.10.0,>=0.9.0->openapi-spec-validator>=0.5.0->moto[s3,server]<5.2.0,>=5.0.13) (1.16.0) -Downloading pytest-9.1.1-py3-none-any.whl (386 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 386.5/386.5 kB 10.6 MB/s eta 0:00:00 -Downloading moto-5.1.22-py3-none-any.whl (6.6 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.6/6.6 MB 54.5 MB/s eta 0:00:00 -Downloading dirty_equals-0.11-py3-none-any.whl (28 kB) -Downloading pytest_xdist-3.8.0-py3-none-any.whl (46 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 46.4/46.4 kB 16.3 MB/s eta 0:00:00 -Downloading requests_mock-1.12.1-py2.py3-none-any.whl (27 kB) -Downloading py_partiql_parser-0.6.3-py2.py3-none-any.whl (23 kB) -Downloading aws_sam_translator-1.103.0-py3-none-any.whl (403 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 403.1/403.1 kB 98.0 MB/s eta 0:00:00 -Downloading aws_xray_sdk-2.15.0-py2.py3-none-any.whl (103 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.2/103.2 kB 38.4 MB/s eta 0:00:00 -Downloading boto3-1.43.62-py3-none-any.whl (140 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 140.0/140.0 kB 53.5 MB/s eta 0:00:00 -Downloading botocore-1.43.62-py3-none-any.whl (15.5 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.5/15.5 MB 143.5 MB/s eta 0:00:00 -Downloading cfn_lint-1.41.0-py3-none-any.whl (5.7 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.7/5.7 MB 158.7 MB/s eta 0:00:00 -Downloading docker-7.2.0-py3-none-any.whl (148 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 148.8/148.8 kB 49.6 MB/s eta 0:00:00 -Downloading execnet-2.1.2-py3-none-any.whl (40 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.7/40.7 kB 13.5 MB/s eta 0:00:00 -Downloading flask-3.1.3-py3-none-any.whl (103 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.4/103.4 kB 36.4 MB/s eta 0:00:00 -Downloading iniconfig-2.3.0-py3-none-any.whl (7.5 kB) -Downloading joserfc-1.7.4-py3-none-any.whl (71 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.0/71.0 kB 25.5 MB/s eta 0:00:00 -Downloading cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl (4.7 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.7/4.7 MB 174.3 MB/s eta 0:00:00 -Downloading openapi_spec_validator-0.9.0-py3-none-any.whl (50 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.3/50.3 kB 19.2 MB/s eta 0:00:00 -Downloading jsonschema-4.26.0-py3-none-any.whl (90 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.6/90.6 kB 34.5 MB/s eta 0:00:00 -Downloading openeo-0.51.0-py3-none-any.whl (349 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 349.2/349.2 kB 96.4 MB/s eta 0:00:00 -Downloading pluggy-1.6.0-py3-none-any.whl (20 kB) -Downloading pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl (50.1 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.1/50.1 MB 99.7 MB/s eta 0:00:00 -Downloading pydantic-2.12.4-py3-none-any.whl (463 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 463.4/463.4 kB 113.7 MB/s eta 0:00:00 -Downloading pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 163.8 MB/s eta 0:00:00 -Downloading requests-2.34.2-py3-none-any.whl (73 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 73.1/73.1 kB 30.4 MB/s eta 0:00:00 -Downloading responses-0.26.2-py3-none-any.whl (35 kB) -Downloading werkzeug-3.1.8-py3-none-any.whl (226 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 226.5/226.5 kB 74.5 MB/s eta 0:00:00 -Downloading antlr4_python3_runtime-4.13.2-py3-none-any.whl (144 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 144.5/144.5 kB 53.3 MB/s eta 0:00:00 -Downloading flask_cors-6.0.5-py3-none-any.whl (16 kB) -Downloading graphql_core-3.2.11-py3-none-any.whl (214 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 214.9/214.9 kB 73.8 MB/s eta 0:00:00 -Downloading jsonpath_ng-1.8.0-py3-none-any.whl (67 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 67.8/67.8 kB 29.0 MB/s eta 0:00:00 -Downloading xmltodict-1.0.4-py3-none-any.whl (13 kB) -Downloading annotated_types-0.8.0-py3-none-any.whl (13 kB) -Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB) -Downloading cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (221 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 221.8/221.8 kB 77.6 MB/s eta 0:00:00 -Downloading charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (224 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 224.3/224.3 kB 72.7 MB/s eta 0:00:00 -Downloading deprecated-1.3.1-py2.py3-none-any.whl (11 kB) -Downloading geopandas-1.1.4-py3-none-any.whl (343 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 343.3/343.3 kB 95.5 MB/s eta 0:00:00 -Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB) -Downloading jsonschema_path-0.5.0-py3-none-any.whl (24 kB) -Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB) -Downloading lazy_object_proxy-1.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (71 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.5/71.5 kB 29.4 MB/s eta 0:00:00 -Downloading networkx-3.6.1-py3-none-any.whl (2.1 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 165.3 MB/s eta 0:00:00 -Downloading numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (16.7 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.7/16.7 MB 135.4 MB/s eta 0:00:00 -Downloading openapi_schema_validator-0.9.0-py3-none-any.whl (19 kB) -Downloading pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (12.4 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.4/12.4 MB 168.4 MB/s eta 0:00:00 -Downloading pydantic_settings-2.14.2-py3-none-any.whl (61 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.7/61.7 kB 26.6 MB/s eta 0:00:00 -Downloading pystac-1.15.2-py3-none-any.whl (5.7 kB) -Downloading referencing-0.37.0-py3-none-any.whl (26 kB) -Downloading rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (366 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 366.2/366.2 kB 100.6 MB/s eta 0:00:00 -Downloading s3transfer-0.19.2-py3-none-any.whl (90 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.2/90.2 kB 38.0 MB/s eta 0:00:00 -Downloading shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (3.1 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.1/3.1 MB 163.1 MB/s eta 0:00:00 -Downloading sympy-1.14.0-py3-none-any.whl (6.3 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.3/6.3 MB 168.8 MB/s eta 0:00:00 -Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 45.6/45.6 kB 18.1 MB/s eta 0:00:00 -Downloading typing_inspection-0.4.2-py3-none-any.whl (14 kB) -Downloading wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (172 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 172.4/172.4 kB 66.1 MB/s eta 0:00:00 -Downloading xarray-2025.1.1-py3-none-any.whl (1.2 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 144.1 MB/s eta 0:00:00 -Downloading regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (801 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 801.8/801.8 kB 144.8 MB/s eta 0:00:00 -Downloading mpmath-1.3.0-py3-none-any.whl (536 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 135.2 MB/s eta 0:00:00 -Downloading pathable-0.6.0-py3-none-any.whl (18 kB) -Downloading pyogrio-0.13.0-cp311-abi3-manylinux_2_28_x86_64.whl (33.3 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 33.3/33.3 MB 118.2 MB/s eta 0:00:00 -Downloading pyproj-3.7.2-cp312-cp312-manylinux_2_28_x86_64.whl (9.6 MB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.6/9.6 MB 153.8 MB/s eta 0:00:00 -Downloading pystac_core-1.15.2-py3-none-any.whl (117 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 117.3/117.3 kB 46.5 MB/s eta 0:00:00 -Downloading python_dotenv-1.2.2-py3-none-any.whl (22 kB) -Downloading tzdata-2026.3-py2.py3-none-any.whl (348 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 348.2/348.2 kB 99.7 MB/s eta 0:00:00 -Downloading pycparser-3.0-py3-none-any.whl (48 kB) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.2/48.2 kB 20.3 MB/s eta 0:00:00 -Downloading pystac_ext_classification-2.0.0-py3-none-any.whl (7.0 kB) -Downloading pystac_ext_datacube-2.2.0-py3-none-any.whl (6.8 kB) -Downloading pystac_ext_eo-1.1.0-py3-none-any.whl (7.4 kB) -Downloading pystac_ext_file-2.1.0-py3-none-any.whl (5.5 kB) -Downloading pystac_ext_grid-1.1.0-py3-none-any.whl (3.3 kB) -Downloading pystac_ext_item_assets-1.0.0-py3-none-any.whl (3.4 kB) -Downloading pystac_ext_label-1.0.1-py3-none-any.whl (7.9 kB) -Downloading pystac_ext_mgrs-1.0.0-py3-none-any.whl (3.8 kB) -Downloading pystac_ext_mlm-1.4.0-py3-none-any.whl (13 kB) -Downloading pystac_ext_pointcloud-1.0.0-py3-none-any.whl (6.2 kB) -Downloading pystac_ext_projection-2.0.0-py3-none-any.whl (7.1 kB) -Downloading pystac_ext_raster-1.1.0-py3-none-any.whl (6.6 kB) -Downloading pystac_ext_render-2.0.0-py3-none-any.whl (5.0 kB) -Downloading pystac_ext_sar-1.0.0-py3-none-any.whl (6.3 kB) -Downloading pystac_ext_sat-1.0.0-py3-none-any.whl (4.6 kB) -Downloading pystac_ext_scientific-1.0.0-py3-none-any.whl (5.2 kB) -Downloading pystac_ext_storage-2.0.0-py3-none-any.whl (7.4 kB) -Downloading pystac_ext_table-1.2.0-py3-none-any.whl (4.4 kB) -Downloading pystac_ext_timestamps-1.1.0-py3-none-any.whl (4.3 kB) -Downloading pystac_ext_version-1.2.0-py3-none-any.whl (5.4 kB) -Downloading pystac_ext_view-1.0.0-py3-none-any.whl (4.5 kB) -Downloading pystac_ext_xarray_assets-1.0.0-py3-none-any.whl (3.6 kB) -Downloading rfc3339_validator-0.1.4-py2.py3-none-any.whl (3.5 kB) -Building wheels for collected packages: apex-algorithm-qa-tools - Building wheel for apex-algorithm-qa-tools (pyproject.toml): started - Building wheel for apex-algorithm-qa-tools (pyproject.toml): finished with status 'done' - Created wheel for apex-algorithm-qa-tools: filename=apex_algorithm_qa_tools-0.2.1-py3-none-any.whl size=28462 sha256=9cde0307ccc0d39547a681ad57735c3cc3af43313bc9848080b1db25388fc31e - Stored in directory: /tmp/pip-ephem-wheel-cache-itsr1phw/wheels/9f/67/ca/d1a0094ed57cb6af62cd6bffda8c7257c3d0e0755cdc8f535e -Successfully built apex-algorithm-qa-tools -Installing collected packages: py-partiql-parser, mpmath, jsonpath_ng, antlr4-python3-runtime, xmltodict, wrapt, werkzeug, tzdata, typing_extensions, sympy, rpds-py, rfc3339-validator, regex, python-dotenv, pystac-core, pyproj, pycparser, pyarrow, pluggy, pathable, numpy, networkx, lazy-object-proxy, itsdangerous, iniconfig, graphql-core, execnet, dirty-equals, charset_normalizer, botocore, blinker, annotated-types, typing-inspection, shapely, s3transfer, requests, referencing, pytest, pystac-ext-xarray-assets, pystac-ext-view, pystac-ext-version, pystac-ext-timestamps, pystac-ext-table, pystac-ext-storage, pystac-ext-scientific, pystac-ext-sat, pystac-ext-sar, pystac-ext-render, pystac-ext-raster, pystac-ext-projection, pystac-ext-pointcloud, pystac-ext-mlm, pystac-ext-mgrs, pystac-ext-label, pystac-ext-item-assets, pystac-ext-grid, pystac-ext-file, pystac-ext-eo, pystac-ext-datacube, pystac-ext-classification, pyogrio, pydantic-core, pandas, flask, deprecated, cffi, aws-xray-sdk, xarray, responses, requests_mock, pytest-xdist, pystac, pydantic, jsonschema-specifications, jsonschema-path, geopandas, flask-cors, docker, cryptography, boto3, pydantic-settings, openeo, moto, jsonschema, joserfc, openapi-schema-validator, aws-sam-translator, apex-algorithm-qa-tools, openapi-spec-validator, cfn-lint -Successfully installed annotated-types-0.8.0 antlr4-python3-runtime-4.13.2 apex-algorithm-qa-tools-0.2.1 aws-sam-translator-1.103.0 aws-xray-sdk-2.15.0 blinker-1.9.0 boto3-1.43.62 botocore-1.43.62 cffi-2.1.0 cfn-lint-1.41.0 charset_normalizer-3.4.9 cryptography-50.0.0 deprecated-1.3.1 dirty-equals-0.11 docker-7.2.0 execnet-2.1.2 flask-3.1.3 flask-cors-6.0.5 geopandas-1.1.4 graphql-core-3.2.11 iniconfig-2.3.0 itsdangerous-2.2.0 joserfc-1.7.4 jsonpath_ng-1.8.0 jsonschema-4.26.0 jsonschema-path-0.5.0 jsonschema-specifications-2025.9.1 lazy-object-proxy-1.12.0 moto-5.1.22 mpmath-1.3.0 networkx-3.6.1 numpy-2.5.1 openapi-schema-validator-0.9.0 openapi-spec-validator-0.9.0 openeo-0.51.0 pandas-2.3.3 pathable-0.6.0 pluggy-1.6.0 py-partiql-parser-0.6.3 pyarrow-25.0.0 pycparser-3.0 pydantic-2.12.4 pydantic-core-2.41.5 pydantic-settings-2.14.2 pyogrio-0.13.0 pyproj-3.7.2 pystac-1.15.2 pystac-core-1.15.2 pystac-ext-classification-2.0.0 pystac-ext-datacube-2.2.0 pystac-ext-eo-1.1.0 pystac-ext-file-2.1.0 pystac-ext-grid-1.1.0 pystac-ext-item-assets-1.0.0 pystac-ext-label-1.0.1 pystac-ext-mgrs-1.0.0 pystac-ext-mlm-1.4.0 pystac-ext-pointcloud-1.0.0 pystac-ext-projection-2.0.0 pystac-ext-raster-1.1.0 pystac-ext-render-2.0.0 pystac-ext-sar-1.0.0 pystac-ext-sat-1.0.0 pystac-ext-scientific-1.0.0 pystac-ext-storage-2.0.0 pystac-ext-table-1.2.0 pystac-ext-timestamps-1.1.0 pystac-ext-version-1.2.0 pystac-ext-view-1.0.0 pystac-ext-xarray-assets-1.0.0 pytest-9.1.1 pytest-xdist-3.8.0 python-dotenv-1.2.2 referencing-0.37.0 regex-2026.7.19 requests-2.34.2 requests_mock-1.12.1 responses-0.26.2 rfc3339-validator-0.1.4 rpds-py-2026.6.3 s3transfer-0.19.2 shapely-2.1.2 sympy-1.14.0 typing-inspection-0.4.2 typing_extensions-4.16.0 tzdata-2026.3 werkzeug-3.1.8 wrapt-2.3.0 xarray-2025.1.1 xmltodict-1.0.4 diff --git a/=3.5.0 b/=3.5.0 deleted file mode 100644 index e69de29bb..000000000 diff --git a/=8.2.0 b/=8.2.0 deleted file mode 100644 index e69de29bb..000000000 From 85b9eff1104d67064a3017d26aa7550becddd727 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:49:23 +0000 Subject: [PATCH 4/4] Remove validation status and rely on ESA review metadata --- .../records/worldcereal_crop_extent.json | 1 - .../records/worldcereal_crop_type.json | 1 - docs/catalogue.md | 10 ++--- qa/unittests/tests/test_records.py | 18 ++++---- schemas/record.json | 45 ++++--------------- 5 files changed, 22 insertions(+), 53 deletions(-) diff --git a/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json b/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json index cf402f42f..0596357e4 100644 --- a/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json +++ b/algorithm_catalog/vito/worldcereal_crop_extent/records/worldcereal_crop_extent.json @@ -91,7 +91,6 @@ ], "license": "other", "validation": { - "status": "accepted", "document": { "href": "https://doi.org/10.1038/s43016-023-00841-7", "reviewed_by": "ESA", diff --git a/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json b/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json index d1b9b74d1..e0b2d5c82 100644 --- a/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json +++ b/algorithm_catalog/vito/worldcereal_crop_type/records/worldcereal_crop_type.json @@ -89,7 +89,6 @@ ], "license": "other", "validation": { - "status": "accepted", "document": { "href": "https://doi.org/10.1038/s43016-023-00841-7", "reviewed_by": "ESA", diff --git a/docs/catalogue.md b/docs/catalogue.md index 4ef2c3a50..c09a9576f 100644 --- a/docs/catalogue.md +++ b/docs/catalogue.md @@ -65,18 +65,16 @@ Use `properties.validation` when a validation document exists: ```json "validation": { - "status": "pending", "document": { "href": "https://.../validation-report.pdf" } } ``` -When ESA has reviewed and accepted the validation document, set `status` to `accepted` and include ESA review metadata: +When ESA has reviewed and accepted the validation document, include ESA review metadata: ```json "validation": { - "status": "accepted", "document": { "href": "https://.../validation-report.pdf", "reviewed_by": "ESA", @@ -87,14 +85,14 @@ When ESA has reviewed and accepted the validation document, set `status` to `acc A service can only be considered **ESA-validated** when: -1. `properties.validation.status` is `accepted` with `document.reviewed_by = "ESA"`, and +1. `properties.validation.document.reviewed_by = "ESA"` with `document.review_date`, and 2. at least one benchmark scenario JSON file exists in the service's `benchmark_scenarios/` folder. Suggested review flow: -1. Algorithm PI adds `validation.status = "pending"` and the validation document URL. +1. Algorithm PI adds the validation document URL in `validation.document.href`. 2. ESA reviewer verifies the document and benchmark readiness. -3. ESA reviewer updates the record to `status = "accepted"` and sets `reviewed_by` and `review_date`. +3. ESA reviewer updates the record with `reviewed_by` and `review_date`. ## Services Overview diff --git a/qa/unittests/tests/test_records.py b/qa/unittests/tests/test_records.py index 030d73ba1..9abf7a48f 100644 --- a/qa/unittests/tests/test_records.py +++ b/qa/unittests/tests/test_records.py @@ -100,13 +100,17 @@ def _has_benchmark_scenarios(record_path: str) -> bool: [ pytest.param(record, id=record["data"]["id"]) for record in get_service_ogc_records() - if record["data"].get("properties", {}).get("validation", {}).get("status") - == "accepted" + if record["data"] + .get("properties", {}) + .get("validation", {}) + .get("document", {}) + .get("reviewed_by") + == "ESA" ], ) -def test_service_record_with_accepted_validation_requires_benchmark_scenarios(record): +def test_service_record_with_esa_reviewed_validation_requires_benchmark_scenarios(record): assert _has_benchmark_scenarios(record["path"]), ( - f"Service '{record['data']['id']}' has validation.status='accepted' but no benchmark scenario files in " + f"Service '{record['data']['id']}' has ESA-reviewed validation metadata but no benchmark scenario files in " f"{Path(record['path']).parent.parent / 'benchmark_scenarios'}" ) @@ -114,17 +118,15 @@ def test_service_record_with_accepted_validation_requires_benchmark_scenarios(re @pytest.mark.parametrize( "invalid_validation", [ - {"status": "accepted"}, - {"status": "accepted", "document": {"href": "https://example.com/validation-report.pdf"}}, { - "status": "accepted", "document": { "href": "https://example.com/validation-report.pdf", "reviewed_by": "Other", "review_date": "2025-01-01", }, }, - {"status": "reviewed", "document": {"href": "https://example.com/validation-report.pdf"}}, + {"document": {"href": "https://example.com/validation-report.pdf", "reviewed_by": "ESA"}}, + {"document": {"href": "https://example.com/validation-report.pdf", "review_date": "2025-01-01"}}, ], ) def test_service_record_validation_rejects_malformed_validation_metadata( diff --git a/schemas/record.json b/schemas/record.json index 6c1166087..e3424ef4b 100644 --- a/schemas/record.json +++ b/schemas/record.json @@ -422,20 +422,11 @@ }, "validation": { "type": "object", - "description": "Optional metadata describing the validation document status for this service.", + "description": "Optional metadata describing the validation document for this service.", "required": [ - "status", "document" ], "properties": { - "status": { - "type": "string", - "description": "Validation review status used for certification derivation.", - "enum": [ - "pending", - "accepted" - ] - }, "document": { "type": "object", "description": "Reference to the validation document.", @@ -460,37 +451,17 @@ "format": "date", "description": "Date on which the validation document was accepted." } - } - } - }, - "allOf": [ - { - "if": { - "properties": { - "status": { - "const": "accepted" - } - }, - "required": [ - "status" - ] }, - "then": { - "properties": { - "document": { - "required": [ - "href", - "reviewed_by", - "review_date" - ] - } - }, - "required": [ - "document" + "dependentRequired": { + "reviewed_by": [ + "review_date" + ], + "review_date": [ + "reviewed_by" ] } } - ] + } } } },