Skip to content

Commit ab677a8

Browse files
committed
Simplify the rcparams deprecation machinery.
Just have a single kind of deprecated rcParams, which emit a DeprecationWarning on get and on set. ... which caught the fact that we were previously *not* warning on access to text.latex.unicode, now we do but need to avoid triggering the warnings internally.
1 parent 860803d commit ab677a8

File tree

3 files changed

+22
-66
lines changed

3 files changed

+22
-66
lines changed

lib/matplotlib/__init__.py

Lines changed: 17 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -604,25 +604,12 @@ def gen_candidates():
604604
"install is broken")
605605

606606

607-
# rcParams deprecated and automatically mapped to another key.
608-
# Values are tuples of (version, new_name, f_old2new, f_new2old).
609-
_deprecated_map = {}
610-
611-
# rcParams deprecated; some can manually be mapped to another key.
612-
# Values are tuples of (version, new_name_or_None).
613-
_deprecated_ignore_map = {
614-
}
615-
616-
# rcParams deprecated; can use None to suppress warnings; remain actually
617-
# listed in the rcParams (not included in _all_deprecated).
618-
# Values are tuples of (version,)
619-
_deprecated_remain_as_none = {
607+
# Deprecated rcParams, with kwargs to warn_deprecated. Must at least specify
608+
# the 'since' key.
609+
_deprecated_rcs = {
620610
}
621611

622612

623-
_all_deprecated = {*_deprecated_map, *_deprecated_ignore_map}
624-
625-
626613
class RcParams(MutableMapping, dict):
627614
"""
628615
A dictionary object including validation.
@@ -636,34 +623,20 @@ class RcParams(MutableMapping, dict):
636623
"""
637624

638625
validate = {key: converter
639-
for key, (default, converter) in defaultParams.items()
640-
if key not in _all_deprecated}
626+
for key, (default, converter) in defaultParams.items()}
641627

642628
# validate values on the way in
643629
def __init__(self, *args, **kwargs):
644630
self.update(*args, **kwargs)
645631

646632
def __setitem__(self, key, val):
633+
if (key == 'backend' and val is rcsetup._auto_backend_sentinel
634+
and 'backend' in self):
635+
return
636+
if key in _deprecated_rcs:
637+
cbook.warn_deprecated(
638+
**{"name": key, "obj_type": "rcparam", **_deprecated_rcs[key]})
647639
try:
648-
if key in _deprecated_map:
649-
version, alt_key, alt_val, inverse_alt = _deprecated_map[key]
650-
cbook.warn_deprecated(
651-
version, name=key, obj_type="rcparam", alternative=alt_key)
652-
key = alt_key
653-
val = alt_val(val)
654-
elif key in _deprecated_remain_as_none and val is not None:
655-
version, = _deprecated_remain_as_none[key]
656-
cbook.warn_deprecated(
657-
version, name=key, obj_type="rcparam")
658-
elif key in _deprecated_ignore_map:
659-
version, alt_key = _deprecated_ignore_map[key]
660-
cbook.warn_deprecated(
661-
version, name=key, obj_type="rcparam", alternative=alt_key)
662-
return
663-
elif key == 'backend':
664-
if val is rcsetup._auto_backend_sentinel:
665-
if 'backend' in self:
666-
return
667640
try:
668641
cval = self.validate[key](val)
669642
except ValueError as ve:
@@ -675,24 +648,14 @@ def __setitem__(self, key, val):
675648
f"a list of valid parameters)")
676649

677650
def __getitem__(self, key):
678-
if key in _deprecated_map:
679-
version, alt_key, alt_val, inverse_alt = _deprecated_map[key]
680-
cbook.warn_deprecated(
681-
version, name=key, obj_type="rcparam", alternative=alt_key)
682-
return inverse_alt(dict.__getitem__(self, alt_key))
683-
684-
elif key in _deprecated_ignore_map:
685-
version, alt_key = _deprecated_ignore_map[key]
686-
cbook.warn_deprecated(
687-
version, name=key, obj_type="rcparam", alternative=alt_key)
688-
return dict.__getitem__(self, alt_key) if alt_key else None
689-
690-
elif key == "backend":
651+
if key == "backend":
691652
val = dict.__getitem__(self, key)
692653
if val is rcsetup._auto_backend_sentinel:
693654
from matplotlib import pyplot as plt
694655
plt.switch_backend(rcsetup._auto_backend_sentinel)
695-
656+
if key in _deprecated_rcs:
657+
cbook.warn_deprecated(
658+
**{"name": key, "obj_type": "rcparam", **_deprecated_rcs[key]})
696659
return dict.__getitem__(self, key)
697660

