Skip to content

Commit f1440e0

Browse files
committed
Update for Python 3.12
1 parent ca41b98 commit f1440e0

File tree

4 files changed

+33
-13
lines changed

4 files changed

+33
-13
lines changed

formate/dynamic_quotes.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@
4646

4747
__all__ = ("dynamic_quotes", )
4848

49+
if sys.version_info >= (3, 12):
50+
StrOrConstant = ast.Constant
51+
else:
52+
StrOrConstant = Union[ast.Str, ast.Constant]
53+
4954

5055
class QuoteRewriter(Rewriter):
5156

@@ -83,7 +88,7 @@ def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
8388
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
8489
self.visit_definition(node)
8590

86-
def rewrite_quotes_for_node(self, node: Union[ast.Str, ast.Constant]) -> None:
91+
def rewrite_quotes_for_node(self, node: StrOrConstant) -> None:
8792
"""
8893
Mark the area for rewriting quotes in the given node.
8994
@@ -101,20 +106,26 @@ def rewrite_quotes_for_node(self, node: Union[ast.Str, ast.Constant]) -> None:
101106
# TODO: format docstring with triple quotes and correct indentation
102107
return
103108
else:
109+
110+
if sys.version_info >= (3, 12): # pragma: no cover (<py312)
111+
value = node.value
112+
else: # pragma: no cover (py312+)
113+
value = node.s
114+
104115
if string in {'""', "''"}:
105116
self.record_replacement(text_range, "''")
106117
elif not re.match("^[\"']", string):
107118
return
108-
elif len(node.s) == 1:
109-
self.record_replacement(text_range, repr(node.s))
119+
elif len(value) == 1:
120+
self.record_replacement(text_range, repr(value))
110121
elif '\n' in string:
111122
return
112-
elif '\n' in node.s or "\\n" in node.s:
123+
elif '\n' in value or "\\n" in value:
113124
return
114125
else:
115126
self.record_replacement(
116127
text_range,
117-
double_repr_string(node.s).translate(_surrogate_translator),
128+
double_repr_string(value).translate(_surrogate_translator),
118129
)
119130

120131

formate/ellipses.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,24 @@ def rewrite_ellipsis(
7272
if not isinstance(node.body[0], ast.Expr):
7373
return
7474

75-
if not isinstance(node.body[0].value, (ast.Constant, ast.Ellipsis)):
76-
return
75+
if sys.version_info >= (3, 12): # pragma: no cover (<py312)
76+
if not isinstance(node.body[0].value, ast.Constant):
77+
return
78+
if not node.body[0].value.value is Ellipsis:
79+
return
7780

78-
if sys.version_info < (3, 8): # pragma: no cover (py38+)
79-
if not isinstance(node.body[0].value, ast.Ellipsis):
81+
elif sys.version_info >= (3, 8): # pragma: no cover (<py38)
82+
if not isinstance(node.body[0].value, (ast.Constant, ast.Ellipsis)):
8083
return
8184

82-
else: # pragma: no cover (<py38)
8385
if not node.body[0].value.value is Ellipsis:
8486
return
87+
else: # pragma: no cover (py38+)
88+
if not isinstance(node.body[0].value, (ast.Constant, ast.Ellipsis)):
89+
return
90+
91+
if not isinstance(node.body[0].value, ast.Ellipsis):
92+
return
8593

8694
body_text_range = self.tokens.get_text_range(node)
8795
ellipsis_text_range = self.tokens.get_text_range(node.body[0])

formate/reformat_generics.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,11 @@ def visit_ClassDef(self, node: ast.ClassDef) -> None:
233233
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
234234
return None
235235

236-
def visit_NameConstant(self, node: ast.NameConstant) -> None:
237-
self.structure.append(node.value)
238-
239236
if sys.version_info[:2] < (3, 8): # pragma: no cover (py38+)
240237

238+
def visit_NameConstant(self, node: ast.NameConstant) -> None:
239+
self.structure.append(node.value)
240+
241241
def visit_Str(self, node: ast.Str) -> None:
242242
self.structure.append(f'"{node.s}"')
243243

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ filterwarnings =
232232
ignore:can't resolve package from __spec__ or __package__, falling back on __name__ and __path__:ImportWarning
233233
ignore:lib2to3 package is deprecated and may not be able to parse Python 3.10+:DeprecationWarning
234234
ignore:lib2to3 package is deprecated and may not be able to parse Python 3.10+:PendingDeprecationWarning
235+
always:ast.Str is deprecated and will be removed in Python 3.14; use ast.Constant instead:DeprecationWarning
235236
236237
[testenv:py312-dev-click{7,8.0,8.1}]
237238
setenv =

0 commit comments

Comments
 (0)