Skip to content

fix(queryables): required parameters, defaults and allowed combinations#2148

Merged
sbrunato merged 8 commits into
developfrom
fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS
Jul 10, 2026
Merged

fix(queryables): required parameters, defaults and allowed combinations#2148
sbrunato merged 8 commits into
developfrom
fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS

Conversation

@dalpasso

@dalpasso dalpasso commented Apr 14, 2026

Copy link
Copy Markdown
Collaborator

This PR is fixing how the queryables are calculated from provider form file.

Queryables available values

If no constraint is matching a given parameter, then look at the form file:

  • if the keyword is required by the form but does not match any combination with associated parameters, then do not show it as queryable
  • if the keyword is not required by form, then any value is accepted for it.

In the latter case, there may be no constraint at all containing that keyword because any value is anyway accepted.

Queryables by form

  • the default value is set with the following priority:
    • input default values > form details default value > no default value
  • a parameter is not allowed and excluded from the queryables if the following conditions are true:
    • the keyword is required by form;
    • the keyword is used by some constraint;
    • the list of available values is empty.

Test

from eodag import EODataAccessGateway
from eodag.utils.exceptions import ValidationError
from typing import get_args

dag = EODataAccessGateway()

# --------------------------------------------------------------------------------------------------
# 1. Parameter is required but does not match allowed combinations with given associated parameters

# parameter 'level' should be required for given collection
queryables = dag.list_queryables(
    provider="cop_cds", collection="CMIP6_CLIMATE_PROJECTIONS"
)
assert get_args(queryables["ecmwf_level"])[1].is_required(), "'level' should be required"

# check that 'level' is not queryable with these parameters
params = {
    "provider": "cop_cds",
    "collection": "CMIP6_CLIMATE_PROJECTIONS",
    "experiment": "ssp2_4_5",
    "model": "access_cm2",
    "month": ["01"],
    "temporal_resolution": "monthly",
    "variable": "near_surface_air_temperature",
    "year": ["2023"],
}
queryables = dag.list_queryables(**params)
assert "ecmwf_level" not in queryables, "'level' should not be queryable"

# validatation should fail if we search with 'level' parameter
try:
    dag.search(**params, level=["1"], raise_errors=True)
except ValidationError as e:
    # expected because 'level' is not queryable
    assert "cannot be used with this combination of parameters" in str(
        e
    ), "Unexpected error message: {}".format(e)
else:
    raise AssertionError("Search should have failed because 'level' is not queryable")

# must succeed without 'level' parameter
dag.search(**params, raise_errors=True)

# --------------------------------------------------------------------------------------------------
# 2. Parameters are not required, so any value should be accepted

# must succeed: `pressure_level` and `model_level` are not required by form: any value is accepted
# note: the constraint file doesn't contain any constraint matching *all* these parameters,
# but this is fine cause any value is accepted
params = {
    "provider": "cop_ads",
    "collection": "CAMS_GAC_FORECAST",
    "variable": ["ammonium_aerosol_mass_mixing_ratio"],
    "pressure_level": ["1"],
    "model_level": ["1"],
    "date": "2025-12-11/2025-12-11",
    "time": ["00:00"],
    "leadtime_hour": ["0"],
    "type": ["forecast"],
    "data_format": "grib",
    "area": [42, 10, 40, 12],
}
dag.search(**params, raise_errors=True)

@github-actions

github-actions Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Test Results

    4 files  ± 0      4 suites  ±0   4m 10s ⏱️ -3s
  839 tests +21    839 ✅ +21  0 💤 ±0  0 ❌ ±0 
3 406 runs  +84  3 404 ✅ +84  2 💤 ±0  0 ❌ ±0 

Results for commit b55eaa7. ± Comparison against base commit e0d1058.

This pull request removes 2 and adds 23 tests. Note that renamed tests count towards both.
tests.units.test_search_plugins.TestSearchPluginStacSearch ‑ test_plugins_search_stacsearch_missing_results_entry_misconfigured
tests.units.test_search_plugins.TestSearchPluginStacSearch ‑ test_plugins_search_stacsearch_missing_results_entry_reraises_for_known_plugin
tests.test_init.TestEodagInit ‑ test_eodag_config_ext_collections_conf_uri_accessible
tests.test_init.TestEodagInit ‑ test_eodag_config_module_accessible_in_fresh_interpreter
tests.test_init.TestEodagInit ‑ test_eodag_lazy_imports_still_work
tests.units.test_core.TestCoreConfWithEnvVar ‑ test_core_object_prioritize_providers_dir_in_envvar
tests.units.test_metadata_mapping.TestMetadataFormatter ‑ test_convert_dict_filter_and_sub
tests.units.test_metadata_mapping.TestMetadataFormatter ‑ test_convert_dict_filter_and_sub_no_match
tests.units.test_metadata_mapping.TestMetadataFormatter ‑ test_convert_dict_filter_multiple_matches
tests.units.test_metadata_mapping.TestMetadataFormatter ‑ test_convert_dict_filter_no_match
tests.units.test_metadata_mapping.TestMetadataFormatter ‑ test_convert_dict_filter_with_non_dict_input
tests.units.test_metadata_mapping.TestMetadataFormatter ‑ test_convert_split
…

♻️ This comment has been updated with latest results.

@eodag-bot

eodag-bot commented Apr 14, 2026

Copy link
Copy Markdown
Collaborator

badge

Code Coverage (Ubuntu)

