def test_union_pattern_or_match(s):
    with version_ctx(Version(3, 5, 0)):
        assert results(s) == {
            '2:13: TYP003 Union[Match, ...] or Union[Pattern, ...] '
            'must be quoted in <3.5.2',
        }

    with version_ctx(Version(3, 5, 2)):
        assert not results(s)
def test_namedtuple_defaults():
    s = (
        'from typing import NamedTuple\n'
        'class NT(NamedTuple):\n'
        '    x: int = 5\n'
    )
    with version_ctx(Version(3, 6, 0)):
        assert results(s) == {
            '3:4: TYP005 NamedTuple does not support defaults in 3.6.0',
        }

    with version_ctx(Version(3, 6, 1)):
        assert results(s) == set()
def test_namedtuple_methods():
    s = (
        'from typing import NamedTuple\n'
        'class NT(NamedTuple):\n'
        '    x: int\n'
        '    def f(self): return self.x + 2\n'
    )
    with version_ctx(Version(3, 6, 0)):
        assert results(s) == {
            '4:4: TYP004 NamedTuple does not support methods in 3.6.0',
        }

    with version_ctx(Version(3, 6, 1)):
        assert results(s) == set()
def test_option_parsing_python_requires_more_complicated(tmpdir):
    tmpdir.join('setup.cfg').write(
        '[options]\n'
        'python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*',
    )
    Plugin.parse_options(mock.Mock(min_python_version='3.6.0'))
    assert Plugin._min_python_version == Version(3, 5, 0)
def test_guard_by_type_checking():
    with version_ctx(Version(3, 7, 0)):
        ret = results(
            'from typing import TYPE_CHECKING\n'
            'if TYPE_CHECKING:\n'
            '    from typing import DEFINITELY_WRONG\n',
        )
        assert ret == set()
def test_missing_overload_define():
    with version_ctx(Version(3, 5, 0)):
        ret = results('from typing import overload')
        assert ret == {
            '1:0: TYP002 @overload is broken in <3.5.2, '
            'add `if sys.version_info < (3, 5, 2): def overload(f): return f`',
        }
        assert not results(
            'import sys\n'
            'from typing import overload\n'
            'if sys.version_info < (3, 5, 2):\n'
            '    def overload(f):\n'
            '        return f\n'
            '@overload\n'
            'def f(x): pass\n',
        )
    with version_ctx(Version(3, 5, 2)):
        assert not results('from typing import overload')
def test_attribute():
    s = (
        'import typing\n\n'
        'def f() -> typing.Type:\n'
        '    pass\n'
    )
    with version_ctx(Version(3, 5, 0)):
        assert results(s) == {
            '3:11: TYP006 guard `typing` attribute by quoting: Type '
            '(not in 3.5.0, 3.5.1)',
        }
def test_missing_guard_3_5_1():
    with version_ctx(Version(3, 5, 1)):
        assert results('from typing import Type') == {
            '1:0: TYP001 guard import by `if False:  # TYPE_CHECKING`: Type '
            '(not in 3.5.1)',
        }
def test_option_parsing_minimum_version():
    Plugin.parse_options(mock.Mock(min_python_version='3.4'))
    assert Plugin._min_python_version == Version(3, 5, 0)
def test_option_parsing_python_requires_setup_cfg(tmpdir):
    tmpdir.join('setup.cfg').write('[options]\npython_requires = >=3.6')
    Plugin.parse_options(mock.Mock(min_python_version='3.5.0'))
    assert Plugin._min_python_version == Version(3, 6, 0)
def test_option_parsing():
    mgr = OptionManager('flake8', '0')
    Plugin.add_options(mgr)
    options, _ = mgr.parse_args(['--min-python-version', '3.6.2'])
    Plugin.parse_options(options)
    assert Plugin._min_python_version == Version(3, 6, 2)