Repository navigation
Expand file tree
/
Copy pathfix_deprecated_abstractproperty.py
More file actions
63 lines (56 loc) · 2.24 KB
/
Copy pathfix_deprecated_abstractproperty.py
File metadata and controls
63 lines (56 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import libcst as cst
from codemodder.codemods.utils_mixin import NameResolutionMixin
from core_codemods.api import Metadata, Reference, ReviewGuidance, SimpleCodemod
class FixDeprecatedAbstractproperty(SimpleCodemod, NameResolutionMixin):
metadata = Metadata(
name="fix-deprecated-abstractproperty",
summary="Replace Deprecated `abc` Decorators",
review_guidance=ReviewGuidance.MERGE_WITHOUT_REVIEW,
references=[
Reference(
url="https://docs.python.org/3/library/abc.html#abc.abstractproperty"
),
Reference(
url="https://docs.python.org/3/library/abc.html#abc.abstractclassmethod"
),
Reference(
url="https://docs.python.org/3/library/abc.html#abc.abstractstaticmethod"
),
],
)
change_description = "Replace deprecated `abc` decorator."
DEPRECATED_TO_NEW = {
"abc.abstractproperty": "property",
"abc.abstractclassmethod": "classmethod",
"abc.abstractstaticmethod": "staticmethod",
}
def leave_Decorator(
self, original_node: cst.Decorator, updated_node: cst.Decorator
):
if not self.filter_by_path_includes_or_excludes(
self.node_position(original_node)
):
return updated_node
if (
base_name := self.find_base_name(original_node.decorator)
) in self.DEPRECATED_TO_NEW:
self.add_needed_import("abc")
self.remove_unused_import(original_node)
self.report_change(original_node)
return cst.FlattenSentinel(
[
cst.Decorator(
decorator=cst.Name(value=self._new_decorator(base_name)),
trailing_whitespace=updated_node.trailing_whitespace,
),
cst.Decorator(
decorator=cst.Attribute(
value=cst.Name(value="abc"),
attr=cst.Name(value="abstractmethod"),
)
),
]
)
return original_node
def _new_decorator(self, old_name: str) -> str:
return self.DEPRECATED_TO_NEW[old_name]