Drop support for EOL Python 3.6
This commit is contained in:
parent
b9663fed6f
commit
1fd3601caa
|
@ -111,4 +111,4 @@ template = "changelog/_template.rst"
|
|||
showcontent = true
|
||||
|
||||
[tool.black]
|
||||
target-version = ['py36']
|
||||
target-version = ['py37']
|
||||
|
|
|
@ -100,9 +100,6 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader)
|
|||
spec is None
|
||||
# this is a namespace package (without `__init__.py`)
|
||||
# there's nothing to rewrite there
|
||||
# python3.6: `namespace`
|
||||
# python3.7+: `None`
|
||||
or spec.origin == "namespace"
|
||||
or spec.origin is None
|
||||
# we can only rewrite source files
|
||||
or not isinstance(spec.loader, importlib.machinery.SourceFileLoader)
|
||||
|
|
|
@ -68,8 +68,8 @@ def _colorama_workaround() -> None:
|
|||
pass
|
||||
|
||||
|
||||
def _py36_windowsconsoleio_workaround(stream: TextIO) -> None:
|
||||
"""Workaround for Windows Unicode console handling on Python>=3.6.
|
||||
def _windowsconsoleio_workaround(stream: TextIO) -> None:
|
||||
"""Workaround for Windows Unicode console handling.
|
||||
|
||||
Python 3.6 implemented Unicode console handling for Windows. This works
|
||||
by reading/writing to the raw console handle using
|
||||
|
@ -128,7 +128,7 @@ def _py36_windowsconsoleio_workaround(stream: TextIO) -> None:
|
|||
def pytest_load_initial_conftests(early_config: Config):
|
||||
ns = early_config.known_args_namespace
|
||||
if ns.capture == "fd":
|
||||
_py36_windowsconsoleio_workaround(sys.stdout)
|
||||
_windowsconsoleio_workaround(sys.stdout)
|
||||
_colorama_workaround()
|
||||
pluginmanager = early_config.pluginmanager
|
||||
capman = CaptureManager(ns.capture)
|
||||
|
|
|
@ -414,7 +414,7 @@ class PyCollector(PyobjMixin, nodes.Collector):
|
|||
for basecls in self.obj.__mro__:
|
||||
dicts.append(basecls.__dict__)
|
||||
|
||||
# In each class, nodes should be definition ordered. Since Python 3.6,
|
||||
# In each class, nodes should be definition ordered.
|
||||
# __dict__ is definition ordered.
|
||||
seen: Set[str] = set()
|
||||
dict_values: List[List[Union[nodes.Item, nodes.Collector]]] = []
|
||||
|
@ -894,8 +894,6 @@ class InstanceDummy:
|
|||
pass
|
||||
|
||||
|
||||
# Note: module __getattr__ only works on Python>=3.7. Unfortunately
|
||||
# we can't provide this deprecation warning on Python 3.6.
|
||||
def __getattr__(name: str) -> object:
|
||||
if name == "Instance":
|
||||
warnings.warn(INSTANCE_COLLECTOR, 2)
|
||||
|
|
|
@ -234,10 +234,6 @@ def test_node_ctor_fspath_argument_is_deprecated(pytester: Pytester) -> None:
|
|||
)
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
sys.version_info < (3, 7),
|
||||
reason="This deprecation can only be emitted on python>=3.7",
|
||||
)
|
||||
def test_importing_instance_is_deprecated(pytester: Pytester) -> None:
|
||||
with pytest.warns(
|
||||
pytest.PytestDeprecationWarning,
|
||||
|
|
|
@ -1123,9 +1123,6 @@ class TestAssertionRewriteHookDetails:
|
|||
|
||||
assert _read_pyc(source, pyc) is None # no error
|
||||
|
||||
@pytest.mark.skipif(
|
||||
sys.version_info < (3, 7), reason="Only the Python 3.7 format for simplicity"
|
||||
)
|
||||
def test_read_pyc_more_invalid(self, tmp_path: Path) -> None:
|
||||
from _pytest.assertion.rewrite import _read_pyc
|
||||
|
||||
|
|
|
@ -1433,19 +1433,19 @@ def test_error_attribute_issue555(pytester: Pytester) -> None:
|
|||
not sys.platform.startswith("win"),
|
||||
reason="only on windows",
|
||||
)
|
||||
def test_py36_windowsconsoleio_workaround_non_standard_streams() -> None:
|
||||
def test_windowsconsoleio_workaround_non_standard_streams() -> None:
|
||||
"""
|
||||
Ensure _py36_windowsconsoleio_workaround function works with objects that
|
||||
Ensure _windowsconsoleio_workaround function works with objects that
|
||||
do not implement the full ``io``-based stream protocol, for example execnet channels (#2666).
|
||||
"""
|
||||
from _pytest.capture import _py36_windowsconsoleio_workaround
|
||||
from _pytest.capture import _windowsconsoleio_workaround
|
||||
|
||||
class DummyStream:
|
||||
def write(self, s):
|
||||
pass
|
||||
|
||||
stream = cast(TextIO, DummyStream())
|
||||
_py36_windowsconsoleio_workaround(stream)
|
||||
_windowsconsoleio_workaround(stream)
|
||||
|
||||
|
||||
def test_dontreadfrominput_has_encoding(pytester: Pytester) -> None:
|
||||
|
|
|
@ -133,7 +133,7 @@ def test_is_generator_async_gen_syntax(pytester: Pytester) -> None:
|
|||
pytester.makepyfile(
|
||||
"""
|
||||
from _pytest.compat import is_generator
|
||||
def test_is_generator_py36():
|
||||
def test_is_generator():
|
||||
async def foo():
|
||||
yield
|
||||
await foo()
|
||||
|
|
|
@ -4,8 +4,6 @@ Tests and examples for correct "+/-" usage in error diffs.
|
|||
See https://github.com/pytest-dev/pytest/issues/3333 for details.
|
||||
|
||||
"""
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
from _pytest.pytester import Pytester
|
||||
|
||||
|
@ -210,68 +208,63 @@ TESTCASES = [
|
|||
""",
|
||||
id='Test "not in" string',
|
||||
),
|
||||
pytest.param(
|
||||
"""
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass
|
||||
class A:
|
||||
a: int
|
||||
b: str
|
||||
|
||||
def test_this():
|
||||
result = A(1, 'spam')
|
||||
expected = A(2, 'spam')
|
||||
assert result == expected
|
||||
""",
|
||||
"""
|
||||
> assert result == expected
|
||||
E AssertionError: assert A(a=1, b='spam') == A(a=2, b='spam')
|
||||
E Matching attributes:
|
||||
E ['b']
|
||||
E Differing attributes:
|
||||
E ['a']
|
||||
E Drill down into differing attribute a:
|
||||
E a: 1 != 2
|
||||
E +1
|
||||
E -2
|
||||
""",
|
||||
id="Compare data classes",
|
||||
),
|
||||
pytest.param(
|
||||
"""
|
||||
import attr
|
||||
|
||||
@attr.s(auto_attribs=True)
|
||||
class A:
|
||||
a: int
|
||||
b: str
|
||||
|
||||
def test_this():
|
||||
result = A(1, 'spam')
|
||||
expected = A(1, 'eggs')
|
||||
assert result == expected
|
||||
""",
|
||||
"""
|
||||
> assert result == expected
|
||||
E AssertionError: assert A(a=1, b='spam') == A(a=1, b='eggs')
|
||||
E Matching attributes:
|
||||
E ['a']
|
||||
E Differing attributes:
|
||||
E ['b']
|
||||
E Drill down into differing attribute b:
|
||||
E b: 'spam' != 'eggs'
|
||||
E - eggs
|
||||
E + spam
|
||||
""",
|
||||
id="Compare attrs classes",
|
||||
),
|
||||
]
|
||||
if sys.version_info[:2] >= (3, 7):
|
||||
TESTCASES.extend(
|
||||
[
|
||||
pytest.param(
|
||||
"""
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass
|
||||
class A:
|
||||
a: int
|
||||
b: str
|
||||
|
||||
def test_this():
|
||||
result = A(1, 'spam')
|
||||
expected = A(2, 'spam')
|
||||
assert result == expected
|
||||
""",
|
||||
"""
|
||||
> assert result == expected
|
||||
E AssertionError: assert A(a=1, b='spam') == A(a=2, b='spam')
|
||||
E Matching attributes:
|
||||
E ['b']
|
||||
E Differing attributes:
|
||||
E ['a']
|
||||
E Drill down into differing attribute a:
|
||||
E a: 1 != 2
|
||||
E +1
|
||||
E -2
|
||||
""",
|
||||
id="Compare data classes",
|
||||
),
|
||||
pytest.param(
|
||||
"""
|
||||
import attr
|
||||
|
||||
@attr.s(auto_attribs=True)
|
||||
class A:
|
||||
a: int
|
||||
b: str
|
||||
|
||||
def test_this():
|
||||
result = A(1, 'spam')
|
||||
expected = A(1, 'eggs')
|
||||
assert result == expected
|
||||
""",
|
||||
"""
|
||||
> assert result == expected
|
||||
E AssertionError: assert A(a=1, b='spam') == A(a=1, b='eggs')
|
||||
E Matching attributes:
|
||||
E ['a']
|
||||
E Differing attributes:
|
||||
E ['b']
|
||||
E Drill down into differing attribute b:
|
||||
E b: 'spam' != 'eggs'
|
||||
E - eggs
|
||||
E + spam
|
||||
""",
|
||||
id="Compare attrs classes",
|
||||
),
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("code, expected", TESTCASES)
|
||||
|
|
|
@ -450,7 +450,6 @@ def test_samefile_false_negatives(tmp_path: Path, monkeypatch: MonkeyPatch) -> N
|
|||
|
||||
|
||||
class TestImportLibMode:
|
||||
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Dataclasses in Python3.7+")
|
||||
def test_importmode_importlib_with_dataclass(self, tmp_path: Path) -> None:
|
||||
"""Ensure that importlib mode works with a module containing dataclasses (#7856)."""
|
||||
fn = tmp_path.joinpath("_src/tests/test_dataclass.py")
|
||||
|
|
Loading…
Reference in New Issue