def _fix_file(filename: str, args: argparse.Namespace) -> int: if filename == '-': contents_bytes = sys.stdin.buffer.read() else: with open(filename, 'rb') as fb: contents_bytes = fb.read() try: contents_text_orig = contents_text = contents_bytes.decode() except UnicodeDecodeError: print(f'{filename} is non-utf-8 (not supported)') return 1 contents_text = _fix_plugins( contents_text, settings=Settings( min_version=args.min_version, keep_percent_format=args.keep_percent_format, ), ) contents_text = _fix_tokens(contents_text, min_version=args.min_version) if args.min_version >= (3, 6): contents_text = _fix_py36_plus(contents_text) if filename == '-': print(contents_text, end='') elif contents_text != contents_text_orig: print(f'Rewriting {filename}', file=sys.stderr) with open(filename, 'w', encoding='UTF-8', newline='') as f: f.write(contents_text) if args.exit_zero_even_if_changed: return 0 else: return contents_text != contents_text_orig
def test_noop_keep_runtime_typing(): s = '''\ from __future__ import annotations from typing import Union def f(x: Union[int, str]) -> None: ... ''' settings = Settings(min_version=(3,), keep_runtime_typing=True) assert _fix_plugins(s, settings=settings) == s
def test_mock_noop_keep_mock(): """This would've been rewritten if keep_mock were False""" s = ( 'from mock import patch\n' '\n' 'patch("func")' ) settings = Settings(min_version=(3,), keep_mock=True) assert _fix_plugins(s, settings=settings) == s
def test_fix_typing_pep563_posonlyargs(): s = ( 'from __future__ import annotations\n' 'def foo(var0, /, var1: "MyClass") -> "MyClass":\n' ' x: "MyClass"\n' ) expected = ( 'from __future__ import annotations\n' 'def foo(var0, /, var1: MyClass) -> MyClass:\n' ' x: MyClass\n' ) ret = _fix_plugins(s, settings=Settings(min_version=(3, 8))) assert ret == expected
def test_keep_runtime_typing_ignored_in_py310(): s = '''\ from __future__ import annotations from typing import Union def f(x: Union[int, str]) -> None: ... ''' expected = '''\ from __future__ import annotations from typing import Union def f(x: int | str) -> None: ... ''' settings = Settings(min_version=(3, 10), keep_runtime_typing=True) assert _fix_plugins(s, settings=settings) == expected
def test_keep_runtime_typing_ignored_in_py39(): s = '''\ from __future__ import annotations from typing import List def f(x: List[str]) -> None: ... ''' expected = '''\ from __future__ import annotations from typing import List def f(x: list[str]) -> None: ... ''' settings = Settings(min_version=(3, 9), keep_runtime_typing=True) assert _fix_plugins(s, settings=settings) == expected
def test_fix_maxsize_none_decorators(s, expected): ret = _fix_plugins(s, settings=Settings(min_version=(3, 9))) assert ret == expected
def test_fix_universal_newlines_to_text(s, expected): ret = _fix_plugins(s, settings=Settings(min_version=(3, 7))) assert ret == expected
def test_fix_maxsize_none_decorators_noop(s, min_version): assert _fix_plugins(s, settings=Settings(min_version=min_version)) == s
def test_fix_generic_types_noop(s, version): assert _fix_plugins(s, settings=Settings(min_version=version)) == s
def test_fix_universal_newlines_to_text_noop(s, version): assert _fix_plugins(s, settings=Settings(min_version=version)) == s
def test_fix_unpack_argument_list_comp_noop(s, version): assert _fix_plugins(s, settings=Settings(min_version=version)) == s
def test_fix_is_compare_to_literal_noop(s): assert _fix_plugins(s, settings=Settings()) == s
def test_fix_sets_noop(s): assert _fix_plugins(s, settings=Settings()) == s
def test_fix_pep584_noop(s, version): assert _fix_plugins(s, settings=Settings(min_version=version)) == s
def test_fix_pep604_types(s, expected): assert _fix_plugins(s, settings=Settings(min_version=(3, 10))) == expected
def test_fix_generic_types_future_annotations(s, expected): assert _fix_plugins(s, settings=Settings(min_version=(3,))) == expected
def test_fix_typing_text(s, expected): ret = _fix_plugins(s, settings=Settings(min_version=(3, ))) assert ret == expected
def test_fix_typing_text_noop(s, version): assert _fix_plugins(s, settings=Settings(min_version=version)) == s
def test_fix_generic_types(s, expected): ret = _fix_plugins(s, settings=Settings(min_version=(3, 9))) assert ret == expected
def test_fix_no_arg_decorators_noop(s, min_version): assert _fix_plugins(s, settings=Settings(min_version=min_version)) == s
def test_sets_generators_trailing_commas(s, expected): ret = _fix_plugins(s, settings=Settings()) assert ret == expected
def test_fix_no_arg_decorators(s, expected): ret = _fix_plugins(s, settings=Settings(min_version=(3, 8))) assert ret == expected
def test_fix_py3_only_code(s, expected): ret = _fix_plugins(s, settings=Settings(min_version=(3,))) assert ret == expected
def test_fix_unpack_argument_list_comp(s, expected): ret = _fix_plugins(s, settings=Settings((3, ))) assert ret == expected
def test_fix_py2_block_noop(s): assert _fix_plugins(s, settings=Settings(min_version=(3,))) == s
def test_fix_is_compare_to_literal(s, expected): ret = _fix_plugins(s, settings=Settings()) assert ret == expected
def test_sets(s, expected): ret = _fix_plugins(s, settings=Settings()) assert ret == expected
def test_fix_pep584(s, expected): assert _fix_plugins(s, settings=Settings(min_version=(3, 9))) == expected
def test_fix_py2_blocks(s, expected): ret = _fix_plugins(s, settings=Settings(min_version=(3,))) assert ret == expected