Details
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         252      17  93.25%   105-116, 378, 610-622, 645
config.py                                      306      24  92.16%   70-72, 75, 78, 81, 85, 89, 93-95, 587-589, 711-713, 732, 740, 770-775, 777
crunch.py                                        2       0  100.00%
api/__init__.py                                  0       0  100.00%
api/collection.py                              151       8  94.70%   177, 213, 216, 323, 362, 365, 383, 386
api/core.py                                    774      60  92.25%   263, 549, 597, 640, 680, 700, 741-746, 771, 855-874, 888, 955-962, 1047, 1052, 1151, 1190-1191, 1287-1288, 1314, 1345-1346, 1372, 1385, 1446-1447, 1478-1479, 1555, 1570-1573, 1685, 1910, 2067, 2169-2178, 2266-2267
api/provider.py                                382      40  89.53%   186, 190-191, 316-337, 405, 521, 525-526, 531-534, 545, 621-631, 821-822, 870, 877, 891, 914-917, 951-958, 962-963
api/search_result.py                           138      16  88.41%   111, 123, 133, 154, 208, 219, 266, 278, 407, 413, 463-471
api/product/__init__.py                          7       0  100.00%
api/product/_assets.py                          56       4  92.86%   101, 195, 206-210
api/product/_product.py                        311      27  91.32%   200, 355-356, 382-385, 422, 441-442, 551, 580, 587, 626, 738, 781-784, 793-796, 850, 916, 928, 963, 992, 995
api/product/metadata_mapping.py                867      61  92.96%   125-127, 222-227, 251, 310-311, 349-350, 391, 412, 475-476, 513, 534-537, 560, 572-573, 614, 637, 662-665, 667-672, 737-742, 751, 757, 773, 781, 1012, 1165, 1187, 1196-1200, 1217-1222, 1355, 1378, 1387, 1409, 1414, 1466, 1538, 1559, 1585, 1599, 1624, 1670, 1739, 1814, 1848
api/product/drivers/__init__.py                 11       0  100.00%
api/product/drivers/base.py                     32       0  100.00%
api/product/drivers/generic.py                  11       0  100.00%
api/product/drivers/sentinel1.py                33       0  100.00%
api/product/drivers/sentinel2.py                33       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 25       2  92.00%   48, 55
plugins/manager.py                             173      15  91.33%   102-107, 179, 201, 219-220, 232, 272, 372-375, 387-388
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           95       8  91.58%   163-165, 213-214, 240-242
plugins/apis/usgs.py                           175      25  85.71%   158, 246, 279, 321-323, 328, 356-357, 362, 392-399, 410-415, 437-443
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py             124      35  71.77%   52-54, 69-70, 142-149, 177-203, 226, 258-262, 279, 303, 319-320
plugins/authentication/base.py                  22       4  81.82%   45, 58, 81, 95
plugins/authentication/eoiam.py                 98       1  98.98%   170
plugins/authentication/generic.py               16       3  81.25%   50, 55, 65
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       7  84.78%   153-156, 177-182
plugins/authentication/openid_connect.py       235      28  88.09%   98-99, 107-125, 172, 178-206, 214, 353-356, 382, 423
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              57       3  94.74%   68, 89, 135
plugins/authentication/token.py                141       9  93.62%   192, 229, 309-310, 358-362
plugins/authentication/token_exchange.py        36      16  55.56%   75, 91-121
plugins/crunch/__init__.py                       6       0  100.00%
plugins/crunch/base.py                          12       0  100.00%
plugins/crunch/filter_date.py                   47       0  100.00%
plugins/crunch/filter_latest_intersect.py       52       6  88.46%   87-88, 95-96, 98-102
plugins/crunch/filter_latest_tpl_name.py        35       0  100.00%
plugins/crunch/filter_overlap.py                66      10  84.85%   118-121, 137-163
plugins/crunch/filter_property.py               30       0  100.00%
plugins/download/__init__.py                     4       0  100.00%
plugins/download/aws.py                        402      76  81.09%   271, 305, 354-357, 387-388, 396-400, 480-483, 523-525, 529, 560-561, 567-571, 602, 667-675, 739-834, 846-851, 889, 915, 960-962, 1014
plugins/download/base.py                       290      26  91.03%   135, 165, 381-382, 426, 460, 537-541, 571, 606-607, 610-613, 632-641, 700, 721, 743, 751
plugins/download/http.py                       575      77  86.61%   235, 277-280, 342-345, 348, 355-360, 378-393, 410, 425, 486, 521, 535, 549, 559-563, 579-584, 595, 614, 651-654, 675, 685, 692, 748, 857, 889, 921-930, 966, 1011-1016, 1025, 1040-1042, 1046, 1049, 1064-1065, 1075, 1150, 1202, 1244-1245, 1257, 1267, 1323-1324, 1354, 1392, 1472-1473
plugins/search/__init__.py                      25       0  100.00%
plugins/search/base.py                         199      18  90.95%   110, 114, 138-144, 219-222, 297, 318, 444, 497, 534-537, 546
plugins/search/build_search_result.py          524      83  84.16%   138-139, 175, 179, 199, 258, 425-436, 446-448, 515-516, 565, 577-579, 603, 605, 670, 678-682, 702, 712, 738, 787, 812, 834, 874-879, 940, 965, 968, 972, 1024-1045, 1086, 1113-1114, 1123-1132, 1222, 1237, 1243, 1262-1271, 1284, 1392-1393, 1437, 1446-1448, 1505, 1553-1563
plugins/search/cop_ghsl.py                     407      85  79.12%   73-74, 109-110, 174, 176, 218, 249-252, 298, 314, 317, 353, 357-362, 377, 399, 420, 454, 470, 505, 520, 534-535, 549-551, 558, 562-564, 567-570, 588-648, 659-674
plugins/search/cop_marine.py                   297      65  78.11%   56, 64-66, 82, 104, 106, 109, 175-176, 194, 218, 224, 228, 250-251, 259, 294-297, 303, 313, 326, 334, 340-344, 350-353, 359-412, 428-431, 481, 493, 537-538
plugins/search/creodias_s3.py                   29       1  96.55%   59
plugins/search/csw.py                          112      87  22.32%   99-100, 104-105, 113-170, 176-189, 197-229, 247-288
plugins/search/eumetsat_ds.py                   25       0  100.00%
plugins/search/geodes.py                        64       0  100.00%
plugins/search/qssearch.py                     869      98  88.72%   382, 427-428, 545-546, 569-570, 582-586, 817-823, 881, 947, 977, 984, 1055, 1076, 1079-1080, 1098, 1107-1108, 1135, 1207, 1216, 1221-1238, 1247, 1262, 1271, 1284, 1307, 1403, 1426, 1441, 1514-1515, 1517-1519, 1521-1522, 1609, 1616, 1724-1728, 1799, 1802, 1806-1807, 1828-1831, 1843, 1865-1877, 1885, 1920-1922, 1945-1951, 1958, 2012, 2035, 2040-2041, 2056, 2062, 2076, 2177, 2181, 2192, 2216, 2229, 2237-2247
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            84      18  78.57%   99-127, 166-169, 182, 224
resources/__init__.py                            0       0  100.00%
resources/shp/__init__.py                        0       0  100.00%
types/__init__.py                              180      43  76.11%   58, 71-75, 86-98, 126-128, 135-140, 155, 165, 247, 285, 295-311, 316, 318, 340, 345, 353, 363
types/bbox.py                                   39      19  51.28%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                          10       0  100.00%
types/queryables.py                            113       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/stac_extensions.py                       158       4  97.47%   455-461, 640
types/stac_metadata.py                         159      22  86.16%   98, 120, 153, 186-188, 202-216, 225-232, 259-262
utils/__init__.py                              636      48  92.45%   60, 199, 230-231, 240-266, 269, 284, 364-368, 443-447, 527, 567-568, 597, 975-978, 1029, 1048-1049, 1078, 1096-1097, 1254, 1256, 1264, 1268, 1274, 1276, 1278, 1284, 1286, 1384, 1548, 1613, 1788
utils/cache.py                                  22       0  100.00%
utils/dates.py                                 191       1  99.48%   182
utils/deserialize.py                            73      10  86.30%   53, 55, 103, 108-109, 145, 159, 181-182, 188
utils/env.py                                     3       0  100.00%
utils/exceptions.py                             58       0  100.00%
utils/free_text_search.py                       65       2  96.92%   83, 91
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                31       1  96.77%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       0  100.00%
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/s3.py                                    254      12  95.28%   200-203, 245, 263, 489, 536-537, 605, 680, 706
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
utils/streamresponse.py                         82       7  91.46%   24-26, 63, 124, 133, 145
TOTAL                                        11281    1377  87.79%

