Source code for xwrf.tutorial

"""
Useful for:
* users learning xwrf
* building tutorials in the documentation.
"""

from __future__ import annotations  # noqa: F401

import os
import pathlib

import xarray as xr

_default_cache_dir_name = 'xwrf_tutorial_data'
base_url = 'https://github.com/xarray-contrib/xwrf-data'
version = 'main'


def _construct_cache_dir(path):
    import pooch

    if isinstance(path, os.PathLike):
        path = os.fspath(path)
    elif path is None:
        path = pooch.os_cache(_default_cache_dir_name)

    return path


sample_datasets = {
    'dummy': 'data/dummy.nc',
    'dummy_attrs_only': 'data/dummy_attrs_only.nc',
    'dummy_salem_parsed': 'data/dummy_salem_parsed.nc',
    'polar_stereographic_1': 'data/geo_em_d01_polarstereo.nc',
    'polar_stereographic_2': 'data/geo_em_d02_polarstereo.nc',
    'lambert_conformal': 'data/lambert_conformal_sample.nc',
    'mercator': 'data/mercator_sample.nc',
    'tiny': 'data/tiny.nc',
    'met_em_sample': 'data/met_em.d01.2005-08-28_12:00:00.nc',
    'wrfout': 'data/wrfout_d01_2099-10-01_00:00:00.nc',
    'ideal': 'data/ideal.nc',
}


# idea borrowed from Seaborn and Xarray
[docs] def open_dataset( name: str, cache: bool = True, cache_dir: str | pathlib.Path = None, *, engine: str = 'netcdf4', **kws, ) -> xr.Dataset: """ Open a dataset from the online repository (requires internet). If a local copy is found then always use that to avoid network traffic. Available datasets: * ``"dummy"`` * ``"dummy_attrs_only"`` * ``"dummy_salem_parsed"`` * ``"polar_stereographic_1"`` * ``"polar_stereographic_2"`` * ``"lambert_conformal"`` * ``"mercator"`` * ``"met_em_sample"`` * ``"wrfout"`` * ``"ideal"`` Parameters ---------- name : str Name of the dataset. e.g. 'mercator' cache : bool, optional If True, then cache data locally for use on subsequent calls cache_dir : path-like, optional The directory in which to search for and write cached data. engine : str, optional Name of the backend engine to use. **kws : dict, optional Additional keyword arguments passed through to the :py:func:`~xarray.open_dataset` function. Returns ------- xarray.Dataset The dataset. """ try: import pooch except ImportError as e: raise ImportError( 'tutorial.open_dataset depends on pooch to download and manage datasets.' ' To proceed please install pooch using:' ' `python -m pip install pooch` or `conda install -c conda-forge pooch`.' ) from e logger = pooch.get_logger() logger.setLevel('WARNING') cache_dir = _construct_cache_dir(cache_dir) try: path = sample_datasets[name] except KeyError as exc: raise KeyError( f'{name} is not a valid dataset name. Valid names include: {list(sample_datasets.keys())}.' ) from exc url = f'{base_url}/raw/{version}/{path}' # retrieve the file filepath = pooch.retrieve(url=url, known_hash=None, path=cache_dir) ds = xr.open_dataset(filepath, engine=engine, **kws) if not cache: ds = ds.load() pathlib.Path(filepath).unlink() return ds
def load_dataset(*args, **kwargs) -> xr.Dataset: """ Open, load into memory, and close a dataset from the online repository (requires internet) """ with open_dataset(*args, **kwargs) as ds: return ds.load()