From 329c3687486befe59685e4693beed10a278e5384 Mon Sep 17 00:00:00 2001 From: Alexis Jeandet Date: Tue, 28 Nov 2023 13:25:54 +0100 Subject: [PATCH] [Archive] Fixes bug #110, returns None instead of crash when there is no file on server Signed-off-by: Alexis Jeandet --- .../direct_archive_downloader.py | 11 +++++-- tests/test_direct_archive_downloader.py | 33 +++++++++++++++++-- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/speasy/core/direct_archive_downloader/direct_archive_downloader.py b/speasy/core/direct_archive_downloader/direct_archive_downloader.py index 01d3a285..276905ee 100644 --- a/speasy/core/direct_archive_downloader/direct_archive_downloader.py +++ b/speasy/core/direct_archive_downloader/direct_archive_downloader.py @@ -20,16 +20,21 @@ @CacheCall(cache_retention=timedelta(hours=24), is_pure=True) -def _read_cdf(url: str, variable: str) -> SpeasyVariable: +def _read_cdf(url: Optional[str], variable: str) -> Optional[SpeasyVariable]: + if url is None: + return None return load_variable(file=url, variable=variable) -def _build_url(url_pattern: str, date: datetime, use_file_list=False) -> str: +def _build_url(url_pattern: str, date: datetime, use_file_list=False) -> Optional[str]: base_ulr = url_pattern.format(Y=date.year, M=date.month, D=date.day) if not use_file_list: return base_ulr folder_url, rx = base_ulr.rsplit('/', 1) - return '/'.join((folder_url, sorted(list_files(folder_url, re.compile(rx)))[-1])) + files = sorted(list_files(folder_url, re.compile(rx))) + if len(files): + return '/'.join((folder_url, files[-1])) + return None def spilt_range(split_frequency: str, start_time: AnyDateTimeType, stop_time: AnyDateTimeType): diff --git a/tests/test_direct_archive_downloader.py b/tests/test_direct_archive_downloader.py index c2cf6cb3..835864df 100644 --- a/tests/test_direct_archive_downloader.py +++ b/tests/test_direct_archive_downloader.py @@ -97,9 +97,36 @@ def test_get_data(self, product, start, stop): v = spz.get_data(product, start, stop) self.assertIsNotNone(v) - def test_get_data_with_no_file(self): - v = spz.get_data(spz.inventories.tree.archive.cdpp.THEMIS.THA.L2.tha_scm.tha_scf_gse, "2018-03-10", - "2018-03-11") + @data( + ("archive/cdpp/THEMIS/THA/L2/tha_scm/tha_scf_gse", + "2018-03-10", + "2018-03-11"), + ("archive/cda/MMS/MMS1/FGM/SRVY/mms1_fgm_srvy_l2/mms1_fgm_b_bcs_srvy_l2", + "2019-08-19", + "2019-08-25"), + ) + @unpack + def test_get_data_with_no_file(self, product, start, stop): + v = spz.get_data(product, start, stop) + self.assertIsNone(v) + + @data( + ("archive/cda/MMS/MMS1/FGM/SRVY/mms1_fgm_srvy_l2/mms1_fgm_b_bcs_srvy_l2", + "2010-08-19", + "2010-08-25"), + ("archive/cdpp/THEMIS/THA/L2/tha_scm/tha_scf_gse", + "2030-03-10", + "2030-03-11"), + ("archive/cda/MMS/MMS1/FPI/BURST/MOMS/mms1_fpi_brst_l2_des_moms/mms1_des_temppara_brst", + "2006-02-28", + "2006-03-02"), + ("archive/cda/MMS/MMS1/FPI/FAST/MOMS/mms1_fpi_fast_l2_des_moms/mms1_des_energyspectr_omni_fast", + "2010-01-30T10", + "2010-02-01T12"), + ) + @unpack + def test_get_data_outside_of_range(self, product, start, stop): + v = spz.get_data(product, start, stop) self.assertIsNone(v) def test_axes_merging_across_files(self):