From cd3e5ecc0c81ccde937764982a4343b3616c2a0a Mon Sep 17 00:00:00 2001 From: cvanelteren Date: Sat, 25 Oct 2025 16:46:50 +0200 Subject: [PATCH 1/5] add cycle parsing --- ultraplot/internals/rcsetup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ultraplot/internals/rcsetup.py b/ultraplot/internals/rcsetup.py index c854cfcc2..dd964dddd 100644 --- a/ultraplot/internals/rcsetup.py +++ b/ultraplot/internals/rcsetup.py @@ -316,7 +316,9 @@ def _validate_cmap(value): _cmap_database[name] = value return name - raise ValueError(f"Invalid colormap or color cycle name {name!r}.") + elif isinstance(value, Cycler): + return value + raise ValueError(f"Invalid colormap or lor cycle {name!r}.") return _validate_cmap From 1656f8a1cb0971485423dc3f816de54292414832 Mon Sep 17 00:00:00 2001 From: cvanelteren Date: Sat, 25 Oct 2025 16:57:13 +0200 Subject: [PATCH 2/5] allow lists --- ultraplot/internals/rcsetup.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ultraplot/internals/rcsetup.py b/ultraplot/internals/rcsetup.py index dd964dddd..f38987231 100644 --- a/ultraplot/internals/rcsetup.py +++ b/ultraplot/internals/rcsetup.py @@ -295,13 +295,14 @@ def _validate_cftime_resolution(unit: str) -> str: raise ValueError(msg) -def _validate_cmap(subtype): +def _validate_cmap(subtype, cycle=False): """ Validate the colormap or cycle. Possibly skip name registration check and assign the colormap name rather than a colormap instance. """ def _validate_cmap(value): + name = value if isinstance(value, str): if VALIDATE_REGISTERED_CMAPS: @@ -316,9 +317,14 @@ def _validate_cmap(value): _cmap_database[name] = value return name - elif isinstance(value, Cycler): - return value - raise ValueError(f"Invalid colormap or lor cycle {name!r}.") + elif cycle: + from ..constructor import Cycle + + if isinstance(value, Cycler): + return Cycle(value) + elif np.iterable(value): + return Cycle(value) + raise ValueError(f"Invalid colormap or color cycle name {name!r}.") return _validate_cmap @@ -1197,7 +1203,7 @@ def copy(self): # Color cycle additions "cycle": ( CYCLE, - _validate_cmap("discrete"), + _validate_cmap("discrete", cycle=True), "Name of the color cycle assigned to :rcraw:`axes.prop_cycle`.", ), # Colormap additions From 3e2318c1c3d367c44dea18c50e92474d492369a6 Mon Sep 17 00:00:00 2001 From: cvanelteren Date: Sat, 25 Oct 2025 17:01:15 +0200 Subject: [PATCH 3/5] add unittest --- ultraplot/tests/test_config.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ultraplot/tests/test_config.py b/ultraplot/tests/test_config.py index c700bb0c8..100b39511 100644 --- a/ultraplot/tests/test_config.py +++ b/ultraplot/tests/test_config.py @@ -94,3 +94,28 @@ def test_dev_version_skipped(mock_urlopen, mock_version, mock_print): check_for_update("fakepkg") mock_print.assert_not_called() + + +@pytest.mark.parametrize( + "cycle, raises_error", + [ + ("qual1", False), + (["#5790fc", "#f89c20", "#e42536", "#964a8b", "#9c9ca1", "#7a21dd"], False), + ( + uplt.constructor.Cycle( + ["#5790fc", "#f89c20", "#e42536", "#964a8b", "#9c9ca1", "#7a21dd"] + ), + False, + ), + (1234, True), + ], +) +def test_cycle_rc_setting(cycle, raises_error): + """ + Test various ways to set the cycle in rc + """ + if raises_error: + with pytest.raises(ValueError): + uplt.rc["cycle"] = cycle + else: + uplt.rc["cycle"] = cycle From 6dafaf51456f8d5384c37faa6f3df0295cba83e1 Mon Sep 17 00:00:00 2001 From: cvanelteren Date: Sat, 25 Oct 2025 17:15:18 +0200 Subject: [PATCH 4/5] update test with colormap and correct registration --- ultraplot/internals/rcsetup.py | 3 +-- ultraplot/tests/test_config.py | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ultraplot/internals/rcsetup.py b/ultraplot/internals/rcsetup.py index f38987231..55dc28c48 100644 --- a/ultraplot/internals/rcsetup.py +++ b/ultraplot/internals/rcsetup.py @@ -314,8 +314,7 @@ def _validate_cmap(value): name = getattr(value, "name", None) if isinstance(name, str): from ..colors import _cmap_database # avoid circular imports - - _cmap_database[name] = value + _cmap_database.register(value, name = name) return name elif cycle: from ..constructor import Cycle diff --git a/ultraplot/tests/test_config.py b/ultraplot/tests/test_config.py index 100b39511..11a308b56 100644 --- a/ultraplot/tests/test_config.py +++ b/ultraplot/tests/test_config.py @@ -107,6 +107,7 @@ def test_dev_version_skipped(mock_urlopen, mock_version, mock_print): ), False, ), + (uplt.colormaps.get_cmap("viridis"), False), (1234, True), ], ) From 671587501fa78d5442bbc8d9395c9974e4177fb4 Mon Sep 17 00:00:00 2001 From: cvanelteren Date: Sat, 25 Oct 2025 17:15:54 +0200 Subject: [PATCH 5/5] black --- ultraplot/internals/rcsetup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ultraplot/internals/rcsetup.py b/ultraplot/internals/rcsetup.py index 55dc28c48..7439f35cf 100644 --- a/ultraplot/internals/rcsetup.py +++ b/ultraplot/internals/rcsetup.py @@ -314,7 +314,8 @@ def _validate_cmap(value): name = getattr(value, "name", None) if isinstance(name, str): from ..colors import _cmap_database # avoid circular imports - _cmap_database.register(value, name = name) + + _cmap_database.register(value, name=name) return name elif cycle: from ..constructor import Cycle