Commit f318f6f8 by finswimmer Committed by GitHub

Add missing type hints - Part 1 (#4775)

* add missing type hints to application code

* add typehints to tests.config, tests.console.commands.debug, tests.console.commands.env

* add typehints to tests.console.commands.plugin

* add typehints to tests.self

* add typehints to tests.console.commands.source

* add typehints to tests.console.commands.about

* add typehints tests.console.commands.add

* add typehints to tests.console.commands.test_cache

* add typehints to tests.console.commands.test_check

* add typehints to tests.console.commands.test_config

* add typehints to tests.console.commands.test_export

* add typehints to tests.console.commands.test_init

* add typehints to tests.console.commands.test_install

* add typehints to tests.console.commands.test_lock

* add typehints to tests.console.commands.test_new

* add typehints to tests.console.commands.test_publish

* add typehints to tests.console.commands.test_remove

* add typehints to tests.console.commands.test_run

* add typehints to tests.console.commands.test_search

* add typehints to tests.console.commands.test_show

* add typehints to tests.console.commands.test_version

* add typehints to tests.console.test_application

* add typehints to tests.console.conftest

* add typehints to tests.console.conftest

* add python version constraint for typing-extension

* fix type hint for http fixture
parent 9e31f7a2
......@@ -37,11 +37,11 @@ testing = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3
[[package]]
name = "cachecontrol"
version = "0.12.6"
version = "0.12.10"
description = "httplib2 caching for requests"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
python-versions = ">=3.6"
[package.dependencies]
lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""}
......@@ -672,6 +672,14 @@ docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-a
testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "pytest-xdist (>=1.22.2)", "pathlib2 (>=2.3.3)"]
[[package]]
name = "typing-extensions"
version = "4.0.0"
description = "Backported and Experimental Type Hints for Python 3.6+"
category = "dev"
optional = false
python-versions = ">=3.6"
[[package]]
name = "urllib3"
version = "1.26.7"
description = "HTTP library with thread-safe connection pooling, file post, and more."
......@@ -728,7 +736,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes
[metadata]
lock-version = "1.1"
python-versions = "^3.6"
content-hash = "15dc46f1a8bf5a3eb2a3c48f9a8527f89fac67487e8188e67c0a603c376fd0fd"
content-hash = "0da3c8505456818f8ed4b117853d059f8e288a7cff5dc40d118998c92d1a43f1"
[metadata.files]
atomicwrites = [
......@@ -744,8 +752,8 @@ attrs = [
{file = "backports.entry_points_selectable-1.1.0.tar.gz", hash = "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a"},
]
cachecontrol = [
{file = "CacheControl-0.12.6-py2.py3-none-any.whl", hash = "sha256:10d056fa27f8563a271b345207402a6dcce8efab7e5b377e270329c62471b10d"},
{file = "CacheControl-0.12.6.tar.gz", hash = "sha256:be9aa45477a134aee56c8fac518627e1154df063e85f67d4f83ce0ccc23688e8"},
{file = "CacheControl-0.12.10-py2.py3-none-any.whl", hash = "sha256:b0d43d8f71948ef5ebdee5fe236b86c6ffc7799370453dccb0e894c20dfa487c"},
{file = "CacheControl-0.12.10.tar.gz", hash = "sha256:d8aca75b82eec92d84b5d6eb8c8f66ea16f09d2adb09dbca27fe2d5fc8d3732d"},
]
cachy = [
{file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"},
......@@ -1108,6 +1116,10 @@ tox = [
{file = "tox-3.24.4-py2.py3-none-any.whl", hash = "sha256:5e274227a53dc9ef856767c21867377ba395992549f02ce55eb549f9fb9a8d10"},
{file = "tox-3.24.4.tar.gz", hash = "sha256:c30b57fa2477f1fb7c36aa1d83292d5c2336cd0018119e1b1c17340e2c2708ca"},
]
typing-extensions = [
{file = "typing_extensions-4.0.0-py3-none-any.whl", hash = "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"},
{file = "typing_extensions-4.0.0.tar.gz", hash = "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed"},
]
urllib3 = [
{file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
{file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
......
......@@ -64,6 +64,7 @@ pytest-sugar = "^0.9"
httpretty = "^1.0"
zipp = { version = "^3.4", python = "<3.8"}
deepdiff = "^5.0"
typing-extensions = {version = "^4.0.0", python = "<3.8"}
[tool.poetry.scripts]
poetry = "poetry.console.application:main"
......
from typing import TYPE_CHECKING
from poetry.plugins.base_plugin import BasePlugin
if TYPE_CHECKING:
from poetry.console.application import Application
class ApplicationPlugin(BasePlugin):
"""
Base class for plugins.
......@@ -8,5 +14,5 @@ class ApplicationPlugin(BasePlugin):
type = "application.plugin"
def activate(self, application):
def activate(self, application: "Application") -> None:
raise NotImplementedError()
from typing import TYPE_CHECKING
from poetry.plugins.base_plugin import BasePlugin
if TYPE_CHECKING:
from cleo.io.io import IO
from poetry.poetry import Poetry
class Plugin(BasePlugin):
"""
Generic plugin not related to the console application.
......@@ -10,5 +18,5 @@ class Plugin(BasePlugin):
type = "plugin"
def activate(self, poetry, io):
def activate(self, poetry: "Poetry", io: "IO") -> None:
raise NotImplementedError()
import logging
from typing import Any
from typing import List
import entrypoints
......@@ -41,7 +42,7 @@ class PluginManager:
self._plugins.append(plugin)
def activate(self, *args, **kwargs):
def activate(self, *args: Any, **kwargs: Any) -> None:
for plugin in self._plugins:
plugin.activate(*args, **kwargs)
......
import sys
from typing import List
from typing import Optional
try:
from importlib import metadata
......@@ -10,7 +13,7 @@ except ImportError:
WINDOWS = sys.platform == "win32"
def decode(string, encodings=None):
def decode(string: str, encodings: Optional[List[str]] = None) -> str:
if not isinstance(string, bytes):
return string
......@@ -25,7 +28,7 @@ def decode(string, encodings=None):
return string.decode(encodings[0], errors="ignore")
def encode(string, encodings=None):
def encode(string: str, encodings: Optional[List[str]] = None) -> bytes:
if isinstance(string, bytes):
return string
......@@ -40,11 +43,11 @@ def encode(string, encodings=None):
return string.encode(encodings[0], errors="ignore")
def to_str(string):
def to_str(string: str) -> str:
return decode(string)
def list_to_shell_command(cmd):
def list_to_shell_command(cmd: List[str]) -> str:
return " ".join(
f'"{token}"' if " " in token and token[0] not in {"'", '"'} else token
for token in cmd
......
......@@ -1168,7 +1168,7 @@ class Env:
self._pip_executable = pip_executable
def get_embedded_wheel(self, distribution):
def get_embedded_wheel(self, distribution: str) -> Path:
return get_embed_wheel(
distribution, f"{self.version_info[0]}.{self.version_info[1]}"
).path
......@@ -1785,7 +1785,7 @@ class NullEnv(SystemEnv):
@contextmanager
def ephemeral_environment(
executable=None,
executable: Optional[Union[str, Path]] = None,
flags: Dict[str, bool] = None,
with_pip: bool = False,
with_wheel: Optional[bool] = None,
......
......@@ -2,3 +2,8 @@ try:
import zipp
except ImportError:
import zipfile as zipp # noqa: F401, TC002
try:
from typing import Protocol
except ImportError:
from typing_extensions import Protocol # noqa: F401, TC002
import os
import re
from typing import TYPE_CHECKING
from typing import Any
from typing import Dict
from typing import Iterator
from typing import Optional
from typing import Tuple
import pytest
from poetry.config.config import Config
def get_boolean_options(config=None):
if TYPE_CHECKING:
from pathlib import Path
def get_boolean_options(config: Optional[Dict[str, Any]] = None) -> str:
if config is None:
config = Config.default_config
......@@ -21,19 +32,21 @@ def get_boolean_options(config=None):
@pytest.mark.parametrize(
("name", "value"), [("installer.parallel", True), ("virtualenvs.create", True)]
)
def test_config_get_default_value(config, name, value):
def test_config_get_default_value(config: Config, name: str, value: bool):
assert config.get(name) is value
def test_config_get_processes_depended_on_values(config, config_cache_dir):
def test_config_get_processes_depended_on_values(
config: Config, config_cache_dir: "Path"
):
assert str(config_cache_dir / "virtualenvs") == config.get("virtualenvs.path")
def generate_environment_variable_tests():
def generate_environment_variable_tests() -> Iterator[Tuple[str, str, str, bool]]:
for env_value, value in [("true", True), ("false", False)]:
for name in get_boolean_options():
env_var = "POETRY_{}".format(re.sub("[.-]+", "_", name).upper())
yield (name, env_var, env_value, value)
yield name, env_var, env_value, value
@pytest.mark.parametrize(
......@@ -41,7 +54,12 @@ def generate_environment_variable_tests():
list(generate_environment_variable_tests()),
)
def test_config_get_from_environment_variable(
config, environ, name, env_var, env_value, value
config: Config,
environ: Iterator[None],
name: str,
env_var: str,
env_value: str,
value: bool,
):
os.environ[env_var] = env_value
assert config.get(name) is value
......@@ -5,8 +5,14 @@ import sys
import tempfile
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Any
from typing import Callable
from typing import Dict
from typing import Iterator
from typing import Optional
from typing import Tuple
from typing import Type
import httpretty
import pytest
......@@ -34,6 +40,12 @@ from tests.helpers import mock_clone
from tests.helpers import mock_download
if TYPE_CHECKING:
from poetry.poetry import Poetry
from tests.types import CommandTesterFactory
from tests.types import ProjectFactory
class Config(BaseConfig):
def get(self, setting_name: str, default: Any = None) -> Any:
self.merge(self._config_source.config)
......@@ -110,7 +122,7 @@ def with_chained_keyring(mocker):
@pytest.fixture
def config_cache_dir(tmp_dir):
def config_cache_dir(tmp_dir: str) -> Path:
path = Path(tmp_dir) / ".cache" / "pypoetry"
path.mkdir(parents=True)
return path
......@@ -130,14 +142,14 @@ def config_source(config_cache_dir):
@pytest.fixture
def auth_config_source():
def auth_config_source() -> DictConfigSource:
source = DictConfigSource()
return source
@pytest.fixture
def config(config_source, auth_config_source, mocker):
def config(config_source, auth_config_source, mocker) -> Config:
import keyring
from keyring.backends.fail import Keyring
......@@ -189,7 +201,7 @@ def pep517_metadata_mock(mocker):
@pytest.fixture
def environ():
def environ() -> Iterator[None]:
original_environ = dict(os.environ)
yield
......@@ -208,7 +220,7 @@ def git_mock(mocker):
@pytest.fixture
def http():
def http() -> Iterator[Type[httpretty.httpretty]]:
httpretty.reset()
httpretty.enable(allow_net_connect=False)
......@@ -219,20 +231,20 @@ def http():
@pytest.fixture
def fixture_base():
def fixture_base() -> Path:
return Path(__file__).parent / "fixtures"
@pytest.fixture
def fixture_dir(fixture_base):
def _fixture_dir(name):
def fixture_dir(fixture_base: Path) -> Callable[[str], Path]:
def _fixture_dir(name: str):
return fixture_base / name
return _fixture_dir
@pytest.fixture
def tmp_dir():
def tmp_dir() -> Iterator[str]:
dir_ = tempfile.mkdtemp(prefix="poetry_")
yield dir_
......@@ -256,7 +268,7 @@ def mocked_open_files(mocker):
@pytest.fixture
def tmp_venv(tmp_dir):
def tmp_venv(tmp_dir: str) -> Iterator[VirtualEnv]:
venv_path = Path(tmp_dir) / "venv"
EnvManager.build_venv(str(venv_path))
......@@ -268,27 +280,27 @@ def tmp_venv(tmp_dir):
@pytest.fixture
def installed():
def installed() -> Repository:
return Repository()
@pytest.fixture(scope="session")
def current_env():
def current_env() -> SystemEnv:
return SystemEnv(Path(sys.executable))
@pytest.fixture(scope="session")
def current_python(current_env):
def current_python(current_env: SystemEnv) -> Tuple[int, int, int]:
return current_env.version_info[:3]
@pytest.fixture(scope="session")
def default_python(current_python):
def default_python(current_python: Tuple[int, int, int]) -> str:
return "^{}".format(".".join(str(v) for v in current_python[:2]))
@pytest.fixture
def repo(http):
def repo(http: Type[httpretty.httpretty]) -> TestRepository:
http.register_uri(
http.GET,
re.compile("^https?://foo.bar/(.+?)$"),
......@@ -297,17 +309,23 @@ def repo(http):
@pytest.fixture
def project_factory(tmp_dir, config, repo, installed, default_python):
def project_factory(
tmp_dir: str,
config: Config,
repo: TestRepository,
installed: Repository,
default_python: str,
) -> "ProjectFactory":
workspace = Path(tmp_dir)
def _factory(
name=None,
dependencies=None,
dev_dependencies=None,
pyproject_content=None,
poetry_lock_content=None,
install_deps=True,
):
name: Optional[str] = None,
dependencies: Optional[Dict[str, str]] = None,
dev_dependencies: Optional[Dict[str, str]] = None,
pyproject_content: Optional[str] = None,
poetry_lock_content: Optional[str] = None,
install_deps: bool = True,
) -> "Poetry":
project_dir = workspace / f"poetry-fixture-{name}"
dependencies = dependencies or {}
dev_dependencies = dev_dependencies or {}
......@@ -359,7 +377,7 @@ def project_factory(tmp_dir, config, repo, installed, default_python):
@pytest.fixture
def command_tester_factory(app, env):
def command_tester_factory(app, env) -> "CommandTesterFactory":
def _tester(command, poetry=None, installer=None, executor=None, environment=None):
command = app.find(command)
tester = CommandTester(command)
......@@ -400,7 +418,7 @@ def command_tester_factory(app, env):
@pytest.fixture
def do_lock(command_tester_factory, poetry):
def do_lock(command_tester_factory: "CommandTesterFactory", poetry: "Poetry") -> None:
command_tester_factory("lock").execute()
assert poetry.locker.lock.exists()
......
from typing import TYPE_CHECKING
import pytest
from poetry.factory import Factory
from tests.helpers import get_package
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("debug resolve")
@pytest.fixture(autouse=True)
def __add_packages(repo):
def __add_packages(repo: "TestRepository") -> None:
cachy020 = get_package("cachy", "0.2.0")
cachy020.add_dependency(Factory.create_dependency("msgpack-python", ">=0.5 <0.6"))
......@@ -22,7 +31,7 @@ def __add_packages(repo):
repo.add_package(get_package("cleo", "0.6.5"))
def test_debug_resolve_gives_resolution_results(tester):
def test_debug_resolve_gives_resolution_results(tester: "CommandTester"):
tester.execute("cachy")
expected = """\
......@@ -37,7 +46,7 @@ cachy 0.2.0
assert expected == tester.io.fetch_output()
def test_debug_resolve_tree_option_gives_the_dependency_tree(tester):
def test_debug_resolve_tree_option_gives_the_dependency_tree(tester: "CommandTester"):
tester.execute("cachy --tree")
expected = """\
......@@ -52,7 +61,7 @@ cachy 0.2.0
assert expected == tester.io.fetch_output()
def test_debug_resolve_git_dependency(tester):
def test_debug_resolve_git_dependency(tester: "CommandTester"):
tester.execute("git+https://github.com/demo/demo.git")
expected = """\
......
import os
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Iterator
from typing import List
import pytest
from poetry.utils.env import EnvManager
if TYPE_CHECKING:
from tests.helpers import PoetryTestApplication
@pytest.fixture
def venv_name(app):
def venv_name(app: "PoetryTestApplication") -> str:
return EnvManager.generate_env_name("simple-project", str(app.poetry.file.parent))
@pytest.fixture
def venv_cache(tmp_dir):
def venv_cache(tmp_dir: str) -> Path:
return Path(tmp_dir)
@pytest.fixture(scope="module")
def python_versions():
def python_versions() -> List[str]:
return ["3.6", "3.7"]
@pytest.fixture
def venvs_in_cache_config(app, venv_cache):
def venvs_in_cache_config(app: "PoetryTestApplication", venv_cache: Path) -> None:
app.poetry.config.merge({"virtualenvs": {"path": str(venv_cache)}})
@pytest.fixture
def venvs_in_cache_dirs(
app, venvs_in_cache_config, venv_name, venv_cache, python_versions
):
app: "PoetryTestApplication",
venvs_in_cache_config: None,
venv_name: str,
venv_cache: Path,
python_versions: List[str],
) -> List[str]:
directories = []
for version in python_versions:
directory = venv_cache.joinpath(f"{venv_name}-py{version}")
......@@ -40,7 +51,7 @@ def venvs_in_cache_dirs(
@pytest.fixture
def venvs_in_project_dir(app):
def venvs_in_project_dir(app: "PoetryTestApplication") -> Iterator[Path]:
os.environ.pop("VIRTUAL_ENV", None)
venv_dir = app.poetry.file.parent.joinpath(".venv")
venv_dir.mkdir(exist_ok=True)
......
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Any
from typing import Callable
from typing import Union
from poetry.core.semver.version import Version
if TYPE_CHECKING:
from poetry.core.version.pep440.version import PEP440Version
VERSION_3_7_1 = Version.parse("3.7.1")
......@@ -12,8 +17,10 @@ def build_venv(path: Union[Path, str], **_: Any) -> None:
Path(path).mkdir(parents=True, exist_ok=True)
def check_output_wrapper(version=VERSION_3_7_1):
def check_output(cmd, *_, **__):
def check_output_wrapper(
version: "PEP440Version" = VERSION_3_7_1,
) -> Callable[[str, Any, Any], str]:
def check_output(cmd: str, *_: Any, **__: Any) -> str:
if "sys.version_info[:3]" in cmd:
return version.text
elif "sys.version_info[:2]" in cmd:
......
import sys
from pathlib import Path
from typing import TYPE_CHECKING
import pytest
from poetry.utils.env import MockEnv
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from tests.types import CommandTesterFactory
@pytest.fixture(autouse=True)
def setup(mocker):
def setup(mocker: "MockerFixture") -> None:
mocker.patch(
"poetry.utils.env.EnvManager.get",
return_value=MockEnv(
......@@ -18,11 +26,11 @@ def setup(mocker):
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("env info")
def test_env_info_displays_complete_info(tester):
def test_env_info_displays_complete_info(tester: "CommandTester"):
tester.execute()
expected = """
......@@ -50,7 +58,7 @@ Executable: {base_executable}
assert expected == tester.io.fetch_output()
def test_env_info_displays_path_only(tester):
def test_env_info_displays_path_only(tester: "CommandTester"):
tester.execute("--path")
expected = str(Path("/prefix"))
assert expected + "\n" == tester.io.fetch_output()
from typing import TYPE_CHECKING
from typing import List
import pytest
import tomlkit
from poetry.core.toml.file import TOMLFile
if TYPE_CHECKING:
from pathlib import Path
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.utils.env import MockEnv
from tests.types import CommandTesterFactory
@pytest.fixture
def venv_activate_37(venv_cache, venv_name):
def venv_activate_37(venv_cache: "Path", venv_name: str) -> None:
envs_file = TOMLFile(venv_cache / "envs.toml")
doc = tomlkit.document()
doc[venv_name] = {"minor": "3.7", "patch": "3.7.0"}
......@@ -13,18 +26,28 @@ def venv_activate_37(venv_cache, venv_name):
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("env list")
def test_none_activated(tester, venvs_in_cache_dirs, mocker, env):
def test_none_activated(
tester: "CommandTester",
venvs_in_cache_dirs: List[str],
mocker: "MockerFixture",
env: "MockEnv",
):
mocker.patch("poetry.utils.env.EnvManager.get", return_value=env)
tester.execute()
expected = "\n".join(venvs_in_cache_dirs).strip()
assert expected == tester.io.fetch_output().strip()
def test_activated(tester, venvs_in_cache_dirs, venv_cache, venv_activate_37):
def test_activated(
tester: "CommandTester",
venvs_in_cache_dirs: List[str],
venv_cache: "Path",
venv_activate_37: None,
):
tester.execute()
expected = (
"\n".join(venvs_in_cache_dirs).strip().replace("py3.7", "py3.7 (Activated)")
......@@ -32,7 +55,7 @@ def test_activated(tester, venvs_in_cache_dirs, venv_cache, venv_activate_37):
assert expected == tester.io.fetch_output().strip()
def test_in_project_venv(tester, venvs_in_project_dir):
def test_in_project_venv(tester: "CommandTester", venvs_in_project_dir: List[str]):
tester.execute()
expected = ".venv (Activated)\n"
assert expected == tester.io.fetch_output()
from typing import TYPE_CHECKING
from typing import List
import pytest
from poetry.core.semver.version import Version
from tests.console.commands.env.helpers import check_output_wrapper
if TYPE_CHECKING:
from pathlib import Path
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("env remove")
def test_remove_by_python_version(
mocker, tester, venvs_in_cache_dirs, venv_name, venv_cache
mocker: "MockerFixture",
tester: "CommandTester",
venvs_in_cache_dirs: List[str],
venv_name: str,
venv_cache: "Path",
):
check_output = mocker.patch(
"subprocess.check_output",
......@@ -26,7 +42,12 @@ def test_remove_by_python_version(
assert expected == tester.io.fetch_output()
def test_remove_by_name(tester, venvs_in_cache_dirs, venv_name, venv_cache):
def test_remove_by_name(
tester: "CommandTester",
venvs_in_cache_dirs: List[str],
venv_name: str,
venv_cache: "Path",
):
expected = ""
for name in venvs_in_cache_dirs:
......@@ -39,7 +60,12 @@ def test_remove_by_name(tester, venvs_in_cache_dirs, venv_name, venv_cache):
assert expected == tester.io.fetch_output()
def test_remove_all(tester, venvs_in_cache_dirs, venv_name, venv_cache):
def test_remove_all(
tester: "CommandTester",
venvs_in_cache_dirs: List[str],
venv_name: str,
venv_cache: "Path",
):
expected = {""}
tester.execute("--all")
for name in venvs_in_cache_dirs:
......@@ -48,7 +74,12 @@ def test_remove_all(tester, venvs_in_cache_dirs, venv_name, venv_cache):
assert expected == set(tester.io.fetch_output().split("\n"))
def test_remove_all_and_version(tester, venvs_in_cache_dirs, venv_name, venv_cache):
def test_remove_all_and_version(
tester: "CommandTester",
venvs_in_cache_dirs: List[str],
venv_name: str,
venv_cache: "Path",
):
expected = {""}
tester.execute(f"--all {venvs_in_cache_dirs[0]}")
for name in venvs_in_cache_dirs:
......@@ -57,7 +88,12 @@ def test_remove_all_and_version(tester, venvs_in_cache_dirs, venv_name, venv_cac
assert expected == set(tester.io.fetch_output().split("\n"))
def test_remove_multiple(tester, venvs_in_cache_dirs, venv_name, venv_cache):
def test_remove_multiple(
tester: "CommandTester",
venvs_in_cache_dirs: List[str],
venv_name: str,
venv_cache: "Path",
):
expected = {""}
removed_envs = venvs_in_cache_dirs[0:2]
remaining_envs = venvs_in_cache_dirs[2:]
......
import os
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Tuple
import pytest
import tomlkit
......@@ -12,15 +14,24 @@ from tests.console.commands.env.helpers import build_venv
from tests.console.commands.env.helpers import check_output_wrapper
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from tests.types import CommandTesterFactory
@pytest.fixture(autouse=True)
def setup(mocker):
def setup(mocker: "MockerFixture") -> None:
mocker.stopall()
if "VIRTUAL_ENV" in os.environ:
del os.environ["VIRTUAL_ENV"]
@pytest.fixture(autouse=True)
def mock_subprocess_calls(setup, current_python, mocker):
def mock_subprocess_calls(
setup: None, current_python: Tuple[int, int, int], mocker: "MockerFixture"
) -> None:
mocker.patch(
"subprocess.check_output",
side_effect=check_output_wrapper(Version.from_parts(*current_python)),
......@@ -32,12 +43,16 @@ def mock_subprocess_calls(setup, current_python, mocker):
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("env use")
def test_activate_activates_non_existing_virtualenv_no_envs_file(
mocker, tester, venv_cache, venv_name, venvs_in_cache_config
mocker: "MockerFixture",
tester: "CommandTester",
venv_cache: Path,
venv_name: str,
venvs_in_cache_config: None,
):
mocker.patch(
"subprocess.check_output",
......@@ -79,7 +94,11 @@ Using virtualenv: {}
def test_get_prefers_explicitly_activated_virtualenvs_over_env_var(
tester, current_python, venv_cache, venv_name, venvs_in_cache_config
tester: "CommandTester",
current_python: Tuple[int, int, int],
venv_cache: Path,
venv_name: str,
venvs_in_cache_config: None,
):
os.environ["VIRTUAL_ENV"] = "/environment/prefix"
......@@ -105,7 +124,12 @@ Using virtualenv: {}
def test_get_prefers_explicitly_activated_non_existing_virtualenvs_over_env_var(
mocker, tester, current_python, venv_cache, venv_name, venvs_in_cache_config
mocker: "MockerFixture",
tester: "CommandTester",
current_python: Tuple[int, int, int],
venv_cache: Path,
venv_name: str,
venvs_in_cache_config: None,
):
os.environ["VIRTUAL_ENV"] = "/environment/prefix"
......
from typing import TYPE_CHECKING
import pytest
from poetry.__version__ import __version__
......@@ -8,8 +10,21 @@ from poetry.repositories.pool import Pool
from poetry.utils.env import EnvManager
if TYPE_CHECKING:
from cleo.io.io import IO
from pytest_mock import MockerFixture
from poetry.config.config import Config
from poetry.config.source import Source
from poetry.poetry import Poetry
from poetry.repositories import Repository
from poetry.utils.env import MockEnv
from tests.helpers import TestRepository
from tests.types import SourcesFactory
@pytest.fixture()
def installed():
def installed() -> InstalledRepository:
repository = InstalledRepository()
repository.add_package(Package("poetry", __version__))
......@@ -17,8 +32,10 @@ def installed():
return repository
def configure_sources_factory(repo):
def _configure_sources(poetry, sources, config, io):
def configure_sources_factory(repo: "TestRepository") -> "SourcesFactory":
def _configure_sources(
poetry: "Poetry", sources: "Source", config: "Config", io: "IO"
) -> None:
pool = Pool()
pool.add_repository(repo)
poetry.set_pool(pool)
......@@ -27,7 +44,12 @@ def configure_sources_factory(repo):
@pytest.fixture(autouse=True)
def setup_mocks(mocker, env, repo, installed):
def setup_mocks(
mocker: "MockerFixture",
env: "MockEnv",
repo: "TestRepository",
installed: "Repository",
) -> None:
mocker.patch.object(EnvManager, "get_system_env", return_value=env)
mocker.patch.object(InstalledRepository, "load", return_value=installed)
mocker.patch.object(
......
from typing import TYPE_CHECKING
from typing import Dict
from typing import Union
import pytest
from poetry.core.packages.package import Package
from poetry.factory import Factory
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.console.commands.update import UpdateCommand
from poetry.repositories import Repository
from poetry.utils.env import MockEnv
from tests.helpers import PoetryTestApplication
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("plugin add")
def assert_plugin_add_result(tester, app, env, expected, constraint):
def assert_plugin_add_result(
tester: "CommandTester",
app: "PoetryTestApplication",
env: "MockEnv",
expected: str,
constraint: Union[str, Dict[str, str]],
) -> None:
assert tester.io.fetch_output() == expected
update_command = app.find("update")
update_command: "UpdateCommand" = app.find("update")
assert update_command.poetry.file.parent == env.path
assert update_command.poetry.locker.lock.parent == env.path
assert update_command.poetry.locker.lock.exists()
......@@ -22,7 +44,13 @@ def assert_plugin_add_result(tester, app, env, expected, constraint):
assert content["dependencies"]["poetry-plugin"] == constraint
def test_add_no_constraint(app, repo, tester, env, installed):
def test_add_no_constraint(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
installed: "Repository",
):
repo.add_package(Package("poetry-plugin", "0.1.0"))
tester.execute("poetry-plugin")
......@@ -41,7 +69,13 @@ Package operations: 1 install, 0 updates, 0 removals
assert_plugin_add_result(tester, app, env, expected, "^0.1.0")
def test_add_with_constraint(app, repo, tester, env, installed):
def test_add_with_constraint(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
installed: "Repository",
):
repo.add_package(Package("poetry-plugin", "0.1.0"))
repo.add_package(Package("poetry-plugin", "0.2.0"))
......@@ -61,7 +95,13 @@ Package operations: 1 install, 0 updates, 0 removals
assert_plugin_add_result(tester, app, env, expected, "^0.2.0")
def test_add_with_git_constraint(app, repo, tester, env, installed):
def test_add_with_git_constraint(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
installed: "Repository",
):
repo.add_package(Package("pendulum", "2.0.5"))
tester.execute("git+https://github.com/demo/poetry-plugin.git")
......@@ -83,7 +123,13 @@ Package operations: 2 installs, 0 updates, 0 removals
)
def test_add_with_git_constraint_with_extras(app, repo, tester, env, installed):
def test_add_with_git_constraint_with_extras(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
installed: "Repository",
):
repo.add_package(Package("pendulum", "2.0.5"))
repo.add_package(Package("tomlkit", "0.7.0"))
......@@ -115,7 +161,11 @@ Package operations: 3 installs, 0 updates, 0 removals
def test_add_existing_plugin_warns_about_no_operation(
app, repo, tester, env, installed
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
installed: "Repository",
):
env.path.joinpath("pyproject.toml").write_text(
"""\
......@@ -152,13 +202,18 @@ If you prefer to upgrade it to the latest available version, you can use `poetry
assert tester.io.fetch_output() == expected
update_command = app.find("update")
update_command: "UpdateCommand" = app.find("update")
# The update command should not have been called
assert update_command.poetry.file.parent != env.path
def test_add_existing_plugin_updates_if_requested(
app, repo, tester, env, installed, mocker
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
installed: "Repository",
mocker: "MockerFixture",
):
env.path.joinpath("pyproject.toml").write_text(
"""\
......@@ -200,7 +255,11 @@ Package operations: 0 installs, 1 update, 0 removals
def test_adding_a_plugin_can_update_poetry_dependencies_if_needed(
app, repo, tester, env, installed
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
installed: "Repository",
):
poetry_package = Package("poetry", "1.2.0")
poetry_package.add_dependency(Factory.create_dependency("tomlkit", "^0.7.0"))
......
from typing import TYPE_CHECKING
import pytest
import tomlkit
......@@ -6,13 +8,23 @@ from poetry.core.packages.package import Package
from poetry.layouts.layout import POETRY_DEFAULT
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from poetry.console.commands.remove import RemoveCommand
from poetry.repositories import Repository
from poetry.utils.env import MockEnv
from tests.helpers import PoetryTestApplication
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("plugin remove")
@pytest.fixture()
def pyproject(env):
def pyproject(env: "MockEnv") -> None:
pyproject = tomlkit.loads(POETRY_DEFAULT)
content = pyproject["tool"]["poetry"]
......@@ -30,7 +42,7 @@ def pyproject(env):
@pytest.fixture(autouse=True)
def install_plugin(env, installed, pyproject):
def install_plugin(env: "MockEnv", installed: "Repository", pyproject: None) -> None:
lock_content = {
"package": [
{
......@@ -70,7 +82,9 @@ def install_plugin(env, installed, pyproject):
installed.add_package(Package("poetry-plugin", "1.2.3"))
def test_remove_installed_package(app, tester, env):
def test_remove_installed_package(
app: "PoetryTestApplication", tester: "CommandTester", env: "MockEnv"
):
tester.execute("poetry-plugin")
expected = """\
......@@ -86,7 +100,7 @@ Package operations: 0 installs, 0 updates, 1 removal
assert tester.io.fetch_output() == expected
remove_command = app.find("remove")
remove_command: "RemoveCommand" = app.find("remove")
assert remove_command.poetry.file.parent == env.path
assert remove_command.poetry.locker.lock.parent == env.path
assert remove_command.poetry.locker.lock.exists()
......@@ -96,7 +110,9 @@ Package operations: 0 installs, 0 updates, 1 removal
assert "poetry-plugin" not in content["dependencies"]
def test_remove_installed_package_dry_run(app, tester, env):
def test_remove_installed_package_dry_run(
app: "PoetryTestApplication", tester: "CommandTester", env: "MockEnv"
):
tester.execute("poetry-plugin --dry-run")
expected = """\
......@@ -113,7 +129,7 @@ Package operations: 0 installs, 0 updates, 1 removal
assert tester.io.fetch_output() == expected
remove_command = app.find("remove")
remove_command: "RemoveCommand" = app.find("remove")
assert remove_command.poetry.file.parent == env.path
assert remove_command.poetry.locker.lock.parent == env.path
assert remove_command.poetry.locker.lock.exists()
......
from typing import TYPE_CHECKING
from typing import Type
import pytest
from entrypoints import EntryPoint as _EntryPoint
......@@ -8,8 +11,18 @@ from poetry.plugins.application_plugin import ApplicationPlugin
from poetry.plugins.plugin import Plugin
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.plugins.base_plugin import BasePlugin
from poetry.repositories import Repository
from tests.helpers import PoetryTestApplication
from tests.types import CommandTesterFactory
class EntryPoint(_EntryPoint):
def load(self):
def load(self) -> Type["BasePlugin"]:
if "ApplicationPlugin" in self.object_name:
return ApplicationPlugin
......@@ -17,11 +30,16 @@ class EntryPoint(_EntryPoint):
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("plugin show")
def test_show_displays_installed_plugins(app, tester, installed, mocker):
def test_show_displays_installed_plugins(
app: "PoetryTestApplication",
tester: "CommandTester",
installed: "Repository",
mocker: "MockerFixture",
):
mocker.patch(
"entrypoints.get_group_all",
side_effect=[
......@@ -55,7 +73,10 @@ def test_show_displays_installed_plugins(app, tester, installed, mocker):
def test_show_displays_installed_plugins_with_multiple_plugins(
app, tester, installed, mocker
app: "PoetryTestApplication",
tester: "CommandTester",
installed: "Repository",
mocker: "MockerFixture",
):
mocker.patch(
"entrypoints.get_group_all",
......@@ -100,7 +121,10 @@ def test_show_displays_installed_plugins_with_multiple_plugins(
def test_show_displays_installed_plugins_with_dependencies(
app, tester, installed, mocker
app: "PoetryTestApplication",
tester: "CommandTester",
installed: "Repository",
mocker: "MockerFixture",
):
mocker.patch(
"entrypoints.get_group_all",
......
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Type
import pytest
......@@ -13,16 +15,29 @@ from poetry.repositories.repository import Repository
from poetry.utils.env import EnvManager
if TYPE_CHECKING:
import httpretty
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.utils.env import VirtualEnv
from tests.types import CommandTesterFactory
FIXTURES = Path(__file__).parent.joinpath("fixtures")
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("self update")
def test_self_update_can_update_from_recommended_installation(
tester, http, mocker, environ, tmp_venv
tester: "CommandTester",
http: Type["httpretty.httpretty"],
mocker: "MockerFixture",
environ: None,
tmp_venv: "VirtualEnv",
):
mocker.patch.object(EnvManager, "get_system_env", return_value=tmp_venv)
......@@ -76,7 +91,11 @@ Poetry ({}) is installed now. Great!
def test_self_update_does_not_update_non_recommended_installation(
tester, http, mocker, environ, tmp_venv
tester: "CommandTester",
http: Type["httpretty.httpretty"],
mocker: "MockerFixture",
environ: None,
tmp_venv: "VirtualEnv",
):
mocker.patch.object(EnvManager, "get_system_env", return_value=tmp_venv)
......
from typing import TYPE_CHECKING
import pytest
from poetry.config.source import Source
if TYPE_CHECKING:
from poetry.poetry import Poetry
from tests.types import CommandTesterFactory
from tests.types import ProjectFactory
@pytest.fixture
def source_one():
def source_one() -> Source:
return Source(name="one", url="https://one.com")
@pytest.fixture
def source_two():
def source_two() -> Source:
return Source(name="two", url="https://two.com")
@pytest.fixture
def source_default():
def source_default() -> Source:
return Source(name="default", url="https://default.com", default=True)
@pytest.fixture
def source_secondary():
def source_secondary() -> Source:
return Source(name="secondary", url="https://secondary.com", secondary=True)
......@@ -27,7 +35,7 @@ _existing_source = Source(name="existing", url="https://existing.com")
@pytest.fixture
def source_existing():
def source_existing() -> Source:
return _existing_source
......@@ -50,14 +58,17 @@ url = "{_existing_source.url}"
@pytest.fixture
def poetry_with_source(project_factory):
def poetry_with_source(project_factory: "ProjectFactory") -> "Poetry":
return project_factory(pyproject_content=PYPROJECT_WITH_SOURCES)
@pytest.fixture
def add_multiple_sources(
command_tester_factory, poetry_with_source, source_one, source_two
):
command_tester_factory: "CommandTesterFactory",
poetry_with_source: "Poetry",
source_one: Source,
source_two: Source,
) -> None:
add = command_tester_factory("source add", poetry=poetry_with_source)
for source in [source_one, source_two]:
add.execute(f"{source.name} {source.url}")
from typing import TYPE_CHECKING
import dataclasses
import pytest
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from poetry.config.source import Source
from poetry.poetry import Poetry
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory, poetry_with_source):
def tester(
command_tester_factory: "CommandTesterFactory", poetry_with_source: "Poetry"
) -> "CommandTester":
return command_tester_factory("source add", poetry=poetry_with_source)
def assert_source_added(tester, poetry, source_existing, source_added):
def assert_source_added(
tester: "CommandTester",
poetry: "Poetry",
source_existing: "Source",
source_added: "Source",
) -> None:
assert (
tester.io.fetch_output().strip()
== f"Adding source with name {source_added.name}."
......@@ -18,26 +35,37 @@ def assert_source_added(tester, poetry, source_existing, source_added):
assert tester.status_code == 0
def test_source_add_simple(tester, source_existing, source_one, poetry_with_source):
def test_source_add_simple(
tester: "CommandTester",
source_existing: "Source",
source_one: "Source",
poetry_with_source: "Poetry",
):
tester.execute(f"{source_one.name} {source_one.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_one)
def test_source_add_default(
tester, source_existing, source_default, poetry_with_source
tester: "CommandTester",
source_existing: "Source",
source_default: "Source",
poetry_with_source: "Poetry",
):
tester.execute(f"--default {source_default.name} {source_default.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_default)
def test_source_add_secondary(
tester, source_existing, source_secondary, poetry_with_source
tester: "CommandTester",
source_existing: "Source",
source_secondary: "Source",
poetry_with_source: "Poetry",
):
tester.execute(f"--secondary {source_secondary.name} {source_secondary.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_secondary)
def test_source_add_error_default_and_secondary(tester):
def test_source_add_error_default_and_secondary(tester: "CommandTester"):
tester.execute("--default --secondary error https://error.com")
assert (
tester.io.fetch_error().strip()
......@@ -46,7 +74,7 @@ def test_source_add_error_default_and_secondary(tester):
assert tester.status_code == 1
def test_source_add_error_pypi(tester):
def test_source_add_error_pypi(tester: "CommandTester"):
tester.execute("pypi https://test.pypi.org/simple/")
assert (
tester.io.fetch_error().strip()
......@@ -55,7 +83,9 @@ def test_source_add_error_pypi(tester):
assert tester.status_code == 1
def test_source_add_existing(tester, source_existing, poetry_with_source):
def test_source_add_existing(
tester: "CommandTester", source_existing: "Source", poetry_with_source: "Poetry"
):
tester.execute(f"--default {source_existing.name} {source_existing.url}")
assert (
tester.io.fetch_output().strip()
......
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from poetry.config.source import Source
from poetry.poetry import Poetry
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory, poetry_with_source, add_multiple_sources):
def tester(
command_tester_factory: "CommandTesterFactory",
poetry_with_source: "Poetry",
add_multiple_sources: None,
) -> "CommandTester":
return command_tester_factory("source remove", poetry=poetry_with_source)
def test_source_remove_simple(
tester, poetry_with_source, source_existing, source_one, source_two
tester: "CommandTester",
poetry_with_source: "Poetry",
source_existing: "Source",
source_one: "Source",
source_two: "Source",
):
tester.execute(f"{source_existing.name}")
assert (
......@@ -22,7 +40,7 @@ def test_source_remove_simple(
assert tester.status_code == 0
def test_source_remove_error(tester):
def test_source_remove_error(tester: "CommandTester"):
tester.execute("error")
assert tester.io.fetch_error().strip() == "Source with name error was not found."
assert tester.status_code == 1
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from poetry.config.source import Source
from poetry.poetry import Poetry
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory, poetry_with_source, add_multiple_sources):
def tester(
command_tester_factory: "CommandTesterFactory",
poetry_with_source: "Poetry",
add_multiple_sources: None,
) -> "CommandTester":
return command_tester_factory("source show", poetry=poetry_with_source)
def test_source_show_simple(tester):
def test_source_show_simple(tester: "CommandTester"):
tester.execute("")
expected = """\
......@@ -32,7 +46,7 @@ secondary : no
assert tester.status_code == 0
def test_source_show_one(tester, source_one):
def test_source_show_one(tester: "CommandTester", source_one: "Source"):
tester.execute(f"{source_one.name}")
expected = """\
......@@ -48,7 +62,9 @@ secondary : no
assert tester.status_code == 0
def test_source_show_two(tester, source_one, source_two):
def test_source_show_two(
tester: "CommandTester", source_one: "Source", source_two: "Source"
):
tester.execute(f"{source_one.name} {source_two.name}")
expected = """\
......@@ -69,7 +85,7 @@ secondary : no
assert tester.status_code == 0
def test_source_show_error(tester):
def test_source_show_error(tester: "CommandTester"):
tester.execute("error")
assert tester.io.fetch_error().strip() == "No source found with name(s): error"
assert tester.status_code == 1
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("about")
def test_about(tester):
def test_about(tester: "CommandTester"):
tester.execute()
expected = """\
Poetry - Package Management for Python
......
import sys
from pathlib import Path
from typing import TYPE_CHECKING
import pytest
......@@ -10,19 +11,34 @@ from tests.helpers import get_dependency
from tests.helpers import get_package
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.installation.noop_installer import NoopInstaller
from poetry.poetry import Poetry
from poetry.utils.env import MockEnv
from poetry.utils.env import VirtualEnv
from tests.helpers import PoetryTestApplication
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("add")
@pytest.fixture()
def old_tester(tester):
def old_tester(tester: "CommandTester") -> "CommandTester":
tester.command.installer.use_executor(False)
return tester
def test_add_no_constraint(app, repo, tester):
def test_add_no_constraint(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -50,7 +66,9 @@ Package operations: 1 install, 0 updates, 0 removals
assert content["dependencies"]["cachy"] == "^0.2.0"
def test_add_no_constraint_editable_error(app, repo, tester):
def test_add_no_constraint_editable_error(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
content = app.poetry.file.read()["tool"]["poetry"]
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -68,7 +86,9 @@ No changes were applied.
assert content == app.poetry.file.read()["tool"]["poetry"]
def test_add_equal_constraint(app, repo, tester):
def test_add_equal_constraint(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -90,7 +110,9 @@ Package operations: 1 install, 0 updates, 0 removals
assert 1 == tester.command.installer.executor.installations_count
def test_add_greater_constraint(app, repo, tester):
def test_add_greater_constraint(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -112,7 +134,9 @@ Package operations: 1 install, 0 updates, 0 removals
assert 1 == tester.command.installer.executor.installations_count
def test_add_constraint_with_extras(app, repo, tester):
def test_add_constraint_with_extras(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
cachy1 = get_package("cachy", "0.1.0")
cachy1.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
......@@ -141,7 +165,9 @@ Package operations: 2 installs, 0 updates, 0 removals
assert 2 == tester.command.installer.executor.installations_count
def test_add_constraint_dependencies(app, repo, tester):
def test_add_constraint_dependencies(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
cachy2 = get_package("cachy", "0.2.0")
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6")
cachy2.add_dependency(msgpack_dep)
......@@ -169,7 +195,12 @@ Package operations: 2 installs, 0 updates, 0 removals
assert 2 == tester.command.installer.executor.installations_count
def test_add_git_constraint(app, repo, tester, tmp_venv):
def test_add_git_constraint(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
tmp_venv: "VirtualEnv",
):
tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4"))
......@@ -201,7 +232,12 @@ Package operations: 2 installs, 0 updates, 0 removals
}
def test_add_git_constraint_with_poetry(app, repo, tester, tmp_venv):
def test_add_git_constraint_with_poetry(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
tmp_venv: "VirtualEnv",
):
tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4"))
......@@ -225,7 +261,12 @@ Package operations: 2 installs, 0 updates, 0 removals
assert 2 == tester.command.installer.executor.installations_count
def test_add_git_constraint_with_extras(app, repo, tester, tmp_venv):
def test_add_git_constraint_with_extras(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
tmp_venv: "VirtualEnv",
):
tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4"))
......@@ -262,7 +303,13 @@ Package operations: 4 installs, 0 updates, 0 removals
@pytest.mark.parametrize("editable", [False, True])
def test_add_git_ssh_constraint(editable, app, repo, tester, tmp_venv):
def test_add_git_ssh_constraint(
editable: bool,
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
tmp_venv: "VirtualEnv",
):
tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4"))
......@@ -302,7 +349,13 @@ Package operations: 2 installs, 0 updates, 0 removals
@pytest.mark.parametrize("editable", [False, True])
def test_add_directory_constraint(editable, app, repo, tester, mocker):
def test_add_directory_constraint(
editable: bool,
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
mocker: "MockerFixture",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__).parent
......@@ -341,7 +394,12 @@ Package operations: 2 installs, 0 updates, 0 removals
assert content["dependencies"]["demo"] == expected
def test_add_directory_with_poetry(app, repo, tester, mocker):
def test_add_directory_with_poetry(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
mocker: "MockerFixture",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -369,7 +427,13 @@ Package operations: 2 installs, 0 updates, 0 removals
assert 2 == tester.command.installer.executor.installations_count
def test_add_file_constraint_wheel(app, repo, tester, mocker, poetry):
def test_add_file_constraint_wheel(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
mocker: "MockerFixture",
poetry: "Poetry",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = poetry.file.parent
......@@ -404,7 +468,12 @@ Package operations: 2 installs, 0 updates, 0 removals
}
def test_add_file_constraint_sdist(app, repo, tester, mocker):
def test_add_file_constraint_sdist(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
mocker: "MockerFixture",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -439,7 +508,9 @@ Package operations: 2 installs, 0 updates, 0 removals
}
def test_add_constraint_with_extras_option(app, repo, tester):
def test_add_constraint_with_extras_option(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
cachy2 = get_package("cachy", "0.2.0")
cachy2.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
......@@ -476,7 +547,12 @@ Package operations: 2 installs, 0 updates, 0 removals
}
def test_add_url_constraint_wheel(app, repo, tester, mocker):
def test_add_url_constraint_wheel(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
mocker: "MockerFixture",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -510,7 +586,12 @@ Package operations: 2 installs, 0 updates, 0 removals
}
def test_add_url_constraint_wheel_with_extras(app, repo, tester, mocker):
def test_add_url_constraint_wheel_with_extras(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
mocker: "MockerFixture",
):
repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cleo", "0.6.5"))
repo.add_package(get_package("tomlkit", "0.5.5"))
......@@ -548,7 +629,9 @@ Package operations: 4 installs, 0 updates, 0 removals
}
def test_add_constraint_with_python(app, repo, tester):
def test_add_constraint_with_python(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
cachy2 = get_package("cachy", "0.2.0")
repo.add_package(get_package("cachy", "0.1.0"))
......@@ -577,7 +660,12 @@ Package operations: 1 install, 0 updates, 0 removals
assert content["dependencies"]["cachy"] == {"version": "0.2.0", "python": ">=2.7"}
def test_add_constraint_with_platform(app, repo, tester, env):
def test_add_constraint_with_platform(
app: "PoetryTestApplication",
repo: "TestRepository",
tester: "CommandTester",
env: "MockEnv",
):
platform = sys.platform
env._platform = platform
......@@ -612,7 +700,9 @@ Package operations: 1 install, 0 updates, 0 removals
}
def test_add_constraint_with_source(app, poetry, tester):
def test_add_constraint_with_source(
app: "PoetryTestApplication", poetry: "Poetry", tester: "CommandTester"
):
repo = LegacyRepository(name="my-index", url="https://my-index.fake")
repo.add_package(get_package("cachy", "0.2.0"))
repo._cache.store("matches").put("cachy:0.2.0", [Version.parse("0.2.0")], 5)
......@@ -645,14 +735,21 @@ Package operations: 1 install, 0 updates, 0 removals
}
def test_add_constraint_with_source_that_does_not_exist(app, tester):
def test_add_constraint_with_source_that_does_not_exist(
app: "PoetryTestApplication", tester: "CommandTester"
):
with pytest.raises(ValueError) as e:
tester.execute("foo --source i-dont-exist")
assert 'Repository "i-dont-exist" does not exist.' == str(e.value)
def test_add_constraint_not_found_with_source(app, poetry, mocker, tester):
def test_add_constraint_not_found_with_source(
app: "PoetryTestApplication",
poetry: "Poetry",
mocker: "MockerFixture",
tester: "CommandTester",
):
repo = LegacyRepository(name="my-index", url="https://my-index.fake")
mocker.patch.object(repo, "find_packages", return_value=[])
......@@ -667,7 +764,9 @@ def test_add_constraint_not_found_with_source(app, poetry, mocker, tester):
assert "Could not find a matching version of package cachy" == str(e.value)
def test_add_to_section_that_does_not_exist_yet(app, repo, tester):
def test_add_to_section_that_does_not_exist_yet(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -704,7 +803,9 @@ cachy = "^0.2.0"
assert expected in content.as_string()
def test_add_to_dev_section_deprecated(app, repo, tester):
def test_add_to_dev_section_deprecated(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -734,7 +835,9 @@ Package operations: 1 install, 0 updates, 0 removals
assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0"
def test_add_should_not_select_prereleases(app, repo, tester):
def test_add_should_not_select_prereleases(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("pyyaml", "3.13"))
repo.add_package(get_package("pyyaml", "4.2b2"))
......@@ -763,7 +866,7 @@ Package operations: 1 install, 0 updates, 0 removals
def test_add_should_skip_when_adding_existing_package_with_no_constraint(
app, repo, tester
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
content = app.poetry.file.read()
content["tool"]["poetry"]["dependencies"]["foo"] = "^1.0"
......@@ -785,7 +888,7 @@ If you prefer to upgrade it to the latest available version, you can use `poetry
def test_add_should_work_when_adding_existing_package_with_latest_constraint(
app, repo, tester
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
content = app.poetry.file.read()
content["tool"]["poetry"]["dependencies"]["foo"] = "^1.0"
......@@ -816,7 +919,9 @@ Package operations: 1 install, 0 updates, 0 removals
assert content["dependencies"]["foo"] == "^1.1.2"
def test_add_chooses_prerelease_if_only_prereleases_are_available(app, repo, tester):
def test_add_chooses_prerelease_if_only_prereleases_are_available(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("foo", "1.2.3b0"))
repo.add_package(get_package("foo", "1.2.3b1"))
......@@ -838,7 +943,9 @@ Package operations: 1 install, 0 updates, 0 removals
assert expected in tester.io.fetch_output()
def test_add_prefers_stable_releases(app, repo, tester):
def test_add_prefers_stable_releases(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
repo.add_package(get_package("foo", "1.2.3"))
repo.add_package(get_package("foo", "1.2.4b1"))
......@@ -860,7 +967,9 @@ Package operations: 1 install, 0 updates, 0 removals
assert expected in tester.io.fetch_output()
def test_add_with_lock(app, repo, tester):
def test_add_with_lock(
app: "PoetryTestApplication", repo: "TestRepository", tester: "CommandTester"
):
content_hash = app.poetry.locker._get_content_hash()
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -879,7 +988,12 @@ Writing lock file
assert content_hash != app.poetry.locker.lock_data["metadata"]["content-hash"]
def test_add_no_constraint_old_installer(app, repo, installer, old_tester):
def test_add_no_constraint_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -908,7 +1022,12 @@ Package operations: 1 install, 0 updates, 0 removals
assert content["dependencies"]["cachy"] == "^0.2.0"
def test_add_equal_constraint_old_installer(app, repo, installer, old_tester):
def test_add_equal_constraint_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -931,7 +1050,12 @@ Package operations: 1 install, 0 updates, 0 removals
assert len(installer.installs) == 1
def test_add_greater_constraint_old_installer(app, repo, installer, old_tester):
def test_add_greater_constraint_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -954,7 +1078,12 @@ Package operations: 1 install, 0 updates, 0 removals
assert len(installer.installs) == 1
def test_add_constraint_with_extras_old_installer(app, repo, installer, old_tester):
def test_add_constraint_with_extras_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
cachy1 = get_package("cachy", "0.1.0")
cachy1.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
......@@ -984,7 +1113,12 @@ Package operations: 2 installs, 0 updates, 0 removals
assert len(installer.installs) == 2
def test_add_constraint_dependencies_old_installer(app, repo, installer, old_tester):
def test_add_constraint_dependencies_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
cachy2 = get_package("cachy", "0.2.0")
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6")
cachy2.add_dependency(msgpack_dep)
......@@ -1013,7 +1147,12 @@ Package operations: 2 installs, 0 updates, 0 removals
assert len(installer.installs) == 2
def test_add_git_constraint_old_installer(app, repo, installer, old_tester):
def test_add_git_constraint_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cleo", "0.6.5"))
......@@ -1044,7 +1183,12 @@ Package operations: 2 installs, 0 updates, 0 removals
}
def test_add_git_constraint_with_poetry_old_installer(app, repo, installer, old_tester):
def test_add_git_constraint_with_poetry_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("pendulum", "1.4.4"))
old_tester.execute("git+https://github.com/demo/pyproject-demo.git")
......@@ -1067,7 +1211,12 @@ Package operations: 2 installs, 0 updates, 0 removals
assert len(installer.installs) == 2
def test_add_git_constraint_with_extras_old_installer(app, repo, installer, old_tester):
def test_add_git_constraint_with_extras_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cleo", "0.6.5"))
repo.add_package(get_package("tomlkit", "0.5.5"))
......@@ -1102,7 +1251,12 @@ Package operations: 4 installs, 0 updates, 0 removals
}
def test_add_git_ssh_constraint_old_installer(app, repo, installer, old_tester):
def test_add_git_ssh_constraint_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cleo", "0.6.5"))
......@@ -1135,7 +1289,11 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_directory_constraint_old_installer(
app, repo, installer, mocker, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
mocker: "MockerFixture",
old_tester: "CommandTester",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -1172,7 +1330,11 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_directory_with_poetry_old_installer(
app, repo, installer, mocker, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
mocker: "MockerFixture",
old_tester: "CommandTester",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -1203,7 +1365,11 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_file_constraint_wheel_old_installer(
app, repo, installer, mocker, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
mocker: "MockerFixture",
old_tester: "CommandTester",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -1241,7 +1407,11 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_file_constraint_sdist_old_installer(
app, repo, installer, mocker, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
mocker: "MockerFixture",
old_tester: "CommandTester",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -1279,7 +1449,10 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_constraint_with_extras_option_old_installer(
app, repo, installer, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
cachy2 = get_package("cachy", "0.2.0")
cachy2.extras = {"msgpack": [get_dependency("msgpack-python")]}
......@@ -1319,7 +1492,11 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_url_constraint_wheel_old_installer(
app, repo, installer, mocker, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
mocker: "MockerFixture",
old_tester: "CommandTester",
):
p = mocker.patch("pathlib.Path.cwd")
p.return_value = Path(__file__) / ".."
......@@ -1356,7 +1533,10 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_url_constraint_wheel_with_extras_old_installer(
app, repo, installer, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cleo", "0.6.5"))
......@@ -1394,7 +1574,12 @@ Package operations: 4 installs, 0 updates, 0 removals
}
def test_add_constraint_with_python_old_installer(app, repo, installer, old_tester):
def test_add_constraint_with_python_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
cachy2 = get_package("cachy", "0.2.0")
repo.add_package(get_package("cachy", "0.1.0"))
......@@ -1425,7 +1610,11 @@ Package operations: 1 install, 0 updates, 0 removals
def test_add_constraint_with_platform_old_installer(
app, repo, installer, env, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
env: "MockEnv",
old_tester: "CommandTester",
):
platform = sys.platform
env._platform = platform
......@@ -1462,7 +1651,12 @@ Package operations: 1 install, 0 updates, 0 removals
}
def test_add_constraint_with_source_old_installer(app, poetry, installer, old_tester):
def test_add_constraint_with_source_old_installer(
app: "PoetryTestApplication",
poetry: "Poetry",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo = LegacyRepository(name="my-index", url="https://my-index.fake")
repo.add_package(get_package("cachy", "0.2.0"))
repo._cache.store("matches").put("cachy:0.2.0", [Version.parse("0.2.0")], 5)
......@@ -1496,7 +1690,9 @@ Package operations: 1 install, 0 updates, 0 removals
}
def test_add_constraint_with_source_that_does_not_exist_old_installer(app, old_tester):
def test_add_constraint_with_source_that_does_not_exist_old_installer(
app: "PoetryTestApplication", old_tester: "CommandTester"
):
with pytest.raises(ValueError) as e:
old_tester.execute("foo --source i-dont-exist")
......@@ -1504,7 +1700,10 @@ def test_add_constraint_with_source_that_does_not_exist_old_installer(app, old_t
def test_add_constraint_not_found_with_source_old_installer(
app, poetry, mocker, old_tester
app: "PoetryTestApplication",
poetry: "Poetry",
mocker: "MockerFixture",
old_tester: "CommandTester",
):
repo = LegacyRepository(name="my-index", url="https://my-index.fake")
mocker.patch.object(repo, "find_packages", return_value=[])
......@@ -1521,7 +1720,10 @@ def test_add_constraint_not_found_with_source_old_installer(
def test_add_to_section_that_does_no_exist_yet_old_installer(
app, repo, installer, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(get_package("cachy", "0.2.0"))
......@@ -1552,7 +1754,10 @@ Package operations: 1 install, 0 updates, 0 removals
def test_add_should_not_select_prereleases_old_installer(
app, repo, installer, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("pyyaml", "3.13"))
repo.add_package(get_package("pyyaml", "4.2b2"))
......@@ -1583,7 +1788,10 @@ Package operations: 1 install, 0 updates, 0 removals
def test_add_should_skip_when_adding_existing_package_with_no_constraint_old_installer(
app, repo, installer, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
content = app.poetry.file.read()
content["tool"]["poetry"]["dependencies"]["foo"] = "^1.0"
......@@ -1606,7 +1814,10 @@ If you prefer to upgrade it to the latest available version, you can use `poetry
def test_add_should_work_when_adding_existing_package_with_latest_constraint_old_installer(
app, repo, installer, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
content = app.poetry.file.read()
content["tool"]["poetry"]["dependencies"]["foo"] = "^1.0"
......@@ -1638,7 +1849,10 @@ Package operations: 1 install, 0 updates, 0 removals
def test_add_chooses_prerelease_if_only_prereleases_are_available_old_installer(
app, repo, installer, old_tester
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("foo", "1.2.3b0"))
repo.add_package(get_package("foo", "1.2.3b1"))
......@@ -1661,7 +1875,12 @@ Package operations: 1 install, 0 updates, 0 removals
assert expected in old_tester.io.fetch_output()
def test_add_preferes_stable_releases_old_installer(app, repo, installer, old_tester):
def test_add_preferes_stable_releases_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("foo", "1.2.3"))
repo.add_package(get_package("foo", "1.2.4b1"))
......@@ -1683,7 +1902,12 @@ Package operations: 1 install, 0 updates, 0 removals
assert expected in old_tester.io.fetch_output()
def test_add_with_lock_old_installer(app, repo, installer, old_tester):
def test_add_with_lock_old_installer(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
old_tester: "CommandTester",
):
repo.add_package(get_package("cachy", "0.2.0"))
old_tester.execute("cachy --lock")
......@@ -1700,7 +1924,13 @@ Writing lock file
assert expected == old_tester.io.fetch_output()
def test_add_keyboard_interrupt_restore_content(app, repo, installer, tester, mocker):
def test_add_keyboard_interrupt_restore_content(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
tester: "CommandTester",
mocker: "MockerFixture",
):
mocker.patch(
"poetry.installation.installer.Installer.run", side_effect=KeyboardInterrupt()
)
......@@ -1713,7 +1943,12 @@ def test_add_keyboard_interrupt_restore_content(app, repo, installer, tester, mo
assert original_content == app.poetry.file.read()
def test_dry_run_restore_original_content(app, repo, installer, tester):
def test_dry_run_restore_original_content(
app: "PoetryTestApplication",
repo: "TestRepository",
installer: "NoopInstaller",
tester: "CommandTester",
):
original_content = app.poetry.file.read()
repo.add_package(get_package("cachy", "0.2.0"))
......
import uuid
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from pathlib import Path
from _pytest.monkeypatch import MonkeyPatch
from cleo.testers.command_tester import CommandTester
from tests.types import CommandTesterFactory
@pytest.fixture
def repository_cache_dir(monkeypatch, tmpdir):
def repository_cache_dir(monkeypatch: "MonkeyPatch", tmpdir: "Path") -> "Path":
from pathlib import Path
import poetry.locations
......@@ -15,27 +26,31 @@ def repository_cache_dir(monkeypatch, tmpdir):
@pytest.fixture
def repository_one():
def repository_one() -> str:
return f"01_{uuid.uuid4()}"
@pytest.fixture
def repository_two():
def repository_two() -> str:
return f"02_{uuid.uuid4()}"
@pytest.fixture
def mock_caches(repository_cache_dir, repository_one, repository_two):
def mock_caches(
repository_cache_dir: "Path", repository_one: str, repository_two: str
) -> None:
(repository_cache_dir / repository_one).mkdir()
(repository_cache_dir / repository_two).mkdir()
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("cache list")
def test_cache_list(tester, mock_caches, repository_one, repository_two):
def test_cache_list(
tester: "CommandTester", mock_caches: None, repository_one: str, repository_two: str
):
tester.execute()
expected = """\
......@@ -48,7 +63,7 @@ def test_cache_list(tester, mock_caches, repository_one, repository_two):
assert expected == tester.io.fetch_output()
def test_cache_list_empty(tester, repository_cache_dir):
def test_cache_list_empty(tester: "CommandTester", repository_cache_dir: "Path"):
tester.execute()
expected = """\
......
from pathlib import Path
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("check")
def test_check_valid(tester):
def test_check_valid(tester: "CommandTester"):
tester.execute()
expected = """\
......@@ -18,7 +26,7 @@ All set!
assert expected == tester.io.fetch_output()
def test_check_invalid(mocker, tester):
def test_check_invalid(mocker: "MockerFixture", tester: "CommandTester"):
mocker.patch(
"poetry.factory.Factory.locate",
return_value=Path(__file__).parent.parent.parent
......
import json
import os
from typing import TYPE_CHECKING
from typing import Callable
import pytest
from poetry.config.config_source import ConfigSource
......@@ -8,12 +11,25 @@ from poetry.core.pyproject.exceptions import PyProjectException
from poetry.factory import Factory
if TYPE_CHECKING:
from pathlib import Path
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.config.dict_config_source import DictConfigSource
from tests.conftest import Config
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("config")
def test_show_config_with_local_config_file_empty(tester, mocker):
def test_show_config_with_local_config_file_empty(
tester: "CommandTester", mocker: "MockerFixture"
):
mocker.patch(
"poetry.factory.Factory.create_poetry",
side_effect=PyProjectException("[tool.poetry] section not found"),
......@@ -23,7 +39,9 @@ def test_show_config_with_local_config_file_empty(tester, mocker):
assert "" == tester.io.fetch_output()
def test_list_displays_default_value_if_not_set(tester, config, config_cache_dir):
def test_list_displays_default_value_if_not_set(
tester: "CommandTester", config: "Config", config_cache_dir: "Path"
):
tester.execute("--list")
expected = """cache-dir = {cache}
......@@ -43,7 +61,9 @@ virtualenvs.path = {path} # {virtualenvs}
assert expected == tester.io.fetch_output()
def test_list_displays_set_get_setting(tester, config, config_cache_dir):
def test_list_displays_set_get_setting(
tester: "CommandTester", config: "Config", config_cache_dir: "Path"
):
tester.execute("virtualenvs.create false")
tester.execute("--list")
......@@ -66,7 +86,7 @@ virtualenvs.path = {path} # {virtualenvs}
assert expected == tester.io.fetch_output()
def test_display_single_setting(tester, config):
def test_display_single_setting(tester: "CommandTester", config: "Config"):
tester.execute("virtualenvs.create")
expected = """true
......@@ -75,7 +95,9 @@ def test_display_single_setting(tester, config):
assert expected == tester.io.fetch_output()
def test_display_single_local_setting(command_tester_factory, fixture_dir):
def test_display_single_local_setting(
command_tester_factory: "CommandTesterFactory", fixture_dir: Callable[[str], "Path"]
):
tester = command_tester_factory(
"config", poetry=Factory().create_poetry(fixture_dir("with_local_config"))
)
......@@ -87,7 +109,9 @@ def test_display_single_local_setting(command_tester_factory, fixture_dir):
assert expected == tester.io.fetch_output()
def test_list_displays_set_get_local_setting(tester, config, config_cache_dir):
def test_list_displays_set_get_local_setting(
tester: "CommandTester", config: "Config", config_cache_dir: "Path"
):
tester.execute("virtualenvs.create false --local")
tester.execute("--list")
......@@ -110,14 +134,20 @@ virtualenvs.path = {path} # {virtualenvs}
assert expected == tester.io.fetch_output()
def test_set_pypi_token(tester, auth_config_source):
def test_set_pypi_token(
tester: "CommandTester", auth_config_source: "DictConfigSource"
):
tester.execute("pypi-token.pypi mytoken")
tester.execute("--list")
assert "mytoken" == auth_config_source.config["pypi-token"]["pypi"]
def test_set_client_cert(tester, auth_config_source, mocker):
def test_set_client_cert(
tester: "CommandTester",
auth_config_source: "DictConfigSource",
mocker: "MockerFixture",
):
mocker.spy(ConfigSource, "__init__")
tester.execute("certificates.foo.client-cert path/to/cert.pem")
......@@ -128,7 +158,11 @@ def test_set_client_cert(tester, auth_config_source, mocker):
)
def test_set_cert(tester, auth_config_source, mocker):
def test_set_cert(
tester: "CommandTester",
auth_config_source: "DictConfigSource",
mocker: "MockerFixture",
):
mocker.spy(ConfigSource, "__init__")
tester.execute("certificates.foo.cert path/to/ca.pem")
......@@ -136,7 +170,9 @@ def test_set_cert(tester, auth_config_source, mocker):
assert "path/to/ca.pem" == auth_config_source.config["certificates"]["foo"]["cert"]
def test_config_installer_parallel(tester, command_tester_factory):
def test_config_installer_parallel(
tester: "CommandTester", command_tester_factory: "CommandTesterFactory"
):
tester.execute("--local installer.parallel")
assert tester.io.fetch_output().strip() == "true"
......
from typing import TYPE_CHECKING
from unittest.mock import ANY
from unittest.mock import Mock
......@@ -7,6 +8,16 @@ from poetry.console.commands.export import Exporter
from tests.helpers import get_package
if TYPE_CHECKING:
from _pytest.monkeypatch import MonkeyPatch
from cleo.testers.command_tester import CommandTester
from poetry.poetry import Poetry
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
from tests.types import ProjectFactory
PYPROJECT_CONTENT = """\
[tool.poetry]
name = "simple-project"
......@@ -42,22 +53,24 @@ feature_bar = ["bar"]
@pytest.fixture(autouse=True)
def setup(repo):
def setup(repo: "TestRepository") -> None:
repo.add_package(get_package("foo", "1.0.0"))
repo.add_package(get_package("bar", "1.1.0"))
@pytest.fixture
def poetry(project_factory):
def poetry(project_factory: "ProjectFactory") -> "Poetry":
return project_factory(name="export", pyproject_content=PYPROJECT_CONTENT)
@pytest.fixture
def tester(command_tester_factory, poetry):
def tester(
command_tester_factory: "CommandTesterFactory", poetry: "Poetry"
) -> "CommandTester":
return command_tester_factory("export", poetry=poetry)
def _export_requirements(tester, poetry):
def _export_requirements(tester: "CommandTester", poetry: "Poetry") -> None:
tester.execute("--format requirements.txt --output requirements.txt")
requirements = poetry.file.parent / "requirements.txt"
......@@ -75,23 +88,27 @@ foo==1.0.0
assert expected == content
def test_export_exports_requirements_txt_file_locks_if_no_lock_file(tester, poetry):
def test_export_exports_requirements_txt_file_locks_if_no_lock_file(
tester: "CommandTester", poetry: "Poetry"
):
assert not poetry.locker.lock.exists()
_export_requirements(tester, poetry)
assert "The lock file does not exist. Locking." in tester.io.fetch_error()
def test_export_exports_requirements_txt_uses_lock_file(tester, poetry, do_lock):
def test_export_exports_requirements_txt_uses_lock_file(
tester: "CommandTester", poetry: "Poetry", do_lock: None
):
_export_requirements(tester, poetry)
assert "The lock file does not exist. Locking." not in tester.io.fetch_error()
def test_export_fails_on_invalid_format(tester, do_lock):
def test_export_fails_on_invalid_format(tester: "CommandTester", do_lock: None):
with pytest.raises(ValueError):
tester.execute("--format invalid")
def test_export_prints_to_stdout_by_default(tester, do_lock):
def test_export_prints_to_stdout_by_default(tester: "CommandTester", do_lock: None):
tester.execute("--format requirements.txt")
expected = """\
foo==1.0.0
......@@ -99,7 +116,9 @@ foo==1.0.0
assert expected == tester.io.fetch_output()
def test_export_uses_requirements_txt_format_by_default(tester, do_lock):
def test_export_uses_requirements_txt_format_by_default(
tester: "CommandTester", do_lock: None
):
tester.execute()
expected = """\
foo==1.0.0
......@@ -107,7 +126,7 @@ foo==1.0.0
assert expected == tester.io.fetch_output()
def test_export_includes_extras_by_flag(tester, do_lock):
def test_export_includes_extras_by_flag(tester: "CommandTester", do_lock: None):
tester.execute("--format requirements.txt --extras feature_bar")
expected = """\
bar==1.1.0
......@@ -116,7 +135,9 @@ foo==1.0.0
assert expected == tester.io.fetch_output()
def test_export_with_urls(monkeypatch, tester, poetry):
def test_export_with_urls(
monkeypatch: "MonkeyPatch", tester: "CommandTester", poetry: "Poetry"
):
"""
We are just validating that the option gets passed. The option itself is tested in
the Exporter test.
......
......@@ -3,6 +3,9 @@ import shutil
import sys
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Callable
from typing import Iterator
import pytest
......@@ -14,8 +17,15 @@ from tests.helpers import PoetryTestApplication
from tests.helpers import get_package
if TYPE_CHECKING:
from pytest_mock import MockerFixture
from poetry.poetry import Poetry
from tests.helpers import TestRepository
@pytest.fixture
def source_dir(tmp_path) -> Path:
def source_dir(tmp_path: Path) -> Iterator[Path]:
cwd = os.getcwd()
try:
......@@ -26,7 +36,7 @@ def source_dir(tmp_path) -> Path:
@pytest.fixture
def patches(mocker, source_dir, repo):
def patches(mocker: "MockerFixture", source_dir: Path, repo: "TestRepository") -> None:
mocker.patch("pathlib.Path.cwd", return_value=source_dir)
mocker.patch(
"poetry.console.commands.init.InitCommand._get_pool", return_value=Pool([repo])
......@@ -34,14 +44,14 @@ def patches(mocker, source_dir, repo):
@pytest.fixture
def tester(patches):
def tester(patches: None) -> CommandTester:
# we need a test application without poetry here.
app = PoetryTestApplication(None)
return CommandTester(app.find("init"))
@pytest.fixture
def init_basic_inputs():
def init_basic_inputs() -> str:
return "\n".join(
[
"my-package", # Package name
......@@ -58,7 +68,7 @@ def init_basic_inputs():
@pytest.fixture()
def init_basic_toml():
def init_basic_toml() -> str:
return """\
[tool.poetry]
name = "my-package"
......@@ -74,12 +84,20 @@ python = "~2.7 || ^3.6"
"""
def test_basic_interactive(tester, init_basic_inputs, init_basic_toml):
def test_basic_interactive(
tester: CommandTester, init_basic_inputs: str, init_basic_toml: str
):
tester.execute(inputs=init_basic_inputs)
assert init_basic_toml in tester.io.fetch_output()
def test_noninteractive(app, mocker, poetry, repo, tmp_path):
def test_noninteractive(
app: PoetryTestApplication,
mocker: "MockerFixture",
poetry: "Poetry",
repo: "TestRepository",
tmp_path: Path,
):
command = app.find("init")
command._pool = poetry.pool
......@@ -101,7 +119,7 @@ def test_noninteractive(app, mocker, poetry, repo, tmp_path):
assert 'pytest = "^3.6.0"' in toml_content
def test_interactive_with_dependencies(tester, repo):
def test_interactive_with_dependencies(tester: CommandTester, repo: "TestRepository"):
repo.add_package(get_package("django-pendulum", "0.1.6-pre4"))
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))
......@@ -148,7 +166,7 @@ pytest = "^3.6.0"
assert expected in tester.io.fetch_output()
def test_empty_license(tester):
def test_empty_license(tester: CommandTester):
inputs = [
"my-package", # Package name
"1.2.3", # Version
......@@ -179,7 +197,9 @@ python = "^{python}"
assert expected in tester.io.fetch_output()
def test_interactive_with_git_dependencies(tester, repo):
def test_interactive_with_git_dependencies(
tester: CommandTester, repo: "TestRepository"
):
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))
......@@ -223,7 +243,9 @@ pytest = "^3.6.0"
assert expected in tester.io.fetch_output()
def test_interactive_with_git_dependencies_with_reference(tester, repo):
def test_interactive_with_git_dependencies_with_reference(
tester: CommandTester, repo: "TestRepository"
):
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))
......@@ -267,7 +289,9 @@ pytest = "^3.6.0"
assert expected in tester.io.fetch_output()
def test_interactive_with_git_dependencies_and_other_name(tester, repo):
def test_interactive_with_git_dependencies_and_other_name(
tester: CommandTester, repo: "TestRepository"
):
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))
......@@ -311,7 +335,12 @@ pytest = "^3.6.0"
assert expected in tester.io.fetch_output()
def test_interactive_with_directory_dependency(tester, repo, source_dir, fixture_dir):
def test_interactive_with_directory_dependency(
tester: CommandTester,
repo: "TestRepository",
source_dir: Path,
fixture_dir: Callable[[str], Path],
):
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))
......@@ -358,7 +387,10 @@ pytest = "^3.6.0"
def test_interactive_with_directory_dependency_and_other_name(
tester, repo, source_dir, fixture_dir
tester: CommandTester,
repo: "TestRepository",
source_dir: Path,
fixture_dir: Callable[[str], Path],
):
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))
......@@ -406,7 +438,12 @@ pytest = "^3.6.0"
assert expected in tester.io.fetch_output()
def test_interactive_with_file_dependency(tester, repo, source_dir, fixture_dir):
def test_interactive_with_file_dependency(
tester: CommandTester,
repo: "TestRepository",
source_dir: Path,
fixture_dir: Callable[[str], Path],
):
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))
......@@ -453,7 +490,7 @@ pytest = "^3.6.0"
assert expected in tester.io.fetch_output()
def test_python_option(tester):
def test_python_option(tester: CommandTester):
inputs = [
"my-package", # Package name
"1.2.3", # Version
......@@ -483,7 +520,7 @@ python = "~2.7 || ^3.6"
assert expected in tester.io.fetch_output()
def test_predefined_dependency(tester, repo):
def test_predefined_dependency(tester: CommandTester, repo: "TestRepository"):
repo.add_package(get_package("pendulum", "2.0.0"))
inputs = [
......@@ -517,7 +554,9 @@ pendulum = "^2.0.0"
assert expected in tester.io.fetch_output()
def test_predefined_and_interactive_dependencies(tester, repo):
def test_predefined_and_interactive_dependencies(
tester: CommandTester, repo: "TestRepository"
):
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pyramid", "1.10"))
......@@ -558,7 +597,7 @@ python = "~2.7 || ^3.6"
assert 'pyramid = "^1.10"' in output
def test_predefined_dev_dependency(tester, repo):
def test_predefined_dev_dependency(tester: CommandTester, repo: "TestRepository"):
repo.add_package(get_package("pytest", "3.6.0"))
inputs = [
......@@ -595,7 +634,9 @@ pytest = "^3.6.0"
assert expected in tester.io.fetch_output()
def test_predefined_and_interactive_dev_dependencies(tester, repo):
def test_predefined_and_interactive_dev_dependencies(
tester: CommandTester, repo: "TestRepository"
):
repo.add_package(get_package("pytest", "3.6.0"))
repo.add_package(get_package("pytest-requests", "0.2.0"))
......@@ -641,7 +682,7 @@ pytest-requests = "^0.2.0"
assert 'pytest = "^3.6.0"' in output
def test_add_package_with_extras_and_whitespace(tester):
def test_add_package_with_extras_and_whitespace(tester: CommandTester):
result = tester.command._parse_requirements(["databases[postgresql, sqlite]"])
assert result[0]["name"] == "databases"
......@@ -651,7 +692,10 @@ def test_add_package_with_extras_and_whitespace(tester):
def test_init_existing_pyproject_simple(
tester, source_dir, init_basic_inputs, init_basic_toml
tester: CommandTester,
source_dir: Path,
init_basic_inputs: str,
init_basic_toml: str,
):
pyproject_file = source_dir / "pyproject.toml"
existing_section = """
......@@ -664,7 +708,10 @@ line-length = 88
def test_init_non_interactive_existing_pyproject_add_dependency(
tester, source_dir, init_basic_inputs, repo
tester: CommandTester,
source_dir: Path,
init_basic_inputs: str,
repo: "TestRepository",
):
pyproject_file = source_dir / "pyproject.toml"
existing_section = """
......@@ -700,7 +747,7 @@ foo = "^1.19.2"
def test_init_existing_pyproject_with_build_system_fails(
tester, source_dir, init_basic_inputs
tester: CommandTester, source_dir: Path, init_basic_inputs: str
):
pyproject_file = source_dir / "pyproject.toml"
existing_section = """
......
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("install")
def test_group_options_are_passed_to_the_installer(tester, mocker):
def test_group_options_are_passed_to_the_installer(
tester: "CommandTester", mocker: "MockerFixture"
):
"""
Group options are passed properly to the installer.
"""
......@@ -19,7 +30,9 @@ def test_group_options_are_passed_to_the_installer(tester, mocker):
assert tester.command.installer._only_groups == ["bam"]
def test_sync_option_is_passed_to_the_installer(tester, mocker):
def test_sync_option_is_passed_to_the_installer(
tester: "CommandTester", mocker: "MockerFixture"
):
"""
The --sync option is passed properly to the installer.
"""
......
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Callable
from typing import Type
import pytest
......@@ -6,17 +9,32 @@ from poetry.packages import Locker
from tests.helpers import get_package
if TYPE_CHECKING:
import httpretty
from cleo.testers.command_tester import CommandTester
from poetry.poetry import Poetry
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
from tests.types import ProjectFactory
@pytest.fixture
def source_dir(tmp_path: Path) -> Path:
yield Path(tmp_path.as_posix())
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("lock")
def _project_factory(fixture_name, project_factory, fixture_dir):
def _project_factory(
fixture_name: str,
project_factory: "ProjectFactory",
fixture_dir: Callable[[str], Path],
) -> "Poetry":
source = fixture_dir(fixture_name)
pyproject_content = (source / "pyproject.toml").read_text(encoding="utf-8")
poetry_lock_content = (source / "poetry.lock").read_text(encoding="utf-8")
......@@ -28,22 +46,30 @@ def _project_factory(fixture_name, project_factory, fixture_dir):
@pytest.fixture
def poetry_with_outdated_lockfile(project_factory, fixture_dir):
def poetry_with_outdated_lockfile(
project_factory: "ProjectFactory", fixture_dir: Callable[[str], Path]
) -> "Poetry":
return _project_factory("outdated_lock", project_factory, fixture_dir)
@pytest.fixture
def poetry_with_up_to_date_lockfile(project_factory, fixture_dir):
def poetry_with_up_to_date_lockfile(
project_factory: "ProjectFactory", fixture_dir: Callable[[str], Path]
) -> "Poetry":
return _project_factory("up_to_date_lock", project_factory, fixture_dir)
@pytest.fixture
def poetry_with_old_lockfile(project_factory, fixture_dir):
def poetry_with_old_lockfile(
project_factory: "ProjectFactory", fixture_dir: Callable[[str], Path]
) -> "Poetry":
return _project_factory("old_lock", project_factory, fixture_dir)
def test_lock_check_outdated(
command_tester_factory, poetry_with_outdated_lockfile, http
command_tester_factory: "CommandTesterFactory",
poetry_with_outdated_lockfile: "Poetry",
http: Type["httpretty.httpretty"],
):
http.disable()
......@@ -61,7 +87,9 @@ def test_lock_check_outdated(
def test_lock_check_up_to_date(
command_tester_factory, poetry_with_up_to_date_lockfile, http
command_tester_factory: "CommandTesterFactory",
poetry_with_up_to_date_lockfile: "Poetry",
http: Type["httpretty.httpretty"],
):
http.disable()
......@@ -78,7 +106,11 @@ def test_lock_check_up_to_date(
assert status_code == 0
def test_lock_no_update(command_tester_factory, poetry_with_old_lockfile, repo):
def test_lock_no_update(
command_tester_factory: "CommandTesterFactory",
poetry_with_old_lockfile: "Poetry",
repo: "TestRepository",
):
repo.add_package(get_package("sampleproject", "1.3.1"))
repo.add_package(get_package("sampleproject", "2.0.0"))
......
from pathlib import Path
from typing import TYPE_CHECKING
from typing import List
from typing import Optional
import pytest
......@@ -8,11 +9,14 @@ from poetry.factory import Factory
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from poetry.poetry import Poetry
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("new")
......@@ -139,7 +143,13 @@ def verify_project_directory(
],
)
def test_command_new(
options, directory, package_name, package_path, include_from, tester, tmp_dir
options: List[str],
directory: str,
package_name: str,
package_path: str,
include_from: Optional[str],
tester: "CommandTester",
tmp_dir: str,
):
path = Path(tmp_dir) / directory
options.append(path.as_posix())
......@@ -148,7 +158,9 @@ def test_command_new(
@pytest.mark.parametrize("fmt", [(None,), ("md",), ("rst",)])
def test_command_new_with_readme(fmt, tester, tmp_dir):
def test_command_new_with_readme(
fmt: Optional[str], tester: "CommandTester", tmp_dir: str
):
fmt = "md"
package = "package"
path = Path(tmp_dir) / package
......
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Any
from typing import Type
import pytest
import requests
......@@ -6,7 +9,20 @@ import requests
from poetry.publishing.uploader import UploadError
def test_publish_returns_non_zero_code_for_upload_errors(app, app_tester, http):
if TYPE_CHECKING:
import httpretty
from cleo.testers.application_tester import ApplicationTester
from pytest_mock import MockerFixture
from tests.helpers import PoetryTestApplication
def test_publish_returns_non_zero_code_for_upload_errors(
app: "PoetryTestApplication",
app_tester: "ApplicationTester",
http: Type["httpretty.httpretty"],
):
http.register_uri(
http.POST, "https://upload.pypi.org/legacy/", status=400, body="Bad Request"
)
......@@ -29,8 +45,12 @@ Publishing simple-project (1.2.3) to PyPI
@pytest.mark.filterwarnings("ignore::pytest.PytestUnhandledThreadExceptionWarning")
def test_publish_returns_non_zero_code_for_connection_errors(app, app_tester, http):
def request_callback(*_, **__):
def test_publish_returns_non_zero_code_for_connection_errors(
app: "PoetryTestApplication",
app_tester: "ApplicationTester",
http: Type["httpretty.httpretty"],
):
def request_callback(*_: Any, **__: Any) -> None:
raise requests.ConnectionError()
http.register_uri(
......@@ -46,7 +66,7 @@ def test_publish_returns_non_zero_code_for_connection_errors(app, app_tester, ht
assert expected in app_tester.io.fetch_error()
def test_publish_with_cert(app_tester, mocker):
def test_publish_with_cert(app_tester: "ApplicationTester", mocker: "MockerFixture"):
publisher_publish = mocker.patch("poetry.publishing.Publisher.publish")
app_tester.execute("publish --cert path/to/ca.pem")
......@@ -56,7 +76,9 @@ def test_publish_with_cert(app_tester, mocker):
] == publisher_publish.call_args
def test_publish_with_client_cert(app_tester, mocker):
def test_publish_with_client_cert(
app_tester: "ApplicationTester", mocker: "MockerFixture"
):
publisher_publish = mocker.patch("poetry.publishing.Publisher.publish")
app_tester.execute("publish --client-cert path/to/client.pem")
......@@ -65,7 +87,9 @@ def test_publish_with_client_cert(app_tester, mocker):
] == publisher_publish.call_args
def test_publish_dry_run(app_tester, http):
def test_publish_dry_run(
app_tester: "ApplicationTester", http: Type["httpretty.httpretty"]
):
http.register_uri(
http.POST, "https://upload.pypi.org/legacy/", status=403, body="Forbidden"
)
......
from typing import TYPE_CHECKING
import pytest
import tomlkit
......@@ -5,13 +7,27 @@ from poetry.core.packages.package import Package
from poetry.factory import Factory
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.repositories import Repository
from tests.helpers import PoetryTestApplication
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
@pytest.fixture()
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("remove")
def test_remove_without_specific_group_removes_from_all_groups(
tester, app, repo, command_tester_factory, installed
tester: "CommandTester",
app: "PoetryTestApplication",
repo: "TestRepository",
command_tester_factory: "CommandTesterFactory",
installed: "Repository",
):
"""
Removing without specifying a group removes packages from all groups.
......@@ -62,7 +78,11 @@ baz = "^1.0.0"
def test_remove_without_specific_group_removes_from_specific_groups(
tester, app, repo, command_tester_factory, installed
tester: "CommandTester",
app: "PoetryTestApplication",
repo: "TestRepository",
command_tester_factory: "CommandTesterFactory",
installed: "Repository",
):
"""
Removing with a specific group given removes packages only from this group.
......@@ -113,7 +133,11 @@ baz = "^1.0.0"
def test_remove_does_not_live_empty_groups(
tester, app, repo, command_tester_factory, installed
tester: "CommandTester",
app: "PoetryTestApplication",
repo: "TestRepository",
command_tester_factory: "CommandTesterFactory",
installed: "Repository",
):
"""
Empty groups are automatically discarded after package removal.
......@@ -157,7 +181,11 @@ baz = "^1.0.0"
def test_remove_command_should_not_write_changes_upon_installer_errors(
tester, app, repo, command_tester_factory, mocker
tester: "CommandTester",
app: "PoetryTestApplication",
repo: "TestRepository",
command_tester_factory: "CommandTesterFactory",
mocker: "MockerFixture",
):
repo.add_package(Package("foo", "2.0.0"))
......
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from cleo.testers.application_tester import ApplicationTester
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.utils.env import MockEnv
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("run")
@pytest.fixture(autouse=True)
def patches(mocker, env):
def patches(mocker: "MockerFixture", env: "MockEnv") -> None:
mocker.patch("poetry.utils.env.EnvManager.get", return_value=env)
def test_run_passes_all_args(app_tester, env):
def test_run_passes_all_args(app_tester: "ApplicationTester", env: "MockEnv"):
app_tester.execute("run python -V")
assert [["python", "-V"]] == env.executed
def test_run_keeps_options_passed_before_command(app_tester, env):
def test_run_keeps_options_passed_before_command(
app_tester: "ApplicationTester", env: "MockEnv"
):
app_tester.execute("-V --no-ansi run python", decorated=True)
assert not app_tester.io.is_decorated()
......
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Type
import pytest
if TYPE_CHECKING:
import httpretty
from cleo.testers.command_tester import CommandTester
from tests.types import CommandTesterFactory
TESTS_DIRECTORY = Path(__file__).parent.parent.parent
FIXTURES_DIRECTORY = (
TESTS_DIRECTORY / "repositories" / "fixtures" / "pypi.org" / "search"
......@@ -10,20 +19,17 @@ FIXTURES_DIRECTORY = (
@pytest.fixture(autouse=True)
def mock_search_http_response(http):
def mock_search_http_response(http: Type["httpretty.httpretty"]) -> None:
with FIXTURES_DIRECTORY.joinpath("search.html").open(encoding="utf-8") as f:
http.register_uri("GET", "https://pypi.org/search", f.read())
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("search")
def test_search(
tester,
http,
):
def test_search(tester: "CommandTester", http: Type["httpretty.httpretty"]):
tester.execute("sqlalchemy")
expected = """
......
from typing import TYPE_CHECKING
import pytest
from poetry.core.packages.dependency_group import DependencyGroup
......@@ -5,12 +7,23 @@ from poetry.factory import Factory
from tests.helpers import get_package
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from poetry.poetry import Poetry
from poetry.repositories import Repository
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("show")
def test_show_basic_with_installed_packages(tester, poetry, installed):
def test_show_basic_with_installed_packages(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
poetry.package.add_dependency(
......@@ -85,7 +98,9 @@ pytest 3.7.3 Pytest package
assert expected == tester.io.fetch_output()
def test_show_basic_with_installed_packages_single(tester, poetry, installed):
def test_show_basic_with_installed_packages_single(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
cachy_010 = get_package("cachy", "0.1.0")
......@@ -126,7 +141,7 @@ def test_show_basic_with_installed_packages_single(tester, poetry, installed):
def test_show_basic_with_not_installed_packages_non_decorated(
tester, poetry, installed
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
......@@ -181,7 +196,9 @@ pendulum (!) 2.0.0 Pendulum package
assert expected == tester.io.fetch_output()
def test_show_basic_with_not_installed_packages_decorated(tester, poetry, installed):
def test_show_basic_with_not_installed_packages_decorated(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
......@@ -235,7 +252,12 @@ def test_show_basic_with_not_installed_packages_decorated(tester, poetry, instal
assert expected == tester.io.fetch_output()
def test_show_latest_non_decorated(tester, poetry, installed, repo):
def test_show_latest_non_decorated(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
......@@ -300,7 +322,12 @@ pendulum 2.0.0 2.0.1 Pendulum package
assert expected == tester.io.fetch_output()
def test_show_latest_decorated(tester, poetry, installed, repo):
def test_show_latest_decorated(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
......@@ -365,7 +392,12 @@ def test_show_latest_decorated(tester, poetry, installed, repo):
assert expected == tester.io.fetch_output()
def test_show_outdated(tester, poetry, installed, repo):
def test_show_outdated(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
......@@ -426,7 +458,12 @@ cachy 0.1.0 0.2.0 Cachy package
assert expected == tester.io.fetch_output()
def test_show_outdated_with_only_up_to_date_packages(tester, poetry, installed, repo):
def test_show_outdated_with_only_up_to_date_packages(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
cachy_020 = get_package("cachy", "0.2.0")
cachy_020.description = "Cachy package"
......@@ -463,7 +500,12 @@ def test_show_outdated_with_only_up_to_date_packages(tester, poetry, installed,
assert expected == tester.io.fetch_output()
def test_show_outdated_has_prerelease_but_not_allowed(tester, poetry, installed, repo):
def test_show_outdated_has_prerelease_but_not_allowed(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
......@@ -529,7 +571,12 @@ cachy 0.1.0 0.2.0 Cachy package
assert expected == tester.io.fetch_output()
def test_show_outdated_has_prerelease_and_allowed(tester, poetry, installed, repo):
def test_show_outdated_has_prerelease_and_allowed(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
poetry.package.add_dependency(
Factory.create_dependency(
"cachy", {"version": "^0.1.0", "allow-prereleases": True}
......@@ -599,7 +646,12 @@ cachy 0.1.0.dev1 0.3.0.dev123 Cachy package
assert expected == tester.io.fetch_output()
def test_show_outdated_formatting(tester, poetry, installed, repo):
def test_show_outdated_formatting(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
......@@ -665,7 +717,12 @@ pendulum 2.0.0 2.0.1 Pendulum package
@pytest.mark.parametrize("project_directory", ["project_with_local_dependencies"])
def test_show_outdated_local_dependencies(tester, poetry, installed, repo):
def test_show_outdated_local_dependencies(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
cachy_020 = get_package("cachy", "0.2.0")
......@@ -775,7 +832,12 @@ project-with-setup 0.1.1 ../project_with_setup 0.1.2 ../project_with_setup
@pytest.mark.parametrize("project_directory", ["project_with_git_dev_dependency"])
def test_show_outdated_git_dev_dependency(tester, poetry, installed, repo):
def test_show_outdated_git_dev_dependency(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
cachy_020 = get_package("cachy", "0.2.0")
......@@ -870,7 +932,12 @@ demo 0.1.1 9cf87a2 0.1.2 9cf87a2 Demo package
@pytest.mark.parametrize("project_directory", ["project_with_git_dev_dependency"])
def test_show_outdated_no_dev_git_dev_dependency(tester, poetry, installed, repo):
def test_show_outdated_no_dev_git_dev_dependency(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
cachy_020 = get_package("cachy", "0.2.0")
......@@ -962,7 +1029,12 @@ cachy 0.1.0 0.2.0 Cachy package
assert expected == tester.io.fetch_output()
def test_show_hides_incompatible_package(tester, poetry, installed, repo):
def test_show_hides_incompatible_package(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
poetry.package.add_dependency(
Factory.create_dependency("cachy", {"version": "^0.1.0", "python": "< 2.0"})
)
......@@ -1018,7 +1090,12 @@ pendulum 2.0.0 Pendulum package
assert expected == tester.io.fetch_output()
def test_show_all_shows_incompatible_package(tester, poetry, installed, repo):
def test_show_all_shows_incompatible_package(
tester: "CommandTester",
poetry: "Poetry",
installed: "Repository",
repo: "TestRepository",
):
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
......@@ -1071,7 +1148,9 @@ pendulum 2.0.0 Pendulum package
assert expected == tester.io.fetch_output()
def test_show_non_dev_with_basic_installed_packages(tester, poetry, installed):
def test_show_non_dev_with_basic_installed_packages(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
poetry.package.add_dependency(
......@@ -1145,7 +1224,9 @@ pendulum 2.0.0 Pendulum package
assert expected == tester.io.fetch_output()
def test_show_with_group_only(tester, poetry, installed):
def test_show_with_group_only(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
poetry.package.add_dependency(
......@@ -1218,7 +1299,9 @@ pytest 3.7.3 Pytest package
assert expected == tester.io.fetch_output()
def test_show_with_optional_group(tester, poetry, installed):
def test_show_with_optional_group(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
group = DependencyGroup("dev", optional=True)
......@@ -1302,7 +1385,7 @@ pytest 3.7.3 Pytest package
assert expected == tester.io.fetch_output()
def test_show_tree(tester, poetry, installed):
def test_show_tree(tester: "CommandTester", poetry: "Poetry", installed: "Repository"):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.2.0"))
cachy2 = get_package("cachy", "0.2.0")
......@@ -1354,7 +1437,9 @@ cachy 0.2.0
assert expected == tester.io.fetch_output()
def test_show_tree_no_dev(tester, poetry, installed):
def test_show_tree_no_dev(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.2.0"))
poetry.package.add_dependency(
Factory.create_dependency("pytest", "^6.1.0", groups=["dev"])
......@@ -1421,7 +1506,9 @@ cachy 0.2.0
assert expected == tester.io.fetch_output()
def test_show_required_by_deps(tester, poetry, installed):
def test_show_required_by_deps(
tester: "CommandTester", poetry: "Poetry", installed: "Repository"
):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.2.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "2.0.0"))
......
from typing import TYPE_CHECKING
import pytest
from poetry.console.commands.version import VersionCommand
if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from tests.types import CommandTesterFactory
@pytest.fixture()
def command():
def command() -> VersionCommand:
return VersionCommand()
@pytest.fixture
def tester(command_tester_factory):
def tester(command_tester_factory: "CommandTesterFactory") -> "CommandTester":
return command_tester_factory("version")
......@@ -39,25 +47,27 @@ def tester(command_tester_factory):
("0.0.0", "1.2.3", "1.2.3"),
],
)
def test_increment_version(version, rule, expected, command):
def test_increment_version(
version: str, rule: str, expected: str, command: VersionCommand
):
assert expected == command.increment_version(version, rule).text
def test_version_show(tester):
def test_version_show(tester: "CommandTester"):
tester.execute()
assert "simple-project 1.2.3\n" == tester.io.fetch_output()
def test_short_version_show(tester):
def test_short_version_show(tester: "CommandTester"):
tester.execute("--short")
assert "1.2.3\n" == tester.io.fetch_output()
def test_version_update(tester):
def test_version_update(tester: "CommandTester"):
tester.execute("2.0.0")
assert "Bumping version from 1.2.3 to 2.0.0\n" == tester.io.fetch_output()
def test_short_version_update(tester):
def test_short_version_update(tester: "CommandTester"):
tester.execute("--short 2.0.0")
assert "2.0.0\n" == tester.io.fetch_output()
import os
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Iterator
import pytest
......@@ -17,20 +19,35 @@ from tests.helpers import TestLocker
from tests.helpers import mock_clone
if TYPE_CHECKING:
from pytest_mock import MockerFixture
from poetry.poetry import Poetry
from poetry.repositories import Repository
from tests.conftest import Config
from tests.helpers import TestRepository
@pytest.fixture()
def installer():
def installer() -> NoopInstaller:
return NoopInstaller()
@pytest.fixture
def env(tmp_dir):
def env(tmp_dir: str) -> MockEnv:
path = Path(tmp_dir) / ".venv"
path.mkdir(parents=True)
return MockEnv(path=path, is_venv=True)
@pytest.fixture(autouse=True)
def setup(mocker, installer, installed, config, env):
def setup(
mocker: "MockerFixture",
installer: NoopInstaller,
installed: "Repository",
config: "Config",
env: MockEnv,
) -> Iterator[None]:
# Set Installer's installer
p = mocker.patch("poetry.installation.installer.Installer._get_installer")
p.return_value = installer
......@@ -69,12 +86,14 @@ def setup(mocker, installer, installed, config, env):
@pytest.fixture
def project_directory():
def project_directory() -> str:
return "simple_project"
@pytest.fixture
def poetry(repo, project_directory, config):
def poetry(
repo: "TestRepository", project_directory: str, config: "Config"
) -> "Poetry":
p = Factory().create_poetry(
Path(__file__).parent.parent / "fixtures" / project_directory
)
......@@ -96,22 +115,22 @@ def poetry(repo, project_directory, config):
@pytest.fixture
def app(poetry):
def app(poetry: "Poetry") -> PoetryTestApplication:
app_ = PoetryTestApplication(poetry)
return app_
@pytest.fixture
def app_tester(app):
def app_tester(app: PoetryTestApplication) -> ApplicationTester:
return ApplicationTester(app)
@pytest.fixture
def new_installer_disabled(config):
def new_installer_disabled(config: "Config") -> None:
config.merge({"experimental": {"new-installer": False}})
@pytest.fixture()
def executor(poetry, config, env):
def executor(poetry: "Poetry", config: "Config", env: MockEnv) -> TestExecutor:
return TestExecutor(env, poetry.pool, config, NullIO())
import re
from typing import TYPE_CHECKING
from cleo.testers.application_tester import ApplicationTester
from entrypoints import EntryPoint
......@@ -8,23 +10,27 @@ from poetry.console.commands.command import Command
from poetry.plugins.application_plugin import ApplicationPlugin
if TYPE_CHECKING:
from pytest_mock import MockerFixture
class FooCommand(Command):
name = "foo"
description = "Foo Command"
def handle(self):
def handle(self) -> int:
self.line("foo called")
return 0
class AddCommandPlugin(ApplicationPlugin):
def activate(self, application: Application):
def activate(self, application: Application) -> None:
application.command_loader.register_factory("foo", lambda: FooCommand())
def test_application_with_plugins(mocker):
def test_application_with_plugins(mocker: "MockerFixture"):
mocker.patch(
"entrypoints.get_group_all",
return_value=[
......@@ -43,7 +49,7 @@ def test_application_with_plugins(mocker):
assert 0 == tester.status_code
def test_application_with_plugins_disabled(mocker):
def test_application_with_plugins_disabled(mocker: "MockerFixture"):
mocker.patch(
"entrypoints.get_group_all",
return_value=[
......@@ -62,7 +68,7 @@ def test_application_with_plugins_disabled(mocker):
assert 0 == tester.status_code
def test_application_execute_plugin_command(mocker):
def test_application_execute_plugin_command(mocker: "MockerFixture"):
mocker.patch(
"entrypoints.get_group_all",
return_value=[
......@@ -81,7 +87,9 @@ def test_application_execute_plugin_command(mocker):
assert 0 == tester.status_code
def test_application_execute_plugin_command_with_plugins_disabled(mocker):
def test_application_execute_plugin_command_with_plugins_disabled(
mocker: "MockerFixture",
):
mocker.patch(
"entrypoints.get_group_all",
return_value=[
......
from typing import TYPE_CHECKING
from typing import Dict
from typing import Optional
from tests.compat import Protocol
if TYPE_CHECKING:
from cleo.io.io import IO
from cleo.testers.command_tester import CommandTester
from poetry.config.config import Config
from poetry.config.source import Source
from poetry.installation import Installer
from poetry.installation.executor import Executor
from poetry.poetry import Poetry
from poetry.utils.env import Env
class CommandTesterFactory(Protocol):
def __call__(
self,
command: str,
poetry: Optional["Poetry"] = None,
installer: Optional["Installer"] = None,
executor: Optional["Executor"] = None,
environment: Optional["Env"] = None,
) -> "CommandTester":
...
class SourcesFactory(Protocol):
def __call__(
self, poetry: "Poetry", sources: "Source", config: "Config", io: "IO"
) -> None:
...
class ProjectFactory(Protocol):
def __call__(
self,
name: Optional[str] = None,
dependencies: Optional[Dict[str, str]] = None,
dev_dependencies: Optional[Dict[str, str]] = None,
pyproject_content: Optional[str] = None,
poetry_lock_content: Optional[str] = None,
install_deps: bool = True,
) -> "Poetry":
...
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment