src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/DateTimeVisitor.py

Sat, 26 Apr 2025 12:34:32 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 26 Apr 2025 12:34:32 +0200
branch
eric7
changeset 11240
c48c615c04a3
parent 11150
73d80859079c
permissions
-rw-r--r--

MicroPython
- Added a configuration option to disable the support for the no longer produced Pimoroni Pico Wireless Pack.

11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2025 Detlev Offenbach <detlev@die-offenbachs.de>
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a node visitor to check datetime function calls.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import ast
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import AstUtilities
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 class DateTimeVisitor(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 Class implementing a node visitor to check datetime function calls.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 Note: This class is modeled after flake8_datetimez v20.10.0 checker.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 def __init__(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 self.violations = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 def __getFromKeywords(self, keywords, name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 Private method to get a keyword node given its name.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 @param keywords list of keyword argument nodes
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 @type list of ast.AST
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @param name name of the keyword node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @type str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @return keyword node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @rtype ast.AST
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 for keyword in keywords:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 if keyword.arg == name:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 return keyword
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 return None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 def visit_Call(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 Public method to handle a function call.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 Every datetime related function call is check for use of the naive
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 variant (i.e. use without TZ info).
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 # datetime.something()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 isDateTimeClass = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 and isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 and node.func.value.id == "datetime"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 # datetime.datetime.something()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 isDateTimeModuleAndClass = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 and isinstance(node.func.value, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 and node.func.value.attr == "datetime"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 and isinstance(node.func.value.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 and node.func.value.value.id == "datetime"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 if isDateTimeClass:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 if node.func.attr == "datetime":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 # datetime.datetime(2000, 1, 1, 0, 0, 0, 0,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 # datetime.timezone.utc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 isCase1 = len(node.args) >= 8 and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 AstUtilities.isNameConstant(node.args[7])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 and AstUtilities.getValue(node.args[7]) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 # datetime.datetime(2000, 1, 1, tzinfo=datetime.timezone.utc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 tzinfoKeyword = self.__getFromKeywords(node.keywords, "tzinfo")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 isCase2 = tzinfoKeyword is not None and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 AstUtilities.isNameConstant(tzinfoKeyword.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 and AstUtilities.getValue(tzinfoKeyword.value) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 if not (isCase1 or isCase2):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 self.violations.append((node, "M-301"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 elif node.func.attr == "time":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 # time(12, 10, 45, 0, datetime.timezone.utc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 isCase1 = len(node.args) >= 5 and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 AstUtilities.isNameConstant(node.args[4])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 and AstUtilities.getValue(node.args[4]) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 # datetime.time(12, 10, 45, tzinfo=datetime.timezone.utc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 tzinfoKeyword = self.__getFromKeywords(node.keywords, "tzinfo")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 isCase2 = tzinfoKeyword is not None and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 AstUtilities.isNameConstant(tzinfoKeyword.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 and AstUtilities.getValue(tzinfoKeyword.value) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 if not (isCase1 or isCase2):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 self.violations.append((node, "M-321"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 elif node.func.attr == "date":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 self.violations.append((node, "M-311"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 if isDateTimeClass or isDateTimeModuleAndClass:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 if node.func.attr == "today":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 self.violations.append((node, "M-302"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 elif node.func.attr == "utcnow":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 self.violations.append((node, "M-303"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 elif node.func.attr == "utcfromtimestamp":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 self.violations.append((node, "M-304"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 elif node.func.attr in "now":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 # datetime.now(UTC)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 isCase1 = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 len(node.args) == 1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 and len(node.keywords) == 0
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 AstUtilities.isNameConstant(node.args[0])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 and AstUtilities.getValue(node.args[0]) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 # datetime.now(tz=UTC)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 tzKeyword = self.__getFromKeywords(node.keywords, "tz")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 isCase2 = tzKeyword is not None and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 AstUtilities.isNameConstant(tzKeyword.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 and AstUtilities.getValue(tzKeyword.value) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 if not (isCase1 or isCase2):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 self.violations.append((node, "M-305"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 elif node.func.attr == "fromtimestamp":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 # datetime.fromtimestamp(1234, UTC)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 isCase1 = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 len(node.args) == 2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 and len(node.keywords) == 0
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 AstUtilities.isNameConstant(node.args[1])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 and AstUtilities.getValue(node.args[1]) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 # datetime.fromtimestamp(1234, tz=UTC)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 tzKeyword = self.__getFromKeywords(node.keywords, "tz")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 isCase2 = tzKeyword is not None and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 AstUtilities.isNameConstant(tzKeyword.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 and AstUtilities.getValue(tzKeyword.value) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 if not (isCase1 or isCase2):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 self.violations.append((node, "M-306"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 elif node.func.attr == "strptime":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 # datetime.strptime(...).replace(tzinfo=UTC)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 parent = getattr(node, "_dtCheckerParent", None)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 pparent = getattr(parent, "_dtCheckerParent", None)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 if not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 isinstance(parent, ast.Attribute) and parent.attr == "replace"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 ) or not isinstance(pparent, ast.Call):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 isCase1 = False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 tzinfoKeyword = self.__getFromKeywords(pparent.keywords, "tzinfo")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 isCase1 = tzinfoKeyword is not None and not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 AstUtilities.isNameConstant(tzinfoKeyword.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 and AstUtilities.getValue(tzinfoKeyword.value) is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 if not isCase1:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 self.violations.append((node, "M-307"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 elif node.func.attr == "fromordinal":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 self.violations.append((node, "M-308"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 # date.something()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 isDateClass = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 and isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 and node.func.value.id == "date"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 # datetime.date.something()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 isDateModuleAndClass = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 and isinstance(node.func.value, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 and node.func.value.attr == "date"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 and isinstance(node.func.value.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 and node.func.value.value.id == "datetime"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 if isDateClass or isDateModuleAndClass:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 if node.func.attr == "today":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 self.violations.append((node, "M-312"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 elif node.func.attr == "fromtimestamp":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 self.violations.append((node, "M-313"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 elif node.func.attr == "fromordinal":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 self.violations.append((node, "M-314"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 elif node.func.attr == "fromisoformat":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 self.violations.append((node, "M-315"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 #
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 # eflag: noqa = M-891

eric ide

mercurial