Skip to content

fix(download): allow AWS asset downloads without product URL - #2439

Merged
sbrunato merged 1 commit into
developfrom
fix/awsdownload-without-url
Nov 5, 2026
Merged

sbrunato merged 1 commit into
developfrom
fix/awsdownload-without-url

Conversation

@sbrunato

@sbrunato sbrunato commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Following #2438, allow AwsDownload asset downloads when the product has no URL.

Shared download preparation now checks for selected assets with an href.

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Benchmark comparison

Compared baseline: origin/develop
Compared candidate: 90d82ec


------------------------------- benchmark: 9 tests, 2 sources -------------------------------
Name (time in us)                                 baseline Median  candidate Median   ΔMedian
---------------------------------------------------------------------------------------------
test_benchmark_eoproduct_assets_population                 6.8900            6.8100     -1.2%
test_benchmark_eoproduct_instantiation                     9.9250           10.0960     +1.7%
test_benchmark_stac_reader_fetch_recursive             2,231.6800        2,222.4765     -0.4%
test_benchmark_cli_version                             8,288.0345        8,446.3630     +1.9%
test_benchmark_core_search_with_provider              82,604.8130       79,523.9000     -3.7%
test_benchmark_cli_without_args_subprocess            97,234.2690       99,571.7880     +2.4%
test_benchmark_core_search_with_count                107,733.1310      107,191.5810     -0.5%
test_benchmark_cli_list_collections                  171,397.3420      169,050.2970     -1.4%
test_benchmark_eodag_instantiation_subprocess        751,624.4575      754,283.2695     +0.4%
---------------------------------------------------------------------------------------------

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

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Test Results

    5 files  ± 0      5 suites  ±0   2m 44s ⏱️ -23s
1 056 tests + 3  1 056 ✅ + 3  0 💤 ±0  0 ❌ ±0 
5 925 runs  +15  5 923 ✅ +15  2 💤 ±0  0 ❌ ±0 

Results for commit dfc1ba8. ± Comparison against base commit efaeebe.

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

badge

Code Coverage (Ubuntu)

