-
Notifications
You must be signed in to change notification settings - Fork 41
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Copy over xarray's set_options context manager (#243)
- Loading branch information
Showing
5 changed files
with
81 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
from .accessor import CFAccessor # noqa | ||
from .helpers import bounds_to_vertices, vertices_to_bounds # noqa | ||
from .options import set_options # noqa | ||
from .utils import _get_version | ||
|
||
__version__ = _get_version() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
""" | ||
Started from xarray options.py | ||
""" | ||
|
||
import copy | ||
from typing import Any, MutableMapping | ||
|
||
from .utils import always_iterable | ||
|
||
OPTIONS: MutableMapping[str, Any] = { | ||
"custom_criteria": [], | ||
} | ||
|
||
|
||
class set_options: | ||
"""Set options for cf-xarray in a controlled context. | ||
Currently supported options: | ||
- ``custom_critera``: Translate from axis, coord, or custom name to | ||
variable name optionally using ``custom_criteria``. Default: []. | ||
You can use ``set_options`` either as a context manager: | ||
>>> my_custom_criteria = { 'ssh': {'name': 'elev$'} } | ||
>>> ds = xr.Dataset({"elev": np.arange(1000)}) | ||
>>> with cf_xarray.set_options(custom_criteria=my_custom_criteria): | ||
... assert (ds['elev'] == ds.cf['ssh']).all() | ||
Or to set global options: | ||
>>> cf_xarray.set_options(custom_criteria=my_custom_criteria) | ||
>>> assert (ds['elev'] == ds.cf['ssh']).all() | ||
""" | ||
|
||
def __init__(self, **kwargs): | ||
self.old = {} | ||
for k, v in kwargs.items(): | ||
if k not in OPTIONS: | ||
raise ValueError( | ||
f"argument name {k!r} is not in the set of valid options {set(OPTIONS)!r}" | ||
) | ||
self.old[k] = OPTIONS[k] | ||
self._apply_update(kwargs) | ||
|
||
def _apply_update(self, options_dict): | ||
options_dict = copy.deepcopy(options_dict) | ||
for k, v in options_dict.items(): | ||
if k == "custom_criteria": | ||
options_dict["custom_criteria"] = always_iterable( | ||
options_dict["custom_criteria"], allowed=(tuple, list) | ||
) | ||
OPTIONS.update(options_dict) | ||
|
||
def __enter__(self): | ||
return | ||
|
||
def __exit__(self, type, value, traceback): | ||
self._apply_update(self.old) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
""" | ||
Tests OPTIONS logic brought in from xarray. | ||
""" | ||
|
||
import pytest | ||
|
||
import cf_xarray as cfxr | ||
|
||
|
||
def test_options(): | ||
|
||
# test for inputting a nonexistent option | ||
with pytest.raises(ValueError): | ||
cfxr.set_options(DISPLAY_WIDTH=80) |