Skip to content

Commit d55bdde

Browse files
authored
Use PEP8 style method and function names from pyparsing (matplotlib#29745)
* Bump minimum pyparsing version * Use PEP8 method names from pyparsing * Add api note * Clean up pyparsing<3 code * Remove unused import * Clean up pyparsing import * Sort imports
1 parent f80038c commit d55bdde

File tree

8 files changed

+35
-37
lines changed

8 files changed

+35
-37
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
New minimum version of pyparsing
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
4+
The minimum required version of ``pyparsing`` has been updated from 2.3.1 to 3.0.0.

doc/install/dependencies.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ reference.
2929
* `NumPy <https://numpy.org>`_ (>= 1.23)
3030
* `packaging <https://pypi.org/project/packaging/>`_ (>= 20.0)
3131
* `Pillow <https://pillow.readthedocs.io/en/latest/>`_ (>= 9.0)
32-
* `pyparsing <https://pypi.org/project/pyparsing/>`_ (>= 2.3.1)
32+
* `pyparsing <https://pypi.org/project/pyparsing/>`_ (>= 3)
3333

3434

3535
.. _optional_dependencies:

environment.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dependencies:
2424
- pillow>=9
2525
- pkg-config
2626
- pygobject
27-
- pyparsing>=2.3.1
27+
- pyparsing>=3
2828
- pyqt
2929
- python>=3.10
3030
- python-dateutil>=2.1

lib/matplotlib/_fontconfig_pattern.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import re
1414

1515
from pyparsing import (
16-
Group, Optional, ParseException, Regex, StringEnd, Suppress, ZeroOrMore, oneOf)
16+
Group, Optional, ParseException, Regex, StringEnd, Suppress, ZeroOrMore, one_of)
1717

1818