Details
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                     18       2  88.89%   60, 69
cli.py                                         292      11  96.23%   109-120, 386, 727
config.py                                      419      38  90.93%   229, 253-268, 290, 295, 329-331, 334, 337, 340, 344, 348, 352-354, 848-850, 901, 1036-1038, 1062-1066, 1085, 1093, 1121-1126, 1128
crunch.py                                        2       0  100.00%
api/__init__.py                                  0       0  100.00%
api/collection.py                              154       7  95.45%   193, 229, 339, 378, 381, 399, 402
api/core.py                                    755      26  96.56%   158, 273, 285-296, 541, 589, 626, 666, 684, 755, 852-856, 878, 1031, 1036, 1298, 1369, 1669, 1894, 2051, 2055, 2164
api/provider.py                                414      44  89.37%   140-144, 211, 215-216, 353-374, 442, 558, 562-563, 568-571, 582, 643-644, 700-710, 895-896, 954, 961, 975, 998-1001, 1035-1042, 1046-1047
api/search_result.py                           138      12  91.30%   111, 123, 133, 154, 208, 266, 278, 406, 461-464
api/product/__init__.py                         26       4  84.62%   51-54
api/product/_assets.py                          78       5  93.59%   141, 231-232, 244-248
api/product/_product.py                        348      26  92.53%   219, 377, 403-406, 443, 462-463, 554, 583, 590, 630, 680, 686, 823, 866-869, 878-881, 935, 1015, 1027, 1095
api/product/metadata_mapping.py                919      60  93.47%   116, 185-187, 302-307, 331, 389-390, 470, 490-491, 496, 559-560, 597, 618-621, 644, 656-657, 699, 722, 747-750, 752-757, 814, 850, 856, 872, 880, 1111, 1263-1264, 1293, 1302-1306, 1323-1328, 1461, 1484, 1493, 1515, 1520, 1587, 1684, 1705, 1731, 1745, 1843, 1938, 2040, 2106, 2150
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%   49, 81-82
plugins/manager.py                             211      12  94.31%   101-106, 136, 260, 264, 291, 345, 449-452
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%   32
plugins/authentication/aws_auth.py             127      28  77.95%   69-70, 142-149, 193-212, 235, 267-271, 288, 312, 328-329
plugins/authentication/base.py                  26       4  84.62%   61, 74, 97, 111
plugins/authentication/eoiam.py                102       1  99.02%   173
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       243      21  91.36%   101-102, 110-128, 175, 183, 197, 217, 363-366, 392, 433, 621-624
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py             134       4  97.01%   135, 141, 177, 224
plugins/authentication/token.py                141       9  93.62%   192, 229, 309-310, 358-362
plugins/authentication/token_exchange.py        36       3  91.67%   75, 114-115
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                        426      43  89.91%   287, 316, 384-387, 419-420, 428-432, 541-544, 588-590, 594, 624-625, 631-635, 665, 732-744, 830, 847, 862, 894-895, 958, 984, 1029-1031, 1083
plugins/download/base.py                       303      25  91.75%   148, 178, 407-408, 452, 470, 486, 563-567, 597, 632-633, 658-667, 726, 747, 769, 777
plugins/download/http.py                       583      71  87.82%   257, 272, 364-367, 370, 377-382, 414-415, 432, 447, 508, 543, 557, 571, 584-588, 604-609, 620, 639, 677-680, 701, 711, 718, 760, 882, 914, 946-955, 991, 1036-1041, 1050, 1065-1067, 1071, 1074, 1106, 1181, 1233, 1276-1277, 1289, 1299, 1355-1356, 1386, 1413, 1433, 1513-1514
plugins/search/__init__.py                      25       0  100.00%
plugins/search/base.py                         220      20  90.91%   119, 123, 147-153, 162, 228-231, 264, 314, 346, 367, 500, 585-588, 597
plugins/search/build_search_result.py          556      41  92.63%   259, 430-438, 518-519, 568, 579-581, 605, 607, 672, 680-684, 704, 714, 740, 789, 814, 876-881, 942, 969, 972, 1088, 1223, 1238, 1241, 1266, 1438-1439, 1483, 1492-1494, 1549
plugins/search/cop_ghsl.py                     410      27  93.41%   73-74, 109-110, 174, 176, 218, 298, 314, 360, 384, 406, 427, 461, 477, 512, 541-542, 556-558, 569-571, 613, 650, 654
plugins/search/cop_marine.py                   297      34  88.55%   56, 64-66, 82, 104, 106, 109, 175-176, 194, 218, 224, 228, 250-251, 259, 303, 313, 326, 334, 340-344, 361, 393-396, 411, 481, 493, 537-538
plugins/search/creodias_s3.py                   29       1  96.55%   59
plugins/search/csw.py                          118      12  89.83%   121, 165, 203, 214-225, 230
plugins/search/eumetsat_ds.py                   24       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                     911      81  91.11%   372, 534-535, 558-559, 571-575, 871, 937, 971, 1053, 1074, 1077-1078, 1108-1109, 1127, 1198, 1207, 1219-1229, 1238, 1253, 1262, 1275, 1298, 1339, 1412, 1450, 1523-1524, 1526-1531, 1533-1534, 1807, 1810, 1814-1815, 1834-1837, 1851, 1878, 1896-1913, 1970-1976, 1983, 2067, 2072-2073, 2103, 2223, 2227, 2238, 2262, 2275, 2283-2293, 2319
plugins/search/stac_list_assets.py              25       0  100.00%
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                              228      55  75.88%   59, 74-76, 97-101, 114-144, 181-188, 203, 213, 308, 341, 351-369, 374, 376, 378, 400, 405, 413, 423
types/bbox.py                                   39       0  100.00%
types/download_args.py                           9       0  100.00%
types/queryables.py                            152       1  99.34%   379
types/search_args.py                            71      18  74.65%   67-71, 78-95, 110
types/stac_extensions.py                       162       4  97.53%   455-461, 641
types/stac_metadata.py                         159      22  86.16%   98, 120, 153, 186-188, 202-216, 225-232, 259-262
utils/__init__.py                              660      21  96.82%   57, 214, 221, 237, 272, 349, 601-604, 644-645, 674, 1058-1061, 1129-1130, 1162, 1369, 1481, 1613
utils/cache.py                                  23       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       6  78.57%   65-73
utils/logging.py                                42       3  92.86%   42-43, 61
utils/notebook.py                               44      13  70.45%   27, 41, 58-62, 72-78, 86-87
utils/repr.py                                   38       0  100.00%
utils/requests.py                               55       6  89.09%   94, 110, 118-120, 128
utils/s3.py                                    307      24  92.18%   97-99, 104, 110, 116, 120, 133, 137, 303-304, 345, 361, 383, 605, 688-689, 753, 795-799, 851
utils/stac_reader.py                           113      42  62.83%   63-85, 101, 138, 154-159, 206-216, 226-256
utils/streamresponse.py                         91       4  95.60%   106, 166, 175, 187
utils/yaml.py                                   42       7  83.33%   49, 65, 70-74
TOTAL                                        12205    1006  91.76%

