From 6c8273215ace20679939cffe06c12f70407375b4 Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Wed, 19 Jul 2017 20:14:17 +0200 Subject: [PATCH 1/8] renamed function `cate.core.ds.query_data_sources` to `find_data_sources` --- CHANGES.md | 4 ++++ cate/cli/main.py | 10 +++++----- cate/core/__init__.py | 2 +- cate/core/ds.py | 7 ++++--- cate/ds/esa_cci_odp.py | 4 ++-- cate/ds/local.py | 4 ++-- cate/webapi/websocket.py | 4 ++-- doc/source/_static/uml/ds.svg | 2 +- doc/source/api_reference.rst | 2 +- doc/source/uml/ds.puml | 2 +- notebooks/cate-uc06.ipynb | 6 +++--- notebooks/cate-uc09.ipynb | 10 ++++++---- test/core/test_ds.py | 24 ++++++++++++------------ 13 files changed, 44 insertions(+), 37 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index efa32a085..e81873545 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -42,6 +42,10 @@ } ``` +### Other Changes + +* renamed function `cate.core.ds.query_data_sources` to `find_data_sources` + ### Issues Fixed/Resolved * Fixed [#294](https://github.com/CCI-Tools/cate-core/issues/294) diff --git a/cate/cli/main.py b/cate/cli/main.py index d108d0e6f..24e1c8532 100644 --- a/cate/cli/main.py +++ b/cate/cli/main.py @@ -108,7 +108,7 @@ from cate.conf.defaults import WEBAPI_INFO_FILE, WEBAPI_ON_INACTIVITY_AUTO_STOP_AFTER from cate.core.types import Like, TimeRangeLike -from cate.core.ds import DATA_STORE_REGISTRY, query_data_sources +from cate.core.ds import DATA_STORE_REGISTRY, find_data_sources from cate.core.objectio import OBJECT_IO_REGISTRY, find_writer, read_object from cate.core.op import OP_REGISTRY from cate.core.plugin import PLUGIN_REGISTRY @@ -1156,16 +1156,16 @@ def _execute_list(cls, command_args): if command_args.coverage: ds_names = OrderedDict(sorted(((ds.name, TimeRangeLike.format(ds.temporal_coverage()) if ds.temporal_coverage() else None) - for ds in query_data_sources()), + for ds in find_data_sources()), key=lambda item: item[0])) else: - ds_names = sorted(data_source.name for data_source in query_data_sources()) + ds_names = sorted(data_source.name for data_source in find_data_sources()) _list_items('data source', 'data sources', ds_names, ds_name) @classmethod def _execute_info(cls, command_args): ds_name = command_args.ds_name - data_sources = [data_source for data_source in query_data_sources(name=ds_name) if data_source.name == ds_name] + data_sources = [data_source for data_source in find_data_sources(name=ds_name) if data_source.name == ds_name] if not data_sources: raise CommandError('data source "%s" not found' % ds_name) @@ -1222,7 +1222,7 @@ def _execute_copy(cls, command_args): raise RuntimeError('internal error: no local data store found') ds_name = command_args.ref_ds - data_source = next(iter(query_data_sources(None, ds_name)), None) + data_source = next(iter(find_data_sources(None, ds_name)), None) if data_source is None: raise RuntimeError('internal error: no local data source found: %s' % ds_name) diff --git a/cate/core/__init__.py b/cate/core/__init__.py index 1f64dee98..9a122fe8f 100644 --- a/cate/core/__init__.py +++ b/cate/core/__init__.py @@ -24,7 +24,7 @@ """ # noinspection PyUnresolvedReferences -from .ds import DataStore, DataSource, open_dataset, query_data_sources, DATA_STORE_REGISTRY +from .ds import DataStore, DataSource, open_dataset, find_data_sources, DATA_STORE_REGISTRY # noinspection PyUnresolvedReferences from .op import op, op_input, op_output, op_return, Operation, OP_REGISTRY, \ diff --git a/cate/core/ds.py b/cate/core/ds.py index c20c162e0..15e13fa49 100644 --- a/cate/core/ds.py +++ b/cate/core/ds.py @@ -437,8 +437,9 @@ def _repr_html_(self): DATA_STORE_REGISTRY = DataStoreRegistry() -def query_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, name=None) -> Sequence[DataSource]: - """Query the data store(s) for data sources matching the given constrains. +def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, name=None) -> Sequence[DataSource]: + """ + Find data sources in the given data store(s) matching the given query string. See also :py:func:`open_dataset`. @@ -494,7 +495,7 @@ def open_dataset(data_source: Union[DataSource, str], if isinstance(data_source, str): data_store_list = list(DATA_STORE_REGISTRY.get_data_stores()) - data_sources = query_data_sources(data_store_list, name=data_source) + data_sources = find_data_sources(data_store_list, name=data_source) if len(data_sources) == 0: raise ValueError("No data_source found for the given query term", data_source) elif len(data_sources) > 1: diff --git a/cate/ds/esa_cci_odp.py b/cate/ds/esa_cci_odp.py index cf793430e..327dcfc11 100644 --- a/cate/ds/esa_cci_odp.py +++ b/cate/ds/esa_cci_odp.py @@ -59,7 +59,7 @@ from cate.conf import get_config_value from cate.conf.defaults import NETCDF_COMPRESSION_LEVEL from cate.core.ds import DATA_STORE_REGISTRY, DataStore, DataSource, Schema, \ - open_xarray_dataset, get_data_stores_path, query_data_sources + open_xarray_dataset, get_data_stores_path, find_data_sources from cate.core.types import PolygonLike, TimeRange, TimeRangeLike, VarNamesLike from cate.ds.local import add_to_data_store_registry, LocalDataSource from cate.util.monitor import Monitor @@ -574,7 +574,7 @@ def update_local(self, time_range: TimeRangeLike.TYPE, monitor: Monitor = Monitor.NONE) -> bool: - data_sources = query_data_sources(None, local_id) # type: Sequence['DataSource'] + data_sources = find_data_sources(None, local_id) # type: Sequence['DataSource'] data_source = next((ds for ds in data_sources if isinstance(ds, LocalDataSource) and ds.name == local_id), None) # type: LocalDataSource if not data_source: diff --git a/cate/ds/local.py b/cate/ds/local.py index f798b29ea..7ee504e5d 100644 --- a/cate/ds/local.py +++ b/cate/ds/local.py @@ -55,7 +55,7 @@ from cate.conf import get_config_value from cate.conf.defaults import NETCDF_COMPRESSION_LEVEL -from cate.core.ds import DATA_STORE_REGISTRY, DataStore, DataSource, open_xarray_dataset, query_data_sources +from cate.core.ds import DATA_STORE_REGISTRY, DataStore, DataSource, open_xarray_dataset, find_data_sources from cate.core.ds import get_data_stores_path from cate.core.types import PolygonLike, TimeRange, TimeRangeLike, VarNamesLike from cate.util.monitor import Monitor @@ -340,7 +340,7 @@ def update_local(self, time_range: TimeRangeLike.TYPE, monitor: Monitor = Monitor.NONE) -> bool: - data_sources = query_data_sources(None, local_id) # type: Sequence['DataSource'] + data_sources = find_data_sources(None, local_id) # type: Sequence['DataSource'] data_source = next((ds for ds in data_sources if isinstance(ds, LocalDataSource) and ds.name == local_id), None) # type: LocalDataSource if not data_source: diff --git a/cate/webapi/websocket.py b/cate/webapi/websocket.py index 265baf17d..26ac8b324 100644 --- a/cate/webapi/websocket.py +++ b/cate/webapi/websocket.py @@ -29,7 +29,7 @@ from cate.conf import conf from cate.conf.defaults import GLOBAL_CONF_FILE, WEBAPI_USE_WORKSPACE_IMAGERY_CACHE -from cate.core.ds import DATA_STORE_REGISTRY, get_data_stores_path, query_data_sources +from cate.core.ds import DATA_STORE_REGISTRY, get_data_stores_path, find_data_sources from cate.core.op import OP_REGISTRY from cate.core.wsmanag import WorkspaceManager from cate.core.workspace import OpKwArgs @@ -176,7 +176,7 @@ def make_ds_local(self, :return: JSON-serializable list of 'local' data sources, sorted by name. """ with monitor.starting('Making data source local', 100): - data_sources = query_data_sources(name=data_source_name) + data_sources = find_data_sources(name=data_source_name) if not data_sources: raise ValueError('data source "%s" not found' % data_source_name) if len(data_sources) > 1: diff --git a/doc/source/_static/uml/ds.svg b/doc/source/_static/uml/ds.svg index 876f24da9..506a22629 100644 --- a/doc/source/_static/uml/ds.svg +++ b/doc/source/_static/uml/ds.svg @@ -22,4 +22,4 @@ ~ --> -globalsDATA_STORE_REGISTRY: DataStoreRegistryquery_data_sources(data_stores, constraints)open_dataset(data_source, name, time_range)Plugins can extendDATA_STORE_REGISTRYby adding new data storesDataStoreRegistryget_data_stores(): List[DataStore]get_data_store(name): DataStoreadd_data_store(DataStore): voidremove_data_store(DataStore): voidDataStorename: strquery(query_expr): DataSourceDataSourcename: strget_dataset_schema(): cdm.Schemaopen_dataset(name, time_range): xarray.Datasetsync(time_range)N<provide> \ No newline at end of file +globalsDATA_STORE_REGISTRY: DataStoreRegistryfind_data_sources(data_stores, constraints)open_dataset(data_source, name, time_range)Plugins can extendDATA_STORE_REGISTRYby adding new data storesDataStoreRegistryget_data_stores(): List[DataStore]get_data_store(name): DataStoreadd_data_store(DataStore): voidremove_data_store(DataStore): voidDataStorename: strquery(query_expr): DataSourceDataSourcename: strget_dataset_schema(): cdm.Schemaopen_dataset(name, time_range): xarray.Datasetsync(time_range)N<provide> \ No newline at end of file diff --git a/doc/source/api_reference.rst b/doc/source/api_reference.rst index ca12a9ab9..ea92d2167 100644 --- a/doc/source/api_reference.rst +++ b/doc/source/api_reference.rst @@ -5,7 +5,7 @@ API Reference Datasets ======== -.. autofunction:: cate.core.query_data_sources +.. autofunction:: cate.core.find_data_sources .. autofunction:: cate.core.open_dataset diff --git a/doc/source/uml/ds.puml b/doc/source/uml/ds.puml index c336ef429..60461d735 100644 --- a/doc/source/uml/ds.puml +++ b/doc/source/uml/ds.puml @@ -2,7 +2,7 @@ object globals { DATA_STORE_REGISTRY: DataStoreRegistry - query_data_sources(data_stores, constraints) + find_data_sources(data_stores, constraints) open_dataset(data_source, name, time_range) } diff --git a/notebooks/cate-uc06.ipynb b/notebooks/cate-uc06.ipynb index 91259006f..70c52c685 100644 --- a/notebooks/cate-uc06.ipynb +++ b/notebooks/cate-uc06.ipynb @@ -530,7 +530,7 @@ "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 3.0 }, "file_extension": ".py", "mimetype": "text/x-python", @@ -541,5 +541,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/notebooks/cate-uc09.ipynb b/notebooks/cate-uc09.ipynb index 108a7b2db..1da458b1b 100644 --- a/notebooks/cate-uc09.ipynb +++ b/notebooks/cate-uc09.ipynb @@ -524,7 +524,9 @@ "collapsed": true }, "outputs": [], - "source": [] + "source": [ + "" + ] } ], "metadata": { @@ -536,7 +538,7 @@ "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 3.0 }, "file_extension": ".py", "mimetype": "text/x-python", @@ -547,5 +549,5 @@ } }, "nbformat": 4, - "nbformat_minor": 1 -} + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/test/core/test_ds.py b/test/core/test_ds.py index 928d33cfb..28598ce74 100644 --- a/test/core/test_ds.py +++ b/test/core/test_ds.py @@ -95,7 +95,7 @@ def setUp(self): self.DS_SST = SimpleDataSource('sst') self.TEST_DATA_STORE_SST = SimpleDataStore('test_sst', [self.DS_SST]) - def test_query_data_sources_default_data_store(self): + def test_find_data_sources_default_data_store(self): size_before = len(ds.DATA_STORE_REGISTRY) orig_stores = list(ds.DATA_STORE_REGISTRY.get_data_stores()) try: @@ -106,16 +106,16 @@ def test_query_data_sources_default_data_store(self): set_default_data_store_ftp() self.assertEqual(1, len(ds.DATA_STORE_REGISTRY)) - data_sources = ds.query_data_sources() + data_sources = ds.find_data_sources() self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 98) self.assertEqual(data_sources[0].name, "AEROSOL_ATSR2_SU_L3_V4.2_DAILY") - data_sources = ds.query_data_sources(name="AEROSOL_ATSR2_SU_L3_V4.2_DAILY") + data_sources = ds.find_data_sources(name="AEROSOL_ATSR2_SU_L3_V4.2_DAILY") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) - data_sources = ds.query_data_sources(name="ZZ") + data_sources = ds.find_data_sources(name="ZZ") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 0) finally: @@ -124,34 +124,34 @@ def test_query_data_sources_default_data_store(self): ds.DATA_STORE_REGISTRY.add_data_store(data_store) self.assertEqual(size_before, len(ds.DATA_STORE_REGISTRY)) - def test_query_data_sources_with_data_store_value(self): - data_sources = ds.query_data_sources(data_stores=self.TEST_DATA_STORE) + def test_find_data_sources_with_data_store_value(self): + data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE) self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 2) self.assertEqual(data_sources[0].name, "aerosol") self.assertEqual(data_sources[1].name, "ozone") - def test_query_data_sources_with_data_store_list(self): + def test_find_data_sources_with_data_store_list(self): data_stores = [self.TEST_DATA_STORE, self.TEST_DATA_STORE_SST] - data_sources = ds.query_data_sources(data_stores=data_stores) + data_sources = ds.find_data_sources(data_stores=data_stores) self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 3) self.assertEqual(data_sources[0].name, "aerosol") self.assertEqual(data_sources[1].name, "ozone") self.assertEqual(data_sources[2].name, "sst") - def test_query_data_sources_with_constrains(self): - data_sources = ds.query_data_sources(data_stores=self.TEST_DATA_STORE, name="aerosol") + def test_find_data_sources_with_constrains(self): + data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, name="aerosol") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) self.assertEqual(data_sources[0].name, "aerosol") - data_sources = ds.query_data_sources(data_stores=self.TEST_DATA_STORE, name="ozone") + data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, name="ozone") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) self.assertEqual(data_sources[0].name, "ozone") - data_sources = ds.query_data_sources(data_stores=self.TEST_DATA_STORE, name="Z") + data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, name="Z") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) From 7366d1630cfb2ba960b030f6a2433896a9b9f666 Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Wed, 19 Jul 2017 20:59:03 +0200 Subject: [PATCH 2/8] renamed method DataSource.matches_filter to matches changed signature of method DataStore.query and DataSource.matches_filter --- CHANGES.md | 5 +++- cate/cli/main.py | 4 ++-- cate/core/ds.py | 40 ++++++++++++++++++++----------- cate/ds/esa_cci_ftp.py | 6 +++-- cate/ds/esa_cci_odp.py | 12 ++++------ cate/ds/local.py | 12 ++++------ cate/webapi/websocket.py | 4 ++-- doc/source/about.rst | 4 ++-- doc/source/uml/ds.puml | 4 ++-- doc/source/user_manual/um_cli.rst | 14 +++++------ test/core/test_ds.py | 14 +++++------ 11 files changed, 66 insertions(+), 53 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e81873545..e948eb33c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -44,7 +44,10 @@ ### Other Changes -* renamed function `cate.core.ds.query_data_sources` to `find_data_sources` +* renamed and changed signature of function `cate.core.ds.DataStore.query_data_sources(..., name=None)` + to `query_data_sources(..., id=None, query_expr=None)` +* changed signature of method `cate.core.ds.DataStore.query(name, ...)` to `query(id=None, query_expr=None, ...)` +* renamed and changed signature of method `cate.core.ds.DataSource.matches_filter(name)` to `matches(id=None, query_expr=None)` ### Issues Fixed/Resolved diff --git a/cate/cli/main.py b/cate/cli/main.py index 24e1c8532..dce9b4753 100644 --- a/cate/cli/main.py +++ b/cate/cli/main.py @@ -1165,7 +1165,7 @@ def _execute_list(cls, command_args): @classmethod def _execute_info(cls, command_args): ds_name = command_args.ds_name - data_sources = [data_source for data_source in find_data_sources(name=ds_name) if data_source.name == ds_name] + data_sources = [data_source for data_source in find_data_sources(id=ds_name) if data_source.name == ds_name] if not data_sources: raise CommandError('data source "%s" not found' % ds_name) @@ -1222,7 +1222,7 @@ def _execute_copy(cls, command_args): raise RuntimeError('internal error: no local data store found') ds_name = command_args.ref_ds - data_source = next(iter(find_data_sources(None, ds_name)), None) + data_source = next(iter(find_data_sources(None, id=ds_name)), None) if data_source is None: raise RuntimeError('internal error: no local data source found: %s' % ds_name) diff --git a/cate/core/ds.py b/cate/core/ds.py index 15e13fa49..8f4ac5e9c 100644 --- a/cate/core/ds.py +++ b/cate/core/ds.py @@ -92,7 +92,6 @@ from .types import PolygonLike, TimeRange, TimeRangeLike, VarNamesLike from ..util import Monitor - __author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ "Marco Zühlke (Brockmann Consult GmbH), " \ "Chris Bernat (Telespazio VEGA UK Ltd)" @@ -146,9 +145,18 @@ def protocols(self) -> []: def data_store(self) -> 'DataStore': """The data store to which this data source belongs.""" - def matches_filter(self, name=None) -> bool: - """Test if this data source matches the given *constraints*.""" - if name and name.lower() not in self.name.lower(): + def matches(self, id: str = None, query_expr: str = None) -> bool: + """ + Test if this data source matches the given *id* or *query_expr*. + If neither *id* nor *query_expr* are given, the method returns True. + + :param id: A data source identifier. + :param query_expr: A query expression. Currently, only simple search strings are supported. + :return: True, if this data sources matches the given *id* or *query_expr*. + """ + if query_expr: + raise NotImplementedError('query_expr not yet supported') + if id and id.lower() not in self.name.lower(): return False return True @@ -370,11 +378,12 @@ def data_store_path(self) -> Optional[str]: return None @abstractmethod - def query(self, name=None, monitor: Monitor = Monitor.NONE) -> Sequence[DataSource]: + def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence[DataSource]: """ Retrieve data sources in this data store using the given constraints. - :param name: Name of the data source. + :param id: Data source identifier. + :param query_expr: Query expression which may be used if *ìd* is unknown. :param monitor: A progress monitor. :return: Sequence of data sources. """ @@ -437,14 +446,17 @@ def _repr_html_(self): DATA_STORE_REGISTRY = DataStoreRegistry() -def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, name=None) -> Sequence[DataSource]: +def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, + id: str = None, + query_expr: str = None) -> Sequence[DataSource]: """ - Find data sources in the given data store(s) matching the given query string. + Find data sources in the given data store(s) matching the given *id* or *query_expr*. See also :py:func:`open_dataset`. :param data_stores: If given these data stores will be queried. Otherwise all registered data stores will be used. - :param name: The name of a data source. + :param id: A data source identifier. + :param query_expr: A query expression. :return: All data sources matching the given constrains. """ results = [] @@ -456,9 +468,9 @@ def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, primary_data_store = data_stores else: data_store_list = data_stores - if not primary_data_store and name and name.count('.') > 0: + if not primary_data_store and id and id.count('.') > 0: primary_data_store_index = -1 - primary_data_store_name, data_source_name = name.split('.', 1) + primary_data_store_name, data_source_name = id.split('.', 1) for idx, data_store in enumerate(data_store_list): if data_store.name == primary_data_store_name: primary_data_store_index = idx @@ -466,11 +478,11 @@ def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, primary_data_store = data_store_list.pop(primary_data_store_index) if primary_data_store: - results.extend(primary_data_store.query(name)) + results.extend(primary_data_store.query(id=id, query_expr=query_expr)) if not results: # noinspection PyTypeChecker for data_store in data_store_list: - results.extend(data_store.query(name)) + results.extend(data_store.query(id=id, query_expr=query_expr)) return results @@ -495,7 +507,7 @@ def open_dataset(data_source: Union[DataSource, str], if isinstance(data_source, str): data_store_list = list(DATA_STORE_REGISTRY.get_data_stores()) - data_sources = find_data_sources(data_store_list, name=data_source) + data_sources = find_data_sources(data_store_list, id=data_source) if len(data_sources) == 0: raise ValueError("No data_source found for the given query term", data_source) elif len(data_sources) > 1: diff --git a/cate/ds/esa_cci_ftp.py b/cate/ds/esa_cci_ftp.py index cfd3ba0f5..76eccc9d8 100644 --- a/cate/ds/esa_cci_ftp.py +++ b/cate/ds/esa_cci_ftp.py @@ -544,8 +544,10 @@ def remote_url(self) -> str: """Optional URL of the data store's remote service.""" return self._remote_url - def query(self, name=None, monitor: Monitor = Monitor.NONE) -> Sequence[DataSource]: - return [ds for ds in self._data_sources if ds.matches_filter(name)] + def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence[DataSource]: + if id or query_expr: + return [ds for ds in self._data_sources if ds.matches(id=id, query_expr=query_expr)] + return self._data_sources def load_from_json(self, json_fp_or_str: Union[str, IOBase]): if isinstance(json_fp_or_str, str): diff --git a/cate/ds/esa_cci_odp.py b/cate/ds/esa_cci_odp.py index 327dcfc11..ad67393ed 100644 --- a/cate/ds/esa_cci_odp.py +++ b/cate/ds/esa_cci_odp.py @@ -313,13 +313,11 @@ def update_indices(self, update_file_lists: bool = False, monitor: Monitor = Mon data_source.update_file_list() child_monitor.progress(work=1) - def query(self, name: str = None, monitor: Monitor = Monitor.NONE) -> Sequence['DataSource']: + def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence['DataSource']: self._init_data_sources() - if name: - result = [data_source for data_source in self._data_sources if data_source.matches_filter(name)] - else: - result = self._data_sources - return result + if id or query_expr: + return [ds for ds in self._data_sources if ds.matches(id=id, query_expr=query_expr)] + return self._data_sources def _repr_html_(self) -> str: self._init_data_sources() @@ -574,7 +572,7 @@ def update_local(self, time_range: TimeRangeLike.TYPE, monitor: Monitor = Monitor.NONE) -> bool: - data_sources = find_data_sources(None, local_id) # type: Sequence['DataSource'] + data_sources = find_data_sources(None, id=local_id) # type: Sequence['DataSource'] data_source = next((ds for ds in data_sources if isinstance(ds, LocalDataSource) and ds.name == local_id), None) # type: LocalDataSource if not data_source: diff --git a/cate/ds/local.py b/cate/ds/local.py index 7ee504e5d..792580350 100644 --- a/cate/ds/local.py +++ b/cate/ds/local.py @@ -340,7 +340,7 @@ def update_local(self, time_range: TimeRangeLike.TYPE, monitor: Monitor = Monitor.NONE) -> bool: - data_sources = find_data_sources(None, local_id) # type: Sequence['DataSource'] + data_sources = find_data_sources(None, id=local_id) # type: Sequence['DataSource'] data_source = next((ds for ds in data_sources if isinstance(ds, LocalDataSource) and ds.name == local_id), None) # type: LocalDataSource if not data_source: @@ -606,13 +606,11 @@ def create_data_source(self, name: str, region: PolygonLike.TYPE = None, def data_store_path(self): return self._store_dir - def query(self, name=None, monitor: Monitor = Monitor.NONE) -> Sequence[LocalDataSource]: + def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence[LocalDataSource]: self._init_data_sources() - if name: - result = [ds for ds in self._data_sources if ds.matches_filter(name)] - else: - result = self._data_sources - return result + if id or query_expr: + return [ds for ds in self._data_sources if ds.matches(id=id, query_expr=query_expr)] + return self._data_sources def __repr__(self): return "LocalFilePatternDataStore(%s)" % repr(self.name) diff --git a/cate/webapi/websocket.py b/cate/webapi/websocket.py index 26ac8b324..8bc0190ce 100644 --- a/cate/webapi/websocket.py +++ b/cate/webapi/websocket.py @@ -147,7 +147,7 @@ def get_ds_temporal_coverage(self, data_store_id: str, data_source_id: str, moni data_store = DATA_STORE_REGISTRY.get_data_store(data_store_id) if data_store is None: raise ValueError('Unknown data store: "%s"' % data_store_id) - data_sources = data_store.query(name=data_source_id) + data_sources = data_store.query(id=data_source_id) if not data_sources: raise ValueError('data source "%s" not found' % data_source_id) data_source = data_sources[0] @@ -176,7 +176,7 @@ def make_ds_local(self, :return: JSON-serializable list of 'local' data sources, sorted by name. """ with monitor.starting('Making data source local', 100): - data_sources = find_data_sources(name=data_source_name) + data_sources = find_data_sources(id=data_source_name) if not data_sources: raise ValueError('data source "%s" not found' % data_source_name) if len(data_sources) > 1: diff --git a/doc/source/about.rst b/doc/source/about.rst index 7ada63916..420ca4641 100644 --- a/doc/source/about.rst +++ b/doc/source/about.rst @@ -72,9 +72,9 @@ to get an overview of the supported sub-comands. For example, use::: $ cate ds list -to list and query available data sources. +to list available data sources. -In the GUI, the panel **DATA SOURCES** lets you query and open all available data sources. +In the GUI, the panel **DATA SOURCES** lets you query and open available data sources. Note that all remote CCI data source identifiers are prefixed by "esacci.", for example ``esacci.SST.day.L4.SSTdepth.multi-sensor.multi-platform.OSTIA.1-0.r1``. Local data source identifiers are diff --git a/doc/source/uml/ds.puml b/doc/source/uml/ds.puml index 60461d735..a8edd3881 100644 --- a/doc/source/uml/ds.puml +++ b/doc/source/uml/ds.puml @@ -2,7 +2,7 @@ object globals { DATA_STORE_REGISTRY: DataStoreRegistry - find_data_sources(data_stores, constraints) + find_data_sources(data_stores, id, query_expr) open_dataset(data_source, name, time_range) } @@ -21,7 +21,7 @@ class DataStoreRegistry { interface DataStore { name: str - {abstract} query(query_expr): DataSource + {abstract} query(id, query_expr): DataSource } interface DataSource { diff --git a/doc/source/user_manual/um_cli.rst b/doc/source/user_manual/um_cli.rst index ab31f5f0c..08f0bb629 100644 --- a/doc/source/user_manual/um_cli.rst +++ b/doc/source/user_manual/um_cli.rst @@ -73,19 +73,19 @@ The following examples shall help you understand the basic concepts behind the v Manage datasets --------------- -To query all available datasets, type:: +To list all available data sources, type:: cate ds list -To query all datasets that have ``ozone`` in their name, type:: +To query all data sources that have ``ozone`` in their name, type:: cate ds list -n ozone -To get more detailed information on a specific dataset, e.g. ``esacci.OZONE.mon.L3...``, type:: +To get more detailed information on a specific data source, e.g. ``esacci.OZONE.mon.L3...``, type:: cate ds info esacci.OZONE.mon.L3.NP.multi-sensor.multi-platform.MERGED.fv0002.r1 -To add a local Dataset from all netCDF files in e.g. ``data/sst_v3`` and name it e.g. ``SSTV3``, type:: +To add a local data source from all NetCDF files in e.g. ``data/sst_v3`` and name it e.g. ``SSTV3``, type:: cate ds def SSTV3 data/sst_v3/*.nc @@ -93,12 +93,12 @@ Make sure it is there:: cate ds list -n SSTV3 -To make a temporal subset ECV dataset locally available, i.e. avoid remote data access during its usage:: +To make a temporal subset ECV data source locally available, i.e. avoid remote data access during its usage:: cate ds copy esacci.OZONE.mon.L3.NP.multi-sensor.multi-platform.MERGED.fv0002.r1 -t 2006-01-01,2007-12-31 -The section :doc:`um_config` describes, how to configure the directory where ``cate`` stores such synchronised -data. +The section :doc:`um_config` describes, how to configure the location of directory in which +Cate stores such synchronised data. Inspect available operations ---------------------------- diff --git a/test/core/test_ds.py b/test/core/test_ds.py index 28598ce74..65f84b24d 100644 --- a/test/core/test_ds.py +++ b/test/core/test_ds.py @@ -18,8 +18,8 @@ def __init__(self, name: str, data_sources: Sequence[ds.DataSource]): super().__init__(name) self._data_sources = list(data_sources) - def query(self, name=None, monitor: Monitor = Monitor.NONE) -> Sequence[ds.DataSource]: - return [ds for ds in self._data_sources if ds.matches_filter(name)] + def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence[ds.DataSource]: + return [ds for ds in self._data_sources if ds.matches(id=id)] def _repr_html_(self): return '' @@ -111,11 +111,11 @@ def test_find_data_sources_default_data_store(self): self.assertEqual(len(data_sources), 98) self.assertEqual(data_sources[0].name, "AEROSOL_ATSR2_SU_L3_V4.2_DAILY") - data_sources = ds.find_data_sources(name="AEROSOL_ATSR2_SU_L3_V4.2_DAILY") + data_sources = ds.find_data_sources(id="AEROSOL_ATSR2_SU_L3_V4.2_DAILY") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) - data_sources = ds.find_data_sources(name="ZZ") + data_sources = ds.find_data_sources(id="ZZ") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 0) finally: @@ -141,17 +141,17 @@ def test_find_data_sources_with_data_store_list(self): self.assertEqual(data_sources[2].name, "sst") def test_find_data_sources_with_constrains(self): - data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, name="aerosol") + data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, id="aerosol") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) self.assertEqual(data_sources[0].name, "aerosol") - data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, name="ozone") + data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, id="ozone") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) self.assertEqual(data_sources[0].name, "ozone") - data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, name="Z") + data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, id="Z") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) From d61c07fb4723fd2bc82b2db9b0ff571db567aa00 Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Wed, 19 Jul 2017 21:39:39 +0200 Subject: [PATCH 3/8] renamed property DataStource.name to id --- CHANGES.md | 3 +- cate/cli/main.py | 12 +++--- cate/core/ds.py | 16 +++++--- cate/ds/esa_cci_ftp.py | 26 ++++++------- cate/ds/esa_cci_odp.py | 65 ++++++++++++++++---------------- cate/ds/local.py | 74 ++++++++++++++++++------------------- cate/webapi/websocket.py | 4 +- test/core/test_ds.py | 28 +++++++------- test/ds/test_esa_cci_ftp.py | 4 +- test/ds/test_esa_cci_odp.py | 12 +++--- test/ds/test_local.py | 20 +++++----- 11 files changed, 137 insertions(+), 127 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e948eb33c..a75d5af89 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -44,8 +44,9 @@ ### Other Changes +* renamed property `cate.core.ds.DataStource.name` to `id` * renamed and changed signature of function `cate.core.ds.DataStore.query_data_sources(..., name=None)` - to `query_data_sources(..., id=None, query_expr=None)` + to `find_data_sources(..., id=None, query_expr=None)` * changed signature of method `cate.core.ds.DataStore.query(name, ...)` to `query(id=None, query_expr=None, ...)` * renamed and changed signature of method `cate.core.ds.DataSource.matches_filter(name)` to `matches(id=None, query_expr=None)` diff --git a/cate/cli/main.py b/cate/cli/main.py index dce9b4753..f7256b26f 100644 --- a/cate/cli/main.py +++ b/cate/cli/main.py @@ -1154,23 +1154,23 @@ def configure_parser_and_subparsers(cls, parser, subparsers): def _execute_list(cls, command_args): ds_name = command_args.name if command_args.coverage: - ds_names = OrderedDict(sorted(((ds.name, TimeRangeLike.format(ds.temporal_coverage()) + ds_names = OrderedDict(sorted(((ds.id, TimeRangeLike.format(ds.temporal_coverage()) if ds.temporal_coverage() else None) for ds in find_data_sources()), key=lambda item: item[0])) else: - ds_names = sorted(data_source.name for data_source in find_data_sources()) + ds_names = sorted(data_source.id for data_source in find_data_sources()) _list_items('data source', 'data sources', ds_names, ds_name) @classmethod def _execute_info(cls, command_args): ds_name = command_args.ds_name - data_sources = [data_source for data_source in find_data_sources(id=ds_name) if data_source.name == ds_name] + data_sources = [data_source for data_source in find_data_sources(id=ds_name) if data_source.id == ds_name] if not data_sources: raise CommandError('data source "%s" not found' % ds_name) data_source = data_sources[0] - title = 'Data source %s' % data_source.name + title = 'Data source %s' % data_source.id print() print(title) print('=' * len(title)) @@ -1197,7 +1197,7 @@ def _execute_add(cls, command_args): ds_name = command_args.ds_name files = command_args.file ds = local_store.add_pattern(ds_name, files) - print("Local data source with name '%s' added." % ds.name) + print("Local data source with name '%s' added." % ds.id) @classmethod def _execute_del(cls, command_args): @@ -1234,7 +1234,7 @@ def _execute_copy(cls, command_args): ds = data_source.make_local(local_name, None, time_range=time_range, region=region, var_names=var_names, monitor=cls.new_monitor()) - print("Local data source with name '%s' has been created." % ds.name) + print("Local data source with name '%s' has been created." % ds.id) class PluginCommand(SubCommandCommand): diff --git a/cate/core/ds.py b/cate/core/ds.py index 8f4ac5e9c..16f84e952 100644 --- a/cate/core/ds.py +++ b/cate/core/ds.py @@ -115,8 +115,14 @@ class DataSource(metaclass=ABCMeta): @property @abstractmethod - def name(self) -> str: - """Human-readable data source name.""" + def id(self) -> str: + """Data source identifier.""" + + # TODO (forman): see issue #299 + # @property + # @abstractmethod + # def title(self) -> str: + # """Human-readable data source title.""" @property def schema(self) -> Optional[Schema]: @@ -156,7 +162,7 @@ def matches(self, id: str = None, query_expr: str = None) -> bool: """ if query_expr: raise NotImplementedError('query_expr not yet supported') - if id and id.lower() not in self.name.lower(): + if id and id.lower() not in self.id.lower(): return False return True @@ -361,14 +367,14 @@ class DataStore(metaclass=ABCMeta): """Represents a data store of data sources.""" def __init__(self, name: str): - self._name = name + self._id = name @property def name(self) -> str: """ Return the name of this data store. """ - return self._name + return self._id @property def data_store_path(self) -> Optional[str]: diff --git a/cate/ds/esa_cci_ftp.py b/cate/ds/esa_cci_ftp.py index 76eccc9d8..e2f909b1b 100644 --- a/cate/ds/esa_cci_ftp.py +++ b/cate/ds/esa_cci_ftp.py @@ -20,10 +20,6 @@ # SOFTWARE. -__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ - "Marco Zühlke (Brockmann Consult GmbH), " \ - "Chris Bernat (Telespacio VEGA UK Inc.)" - """ Description =========== @@ -61,6 +57,10 @@ from cate.core.types import PolygonLike, TimeRangeLike, VarNamesLike from cate.util import to_datetime, Monitor, Cancellation +__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ + "Marco Zühlke (Brockmann Consult GmbH), " \ + "Chris Bernat (Telespacio VEGA UK Inc.)" + Time = Union[str, datetime] TimeRange = Tuple[Time, Time] @@ -85,7 +85,7 @@ class FileSetDataSource(DataSource): Parameters ---------- - name : str + id : str The name of the file set base_dir : str The base directory @@ -101,19 +101,19 @@ class FileSetDataSource(DataSource): def __init__(self, file_set_data_store: 'FileSetDataStore', - name: str, + id: str, base_dir: str, file_pattern: str, fileset_info: 'FileSetInfo' = None): self._file_set_data_store = file_set_data_store - self._name = name + self._id = id self._base_dir = base_dir self._file_pattern = file_pattern self._fileset_info = fileset_info @property - def name(self): - return self._name + def id(self): + return self._id @property def schema(self) -> Schema: @@ -153,7 +153,7 @@ def to_json_dict(self): :return: A JSON-serializable dictionary """ fsds_dict = OrderedDict() - fsds_dict['name'] = self.name + fsds_dict['name'] = self.id fsds_dict['base_dir'] = self._base_dir fsds_dict['file_pattern'] = self._file_pattern if self._fileset_info: @@ -234,7 +234,7 @@ def sync(self, num_of_synchronised_files = 0 num_of_expected_remote_files = len(list(chain.from_iterable(list(expected_remote_files.values())))) - with monitor.starting('Sync %s' % self._name, num_of_expected_remote_files): + with monitor.starting('Sync %s' % self._id, num_of_expected_remote_files): try: with ftplib.FTP(ftp_host_name) as ftp: ftp.login() @@ -318,7 +318,7 @@ def _get_expected_remote_files(self, time_range: TimeRange = (None, None)) -> Ma return expected_remote_files def __repr__(self): - return "FileSetDataSource(%s, %s, %s)" % (repr(self._name), repr(self._base_dir), repr(self._file_pattern)) + return "FileSetDataSource(%s, %s, %s)" % (repr(self._id), repr(self._base_dir), repr(self._file_pattern)) @property def info_string(self): @@ -338,7 +338,7 @@ def _repr_html_(self): return '%s
' % rows def get_table_data(self): - return OrderedDict([('Name', self._name), + return OrderedDict([('Name', self._id), ('Base directory', self._base_dir), ('File pattern', self._file_pattern)]) diff --git a/cate/ds/esa_cci_odp.py b/cate/ds/esa_cci_odp.py index ad67393ed..220a4dd65 100644 --- a/cate/ds/esa_cci_odp.py +++ b/cate/ds/esa_cci_odp.py @@ -18,9 +18,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ - "Marco Zühlke (Brockmann Consult GmbH), " \ - "Chris Bernat (Telespazio VEGA UK Ltd)" """ Description @@ -64,6 +61,10 @@ from cate.ds.local import add_to_data_store_registry, LocalDataSource from cate.util.monitor import Monitor +__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ + "Marco Zühlke (Brockmann Consult GmbH), " \ + "Chris Bernat (Telespazio VEGA UK Ltd)" + _ESGF_CEDA_URL = "https://esgf-index1.ceda.ac.uk/esg-search/search/" _CSW_CEDA_URL = "http://csw1.cems.rl.ac.uk/geonetwork-CEDA/srv/eng/csw-CEDA-CCI" @@ -141,6 +142,7 @@ def _fetch_solr_json(base_url, query_args, offset=0, limit=3500, timeout=10, mon while True: monitor.progress(work=1) paging_query_args = dict(query_args or {}) + # noinspection PyArgumentList paging_query_args.update(offset=offset, limit=limit, format='application/solr+json') url = base_url + '?' + urllib.parse.urlencode(paging_query_args) with urllib.request.urlopen(url, timeout=timeout) as response: @@ -205,6 +207,7 @@ def _load_or_fetch_json(fetch_json_function, if json_obj is None: # noinspection PyArgumentList try: + # noinspection PyArgumentList json_obj = fetch_json_function(*(fetch_json_args or []), **(fetch_json_kwargs or {})) if cache_used: os.makedirs(cache_dir, exist_ok=True) @@ -438,7 +441,7 @@ def __init__(self, self._meta_info = None @property - def name(self) -> str: + def id(self) -> str: return self._master_id @property @@ -454,7 +457,6 @@ def spatial_coverage(self) -> Optional[PolygonLike]: if self._catalogue_data \ and self._catalogue_data.get('bbox_minx', None) and self._catalogue_data.get('bbox_miny', None) \ and self._catalogue_data.get('bbox_maxx', None) and self._catalogue_data.get('bbox_maxy', None): - return PolygonLike.convert([ self._catalogue_data.get('bbox_minx'), self._catalogue_data.get('bbox_miny'), @@ -574,7 +576,7 @@ def update_local(self, data_sources = find_data_sources(None, id=local_id) # type: Sequence['DataSource'] data_source = next((ds for ds in data_sources if isinstance(ds, LocalDataSource) and - ds.name == local_id), None) # type: LocalDataSource + ds.id == local_id), None) # type: LocalDataSource if not data_source: raise ValueError("Couldn't find local DataSource", (local_id, data_sources)) @@ -598,11 +600,14 @@ def update_local(self, if to_remove: for time_range_to_remove in to_remove: data_source.reduce_temporal_coverage(time_range_to_remove) - if to_add: + if to_add: for time_range_to_add in to_add: self._make_local(data_source, time_range_to_add, None, data_source.variables_info, monitor) + # TODO (chris): forman added False (?) to make signature happy + return False + def delete_local(self, time_range: TimeRangeLike.TYPE) -> int: if time_range[0] >= self._temporal_coverage[0] \ @@ -650,7 +655,7 @@ def open_dataset(self, selected_file_list = self._find_files(time_range) if not selected_file_list: - msg = 'Data source \'{}\' does not seem to have any data files'.format(self.name) + msg = 'Data source \'{}\' does not seem to have any data files'.format(self.id) if time_range is not None: msg += ' in given time range {}'.format(TimeRangeLike.format(time_range)) raise IOError(msg) @@ -692,8 +697,7 @@ def _make_local(self, var_names: VarNamesLike.TYPE = None, monitor: Monitor = Monitor.NONE): - # local_name = local_ds.name - local_id = local_ds.name + local_id = local_ds.id time_range = TimeRangeLike.convert(time_range) if time_range else None region = PolygonLike.convert(region) if region else None @@ -719,7 +723,7 @@ def _make_local(self, if protocol == _ODP_PROTOCOL_OPENDAP: files = self._get_urls_list(selected_file_list, protocol) - monitor.start('Sync ' + self.name, total_work=len(files)) + monitor.start('Sync ' + self.id, total_work=len(files)) for idx, dataset_uri in enumerate(files): child_monitor = monitor.child(work=1) @@ -751,8 +755,8 @@ def _make_local(self, geo_lon_res = self._get_harmonized_coordinate_value(remote_dataset.attrs, 'geospatial_lat_resolution') if not (isnan(geo_lat_min) or isnan(geo_lat_max) or - isnan(geo_lon_min) or isnan(geo_lon_max) or - isnan(geo_lat_res) or isnan(geo_lon_res)): + isnan(geo_lon_min) or isnan(geo_lon_max) or + isnan(geo_lat_res) or isnan(geo_lon_res)): process_region = True [lon_min, lat_min, lon_max, lat_max] = region.bounds @@ -843,7 +847,7 @@ def _make_local(self, outdated_file_list.append(file_rec) if outdated_file_list: - with monitor.starting('Sync ' + self.name, len(outdated_file_list)): + with monitor.starting('Sync ' + self.id, len(outdated_file_list)): bytes_to_download = sum([file_rec[3] for file_rec in outdated_file_list]) dl_stat = _DownloadStatistics(bytes_to_download) @@ -889,7 +893,7 @@ def make_local(self, del local_meta_info['uuid'] local_meta_info['ref_uuid'] = self.meta_info['uuid'] - local_ds = local_store.create_data_source(local_name, region, _REFERENCE_DATA_SOURCE_TYPE, self.name, + local_ds = local_store.create_data_source(local_name, region, _REFERENCE_DATA_SOURCE_TYPE, self.id, time_range, var_names, meta_info=local_meta_info, lock_file=True) self._make_local(local_ds, time_range, region, var_names, monitor=monitor) return local_ds @@ -936,10 +940,10 @@ def __str__(self): return self.info_string def _repr_html_(self): - return self.name + return self.id def __repr__(self): - return self.name + return self.id class _DownloadStatistics: @@ -952,7 +956,7 @@ def handle_chunk(self, chunk): self.bytes_done += chunk @staticmethod - def _to_mibs(bytes_count): + def _to_mibs(bytes_count: int) -> float: return bytes_count / (1024 * 1024) def __str__(self): @@ -966,7 +970,6 @@ def __str__(self): class EsaCciCatalogueService: - def __init__(self, catalogue_url: str): self._catalogue_url = catalogue_url @@ -1021,20 +1024,20 @@ def _build_catalogue(self, monitor: Monitor = Monitor.NONE): self._catalogue = { record.identification.uricode[0]: { - 'abstract': record.identification.abstract, - 'bbox_minx': record.identification.bbox.minx if record.identification.bbox else None, - 'bbox_miny': record.identification.bbox.miny if record.identification.bbox else None, - 'bbox_maxx': record.identification.bbox.maxx if record.identification.bbox else None, - 'bbox_maxy': record.identification.bbox.maxy if record.identification.bbox else None, - 'creation_date': + 'abstract': record.identification.abstract, + 'bbox_minx': record.identification.bbox.minx if record.identification.bbox else None, + 'bbox_miny': record.identification.bbox.miny if record.identification.bbox else None, + 'bbox_maxx': record.identification.bbox.maxx if record.identification.bbox else None, + 'bbox_maxy': record.identification.bbox.maxy if record.identification.bbox else None, + 'creation_date': next(iter(e.date for e in record.identification.date if e and e.type == 'creation'), None), - 'publication_date': + 'publication_date': next(iter(e.date for e in record.identification.date if e and e.type == 'publication'), None), - 'title': record.identification.title, - 'data_sources': record.identification.uricode[1:], - 'licences': record.identification.uselimitation, - 'temporal_coverage_start': record.identification.temporalextent_start, - 'temporal_coverage_end': record.identification.temporalextent_end + 'title': record.identification.title, + 'data_sources': record.identification.uricode[1:], + 'licences': record.identification.uselimitation, + 'temporal_coverage_start': record.identification.temporalextent_start, + 'temporal_coverage_end': record.identification.temporalextent_end } for record in catalogue_metadata.values() if record.identification and len(record.identification.uricode) > 0 diff --git a/cate/ds/local.py b/cate/ds/local.py index 792580350..b91de89de 100644 --- a/cate/ds/local.py +++ b/cate/ds/local.py @@ -18,9 +18,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ - "Marco Zühlke (Brockmann Consult GmbH), " \ - "Chris Bernat (Telespazio VEGA UK Ltd)" """ Description @@ -60,6 +57,10 @@ from cate.core.types import PolygonLike, TimeRange, TimeRangeLike, VarNamesLike from cate.util.monitor import Monitor +__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ + "Marco Zühlke (Brockmann Consult GmbH), " \ + "Chris Bernat (Telespazio VEGA UK Ltd)" + _REFERENCE_DATA_SOURCE_TYPE = "FILE_PATTERN" @@ -74,11 +75,11 @@ def add_to_data_store_registry(): class LocalDataSource(DataSource): - def __init__(self, name: str, files: Union[Sequence[str], OrderedDict], data_store: 'LocalDataStore', + def __init__(self, id: str, files: Union[Sequence[str], OrderedDict], data_store: 'LocalDataStore', temporal_coverage: TimeRangeLike.TYPE = None, spatial_coverage: PolygonLike.TYPE = None, variables: VarNamesLike.TYPE = None, reference_type: str = None, reference_name: str = None, meta_info: dict = None): - self._name = name + self._id = id if isinstance(files, Sequence): self._files = OrderedDict.fromkeys(files) else: @@ -127,11 +128,10 @@ def open_dataset(self, for i in range(len(time_series)): if time_series[i]: if isinstance(time_series[i], Tuple) and \ - time_series[i][0] >= time_range[0] and \ - time_series[i][1] <= time_range[1]: + time_series[i][0] >= time_range[0] and time_series[i][1] <= time_range[1]: paths.extend(self._resolve_file_path(file_paths[i])) elif isinstance(time_series[i], datetime) and \ - time_range[0] <= time_series[i] < time_range[1]: + time_range[0] <= time_series[i] < time_range[1]: paths.extend(self._resolve_file_path(file_paths[i])) else: for file in self._files.items(): @@ -165,8 +165,7 @@ def _make_local(self, var_names: VarNamesLike.TYPE = None, monitor: Monitor = Monitor.NONE): - # local_name = local_ds.name - local_id = local_ds.name + local_id = local_ds.id time_range = TimeRangeLike.convert(time_range) if time_range else None region = PolygonLike.convert(region) if region else None @@ -184,7 +183,7 @@ def _make_local(self, if not os.path.exists(local_path): os.makedirs(local_path) - monitor.start("Sync " + self.name, total_work=len(self._files.items())) + monitor.start("Sync " + self.id, total_work=len(self._files.items())) for remote_relative_filepath, coverage in self._files.items(): child_monitor = monitor.child(work=1) @@ -227,7 +226,7 @@ def _make_local(self, geo_lon_res = self._get_harmonized_coordinate_value(remote_dataset.attrs, 'geospatial_lat_resolution') if not (isnan(geo_lat_min) or isnan(geo_lat_max) or isnan(geo_lon_min) or - isnan(geo_lon_max) or isnan(geo_lat_res) or isnan(geo_lon_res)): + isnan(geo_lon_max) or isnan(geo_lat_res) or isnan(geo_lon_res)): process_region = True [lon_min, lat_min, lon_max, lat_max] = region.bounds @@ -330,7 +329,7 @@ def make_local(self, if not local_store: raise ValueError('Cannot initialize `local` DataStore') - local_ds = local_store.create_data_source(local_name, region, _REFERENCE_DATA_SOURCE_TYPE, self.name, + local_ds = local_store.create_data_source(local_name, region, _REFERENCE_DATA_SOURCE_TYPE, self.id, meta_info=self.meta_info) self._make_local(local_ds, time_range, region, var_names, monitor) return local_ds @@ -342,7 +341,7 @@ def update_local(self, data_sources = find_data_sources(None, id=local_id) # type: Sequence['DataSource'] data_source = next((ds for ds in data_sources if isinstance(ds, LocalDataSource) and - ds.name == local_id), None) # type: LocalDataSource + ds.id == local_id), None) # type: LocalDataSource if not data_source: raise ValueError("Couldn't find local DataSource", (local_id, data_sources)) @@ -446,6 +445,18 @@ def temporal_coverage(self, monitor: Monitor = Monitor.NONE) -> Optional[TimeRan def spatial_coverage(self): return self._spatial_coverage + @property + def data_store(self) -> DataStore: + return self._data_store + + @property + def id(self) -> str: + return self._id + + @property + def meta_info(self) -> OrderedDict: + return self._meta_info + @property def variables_info(self): return self._variables @@ -459,19 +470,7 @@ def _repr_html_(self): return '\n' \ '\n' \ '\n' \ - '
Name%s
Files%s
\n' % (html.escape(self._name), html.escape(' '.join(self._files))) - - @property - def data_store(self) -> DataStore: - return self._data_store - - @property - def name(self) -> str: - return self._name - - @property - def meta_info(self) -> OrderedDict: - return self._meta_info + '\n' % (html.escape(self._id), html.escape(' '.join(self._files))) def to_json_dict(self): """ @@ -480,7 +479,7 @@ def to_json_dict(self): :return: A JSON-serializable dictionary """ config = OrderedDict({ - 'name': self._name, + 'name': self._id, 'meta_data': { 'deprecated': 'to be merged with meta_info in the future', 'temporal_covrage': TimeRangeLike.format(self._temporal_coverage) if self._temporal_coverage else None, @@ -521,8 +520,8 @@ def from_json_dict(cls, json_dicts: dict, data_store: 'LocalDataStore') -> Optio file_details_length = len(files[0]) if file_details_length > 2: files_dict = OrderedDict((item[0], (parser.parse(item[1]).replace(microsecond=0), - parser.parse(item[2]).replace(microsecond=0)) - if item[1] and item[2] else None) for item in files) + parser.parse(item[2]).replace(microsecond=0)) + if item[1] and item[2] else None) for item in files) elif file_details_length > 0: files_dict = OrderedDict((item[0], parser.parse(item[1]).replace(microsecond=0)) if len(item) > 1 else (item[0], None) for item in files) @@ -556,10 +555,10 @@ def remove_data_source(self, name: str, remove_files: bool = True): if not data_sources or len(data_sources) != 1: return data_source = data_sources[0] - file_name = os.path.join(self._store_dir, data_source.name + '.json') + file_name = os.path.join(self._store_dir, data_source.id + '.json') os.remove(file_name) if remove_files: - shutil.rmtree(os.path.join(self._store_dir, data_source.name)) + shutil.rmtree(os.path.join(self._store_dir, data_source.id)) self._data_sources.remove(data_source) def create_data_source(self, name: str, region: PolygonLike.TYPE = None, @@ -573,13 +572,13 @@ def create_data_source(self, name: str, region: PolygonLike.TYPE = None, lock_filepath = os.path.join(self._store_dir, lock_filename) existing_ds = None for ds in self._data_sources: - if ds.name == name: + if ds.id == name: if lock_file and os.path.isfile(lock_filepath): with open(lock_filepath, 'r') as lock_file: writer_pid = lock_file.readline() if psutil.pid_exists(int(writer_pid)): raise ValueError("Cannot access data source {}, another process is using it (pid:{}" - .format(ds.name, writer_pid)) + .format(ds.id, writer_pid)) # ds.temporal_coverage() == time_range and if ds.spatial_coverage() == region \ and ds.variables_info == var_names: @@ -606,7 +605,8 @@ def create_data_source(self, name: str, region: PolygonLike.TYPE = None, def data_store_path(self): return self._store_dir - def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence[LocalDataSource]: + def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence[ + LocalDataSource]: self._init_data_sources() if id or query_expr: return [ds for ds in self._data_sources if ds.matches(id=id, query_expr=query_expr)] @@ -641,14 +641,14 @@ def save_data_source(self, data_source, unlock: bool = False): self._save_data_source(data_source) if unlock: try: - os.remove(os.path.join(self._store_dir, '{}.lock'.format(data_source.name))) + os.remove(os.path.join(self._store_dir, '{}.lock'.format(data_source.id))) except FileNotFoundError: pass def _save_data_source(self, data_source): json_dict = data_source.to_json_dict() dump_kwargs = dict(indent=' ', default=self._json_default_serializer) - file_name = os.path.join(self._store_dir, data_source.name + '.json') + file_name = os.path.join(self._store_dir, data_source.id + '.json') with open(file_name, 'w') as fp: json.dump(json_dict, fp, **dump_kwargs) diff --git a/cate/webapi/websocket.py b/cate/webapi/websocket.py index 8bc0190ce..713b781ad 100644 --- a/cate/webapi/websocket.py +++ b/cate/webapi/websocket.py @@ -129,8 +129,8 @@ def get_data_sources(self, data_store_id: str, monitor: Monitor) -> list: data_sources = data_store.query(monitor=monitor) data_source_list = [] for data_source in data_sources: - data_source_list.append(dict(id=data_source.name, - name=data_source.name, + data_source_list.append(dict(id=data_source.id, + name=data_source.id, meta_info=data_source.meta_info)) return sorted(data_source_list, key=lambda ds: ds['name']) diff --git a/test/core/test_ds.py b/test/core/test_ds.py index 65f84b24d..7f4e5490e 100644 --- a/test/core/test_ds.py +++ b/test/core/test_ds.py @@ -26,8 +26,8 @@ def _repr_html_(self): class SimpleDataSource(ds.DataSource): - def __init__(self, name: str): - self._name = name + def __init__(self, id: str): + self._id = id self._data_store = None @property @@ -39,8 +39,8 @@ def schema(self) -> ds.Schema: return None @property - def name(self) -> str: - return self._name + def id(self) -> str: + return self._id def open_dataset(self, time_range: TimeRangeLike.TYPE = None, @@ -59,10 +59,10 @@ def make_local(self, return None def __repr__(self): - return "SimpleDataSource(%s)" % repr(self._name) + return "SimpleDataSource(%s)" % repr(self._id) def _repr_html_(self): - return self._name + return self._id class InMemoryDataSource(SimpleDataSource): @@ -109,7 +109,7 @@ def test_find_data_sources_default_data_store(self): data_sources = ds.find_data_sources() self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 98) - self.assertEqual(data_sources[0].name, "AEROSOL_ATSR2_SU_L3_V4.2_DAILY") + self.assertEqual(data_sources[0].id, "AEROSOL_ATSR2_SU_L3_V4.2_DAILY") data_sources = ds.find_data_sources(id="AEROSOL_ATSR2_SU_L3_V4.2_DAILY") self.assertIsNotNone(data_sources) @@ -128,28 +128,28 @@ def test_find_data_sources_with_data_store_value(self): data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE) self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 2) - self.assertEqual(data_sources[0].name, "aerosol") - self.assertEqual(data_sources[1].name, "ozone") + self.assertEqual(data_sources[0].id, "aerosol") + self.assertEqual(data_sources[1].id, "ozone") def test_find_data_sources_with_data_store_list(self): data_stores = [self.TEST_DATA_STORE, self.TEST_DATA_STORE_SST] data_sources = ds.find_data_sources(data_stores=data_stores) self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 3) - self.assertEqual(data_sources[0].name, "aerosol") - self.assertEqual(data_sources[1].name, "ozone") - self.assertEqual(data_sources[2].name, "sst") + self.assertEqual(data_sources[0].id, "aerosol") + self.assertEqual(data_sources[1].id, "ozone") + self.assertEqual(data_sources[2].id, "sst") def test_find_data_sources_with_constrains(self): data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, id="aerosol") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) - self.assertEqual(data_sources[0].name, "aerosol") + self.assertEqual(data_sources[0].id, "aerosol") data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, id="ozone") self.assertIsNotNone(data_sources) self.assertEqual(len(data_sources), 1) - self.assertEqual(data_sources[0].name, "ozone") + self.assertEqual(data_sources[0].id, "ozone") data_sources = ds.find_data_sources(data_stores=self.TEST_DATA_STORE, id="Z") self.assertIsNotNone(data_sources) diff --git a/test/ds/test_esa_cci_ftp.py b/test/ds/test_esa_cci_ftp.py index 472317205..743b89bd1 100644 --- a/test/ds/test_esa_cci_ftp.py +++ b/test/ds/test_esa_cci_ftp.py @@ -46,7 +46,7 @@ def setUp(self): self.ds1 = data_store._data_sources[1] def test_from_json(self): - self.assertEqual('AEROSOL_ATSR2_SU_L3_V4.2_DAILY', self.ds0.name) + self.assertEqual('AEROSOL_ATSR2_SU_L3_V4.2_DAILY', self.ds0.id) json_dict = self.ds0.to_json_dict() self.assertEqual('aerosol/data/ATSR2_SU/L3/v4.2/DAILY', json_dict['base_dir']) @@ -59,7 +59,7 @@ def test_from_json(self): self.assertEqual(2631, fileset_info['num_files']) self.assertEqual(42338, fileset_info['size_in_mb']) - self.assertEqual('AEROSOL_ATSR2_SU_L3_V4.21_MONTHLY', self.ds1.name) + self.assertEqual('AEROSOL_ATSR2_SU_L3_V4.21_MONTHLY', self.ds1.id) json_dict = self.ds1.to_json_dict() self.assertEqual('aerosol/data/ATSR2_SU/L3/v4.21/MONTHLY', json_dict['base_dir']) diff --git a/test/ds/test_esa_cci_odp.py b/test/ds/test_esa_cci_odp.py index 5206dc2d7..647beb719 100644 --- a/test/ds/test_esa_cci_odp.py +++ b/test/ds/test_esa_cci_odp.py @@ -127,18 +127,18 @@ def build_file_item(item_name: str, date_from: datetime, date_to: datetime, size except: raise ValueError(reference_path, os.listdir(reference_path)) - self.assertEqual(new_ds.name, 'local.local_ds_test') + self.assertEqual(new_ds.id, 'local.local_ds_test') self.assertEqual(new_ds.temporal_coverage(), (datetime.datetime(1978, 11, 14, 0, 0), datetime.datetime(1978, 11, 15, 23, 59))) - self.data_source.update_local(new_ds.name, (datetime.datetime(1978, 11, 15, 00, 00), + self.data_source.update_local(new_ds.id, (datetime.datetime(1978, 11, 15, 00, 00), datetime.datetime(1978, 11, 16, 23, 59))) self.assertEqual(new_ds.temporal_coverage(), TimeRangeLike.convert( (datetime.datetime(1978, 11, 15, 0, 0), datetime.datetime(1978, 11, 16, 23, 59)))) - self.data_source.update_local(new_ds.name, (datetime.datetime(1978, 11, 14, 00, 00), + self.data_source.update_local(new_ds.id, (datetime.datetime(1978, 11, 14, 00, 00), datetime.datetime(1978, 11, 15, 23, 59))) self.assertEqual(new_ds.temporal_coverage(), TimeRangeLike.convert( (datetime.datetime(1978, 11, 14, 0, 0), @@ -152,7 +152,7 @@ def build_file_item(item_name: str, date_from: datetime, date_to: datetime, size new_ds_w_one_variable = self.data_source.make_local( 'local_ds_test_2', None, (datetime.datetime(1978, 11, 14, 0, 0), datetime.datetime(1978, 11, 15, 23, 59)), None, ['sm']) - self.assertEqual(new_ds_w_one_variable.name, 'local.local_ds_test_2') + self.assertEqual(new_ds_w_one_variable.id, 'local.local_ds_test_2') ds = new_ds_w_one_variable.open_dataset() self.assertSetEqual(set(ds.variables), {'sm', 'lat', 'lon', 'time'}) @@ -160,7 +160,7 @@ def build_file_item(item_name: str, date_from: datetime, date_to: datetime, size 'from_local_to_local_region', None, (datetime.datetime(1978, 11, 14, 0, 0), datetime.datetime(1978, 11, 15, 23, 59)), "10,10,20,20", ['sm']) # type: LocalDataSource - self.assertEqual(new_ds_w_region.name, 'local.from_local_to_local_region') + self.assertEqual(new_ds_w_region.id, 'local.from_local_to_local_region') self.assertEqual(new_ds_w_region.spatial_coverage(), PolygonLike.convert("10,10,20,20")) data_set = new_ds_w_region.open_dataset() self.assertSetEqual(set(data_set.variables), {'sm', 'lat', 'lon', 'time'}) @@ -170,7 +170,7 @@ def test_data_store(self): self.data_store) def test_id(self): - self.assertEqual(self.data_source.name, + self.assertEqual(self.data_source.id, 'esacci.OC.day.L3S.K_490.multi-sensor.multi-platform.MERGED.1-0.r2') def test_schema(self): diff --git a/test/ds/test_local.py b/test/ds/test_local.py index bb8599c9f..d70839de9 100644 --- a/test/ds/test_local.py +++ b/test/ds/test_local.py @@ -35,7 +35,7 @@ def test_add_pattern(self): self.assertEqual(len(data_sources), 2) new_ds = self.data_store.add_pattern("a_name", "a_pat") - self.assertEqual('test.a_name', new_ds.name) + self.assertEqual('test.a_name', new_ds.id) data_sources = self.data_store.query() self.assertEqual(len(data_sources), 3) @@ -144,11 +144,11 @@ def test_data_store(self): self.assertIs(self.ds4.data_store, self._dummy_store) def test_id(self): - self.assertEqual(self.ds1.name, 'ozone') - self.assertEqual(self.ds2.name, 'aerosol') - self.assertEqual(self.empty_ds.name, 'empty') - self.assertEqual(self.ds3.name, 'w_temporal_1') - self.assertEqual(self.ds4.name, 'w_temporal_2') + self.assertEqual(self.ds1.id, 'ozone') + self.assertEqual(self.ds2.id, 'aerosol') + self.assertEqual(self.empty_ds.id, 'empty') + self.assertEqual(self.ds3.id, 'w_temporal_1') + self.assertEqual(self.ds4.id, 'w_temporal_2') def test_schema(self): self.assertEqual(self.ds1.schema, None) @@ -249,12 +249,12 @@ def test_make_local(self): new_ds = data_source.make_local('from_local_to_local', None, (datetime.datetime(1978, 11, 14, 0, 0), datetime.datetime(1978, 11, 15, 23, 59))) - self.assertEqual(new_ds.name, 'local.from_local_to_local') + self.assertEqual(new_ds.id, 'local.from_local_to_local') self.assertEqual(new_ds.temporal_coverage(), TimeRangeLike.convert( (datetime.datetime(1978, 11, 14, 0, 0), datetime.datetime(1978, 11, 15, 23, 59)))) - data_source.update_local(new_ds.name, (datetime.datetime(1978, 11, 15, 00, 00), + data_source.update_local(new_ds.id, (datetime.datetime(1978, 11, 15, 00, 00), datetime.datetime(1978, 11, 16, 23, 59))) self.assertEqual(new_ds.temporal_coverage(), TimeRangeLike.convert( (datetime.datetime(1978, 11, 15, 0, 0), @@ -269,7 +269,7 @@ def test_make_local(self): (datetime.datetime(1978, 11, 14, 0, 0), datetime.datetime(1978, 11, 15, 23, 59)), None, ['sm']) - self.assertEqual(new_ds_w_one_variable.name, 'local.from_local_to_local_var') + self.assertEqual(new_ds_w_one_variable.id, 'local.from_local_to_local_var') data_set = new_ds_w_one_variable.open_dataset() self.assertSetEqual(set(data_set.variables), {'sm', 'lat', 'lon', 'time'}) @@ -277,7 +277,7 @@ def test_make_local(self): (datetime.datetime(1978, 11, 14, 0, 0), datetime.datetime(1978, 11, 15, 23, 59)), "10,10,20,20", ['sm']) # type: LocalDataSource - self.assertEqual(new_ds_w_region.name, 'local.from_local_to_local_region') + self.assertEqual(new_ds_w_region.id, 'local.from_local_to_local_region') self.assertEqual(new_ds_w_region.spatial_coverage(), PolygonLike.convert("10,10,20,20")) data_set = new_ds_w_region.open_dataset() self.assertSetEqual(set(data_set.variables), {'sm', 'lat', 'lon', 'time'}) From 50a2d560cd42a2869c5e3629cfc29c48455ae4b3 Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Wed, 19 Jul 2017 21:54:49 +0200 Subject: [PATCH 4/8] renamed property DataStore.name to id --- CHANGES.md | 3 +- cate/cli/main.py | 35 ++++++++++++------ cate/core/ds.py | 24 ++++++------ cate/ds/local.py | 30 +++++++-------- cate/webapi/websocket.py | 8 ++-- doc/source/_static/uml/cdm_schema.png | Bin 68616 -> 5550 bytes doc/source/_static/uml/cdm_schema.svg | 26 +------------ doc/source/_static/uml/cli.png | Bin 33490 -> 5101 bytes doc/source/_static/uml/cli.svg | 26 +------------ doc/source/_static/uml/ds.png | Bin 21607 -> 5117 bytes doc/source/_static/uml/ds.svg | 26 +------------ doc/source/_static/uml/modules.png | Bin 57530 -> 5155 bytes doc/source/_static/uml/modules.svg | 26 +------------ doc/source/_static/uml/monitor.png | Bin 11492 -> 4962 bytes doc/source/_static/uml/monitor.svg | 26 +------------ doc/source/_static/uml/objectio.png | Bin 32554 -> 5109 bytes doc/source/_static/uml/objectio.svg | 26 +------------ doc/source/_static/uml/op.png | Bin 21075 -> 5115 bytes doc/source/_static/uml/op.svg | 26 +------------ doc/source/_static/uml/plugin.png | Bin 9626 -> 4966 bytes doc/source/_static/uml/plugin.svg | 26 +------------ doc/source/_static/uml/webapi_seq.png | Bin 38510 -> 38510 bytes doc/source/_static/uml/webapi_seq.svg | 26 +------------ doc/source/_static/uml/workflow.png | Bin 54504 -> 5188 bytes doc/source/_static/uml/workflow.svg | 26 +------------ doc/source/_static/uml/workflow_node_port.png | Bin 8750 -> 4888 bytes doc/source/_static/uml/workflow_node_port.svg | 26 +------------ doc/source/_static/uml/workflow_seq.png | Bin 8989 -> 8989 bytes doc/source/_static/uml/workflow_seq.svg | 26 +------------ doc/source/_static/uml/workspace.png | Bin 31179 -> 4986 bytes doc/source/_static/uml/workspace.svg | 26 +------------ doc/source/uml/ds.puml | 6 +-- test/ds/test_esa_cci_ftp.py | 2 +- 33 files changed, 73 insertions(+), 373 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index a75d5af89..f9516dbf2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -44,7 +44,8 @@ ### Other Changes -* renamed property `cate.core.ds.DataStource.name` to `id` +* renamed property `cate.core.ds.DataSource.name` to `id` +* renamed property `cate.core.ds.DataStore.name` to `id` * renamed and changed signature of function `cate.core.ds.DataStore.query_data_sources(..., name=None)` to `find_data_sources(..., id=None, query_expr=None)` * changed signature of method `cate.core.ds.DataStore.query(name, ...)` to `query(id=None, query_expr=None, ...)` diff --git a/cate/cli/main.py b/cate/cli/main.py index f7256b26f..0d64f7425 100644 --- a/cate/cli/main.py +++ b/cate/cli/main.py @@ -19,9 +19,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ - "Marco Zühlke (Brockmann Consult GmbH)" - """ Description =========== @@ -123,6 +120,8 @@ from cate.webapi.wsmanag import WebAPIWorkspaceManager from cate.version import __version__ +__author__ = "Norman Fomferra (Brockmann Consult GmbH), " \ + "Marco Zühlke (Brockmann Consult GmbH)" #: Name of the Cate CLI executable (= ``cate``). CLI_NAME = 'cate' @@ -287,18 +286,23 @@ def _parse_op_args(raw_args: List[str], else: # For any non-None value and any data type we perform basic type validation: if value is not None and data_type: + # noinspection PyTypeChecker if issubclass(data_type, Like): - # For XXXLike-types call accepts() + # noinspection PyUnresolvedReferences compatible = data_type.accepts(value) else: + # noinspection PyTypeChecker compatible = isinstance(value, data_type) if not compatible: + # noinspection PyTypeChecker if issubclass(data_type, float): # Allow assigning bool and int to a float compatible = isinstance(value, bool) or isinstance(value, int) + # noinspection PyTypeChecker elif issubclass(data_type, int): # Allow assigning bool and float to an int compatible = isinstance(value, bool) or isinstance(value, float) + # noinspection PyTypeChecker elif issubclass(data_type, bool): # Allow assigning anything to a bool compatible = True @@ -396,7 +400,8 @@ def _get_op_info_str(op_meta_info: OpMetaInfo): op_info_str += '\n' op_info_str += _get_op_io_info_str(op_meta_info.inputs, 'Input', 'Inputs', 'Operation does not have any inputs.') - op_info_str += _get_op_io_info_str(op_meta_info.outputs, 'Output', 'Outputs', 'Operation does not have any outputs.') + op_info_str += _get_op_io_info_str(op_meta_info.outputs, 'Output', 'Outputs', + 'Operation does not have any outputs.') return op_info_str @@ -558,12 +563,12 @@ def execute(self, command_args): OP_ARGS_RES_HELP = 'Operation arguments given as KEY=VALUE. KEY is any supported input by OP. VALUE ' \ - 'depends on the expected data type of an OP input. It can be either a value or ' \ - 'a reference an existing resource prefixed by the add character "@". ' \ - 'The latter connects to operation steps with each other. To provide a (constant)' \ - 'value you can use boolean literals True and False, strings, or numeric values. ' \ - 'Type "cate op info OP" to print information about the supported OP ' \ - 'input names to be used as KEY and their data types to be used as VALUE. ' + 'depends on the expected data type of an OP input. It can be either a value or ' \ + 'a reference an existing resource prefixed by the add character "@". ' \ + 'The latter connects to operation steps with each other. To provide a (constant)' \ + 'value you can use boolean literals True and False, strings, or numeric values. ' \ + 'Type "cate op info OP" to print information about the supported OP ' \ + 'input names to be used as KEY and their data types to be used as VALUE. ' class WorkspaceCommand(SubCommandCommand): @@ -920,10 +925,13 @@ def _execute_open(cls, command_args): workspace_manager = _new_workspace_manager() op_args = dict(ds_name=command_args.ds_name) if command_args.var_names: + # noinspection PyArgumentList op_args.update(var_names=command_args.var_names) if command_args.region: + # noinspection PyArgumentList op_args.update(region=command_args.region) if command_args.start_date or command_args.end_date: + # noinspection PyArgumentList op_args.update(time_range="%s,%s" % (command_args.start_date or '', command_args.end_date or '')) workspace_manager.set_workspace_resource(_base_dir(command_args.base_dir), @@ -937,6 +945,7 @@ def _execute_read(cls, command_args): workspace_manager = _new_workspace_manager() op_args = dict(file=command_args.file_path) if command_args.format_name: + # noinspection PyArgumentList op_args.update(format=command_args.format_name) workspace_manager.set_workspace_resource(_base_dir(command_args.base_dir), command_args.res_name, @@ -1213,7 +1222,7 @@ def _execute_del(cls, command_args): if not answer or answer.lower() == 'y': keep_files = command_args.keep_files ds = local_store.remove_data_source(ds_name, not keep_files) - print("Local data source with name '%s' removed." % ds.name) + print("Local data source with name '%s' removed." % ds.id) @classmethod def _execute_copy(cls, command_args): @@ -1295,11 +1304,13 @@ def _trim_error_message(message: str) -> str: # use by 'sphinxarg' to generate the documentation def _make_cate_parser(): from cate.util.cli import _make_parser + # noinspection PyTypeChecker return _make_parser(CLI_NAME, CLI_DESCRIPTION, __version__, COMMAND_REGISTRY, license_text=_LICENSE, docs_url=_DOCS_URL) def main(args=None) -> int: + # noinspection PyTypeChecker return run_main(CLI_NAME, CLI_DESCRIPTION, __version__, diff --git a/cate/core/ds.py b/cate/core/ds.py index 16f84e952..b7906b04f 100644 --- a/cate/core/ds.py +++ b/cate/core/ds.py @@ -366,11 +366,11 @@ def _repr_html_(self): class DataStore(metaclass=ABCMeta): """Represents a data store of data sources.""" - def __init__(self, name: str): - self._id = name + def __init__(self, id: str): + self._id = id @property - def name(self) -> str: + def id(self) -> str: """ Return the name of this data store. """ @@ -418,17 +418,17 @@ class DataStoreRegistry: def __init__(self): self._data_stores = dict() - def get_data_store(self, name: str) -> Optional[DataStore]: - return self._data_stores.get(name, None) + def get_data_store(self, id: str) -> Optional[DataStore]: + return self._data_stores.get(id) def get_data_stores(self) -> Sequence[DataStore]: return list(self._data_stores.values()) def add_data_store(self, data_store: DataStore): - self._data_stores[data_store.name] = data_store + self._data_stores[data_store.id] = data_store - def remove_data_store(self, name: str): - del self._data_stores[name] + def remove_data_store(self, id: str): + del self._data_stores[id] def __len__(self): return len(self._data_stores) @@ -442,8 +442,8 @@ def __repr__(self): def _repr_html_(self): rows = [] - for name, data_store in self._data_stores.items(): - rows.append('%s%s' % (name, repr(data_store))) + for id, data_store in self._data_stores.items(): + rows.append('%s%s' % (id, repr(data_store))) return '%s
' % '\n'.join(rows) @@ -476,9 +476,9 @@ def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None, data_store_list = data_stores if not primary_data_store and id and id.count('.') > 0: primary_data_store_index = -1 - primary_data_store_name, data_source_name = id.split('.', 1) + primary_data_store_id, data_source_name = id.split('.', 1) for idx, data_store in enumerate(data_store_list): - if data_store.name == primary_data_store_name: + if data_store.id == primary_data_store_id: primary_data_store_index = idx if primary_data_store_index >= 0: primary_data_store = data_store_list.pop(primary_data_store_index) diff --git a/cate/ds/local.py b/cate/ds/local.py index b91de89de..b9d0a4be5 100644 --- a/cate/ds/local.py +++ b/cate/ds/local.py @@ -532,13 +532,13 @@ def from_json_dict(cls, json_dicts: dict, data_store: 'LocalDataStore') -> Optio class LocalDataStore(DataStore): - def __init__(self, name: str, store_dir: str): - super().__init__(name) + def __init__(self, id: str, store_dir: str): + super().__init__(id) self._store_dir = store_dir self._data_sources = None - def add_pattern(self, name: str, files: Union[str, Sequence[str]] = None) -> 'DataSource': - data_source = self.create_data_source(name) + 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): files = [files] is_first_file = True @@ -550,8 +550,8 @@ def add_pattern(self, name: str, files: Union[str, Sequence[str]] = None) -> 'Da data_source.add_dataset(file) return data_source - def remove_data_source(self, name: str, remove_files: bool = True): - data_sources = self.query(name) + def remove_data_source(self, data_source_id: str, remove_files: bool = True): + data_sources = self.query(id=data_source_id) if not data_sources or len(data_sources) != 1: return data_source = data_sources[0] @@ -561,18 +561,18 @@ def remove_data_source(self, name: str, remove_files: bool = True): shutil.rmtree(os.path.join(self._store_dir, data_source.id)) self._data_sources.remove(data_source) - def create_data_source(self, name: str, region: PolygonLike.TYPE = None, + def create_data_source(self, data_source_id: str, region: PolygonLike.TYPE = None, reference_type: str = None, reference_name: str = None, time_range: TimeRangeLike.TYPE = None, var_names: VarNamesLike.TYPE = None, meta_info: OrderedDict = None, lock_file: bool = False): self._init_data_sources() - if not name.startswith('%s.' % self.name): - name = '%s.%s' % (self.name, name) - lock_filename = '{}.lock'.format(name) + if not data_source_id.startswith('%s.' % self.id): + data_source_id = '%s.%s' % (self.id, data_source_id) + lock_filename = '{}.lock'.format(data_source_id) lock_filepath = os.path.join(self._store_dir, lock_filename) existing_ds = None for ds in self._data_sources: - if ds.id == name: + if ds.id == data_source_id: if lock_file and os.path.isfile(lock_filepath): with open(lock_filepath, 'r') as lock_file: writer_pid = lock_file.readline() @@ -585,11 +585,11 @@ def create_data_source(self, name: str, region: PolygonLike.TYPE = None, existing_ds = ds break raise ValueError("Local data store '{}' already contains a data source named '{}'" - .format(self.name, name)) + .format(self.id, data_source_id)) if existing_ds: data_source = existing_ds else: - data_source = LocalDataSource(name, files=[], data_store=self, spatial_coverage=region, + data_source = LocalDataSource(data_source_id, files=[], data_store=self, spatial_coverage=region, reference_type=reference_type, reference_name=reference_name, meta_info=meta_info) if lock_file: @@ -613,7 +613,7 @@ def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monit return self._data_sources def __repr__(self): - return "LocalFilePatternDataStore(%s)" % repr(self.name) + return "LocalFilePatternDataStore(%s)" % repr(self.id) def _repr_html_(self): self._init_data_sources() @@ -623,7 +623,7 @@ def _repr_html_(self): row_count += 1 # noinspection PyProtectedMember rows.append('%s%s' % (row_count, data_source._repr_html_())) - return '

Contents of LocalFilePatternDataStore "%s"

%s
' % (self.name, '\n'.join(rows)) + return '

Contents of LocalFilePatternDataStore "%s"

%s
' % (self.id, '\n'.join(rows)) def _init_data_sources(self): if self._data_sources: diff --git a/cate/webapi/websocket.py b/cate/webapi/websocket.py index 713b781ad..3fd568de3 100644 --- a/cate/webapi/websocket.py +++ b/cate/webapi/websocket.py @@ -108,8 +108,8 @@ def get_data_stores(self) -> list: data_stores = DATA_STORE_REGISTRY.get_data_stores() data_store_list = [] for data_store in data_stores: - data_store_list.append(dict(id=data_store.name, - name=data_store.name, + data_store_list.append(dict(id=data_store.id, + name=data_store.id, # TODO (forman): issue #299 description='')) return sorted(data_store_list, key=lambda ds: ds['name']) @@ -130,7 +130,7 @@ def get_data_sources(self, data_store_id: str, monitor: Monitor) -> list: data_source_list = [] for data_source in data_sources: data_source_list.append(dict(id=data_source.id, - name=data_source.id, + name=data_source.id, # TODO (forman): issue #299 meta_info=data_source.meta_info)) return sorted(data_source_list, key=lambda ds: ds['name']) @@ -214,7 +214,7 @@ def add_local_datasource(self, data_source_name: str, file_path_pattern: str, mo raise ValueError('Unknown data store: "%s"' % 'local') with monitor.starting('Making data source local', 100): # TODO use monitor, while extracting metadata - data_store.add_pattern(name=data_source_name, files=file_path_pattern) + data_store.add_pattern(data_source_id=data_source_name, files=file_path_pattern) return self.get_data_sources('local', monitor=monitor.child(100)) def remove_local_datasource(self, data_source_name: str, remove_files: bool) -> list: diff --git a/doc/source/_static/uml/cdm_schema.png b/doc/source/_static/uml/cdm_schema.png index 84b00151ad28979283edfbc8863b55d56679df24..53f85587eb7bbc478bef5b3a1772c6be783e90c5 100644 GIT binary patch delta 5348 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 Pe>s)q!E#6$)4=}%Yw~H( literal 68616 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 z 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 C+R|$P diff --git a/doc/source/_static/uml/cdm_schema.svg b/doc/source/_static/uml/cdm_schema.svg index 46fc5e735..8843569f7 100644 --- a/doc/source/_static/uml/cdm_schema.svg +++ b/doc/source/_static/uml/cdm_schema.svg @@ -1,25 +1 @@ - - -Schemaname: strDimensionname: strAttributename: strdata_type: typevalue: objectVariablename: strdata_type: typeASchemacorresponds to specifcDatasettype.Both aDataSourceand aDatasetknow their schema.We will use schemas mostly to check operation applicabilityand do input validation. Therefore we will focus on thevariables and their dimensions expected in a dataset.For this reason we resign theGroupschema here, whichis defined as part of the netCDF 4 CDM.However, original grouping is retained by usingpath namesfor Variables and attributes.Note that a variable's value is not aproperty ofVariablebecause thisis aschemaof a variable.In the netCDF CDM, the only property of aDimensionislength. We makelengthan optional attribute. Remember that the "features"read from a Shapefile may have two dimensions(e.g. lat / lon) but no actuallength. However, adimension might have other attributes in this case,such asunits=degreesandcrs=WGS84.Attributes are meta-data. Since this is aschema,the attribute'svalueused here represents aninvariant across a given number of datasets instances.Ifvalueis not known, this still means that allthese datasets share an attribute with the givenname. \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/cli.png b/doc/source/_static/uml/cli.png index 07855e3fa934e28d15db02deebe7d4b62d5a08ad..c548a327a7e2ff3832ab9d140e0ff5cca85286b1 100644 GIT binary patch literal 5101 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 Q^sh6Ts^Dkk%2wh32bCt;RsaA1 literal 33490 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 UoyphO`+t!XlMyW!{_y$#0E^!Qr~m)} diff --git a/doc/source/_static/uml/cli.svg b/doc/source/_static/uml/cli.svg index c7afc62d5..8843569f7 100644 --- a/doc/source/_static/uml/cli.svg +++ b/doc/source/_static/uml/cli.svg @@ -1,25 +1 @@ - - -argparseArgumentParserNamespaceCommandname_and_parser_kwargs(): tupleconfigure_parser(parser: argparse.ArgumentParser)execute(self, command_args: argparse.Namespace)ListCommandRunCommandDataStoreCommandWorkspaceCommandWorkspaceResourceCommandCommand patternglobalsCOMMAND_REGISTRY: listmain()COMMAND_REGISTRY is a mutable list.Cate-plugins can extend the CLI byadding new commands to it.<configure><execute with>3..N \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/ds.png b/doc/source/_static/uml/ds.png index d554ffbbb7bd6e188de1580f1b3afa0e1c9b4674..021e9d9e84ccd2c2766c9a875d31126c480eaba0 100644 GIT binary patch literal 5117 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 literal 21607 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 diff --git a/doc/source/_static/uml/ds.svg b/doc/source/_static/uml/ds.svg index 506a22629..8843569f7 100644 --- a/doc/source/_static/uml/ds.svg +++ b/doc/source/_static/uml/ds.svg @@ -1,25 +1 @@ - - -globalsDATA_STORE_REGISTRY: DataStoreRegistryfind_data_sources(data_stores, constraints)open_dataset(data_source, name, time_range)Plugins can extendDATA_STORE_REGISTRYby adding new data storesDataStoreRegistryget_data_stores(): List[DataStore]get_data_store(name): DataStoreadd_data_store(DataStore): voidremove_data_store(DataStore): voidDataStorename: strquery(query_expr): DataSourceDataSourcename: strget_dataset_schema(): cdm.Schemaopen_dataset(name, time_range): xarray.Datasetsync(time_range)N<provide> \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/modules.png b/doc/source/_static/uml/modules.png index 6aad0a9706e5e1e495dcaea6975e26ec4b30e047..9142d2fa88e1e72d715de84f96b94f80ffabce06 100644 GIT binary patch literal 5155 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 - -CCI_Toolbox_Corecate.dscate.opscate.corecate.clicate.webapiCCI_Toolbox_GUIcate.desktopCCI_Open_Data_Portalesa_cci_odpesa_cci_ftplocalmore data store modules...coregistrationcorrelationnormalizeioplotresamplingselectsubsettimeseriesmore operation modules...dsmonitorobjectiooppluginworkflowworkspacecli_mainwebapi_maindesktop_mainFTPHTTPOPeNDAPmore services... \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/monitor.png b/doc/source/_static/uml/monitor.png index 1c2f3590229db374599e6b05d03970fd6bd22a19..ea72073d4b9b680874789d0720e09cafacdd64b2 100644 GIT binary patch literal 4962 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 diff --git a/doc/source/_static/uml/monitor.svg b/doc/source/_static/uml/monitor.svg index 9180f4871..8843569f7 100644 --- a/doc/source/_static/uml/monitor.svg +++ b/doc/source/_static/uml/monitor.svg @@ -1,25 +1 @@ - - -MonitorNULL: Monitorstart(self, label: str, total_work: float)progress(self, work: float = None, msg: str)done(self)child(self, work: float): Monitorcancel()is_cancelled(): boolConsoleMonitorChildMonitorparent_monitor1 \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/objectio.png b/doc/source/_static/uml/objectio.png index 21133613a9f7260892cafc4cad6384d18032cf2b..4ff124604f7b1987da7b6f318cef16f86c813719 100644 GIT binary patch literal 5109 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 literal 32554 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 diff --git a/doc/source/_static/uml/objectio.svg b/doc/source/_static/uml/objectio.svg index 6a9467693..8843569f7 100644 --- a/doc/source/_static/uml/objectio.svg +++ b/doc/source/_static/uml/objectio.svg @@ -1,25 +1 @@ - - -cate.ops.ioTextObjectIOJsonObjectIONetcdf4ObjectIONetcdf3ObjectIOObjectIORegistryobject_io_list: Listfind_reader(file_obj, format, ext): ObjectIOfind_writer(obj, format, ext): ObjectIOObjectIOdescription: strformat_name: strfilename_ext: strread_fitness(file_obj): intread(file_obj)write_fitness(obj): intwrite(obj, file_path)globalsfind_reader(file_obj, format_name):find_writer(obj, file_path, format_name)read_object(file_obj, format_name)writer_object(obj, file_path, format_name)OBJECT_IO_REGISTRY: WriterRegistryOBJECT_IO_REGISTRY contains all knowndata reader and writer instances.N \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/op.png b/doc/source/_static/uml/op.png index 68a10282c152ce2d1425ac39ef96c09e2efa5aac..726a62b4402efa122091b46f1aa32f135ceeb650 100644 GIT binary patch literal 5115 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 hp4&`xp6P;Yk1h literal 21075 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 diff --git a/doc/source/_static/uml/op.svg b/doc/source/_static/uml/op.svg index ba45595e9..8843569f7 100644 --- a/doc/source/_static/uml/op.svg +++ b/doc/source/_static/uml/op.svg @@ -1,25 +1 @@ - - -globalsOP_REGISTRY: OpRegistry@op(**properties)@op_input(name, **properties)@op_output(name, **properties)Plugins can extend OP_REGISTRYby adding new operations to it.To register a Python function orclass, the @op, @op_input,@op_output decorators are used.OpRegistryget_op(name): Operationadd_op(operation): Operationremove_op(operation): OperationOperationoperation: object__call__(*args, **kwargs): objectOpMetaInfoqualified_name : strheader : OrderedDictinput : OrderedDictoutput : OrderedDictNop_meta_info \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/plugin.png b/doc/source/_static/uml/plugin.png index 034df09ab7269afec4f9601af8f537a1de9d621d..10122d262d7f2e366aeaa947e7c2f774ce8cde45 100644 GIT binary patch literal 4966 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 literal 9626 zcma)CcQjnzw^t&9FcE_2(M69QjOauU(M2#?h;DQuq7%JD4T4D2(KC!7%IKnwE;_^L zy}T>m_tx+I-g@h;_m6AcJNKM@_SxsN_x^ltgqDU9F(EY}78Vw~>CruJHNLKTWysjenoPxM5!+DT!AgcwP_i^bK^H}2;<)%smm>JkFw zN)~JJ&O!Mp-}Y}&&Tl9h6>P8x=)Z4E(%g%BY*2RJ&5F37V)Bl{K}fbL=|K*7y~%_u z@3X?&jE>z$D|5jHQ-ahkC9jQj-VweZNlL4$FvvONh*mWY=5`4ITL%V4#^!2Q9i<#v z)%=Q>oM&1T$g#2*9X<(|sA0`@t+dj2r$$=t zqq5PqaBAip%i+o&>HMpS_92_LzG;hzwzJ_R^2)WALV|tOmEaM(NZ2SBU0)DREK3|Yt6#^CB$N_v zHt8nI9?M5wEvNEn>v9m}|6uylavT-d>z1tu)6rdvyYxF0<#J@6wqub{2)T#aJ?3+c z_1a1GrkQs1^z}Wju^$h|0%p)|QHK&72VRbyrKC`_X5GBY5l46S_bo@sSpppjrW4Ql=y{ zp#Q23IXss?>UT`c+`8>BPf=W~P;C0#73l>-l62C^bov^SW<< z;drMFmx!>Vht&XX-4`4rC1`2kh+%_Z)bJwFGfEwpN_aeA%W9@XDSkpzu^mcBlQ{93 zga)dw-p3@i=c=OE5qEahP8aq%LCOoc{W3=)3GE{+B65GbnqG7O3{gHf+~mu1-Zlx4 zl{F(*jEQV;&czDhLvTdKY%ve??(G>44b>fPc&NS{m8`5NEp?u(ZZUY`@dl?G#wK}r za>8M$zW9*0cgk8lCMmfuI=o(3SXje-w2NdpIUiW6F0_HE)-mf%X)&hiYsK5Ck*{B! z-4Ewm#79SoZj(d{=_!i-{(ajVxrE$xO~)bHb;b9)0ZrDpc;XTbyyor4sxi+&8j>&8an{@Ugo7SuZWo$u!Z z4_Rn6v!nXF_G9FB2KXo3GT^GGgLuZ+EjZH?<>FAN2n|`oa0N;TvR!ML2A}e zoavnR@~-YS>6^%qLON}zal?6*=8-8Jx;58)y*8B3u94{spGoC2W23Xp)r4}eF4McX zcDvDo88znX>m^*iZF;ltaHFlmhS#7E4*Di*Ub{;QzonLPVMSeHs%livVkQrNEg_jp^%_efV)cVuKlNK~}#Ejyj9)O&P2 zS!ax!V#mG31Xk6A`3D;jjHcq{0gQ)tsI7o4nZHfQpaae|UnU>xe)28iJ9%T*M@ES= z?y{(QCY+i*MH#iHT%vE#+4|>>7nB)O4TAnZ-$`7szz@A1A9s~;TGb`P=UA%*oTu6| z?@k}>uMQ-VRMX2G$%U;%GN9BzwKS<5nsz22@C838#Q*#WyBgJeT!Qm*bRsTEhOmJB z=(lFHs@-~YYb*J8-&Ze%L6WVH8!A4(z9>|;`{Nk`m{JyEF-DV-QuTXcEtI&JqvVy8 z%$!vDktz9ovhxU(U~IFE*rR`}S?cP+XrtaPZ+n7Kb6$(YasHUuCMU$HwW(>=)E3}* zz!}bct!-_;K5?ebHwq(uL5_bSM~Vr)eo7i?ZV>N$#Jbx1@ME9%R7r#(E30N+d~a`V zD@q7RT_lbxM_a=&ASbnKTF_i=qhCrJ0d08~Z#J$>kDXocQX}tUKrpnf`Oos)4aXdO8p5yW3#xmaXvqQ@95^sJku6QAgEUeu0od550YorR+ z>bI|HbPNn3puz&;`rH9UZkQ0w%N~-{C`Q{PWxH10rH#)%jBkbG6cOdDQ5rM9{pXr3?A72q}niHCucLN8{N>(w{#nSCC4r0M2gaVY>Sk zacChU{RGob0gnVKbJD()eNE#Dz7W@}8Wi^yOp4%q@nT!t|Lmc*qRa@j5 zPcCKcH{CYJr3tNDG)IbRcf{(ZT>e_6*1&zx;&iF<_R%iS{-=p84?R65l6=mRLXaVM zl3C<_u*!|M!qI@YI605WDK($E+is((ycO#v&C^5rdo#?RtC=65D$RUyW(Gzm+*a=L zaZvG9rP|&%OiCRvLii=+{2ge9SSywNU*_PPoV4K2-Fg#4R?|Ps?XEF<*UEx$zP#A( z6Gt2I_(0Y9r^&o8ODahUby93FWetS!71q2l1<`V99@@ZDIa~%X%2Wkvb%rMv`kCIO zhsQXZzpz%T&~WWr$>obA3NDwjSP_!&t~7T zAJ5bEvl`s(UIOu$%7r6LcK@u*_&6M4rEUYH$%hQJGKL+=cRw$YC1yQDXrEG9tt#C< zG?!zMC|ymMIYC${v^$XQ{KALnzwE z7Hot9=WvD-(LxC``wqP+Jeo_(F~p3ht#6}a)|*BCNyZ;En}CHUu&U6nqUdT-Bh}oG zaxp)H;_>hnL3HW97bh=PA)+3Ncdl2KSZr+OZ0gp5A^|8=w8UIlh{hkN)B0JtdsyP5 zEnvPhwX-Ujp6qh11GZNPyuusIImbPlW6#fbYKvfb?6^C@L1`64*%F-Lb^95)6MGx7yj{M zhWDJTcJ`DdIzaj4Vc*>K&jTQ?Ac4p_0^-GLSfZg5F&&V(H06!m*UZ|;)Shqf@kxT+ zXPFu1e4X$vJlVnU8bOkxV0D2%S-(o^HXFcf@coLz{>4TK>2F~9{bL?}DWnE73isKO z-SBN1n>fv!0L8*vPx@D>aYf(sUjtyrG+Ek)N(1m}nf7C+nO2tj?RSFSgN2{B(os}8 zHncch2SlZvYg_60MX|_jNr$F=F^muF9I&Px8aG2n4=9!T?f*%ougtUc>mH8OY_+VIVp%P3)OhKdvW2?A1EUX?RbQ8 zbL$)#wTfD`S(1c^(g;?d>xJyz>|!HIR^g-P@ zxH8rspj`IYSq~{WQx2RSi?8>F5aF$_AGd0DZZ-Ej(AE{wu13e9JNm^~BqX&2a;06r zs1{-mDLIK2yh(^H*sz32fQ&Jc{qRm3%ZrE=jPYw9AaTJ2e_*w*;RLat$EfB68lBTb z5{5haK|_H4pp0FjU(q2v4=1nIGl1*`1T*-0mmE1e1d*;ftGwUt?U(v1#4l_?*p5puf5ioE> zLO>J`$R#h&Hu)}22QYcBSVbu4`Ipb>wb{MC`S0za;fHEPFqHhfSE|pS`ubEi!Z5Cfoibgx)_!zQfSfT49gX_JXQ%&hh zmQ2sh&Pu)B4FH$LyAQU>H?ZmByc>FW!9J*GBIO0b0A z+h>MlQvN@1@Jd`8<rVl5q#!TmyP~jxO-PvPS;!vx0)n+jrMAVZQ1|QIt89U|*oV zfu?mBS$-2Fts6_b+cNM01Y{`uC_*C2rmHg|juN9}Itpl1L>HG{FHTA6K3b>n%V#Zp z{m9s;5K__wn||631sv59NEovjuxaEU=`VA4d4nLH&yQYyzk)SZyDOTTM~+IBe@n+_ zvP>3u+X@uK98{ENpLT-sl#gBywMSvFhIje`cY;%&*=$w`7!XlNU!B|B<5raeo&(PyBxK( z1th>=LIyQe8kX#|FB}P%bs1)DpH#HLs*u^WpKCaPCk2h^M_HLroZlo)(bor$_nWk@ z)_`BJ0>^b9O}>g!fqqj;xHPjU(q-v;%piCj!;Uzu%4~L;Y&<^hoNFEnh=3FU5JvKyq7fi>~@tK0gsTXGwQCB?nSCtW(bWrt`{3=$W2EMvI!e&v)48Yy()&<+t<9`b-V7GIy=#MnuoSdRdZ~)L8$; zlRq^@<5z3ap0wC-Y2Ryfs{WNcOa~}h@CvR*5NF4jmA2vQftjA!>)AhrHWZ^@`hB=K zFX!nJN#KQzQUNk@WBcr`uL7@>jmaAE4$x#Nv2LFJWiB*r>?P_Y&}}@m z$o9W7&bJBoKFT3}e%=1X$~C*`&>+!iAH9cu>j<{JtGE3DJx_fns+noST&~TL%OVuS z!16vzTvdoy)Kl8|mUFU>d>Aip|P?ZxO}pCU(t~&W@w~NOZ?q z4FEp-ozfykq&m9Q=$diFVjN@rkNGhfIoeobS}7j`yY;8>P`LrlWyOI^@r$*5%OSKJ zC`J*rIK;1Lok}zp0B7Olh5ib^<+30!%N5?dS8KW4EnZkN@ni4ar^ye_fuDs}JiqHA~*6Ocawqz7jCYAohQaFK5CC2yz-Mdm0ziQgO- z%-BYxq^D)BCAfKP_SGgt^COoX4f8S4GQ)dCnxMVy7>V)U{a`*_84}3 zF0jKT5%L;2W$!woRaj7*kL%}TJjA527P_K@u-1=s?Eut5(hqOTXvOWbuzj4jz)BrPI`ks^ zY4po77a`d*j#18a?X7|~Bodi6qK+e6u&G0AmJprkX}`g>Dk9L##FH|p1%-0M7>j*| za~rTTx5jT1qmn(Gxq=JlbB*CKzBv6=0K=F#BSePtbUN_*o|oH+?;fOqw8p^pI4PW) zRvd;};PU`U2^m#89Xmt^MAg(tD8|y?22p0>jAX{m)N98IXGzioZ~e*p<9e8EKNR5Q z7)7&Y=;~${2^X0`18NT#x9+1LKf3saI>nv+9VnjRr=fB zcrC~VnG}?i8@@37H2Qs~MsIxZ^XPJygx4{pt9f zapN&kBOYCAg8?W?J>A|{6|X-yL2gpc#6tPWF+d{5$2S4hr7;o=bwDR`ea}jqnP`il z(V^s}UEd8Rkq9n){yh8QPZU#9`78h2ueMBIP-f~j8rdehUCd^w_Syl*Gfso{YygT! zA$iH^=~rk_3rDT$B4s$5VRs{H6X^JPc(a#qQFxj`4zUdG6AyI-$AX9$==?L}U>Q$w zr4C0bZsmIj<1$riKi}kG~gu zncg2#nmdX?pV9k_e){z*0O-&+{5I43pA~6JCuaJI64rCtIra~Uaq(iuQ9e+s5-_fn zj87F6c?YTcu4kN4nscP>ND4meh$&W0Ve!ti@tm;M8HRoMfWWelX*mHHGoh&W0; zi?p>_TpWo)9eYm;ad6rai8An_lR-OUu7iao`bHvVeBIc=;S~K=68!RsZj?Y7 zMcK0)e?7i${#U2vYNVE5=hJM)%b#d)NqjmSi@R(C?E^HD%eI-mo;54$VJi1NK&wif z9nTtLU(ZAgIBrGPNz+uTpO?xcnRg;MvNk+%8enUc$8@aER;=2?))`fX7<&Nc2vu-_jx=Taf&VsFCV+3|hZ)E4i5Euyn4P|hyiW!Y z8yXsjDK2u0sAtJ_no^SGG7dV|L9K!E5Hf&3n9JX)JuyKx?Z29oR%fX6iIy2IZA<->3qQ}>y%4KMmR-2O z8vXQ4rnBCWUOCQzXErE%>}>PL9Yo1q=!pz-!Gc>=R4zm6z6RglC@ zeBs_FtG@X5ZAg8`q9g92jJFlg=)I)ke)PJjV7X}LPtzWJW;Tcgh$emz+`-{2lS; zWv!nwzI<}^8$K|a(#pz87|iwh>Jn}zBz;%z4lY3(atn$djZRKB z1o*mcO75($HHQsl>V!iCbZfOrp&Lf9oTnay#^OLv+}|rDl&%@t68z{x(1!*0tBccj z@urRAmOfjv4NIHrrUks1XM-Nm5KvO?B^kTMYdPoo$F@Q_cZ2c&PE_2~B=s6{yl=J3 z8#vxLg+SBeoUSTEn_Ajh+2-FYfPaK4?j!lV_&@N+@n`ayA<#r9J`;|6r1NkprUBBMS1#^Bd zz217FJW)_I$X=sGPwfAMSf?}T+$x={s@B?5$Zw4YIZGP4e@}x#LmBAdW%ExVRFYJ( zRLWEu<7KA%A!q=k3kn2pDe09^mAdc%e99eOTm-;<35!2eGgkzJGIB#r;GAGT8RHum5Mv@3#s8v=-se9hgIgts|wR`VH?+ewl(>6x7^n=>No zEhNb{%R&~w7vM{v+OCtAc@ zikd#rZbJBbbn;h+zQsqbv&H}uLu3eR!;taPYjH6jaUyL~BZtLNxyZytA|f4hc9HH% z;NbCKAZ!ZoW8m|DCKoA~=8FZ03`FA=&kZ@uh)U&SU}bar{%r+Fe3TC#1J23hH-86? zO*efqiU|yS!eJS?;potkel0U67fZLJ488G?CTDDDCxp7=Bj@pE&vnkiibB@1OXKWB!`Ujgl|~jyw|Sx$ok1 zqn^lqK#!L<8<*8-HZ=H8wW4UKtDzHx46)e@6sVf*}pXul2WjKP3Y( z4#-w~>@Sv-BySUnYJ(ho0TEapMLj!1O@siT)BWIW$KVnayRS58^3Z(Ke@b|BVe~^R z&_7f2@Iwar=$LUf=*1I~(0 z*x=~BJ~k^aPcl?#E^-SeeG|84%D;QcREPdm!i_7Qrl7lRXU^i5`<(Ch})p^{Le0c z^zEVA?8gn+L^={<94U!jr8E)RZVNax)xirT8`Dn?Z=@2ucjy*Yf3IU+(xDs4jl~x~ z)Dv@YrK@Mn$&mg9*n}7eNX_e5V+^S5))Mv<*l)t^-=sZ&^#^RZVVeJHd;j+AKV?5y zA{v?@6B7o8h7Ez&S2IFJ1N_m@Xzyshx+(RigR+U}B8{x~`>rQD=68>Q zR_rTHhq$6dhos^az{RTI8`&n%iGBf8^q3S}xVq)d7n0AdAE_ z#a)*ZzIyS}+#%T+{(gZ;ffa$h8y5HP=v31?Cj8wqj-Es@6dR!~ABR2)#Ks41O$z@G mqDTh}{P%BPY=dgA@m{(%l{M58qyQgVVW}u+$d}2!e*YhkA2{{^ diff --git a/doc/source/_static/uml/plugin.svg b/doc/source/_static/uml/plugin.svg index 51a3adeac..8843569f7 100644 --- a/doc/source/_static/uml/plugin.svg +++ b/doc/source/_static/uml/plugin.svg @@ -1,25 +1 @@ - - -globalsPLUGIN_REGISTRY: Dict[str, callable]_load_plugins()When the plugin module is imported,_load_plugins() is invoked andPLUGIN_REGISTRY contains all loadedplugins.PLUGIN_REGISTRY is a mappingof entry point names to somecallable Python object. \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/webapi_seq.png b/doc/source/_static/uml/webapi_seq.png index 1337229f9c62681640986e5a9d209eeb1af4fa75..2eab17737773ae4fcdbf5357e81e10ed4edda808 100644 GIT binary patch delta 533 zcmV+w0_y$ltOD+=0+4$NWTREb!&H?qrjdj$Ry~FserP3;%ka|^3zoD(ppqn&B48+# zgwzPR0E{>^UN{S|0mMVwP%~*n21!)NGgdMy4X=i4`!!R4ps{Cfzzxryx&!pANQwx= zib*^OcoTe6ZSB#M2mu{`2byh9Id-6PLUxc-FLlRe1zO(<(RSe$f>;F04{)1hPptD5 zu@JcV&h&E3;zUVHQ?TXej;gv43bSGuM6P92vROiXgcluz{3;bW8q#u-pfV{rF(>$c z-IS=wXW#x#IgUcIGMr6E9$1-(Vo}e#%*Sr*hUvT0YTx$9GKb4AR-+q zH8C|`ZLU=U3}z%^p;bz)gpuYfBojsqVMUS*@b;n&ERNyMOU!%6S)bP&vrBobN>5qm z&1w8uHHY}l7NJmX?n`biALat`%2vAAX+`p!uKmpI+Qf_b*0tv&yCTZ8?a@^y@L)fg zl$zeScFRc1CRD{BD>WRijS}Ob?H}nQyFH!fm}dR!Xb5YrjlBRLypHcqq7+7K3;tL7 zcfGrA$AeyfJb}-if8TW6!Sj=m0u>1E!%He{A3^UO5Y}0mMVwP%~*n21!)NGgdMy4R3~P`!!R4ps{Cfzzxryx&!pANQwx= zib*^Oco%$AZSB*O2mu{`pEcW_a_m6ogzO-vUh0m`3beizqV2&g1hEK~pWrsjo>=EA zVj*zzo$2M6#fg%ZreMp_9aZ%p6lTRRh+NC4WV3|&2roJa`Bf@%G^FJuL1j{MVovb? zx+zhU&%XVgavX(ZWjLFTJg_nm#iE{fnUCGr4bu;&)xPu5XNRwUT0t@POZNY+`4#0{ zaGXlM*#%`>6bYwskgS?LIJ|#`ow@EvMgC(x$GTH{=7@Hb(EcN!CJcm1a$sgFgNSsf z)Wp<$wYgRaFqn~ug;puG5=NS{kW3gcgcV6Lz}t&9usDXUmza-^vp%mmW|#6L8+!phcpcxJL@A8e7W}XD z?|I!`$AkW0Jb^pUzi&G3^UITw0u=}zz-uaPAHhJAt^ye!A31*eq3un5|E@LjyUuSR XL$xvBdw&6~=Dkmn&c&az<^qV5Ah-$2 diff --git a/doc/source/_static/uml/webapi_seq.svg b/doc/source/_static/uml/webapi_seq.svg index cd61ebf79..c79c66c23 100644 --- a/doc/source/_static/uml/webapi_seq.svg +++ b/doc/source/_static/uml/webapi_seq.svg @@ -1,25 +1 @@ - - -Cate Frontend/Backend communication using the "React" state transition modelFrontendBackendUserUserFrontendViewFrontendViewFrontendControllerFrontendControllerFrontendListenerFrontendListenerFrontendStoreFrontendStoreBackendControllerBackendControllerBackendStoreBackendStore* click! *dispatch(action)dispatch(action)dispatch(action)store_action(action)get_new_actions(timestamp): timestamp, actionsGetting new actionsis done asynchronouslyfrom a background threadthat polls e.g. all 50msfor all actionsdispatch(action)notify(new_state)render() \ No newline at end of file +Cate Frontend/Backend communication using the "React" state transition modelFrontendBackendUserUserFrontendViewFrontendViewFrontendControllerFrontendControllerFrontendListenerFrontendListenerFrontendStoreFrontendStoreBackendControllerBackendControllerBackendStoreBackendStore* click! *dispatch(action)dispatch(action)dispatch(action)store_action(action)get_new_actions(timestamp): timestamp, actionsGetting new actionsis done asynchronouslyfrom a background threadthat polls e.g. all 50msfor all actionsdispatch(action)notify(new_state)render() \ No newline at end of file diff --git a/doc/source/_static/uml/workflow.png b/doc/source/_static/uml/workflow.png index 14698845beb9399c06fc9fd7bbfac7c27d8040fc..6a1a86b329d6398ed344d662803982a5a8b73f9a 100644 GIT binary patch literal 5188 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 B0e1iZ literal 54504 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 - -cate.core.opOpMetaInfoqualified_name : strheader : dictinput : dictoutput : dictOperationNodeid : strinput : Dict[str, NodePort]output : Dict[str, NodePort]from_json(json_dict)to_json_dict() : dictinvoke(monitor, **args)Workflowfrom_json(json_dict)to_json_dict() : dictinvoke(monitor, **args)StepWorkflowStepresource : strOpStepop_registration : OperationExprStepexpression : strSubProcessSteparguments : List[str]NoOpStepCollection pattern:a Workflow is a Node,and aggregates Steps,which are Nodes as well.parentworkflowop_meta_infosteps0..N \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/workflow_node_port.png b/doc/source/_static/uml/workflow_node_port.png index 039353afeb45641f39c5ad17bdd232c799de1a8f..fcf3f84b69cfcd4884a74e2cd4f8b4def2c6c26f 100644 GIT binary patch literal 4888 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 LNVQDaCgT49i&AdG literal 8750 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 - -Nodeid : strNodePortnode: Nodename: strsource: NodePortvalue: objectinput0..Noutput0..N \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/_static/uml/workflow_seq.png b/doc/source/_static/uml/workflow_seq.png index 7117af1afdbc1684e052a59ce0023b0f99a5cc0d..76c623ffdcc33591e0c3152cbd45a4a8d912bff4 100644 GIT binary patch delta 323 zcmV-J0lfa5Mx92GZGTI{Fc8Pz1N|Qkd}$v#8l7YILB_OGWW`}O_c*dP!_YP<$+g4( z-gL!oY7K!Lcc1V5$juBgjdfW#q_T!cMa3k-#&GQrhqN#F_pntuKNRX1f{=~Mx$8NE zr6?MPybr?FVllU;752U#;)Bw_iUJJs$_!?BWI9h+Q7ZX6%QI`0Sk+(yU8ogwR*S2O zYlcF}5O%4px%)@abKv(y9Fp-r=y&Rifd;t?*O@yHV&&cE4wD}N6@O#uu0Lvs*(cCD zd&A&190%|aC2P12=)@!L(`pGu)jH*n34>bf>vlSiys(D3>)3-Ng11_tC^C78c}h57~)nphGnwqe3aNm7TP8yxmNby zFIB8=>p~#M-RFBhax;TWV_g;wsjMMVQ89_IF&jgRvGVih_LCn06@Me@u0Lyt*%#1z zd&6KHjskd$k~ItiI`N46yjp@$wN5!?!k`xWx}DA=udHG2I`$xm;Jub8N)C~1gjTZT z5>Ih>QJ7Q;PuyhW&jmulwQT@CVnPSgL9nBA= - -UserUserWorkflowWorkflowOpStepOpStepoperationoperationinvoke()for all stepsinvoke()_call_() \ No newline at end of file +UserUserWorkflowWorkflowOpStepOpStepoperationoperationinvoke()for all stepsinvoke()_call_() \ No newline at end of file diff --git a/doc/source/_static/uml/workspace.png b/doc/source/_static/uml/workspace.png index 82f173bff3d54df246a7916d053d4a4abbc9682c..cf7d7612f2686831daa0148ac6123fc5ceee5c3e 100644 GIT binary patch literal 4986 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 LAhl{0+lYSwy<(IS literal 31179 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 diff --git a/doc/source/_static/uml/workspace.svg b/doc/source/_static/uml/workspace.svg index c84922056..8843569f7 100644 --- a/doc/source/_static/uml/workspace.svg +++ b/doc/source/_static/uml/workspace.svg @@ -1,25 +1 @@ - - -cate.corecate.webapiWorkspaceManagerinit_workspace()set_workspace_resource()write_workspace_resource()FSWorkspaceManagerWorkspaceWorkflowOpStepWebAPIWorkspaceManagerWebService<communicate><uses>workspace_cache0..N110..N \ No newline at end of file +Dot Executable: nullCannot find Graphviz. You should try@startumltestdot@endumlorjava -jar plantuml.jar -testdot \ No newline at end of file diff --git a/doc/source/uml/ds.puml b/doc/source/uml/ds.puml index a8edd3881..a5f58cd17 100644 --- a/doc/source/uml/ds.puml +++ b/doc/source/uml/ds.puml @@ -20,14 +20,14 @@ class DataStoreRegistry { } interface DataStore { - name: str + id: str {abstract} query(id, query_expr): DataSource } interface DataSource { - name: str + id: str {abstract} get_dataset_schema(): cdm.Schema - {abstract} open_dataset(name, time_range): xarray.Dataset + {abstract} open_dataset(id, time_range): xarray.Dataset {abstract} sync(time_range) } diff --git a/test/ds/test_esa_cci_ftp.py b/test/ds/test_esa_cci_ftp.py index 743b89bd1..888bc194c 100644 --- a/test/ds/test_esa_cci_ftp.py +++ b/test/ds/test_esa_cci_ftp.py @@ -41,7 +41,7 @@ def setUp(self): data_store = FileSetDataStore.from_json('test', 'TEST_ROOT_DIR', FileSetDataSourceTest.JSON) self.assertIsNotNone(data_store) self.assertEqual(2, len(data_store._data_sources)) - self.assertEqual('test', data_store.name) + self.assertEqual('test', data_store.id) self.ds0 = data_store._data_sources[0] self.ds1 = data_store._data_sources[1] From df4c1ea82833e1195e2f0d5ede91523a582fc1be Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Thu, 20 Jul 2017 13:10:21 +0200 Subject: [PATCH 5/8] added todo for Chris --- cate/ds/local.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/cate/ds/local.py b/cate/ds/local.py index b9d0a4be5..8cca904d0 100644 --- a/cate/ds/local.py +++ b/cate/ds/local.py @@ -73,11 +73,30 @@ def add_to_data_store_registry(): data_store = LocalDataStore('local', get_data_store_path()) DATA_STORE_REGISTRY.add_data_store(data_store) - +# TODO (kbernat): document this class class LocalDataSource(DataSource): - def __init__(self, id: str, files: Union[Sequence[str], OrderedDict], data_store: 'LocalDataStore', - temporal_coverage: TimeRangeLike.TYPE = None, spatial_coverage: PolygonLike.TYPE = None, - variables: VarNamesLike.TYPE = None, reference_type: str = None, reference_name: str = None, + """ + + :param id: + :param files: + :param data_store: + :param temporal_coverage: + :param spatial_coverage: + :param variables: + :param reference_type: + :param reference_name: + :param meta_info: + """ + + def __init__(self, + id: str, + files: Union[Sequence[str], OrderedDict], + data_store: 'LocalDataStore', + temporal_coverage: TimeRangeLike.TYPE = None, + spatial_coverage: PolygonLike.TYPE = None, + variables: VarNamesLike.TYPE = None, + reference_type: str = None, + reference_name: str = None, meta_info: dict = None): self._id = id if isinstance(files, Sequence): From d6b0669b931dcb03ed7a6871c84652dd8e1e1bfd Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Thu, 20 Jul 2017 13:34:56 +0200 Subject: [PATCH 6/8] added title property to DataStore and DataSource --- cate/core/ds.py | 48 +++++++++++++++++++++++++------------ cate/ds/esa_cci_ftp.py | 4 ++-- cate/ds/esa_cci_odp.py | 5 ++-- cate/ds/local.py | 2 +- test/core/test_ds.py | 25 ++++++++++++++----- test/ds/test_esa_cci_odp.py | 4 ++++ 6 files changed, 62 insertions(+), 26 deletions(-) diff --git a/cate/core/ds.py b/cate/core/ds.py index b7906b04f..a651aa07f 100644 --- a/cate/core/ds.py +++ b/cate/core/ds.py @@ -118,12 +118,6 @@ class DataSource(metaclass=ABCMeta): def id(self) -> str: """Data source identifier.""" - # TODO (forman): see issue #299 - # @property - # @abstractmethod - # def title(self) -> str: - # """Human-readable data source title.""" - @property def schema(self) -> Optional[Schema]: """The data :py:class:`Schema` for any dataset provided by this data source or ``None`` if unknown.""" @@ -272,7 +266,16 @@ def delete_local(self, return 0 @property - def meta_info(self) -> Union[dict, None]: + def title(self) -> Optional[str]: + """ + Human-readable data source title. + The default implementation tries to retrieve the title from ``meta_info['title']``. + """ + meta_info = self.meta_info + return meta_info and meta_info.get('title') + + @property + def meta_info(self) -> Optional[dict]: """ Return meta-information about this data source. The returned dict, if any, is JSON-serializable. @@ -280,7 +283,7 @@ def meta_info(self) -> Union[dict, None]: return None @property - def cache_info(self) -> Union[dict, None]: + def cache_info(self) -> Optional[dict]: """ Return information about cached, locally available data sets. The returned dict, if any, is JSON-serializable. @@ -288,7 +291,7 @@ def cache_info(self) -> Union[dict, None]: return None @property - def variables_info(self) -> Union[dict, None]: + def variables_info(self) -> Optional[dict]: """ Return meta-information about the variables contained in this data source. The returned dict, if any, is JSON-serializable. @@ -296,7 +299,7 @@ def variables_info(self) -> Union[dict, None]: return None @property - def info_string(self): + def info_string(self) -> str: """ Return a textual representation of the meta-information about this data source. Useful for CLI / REPL applications. @@ -317,8 +320,9 @@ def info_string(self): return '\n'.join(info_lines) + # TODO (forman): No overrides! Remove from DataSource interface, turn into utility function instead @property - def variables_info_string(self): + def variables_info_string(self) -> str: """ Return some textual information about the variables contained in this data source. Useful for CLI / REPL applications. @@ -337,8 +341,9 @@ def variables_info_string(self): return '\n'.join(info_lines) + # TODO (forman): No overrides! Remove from DataSource interface, turn into utility function instead @property - def cached_datasets_coverage_string(self): + def cached_datasets_coverage_string(self) -> str: """ Return a textual representation of information about cached, locally available data sets. Useful for CLI / REPL applications. @@ -364,18 +369,31 @@ def _repr_html_(self): class DataStore(metaclass=ABCMeta): - """Represents a data store of data sources.""" + """ + Represents a data store of data sources. - def __init__(self, id: str): + :param id: Unique data store identifier. + :param title: A human-readable tile. + """ + + def __init__(self, id: str, title: str = None): self._id = id + self._title = title or id @property def id(self) -> str: """ - Return the name of this data store. + Return the unique identifier for this data store. """ return self._id + @property + def title(self) -> str: + """ + Return a human-readable tile for this data store. + """ + return self._title + @property def data_store_path(self) -> Optional[str]: """ diff --git a/cate/ds/esa_cci_ftp.py b/cate/ds/esa_cci_ftp.py index e2f909b1b..139459e5f 100644 --- a/cate/ds/esa_cci_ftp.py +++ b/cate/ds/esa_cci_ftp.py @@ -524,8 +524,8 @@ class FileSetDataStore(DataStore): :param remote_url: Optional URL of the data store's remote service. """ - def __init__(self, name: str, root_dir: str, remote_url: str = None): - super().__init__(name) + def __init__(self, id: str, root_dir: str, remote_url: str = None): + super().__init__(id) self._root_dir = root_dir self._remote_url = remote_url self._data_sources = [] diff --git a/cate/ds/esa_cci_odp.py b/cate/ds/esa_cci_odp.py index 220a4dd65..da0645163 100644 --- a/cate/ds/esa_cci_odp.py +++ b/cate/ds/esa_cci_odp.py @@ -280,11 +280,12 @@ def pick_start_time(file_info_rec): class EsaCciOdpDataStore(DataStore): def __init__(self, - name: str = 'esa_cci_odp', + id: str = 'esa_cci_odp', + title: str = 'ESA CCI Open Data Portal', index_cache_used: bool = True, index_cache_expiration_days: float = 1.0, index_cache_json_dict: dict = None): - super().__init__(name) + super().__init__(id, title=title) self._index_cache_used = index_cache_used self._index_cache_expiration_days = index_cache_expiration_days self._index_json_dict = index_cache_json_dict diff --git a/cate/ds/local.py b/cate/ds/local.py index 8cca904d0..a9c918e6d 100644 --- a/cate/ds/local.py +++ b/cate/ds/local.py @@ -552,7 +552,7 @@ def from_json_dict(cls, json_dicts: dict, data_store: 'LocalDataStore') -> Optio class LocalDataStore(DataStore): def __init__(self, id: str, store_dir: str): - super().__init__(id) + super().__init__(id, title='Local Data Sources') self._store_dir = store_dir self._data_sources = None diff --git a/test/core/test_ds.py b/test/core/test_ds.py index 7f4e5490e..c5de81fb4 100644 --- a/test/core/test_ds.py +++ b/test/core/test_ds.py @@ -1,4 +1,4 @@ -from typing import Sequence, Any +from typing import Sequence, Any, Optional from unittest import TestCase, skipIf import os.path as op import os @@ -14,8 +14,8 @@ class SimpleDataStore(ds.DataStore): - def __init__(self, name: str, data_sources: Sequence[ds.DataSource]): - super().__init__(name) + def __init__(self, id: str, data_sources: Sequence[ds.DataSource]): + super().__init__(id, title='Simple Test Store') self._data_sources = list(data_sources) def query(self, id: str = None, query_expr: str = None, monitor: Monitor = Monitor.NONE) -> Sequence[ds.DataSource]: @@ -26,22 +26,27 @@ def _repr_html_(self): class SimpleDataSource(ds.DataSource): - def __init__(self, id: str): + def __init__(self, id: str, meta_info: dict = None): self._id = id self._data_store = None + self._meta_info = meta_info @property def data_store(self) -> ds.DataStore: return self.data_store @property - def schema(self) -> ds.Schema: + def schema(self) -> Optional[ds.Schema]: return None @property def id(self) -> str: return self._id + @property + def meta_info(self) -> Optional[dict]: + return self._meta_info + def open_dataset(self, time_range: TimeRangeLike.TYPE = None, region: PolygonLike.TYPE = None, @@ -88,13 +93,21 @@ def _repr_html_(self): class IOTest(TestCase): def setUp(self): self.DS_AEROSOL = SimpleDataSource('aerosol') - self.DS_OZONE = SimpleDataSource('ozone') + self.DS_OZONE = SimpleDataSource('ozone', meta_info=dict(title='This is pure Ozone')) self.TEST_DATA_STORE = SimpleDataStore('test_aero_ozone', [self.DS_AEROSOL, self.DS_OZONE]) self.DS_AEROSOL._data_store = self.TEST_DATA_STORE self.DS_OZONE._data_store = self.TEST_DATA_STORE self.DS_SST = SimpleDataSource('sst') self.TEST_DATA_STORE_SST = SimpleDataStore('test_sst', [self.DS_SST]) + def test_title(self): + self.assertEqual(self.DS_AEROSOL.title, None) + self.assertEqual(self.DS_OZONE.title, 'This is pure Ozone') + + def test_meta_info(self): + self.assertEqual(self.DS_AEROSOL.meta_info, None) + self.assertEqual(self.DS_OZONE.meta_info, dict(title='This is pure Ozone')) + def test_find_data_sources_default_data_store(self): size_before = len(ds.DATA_STORE_REGISTRY) orig_stores = list(ds.DATA_STORE_REGISTRY.get_data_stores()) diff --git a/test/ds/test_esa_cci_odp.py b/test/ds/test_esa_cci_odp.py index 647beb719..1ac9cf47f 100644 --- a/test/ds/test_esa_cci_odp.py +++ b/test/ds/test_esa_cci_odp.py @@ -40,6 +40,10 @@ class EsaCciOdpDataStoreTest(unittest.TestCase): def setUp(self): self.data_store = _create_test_data_store() + def test_id_and_title(self): + self.assertEqual(self.data_store.id, 'test-odp') + self.assertEqual(self.data_store.title, 'ESA CCI Open Data Portal') + def test_query(self): data_sources = self.data_store.query() self.assertIsNotNone(data_sources) From c64365be979b4dc3ab07374043d51516e1a74363 Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Thu, 20 Jul 2017 13:38:56 +0200 Subject: [PATCH 7/8] made use of the new `id` and `title` properties in JSON repr --- cate/webapi/websocket.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cate/webapi/websocket.py b/cate/webapi/websocket.py index 3fd568de3..dbac6261c 100644 --- a/cate/webapi/websocket.py +++ b/cate/webapi/websocket.py @@ -108,9 +108,7 @@ def get_data_stores(self) -> list: data_stores = DATA_STORE_REGISTRY.get_data_stores() data_store_list = [] for data_store in data_stores: - data_store_list.append(dict(id=data_store.id, - name=data_store.id, # TODO (forman): issue #299 - description='')) + data_store_list.append(dict(id=data_store.id, title=data_store.title)) return sorted(data_store_list, key=lambda ds: ds['name']) @@ -130,7 +128,7 @@ def get_data_sources(self, data_store_id: str, monitor: Monitor) -> list: data_source_list = [] for data_source in data_sources: data_source_list.append(dict(id=data_source.id, - name=data_source.id, # TODO (forman): issue #299 + title=data_source.title, meta_info=data_source.meta_info)) return sorted(data_source_list, key=lambda ds: ds['name']) From 13cb0f4766fc60c47db509fed178f4124ac79ad0 Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Thu, 20 Jul 2017 13:39:21 +0200 Subject: [PATCH 8/8] resolves #299 --- CHANGES.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f9516dbf2..df211e32f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -42,17 +42,18 @@ } ``` -### Other Changes - -* renamed property `cate.core.ds.DataSource.name` to `id` -* renamed property `cate.core.ds.DataStore.name` to `id` -* renamed and changed signature of function `cate.core.ds.DataStore.query_data_sources(..., name=None)` - to `find_data_sources(..., id=None, query_expr=None)` -* changed signature of method `cate.core.ds.DataStore.query(name, ...)` to `query(id=None, query_expr=None, ...)` -* renamed and changed signature of method `cate.core.ds.DataSource.matches_filter(name)` to `matches(id=None, query_expr=None)` - ### Issues Fixed/Resolved +* Fixed [#299](https://github.com/CCI-Tools/cate-core/issues/299) + * renamed property `cate.core.ds.DataSource.name` to `id` + * renamed property `cate.core.ds.DataStore.name` to `id` + * renamed and changed signature of function `cate.core.ds.DataStore.query_data_sources(..., name=None)` + to `find_data_sources(..., id=None, query_expr=None)` + * changed signature of method `cate.core.ds.DataStore.query(name, ...)` to `query(id=None, query_expr=None, ...)` + * renamed and changed signature of method `cate.core.ds.DataSource.matches_filter(name)` to `matches(id=None, query_expr=None)` + * added `title` property to `cate.core.ds.DataStore` and `cate.core.ds.DataSource` + * made use of the new `id` and `title` properties of both `DataStore` and `DataSource` in their + JSON representations. * Fixed [#294](https://github.com/CCI-Tools/cate-core/issues/294) * Fixed [#286](https://github.com/CCI-Tools/cate-core/issues/286) * Fixed [#285](https://github.com/CCI-Tools/cate-core/issues/285)