Skip to content

Commit 5207deb

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 70fb1a6 commit 5207deb

File tree

5 files changed

+35
-77
lines changed

5 files changed

+35
-77
lines changed

lib/matplotlib/__init__.py

Lines changed: 22 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -713,29 +713,16 @@ def gen_candidates():
713713
"install is broken")
714714

715715

716-
# rcParams deprecated and automatically mapped to another key.
717-
# Values are tuples of (version, new_name, f_old2new, f_new2old).
718-
_deprecated_map = {}
719-
720-
# rcParams deprecated; some can manually be mapped to another key.
721-
# Values are tuples of (version, new_name_or_None).
722-
_deprecated_ignore_map = {
723-
'pgf.debug': ('3.0', None),
716+
# Deprecated rcParams, with kwargs to warn_deprecated. Must at least specify
717+
# the 'since' key.
718+
_deprecated_rcs = {
719+
'pgf.debug': {'since': '3.0'},
720+
'text.latex.unicode': {'since': '3.0'},
721+
'savefig.frameon': {'since': '3.1'},
722+
'verbose.fileo': {'since': '3.1'},
723+
'verbose.level': {'since': '3.1'},
724724
}
725725

726-
# rcParams deprecated; can use None to suppress warnings; remain actually
727-
# listed in the rcParams (not included in _all_deprecated).
728-
# Values are tuples of (version,)
729-
_deprecated_remain_as_none = {
730-
'text.latex.unicode': ('3.0',),
731-
'savefig.frameon': ('3.1',),
732-
'verbose.fileo': ('3.1',),
733-
'verbose.level': ('3.1',),
734-
}
735-
736-
737-
_all_deprecated = {*_deprecated_map, *_deprecated_ignore_map}
738-
739726

740727
class RcParams(MutableMapping, dict):
741728
"""
@@ -750,34 +737,20 @@ class RcParams(MutableMapping, dict):
750737
"""
751738

752739
validate = {key: converter
753-
for key, (default, converter) in defaultParams.items()
754-
if key not in _all_deprecated}
740+
for key, (default, converter) in defaultParams.items()}
755741

756742
# validate values on the way in
757743
def __init__(self, *args, **kwargs):
758744
self.update(*args, **kwargs)
759745

760746
def __setitem__(self, key, val):
747+
if (key == 'backend' and val is rcsetup._auto_backend_sentinel
748+
and 'backend' in self):
749+
return
750+
if key in _deprecated_rcs:
751+
cbook.warn_deprecated(
752+
**{"name": key, "obj_type": "rcparam", **_deprecated_rcs[key]})
761753
try:
762-
if key in _deprecated_map:
763-
version, alt_key, alt_val, inverse_alt = _deprecated_map[key]
764-
cbook.warn_deprecated(
765-
version, name=key, obj_type="rcparam", alternative=alt_key)
766-
key = alt_key
767-
val = alt_val(val)
768-
elif key in _deprecated_remain_as_none and val is not None:
769-
version, = _deprecated_remain_as_none[key]
770-
cbook.warn_deprecated(
771-
version, name=key, obj_type="rcparam")
772-
elif key in _deprecated_ignore_map:
773-
version, alt_key = _deprecated_ignore_map[key]
774-
cbook.warn_deprecated(
775-
version, name=key, obj_type="rcparam", alternative=alt_key)
776-
return
777-
elif key == 'backend':
778-
if val is rcsetup._auto_backend_sentinel:
779-
if 'backend' in self:
780-
return
781754
try:
782755
cval = self.validate[key](val)
783756
except ValueError as ve:
@@ -789,24 +762,14 @@ def __setitem__(self, key, val):
789762
f"a list of valid parameters)")
790763

791764
def __getitem__(self, key):
792-
if key in _deprecated_map:
793-
version, alt_key, alt_val, inverse_alt = _deprecated_map[key]
794-
cbook.warn_deprecated(
795-
version, name=key, obj_type="rcparam", alternative=alt_key)
796-
return inverse_alt(dict.__getitem__(self, alt_key))
797-
798-
elif key in _deprecated_ignore_map:
799-
version, alt_key = _deprecated_ignore_map[key]
800-
cbook.warn_deprecated(
801-
version, name=key, obj_type="rcparam", alternative=alt_key)
802-
return dict.__getitem__(self, alt_key) if alt_key else None
803-
804-
elif key == "backend":
765+
if key == "backend":
805766
val = dict.__getitem__(self, key)
806767
if val is rcsetup._auto_backend_sentinel:
807768
from matplotlib import pyplot as plt
808769
plt.switch_backend(rcsetup._auto_backend_sentinel)
809-
770+
if key in _deprecated_rcs:
771+
cbook.warn_deprecated(
772+
**{"name": key, "obj_type": "rcparam", **_deprecated_rcs[key]})
810773
return dict.__getitem__(self, key)
811774