Diff against develop

Filename                                    Stmts    Miss  Cover
----------------------------------------  -------  ------  -------
cli.py                                          0      +6  -2.38%
api/core.py                                     0      +3  -0.39%
api/search_result.py                            0      +4  -2.89%
api/product/_product.py                         0      +3  -0.96%
plugins/manager.py                              0      -1  +0.58%
plugins/authentication/keycloak.py              0      +3  -6.52%
plugins/authentication/openid_connect.py        0      +9  -3.82%
plugins/authentication/token_exchange.py        0      +2  -5.55%
plugins/download/base.py                        0      +2  -0.69%
plugins/download/http.py                        0      +3  -0.52%
plugins/search/build_search_result.py          +5      -6  +1.31%
TOTAL                                          +5     +28  -0.25%

Results for commit: 503d2da

Minimum allowed coverage is 70%

♻️ This comment has been updated with latest results

@eodag-bot

eodag-bot commented Apr 14, 2026

Copy link
Copy Markdown
Collaborator

badge

Code Coverage (Windows)

Details
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         252      11  95.63%   105-116, 378, 645
config.py                                      306      24  92.16%   70-72, 75, 78, 81, 85, 89, 93-95, 587-589, 711-713, 732, 740, 770-775, 777
crunch.py                                        2       0  100.00%
api/__init__.py                                  0       0  100.00%
api/collection.py                              151       8  94.70%   177, 213, 216, 323, 362, 365, 383, 386
api/core.py                                    774      57  92.64%   263, 549, 597, 640, 680, 700, 741-746, 771, 855-874, 888, 894, 1047, 1052, 1151, 1190-1191, 1287-1288, 1314, 1345-1346, 1372, 1385, 1446-1447, 1478-1479, 1553-1558, 1570-1573, 1685, 1910, 2067, 2178, 2266-2267
api/provider.py                                382      40  89.53%   186, 190-191, 316-337, 405, 521, 525-526, 531-534, 545, 621-631, 821-822, 870, 877, 891, 914-917, 951-958, 962-963
api/search_result.py                           138      12  91.30%   111, 123, 133, 154, 208, 266, 278, 413, 468-471
api/product/__init__.py                          7       0  100.00%
api/product/_assets.py                          56       4  92.86%   101, 195, 206-210
api/product/_product.py                        311      24  92.28%   200, 356, 382-385, 422, 441-442, 551, 580, 587, 626, 738, 781-784, 793-796, 850, 916, 928, 995
api/product/metadata_mapping.py                867      61  92.96%   125-127, 222-227, 251, 310-311, 349-350, 391, 412, 475-476, 513, 534-537, 560, 572-573, 614, 637, 662-665, 667-672, 737-742, 751, 757, 773, 781, 1012, 1165, 1187, 1196-1200, 1217-1222, 1355, 1378, 1387, 1409, 1414, 1466, 1538, 1559, 1585, 1599, 1624, 1670, 1739, 1814, 1848
api/product/drivers/__init__.py                 11       0  100.00%
api/product/drivers/base.py                     32       0  100.00%
api/product/drivers/generic.py                  11       0  100.00%
api/product/drivers/sentinel1.py                33       0  100.00%
api/product/drivers/sentinel2.py                33       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 25       2  92.00%   48, 55
plugins/manager.py                             173      16  90.75%   102-107, 179, 201, 219-220, 232, 271-272, 372-375, 387-388
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           95       8  91.58%   163-165, 213-214, 240-242
plugins/apis/usgs.py                           175      25  85.71%   158, 246, 279, 321-323, 328, 356-357, 362, 392-399, 410-415, 437-443
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py             124      35  71.77%   52-54, 69-70, 142-149, 177-203, 226, 258-262, 279, 303, 319-320
plugins/authentication/base.py                  22       4  81.82%   45, 58, 81, 95
plugins/authentication/eoiam.py                 98       1  98.98%   170
plugins/authentication/generic.py               16       3  81.25%   50, 55, 65
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       4  91.30%   154, 177-182
plugins/authentication/openid_connect.py       235      19  91.91%   98-99, 107-125, 172, 180, 194, 214, 353-356, 382, 423
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              57       3  94.74%   68, 89, 135
plugins/authentication/token.py                141       9  93.62%   192, 229, 309-310, 358-362
plugins/authentication/token_exchange.py        36      14  61.11%   75, 93-121
plugins/crunch/__init__.py                       6       0  100.00%
plugins/crunch/base.py                          12       0  100.00%
plugins/crunch/filter_date.py                   47       0  100.00%
plugins/crunch/filter_latest_intersect.py       52       6  88.46%   87-88, 95-96, 98-102
plugins/crunch/filter_latest_tpl_name.py        35       0  100.00%
plugins/crunch/filter_overlap.py                66      10  84.85%   118-121, 137-163
plugins/crunch/filter_property.py               30       0  100.00%
plugins/download/__init__.py                     4       0  100.00%
plugins/download/aws.py                        402      76  81.09%   271, 305, 354-357, 387-388, 396-400, 480-483, 523-525, 529, 560-561, 567-571, 602, 667-675, 739-834, 846-851, 889, 915, 960-962, 1014
plugins/download/base.py                       290      26  91.03%   135, 165, 240-242, 381-382, 426, 460, 537-541, 571, 606-607, 632-641, 700, 721, 743, 751
plugins/download/http.py                       575      74  87.13%   235, 277-280, 342-345, 348, 355-360, 391-393, 410, 425, 486, 521, 535, 549, 559-563, 579-584, 595, 614, 651-654, 675, 685, 692, 748, 857, 889, 921-930, 966, 1011-1016, 1025, 1040-1042, 1046, 1049, 1064-1065, 1075, 1150, 1202, 1244-1245, 1257, 1267, 1323-1324, 1354, 1392, 1472-1473
plugins/search/__init__.py                      25       0  100.00%
plugins/search/base.py                         199      18  90.95%   110, 114, 138-144, 219-222, 297, 318, 444, 497, 534-537, 546
plugins/search/build_search_result.py          526      84  84.03%   138-139, 175, 179, 199, 258, 425-436, 446-448, 515-516, 565, 577-579, 603, 605, 670, 678-682, 702, 712, 738, 787, 812, 834, 874-879, 940, 965, 968, 972, 981, 987, 1025-1046, 1087, 1114-1115, 1124-1133, 1223, 1238, 1244, 1263-1272, 1393-1394, 1438, 1447-1449, 1506, 1554-1564
plugins/search/cop_ghsl.py                     407      85  79.12%   73-74, 109-110, 174, 176, 218, 249-252, 298, 314, 317, 353, 357-362, 377, 399, 420, 454, 470, 505, 520, 534-535, 549-551, 558, 562-564, 567-570, 588-648, 659-674
plugins/search/cop_marine.py                   297      65  78.11%   56, 64-66, 82, 104, 106, 109, 175-176, 194, 218, 224, 228, 250-251, 259, 294-297, 303, 313, 326, 334, 340-344, 350-353, 359-412, 428-431, 481, 493, 537-538
plugins/search/creodias_s3.py                   29       1  96.55%   59
plugins/search/csw.py                          112      87  22.32%   99-100, 104-105, 113-170, 176-189, 197-229, 247-288
plugins/search/eumetsat_ds.py                   25       0  100.00%
plugins/search/geodes.py                        64       0  100.00%
plugins/search/qssearch.py                     869      98  88.72%   382, 427-428, 545-546, 569-570, 582-586, 817-823, 881, 947, 977, 984, 1055, 1076, 1079-1080, 1098, 1107-1108, 1135, 1207, 1216, 1221-1238, 1247, 1262, 1271, 1284, 1307, 1403, 1426, 1441, 1514-1515, 1517-1519, 1521-1522, 1609, 1616, 1724-1728, 1799, 1802, 1806-1807, 1828-1831, 1843, 1865-1877, 1885, 1920-1922, 1945-1951, 1958, 2012, 2035, 2040-2041, 2056, 2062, 2076, 2177, 2181, 2192, 2216, 2229, 2237-2247
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            84      18  78.57%   99-127, 166-169, 182, 224
resources/__init__.py                            0       0  100.00%
resources/shp/__init__.py                        0       0  100.00%
types/__init__.py                              180      43  76.11%   58, 71-75, 86-98, 126-128, 135-140, 155, 165, 247, 285, 295-311, 316, 318, 340, 345, 353, 363
types/bbox.py                                   39      19  51.28%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                          10       0  100.00%
types/queryables.py                            113       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/stac_extensions.py                       158       4  97.47%   455-461, 640
types/stac_metadata.py                         159      22  86.16%   98, 120, 153, 186-188, 202-216, 225-232, 259-262
utils/__init__.py                              636      48  92.45%   60, 199, 230-231, 240-266, 269, 284, 364-368, 443-447, 527, 567-568, 597, 975-978, 1029, 1048-1049, 1078, 1096-1097, 1254, 1256, 1264, 1268, 1274, 1276, 1278, 1284, 1286, 1384, 1548, 1613, 1788
utils/cache.py                                  22       0  100.00%
utils/dates.py                                 191       1  99.48%   182
utils/deserialize.py                            73      10  86.30%   53, 55, 103, 108-109, 145, 159, 181-182, 188
utils/env.py                                     3       0  100.00%
utils/exceptions.py                             58       0  100.00%
utils/free_text_search.py                       65       2  96.92%   83, 91
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                31       1  96.77%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       0  100.00%
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/s3.py                                    254      12  95.28%   200-203, 245, 263, 489, 536-537, 605, 680, 706
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
utils/streamresponse.py                         82       7  91.46%   24-26, 63, 124, 133, 145
TOTAL                                        11283    1346  88.07%

