"""Helper functions for fetching and loading catalog"""
import importlib
import sys
def show_versions(file=sys.stdout): # pragma: no cover
"""print the versions of intake-esm and its dependencies.
Adapted from xarray/util/print_versions.py
Parameters
----------
file : file-like, optional
print to the given file-like object. Defaults to sys.stdout.
"""
deps = [
('xarray', lambda mod: mod.__version__),
('pandas', lambda mod: mod.__version__),
('intake', lambda mod: mod.__version__),
('intake_esm', lambda mod: mod.__version__),
('fsspec', lambda mod: mod.__version__),
('s3fs', lambda mod: mod.__version__),
('gcsfs', lambda mod: mod.__version__),
('fastprogress', lambda mod: mod.__version__),
('dask', lambda mod: mod.__version__),
('zarr', lambda mod: mod.__version__),
('cftime', lambda mod: mod.__version__),
('netCDF4', lambda mod: mod.__version__),
('requests', lambda mod: mod.__version__),
]
deps_blob = []
for modname, ver_f in deps:
try:
if modname in sys.modules:
mod = sys.modules[modname]
else:
mod = importlib.import_module(modname)
except Exception:
deps_blob.append((modname, None))
else:
try:
ver = ver_f(mod)
deps_blob.append((modname, ver))
except Exception:
deps_blob.append((modname, 'installed'))
print('\nINSTALLED VERSIONS', file=file)
print('------------------', file=file)
print('', file=file)
for k, stat in sorted(deps_blob):
print(f'{k}: {stat}', file=file)
OPTIONS = {
'attrs_prefix': 'intake_esm_attrs',
'dataset_key': 'intake_esm_dataset_key',
'vars_key': 'intake_esm_vars',
}
[docs]class set_options:
"""Set options for intake_esm in a controlled context.
Currently-supported options:
- ``attrs_prefix``:
The prefix to use in the names of attributes constructed from the catalog's columns
when returning xarray Datasets.
Default: ``intake_esm_attrs``.
- ``dataset_key``:
Name of the global attribute where to store the dataset's key.
Default: ``intake_esm_dataset_key``.
- ``vars_key``:
Name of the global attribute where to store the list of requested variables when
opening a dataset. Default: ``intake_esm_vars``.
Examples
--------
You can use ``set_options`` either as a context manager:
>>> import intake
>>> import intake_esm
>>> cat = intake.open_esm_datastore('catalog.json')
>>> with intake_esm.set_options(attrs_prefix='cat'):
... out = cat.to_dataset_dict()
Or to set global options:
>>> intake_esm.set_options(attrs_prefix='cat', vars_key='cat_vars')
"""
def __init__(self, **kwargs):
self.old = {}
for k, v in kwargs.items():
if k not in OPTIONS:
raise ValueError(
f'argument name {k} is not in the set of valid options {set(OPTIONS)}'
)
if not isinstance(v, str):
raise ValueError(f'option {k} given an invalid value: {v}')
self.old[k] = OPTIONS[k]
self._update(kwargs)
def __enter__(self):
"""Context management."""
return
def _update(self, kwargs):
"""Update values."""
for k, v in kwargs.items():
OPTIONS[k] = v
def __exit__(self, type, value, traceback):
"""Context management."""
self._update(self.old)