812775
def __repr__(self):
@@ -926,11 +889,6 @@ def _rc_params_in_file(fname, fail_on_error=False):
926889
error_details = _error_details_fmt % (line_no, line, fname)
927890
_log.warning('Bad val %r on %s\n\t%s',
928891
val, error_details, msg)
929-
elif key in _deprecated_ignore_map:
930-
version, alt_key = _deprecated_ignore_map[key]
931-
cbook.warn_deprecated(
932-
version, name=key, alternative=alt_key,
933-
addendum="Please update your matplotlibrc.")
934892
else:
935893
version = 'master' if '.post' in __version__ else f'v{__version__}'
936894
print(f"""
@@ -964,8 +922,7 @@ def rc_params_from_file(fname, fail_on_error=False, use_default_template=True):
964922

965923
iter_params = defaultParams.items()
966924
with cbook._suppress_matplotlib_deprecation_warning():
967-
config = RcParams([(key, default) for key, (default, _) in iter_params
968-
if key not in _all_deprecated])
925+
config = RcParams((key, default) for key, (default, _) in iter_params)
969926
config.update(config_from_file)
970927

971928
if config['datapath'] is None:
@@ -990,9 +947,8 @@ def rc_params_from_file(fname, fail_on_error=False, use_default_template=True):
990947

991948
with cbook._suppress_matplotlib_deprecation_warning():
992949
rcParamsOrig = RcParams(rcParams.copy())
993-
rcParamsDefault = RcParams([(key, default) for key, (default, converter) in
994-
defaultParams.items()
995-
if key not in _all_deprecated])
950+
rcParamsDefault = RcParams(
951+
(key, default) for key, (default, converter) in defaultParams.items())
996952

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

lib/matplotlib/projections/geo.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ def __init__(self, round_to=1.0):
2323

2424
def __call__(self, x, pos=None):
2525
degrees = round(np.rad2deg(x) / self._round_to) * self._round_to
26-
if rcParams['text.usetex'] and not rcParams['text.latex.unicode']:
26+
if (rcParams['text.usetex']
27+
and not dict.__getitem__(rcParams, 'text.latex.unicode')):
2728
return r"$%0.0f^\circ$" % degrees
2829
else:
2930
return "%0.0f\N{DEGREE SIGN}" % degrees

lib/matplotlib/projections/polar.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ def __call__(self, x, pos=None):
166166
d = np.rad2deg(abs(vmax - vmin))
167167
digits = max(-int(np.log10(d) - 1.5), 0)
168168

169-
if rcParams['text.usetex'] and not rcParams['text.latex.unicode']:
169+
if (rcParams['text.usetex']
170+
and not dict.__getitem__(rcParams, 'text.latex.unicode')):
170171
format_str = r"${value:0.{digits:d}f}^\circ$"
171172
return format_str.format(value=np.rad2deg(x), digits=digits)
172173
else:

lib/matplotlib/tests/test_rcparams.py

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

463463
def test_if_rctemplate_is_up_to_date():
464464
# This tests if the matplotlibrc.template file contains all valid rcParams.
465-
deprecated = {*mpl._all_deprecated, *mpl._deprecated_remain_as_none}
466465
with cbook._get_data_path('matplotlibrc').open() as file:
467466
rclines = file.readlines()
468467
missing = {}
469468
for k, v in mpl.defaultParams.items():
470469
if k[0] == "_":
471470
continue
472-
if k in deprecated:
471+
if k in mpl._deprecated_rcs:
473472
continue
474473
found = False
475474
for line in rclines:

lib/matplotlib/texmanager.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -169,14 +169,15 @@ def get_font_config(self):
169169
if self._rc_cache is None:
170170
self._rc_cache = dict.fromkeys(self._rc_cache_keys)
171171
changed = [par for par in self._rc_cache_keys
172-
if rcParams[par] != self._rc_cache[par]]
172+
if dict.__getitem__(rcParams, par) != self._rc_cache[par]]
173173
if changed:
174174
_log.debug('following keys changed: %s', changed)
175175
for k in changed:
176176
_log.debug('%-20s: %-10s -> %-10s',
177-
k, self._rc_cache[k], rcParams[k])
177+
k, self._rc_cache[k], dict.__getitem__(rcParams, k))
178178
# deepcopy may not be necessary, but feels more future-proof
179-
self._rc_cache[k] = copy.deepcopy(rcParams[k])
179+
self._rc_cache[k] = copy.deepcopy(
180+
dict.__getitem__(rcParams, k))
180181
_log.debug('RE-INIT\nold fontconfig: %s', self._fontconfig)
181182
self._reinit()
182183
_log.debug('fontconfig: %s', self._fontconfig)
@@ -209,7 +210,7 @@ def make_tex(self, tex, fontsize):
209210
unicode_preamble = "\n".join([
210211
r"\usepackage[utf8]{inputenc}",
211212
r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}",
212-
]) if rcParams["text.latex.unicode"] else ""
213+
]) if dict.__getitem__(rcParams, "text.latex.unicode") else ""
213214

214215
s = r"""
215216
\documentclass{article}
@@ -224,7 +225,7 @@ def make_tex(self, tex, fontsize):
224225
""" % (self._font_preamble, unicode_preamble, custom_preamble,
225226
fontsize, fontsize * 1.25, tex)
226227
with open(texfile, 'wb') as fh:
227-
if rcParams['text.latex.unicode']:
228+
if dict.__getitem__(rcParams, 'text.latex.unicode'):
228229
fh.write(s.encode('utf8'))
229230
else:
230231
try:
@@ -259,7 +260,7 @@ def make_tex_preview(self, tex, fontsize):
259260
unicode_preamble = "\n".join([
260261
r"\usepackage[utf8]{inputenc}",
261262
r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}",
262-
]) if rcParams["text.latex.unicode"] else ""
263+
]) if dict.__getitem__(rcParams, "text.latex.unicode") else ""
263264

264265
# newbox, setbox, immediate, etc. are used to find the box
265266
# extent of the rendered text.
@@ -285,7 +286,7 @@ def make_tex_preview(self, tex, fontsize):
285286
""" % (self._font_preamble, unicode_preamble, custom_preamble,
286287
fontsize, fontsize * 1.25, tex)
287288
with open(texfile, 'wb') as fh:
288-
if rcParams['text.latex.unicode']:
289+
if dict.__getitem__(rcParams, 'text.latex.unicode'):
289290
fh.write(s.encode('utf8'))
290291
else:
291292
try:

0 commit comments

Comments
 (0)