Skip to content

Commit 3879369

Browse files
authored
Merge pull request #764 from rominf/rominf/datetime-utc-alias
rewrite to datetime.UTC
2 parents 28db01a + 6bc3509 commit 3879369

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -694,3 +694,16 @@ Availability:
694694
-def f(x: 'queue.Queue[int]') -> C:
695695
+def f(x: queue.Queue[int]) -> C:
696696
```
697+
698+
699+
### use `datetime.UTC` alias
700+
701+
Availability:
702+
- `--py311-plus` is passed on the commandline.
703+
704+
```diff
705+
import datetime
706+
707+
-datetime.timezone.utc
708+
+datetime.UTC
709+
```
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from __future__ import annotations
2+
3+
import ast
4+
import functools
5+
from typing import Iterable
6+
7+
from tokenize_rt import Offset
8+
9+
from pyupgrade._ast_helpers import ast_to_offset
10+
from pyupgrade._data import register
11+
from pyupgrade._data import State
12+
from pyupgrade._data import TokenFunc
13+
from pyupgrade._token_helpers import replace_name
14+
15+
16+
@register(ast.Attribute)
17+
def visit_Attribute(
18+
state: State,
19+
node: ast.Attribute,
20+
parent: ast.AST,
21+
) -> Iterable[tuple[Offset, TokenFunc]]:
22+
if (
23+
state.settings.min_version >= (3, 11) and
24+
node.attr == 'utc' and
25+
isinstance(node.value, ast.Attribute) and
26+
node.value.attr == 'timezone' and
27+
isinstance(node.value.value, ast.Name) and
28+
node.value.value.id == 'datetime'
29+
):
30+
func = functools.partial(
31+
replace_name,
32+
name='utc',
33+
new='datetime.UTC',
34+
)
35+
yield ast_to_offset(node), func
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
5+
from pyupgrade._data import Settings
6+
from pyupgrade._main import _fix_plugins
7+
8+
9+
@pytest.mark.parametrize(
10+
('s',),
11+
(
12+
pytest.param(
13+
'import datetime\n'
14+
'print(datetime.timezone(-1))',
15+
16+
id='not rewriting timezone object to alias',
17+
),
18+
),
19+
)
20+
def test_fix_datetime_utc_alias_noop(s):
21+
assert _fix_plugins(s, settings=Settings(min_version=(3,))) == s
22+
assert _fix_plugins(s, settings=Settings(min_version=(3, 11))) == s
23+
24+
25+
@pytest.mark.parametrize(
26+
('s', 'expected'),
27+
(
28+
pytest.param(
29+
'import datetime\n'
30+
'print(datetime.timezone.utc)',
31+
32+
'import datetime\n'
33+
'print(datetime.UTC)',
34+
35+
id='rewriting to alias',
36+
),
37+
),
38+
)
39+
def test_fix_datetime_utc_alias(s, expected):
40+
assert _fix_plugins(s, settings=Settings(min_version=(3,))) == s
41+
assert _fix_plugins(s, settings=Settings(min_version=(3, 11))) == expected

0 commit comments

Comments
 (0)