Skip to content

Commit b8c1d25

Browse files
authored
Merge pull request #273 from c0fec0de/fix/ruff
fix ruff issues
2 parents 9f5c783 + f8b89b1 commit b8c1d25

37 files changed

+374
-363
lines changed

pyproject.toml

+56-56
Original file line numberDiff line numberDiff line change
@@ -68,63 +68,63 @@ select = [
6868
"W",
6969
# pydocstyle
7070
"D",
71-
# # pep8-naming
72-
# "N",
73-
# # flake8-2020
74-
# "YTT",
75-
# # flake8-bugbear
76-
# "B",
77-
# # flake8-quotes
78-
# "Q",
79-
# # flake8-debugger
80-
# "T10",
81-
# # flake8-gettext
82-
# "INT",
83-
# # pylint
84-
# "PL",
85-
# # misc lints
86-
# "PIE",
87-
# # flake8-pyi
71+
# pep8-naming
72+
"N",
73+
# flake8-2020
74+
"YTT",
75+
# flake8-bugbear
76+
"B",
77+
# flake8-quotes
78+
"Q",
79+
# flake8-debugger
80+
"T10",
81+
# flake8-gettext
82+
"INT",
83+
# pylint
84+
"PL",
85+
# misc lints
86+
"PIE",
87+
# flake8-pyi
8888
# "PYI",
89-
# # tidy imports
90-
# "TID",
91-
# # implicit string concatenation
92-
# "ISC",
93-
# # type-checking imports
94-
# "TC",
95-
# # comprehensions
89+
# tidy imports
90+
"TID",
91+
# implicit string concatenation
92+
"ISC",
93+
# type-checking imports
94+
"TC",
95+
# comprehensions
9696
# "C",
97-
# "C4",
98-
# # pygrep-hooks
99-
# "PGH",
100-
# # Ruff-specific rules
101-
# "RUF",
102-
# # flake8-bandit: exec-builtin
103-
# "S102",
104-
# # numpy-legacy-random
105-
# "NPY002",
106-
# # Perflint
97+
"C4",
98+
# pygrep-hooks
99+
"PGH",
100+
# Ruff-specific rules
101+
"RUF",
102+
# flake8-bandit: exec-builtin
103+
"S102",
104+
# numpy-legacy-random
105+
"NPY002",
106+
# Perflint
107107
# "PERF",
108-
# # flynt
109-
# "FLY",
110-
# # flake8-logging-format
111-
# "G",
112-
# # pyupgrade
113-
# "UP",
114-
# # annotation
115-
# # "ANN"
116-
# # bandit
108+
# flynt
109+
"FLY",
110+
# flake8-logging-format
111+
"G",
112+
# pyupgrade
113+
"UP",
114+
# annotation
115+
# "ANN"
116+
# bandit
117117
# "S",
118-
# # Argument
119-
# # "ARG",
120-
# # Pathlib
118+
# Argument
119+
# "ARG",
120+
# Pathlib
121121
# "PTH",
122-
# # Simplify
123-
# # "SIM",
124-
# # Return
125-
# "RET",
126-
# # Raise
127-
# "RSE",
122+
# Simplify
123+
# "SIM",
124+
# Return
125+
"RET",
126+
# Raise
127+
"RSE",
128128
]
129129
ignore = [
130130
# too-many-arguments
@@ -150,6 +150,8 @@ ignore = [
150150
'TC001',
151151
# Indent of doctest
152152
'D412',
153+
# unused loop
154+
'B007',
153155
]
154156
[tool.ruff.lint.per-file-ignores]
155157
"tests/*" = [
@@ -164,6 +166,8 @@ ignore = [
164166
"D103",
165167
# Unused variables
166168
"F841",
169+
# complexity
170+
'PLR0915',
167171
]
168172

169173
[tool.ruff.lint.pydocstyle]
@@ -195,7 +199,3 @@ exclude_lines = [
195199
[tool.mypy]
196200
disable_error_code = "misc"
197201
ignore_missing_imports = true
198-
199-
[[tool.mypy.overrides]]
200-
module = "tests.*"
201-
allow_untyped_defs = true

src/anytree/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727
"ContStyle",
2828
"CountError",
2929
"DoubleStyle",
30+
"LevelGroupOrderIter",
3031
"LevelOrderGroupIter",
3132
"LevelOrderIter",
3233
"LightNodeMixin",
33-
"LevelGroupOrderIter",
3434
"LoopError",
3535
"Node",
3636
"NodeMixin",

src/anytree/config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
import os
44

55
# Global Option which enables all internal assertions.
6-
ASSERTIONS = bool(int(os.environ.get("ANYTREE_ASSERTIONS", 0)))
6+
ASSERTIONS = bool(int(os.environ.get("ANYTREE_ASSERTIONS", "0")))

src/anytree/dotexport.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ class RenderTreeGraph(DotExporter):
77
def __init__(self, *args, **kwargs):
88
"""Legacy. Use :any:`anytree.exporter.DotExporter` instead."""
99
warnings.warn(
10-
("anytree.RenderTreeGraph has moved. Use anytree.exporter.DotExporter instead"), DeprecationWarning
10+
("anytree.RenderTreeGraph has moved. Use anytree.exporter.DotExporter instead"),
11+
DeprecationWarning,
12+
stacklevel=2,
1113
)
12-
super(RenderTreeGraph, self).__init__(*args, **kwargs)
14+
super().__init__(*args, **kwargs)

src/anytree/exporter/__init__.py

+12-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
"""Exporter."""
22

3-
from .dictexporter import DictExporter # noqa
4-
from .dotexporter import DotExporter # noqa
5-
from .dotexporter import UniqueDotExporter # noqa
6-
from .jsonexporter import JsonExporter # noqa
7-
from .mermaidexporter import MermaidExporter # noqa
3+
from .dictexporter import DictExporter
4+
from .dotexporter import DotExporter, UniqueDotExporter
5+
from .jsonexporter import JsonExporter
6+
from .mermaidexporter import MermaidExporter
7+
8+
__all__ = [
9+
"DictExporter",
10+
"DotExporter",
11+
"JsonExporter",
12+
"MermaidExporter",
13+
"UniqueDotExporter",
14+
]

src/anytree/exporter/dotexporter.py

+13-22
Original file line numberDiff line numberDiff line change
@@ -223,26 +223,23 @@ def _default_filter(node):
223223

224224
def __iter(self, indent, nodenamefunc, nodeattrfunc, edgeattrfunc, edgetypefunc, filter_):
225225
yield f"{self.graph} {self.name} {{"
226-
for option in self.__iter_options(indent):
227-
yield option
228-
for node in self.__iter_nodes(indent, nodenamefunc, nodeattrfunc, filter_):
229-
yield node
230-
for edge in self.__iter_edges(indent, nodenamefunc, edgeattrfunc, edgetypefunc, filter_):
231-
yield edge
226+
yield from self.__iter_options(indent)
227+
yield from self.__iter_nodes(indent, nodenamefunc, nodeattrfunc, filter_)
228+
yield from self.__iter_edges(indent, nodenamefunc, edgeattrfunc, edgetypefunc, filter_)
232229
yield "}"
233230

234231
def __iter_options(self, indent):
235232
options = self.options
236233
if options:
237234
for option in options:
238-
yield "%s%s" % (indent, option)
235+
yield f"{indent}{option}"
239236

240237
def __iter_nodes(self, indent, nodenamefunc, nodeattrfunc, filter_):
241238
for node in PreOrderIter(self.node, filter_=filter_, stop=self.stop, maxlevel=self.maxlevel):
242239
nodename = nodenamefunc(node)
243240
nodeattr = nodeattrfunc(node)
244-
nodeattr = " [%s]" % nodeattr if nodeattr is not None else ""
245-
yield '%s"%s"%s;' % (indent, DotExporter.esc(nodename), nodeattr)
241+
nodeattr = f" [{nodeattr}]" if nodeattr is not None else ""
242+
yield f'{indent}"{DotExporter.esc(nodename)}"{nodeattr};'
246243

247244
def __iter_edges(self, indent, nodenamefunc, edgeattrfunc, edgetypefunc, filter_):
248245
maxlevel = self.maxlevel - 1 if self.maxlevel else None
@@ -254,14 +251,8 @@ def __iter_edges(self, indent, nodenamefunc, edgeattrfunc, edgetypefunc, filter_
254251
childname = nodenamefunc(child)
255252
edgeattr = edgeattrfunc(node, child)
256253
edgetype = edgetypefunc(node, child)
257-
edgeattr = " [%s]" % edgeattr if edgeattr is not None else ""
258-
yield '%s"%s" %s "%s"%s;' % (
259-
indent,
260-
DotExporter.esc(nodename),
261-
edgetype,
262-
DotExporter.esc(childname),
263-
edgeattr,
264-
)
254+
edgeattr = f" [{edgeattr}]" if edgeattr is not None else ""
255+
yield f'{indent}"{DotExporter.esc(nodename)}" {edgetype} "{DotExporter.esc(childname)}"{edgeattr};'
265256

266257
def to_dotfile(self, filename):
267258
"""
@@ -288,7 +279,7 @@ def to_dotfile(self, filename):
288279
"""
289280
with codecs.open(filename, "w", "utf-8") as file:
290281
for line in self:
291-
file.write("%s\n" % line)
282+
file.write(f"{line}\n")
292283

293284
def to_picture(self, filename):
294285
"""
@@ -302,7 +293,7 @@ def to_picture(self, filename):
302293
with NamedTemporaryFile("wb", delete=False) as dotfile:
303294
dotfilename = dotfile.name
304295
for line in self:
305-
dotfile.write(("%s\n" % line).encode("utf-8"))
296+
dotfile.write((f"{line}\n").encode())
306297
dotfile.flush()
307298
cmd = ["dot", dotfilename, "-T", fileformat, "-o", filename]
308299
check_call(cmd)
@@ -315,7 +306,7 @@ def to_picture(self, filename):
315306
@staticmethod
316307
def esc(value):
317308
"""Escape Strings."""
318-
return _RE_ESC.sub(lambda m: r"\%s" % m.group(0), six.text_type(value))
309+
return _RE_ESC.sub(lambda m: rf"\{m.group(0)}", six.text_type(value))
319310

320311

321312
class UniqueDotExporter(DotExporter):
@@ -438,7 +429,7 @@ def __init__(
438429
stop=None,
439430
maxlevel=None,
440431
):
441-
super(UniqueDotExporter, self).__init__(
432+
super().__init__(
442433
node,
443434
graph=graph,
444435
name=name,
@@ -466,4 +457,4 @@ def _default_nodenamefunc(self, node):
466457

467458
@staticmethod
468459
def _default_nodeattrfunc(node):
469-
return 'label="%s"' % (node.name,)
460+
return f'label="{node.name}"'

src/anytree/exporter/mermaidexporter.py

+10-19
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,12 @@ def _default_nodenamefunc(self, node):
166166
num = self.__node_ids[node_id]
167167
except KeyError:
168168
num = self.__node_ids[node_id] = next(self.__node_counter)
169-
return "N%d" % (num,)
169+
return f"N{num}"
170170

171171
@staticmethod
172172
def _default_nodefunc(node):
173173
# pylint: disable=W0613
174-
return '["%s"]' % (MermaidExporter.esc(node.name),)
174+
return f'["{MermaidExporter.esc(node.name)}"]'
175175

176176
@staticmethod
177177
def _default_edgefunc(node, child):
@@ -180,24 +180,20 @@ def _default_edgefunc(node, child):
180180

181181
def __iter(self, indent, nodenamefunc, nodefunc, edgefunc, filter_, stop):
182182
yield f"{self.graph} {self.name}"
183-
for option in self.__iter_options(indent):
184-
yield option
185-
for node in self.__iter_nodes(indent, nodenamefunc, nodefunc, filter_, stop):
186-
yield node
187-
for edge in self.__iter_edges(indent, nodenamefunc, edgefunc, filter_, stop):
188-
yield edge
183+
yield from self.__iter_options(indent)
184+
yield from self.__iter_nodes(indent, nodenamefunc, nodefunc, filter_, stop)
185+
yield from self.__iter_edges(indent, nodenamefunc, edgefunc, filter_, stop)
189186

190187
def __iter_options(self, indent):
191188
options = self.options
192189
if options:
193190
for option in options:
194-
yield "%s%s" % (indent, option)
191+
yield f"{indent}{option}"
195192

196193
def __iter_nodes(self, indent, nodenamefunc, nodefunc, filter_, stop):
197194
for node in PreOrderIter(self.node, filter_=filter_, stop=stop, maxlevel=self.maxlevel):
198195
nodename = nodenamefunc(node)
199-
node = nodefunc(node)
200-
yield "%s%s%s" % (indent, nodename, node)
196+
yield f"{indent}{nodename}{nodefunc(node)}"
201197

202198
def __iter_edges(self, indent, nodenamefunc, edgefunc, filter_, stop):
203199
maxlevel = self.maxlevel - 1 if self.maxlevel else None
@@ -207,12 +203,7 @@ def __iter_edges(self, indent, nodenamefunc, edgefunc, filter_, stop):
207203
if filter_(child) and not stop(child):
208204
childname = nodenamefunc(child)
209205
edge = edgefunc(node, child)
210-
yield "%s%s%s%s" % (
211-
indent,
212-
nodename,
213-
edge,
214-
childname,
215-
)
206+
yield f"{indent}{nodename}{edge}{childname}"
216207

217208
def to_file(self, filename):
218209
"""
@@ -235,10 +226,10 @@ def to_file(self, filename):
235226
with codecs.open(filename, "w", "utf-8") as file:
236227
file.write("```mermaid\n")
237228
for line in self:
238-
file.write("%s\n" % line)
229+
file.write(f"{line}\n")
239230
file.write("```")
240231

241232
@staticmethod
242233
def esc(value):
243234
"""Escape Strings."""
244-
return _RE_ESC.sub(lambda m: r"\%s" % m.group(0), six.text_type(value))
235+
return _RE_ESC.sub(lambda m: rf"\{m.group(0)}", six.text_type(value))

src/anytree/importer/__init__.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
"""Importer."""
22

3-
from .dictimporter import DictImporter # noqa
4-
from .jsonimporter import JsonImporter # noqa
3+
from .dictimporter import DictImporter
4+
from .jsonimporter import JsonImporter
5+
6+
__all__ = [
7+
"DictImporter",
8+
"JsonImporter",
9+
]

src/anytree/importer/dictimporter.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from anytree import AnyNode
2-
3-
from ..config import ASSERTIONS
2+
from anytree.config import ASSERTIONS
43

54

65
class DictImporter:

src/anytree/iterators/__init__.py

+15-6
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,18 @@
88
* :any:`ZigZagGroupIter`: iterate over tree using level-order strategy returning group for every level
99
"""
1010

11-
from .abstractiter import AbstractIter # noqa
12-
from .levelordergroupiter import LevelOrderGroupIter # noqa
13-
from .levelorderiter import LevelOrderIter # noqa
14-
from .postorderiter import PostOrderIter # noqa
15-
from .preorderiter import PreOrderIter # noqa
16-
from .zigzaggroupiter import ZigZagGroupIter # noqa
11+
from .abstractiter import AbstractIter
12+
from .levelordergroupiter import LevelOrderGroupIter
13+
from .levelorderiter import LevelOrderIter
14+
from .postorderiter import PostOrderIter
15+
from .preorderiter import PreOrderIter
16+
from .zigzaggroupiter import ZigZagGroupIter
17+
18+
__all__ = [
19+
"AbstractIter",
20+
"LevelOrderGroupIter",
21+
"LevelOrderIter",
22+
"PostOrderIter",
23+
"PreOrderIter",
24+
"ZigZagGroupIter",
25+
]

0 commit comments

Comments
 (0)