Diff against develop

Filename                    Stmts    Miss  Cover
------------------------  -------  ------  --------
plugins/download/base.py       +1       0  +0.03%
plugins/download/http.py       -1       0  -0.02%
TOTAL                           0       0  +100.00%

Results for commit: dfc1ba8

Minimum allowed coverage is 70%

♻️ This comment has been updated with latest results

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

badge

Code Coverage (Windows)

Details
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                     18       2  88.89%   60, 69
cli.py                                         292      11  96.23%   109-120, 386, 727
config.py                                      419      38  90.93%   229, 253-268, 290, 295, 329-331, 334, 337, 340, 344, 348, 352-354, 848-850, 901, 1036-1038, 1062-1066, 1085, 1093, 1121-1126, 1128
crunch.py                                        2       0  100.00%
api/__init__.py                                  0       0  100.00%
api/collection.py                              154       7  95.45%   193, 229, 339, 378, 381, 399, 402
api/core.py                                    755      26  96.56%   158, 273, 285-296, 541, 589, 626, 666, 684, 755, 852-856, 878, 1031, 1036, 1298, 1369, 1669, 1894, 2051, 2055, 2164
api/provider.py                                414      44  89.37%   140-144, 211, 215-216, 353-374, 442, 558, 562-563, 568-571, 582, 643-644, 700-710, 895-896, 954, 961, 975, 998-1001, 1035-1042, 1046-1047
api/search_result.py                           138      12  91.30%   111, 123, 133, 154, 208, 266, 278, 406, 461-464
api/product/__init__.py                         26       4  84.62%   51-54
api/product/_assets.py                          78       5  93.59%   141, 231-232, 244-248
api/product/_product.py                        348      26  92.53%   219, 377, 403-406, 443, 462-463, 554, 583, 590, 630, 680, 686, 823, 866-869, 878-881, 935, 1015, 1027, 1095
api/product/metadata_mapping.py                919      60  93.47%   116, 185-187, 302-307, 331, 389-390, 470, 490-491, 496, 559-560, 597, 618-621, 644, 656-657, 699, 722, 747-750, 752-757, 814, 850, 856, 872, 880, 1111, 1263-1264, 1293, 1302-1306, 1323-1328, 1461, 1484, 1493, 1515, 1520, 1587, 1684, 1705, 1731, 1745, 1843, 1938, 2040, 2106, 2150
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%   49, 81-82
plugins/manager.py                             211      12  94.31%   101-106, 136, 260, 264, 291, 345, 449-452
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%   32
plugins/authentication/aws_auth.py             127      28  77.95%   69-70, 142-149, 193-212, 235, 267-271, 288, 312, 328-329
plugins/authentication/base.py                  26       4  84.62%   61, 74, 97, 111
plugins/authentication/eoiam.py                102       1  99.02%   173
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       243      21  91.36%   101-102, 110-128, 175, 183, 197, 217, 363-366, 392, 433, 621-624
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py             134       4  97.01%   135, 141, 177, 224
plugins/authentication/token.py                141       9  93.62%   192, 229, 309-310, 358-362
plugins/authentication/token_exchange.py        36       3  91.67%   75, 114-115
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                        426      43  89.91%   287, 316, 384-387, 419-420, 428-432, 541-544, 588-590, 594, 624-625, 631-635, 665, 732-744, 830, 847, 862, 894-895, 958, 984, 1029-1031, 1083
plugins/download/base.py                       303      27  91.09%   148, 178, 259-261, 407-408, 452, 470, 486, 563-567, 597, 632-633, 658-667, 726, 747, 769, 777
plugins/download/http.py                       583      71  87.82%   257, 272, 364-367, 370, 377-382, 414-415, 432, 447, 508, 543, 557, 571, 584-588, 604-609, 620, 639, 677-680, 701, 711, 718, 760, 882, 914, 946-955, 991, 1036-1041, 1050, 1065-1067, 1071, 1074, 1106, 1181, 1233, 1276-1277, 1289, 1299, 1355-1356, 1386, 1413, 1433, 1513-1514
plugins/search/__init__.py                      25       0  100.00%
plugins/search/base.py                         220      20  90.91%   119, 123, 147-153, 162, 228-231, 264, 314, 346, 367, 500, 585-588, 597
plugins/search/build_search_result.py          556      41  92.63%   259, 430-438, 518-519, 568, 579-581, 605, 607, 672, 680-684, 704, 714, 740, 789, 814, 876-881, 942, 969, 972, 1088, 1223, 1238, 1241, 1266, 1438-1439, 1483, 1492-1494, 1549
plugins/search/cop_ghsl.py                     410      27  93.41%   73-74, 109-110, 174, 176, 218, 298, 314, 360, 384, 406, 427, 461, 477, 512, 541-542, 556-558, 569-571, 613, 650, 654
plugins/search/cop_marine.py                   297      34  88.55%   56, 64-66, 82, 104, 106, 109, 175-176, 194, 218, 224, 228, 250-251, 259, 303, 313, 326, 334, 340-344, 361, 393-396, 411, 481, 493, 537-538
plugins/search/creodias_s3.py                   29       1  96.55%   59
plugins/search/csw.py                          118      12  89.83%   121, 165, 203, 214-225, 230
plugins/search/eumetsat_ds.py                   24       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                     911      81  91.11%   372, 534-535, 558-559, 571-575, 871, 937, 971, 1053, 1074, 1077-1078, 1108-1109, 1127, 1198, 1207, 1219-1229, 1238, 1253, 1262, 1275, 1298, 1339, 1412, 1450, 1523-1524, 1526-1531, 1533-1534, 1807, 1810, 1814-1815, 1834-1837, 1851, 1878, 1896-1913, 1970-1976, 1983, 2067, 2072-2073, 2103, 2223, 2227, 2238, 2262, 2275, 2283-2293, 2319
plugins/search/stac_list_assets.py              25       0  100.00%
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                              228      55  75.88%   59, 74-76, 97-101, 114-144, 181-188, 203, 213, 308, 341, 351-369, 374, 376, 378, 400, 405, 413, 423
types/bbox.py                                   39       0  100.00%
types/download_args.py                           9       0  100.00%
types/queryables.py                            152       1  99.34%   379
types/search_args.py                            71      18  74.65%   67-71, 78-95, 110
types/stac_extensions.py                       162       4  97.53%   455-461, 641
types/stac_metadata.py                         159      22  86.16%   98, 120, 153, 186-188, 202-216, 225-232, 259-262
utils/__init__.py                              660      21  96.82%   57, 214, 221, 237, 272, 349, 601-604, 644-645, 674, 1058-1061, 1129-1130, 1162, 1369, 1481, 1613
utils/cache.py                                  23       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       6  78.57%   65-73
utils/logging.py                                42       3  92.86%   42-43, 61
utils/notebook.py                               44      13  70.45%   27, 41, 58-62, 72-78, 86-87
utils/repr.py                                   38       0  100.00%
utils/requests.py                               55       6  89.09%   94, 110, 118-120, 128
utils/s3.py                                    307      24  92.18%   97-99, 104, 110, 116, 120, 133, 137, 303-304, 345, 361, 383, 605, 688-689, 753, 795-799, 851
utils/stac_reader.py                           113      42  62.83%   63-85, 101, 138, 154-159, 206-216, 226-256
utils/streamresponse.py                         91       4  95.60%   106, 166, 175, 187
utils/yaml.py                                   42       7  83.33%   49, 65, 70-74
TOTAL                                        12205    1008  91.74%

Diff against develop

Filename                    Stmts    Miss  Cover
------------------------  -------  ------  --------
plugins/download/base.py       +1       0  +0.03%
plugins/download/http.py       -1       0  -0.02%
TOTAL                           0       0  +100.00%

Results for commit: dfc1ba8

Minimum allowed coverage is 70%

♻️ This comment has been updated with latest results

@sbrunato
sbrunato merged commit 516327c into develop Nov 5, 2026
16 checks passed
@sbrunato
sbrunato deleted the fix/awsdownload-without-url branch November 5, 2026 17:14
@sbrunato sbrunato added this to the 4.10.5.dev milestone Nov 5, 2026
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.

1 participant