Diff against develop

Filename                                 Stmts    Miss  Cover
-------------------------------------  -------  ------  -------
plugins/search/build_search_result.py       +7      -5  +1.18%
TOTAL                                       +7      -5  +0.05%

Results for commit: 9d5a631

Minimum allowed coverage is 70%

♻️ This comment has been updated with latest results

@dalpasso
dalpasso marked this pull request as ready for review April 14, 2026 13:07
@dalpasso
dalpasso requested a review from jlahovnik April 14, 2026 13:07
@dalpasso dalpasso self-assigned this Apr 14, 2026
@jlahovnik
jlahovnik force-pushed the fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS branch from 4018d34 to b243936 Compare May 6, 2026 08:55
@sbrunato

Copy link
Copy Markdown
Collaborator

must fail because not constraint is matching the given params and all keywords are required by form

For the first case, things are confusing. The error raised is:

eodag.utils.exceptions.ValidationError: ("ecmwf:level=['1'] is not available with ecmwf:temporal_resolution=monthly, ecmwf:experiment=ssp2_4_5, ecmwf:variable=near_surface_air_temperature. No value allowed.", {'variable', 'temporal_resolution', 'experiment', 'ecmwf:level'})

But ecmwf:level appears in queryables with these parameters:

>>> dag.list_queryables(**params)["ecmwf_level"]
typing.Annotated[list, FieldInfo(annotation=NoneType, required=False, default=None, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:level', 'level']), serialization_alias='ecmwf:level', title='Level')]

@sbrunato
sbrunato marked this pull request as draft May 19, 2026 14:25

@sbrunato sbrunato left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please remove the not-allowed parameter from queryables, and add a test for this new mechanism

@dalpasso
dalpasso force-pushed the fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS branch from e116476 to 503d2da Compare May 22, 2026 14:59
@dalpasso
dalpasso force-pushed the fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS branch from 503d2da to abce4eb Compare June 11, 2026 09:35
@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Benchmark comparison

Compared baseline: origin/develop
Compared candidate: 21124c4


------------------------------- benchmark: 7 tests, 2 sources -------------------------------
Name (time in ms)                                 baseline Median  candidate Median   ΔMedian
---------------------------------------------------------------------------------------------
test_benchmark_stac_reader_fetch_recursive                 3.5741            3.5801     +0.2%
test_benchmark_cli_version                                19.1459           19.2080     +0.3%
test_benchmark_cli_without_args_subprocess               134.0941          135.6262     +1.1%
test_benchmark_core_search_with_provider                 139.1558          137.3176     -1.3%
test_benchmark_core_search_with_count                    181.7136          179.0387     -1.5%
test_benchmark_cli_list_collections                      239.7442          242.8060     +1.3%
test_benchmark_eodag_instantiation_subprocess            962.9913          986.1973     +2.4%
---------------------------------------------------------------------------------------------

Legend:
  Cyan: reference source for comparison. Green: improvement, Red: regression.
  Δ: percentage change from reference source.

@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

badge

Code Coverage (Ubuntu)

Details
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                     19       2  89.47%   60, 69
cli.py                                         259      11  95.75%   99-110, 376, 658
config.py                                      336      27  91.96%   71-73, 76, 79, 82, 86, 90, 94-96, 590-592, 746-748, 772-776, 795, 803, 833-838, 840
crunch.py                                        2       0  100.00%
api/__init__.py                                  0       0  100.00%
api/collection.py                              151       8  94.70%   177, 213, 216, 323, 362, 365, 383, 386
api/core.py                                    776      58  92.53%   262, 548, 596, 639, 679, 699, 740-745, 770, 854-873, 887, 893, 1046, 1051, 1150, 1189-1190, 1286-1287, 1313, 1344-1345, 1371, 1384, 1445-1446, 1477-1478, 1552-1557, 1569-1572, 1684, 1909, 2066, 2070, 2179, 2267-2268
api/provider.py                                389      42  89.20%   128-132, 199, 203-204, 341-362, 430, 546, 550-551, 556-559, 570, 646-656, 846-847, 895, 902, 916, 939-942, 976-983, 987-988
api/search_result.py                           138      12  91.30%   111, 123, 133, 154, 208, 266, 278, 413, 468-471
api/product/__init__.py                         26       4  84.62%   51-54
api/product/_assets.py                          58       5  91.38%   101, 195-196, 208-212
api/product/_product.py                        315      24  92.38%   217, 373, 399-402, 439, 458-459, 568, 597, 604, 644, 756, 799-802, 811-814, 868, 934, 946, 1013
api/product/metadata_mapping.py                887      57  93.57%   136-138, 259-264, 288, 347-348, 428, 448-449, 454, 517-518, 555, 576-579, 602, 614-615, 656, 679, 704-707, 709-714, 793, 799, 815, 823, 1054, 1207, 1229, 1238-1242, 1259-1264, 1397, 1420, 1429, 1451, 1456, 1523, 1620, 1641, 1667, 1681, 1779, 1874, 1972, 2038, 2082
api/product/drivers/__init__.py                 11       0  100.00%
api/product/drivers/base.py                     32       0  100.00%
api/product/drivers/generic.py                  11       0  100.00%
api/product/drivers/sentinel1.py                33       0  100.00%
api/product/drivers/sentinel2.py                33       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 38       3  92.11%   50, 84-85
plugins/manager.py                             192      17  91.15%   103-108, 138, 220, 242, 260-261, 273, 312-313, 413-416, 428-429
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             8       0  100.00%
plugins/apis/ecmwf.py                           95      10  89.47%   163-165, 213-214, 240-242, 273-274
plugins/apis/usgs.py                           175      25  85.71%   158, 246, 279, 322-324, 329, 357-358, 363, 393-400, 411-416, 438-444
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py             124      35  71.77%   52-54, 69-70, 142-149, 177-203, 226, 258-262, 279, 303, 319-320
plugins/authentication/base.py                  26       4  84.62%   58, 71, 94, 108
plugins/authentication/eoiam.py                 98       1  98.98%   170
plugins/authentication/generic.py               16       3  81.25%   50, 55, 65
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       4  91.30%   154, 177-182
plugins/authentication/openid_connect.py       235      19  91.91%   98-99, 107-125, 172, 180, 194, 214, 353-356, 382, 423
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              57       3  94.74%   68, 89, 135
plugins/authentication/token.py                141       9  93.62%   192, 229, 309-310, 358-362
plugins/authentication/token_exchange.py        36      14  61.11%   75, 93-121
plugins/crunch/__init__.py                       6       0  100.00%
plugins/crunch/base.py                          12       0  100.00%
plugins/crunch/filter_date.py                   47       0  100.00%
plugins/crunch/filter_latest_intersect.py       52       6  88.46%   87-88, 95-96, 98-102
plugins/crunch/filter_latest_tpl_name.py        35       0  100.00%
plugins/crunch/filter_overlap.py                66      10  84.85%   118-121, 137-163
plugins/crunch/filter_property.py               30       2  93.33%   81-84
plugins/download/__init__.py                     4       0  100.00%
plugins/download/aws.py                        403      77  80.89%   271, 305, 354-357, 387-388, 396-400, 480-483, 523-525, 529, 560-561, 567-571, 602, 667-675, 739-833, 845-850, 888, 914, 959-961, 1013
plugins/download/base.py                       297      24  91.92%   148, 178, 394-395, 439, 473, 550-554, 584, 619-620, 645-654, 713, 734, 756, 764
plugins/download/http.py                       578      74  87.20%   242, 284-287, 349-352, 355, 362-367, 398-400, 417, 432, 493, 528, 542, 556, 566-570, 586-591, 602, 621, 657-660, 681, 691, 698, 754, 862, 894, 926-935, 971, 1016-1021, 1030, 1045-1047, 1051, 1054, 1069-1070, 1080, 1155, 1207, 1249-1250, 1262, 1272, 1328-1329, 1359, 1397, 1477-1478
plugins/search/__init__.py                      25       0  100.00%
plugins/search/base.py                         207      19  90.82%   118, 122, 146-152, 161, 227-230, 290, 322, 343, 469, 554-557, 566
plugins/search/build_search_result.py          526      78  85.17%   138-139, 175, 179, 199, 258, 427-438, 517-518, 567, 579-581, 605, 607, 672, 680-684, 704, 714, 740, 789, 814, 876-881, 942, 969, 972, 1027-1048, 1089, 1116-1117, 1126-1135, 1225, 1240, 1243, 1248, 1267-1276, 1397-1398, 1442, 1451-1453, 1510, 1558-1568
plugins/search/cop_ghsl.py                     410      84  79.51%   73-74, 109-110, 174, 176, 218, 249-252, 298, 314, 360, 364-369, 384, 406, 427, 461, 477, 512, 527, 541-542, 556-558, 565, 569-571, 574-577, 595-655, 666-681
plugins/search/cop_marine.py                   297      65  78.11%   56, 64-66, 82, 104, 106, 109, 175-176, 194, 218, 224, 228, 250-251, 259, 294-297, 303, 313, 326, 334, 340-344, 350-353, 359-412, 428-431, 481, 493, 537-538
plugins/search/creodias_s3.py                   29       1  96.55%   59
plugins/search/csw.py                          112      87  22.32%   99-100, 104-105, 113-170, 176-189, 197-229, 246-287
plugins/search/eumetsat_ds.py                   25       0  100.00%
plugins/search/geodes.py                        66       0  100.00%
plugins/search/oar.py                           82      13  84.15%   50, 57-60, 172-180, 186-188, 195
plugins/search/qssearch.py                     889     108  87.85%   381, 425-426, 543-544, 567-568, 580-584, 816-822, 880, 946, 980, 987, 1058, 1079, 1082-1083, 1101, 1110-1111, 1129, 1200, 1209, 1214-1231, 1240, 1255, 1264, 1277, 1300, 1339, 1412, 1435, 1450, 1523-1524, 1526-1528, 1530-1531, 1618, 1625, 1733-1737, 1803, 1806, 1810-1811, 1830-1833, 1845, 1867-1884, 1892-1898, 1933-1935, 1956-1962, 1969, 2007, 2023, 2046, 2051-2052, 2067, 2073, 2087, 2193, 2197, 2208, 2232, 2245, 2253-2263, 2289
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            84      17  79.76%   99-127, 166-169, 182
resources/__init__.py                            0       0  100.00%
resources/shp/__init__.py                        0       0  100.00%
types/__init__.py                              180      43  76.11%   58, 71-75, 86-98, 126-128, 135-140, 155, 165, 247, 280, 290-306, 311, 313, 335, 340, 348, 358
types/bbox.py                                   39      19  51.28%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                          10       0  100.00%
types/queryables.py                            113       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/stac_extensions.py                       162       4  97.53%   455-461, 640
types/stac_metadata.py                         159      22  86.16%   98, 120, 153, 186-188, 202-216, 225-232, 259-262
utils/__init__.py                              637      58  90.89%   57, 186-241, 254-256, 274, 307, 387-391, 466-470, 550, 590-591, 620, 1002-1005, 1056, 1075-1076, 1108, 1126-1127, 1291, 1293, 1301, 1305, 1311, 1313, 1315, 1321, 1323, 1423, 1555, 1620, 1795
utils/cache.py                                  22       0  100.00%
utils/dates.py                                 191       1  99.48%   182
utils/deserialize.py                            74      10  86.49%   53, 55, 103, 108-109, 148, 162, 184-185, 191
utils/env.py                                     3       0  100.00%
utils/exceptions.py                             58       0  100.00%
utils/free_text_search.py                       65       2  96.92%   83, 91
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                31       1  96.77%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       0  100.00%
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/s3.py                                    254      12  95.28%   200-203, 245, 263, 489, 536-537, 605, 680, 706
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
utils/streamresponse.py                         86       4  95.35%   77, 135, 144, 156
utils/yaml.py                                   42       7  83.33%   49, 65, 70-74
TOTAL                                        11603    1390  88.02%

Diff against develop

Filename                                 Stmts    Miss  Cover
-------------------------------------  -------  ------  -------
config.py                                   +1       0  +0.02%
plugins/search/build_search_result.py       +5     -12  +2.44%
TOTAL                                       +6     -12  +0.11%

Results for commit: b55eaa7

Minimum allowed coverage is 70%

♻️ This comment has been updated with latest results

@github-actions

github-actions Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

badge

Code Coverage (Windows)

Details
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                     19       2  89.47%   60, 69
cli.py                                         259      11  95.75%   99-110, 376, 658
config.py                                      336      27  91.96%   71-73, 76, 79, 82, 86, 90, 94-96, 590-592, 746-748, 772-776, 795, 803, 833-838, 840
crunch.py                                        2       0  100.00%
api/__init__.py                                  0       0  100.00%
api/collection.py                              151       8  94.70%   177, 213, 216, 323, 362, 365, 383, 386
api/core.py                                    776      58  92.53%   262, 548, 596, 639, 679, 699, 740-745, 770, 854-873, 887, 893, 1046, 1051, 1150, 1189-1190, 1286-1287, 1313, 1344-1345, 1371, 1384, 1445-1446, 1477-1478, 1552-1557, 1569-1572, 1684, 1909, 2066, 2070, 2179, 2267-2268
api/provider.py                                389      42  89.20%   128-132, 199, 203-204, 341-362, 430, 546, 550-551, 556-559, 570, 646-656, 846-847, 895, 902, 916, 939-942, 976-983, 987-988
api/search_result.py                           138      12  91.30%   111, 123, 133, 154, 208, 266, 278, 413, 468-471
api/product/__init__.py                         26       4  84.62%   51-54
api/product/_assets.py                          58       5  91.38%   101, 195-196, 208-212
api/product/_product.py                        315      24  92.38%   217, 373, 399-402, 439, 458-459, 568, 597, 604, 644, 756, 799-802, 811-814, 868, 934, 946, 1013
api/product/metadata_mapping.py                887      57  93.57%   136-138, 259-264, 288, 347-348, 428, 448-449, 454, 517-518, 555, 576-579, 602, 614-615, 656, 679, 704-707, 709-714, 793, 799, 815, 823, 1054, 1207, 1229, 1238-1242, 1259-1264, 1397, 1420, 1429, 1451, 1456, 1523, 1620, 1641, 1667, 1681, 1779, 1874, 1972, 2038, 2082
api/product/drivers/__init__.py                 11       0  100.00%
api/product/drivers/base.py                     32       0  100.00%
api/product/drivers/generic.py                  11       0  100.00%
api/product/drivers/sentinel1.py                33       0  100.00%
api/product/drivers/sentinel2.py                33       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 38       3  92.11%   50, 84-85
plugins/manager.py                             192      17  91.15%   103-108, 138, 220, 242, 260-261, 273, 312-313, 413-416, 428-429
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             8       0  100.00%
plugins/apis/ecmwf.py                           95      10  89.47%   163-165, 213-214, 240-242, 273-274
plugins/apis/usgs.py                           175      25  85.71%   158, 246, 279, 322-324, 329, 357-358, 363, 393-400, 411-416, 438-444
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py             124      35  71.77%   52-54, 69-70, 142-149, 177-203, 226, 258-262, 279, 303, 319-320
plugins/authentication/base.py                  26       4  84.62%   58, 71, 94, 108
plugins/authentication/eoiam.py                 98       1  98.98%   170
plugins/authentication/generic.py               16       3  81.25%   50, 55, 65
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       4  91.30%   154, 177-182
plugins/authentication/openid_connect.py       235      19  91.91%   98-99, 107-125, 172, 180, 194, 214, 353-356, 382, 423
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              57       3  94.74%   68, 89, 135
plugins/authentication/token.py                141       9  93.62%   192, 229, 309-310, 358-362
plugins/authentication/token_exchange.py        36      14  61.11%   75, 93-121
plugins/crunch/__init__.py                       6       0  100.00%
plugins/crunch/base.py                          12       0  100.00%
plugins/crunch/filter_date.py                   47       0  100.00%
plugins/crunch/filter_latest_intersect.py       52       6  88.46%   87-88, 95-96, 98-102
plugins/crunch/filter_latest_tpl_name.py        35       0  100.00%
plugins/crunch/filter_overlap.py                66      10  84.85%   118-121, 137-163
plugins/crunch/filter_property.py               30       2  93.33%   81-84
plugins/download/__init__.py                     4       0  100.00%
plugins/download/aws.py                        403      77  80.89%   271, 305, 354-357, 387-388, 396-400, 480-483, 523-525, 529, 560-561, 567-571, 602, 667-675, 739-833, 845-850, 888, 914, 959-961, 1013
plugins/download/base.py                       297      26  91.25%   148, 178, 253-255, 394-395, 439, 473, 550-554, 584, 619-620, 645-654, 713, 734, 756, 764
plugins/download/http.py                       578      74  87.20%   242, 284-287, 349-352, 355, 362-367, 398-400, 417, 432, 493, 528, 542, 556, 566-570, 586-591, 602, 621, 657-660, 681, 691, 698, 754, 862, 894, 926-935, 971, 1016-1021, 1030, 1045-1047, 1051, 1054, 1069-1070, 1080, 1155, 1207, 1249-1250, 1262, 1272, 1328-1329, 1359, 1397, 1477-1478
plugins/search/__init__.py                      25       0  100.00%
plugins/search/base.py                         207      19  90.82%   118, 122, 146-152, 161, 227-230, 290, 322, 343, 469, 554-557, 566
plugins/search/build_search_result.py          526      78  85.17%   138-139, 175, 179, 199, 258, 427-438, 517-518, 567, 579-581, 605, 607, 672, 680-684, 704, 714, 740, 789, 814, 876-881, 942, 969, 972, 1027-1048, 1089, 1116-1117, 1126-1135, 1225, 1240, 1243, 1248, 1267-1276, 1397-1398, 1442, 1451-1453, 1510, 1558-1568
plugins/search/cop_ghsl.py                     410      84  79.51%   73-74, 109-110, 174, 176, 218, 249-252, 298, 314, 360, 364-369, 384, 406, 427, 461, 477, 512, 527, 541-542, 556-558, 565, 569-571, 574-577, 595-655, 666-681
plugins/search/cop_marine.py                   297      65  78.11%   56, 64-66, 82, 104, 106, 109, 175-176, 194, 218, 224, 228, 250-251, 259, 294-297, 303, 313, 326, 334, 340-344, 350-353, 359-412, 428-431, 481, 493, 537-538
plugins/search/creodias_s3.py                   29       1  96.55%   59
plugins/search/csw.py                          112      87  22.32%   99-100, 104-105, 113-170, 176-189, 197-229, 246-287
plugins/search/eumetsat_ds.py                   25       0  100.00%
plugins/search/geodes.py                        66       0  100.00%
plugins/search/oar.py                           82      13  84.15%   50, 57-60, 172-180, 186-188, 195
plugins/search/qssearch.py                     889     108  87.85%   381, 425-426, 543-544, 567-568, 580-584, 816-822, 880, 946, 980, 987, 1058, 1079, 1082-1083, 1101, 1110-1111, 1129, 1200, 1209, 1214-1231, 1240, 1255, 1264, 1277, 1300, 1339, 1412, 1435, 1450, 1523-1524, 1526-1528, 1530-1531, 1618, 1625, 1733-1737, 1803, 1806, 1810-1811, 1830-1833, 1845, 1867-1884, 1892-1898, 1933-1935, 1956-1962, 1969, 2007, 2023, 2046, 2051-2052, 2067, 2073, 2087, 2193, 2197, 2208, 2232, 2245, 2253-2263, 2289
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            84      17  79.76%   99-127, 166-169, 182
resources/__init__.py                            0       0  100.00%
resources/shp/__init__.py                        0       0  100.00%
types/__init__.py                              180      43  76.11%   58, 71-75, 86-98, 126-128, 135-140, 155, 165, 247, 280, 290-306, 311, 313, 335, 340, 348, 358
types/bbox.py                                   39      19  51.28%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                          10       0  100.00%
types/queryables.py                            113       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/stac_extensions.py                       162       4  97.53%   455-461, 640
types/stac_metadata.py                         159      22  86.16%   98, 120, 153, 186-188, 202-216, 225-232, 259-262
utils/__init__.py                              637      58  90.89%   57, 186-241, 254-256, 274, 307, 387-391, 466-470, 550, 590-591, 620, 1002-1005, 1056, 1075-1076, 1108, 1126-1127, 1291, 1293, 1301, 1305, 1311, 1313, 1315, 1321, 1323, 1423, 1555, 1620, 1795
utils/cache.py                                  22       0  100.00%
utils/dates.py                                 191       1  99.48%   182
utils/deserialize.py                            74      10  86.49%   53, 55, 103, 108-109, 148, 162, 184-185, 191
utils/env.py                                     3       0  100.00%
utils/exceptions.py                             58       0  100.00%
utils/free_text_search.py                       65       2  96.92%   83, 91
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                31       1  96.77%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       0  100.00%
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/s3.py                                    254      12  95.28%   200-203, 245, 263, 489, 536-537, 605, 680, 706
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
utils/streamresponse.py                         86       4  95.35%   77, 135, 144, 156
utils/yaml.py                                   42       7  83.33%   49, 65, 70-74
TOTAL                                        11603    1392  88.00%

Diff against develop

Filename                                 Stmts    Miss  Cover
-------------------------------------  -------  ------  -------
config.py                                   +1       0  +0.02%
plugins/search/build_search_result.py       +5     -12  +2.44%
TOTAL                                       +6     -12  +0.11%

Results for commit: b55eaa7

Minimum allowed coverage is 70%

♻️ This comment has been updated with latest results

@dalpasso
dalpasso force-pushed the fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS branch from bdf930e to 193cfe7 Compare June 18, 2026 08:06
- an input keyword cannot be used if it's required by form and no constraint with the given combination of parameters exists;
- any value is accepted if a keyword is not required by form and its list of allowed values is empty;
- a queryable with a default value must use that default value and being not required;
- a not allowed parameter must not be listed in the queryables.
@dalpasso
dalpasso force-pushed the fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS branch from 4122ae7 to 0616b82 Compare June 19, 2026 06:53
@dalpasso
dalpasso requested a review from sbrunato June 19, 2026 07:34
@dalpasso
dalpasso marked this pull request as ready for review June 19, 2026 07:34
@sbrunato sbrunato changed the title fix(search): allow any value for keywords not required by form fix(queryables): required parameters and allowed combinations Jul 10, 2026
@sbrunato sbrunato added this to the 4.4.1.dev milestone Jul 10, 2026
@sbrunato sbrunato changed the title fix(queryables): required parameters and allowed combinations fix(queryables): required parameters, defaults and allowed combinations Jul 10, 2026
@sbrunato
sbrunato merged commit ee7d579 into develop Jul 10, 2026
15 checks passed
@sbrunato
sbrunato deleted the fix-request-validation-of-CMIP6_CLIMATE_PROJECTIONS branch July 10, 2026 14:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants