doctest: use Path instead of py.path where possible

This commit is contained in:
Ran Benita 2020-12-19 14:02:24 +02:00
parent 2c05a7babb
commit 042d12fae6
2 changed files with 19 additions and 19 deletions

View File

@ -36,6 +36,7 @@ from _pytest.config.argparsing import Parser
from _pytest.fixtures import FixtureRequest from _pytest.fixtures import FixtureRequest
from _pytest.nodes import Collector from _pytest.nodes import Collector
from _pytest.outcomes import OutcomeException from _pytest.outcomes import OutcomeException
from _pytest.pathlib import fnmatch_ex
from _pytest.pathlib import import_path from _pytest.pathlib import import_path
from _pytest.python_api import approx from _pytest.python_api import approx
from _pytest.warning_types import PytestWarning from _pytest.warning_types import PytestWarning
@ -120,32 +121,32 @@ def pytest_unconfigure() -> None:
def pytest_collect_file( def pytest_collect_file(
path: py.path.local, parent: Collector, fspath: Path, path: py.path.local, parent: Collector,
) -> Optional[Union["DoctestModule", "DoctestTextfile"]]: ) -> Optional[Union["DoctestModule", "DoctestTextfile"]]:
config = parent.config config = parent.config
if path.ext == ".py": if fspath.suffix == ".py":
if config.option.doctestmodules and not _is_setup_py(path): if config.option.doctestmodules and not _is_setup_py(fspath):
mod: DoctestModule = DoctestModule.from_parent(parent, fspath=path) mod: DoctestModule = DoctestModule.from_parent(parent, fspath=path)
return mod return mod
elif _is_doctest(config, path, parent): elif _is_doctest(config, fspath, parent):
txt: DoctestTextfile = DoctestTextfile.from_parent(parent, fspath=path) txt: DoctestTextfile = DoctestTextfile.from_parent(parent, fspath=path)
return txt return txt
return None return None
def _is_setup_py(path: py.path.local) -> bool: def _is_setup_py(path: Path) -> bool:
if path.basename != "setup.py": if path.name != "setup.py":
return False return False
contents = path.read_binary() contents = path.read_bytes()
return b"setuptools" in contents or b"distutils" in contents return b"setuptools" in contents or b"distutils" in contents
def _is_doctest(config: Config, path: py.path.local, parent) -> bool: def _is_doctest(config: Config, path: Path, parent: Collector) -> bool:
if path.ext in (".txt", ".rst") and parent.session.isinitpath(path): if path.suffix in (".txt", ".rst") and parent.session.isinitpath(path):
return True return True
globs = config.getoption("doctestglob") or ["test*.txt"] globs = config.getoption("doctestglob") or ["test*.txt"]
for glob in globs: for glob in globs:
if path.check(fnmatch=glob): if fnmatch_ex(glob, path):
return True return True
return False return False

View File

@ -1,10 +1,9 @@
import inspect import inspect
import textwrap import textwrap
from pathlib import Path
from typing import Callable from typing import Callable
from typing import Optional from typing import Optional
import py
import pytest import pytest
from _pytest.doctest import _get_checker from _pytest.doctest import _get_checker
from _pytest.doctest import _is_mocked from _pytest.doctest import _is_mocked
@ -1496,25 +1495,25 @@ def test_warning_on_unwrap_of_broken_object(
assert inspect.unwrap.__module__ == "inspect" assert inspect.unwrap.__module__ == "inspect"
def test_is_setup_py_not_named_setup_py(tmp_path): def test_is_setup_py_not_named_setup_py(tmp_path: Path) -> None:
not_setup_py = tmp_path.joinpath("not_setup.py") not_setup_py = tmp_path.joinpath("not_setup.py")
not_setup_py.write_text('from setuptools import setup; setup(name="foo")') not_setup_py.write_text('from setuptools import setup; setup(name="foo")')
assert not _is_setup_py(py.path.local(str(not_setup_py))) assert not _is_setup_py(not_setup_py)
@pytest.mark.parametrize("mod", ("setuptools", "distutils.core")) @pytest.mark.parametrize("mod", ("setuptools", "distutils.core"))
def test_is_setup_py_is_a_setup_py(tmpdir, mod): def test_is_setup_py_is_a_setup_py(tmp_path: Path, mod: str) -> None:
setup_py = tmpdir.join("setup.py") setup_py = tmp_path.joinpath("setup.py")
setup_py.write(f'from {mod} import setup; setup(name="foo")') setup_py.write_text(f'from {mod} import setup; setup(name="foo")', "utf-8")
assert _is_setup_py(setup_py) assert _is_setup_py(setup_py)
@pytest.mark.parametrize("mod", ("setuptools", "distutils.core")) @pytest.mark.parametrize("mod", ("setuptools", "distutils.core"))
def test_is_setup_py_different_encoding(tmp_path, mod): def test_is_setup_py_different_encoding(tmp_path: Path, mod: str) -> None:
setup_py = tmp_path.joinpath("setup.py") setup_py = tmp_path.joinpath("setup.py")
contents = ( contents = (
"# -*- coding: cp1252 -*-\n" "# -*- coding: cp1252 -*-\n"
'from {} import setup; setup(name="foo", description="")\n'.format(mod) 'from {} import setup; setup(name="foo", description="")\n'.format(mod)
) )
setup_py.write_bytes(contents.encode("cp1252")) setup_py.write_bytes(contents.encode("cp1252"))
assert _is_setup_py(py.path.local(str(setup_py))) assert _is_setup_py(setup_py)