1919
_family_punc = r'\\\-:,'
@@ -61,7 +61,7 @@ def comma_separated(elem):
6161
size = Regex(r"([0-9]+\.?[0-9]*|\.[0-9]+)")
6262
name = Regex(r"[a-z]+")
6363
value = Regex(fr"([^{_value_punc}]|(\\[{_value_punc}]))*")
64-
prop = Group((name + Suppress("=") + comma_separated(value)) | oneOf(_CONSTANTS))
64+
prop = Group((name + Suppress("=") + comma_separated(value)) | one_of(_CONSTANTS))
6565
return (
6666
Optional(comma_separated(family)("families"))
6767
+ Optional("-" + comma_separated(size)("sizes"))
@@ -82,11 +82,11 @@ def parse_fontconfig_pattern(pattern):
8282
"""
8383
parser = _make_fontconfig_parser()
8484
try:
85-
parse = parser.parseString(pattern)
85+
parse = parser.parse_string(pattern)
8686
except ParseException as err:
8787
# explain becomes a plain method on pyparsing 3 (err.explain(0)).
8888
raise ValueError("\n" + ParseException.explain(err, 0)) from None
89-
parser.resetCache()
89+
parser.reset_cache()
9090
props = {}
9191
if "families" in parse:
9292
props["family"] = [*map(_family_unescape, parse["families"])]

lib/matplotlib/_mathtext.py

+22-28
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919

2020
import numpy as np
2121
from pyparsing import (
22-
Empty, Forward, Literal, NotAny, oneOf, OneOrMore, Optional,
22+
Empty, Forward, Literal, Group, NotAny, OneOrMore, Optional,
2323
ParseBaseException, ParseException, ParseExpression, ParseFatalException,
2424
ParserElement, ParseResults, QuotedString, Regex, StringEnd, ZeroOrMore,
25-
pyparsing_common, Group)
25+
pyparsing_common, nested_expr, one_of)
2626

2727
import matplotlib as mpl
2828
from . import cbook
@@ -31,18 +31,12 @@
3131
from .font_manager import FontProperties, findfont, get_font
3232
from .ft2font import FT2Font, FT2Image, Kerning, LoadFlags
3333

34-
from packaging.version import parse as parse_version
35-
from pyparsing import __version__ as pyparsing_version
36-
if parse_version(pyparsing_version).major < 3:
37-
from pyparsing import nestedExpr as nested_expr
38-
else:
39-
from pyparsing import nested_expr
4034

4135
if T.TYPE_CHECKING:
4236
from collections.abc import Iterable
4337
from .ft2font import Glyph
4438

45-
ParserElement.enablePackrat()
39+
ParserElement.enable_packrat()
4640
_log = logging.getLogger("matplotlib.mathtext")
4741

4842

@@ -1745,7 +1739,7 @@ def Error(msg: str) -> ParserElement:
17451739
def raise_error(s: str, loc: int, toks: ParseResults) -> T.Any:
17461740
raise ParseFatalException(s, loc, msg)
17471741

1748-
return Empty().setParseAction(raise_error)
1742+
return Empty().set_parse_action(raise_error)
17491743

17501744

17511745
class ParserState:
@@ -1981,10 +1975,10 @@ def set_names_and_parse_actions() -> None:
19811975
# token, placeable, and auto_delim are forward references which
19821976
# are left without names to ensure useful error messages
19831977
if key not in ("token", "placeable", "auto_delim"):
1984-
val.setName(key)
1978+
val.set_name(key)
19851979
# Set actions
19861980
if hasattr(self, key):
1987-
val.setParseAction(getattr(self, key))
1981+
val.set_parse_action(getattr(self, key))
19881982

19891983
# Root definitions.
19901984

@@ -2007,24 +2001,24 @@ def csnames(group: str, names: Iterable[str]) -> Regex:
20072001
)
20082002

20092003
p.float_literal = Regex(r"[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)")
2010-
p.space = oneOf(self._space_widths)("space")
2004+
p.space = one_of(self._space_widths)("space")
20112005

2012-
p.style_literal = oneOf(
2006+
p.style_literal = one_of(
20132007
[str(e.value) for e in self._MathStyle])("style_literal")
20142008

20152009
p.symbol = Regex(
20162010
r"[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]"
20172011
r"|\\[%${}\[\]_|]"
20182012
+ r"|\\(?:{})(?![A-Za-z])".format(
20192013
"|".join(map(re.escape, tex2uni)))
2020-
)("sym").leaveWhitespace()
2014+
)("sym").leave_whitespace()
20212015
p.unknown_symbol = Regex(r"\\[A-Za-z]+")("name")
20222016

20232017
p.font = csnames("font", self._fontnames)
2024-
p.start_group = Optional(r"\math" + oneOf(self._fontnames)("font")) + "{"
2018+
p.start_group = Optional(r"\math" + one_of(self._fontnames)("font")) + "{"
20252019
p.end_group = Literal("}")
20262020

2027-
p.delim = oneOf(self._delims)
2021+
p.delim = one_of(self._delims)
20282022

20292023
# Mutually recursive definitions. (Minimizing the number of Forward
20302024
# elements is important for speed.)
@@ -2085,7 +2079,7 @@ def csnames(group: str, names: Iterable[str]) -> Regex:
20852079
r"\underset",
20862080
p.optional_group("annotation") + p.optional_group("body"))
20872081

2088-
p.text = cmd(r"\text", QuotedString('{', '\\', endQuoteChar="}"))
2082+
p.text = cmd(r"\text", QuotedString('{', '\\', end_quote_char="}"))
20892083

20902084
p.substack = cmd(r"\substack",
20912085
nested_expr(opener="{", closer="}",
@@ -2094,7 +2088,7 @@ def csnames(group: str, names: Iterable[str]) -> Regex:
20942088

20952089
p.subsuper = (
20962090
(Optional(p.placeable)("nucleus")
2097-
+ OneOrMore(oneOf(["_", "^"]) - p.placeable)("subsuper")
2091+
+ OneOrMore(one_of(["_", "^"]) - p.placeable)("subsuper")
20982092
+ Regex("'*")("apostrophes"))
20992093
| Regex("'+")("apostrophes")
21002094
| (p.named_placeable("nucleus") + Regex("'*")("apostrophes"))
@@ -2143,8 +2137,8 @@ def csnames(group: str, names: Iterable[str]) -> Regex:
21432137

21442138
# Leaf definitions.
21452139
p.math = OneOrMore(p.token)
2146-
p.math_string = QuotedString('$', '\\', unquoteResults=False)
2147-
p.non_math = Regex(r"(?:(?:\\[$])|[^$])*").leaveWhitespace()
2140+
p.math_string = QuotedString('$', '\\', unquote_results=False)
2141+
p.non_math = Regex(r"(?:(?:\\[$])|[^$])*").leave_whitespace()
21482142
p.main = (
21492143
p.non_math + ZeroOrMore(p.math_string + p.non_math) + StringEnd()
21502144
)
@@ -2167,15 +2161,15 @@ def parse(self, s: str, fonts_object: Fonts, fontsize: float, dpi: float) -> Hli
21672161
ParserState(fonts_object, 'default', 'rm', fontsize, dpi)]
21682162
self._em_width_cache: dict[tuple[str, float, float], float] = {}
21692163
try:
2170-
result = self._expression.parseString(s)
2164+
result = self._expression.parse_string(s)
21712165
except ParseBaseException as err:
21722166
# explain becomes a plain method on pyparsing 3 (err.explain(0)).
21732167
raise ValueError("\n" + ParseException.explain(err, 0)) from None
21742168
self._state_stack = []
21752169
self._in_subscript_or_superscript = False
21762170
# prevent operator spacing from leaking into a new expression
21772171
self._em_width_cache = {}
2178-
ParserElement.resetCache()
2172+
ParserElement.reset_cache()
21792173
return T.cast(Hlist, result[0]) # Known return type from main.
21802174

21812175
def get_state(self) -> ParserState:
@@ -2191,13 +2185,13 @@ def push_state(self) -> None:
21912185
self._state_stack.append(self.get_state().copy())
21922186

21932187
def main(self, toks: ParseResults) -> list[Hlist]:
2194-
return [Hlist(toks.asList())]
2188+
return [Hlist(toks.as_list())]
21952189

21962190
def math_string(self, toks: ParseResults) -> ParseResults:
2197-
return self._math_expression.parseString(toks[0][1:-1], parseAll=True)
2191+
return self._math_expression.parse_string(toks[0][1:-1], parse_all=True)
21982192

21992193
def math(self, toks: ParseResults) -> T.Any:
2200-
hlist = Hlist(toks.asList())
2194+
hlist = Hlist(toks.as_list())
22012195
self.pop_state()
22022196
return [hlist]
22032197

@@ -2210,7 +2204,7 @@ def non_math(self, toks: ParseResults) -> T.Any:
22102204
self.get_state().font = mpl.rcParams['mathtext.default']
22112205
return [hlist]
22122206

2213-
float_literal = staticmethod(pyparsing_common.convertToFloat)
2207+
float_literal = staticmethod(pyparsing_common.convert_to_float)
22142208

22152209
def text(self, toks: ParseResults) -> T.Any:
22162210
self.push_state()
@@ -2809,7 +2803,7 @@ def auto_delim(self, toks: ParseResults) -> T.Any:
28092803
return self._auto_sized_delimiter(
28102804
toks["left"],
28112805
# if "mid" in toks ... can be removed when requiring pyparsing 3.
2812-
toks["mid"].asList() if "mid" in toks else [],
2806+
toks["mid"].as_list() if "mid" in toks else [],
28132807
toks["right"])
28142808

28152809
def boldsymbol(self, toks: ParseResults) -> T.Any:

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ dependencies = [
3838
"numpy >= 1.23",
3939
"packaging >= 20.0",
4040
"pillow >= 9",
41-
"pyparsing >= 2.3.1",
41+
"pyparsing >= 3",
4242
"python-dateutil >= 2.7",
4343
]
4444
requires-python = ">=3.10"

requirements/testing/minver.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ meson==1.1.0
1010
numpy==1.23.0
1111
packaging==20.0
1212
pillow==9.0.1
13-
pyparsing==2.3.1
13+
pyparsing==3.0.0
1414
pytest==7.0.0
1515
python-dateutil==2.7
1616

requirements/testing/mypy.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fonttools>=4.22.0
2020
kiwisolver>=1.3.1
2121
packaging>=20.0
2222
pillow>=9
23-
pyparsing>=2.3.1
23+
pyparsing>=3
2424
python-dateutil>=2.7
2525
setuptools_scm>=7
2626
setuptools>=64

0 commit comments

Comments
 (0)