Commit 5a9da19f by David Hotham Committed by GitHub

Tidying (#7779)

parent 71754bcd
...@@ -169,7 +169,6 @@ enable_error_code = [ ...@@ -169,7 +169,6 @@ enable_error_code = [
# warning. # warning.
[[tool.mypy.overrides]] [[tool.mypy.overrides]]
module = [ module = [
'poetry.console.commands.self.show.plugins',
'poetry.plugins.plugin_manager', 'poetry.plugins.plugin_manager',
'poetry.repositories.installed_repository', 'poetry.repositories.installed_repository',
'poetry.utils.env', 'poetry.utils.env',
......
...@@ -199,7 +199,7 @@ class Config: ...@@ -199,7 +199,7 @@ class Config:
repositories = {} repositories = {}
pattern = re.compile(r"POETRY_REPOSITORIES_(?P<name>[A-Z_]+)_URL") pattern = re.compile(r"POETRY_REPOSITORIES_(?P<name>[A-Z_]+)_URL")
for env_key in os.environ.keys(): for env_key in os.environ:
match = pattern.match(env_key) match = pattern.match(env_key)
if match: if match:
repositories[match.group("name").lower().replace("_", "-")] = { repositories[match.group("name").lower().replace("_", "-")] = {
......
...@@ -149,10 +149,7 @@ The <c1>init</c1> command creates a basic <comment>pyproject.toml</> file in the ...@@ -149,10 +149,7 @@ The <c1>init</c1> command creates a basic <comment>pyproject.toml</> file in the
question.set_validator(lambda v: self._validate_author(v, author)) question.set_validator(lambda v: self._validate_author(v, author))
author = self.ask(question) author = self.ask(question)
if not author: authors = [author] if author else []
authors = []
else:
authors = [author]
license = self.option("license") license = self.option("license")
if not license: if not license:
......
...@@ -39,10 +39,7 @@ class NewCommand(Command): ...@@ -39,10 +39,7 @@ class NewCommand(Command):
" be ignored. You should consider the option --path instead.</warning>" " be ignored. You should consider the option --path instead.</warning>"
) )
if self.option("src"): layout_cls = layout("src") if self.option("src") else layout("standard")
layout_cls = layout("src")
else:
layout_cls = layout("standard")
path = Path(self.argument("path")) path = Path(self.argument("path"))
if not path.is_absolute(): if not path.is_absolute():
......
...@@ -25,14 +25,14 @@ class PluginPackage: ...@@ -25,14 +25,14 @@ class PluginPackage:
from poetry.plugins.application_plugin import ApplicationPlugin from poetry.plugins.application_plugin import ApplicationPlugin
from poetry.plugins.plugin import Plugin from poetry.plugins.plugin import Plugin
group = entry_point.group # type: ignore[attr-defined] group = entry_point.group
if group == ApplicationPlugin.group: if group == ApplicationPlugin.group:
self.application_plugins.append(entry_point) self.application_plugins.append(entry_point)
elif group == Plugin.group: elif group == Plugin.group:
self.plugins.append(entry_point) self.plugins.append(entry_point)
else: else:
name = entry_point.name # type: ignore[attr-defined] name = entry_point.name
raise ValueError(f"Unknown plugin group ({group}) for {name}") raise ValueError(f"Unknown plugin group ({group}) for {name}")
......
...@@ -142,10 +142,7 @@ lists all packages available.""" ...@@ -142,10 +142,7 @@ lists all packages available."""
packages = [pkg] packages = [pkg]
if required_by: if required_by:
packages = [ packages = [
p p for p in locked_packages for r in required_by if p.name == r
for p in locked_packages
for r in required_by.keys()
if p.name == r
] ]
else: else:
# if no rev-deps exist we'll make this clear as it can otherwise # if no rev-deps exist we'll make this clear as it can otherwise
......
...@@ -43,12 +43,9 @@ class RunArgvInput(ArgvInput): ...@@ -43,12 +43,9 @@ class RunArgvInput(ArgvInput):
# Options with values: # Options with values:
# For long options, test for '--option=' at beginning # For long options, test for '--option=' at beginning
# For short options, test for '-o' at beginning # For short options, test for '-o' at beginning
if value.find("--") == 0: leading = value + "=" if value.startswith("--") else value
leading = value + "="
else:
leading = value
if token == value or leading != "" and token.find(leading) == 0: if token == value or leading != "" and token.startswith(leading):
return True return True
return False return False
......
...@@ -8,8 +8,6 @@ from contextlib import redirect_stdout ...@@ -8,8 +8,6 @@ from contextlib import redirect_stdout
from io import StringIO from io import StringIO
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Callable
from typing import Collection
from build import BuildBackendException from build import BuildBackendException
from build import ProjectBuilder from build import ProjectBuilder
...@@ -22,6 +20,8 @@ from poetry.utils.env import ephemeral_environment ...@@ -22,6 +20,8 @@ from poetry.utils.env import ephemeral_environment
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Callable
from collections.abc import Collection
from contextlib import AbstractContextManager from contextlib import AbstractContextManager
from poetry.repositories import RepositoryPool from poetry.repositories import RepositoryPool
......
...@@ -554,10 +554,7 @@ class Installer: ...@@ -554,10 +554,7 @@ class Installer:
def _filter_operations(self, ops: Iterable[Operation], repo: Repository) -> None: def _filter_operations(self, ops: Iterable[Operation], repo: Repository) -> None:
extra_packages = self._get_extra_packages(repo) extra_packages = self._get_extra_packages(repo)
for op in ops: for op in ops:
if isinstance(op, Update): package = op.target_package if isinstance(op, Update) else op.package
package = op.target_package
else:
package = op.package
if op.job_type == "uninstall": if op.job_type == "uninstall":
continue continue
......
from __future__ import annotations from __future__ import annotations
import os
import platform import platform
import sys import sys
...@@ -51,9 +50,9 @@ class WheelDestination(SchemeDictionaryDestination): ...@@ -51,9 +50,9 @@ class WheelDestination(SchemeDictionaryDestination):
if not parent_folder.exists(): if not parent_folder.exists():
# Due to the parallel installation it can happen # Due to the parallel installation it can happen
# that two threads try to create the directory. # that two threads try to create the directory.
os.makedirs(parent_folder, exist_ok=True) parent_folder.mkdir(parents=True, exist_ok=True)
with open(target_path, "wb") as f: with target_path.open("wb") as f:
hash_, size = copyfileobj_with_hashing(stream, f, self.hash_algorithm) hash_, size = copyfileobj_with_hashing(stream, f, self.hash_algorithm)
if is_executable: if is_executable:
......
from __future__ import annotations from __future__ import annotations
import json import json
import os
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
...@@ -11,7 +10,7 @@ import jsonschema ...@@ -11,7 +10,7 @@ import jsonschema
from poetry.core.json import SCHEMA_DIR as CORE_SCHEMA_DIR from poetry.core.json import SCHEMA_DIR as CORE_SCHEMA_DIR
SCHEMA_DIR = os.path.join(os.path.dirname(__file__), "schemas") SCHEMA_DIR = Path(__file__).parent / "schemas"
class ValidationError(ValueError): class ValidationError(ValueError):
...@@ -39,7 +38,7 @@ def validate_object(obj: dict[str, Any]) -> list[str]: ...@@ -39,7 +38,7 @@ def validate_object(obj: dict[str, Any]) -> list[str]:
errors.append(message) errors.append(message)
core_schema = json.loads( core_schema = json.loads(
Path(CORE_SCHEMA_DIR, "poetry-schema.json").read_text(encoding="utf-8") (CORE_SCHEMA_DIR / "poetry-schema.json").read_text(encoding="utf-8")
) )
properties = {*schema["properties"].keys(), *core_schema["properties"].keys()} properties = {*schema["properties"].keys(), *core_schema["properties"].keys()}
......
...@@ -15,7 +15,7 @@ from poetry.pyproject.toml import PyProjectTOML ...@@ -15,7 +15,7 @@ from poetry.pyproject.toml import PyProjectTOML
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Mapping from collections.abc import Mapping
from tomlkit.items import InlineTable from tomlkit.items import InlineTable
...@@ -49,8 +49,8 @@ class Layout: ...@@ -49,8 +49,8 @@ class Layout:
author: str | None = None, author: str | None = None,
license: str | None = None, license: str | None = None,
python: str = "*", python: str = "*",
dependencies: dict[str, str | Mapping[str, Any]] | None = None, dependencies: Mapping[str, str | Mapping[str, Any]] | None = None,
dev_dependencies: dict[str, str | Mapping[str, Any]] | None = None, dev_dependencies: Mapping[str, str | Mapping[str, Any]] | None = None,
) -> None: ) -> None:
self._project = canonicalize_name(project) self._project = canonicalize_name(project)
self._package_path_relative = Path( self._package_path_relative = Path(
......
...@@ -320,8 +320,8 @@ class VersionSolver: ...@@ -320,8 +320,8 @@ class VersionSolver:
# The most_recent_satisfier may not satisfy most_recent_term on its own # The most_recent_satisfier may not satisfy most_recent_term on its own
# if there are a collection of constraints on most_recent_term that # if there are a collection of constraints on most_recent_term that
# only satisfy it together. For example, if most_recent_term is # only satisfy it together. For example, if most_recent_term is
# `foo ^1.0.0` and _solution contains `[foo >=1.0.0, # `foo ^1.0.0` and _solution contains `[foo >=1.0.0,
# foo <2.0.0]`, then most_recent_satisfier will be `foo <2.0.0` even # foo <2.0.0]`, then most_recent_satisfier will be `foo <2.0.0` even
# though it doesn't totally satisfy `foo ^1.0.0`. # though it doesn't totally satisfy `foo ^1.0.0`.
# #
# In this case, we add `not (most_recent_satisfier \ most_recent_term)` to # In this case, we add `not (most_recent_satisfier \ most_recent_term)` to
......
...@@ -71,7 +71,7 @@ class PluginManager: ...@@ -71,7 +71,7 @@ class PluginManager:
plugin.activate(*args, **kwargs) plugin.activate(*args, **kwargs)
def _load_plugin_entry_point(self, ep: metadata.EntryPoint) -> None: def _load_plugin_entry_point(self, ep: metadata.EntryPoint) -> None:
logger.debug("Loading the %s plugin", ep.name) # type: ignore[attr-defined] logger.debug("Loading the %s plugin", ep.name)
plugin = ep.load() # type: ignore[no-untyped-call] plugin = ep.load() # type: ignore[no-untyped-call]
......
...@@ -12,7 +12,6 @@ from collections import defaultdict ...@@ -12,7 +12,6 @@ from collections import defaultdict
from contextlib import contextmanager from contextlib import contextmanager
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Collection
from typing import cast from typing import cast
from cleo.ui.progress_indicator import ProgressIndicator from cleo.ui.progress_indicator import ProgressIndicator
...@@ -40,6 +39,7 @@ from poetry.vcs.git import Git ...@@ -40,6 +39,7 @@ from poetry.vcs.git import Git
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Callable from collections.abc import Callable
from collections.abc import Collection
from collections.abc import Iterable from collections.abc import Iterable
from collections.abc import Iterator from collections.abc import Iterator
......
...@@ -5,7 +5,6 @@ import time ...@@ -5,7 +5,6 @@ import time
from collections import defaultdict from collections import defaultdict
from contextlib import contextmanager from contextlib import contextmanager
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Collection
from typing import FrozenSet from typing import FrozenSet
from typing import Tuple from typing import Tuple
from typing import TypeVar from typing import TypeVar
...@@ -21,6 +20,7 @@ from poetry.puzzle.provider import Provider ...@@ -21,6 +20,7 @@ from poetry.puzzle.provider import Provider
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Collection
from collections.abc import Iterator from collections.abc import Iterator
from cleo.io.io import IO from cleo.io.io import IO
......
...@@ -17,7 +17,7 @@ from poetry.core.version.exceptions import InvalidVersion ...@@ -17,7 +17,7 @@ from poetry.core.version.exceptions import InvalidVersion
from poetry.repositories.exceptions import PackageNotFound from poetry.repositories.exceptions import PackageNotFound
from poetry.repositories.http_repository import HTTPRepository from poetry.repositories.http_repository import HTTPRepository
from poetry.repositories.link_sources.json import SimpleJsonPage from poetry.repositories.link_sources.json import SimpleJsonPage
from poetry.utils._compat import to_str from poetry.utils._compat import decode
from poetry.utils.constants import REQUESTS_TIMEOUT from poetry.utils.constants import REQUESTS_TIMEOUT
...@@ -82,7 +82,7 @@ class PyPiRepository(HTTPRepository): ...@@ -82,7 +82,7 @@ class PyPiRepository(HTTPRepository):
try: try:
package = Package(name, version) package = Package(name, version)
package.description = to_str(description.strip()) package.description = decode(description.strip())
results.append(package) results.append(package)
except InvalidVersion: except InvalidVersion:
self._log( self._log(
......
...@@ -56,16 +56,11 @@ def encode(string: str, encodings: list[str] | None = None) -> bytes: ...@@ -56,16 +56,11 @@ def encode(string: str, encodings: list[str] | None = None) -> bytes:
return string.encode(encodings[0], errors="ignore") return string.encode(encodings[0], errors="ignore")
def to_str(string: str) -> str:
return decode(string)
__all__ = [ __all__ = [
"WINDOWS", "WINDOWS",
"cached_property", "cached_property",
"decode", "decode",
"encode", "encode",
"metadata", "metadata",
"to_str",
"tomllib", "tomllib",
] ]
...@@ -10,7 +10,6 @@ import time ...@@ -10,7 +10,6 @@ import time
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Any from typing import Any
from typing import Callable
from typing import Generic from typing import Generic
from typing import TypeVar from typing import TypeVar
...@@ -21,6 +20,8 @@ from poetry.utils.wheel import Wheel ...@@ -21,6 +20,8 @@ from poetry.utils.wheel import Wheel
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Callable
from poetry.core.packages.utils.link import Link from poetry.core.packages.utils.link import Link
from poetry.utils.env import Env from poetry.utils.env import Env
...@@ -108,7 +109,7 @@ class FileCache(Generic[T]): ...@@ -108,7 +109,7 @@ class FileCache(Generic[T]):
) )
path = self._path(key) path = self._path(key)
path.parent.mkdir(parents=True, exist_ok=True) path.parent.mkdir(parents=True, exist_ok=True)
with open(path, "wb") as f: with path.open("wb") as f:
f.write(self._serialize(payload)) f.write(self._serialize(payload))
def forget(self, key: str) -> None: def forget(self, key: str) -> None:
...@@ -149,7 +150,7 @@ class FileCache(Generic[T]): ...@@ -149,7 +150,7 @@ class FileCache(Generic[T]):
if not path.exists(): if not path.exists():
return None return None
with open(path, "rb") as f: with path.open("rb") as f:
file_content = f.read() file_content = f.read()
try: try:
......
...@@ -1234,10 +1234,7 @@ class Env: ...@@ -1234,10 +1234,7 @@ class Env:
path = get_real_windows_path(path) path = get_real_windows_path(path)
base = get_real_windows_path(base) if base else None base = get_real_windows_path(base) if base else None
if not self._is_windows or self._is_mingw: bin_dir = "bin" if not self._is_windows or self._is_mingw else "Scripts"
bin_dir = "bin"
else:
bin_dir = "Scripts"
self._path = path self._path = path
self._bin_dir = self._path / bin_dir self._bin_dir = self._path / bin_dir
...@@ -1268,8 +1265,9 @@ class Env: ...@@ -1268,8 +1265,9 @@ class Env:
return self._base return self._base
@property @property
def version_info(self) -> tuple[Any, ...]: def version_info(self) -> tuple[int, int, int, str, int]:
return tuple(self.marker_env["version_info"]) version_info: tuple[int, int, int, str, int] = self.marker_env["version_info"]
return version_info
@property @property
def python_implementation(self) -> str: def python_implementation(self) -> str:
......
...@@ -6,7 +6,7 @@ from typing import TYPE_CHECKING ...@@ -6,7 +6,7 @@ from typing import TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Collection from collections.abc import Collection
from collections.abc import Iterable from collections.abc import Iterable
from typing import Mapping from collections.abc import Mapping
from packaging.utils import NormalizedName from packaging.utils import NormalizedName
from poetry.core.packages.package import Package from poetry.core.packages.package import Package
......
...@@ -8,18 +8,18 @@ import stat ...@@ -8,18 +8,18 @@ import stat
import sys import sys
import tempfile import tempfile
from collections.abc import Mapping
from contextlib import contextmanager from contextlib import contextmanager
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Any from typing import Any
from typing import Iterator
from typing import Mapping
from poetry.utils.constants import REQUESTS_TIMEOUT from poetry.utils.constants import REQUESTS_TIMEOUT
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Callable from collections.abc import Callable
from collections.abc import Iterator
from io import BufferedWriter from io import BufferedWriter
from poetry.core.packages.package import Package from poetry.core.packages.package import Package
...@@ -82,7 +82,7 @@ def remove_directory( ...@@ -82,7 +82,7 @@ def remove_directory(
def merge_dicts(d1: dict[str, Any], d2: dict[str, Any]) -> None: def merge_dicts(d1: dict[str, Any], d2: dict[str, Any]) -> None:
for k in d2.keys(): for k in d2:
if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], Mapping): if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], Mapping):
merge_dicts(d1[k], d2[k]) merge_dicts(d1[k], d2[k])
else: else:
...@@ -121,7 +121,7 @@ def download_file( ...@@ -121,7 +121,7 @@ def download_file(
# but skip the updating # but skip the updating
set_indicator = total_size > 1024 * 1024 set_indicator = total_size > 1024 * 1024
with open(dest, "wb") as f: with dest.open("wb") as f:
for chunk in response.iter_content(chunk_size=chunk_size): for chunk in response.iter_content(chunk_size=chunk_size):
if chunk: if chunk:
f.write(chunk) f.write(chunk)
......
...@@ -39,7 +39,7 @@ class SetupReader: ...@@ -39,7 +39,7 @@ class SetupReader:
read_file_func = getattr(cls(), "read_" + filename.replace(".", "_")) read_file_func = getattr(cls(), "read_" + filename.replace(".", "_"))
new_result = read_file_func(filepath) new_result = read_file_func(filepath)
for key in result.keys(): for key in result:
if new_result[key]: if new_result[key]:
result[key] = new_result[key] result[key] = new_result[key]
......
...@@ -8,6 +8,8 @@ if sys.version_info < (3, 8): ...@@ -8,6 +8,8 @@ if sys.version_info < (3, 8):
from typing_extensions import Protocol # nopycln: import from typing_extensions import Protocol # nopycln: import
else: else:
import zipfile # noqa: F401 import zipfile
from typing import Protocol # noqa: F401 from typing import Protocol
__all__ = ["zipfile", "Protocol"]
...@@ -11,7 +11,6 @@ from contextlib import suppress ...@@ -11,7 +11,6 @@ from contextlib import suppress
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Any from typing import Any
from typing import TextIO
import httpretty import httpretty
import pytest import pytest
...@@ -41,6 +40,7 @@ from tests.helpers import mock_download ...@@ -41,6 +40,7 @@ from tests.helpers import mock_download
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Iterator from collections.abc import Iterator
from collections.abc import Mapping
from _pytest.config import Config as PyTestConfig from _pytest.config import Config as PyTestConfig
from _pytest.config.argparsing import Parser from _pytest.config.argparsing import Parser
...@@ -70,6 +70,9 @@ def pytest_configure(config: PyTestConfig) -> None: ...@@ -70,6 +70,9 @@ def pytest_configure(config: PyTestConfig) -> None:
class Config(BaseConfig): class Config(BaseConfig):
_config_source: DictConfigSource
_auth_config_source: DictConfigSource
def get(self, setting_name: str, default: Any = None) -> Any: def get(self, setting_name: str, default: Any = None) -> Any:
self.merge(self._config_source.config) self.merge(self._config_source.config)
self.merge(self._auth_config_source.config) self.merge(self._auth_config_source.config)
...@@ -91,7 +94,7 @@ class Config(BaseConfig): ...@@ -91,7 +94,7 @@ class Config(BaseConfig):
class DummyBackend(KeyringBackend): class DummyBackend(KeyringBackend):
def __init__(self) -> None: def __init__(self) -> None:
self._passwords = {} self._passwords: dict[str, dict[str | None, str | None]] = {}
@classmethod @classmethod
def priority(cls) -> int: def priority(cls) -> int:
...@@ -303,30 +306,15 @@ def tmp_dir() -> Iterator[str]: ...@@ -303,30 +306,15 @@ def tmp_dir() -> Iterator[str]:
@pytest.fixture @pytest.fixture
def mocked_open_files(mocker: MockerFixture) -> list:
files = []
original = Path.open
def mocked_open(self: Path, *args: Any, **kwargs: Any) -> TextIO:
if self.name in {"pyproject.toml"}:
return mocker.MagicMock()
return original(self, *args, **kwargs)
mocker.patch("pathlib.Path.open", mocked_open)
return files
@pytest.fixture
def tmp_venv(tmp_dir: str) -> Iterator[VirtualEnv]: def tmp_venv(tmp_dir: str) -> Iterator[VirtualEnv]:
venv_path = Path(tmp_dir) / "venv" venv_path = Path(tmp_dir) / "venv"
EnvManager.build_venv(str(venv_path)) EnvManager.build_venv(venv_path)
venv = VirtualEnv(venv_path) venv = VirtualEnv(venv_path)
yield venv yield venv
shutil.rmtree(str(venv.path)) shutil.rmtree(venv.path)
@pytest.fixture @pytest.fixture
...@@ -371,8 +359,8 @@ def project_factory( ...@@ -371,8 +359,8 @@ def project_factory(
def _factory( def _factory(
name: str | None = None, name: str | None = None,
dependencies: dict[str, str] | None = None, dependencies: Mapping[str, str] | None = None,
dev_dependencies: dict[str, str] | None = None, dev_dependencies: Mapping[str, str] | None = None,
pyproject_content: str | None = None, pyproject_content: str | None = None,
poetry_lock_content: str | None = None, poetry_lock_content: str | None = None,
install_deps: bool = True, install_deps: bool = True,
...@@ -397,6 +385,7 @@ def project_factory( ...@@ -397,6 +385,7 @@ def project_factory(
) as f: ) as f:
f.write(pyproject_content) f.write(pyproject_content)
else: else:
assert name is not None
layout("src")( layout("src")(
name, name,
"0.1.0", "0.1.0",
......
...@@ -43,7 +43,7 @@ def test_source_add_simple( ...@@ -43,7 +43,7 @@ def test_source_add_simple(
source_existing: Source, source_existing: Source,
source_one: Source, source_one: Source,
poetry_with_source: Poetry, poetry_with_source: Poetry,
): ) -> None:
tester.execute(f"{source_one.name} {source_one.url}") tester.execute(f"{source_one.name} {source_one.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_one) assert_source_added(tester, poetry_with_source, source_existing, source_one)
...@@ -53,7 +53,7 @@ def test_source_add_default( ...@@ -53,7 +53,7 @@ def test_source_add_default(
source_existing: Source, source_existing: Source,
source_default: Source, source_default: Source,
poetry_with_source: Poetry, poetry_with_source: Poetry,
): ) -> None:
tester.execute(f"--default {source_default.name} {source_default.url}") tester.execute(f"--default {source_default.name} {source_default.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_default) assert_source_added(tester, poetry_with_source, source_existing, source_default)
...@@ -63,12 +63,12 @@ def test_source_add_secondary( ...@@ -63,12 +63,12 @@ def test_source_add_secondary(
source_existing: Source, source_existing: Source,
source_secondary: Source, source_secondary: Source,
poetry_with_source: Poetry, poetry_with_source: Poetry,
): ) -> None:
tester.execute(f"--secondary {source_secondary.name} {source_secondary.url}") tester.execute(f"--secondary {source_secondary.name} {source_secondary.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_secondary) assert_source_added(tester, poetry_with_source, source_existing, source_secondary)
def test_source_add_error_default_and_secondary(tester: CommandTester): def test_source_add_error_default_and_secondary(tester: CommandTester) -> None:
tester.execute("--default --secondary error https://error.com") tester.execute("--default --secondary error https://error.com")
assert ( assert (
tester.io.fetch_error().strip() tester.io.fetch_error().strip()
...@@ -77,7 +77,7 @@ def test_source_add_error_default_and_secondary(tester: CommandTester): ...@@ -77,7 +77,7 @@ def test_source_add_error_default_and_secondary(tester: CommandTester):
assert tester.status_code == 1 assert tester.status_code == 1
def test_source_add_error_pypi(tester: CommandTester): def test_source_add_error_pypi(tester: CommandTester) -> None:
tester.execute("pypi https://test.pypi.org/simple/") tester.execute("pypi https://test.pypi.org/simple/")
assert ( assert (
tester.io.fetch_error().strip() tester.io.fetch_error().strip()
...@@ -89,7 +89,7 @@ def test_source_add_error_pypi(tester: CommandTester): ...@@ -89,7 +89,7 @@ def test_source_add_error_pypi(tester: CommandTester):
def test_source_add_existing( def test_source_add_existing(
tester: CommandTester, source_existing: Source, poetry_with_source: Poetry tester: CommandTester, source_existing: Source, poetry_with_source: Poetry
): ) -> None:
tester.execute(f"--default {source_existing.name} {source_existing.url}") tester.execute(f"--default {source_existing.name} {source_existing.url}")
assert ( assert (
tester.io.fetch_output().strip() tester.io.fetch_output().strip()
......
...@@ -28,7 +28,7 @@ def test_source_remove_simple( ...@@ -28,7 +28,7 @@ def test_source_remove_simple(
source_existing: Source, source_existing: Source,
source_one: Source, source_one: Source,
source_two: Source, source_two: Source,
): ) -> None:
tester.execute(f"{source_existing.name}") tester.execute(f"{source_existing.name}")
assert ( assert (
tester.io.fetch_output().strip() tester.io.fetch_output().strip()
...@@ -42,7 +42,7 @@ def test_source_remove_simple( ...@@ -42,7 +42,7 @@ def test_source_remove_simple(
assert tester.status_code == 0 assert tester.status_code == 0
def test_source_remove_error(tester: CommandTester): def test_source_remove_error(tester: CommandTester) -> None:
tester.execute("error") tester.execute("error")
assert tester.io.fetch_error().strip() == "Source with name error was not found." assert tester.io.fetch_error().strip() == "Source with name error was not found."
assert tester.status_code == 1 assert tester.status_code == 1
...@@ -22,7 +22,7 @@ def tester( ...@@ -22,7 +22,7 @@ def tester(
return command_tester_factory("source show", poetry=poetry_with_source) return command_tester_factory("source show", poetry=poetry_with_source)
def test_source_show_simple(tester: CommandTester): def test_source_show_simple(tester: CommandTester) -> None:
tester.execute("") tester.execute("")
expected = """\ expected = """\
...@@ -47,7 +47,7 @@ secondary : no ...@@ -47,7 +47,7 @@ secondary : no
assert tester.status_code == 0 assert tester.status_code == 0
def test_source_show_one(tester: CommandTester, source_one: Source): def test_source_show_one(tester: CommandTester, source_one: Source) -> None:
tester.execute(f"{source_one.name}") tester.execute(f"{source_one.name}")
expected = """\ expected = """\
...@@ -62,7 +62,9 @@ secondary : no ...@@ -62,7 +62,9 @@ secondary : no
assert tester.status_code == 0 assert tester.status_code == 0
def test_source_show_two(tester: CommandTester, source_one: Source, source_two: Source): def test_source_show_two(
tester: CommandTester, source_one: Source, source_two: Source
) -> None:
tester.execute(f"{source_one.name} {source_two.name}") tester.execute(f"{source_one.name} {source_two.name}")
expected = """\ expected = """\
...@@ -82,7 +84,7 @@ secondary : no ...@@ -82,7 +84,7 @@ secondary : no
assert tester.status_code == 0 assert tester.status_code == 0
def test_source_show_error(tester: CommandTester): def test_source_show_error(tester: CommandTester) -> None:
tester.execute("error") tester.execute("error")
assert tester.io.fetch_error().strip() == "No source found with name(s): error" assert tester.io.fetch_error().strip() == "No source found with name(s): error"
assert tester.status_code == 1 assert tester.status_code == 1
...@@ -16,7 +16,6 @@ from packaging.utils import canonicalize_name ...@@ -16,7 +16,6 @@ from packaging.utils import canonicalize_name
from poetry.console.commands.init import InitCommand from poetry.console.commands.init import InitCommand
from poetry.repositories import RepositoryPool from poetry.repositories import RepositoryPool
from poetry.utils._compat import decode
from tests.helpers import PoetryTestApplication from tests.helpers import PoetryTestApplication
from tests.helpers import get_package from tests.helpers import get_package
...@@ -896,7 +895,7 @@ def test_init_existing_pyproject_simple( ...@@ -896,7 +895,7 @@ def test_init_existing_pyproject_simple(
[tool.black] [tool.black]
line-length = 88 line-length = 88
""" """
pyproject_file.write_text(decode(existing_section)) pyproject_file.write_text(existing_section)
tester.execute(inputs=init_basic_inputs) tester.execute(inputs=init_basic_inputs)
assert f"{existing_section}\n{init_basic_toml}" in pyproject_file.read_text() assert f"{existing_section}\n{init_basic_toml}" in pyproject_file.read_text()
...@@ -936,7 +935,7 @@ def test_init_non_interactive_existing_pyproject_add_dependency( ...@@ -936,7 +935,7 @@ def test_init_non_interactive_existing_pyproject_add_dependency(
[tool.black] [tool.black]
line-length = 88 line-length = 88
""" """
pyproject_file.write_text(decode(existing_section)) pyproject_file.write_text(existing_section)
repo.add_package(get_package("foo", "1.19.2")) repo.add_package(get_package("foo", "1.19.2"))
...@@ -975,7 +974,7 @@ def test_init_existing_pyproject_with_build_system_fails( ...@@ -975,7 +974,7 @@ def test_init_existing_pyproject_with_build_system_fails(
requires = ["setuptools >= 40.6.0", "wheel"] requires = ["setuptools >= 40.6.0", "wheel"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
""" """
pyproject_file.write_text(decode(existing_section)) pyproject_file.write_text(existing_section)
tester.execute(inputs=init_basic_inputs) tester.execute(inputs=init_basic_inputs)
assert ( assert (
tester.io.fetch_error().strip() tester.io.fetch_error().strip()
......
...@@ -305,7 +305,7 @@ def flatten_dict(obj: Mapping[str, Any], delimiter: str = ".") -> Mapping[str, A ...@@ -305,7 +305,7 @@ def flatten_dict(obj: Mapping[str, Any], delimiter: str = ".") -> Mapping[str, A
:return: dict :return: dict
""" """
if isinstance(obj, dict): if isinstance(obj, dict):
for key in obj.keys(): for key in obj:
for leaf in recurse_keys(obj[key]): for leaf in recurse_keys(obj[key]):
leaf_path, leaf_value = leaf leaf_path, leaf_value = leaf
leaf_path.insert(0, key) leaf_path.insert(0, key)
......
...@@ -8,7 +8,6 @@ import pytest ...@@ -8,7 +8,6 @@ import pytest
from poetry.inspection.info import PackageInfo from poetry.inspection.info import PackageInfo
from poetry.inspection.info import PackageInfoError from poetry.inspection.info import PackageInfoError
from poetry.utils._compat import decode
from poetry.utils.env import EnvCommandError from poetry.utils.env import EnvCommandError
from poetry.utils.env import VirtualEnv from poetry.utils.env import VirtualEnv
...@@ -21,7 +20,7 @@ FIXTURE_DIR_INSPECTIONS = FIXTURE_DIR_BASE / "inspection" ...@@ -21,7 +20,7 @@ FIXTURE_DIR_INSPECTIONS = FIXTURE_DIR_BASE / "inspection"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
def pep517_metadata_mock(): def pep517_metadata_mock() -> None:
pass pass
...@@ -44,12 +43,10 @@ def source_dir(tmp_path: Path) -> Path: ...@@ -44,12 +43,10 @@ def source_dir(tmp_path: Path) -> Path:
def demo_setup(source_dir: Path) -> Path: def demo_setup(source_dir: Path) -> Path:
setup_py = source_dir / "setup.py" setup_py = source_dir / "setup.py"
setup_py.write_text( setup_py.write_text(
decode( "from setuptools import setup; "
"from setuptools import setup; " 'setup(name="demo", '
'setup(name="demo", ' 'version="0.1.0", '
'version="0.1.0", ' 'install_requires=["package"])'
'install_requires=["package"])'
)
) )
return source_dir return source_dir
...@@ -58,16 +55,14 @@ def demo_setup(source_dir: Path) -> Path: ...@@ -58,16 +55,14 @@ def demo_setup(source_dir: Path) -> Path:
def demo_setup_cfg(source_dir: Path) -> Path: def demo_setup_cfg(source_dir: Path) -> Path:
setup_cfg = source_dir / "setup.cfg" setup_cfg = source_dir / "setup.cfg"
setup_cfg.write_text( setup_cfg.write_text(
decode( "\n".join(
"\n".join( [
[ "[metadata]",
"[metadata]", "name = demo",
"name = demo", "version = 0.1.0",
"version = 0.1.0", "[options]",
"[options]", "install_requires = package",
"install_requires = package", ]
]
)
) )
) )
return source_dir return source_dir
...@@ -77,12 +72,10 @@ def demo_setup_cfg(source_dir: Path) -> Path: ...@@ -77,12 +72,10 @@ def demo_setup_cfg(source_dir: Path) -> Path:
def demo_setup_complex(source_dir: Path) -> Path: def demo_setup_complex(source_dir: Path) -> Path:
setup_py = source_dir / "setup.py" setup_py = source_dir / "setup.py"
setup_py.write_text( setup_py.write_text(
decode( "from setuptools import setup; "
"from setuptools import setup; " 'setup(name="demo", '
'setup(name="demo", ' 'version="0.1.0", '
'version="0.1.0", ' 'install_requires=[i for i in ["package"]])'
'install_requires=[i for i in ["package"]])'
)
) )
return source_dir return source_dir
...@@ -90,13 +83,11 @@ def demo_setup_complex(source_dir: Path) -> Path: ...@@ -90,13 +83,11 @@ def demo_setup_complex(source_dir: Path) -> Path:
@pytest.fixture @pytest.fixture
def demo_setup_complex_pep517_legacy(demo_setup_complex: Path) -> Path: def demo_setup_complex_pep517_legacy(demo_setup_complex: Path) -> Path:
pyproject_toml = demo_setup_complex / "pyproject.toml" pyproject_toml = demo_setup_complex / "pyproject.toml"
pyproject_toml.write_text( pyproject_toml.write_text('[build-system]\nrequires = ["setuptools", "wheel"]')
decode('[build-system]\nrequires = ["setuptools", "wheel"]')
)
return demo_setup_complex return demo_setup_complex
def demo_check_info(info: PackageInfo, requires_dist: set[str] = None) -> None: def demo_check_info(info: PackageInfo, requires_dist: set[str] | None = None) -> None:
assert info.name == "demo" assert info.name == "demo"
assert info.version == "0.1.0" assert info.version == "0.1.0"
assert info.requires_dist assert info.requires_dist
...@@ -120,22 +111,22 @@ def demo_check_info(info: PackageInfo, requires_dist: set[str] = None) -> None: ...@@ -120,22 +111,22 @@ def demo_check_info(info: PackageInfo, requires_dist: set[str] = None) -> None:
) )
def test_info_from_sdist(demo_sdist: Path): def test_info_from_sdist(demo_sdist: Path) -> None:
info = PackageInfo.from_sdist(demo_sdist) info = PackageInfo.from_sdist(demo_sdist)
demo_check_info(info) demo_check_info(info)
def test_info_from_wheel(demo_wheel: Path): def test_info_from_wheel(demo_wheel: Path) -> None:
info = PackageInfo.from_wheel(demo_wheel) info = PackageInfo.from_wheel(demo_wheel)
demo_check_info(info) demo_check_info(info)
def test_info_from_bdist(demo_wheel: Path): def test_info_from_bdist(demo_wheel: Path) -> None:
info = PackageInfo.from_bdist(demo_wheel) info = PackageInfo.from_bdist(demo_wheel)
demo_check_info(info) demo_check_info(info)
def test_info_from_poetry_directory(): def test_info_from_poetry_directory() -> None:
info = PackageInfo.from_directory( info = PackageInfo.from_directory(
FIXTURE_DIR_INSPECTIONS / "demo", disable_build=True FIXTURE_DIR_INSPECTIONS / "demo", disable_build=True
) )
...@@ -144,7 +135,7 @@ def test_info_from_poetry_directory(): ...@@ -144,7 +135,7 @@ def test_info_from_poetry_directory():
def test_info_from_poetry_directory_fallback_on_poetry_create_error( def test_info_from_poetry_directory_fallback_on_poetry_create_error(
mocker: MockerFixture, mocker: MockerFixture,
): ) -> None:
mock_create_poetry = mocker.patch( mock_create_poetry = mocker.patch(
"poetry.inspection.info.Factory.create_poetry", side_effect=RuntimeError "poetry.inspection.info.Factory.create_poetry", side_effect=RuntimeError
) )
...@@ -160,24 +151,25 @@ def test_info_from_poetry_directory_fallback_on_poetry_create_error( ...@@ -160,24 +151,25 @@ def test_info_from_poetry_directory_fallback_on_poetry_create_error(
assert mock_get_pep517_metadata.call_count == 1 assert mock_get_pep517_metadata.call_count == 1
def test_info_from_requires_txt(): def test_info_from_requires_txt() -> None:
info = PackageInfo.from_metadata( info = PackageInfo.from_metadata(
FIXTURE_DIR_INSPECTIONS / "demo_only_requires_txt.egg-info" FIXTURE_DIR_INSPECTIONS / "demo_only_requires_txt.egg-info"
) )
assert info is not None
demo_check_info(info) demo_check_info(info)
def test_info_from_setup_py(demo_setup: Path): def test_info_from_setup_py(demo_setup: Path) -> None:
info = PackageInfo.from_setup_files(demo_setup) info = PackageInfo.from_setup_files(demo_setup)
demo_check_info(info, requires_dist={"package"}) demo_check_info(info, requires_dist={"package"})
def test_info_from_setup_cfg(demo_setup_cfg: Path): def test_info_from_setup_cfg(demo_setup_cfg: Path) -> None:
info = PackageInfo.from_setup_files(demo_setup_cfg) info = PackageInfo.from_setup_files(demo_setup_cfg)
demo_check_info(info, requires_dist={"package"}) demo_check_info(info, requires_dist={"package"})
def test_info_no_setup_pkg_info_no_deps(): def test_info_no_setup_pkg_info_no_deps() -> None:
info = PackageInfo.from_directory( info = PackageInfo.from_directory(
FIXTURE_DIR_INSPECTIONS / "demo_no_setup_pkg_info_no_deps", FIXTURE_DIR_INSPECTIONS / "demo_no_setup_pkg_info_no_deps",
disable_build=True, disable_build=True,
...@@ -187,28 +179,28 @@ def test_info_no_setup_pkg_info_no_deps(): ...@@ -187,28 +179,28 @@ def test_info_no_setup_pkg_info_no_deps():
assert info.requires_dist is None assert info.requires_dist is None
def test_info_setup_simple(mocker: MockerFixture, demo_setup: Path): def test_info_setup_simple(mocker: MockerFixture, demo_setup: Path) -> None:
spy = mocker.spy(VirtualEnv, "run") spy = mocker.spy(VirtualEnv, "run")
info = PackageInfo.from_directory(demo_setup) info = PackageInfo.from_directory(demo_setup)
assert spy.call_count == 0 assert spy.call_count == 0
demo_check_info(info, requires_dist={"package"}) demo_check_info(info, requires_dist={"package"})
def test_info_setup_cfg(mocker: MockerFixture, demo_setup_cfg: Path): def test_info_setup_cfg(mocker: MockerFixture, demo_setup_cfg: Path) -> None:
spy = mocker.spy(VirtualEnv, "run") spy = mocker.spy(VirtualEnv, "run")
info = PackageInfo.from_directory(demo_setup_cfg) info = PackageInfo.from_directory(demo_setup_cfg)
assert spy.call_count == 0 assert spy.call_count == 0
demo_check_info(info, requires_dist={"package"}) demo_check_info(info, requires_dist={"package"})
def test_info_setup_complex(demo_setup_complex: Path): def test_info_setup_complex(demo_setup_complex: Path) -> None:
info = PackageInfo.from_directory(demo_setup_complex) info = PackageInfo.from_directory(demo_setup_complex)
demo_check_info(info, requires_dist={"package"}) demo_check_info(info, requires_dist={"package"})
def test_info_setup_complex_pep517_error( def test_info_setup_complex_pep517_error(
mocker: MockerFixture, demo_setup_complex: Path mocker: MockerFixture, demo_setup_complex: Path
): ) -> None:
mocker.patch( mocker.patch(
"poetry.utils.env.VirtualEnv.run", "poetry.utils.env.VirtualEnv.run",
autospec=True, autospec=True,
...@@ -219,14 +211,16 @@ def test_info_setup_complex_pep517_error( ...@@ -219,14 +211,16 @@ def test_info_setup_complex_pep517_error(
PackageInfo.from_directory(demo_setup_complex) PackageInfo.from_directory(demo_setup_complex)
def test_info_setup_complex_pep517_legacy(demo_setup_complex_pep517_legacy: Path): def test_info_setup_complex_pep517_legacy(
demo_setup_complex_pep517_legacy: Path,
) -> None:
info = PackageInfo.from_directory(demo_setup_complex_pep517_legacy) info = PackageInfo.from_directory(demo_setup_complex_pep517_legacy)
demo_check_info(info, requires_dist={"package"}) demo_check_info(info, requires_dist={"package"})
def test_info_setup_complex_disable_build( def test_info_setup_complex_disable_build(
mocker: MockerFixture, demo_setup_complex: Path mocker: MockerFixture, demo_setup_complex: Path
): ) -> None:
spy = mocker.spy(VirtualEnv, "run") spy = mocker.spy(VirtualEnv, "run")
info = PackageInfo.from_directory(demo_setup_complex, disable_build=True) info = PackageInfo.from_directory(demo_setup_complex, disable_build=True)
assert spy.call_count == 0 assert spy.call_count == 0
...@@ -238,7 +232,7 @@ def test_info_setup_complex_disable_build( ...@@ -238,7 +232,7 @@ def test_info_setup_complex_disable_build(
@pytest.mark.parametrize("missing", ["version", "name", "install_requires"]) @pytest.mark.parametrize("missing", ["version", "name", "install_requires"])
def test_info_setup_missing_mandatory_should_trigger_pep517( def test_info_setup_missing_mandatory_should_trigger_pep517(
mocker: MockerFixture, source_dir: Path, missing: str mocker: MockerFixture, source_dir: Path, missing: str
): ) -> None:
setup = "from setuptools import setup; " setup = "from setuptools import setup; "
setup += "setup(" setup += "setup("
setup += 'name="demo", ' if missing != "name" else "" setup += 'name="demo", ' if missing != "name" else ""
...@@ -247,14 +241,14 @@ def test_info_setup_missing_mandatory_should_trigger_pep517( ...@@ -247,14 +241,14 @@ def test_info_setup_missing_mandatory_should_trigger_pep517(
setup += ")" setup += ")"
setup_py = source_dir / "setup.py" setup_py = source_dir / "setup.py"
setup_py.write_text(decode(setup)) setup_py.write_text(setup)
spy = mocker.spy(VirtualEnv, "run") spy = mocker.spy(VirtualEnv, "run")
_ = PackageInfo.from_directory(source_dir) _ = PackageInfo.from_directory(source_dir)
assert spy.call_count == 1 assert spy.call_count == 1
def test_info_prefer_poetry_config_over_egg_info(): def test_info_prefer_poetry_config_over_egg_info() -> None:
info = PackageInfo.from_directory( info = PackageInfo.from_directory(
FIXTURE_DIR_INSPECTIONS / "demo_with_obsolete_egg_info" FIXTURE_DIR_INSPECTIONS / "demo_with_obsolete_egg_info"
) )
......
...@@ -58,7 +58,7 @@ def mock_pypi(http: type[httpretty.httpretty]) -> None: ...@@ -58,7 +58,7 @@ def mock_pypi(http: type[httpretty.httpretty]) -> None:
fixture = JSON_FIXTURES / (name + ".json") fixture = JSON_FIXTURES / (name + ".json")
if not fixture.exists(): if not fixture.exists():
return return None
with fixture.open(encoding="utf-8") as f: with fixture.open(encoding="utf-8") as f:
return [200, headers, f.read()] return [200, headers, f.read()]
...@@ -132,7 +132,7 @@ def test_chooser_chooses_universal_wheel_link_if_available( ...@@ -132,7 +132,7 @@ def test_chooser_chooses_universal_wheel_link_if_available(
mock_legacy: None, mock_legacy: None,
source_type: str, source_type: str,
pool: RepositoryPool, pool: RepositoryPool,
): ) -> None:
chooser = Chooser(pool, env) chooser = Chooser(pool, env)
package = Package("pytest", "3.5.0") package = Package("pytest", "3.5.0")
...@@ -170,7 +170,7 @@ def test_chooser_no_binary_policy( ...@@ -170,7 +170,7 @@ def test_chooser_no_binary_policy(
policy: str, policy: str,
filename: str, filename: str,
config: Config, config: Config,
): ) -> None:
config.merge({"installer": {"no-binary": policy.split(",")}}) config.merge({"installer": {"no-binary": policy.split(",")}})
chooser = Chooser(pool, env, config) chooser = Chooser(pool, env, config)
...@@ -197,7 +197,7 @@ def test_chooser_chooses_specific_python_universal_wheel_link_if_available( ...@@ -197,7 +197,7 @@ def test_chooser_chooses_specific_python_universal_wheel_link_if_available(
mock_legacy: None, mock_legacy: None,
source_type: str, source_type: str,
pool: RepositoryPool, pool: RepositoryPool,
): ) -> None:
chooser = Chooser(pool, env) chooser = Chooser(pool, env)
package = Package("isort", "4.3.4") package = Package("isort", "4.3.4")
...@@ -218,7 +218,7 @@ def test_chooser_chooses_specific_python_universal_wheel_link_if_available( ...@@ -218,7 +218,7 @@ def test_chooser_chooses_specific_python_universal_wheel_link_if_available(
@pytest.mark.parametrize("source_type", ["", "legacy"]) @pytest.mark.parametrize("source_type", ["", "legacy"])
def test_chooser_chooses_system_specific_wheel_link_if_available( def test_chooser_chooses_system_specific_wheel_link_if_available(
mock_pypi: None, mock_legacy: None, source_type: str, pool: RepositoryPool mock_pypi: None, mock_legacy: None, source_type: str, pool: RepositoryPool
): ) -> None:
env = MockEnv( env = MockEnv(
supported_tags=[Tag("cp37", "cp37m", "win32"), Tag("py3", "none", "any")] supported_tags=[Tag("cp37", "cp37m", "win32"), Tag("py3", "none", "any")]
) )
...@@ -246,7 +246,7 @@ def test_chooser_chooses_sdist_if_no_compatible_wheel_link_is_available( ...@@ -246,7 +246,7 @@ def test_chooser_chooses_sdist_if_no_compatible_wheel_link_is_available(
mock_legacy: None, mock_legacy: None,
source_type: str, source_type: str,
pool: RepositoryPool, pool: RepositoryPool,
): ) -> None:
chooser = Chooser(pool, env) chooser = Chooser(pool, env)
package = Package("pyyaml", "3.13.0") package = Package("pyyaml", "3.13.0")
...@@ -271,7 +271,7 @@ def test_chooser_chooses_distributions_that_match_the_package_hashes( ...@@ -271,7 +271,7 @@ def test_chooser_chooses_distributions_that_match_the_package_hashes(
mock_legacy: None, mock_legacy: None,
source_type: str, source_type: str,
pool: RepositoryPool, pool: RepositoryPool,
): ) -> None:
chooser = Chooser(pool, env) chooser = Chooser(pool, env)
package = Package("isort", "4.3.4") package = Package("isort", "4.3.4")
...@@ -381,7 +381,7 @@ def test_chooser_throws_an_error_if_package_hashes_do_not_match( ...@@ -381,7 +381,7 @@ def test_chooser_throws_an_error_if_package_hashes_do_not_match(
mock_legacy: None, mock_legacy: None,
source_type: None, source_type: None,
pool: RepositoryPool, pool: RepositoryPool,
): ) -> None:
chooser = Chooser(pool, env) chooser = Chooser(pool, env)
package = Package("isort", "4.3.4") package = Package("isort", "4.3.4")
......
...@@ -10,11 +10,13 @@ from poetry.mixology.version_solver import VersionSolver ...@@ -10,11 +10,13 @@ from poetry.mixology.version_solver import VersionSolver
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Mapping
from packaging.utils import NormalizedName from packaging.utils import NormalizedName
from poetry.core.factory import DependencyConstraint from poetry.core.factory import DependencyConstraint
from poetry.core.packages.project_package import ProjectPackage from poetry.core.packages.project_package import ProjectPackage
from poetry.mixology import SolverResult from poetry.mixology.result import SolverResult
from poetry.repositories import Repository from poetry.repositories import Repository
from tests.mixology.version_solver.conftest import Provider from tests.mixology.version_solver.conftest import Provider
...@@ -23,7 +25,7 @@ def add_to_repo( ...@@ -23,7 +25,7 @@ def add_to_repo(
repository: Repository, repository: Repository,
name: str, name: str,
version: str, version: str,
deps: dict[str, DependencyConstraint] | None = None, deps: Mapping[str, DependencyConstraint] | None = None,
python: str | None = None, python: str | None = None,
yanked: bool = False, yanked: bool = False,
) -> None: ) -> None:
...@@ -62,7 +64,7 @@ def check_solver_result( ...@@ -62,7 +64,7 @@ def check_solver_result(
except AssertionError as e: except AssertionError as e:
if error: if error:
assert str(e) == error assert str(e) == error
return return None
raise raise
packages = {} packages = {}
......
...@@ -16,7 +16,7 @@ if TYPE_CHECKING: ...@@ -16,7 +16,7 @@ if TYPE_CHECKING:
def test_circular_dependency_on_older_version( def test_circular_dependency_on_older_version(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("a", ">=1.0.0")) root.add_dependency(Factory.create_dependency("a", ">=1.0.0"))
add_to_repo(repo, "a", "1.0.0") add_to_repo(repo, "a", "1.0.0")
...@@ -28,7 +28,7 @@ def test_circular_dependency_on_older_version( ...@@ -28,7 +28,7 @@ def test_circular_dependency_on_older_version(
def test_diamond_dependency_graph( def test_diamond_dependency_graph(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("a", "*")) root.add_dependency(Factory.create_dependency("a", "*"))
root.add_dependency(Factory.create_dependency("b", "*")) root.add_dependency(Factory.create_dependency("b", "*"))
...@@ -47,7 +47,7 @@ def test_diamond_dependency_graph( ...@@ -47,7 +47,7 @@ def test_diamond_dependency_graph(
def test_backjumps_after_partial_satisfier( def test_backjumps_after_partial_satisfier(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
# c 2.0.0 is incompatible with y 2.0.0 because it requires x 1.0.0, but that # c 2.0.0 is incompatible with y 2.0.0 because it requires x 1.0.0, but that
# requirement only exists because of both a and b. The solver should be able # requirement only exists because of both a and b. The solver should be able
# to deduce c 2.0.0's incompatibility and select c 1.0.0 instead. # to deduce c 2.0.0's incompatibility and select c 1.0.0 instead.
...@@ -72,7 +72,7 @@ def test_backjumps_after_partial_satisfier( ...@@ -72,7 +72,7 @@ def test_backjumps_after_partial_satisfier(
def test_rolls_back_leaf_versions_first( def test_rolls_back_leaf_versions_first(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
# The latest versions of a and b disagree on c. An older version of either # The latest versions of a and b disagree on c. An older version of either
# will resolve the problem. This test validates that b, which is farther # will resolve the problem. This test validates that b, which is farther
# in the dependency graph from myapp is downgraded first. # in the dependency graph from myapp is downgraded first.
...@@ -88,7 +88,9 @@ def test_rolls_back_leaf_versions_first( ...@@ -88,7 +88,9 @@ def test_rolls_back_leaf_versions_first(
check_solver_result(root, provider, {"a": "2.0.0", "b": "1.0.0", "c": "2.0.0"}) check_solver_result(root, provider, {"a": "2.0.0", "b": "1.0.0", "c": "2.0.0"})
def test_simple_transitive(root: ProjectPackage, provider: Provider, repo: Repository): def test_simple_transitive(
root: ProjectPackage, provider: Provider, repo: Repository
) -> None:
# Only one version of baz, so foo and bar will have to downgrade # Only one version of baz, so foo and bar will have to downgrade
# until they reach it # until they reach it
root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("foo", "*"))
...@@ -110,7 +112,7 @@ def test_simple_transitive(root: ProjectPackage, provider: Provider, repo: Repos ...@@ -110,7 +112,7 @@ def test_simple_transitive(root: ProjectPackage, provider: Provider, repo: Repos
def test_backjump_to_nearer_unsatisfied_package( def test_backjump_to_nearer_unsatisfied_package(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
# This ensures it doesn't exhaustively search all versions of b when it's # This ensures it doesn't exhaustively search all versions of b when it's
# a-2.0.0 whose dependency on c-2.0.0-nonexistent led to the problem. We # a-2.0.0 whose dependency on c-2.0.0-nonexistent led to the problem. We
# make sure b has more versions than a so that the solver tries a first # make sure b has more versions than a so that the solver tries a first
...@@ -132,7 +134,7 @@ def test_backjump_to_nearer_unsatisfied_package( ...@@ -132,7 +134,7 @@ def test_backjump_to_nearer_unsatisfied_package(
def test_traverse_into_package_with_fewer_versions_first( def test_traverse_into_package_with_fewer_versions_first(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
# Dependencies are ordered so that packages with fewer versions are tried # Dependencies are ordered so that packages with fewer versions are tried
# first. Here, there are two valid solutions (either a or b must be # first. Here, there are two valid solutions (either a or b must be
# downgraded once). The chosen one depends on which dep is traversed first. # downgraded once). The chosen one depends on which dep is traversed first.
...@@ -158,7 +160,7 @@ def test_traverse_into_package_with_fewer_versions_first( ...@@ -158,7 +160,7 @@ def test_traverse_into_package_with_fewer_versions_first(
def test_backjump_past_failed_package_on_disjoint_constraint( def test_backjump_past_failed_package_on_disjoint_constraint(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("a", "*")) root.add_dependency(Factory.create_dependency("a", "*"))
root.add_dependency(Factory.create_dependency("foo", ">2.0.0")) root.add_dependency(Factory.create_dependency("foo", ">2.0.0"))
......
...@@ -18,7 +18,7 @@ if TYPE_CHECKING: ...@@ -18,7 +18,7 @@ if TYPE_CHECKING:
def test_simple_dependencies( def test_simple_dependencies(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("a", "1.0.0")) root.add_dependency(Factory.create_dependency("a", "1.0.0"))
root.add_dependency(Factory.create_dependency("b", "1.0.0")) root.add_dependency(Factory.create_dependency("b", "1.0.0"))
...@@ -45,7 +45,7 @@ def test_simple_dependencies( ...@@ -45,7 +45,7 @@ def test_simple_dependencies(
def test_shared_dependencies_with_overlapping_constraints( def test_shared_dependencies_with_overlapping_constraints(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("a", "1.0.0")) root.add_dependency(Factory.create_dependency("a", "1.0.0"))
root.add_dependency(Factory.create_dependency("b", "1.0.0")) root.add_dependency(Factory.create_dependency("b", "1.0.0"))
...@@ -62,7 +62,7 @@ def test_shared_dependencies_with_overlapping_constraints( ...@@ -62,7 +62,7 @@ def test_shared_dependencies_with_overlapping_constraints(
def test_shared_dependency_where_dependent_version_affects_other_dependencies( def test_shared_dependency_where_dependent_version_affects_other_dependencies(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "<=1.0.2")) root.add_dependency(Factory.create_dependency("foo", "<=1.0.2"))
root.add_dependency(Factory.create_dependency("bar", "1.0.0")) root.add_dependency(Factory.create_dependency("bar", "1.0.0"))
...@@ -82,7 +82,7 @@ def test_shared_dependency_where_dependent_version_affects_other_dependencies( ...@@ -82,7 +82,7 @@ def test_shared_dependency_where_dependent_version_affects_other_dependencies(
def test_circular_dependency( def test_circular_dependency(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "1.0.0")) root.add_dependency(Factory.create_dependency("foo", "1.0.0"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"}) add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
......
...@@ -18,7 +18,7 @@ if TYPE_CHECKING: ...@@ -18,7 +18,7 @@ if TYPE_CHECKING:
def test_solver_dependency_cache_respects_source_type( def test_solver_dependency_cache_respects_source_type(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
dependency_pypi = Factory.create_dependency("demo", ">=0.1.0") dependency_pypi = Factory.create_dependency("demo", ">=0.1.0")
dependency_git = Factory.create_dependency( dependency_git = Factory.create_dependency(
"demo", {"git": "https://github.com/demo/demo.git"}, groups=["dev"] "demo", {"git": "https://github.com/demo/demo.git"}, groups=["dev"]
...@@ -62,7 +62,7 @@ def test_solver_dependency_cache_respects_source_type( ...@@ -62,7 +62,7 @@ def test_solver_dependency_cache_respects_source_type(
def test_solver_dependency_cache_respects_subdirectories( def test_solver_dependency_cache_respects_subdirectories(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
dependency_one = Factory.create_dependency( dependency_one = Factory.create_dependency(
"one", "one",
{ {
......
...@@ -16,7 +16,7 @@ if TYPE_CHECKING: ...@@ -16,7 +16,7 @@ if TYPE_CHECKING:
def test_dependency_does_not_match_root_python_constraint( def test_dependency_does_not_match_root_python_constraint(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
provider.set_package_python_versions("^3.6") provider.set_package_python_versions("^3.6")
root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("foo", "*"))
......
...@@ -17,7 +17,7 @@ if TYPE_CHECKING: ...@@ -17,7 +17,7 @@ if TYPE_CHECKING:
def test_no_version_matching_constraint( def test_no_version_matching_constraint(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "^1.0")) root.add_dependency(Factory.create_dependency("foo", "^1.0"))
add_to_repo(repo, "foo", "2.0.0") add_to_repo(repo, "foo", "2.0.0")
...@@ -35,7 +35,7 @@ def test_no_version_matching_constraint( ...@@ -35,7 +35,7 @@ def test_no_version_matching_constraint(
def test_no_version_that_matches_combined_constraints( def test_no_version_that_matches_combined_constraints(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "1.0.0")) root.add_dependency(Factory.create_dependency("foo", "1.0.0"))
root.add_dependency(Factory.create_dependency("bar", "1.0.0")) root.add_dependency(Factory.create_dependency("bar", "1.0.0"))
...@@ -58,7 +58,7 @@ So, because myapp depends on both foo (1.0.0) and bar (1.0.0), version solving f ...@@ -58,7 +58,7 @@ So, because myapp depends on both foo (1.0.0) and bar (1.0.0), version solving f
def test_disjoint_constraints( def test_disjoint_constraints(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "1.0.0")) root.add_dependency(Factory.create_dependency("foo", "1.0.0"))
root.add_dependency(Factory.create_dependency("bar", "1.0.0")) root.add_dependency(Factory.create_dependency("bar", "1.0.0"))
...@@ -80,7 +80,7 @@ So, because myapp depends on both foo (1.0.0) and bar (1.0.0), version solving f ...@@ -80,7 +80,7 @@ So, because myapp depends on both foo (1.0.0) and bar (1.0.0), version solving f
def test_disjoint_root_constraints( def test_disjoint_root_constraints(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "1.0.0")) root.add_dependency(Factory.create_dependency("foo", "1.0.0"))
root.add_dependency(Factory.create_dependency("foo", "2.0.0")) root.add_dependency(Factory.create_dependency("foo", "2.0.0"))
...@@ -95,7 +95,7 @@ Because myapp depends on both foo (1.0.0) and foo (2.0.0), version solving faile ...@@ -95,7 +95,7 @@ Because myapp depends on both foo (1.0.0) and foo (2.0.0), version solving faile
def test_disjoint_root_constraints_path_dependencies( def test_disjoint_root_constraints_path_dependencies(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
provider.set_package_python_versions("^3.7") provider.set_package_python_versions("^3.7")
fixtures = Path(__file__).parent.parent.parent / "fixtures" fixtures = Path(__file__).parent.parent.parent / "fixtures"
project_dir = fixtures.joinpath("with_conditional_path_deps") project_dir = fixtures.joinpath("with_conditional_path_deps")
...@@ -112,7 +112,9 @@ def test_disjoint_root_constraints_path_dependencies( ...@@ -112,7 +112,9 @@ def test_disjoint_root_constraints_path_dependencies(
check_solver_result(root, provider, error=error) check_solver_result(root, provider, error=error)
def test_no_valid_solution(root: ProjectPackage, provider: Provider, repo: Repository): def test_no_valid_solution(
root: ProjectPackage, provider: Provider, repo: Repository
) -> None:
root.add_dependency(Factory.create_dependency("a", "*")) root.add_dependency(Factory.create_dependency("a", "*"))
root.add_dependency(Factory.create_dependency("b", "*")) root.add_dependency(Factory.create_dependency("b", "*"))
...@@ -135,7 +137,7 @@ So, because myapp depends on b (*), version solving failed.""" ...@@ -135,7 +137,7 @@ So, because myapp depends on b (*), version solving failed."""
def test_package_with_the_same_name_gives_clear_error_message( def test_package_with_the_same_name_gives_clear_error_message(
root: ProjectPackage, provider: Provider, repo: Repository root: ProjectPackage, provider: Provider, repo: Repository
): ) -> None:
pkg_name = "a" pkg_name = "a"
root.add_dependency(Factory.create_dependency(pkg_name, "*")) root.add_dependency(Factory.create_dependency(pkg_name, "*"))
add_to_repo(repo, pkg_name, "1.0.0", deps={pkg_name: "1.0.0"}) add_to_repo(repo, pkg_name, "1.0.0", deps={pkg_name: "1.0.0"})
......
...@@ -22,7 +22,7 @@ if TYPE_CHECKING: ...@@ -22,7 +22,7 @@ if TYPE_CHECKING:
def test_with_compatible_locked_dependencies( def test_with_compatible_locked_dependencies(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("foo", "*"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"}) add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
...@@ -44,7 +44,7 @@ def test_with_compatible_locked_dependencies( ...@@ -44,7 +44,7 @@ def test_with_compatible_locked_dependencies(
def test_with_incompatible_locked_dependencies( def test_with_incompatible_locked_dependencies(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", ">1.0.1")) root.add_dependency(Factory.create_dependency("foo", ">1.0.1"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"}) add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
...@@ -66,7 +66,7 @@ def test_with_incompatible_locked_dependencies( ...@@ -66,7 +66,7 @@ def test_with_incompatible_locked_dependencies(
def test_with_unrelated_locked_dependencies( def test_with_unrelated_locked_dependencies(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("foo", "*"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"}) add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
...@@ -89,7 +89,7 @@ def test_with_unrelated_locked_dependencies( ...@@ -89,7 +89,7 @@ def test_with_unrelated_locked_dependencies(
def test_unlocks_dependencies_if_necessary_to_ensure_that_a_new_dependency_is_satisfied( def test_unlocks_dependencies_if_necessary_to_ensure_that_a_new_dependency_is_satisfied(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("foo", "*"))
root.add_dependency(Factory.create_dependency("newdep", "2.0.0")) root.add_dependency(Factory.create_dependency("newdep", "2.0.0"))
...@@ -126,7 +126,7 @@ def test_unlocks_dependencies_if_necessary_to_ensure_that_a_new_dependency_is_sa ...@@ -126,7 +126,7 @@ def test_unlocks_dependencies_if_necessary_to_ensure_that_a_new_dependency_is_sa
def test_with_compatible_locked_dependencies_use_latest( def test_with_compatible_locked_dependencies_use_latest(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("foo", "*"))
root.add_dependency(Factory.create_dependency("baz", "*")) root.add_dependency(Factory.create_dependency("baz", "*"))
...@@ -156,7 +156,7 @@ def test_with_compatible_locked_dependencies_use_latest( ...@@ -156,7 +156,7 @@ def test_with_compatible_locked_dependencies_use_latest(
def test_with_compatible_locked_dependencies_with_extras( def test_with_compatible_locked_dependencies_with_extras(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "^1.0")) root.add_dependency(Factory.create_dependency("foo", "^1.0"))
package_foo_0 = get_package("foo", "1.0.0") package_foo_0 = get_package("foo", "1.0.0")
...@@ -190,7 +190,7 @@ def test_with_compatible_locked_dependencies_with_extras( ...@@ -190,7 +190,7 @@ def test_with_compatible_locked_dependencies_with_extras(
def test_with_yanked_package_in_lock( def test_with_yanked_package_in_lock(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "*")) root.add_dependency(Factory.create_dependency("foo", "*"))
add_to_repo(repo, "foo", "1") add_to_repo(repo, "foo", "1")
...@@ -205,6 +205,7 @@ def test_with_yanked_package_in_lock( ...@@ -205,6 +205,7 @@ def test_with_yanked_package_in_lock(
provider, provider,
result={"foo": "2"}, result={"foo": "2"},
) )
assert result is not None
foo = result.packages[0] foo = result.packages[0]
assert foo.yanked assert foo.yanked
...@@ -219,7 +220,7 @@ def test_with_yanked_package_in_lock( ...@@ -219,7 +220,7 @@ def test_with_yanked_package_in_lock(
def test_no_update_is_respected_for_legacy_repository( def test_no_update_is_respected_for_legacy_repository(
root: ProjectPackage, repo: Repository, pool: RepositoryPool root: ProjectPackage, repo: Repository, pool: RepositoryPool
): ) -> None:
root.add_dependency(Factory.create_dependency("foo", "^1.0")) root.add_dependency(Factory.create_dependency("foo", "^1.0"))
foo_100 = Package( foo_100 = Package(
......
...@@ -23,7 +23,7 @@ if TYPE_CHECKING: ...@@ -23,7 +23,7 @@ if TYPE_CHECKING:
def test_publish_publishes_to_pypi_by_default( def test_publish_publishes_to_pypi_by_default(
fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config
): ) -> None:
uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth")
uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload")
poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry = Factory().create_poetry(fixture_dir("sample_project"))
...@@ -48,7 +48,7 @@ def test_publish_can_publish_to_given_repository( ...@@ -48,7 +48,7 @@ def test_publish_can_publish_to_given_repository(
mocker: MockerFixture, mocker: MockerFixture,
config: Config, config: Config,
fixture_name: str, fixture_name: str,
): ) -> None:
uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth")
uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload")
...@@ -77,7 +77,7 @@ def test_publish_can_publish_to_given_repository( ...@@ -77,7 +77,7 @@ def test_publish_can_publish_to_given_repository(
def test_publish_raises_error_for_undefined_repository( def test_publish_raises_error_for_undefined_repository(
fixture_dir: FixtureDirGetter, config: Config fixture_dir: FixtureDirGetter, config: Config
): ) -> None:
poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry = Factory().create_poetry(fixture_dir("sample_project"))
poetry._config = config poetry._config = config
poetry.config.merge( poetry.config.merge(
...@@ -91,7 +91,7 @@ def test_publish_raises_error_for_undefined_repository( ...@@ -91,7 +91,7 @@ def test_publish_raises_error_for_undefined_repository(
def test_publish_uses_token_if_it_exists( def test_publish_uses_token_if_it_exists(
fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config
): ) -> None:
uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth")
uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload")
poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry = Factory().create_poetry(fixture_dir("sample_project"))
...@@ -110,7 +110,7 @@ def test_publish_uses_token_if_it_exists( ...@@ -110,7 +110,7 @@ def test_publish_uses_token_if_it_exists(
def test_publish_uses_cert( def test_publish_uses_cert(
fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config
): ) -> None:
cert = "path/to/ca.pem" cert = "path/to/ca.pem"
uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth")
uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload")
...@@ -141,7 +141,7 @@ def test_publish_uses_cert( ...@@ -141,7 +141,7 @@ def test_publish_uses_cert(
def test_publish_uses_client_cert( def test_publish_uses_client_cert(
fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config
): ) -> None:
client_cert = "path/to/client.pem" client_cert = "path/to/client.pem"
uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload")
poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry = Factory().create_poetry(fixture_dir("sample_project"))
...@@ -172,7 +172,7 @@ def test_publish_read_from_environment_variable( ...@@ -172,7 +172,7 @@ def test_publish_read_from_environment_variable(
environ: None, environ: None,
mocker: MockerFixture, mocker: MockerFixture,
config: Config, config: Config,
): ) -> None:
os.environ["POETRY_REPOSITORIES_FOO_URL"] = "https://foo.bar" os.environ["POETRY_REPOSITORIES_FOO_URL"] = "https://foo.bar"
os.environ["POETRY_HTTP_BASIC_FOO_USERNAME"] = "bar" os.environ["POETRY_HTTP_BASIC_FOO_USERNAME"] = "bar"
os.environ["POETRY_HTTP_BASIC_FOO_PASSWORD"] = "baz" os.environ["POETRY_HTTP_BASIC_FOO_PASSWORD"] = "baz"
......
...@@ -26,7 +26,7 @@ def uploader(fixture_dir: FixtureDirGetter) -> Uploader: ...@@ -26,7 +26,7 @@ def uploader(fixture_dir: FixtureDirGetter) -> Uploader:
def test_uploader_properly_handles_400_errors( def test_uploader_properly_handles_400_errors(
http: type[httpretty.httpretty], uploader: Uploader http: type[httpretty.httpretty], uploader: Uploader
): ) -> None:
http.register_uri(http.POST, "https://foo.com", status=400, body="Bad request") http.register_uri(http.POST, "https://foo.com", status=400, body="Bad request")
with pytest.raises(UploadError) as e: with pytest.raises(UploadError) as e:
...@@ -37,7 +37,7 @@ def test_uploader_properly_handles_400_errors( ...@@ -37,7 +37,7 @@ def test_uploader_properly_handles_400_errors(
def test_uploader_properly_handles_403_errors( def test_uploader_properly_handles_403_errors(
http: type[httpretty.httpretty], uploader: Uploader http: type[httpretty.httpretty], uploader: Uploader
): ) -> None:
http.register_uri(http.POST, "https://foo.com", status=403, body="Unauthorized") http.register_uri(http.POST, "https://foo.com", status=403, body="Unauthorized")
with pytest.raises(UploadError) as e: with pytest.raises(UploadError) as e:
...@@ -48,7 +48,7 @@ def test_uploader_properly_handles_403_errors( ...@@ -48,7 +48,7 @@ def test_uploader_properly_handles_403_errors(
def test_uploader_properly_handles_nonstandard_errors( def test_uploader_properly_handles_nonstandard_errors(
http: type[httpretty.httpretty], uploader: Uploader http: type[httpretty.httpretty], uploader: Uploader
): ) -> None:
# content based off a true story. # content based off a true story.
# Message changed to protect the ~~innocent~~ guilty. # Message changed to protect the ~~innocent~~ guilty.
content = ( content = (
...@@ -62,7 +62,7 @@ def test_uploader_properly_handles_nonstandard_errors( ...@@ -62,7 +62,7 @@ def test_uploader_properly_handles_nonstandard_errors(
with pytest.raises(UploadError) as e: with pytest.raises(UploadError) as e:
uploader.upload("https://foo.com") uploader.upload("https://foo.com")
assert str(e.value) == f"HTTP Error 400: Bad Request | {content}" assert str(e.value) == f"HTTP Error 400: Bad Request | {content!r}"
@pytest.mark.parametrize( @pytest.mark.parametrize(
...@@ -79,7 +79,7 @@ def test_uploader_properly_handles_nonstandard_errors( ...@@ -79,7 +79,7 @@ def test_uploader_properly_handles_nonstandard_errors(
) )
def test_uploader_properly_handles_redirects( def test_uploader_properly_handles_redirects(
http: type[httpretty.httpretty], uploader: Uploader, status: int, body: str http: type[httpretty.httpretty], uploader: Uploader, status: int, body: str
): ) -> None:
http.register_uri(http.POST, "https://foo.com", status=status, body=body) http.register_uri(http.POST, "https://foo.com", status=status, body=body)
with pytest.raises(UploadError) as e: with pytest.raises(UploadError) as e:
...@@ -93,7 +93,7 @@ def test_uploader_properly_handles_redirects( ...@@ -93,7 +93,7 @@ def test_uploader_properly_handles_redirects(
def test_uploader_properly_handles_301_redirects( def test_uploader_properly_handles_301_redirects(
http: type[httpretty.httpretty], uploader: Uploader http: type[httpretty.httpretty], uploader: Uploader
): ) -> None:
http.register_uri(http.POST, "https://foo.com", status=301, body="Redirect") http.register_uri(http.POST, "https://foo.com", status=301, body="Redirect")
with pytest.raises(UploadError) as e: with pytest.raises(UploadError) as e:
...@@ -107,7 +107,7 @@ def test_uploader_properly_handles_301_redirects( ...@@ -107,7 +107,7 @@ def test_uploader_properly_handles_301_redirects(
def test_uploader_registers_for_appropriate_400_errors( def test_uploader_registers_for_appropriate_400_errors(
mocker: MockerFixture, http: type[httpretty.httpretty], uploader: Uploader mocker: MockerFixture, http: type[httpretty.httpretty], uploader: Uploader
): ) -> None:
register = mocker.patch("poetry.publishing.uploader.Uploader._register") register = mocker.patch("poetry.publishing.uploader.Uploader._register")
http.register_uri( http.register_uri(
http.POST, "https://foo.com", status=400, body="No package was ever registered" http.POST, "https://foo.com", status=400, body="No package was ever registered"
...@@ -131,7 +131,7 @@ def test_uploader_registers_for_appropriate_400_errors( ...@@ -131,7 +131,7 @@ def test_uploader_registers_for_appropriate_400_errors(
) )
def test_uploader_skips_existing( def test_uploader_skips_existing(
http: type[httpretty.httpretty], uploader: Uploader, status: int, body: str http: type[httpretty.httpretty], uploader: Uploader, status: int, body: str
): ) -> None:
http.register_uri(http.POST, "https://foo.com", status=status, body=body) http.register_uri(http.POST, "https://foo.com", status=status, body=body)
# should not raise # should not raise
...@@ -140,7 +140,7 @@ def test_uploader_skips_existing( ...@@ -140,7 +140,7 @@ def test_uploader_skips_existing(
def test_uploader_skip_existing_bubbles_unskippable_errors( def test_uploader_skip_existing_bubbles_unskippable_errors(
http: type[httpretty.httpretty], uploader: Uploader http: type[httpretty.httpretty], uploader: Uploader
): ) -> None:
http.register_uri(http.POST, "https://foo.com", status=403, body="Unauthorized") http.register_uri(http.POST, "https://foo.com", status=403, body="Unauthorized")
with pytest.raises(UploadError): with pytest.raises(UploadError):
...@@ -149,7 +149,7 @@ def test_uploader_skip_existing_bubbles_unskippable_errors( ...@@ -149,7 +149,7 @@ def test_uploader_skip_existing_bubbles_unskippable_errors(
def test_uploader_properly_handles_file_not_existing( def test_uploader_properly_handles_file_not_existing(
mocker: MockerFixture, http: type[httpretty.httpretty], uploader: Uploader mocker: MockerFixture, http: type[httpretty.httpretty], uploader: Uploader
): ) -> None:
mocker.patch("pathlib.Path.is_file", return_value=False) mocker.patch("pathlib.Path.is_file", return_value=False)
with pytest.raises(UploadError) as e: with pytest.raises(UploadError) as e:
......
...@@ -93,17 +93,7 @@ def test_search_for( ...@@ -93,17 +93,7 @@ def test_search_for(
repository.add_package(foo2a) repository.add_package(foo2a)
repository.add_package(foo2) repository.add_package(foo2)
repository.add_package(foo3a) repository.add_package(foo3a)
# TODO: remove workaround when poetry-core with
# https://github.com/python-poetry/poetry-core/pull/543 is available
if str(dependency.constraint) == ">=1a":
result = provider.search_for(dependency)
assert result == expected or result == [
Package("foo", "3a"),
Package("foo", "2"),
Package("foo", "2a"),
Package("foo", "1"),
]
return
assert provider.search_for(dependency) == expected assert provider.search_for(dependency) == expected
......
...@@ -3,6 +3,7 @@ from __future__ import annotations ...@@ -3,6 +3,7 @@ from __future__ import annotations
import base64 import base64
import re import re
import shutil import shutil
import urllib.parse as urlparse
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
...@@ -21,11 +22,6 @@ from poetry.repositories.legacy_repository import LegacyRepository ...@@ -21,11 +22,6 @@ from poetry.repositories.legacy_repository import LegacyRepository
from poetry.repositories.link_sources.html import SimpleRepositoryPage from poetry.repositories.link_sources.html import SimpleRepositoryPage
try:
import urllib.parse as urlparse
except ImportError:
import urlparse
if TYPE_CHECKING: if TYPE_CHECKING:
import httpretty import httpretty
......
...@@ -19,7 +19,6 @@ from poetry.factory import Factory ...@@ -19,7 +19,6 @@ from poetry.factory import Factory
from poetry.repositories.exceptions import PackageNotFound from poetry.repositories.exceptions import PackageNotFound
from poetry.repositories.link_sources.json import SimpleJsonPage from poetry.repositories.link_sources.json import SimpleJsonPage
from poetry.repositories.pypi_repository import PyPiRepository from poetry.repositories.pypi_repository import PyPiRepository
from poetry.utils._compat import encode
if TYPE_CHECKING: if TYPE_CHECKING:
...@@ -302,10 +301,8 @@ def test_pypi_repository_supports_reading_bz2_files() -> None: ...@@ -302,10 +301,8 @@ def test_pypi_repository_supports_reading_bz2_files() -> None:
] ]
} }
for name in expected_extras.keys(): for name, expected_extra in expected_extras.items():
assert ( assert sorted(package.extras[name], key=lambda r: r.name) == expected_extra
sorted(package.extras[name], key=lambda r: r.name) == expected_extras[name]
)
def test_invalid_versions_ignored() -> None: def test_invalid_versions_ignored() -> None:
...@@ -325,7 +322,7 @@ def test_get_should_invalid_cache_on_too_many_redirects_error( ...@@ -325,7 +322,7 @@ def test_get_should_invalid_cache_on_too_many_redirects_error(
response = Response() response = Response()
response.status_code = 200 response.status_code = 200
response.encoding = "utf-8" response.encoding = "utf-8"
response.raw = BytesIO(encode('{"foo": "bar"}')) response.raw = BytesIO(b'{"foo": "bar"}')
mocker.patch( mocker.patch(
"poetry.utils.authenticator.Authenticator.get", "poetry.utils.authenticator.Authenticator.get",
side_effect=[TooManyRedirects(), response], side_effect=[TooManyRedirects(), response],
......
from __future__ import annotations from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Any
from tests.compat import Protocol from tests.compat import Protocol
...@@ -46,6 +47,7 @@ class ProjectFactory(Protocol): ...@@ -46,6 +47,7 @@ class ProjectFactory(Protocol):
poetry_lock_content: str | None = None, poetry_lock_content: str | None = None,
install_deps: bool = True, install_deps: bool = True,
source: Path | None = None, source: Path | None = None,
locker_config: dict[str, Any] | None = None,
use_test_locker: bool = True, use_test_locker: bool = True,
) -> Poetry: ) -> Poetry:
... ...
......
...@@ -5,7 +5,6 @@ import uuid ...@@ -5,7 +5,6 @@ import uuid
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from poetry.utils._compat import decode
from poetry.utils.env import SitePackages from poetry.utils.env import SitePackages
...@@ -23,7 +22,7 @@ def test_env_site_simple(tmp_dir: str, mocker: MockerFixture): ...@@ -23,7 +22,7 @@ def test_env_site_simple(tmp_dir: str, mocker: MockerFixture):
assert len(candidates) == 1 assert len(candidates) == 1
assert candidates[0].as_posix() == hello.as_posix() assert candidates[0].as_posix() == hello.as_posix()
content = decode(str(uuid.uuid4())) content = str(uuid.uuid4())
site_packages.write_text(Path("hello.txt"), content, encoding="utf-8") site_packages.write_text(Path("hello.txt"), content, encoding="utf-8")
assert hello.read_text(encoding="utf-8") == content assert hello.read_text(encoding="utf-8") == content
...@@ -42,7 +41,7 @@ def test_env_site_select_first(tmp_dir: str): ...@@ -42,7 +41,7 @@ def test_env_site_select_first(tmp_dir: str):
assert len(candidates) == 2 assert len(candidates) == 2
assert len(site_packages.find(Path("hello.txt"))) == 0 assert len(site_packages.find(Path("hello.txt"))) == 0
content = decode(str(uuid.uuid4())) content = str(uuid.uuid4())
site_packages.write_text(Path("hello.txt"), content, encoding="utf-8") site_packages.write_text(Path("hello.txt"), content, encoding="utf-8")
assert (site_packages.path / "hello.txt").exists() assert (site_packages.path / "hello.txt").exists()
......
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