diff --git a/cate/core/ds.py b/cate/core/ds.py index ee40e3782..4379d3f90 100644 --- a/cate/core/ds.py +++ b/cate/core/ds.py @@ -81,6 +81,7 @@ import glob from abc import ABCMeta, abstractmethod from math import ceil, sqrt +import sys from typing import Sequence, Optional, Union, Tuple, Any import xarray as xr @@ -421,6 +422,33 @@ def _repr_html_(self): DATA_STORE_REGISTRY = DataStoreRegistry() +# noinspection PyArgumentList +class DataSourceInitializationError(Exception): + """ + Exceptions produced by Cate's DataStore during DataSource initialization. + """ + def __init__(self, cause, *args, **kwargs): + if isinstance(cause, Exception): + super(DataSourceInitializationError, self).__init__(str(cause), *args, **kwargs) + _, _, traceback = sys.exc_info() + self.with_traceback(traceback) + elif isinstance(cause, str): + super(DataSourceInitializationError, self).__init__(cause, *args, **kwargs) + else: + super(DataSourceInitializationError, self).__init__(*args, **kwargs) + self._cause = cause + + @property + def cause(self): + return self._cause + + +class DataSourceInitializationWarning(UserWarning): + """ + Warnings produced by Cate's DataStore during DataSource initialization. + """ + + def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, ds_id: str = None, query_expr: str = None) -> Sequence[DataSource]: diff --git a/cate/ds/local.py b/cate/ds/local.py index b53a99db5..eb2dcac94 100644 --- a/cate/ds/local.py +++ b/cate/ds/local.py @@ -42,6 +42,7 @@ import psutil import shutil import uuid +import warnings import xarray as xr from collections import OrderedDict from datetime import datetime @@ -53,7 +54,8 @@ from cate.conf import get_config_value, get_data_stores_path from cate.conf.defaults import NETCDF_COMPRESSION_LEVEL -from cate.core.ds import DATA_STORE_REGISTRY, DataStore, DataSource, open_xarray_dataset +from cate.core.ds import DATA_STORE_REGISTRY, DataStore, DataSource, DataSourceInitializationError, \ + DataSourceInitializationWarning, open_xarray_dataset from cate.core.types import Polygon, PolygonLike, TimeRange, TimeRangeLike, VarNames, VarNamesLike from cate.util.monitor import Monitor @@ -653,16 +655,18 @@ def __init__(self, ds_id: str, store_dir: str): def add_pattern(self, data_source_id: str, files: Union[str, Sequence[str]] = None) -> 'DataSource': data_source = self.create_data_source(data_source_id) - if isinstance(files, str): + if isinstance(files, str) and len(files) > 0: files = [files] is_first_file = True - if files: - for file in files: - if is_first_file: - data_source.add_dataset(file, extract_meta_info=True) - is_first_file = False - else: - data_source.add_dataset(file) + if not files: + raise ValueError("files pattern cannot be empty") + for file in files: + if is_first_file: + data_source.add_dataset(file, extract_meta_info=True) + is_first_file = False + else: + data_source.add_dataset(file) + self.register_ds(data_source) return data_source @@ -787,7 +791,12 @@ def _repr_html_(self): rows.append('
Contents of LocalFilePatternDataStore "%s"