ParserSyntaxError when a module have a "from django.utils import timezone" import
See original GitHub issueDescribe the bug
I’m migrating a medium-sized codebase, and I found this strange behavior: if the code has a “from django.utils import timezone
” import, a ParserSyntaxError is raised
$ pre-commit run -a
djcodemod................................................................Failed
- hook id: djcodemod
- exit code: 1
Running codemods: AssignmentTagTransformer, CookieDateTransformer, FixedOffsetTransformer, FloatRangeFormFieldTransformer, FloatRangeModelFieldTransformer, InlineHasAddPermissionsTransformer, ModelsPermalinkTransformer, OnDeleteTransformer, QuerySetPaginatorTransformer, SignalDisconnectWeakTransformer, URLResolversTransformer
Executing codemod...
Finished codemodding 62 files!
- Transformed 62 files successfully.
- Skipped 0 files.
- Failed to codemod 0 files.
- 0 warnings were generated.
Running codemods: AssignmentTagTransformer, CookieDateTransformer, FixedOffsetTransformer, FloatRangeFormFieldTransformer, FloatRangeModelFieldTransformer, InlineHasAddPermissionsTransformer, ModelsPermalinkTransformer, OnDeleteTransformer, QuerySetPaginatorTransformer, SignalDisconnectWeakTransformer, URLResolversTransformer
Executing codemod...
Codemodding /home/luzfcb/projects/big_project/foobar/tests/test_managers.py
Traceback (most recent call last):
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_parser/base_parser.py", line 152, in _add_token
plan = stack[-1].dfa.transitions[transition]
KeyError: ReservedString(import)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/codemod/_cli.py", line 295, in _execute_transform
output_tree = transformer.transform_module(input_tree)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/codemod/_command.py", line 88, in transform_module
tree = self._instantiate_and_run(transform, tree)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/codemod/_command.py", line 58, in _instantiate_and_run
return inst.transform_module(tree)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/codemod/_codemod.py", line 108, in transform_module
return self.transform_module_impl(tree_with_metadata)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/codemod/_visitor.py", line 32, in transform_module_impl
return tree.visit(self)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_nodes/module.py", line 91, in visit
result = super(Module, self).visit(visitor)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_nodes/base.py", line 235, in visit
leave_result = visitor.on_leave(self, with_updated_children)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/matchers/_visitors.py", line 512, in on_leave
retval = CSTTransformer.on_leave(self, original_node, updated_node)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_visitors.py", line 72, in on_leave
updated_node = leave_func(original_node, updated_node)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/codemod/visitors/_add_imports.py", line 393, in leave_Module
*[
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/codemod/visitors/_add_imports.py", line 394, in <listcomp>
parse_statement(
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_parser/entrypoints.py", line 100, in parse_statement
result = _parse(
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_parser/entrypoints.py", line 51, in _parse
result = parser.parse()
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_parser/base_parser.py", line 111, in parse
self._add_token(token)
File "/home/luzfcb/.cache/pre-commit/repof_bg4wfe/py_env-python3/lib/python3.9/site-packages/libcst/_parser/base_parser.py", line 187, in _add_token
raise ParserSyntaxError(
libcst._exceptions.ParserSyntaxError: Syntax Error @ 1:7.
Incomplete input. Encountered 'import', but expected '.', '...', or 'NAME'.
from import datetime
^
Failed to codemod /home/luzfcb/projects/big_project/foobar/tests/test_managers.py
To Reproduce
pipx install "django-codemod==1.5.5"
echo "from django.utils import timezone" > foobar.py
djcodemod run --deprecated-in 1.9 --deprecated-in 1.10 --deprecated-in 1.11 --deprecated-in 2.0 --deprecated-in 2.1 --deprecated-in 2.2 foobar.py
Additional context
Issue Analytics
- State:
- Created 2 years ago
- Comments:5 (4 by maintainers)
Top Results From Across the Web
ImportError : cannot import name timezone pythonanywhere
I am attempting to use collectstatic in the bash console to get my CSS running on a django app on pythonanywhere. Unfortunately, I...
Read more >Time zones - Django documentation
Many countries have a system of DST, where clocks are moved forward in spring and backward in ... from django.utils import timezone now...
Read more >Replace timezone code by Django's built in solution · Issue #35
Model Bakery has a module to deal with timezones that was implemented ... from django.utils import timezone import datetime def now(): ...
Read more >django-timezone-utils - PyPI
Time Zone Utilities for Django Models. ... pip install django-timezone-utils ... from datetime import datetime from timezone_utils.fields import ...
Read more >Time Zones in Pytz & Django - Tommi Kaikkonen
Before we had universally synchronized times and timezones, local time was ... from datetime import datetime # We receive an interesting time from...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
The problem should no longer happen in 1.5.6, I’ve disabled the problematic feature for now. I’ll try to fix it properly later, not really have time at the moment…
Yes I think I’ve nailed down the problem to this section, it’s just wrong (it replaces the import for the parent module, even if the thing being codemodded isn’t used in the file):
https://github.com/browniebroke/django-codemod/blob/7942036744d3b1ef28123bda9e4a8e7fbc88ddb4/django_codemod/visitors/base.py#L167-L175
I’ll probably disable this feature and push a new release (hopefully tomorrow) until I can make a fix, this is probably breaking a lot of other things.