698661
def __repr__(self):
@@ -812,11 +775,6 @@ def _rc_params_in_file(fname, fail_on_error=False):
812775
error_details = _error_details_fmt % (line_no, line, fname)
813776
_log.warning('Bad val %r on %s\n\t%s',
814777
val, error_details, msg)
815-
elif key in _deprecated_ignore_map:
816-
version, alt_key = _deprecated_ignore_map[key]
817-
cbook.warn_deprecated(
818-
version, name=key, alternative=alt_key,
819-
addendum="Please update your matplotlibrc.")
820778
else:
821779
version = 'master' if '.post' in __version__ else f'v{__version__}'
822780
print(f"""
@@ -850,8 +808,7 @@ def rc_params_from_file(fname, fail_on_error=False, use_default_template=True):
850808

851809
iter_params = defaultParams.items()
852810
with cbook._suppress_matplotlib_deprecation_warning():
853-
config = RcParams([(key, default) for key, (default, _) in iter_params
854-
if key not in _all_deprecated])
811+
config = RcParams((key, default) for key, (default, _) in iter_params)
855812
config.update(config_from_file)
856813

857814
if config['datapath'] is None:
@@ -876,9 +833,8 @@ def rc_params_from_file(fname, fail_on_error=False, use_default_template=True):
876833

877834
with cbook._suppress_matplotlib_deprecation_warning():
878835
rcParamsOrig = RcParams(rcParams.copy())
879-
rcParamsDefault = RcParams([(key, default) for key, (default, converter) in
880-
defaultParams.items()
881-
if key not in _all_deprecated])
836+
rcParamsDefault = RcParams(
837+
(key, default) for key, (default, converter) in defaultParams.items())
882838

883839
if rcParams['axes.formatter.use_locale']:
884840
locale.setlocale(locale.LC_ALL, '')

lib/matplotlib/tests/test_rcparams.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,14 +465,13 @@ def test_rcparams_reset_after_fail():
465465

466466
def test_if_rctemplate_is_up_to_date():
467467
# This tests if the matplotlibrc.template file contains all valid rcParams.
468-
deprecated = {*mpl._all_deprecated, *mpl._deprecated_remain_as_none}
469468
with cbook._get_data_path('matplotlibrc').open() as file:
470469
rclines = file.readlines()
471470
missing = {}
472471
for k, v in mpl.defaultParams.items():
473472
if k[0] == "_":
474473
continue
475-
if k in deprecated:
474+
if k in mpl._deprecated_rcs:
476475
continue
477476
found = False
478477
for line in rclines:

lib/matplotlib/texmanager.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,15 @@ def get_font_config(self):
160160
if self._rc_cache is None:
161161
self._rc_cache = dict.fromkeys(self._rc_cache_keys)
162162
changed = [par for par in self._rc_cache_keys
163-
if rcParams[par] != self._rc_cache[par]]
163+
if dict.__getitem__(rcParams, par) != self._rc_cache[par]]
164164
if changed:
165165
_log.debug('following keys changed: %s', changed)
166166
for k in changed:
167167
_log.debug('%-20s: %-10s -> %-10s',
168-
k, self._rc_cache[k], rcParams[k])
168+
k, self._rc_cache[k], dict.__getitem__(rcParams, k))
169169
# deepcopy may not be necessary, but feels more future-proof
170-
self._rc_cache[k] = copy.deepcopy(rcParams[k])
170+
self._rc_cache[k] = copy.deepcopy(
171+
dict.__getitem__(rcParams, k))
171172
_log.debug('RE-INIT\nold fontconfig: %s', self._fontconfig)
172173
self._reinit()
173174
_log.debug('fontconfig: %s', self._fontconfig)

0 commit comments

Comments
 (0)