Commit 55127c89 by Sébastien Eustace Committed by Randy Döring

Improve sources management

parent d9b563b3
......@@ -36,7 +36,6 @@ class SourceAddCommand(Command):
def handle(self) -> int:
from poetry.factory import Factory
from poetry.repositories import RepositoryPool
from poetry.utils.source import source_to_table
name = self.argument("name")
......@@ -84,13 +83,14 @@ class SourceAddCommand(Command):
self.line(f"Adding source with name <c1>{name}</c1>.")
sources.append(source_to_table(new_source))
self.poetry.config.merge(
{"sources": {source["name"]: source for source in sources}}
)
# ensure new source is valid. eg: invalid name etc.
self.poetry._pool = RepositoryPool()
try:
Factory.configure_sources(
self.poetry, sources, self.poetry.config, NullIO()
)
self.poetry.pool.repository(name)
pool = Factory.create_pool(self.poetry.config, NullIO())
pool.repository(name)
except ValueError as e:
self.line_error(
f"<error>Failed to validate addition of <c1>{name}</c1>: {e}</error>"
......
......@@ -29,10 +29,10 @@ if TYPE_CHECKING:
from poetry.core.packages.package import Package
from tomlkit.toml_document import TOMLDocument
from poetry.repositories import RepositoryPool
from poetry.repositories.legacy_repository import LegacyRepository
from poetry.utils.dependency_specification import DependencySpec
logger = logging.getLogger(__name__)
......@@ -90,13 +90,15 @@ class Factory(BaseFactory):
)
# Configuring sources
self.configure_sources(
poetry,
poetry.local_config.get("source", []),
config,
io,
disable_cache=disable_cache,
config.merge(
{
"sources": {
source["name"]: source
for source in poetry.local_config.get("source", [])
}
}
)
poetry.set_pool(self.create_pool(config, io, disable_cache=disable_cache))
plugin_manager = PluginManager(Plugin.group, disable_plugins=disable_plugins)
plugin_manager.load_plugins()
......@@ -110,23 +112,28 @@ class Factory(BaseFactory):
return ProjectPackage(name, version)
@classmethod
def configure_sources(
def create_pool(
cls,
poetry: Poetry,
sources: list[dict[str, str]],
config: Config,
io: IO,
io: IO | None = None,
disable_cache: bool = False,
) -> None:
) -> RepositoryPool:
from poetry.repositories import RepositoryPool
if io is None:
io = NullIO()
if disable_cache:
logger.debug("Disabling source caches")
for source in sources:
pool = RepositoryPool()
for source in config.get("sources", {}).values():
repository = cls.create_package_source(
source, config, disable_cache=disable_cache
)
is_default = bool(source.get("default", False))
is_secondary = bool(source.get("secondary", False))
is_default = source.get("default", False)
is_secondary = source.get("secondary", False)
if io.is_debug():
message = f"Adding repository {repository.name} ({repository.url})"
if is_default:
......@@ -136,22 +143,24 @@ class Factory(BaseFactory):
io.write_line(message)
poetry.pool.add_repository(repository, is_default, secondary=is_secondary)
pool.add_repository(repository, is_default, secondary=is_secondary)
# Put PyPI last to prefer private repositories
# unless we have no default source AND no primary sources
# (default = false, secondary = false)
if poetry.pool.has_default():
if pool.has_default():
if io.is_debug():
io.write_line("Deactivating the PyPI repository")
else:
from poetry.repositories.pypi_repository import PyPiRepository
default = not poetry.pool.has_primary_repositories()
poetry.pool.add_repository(
default = not pool.has_primary_repositories()
pool.add_repository(
PyPiRepository(disable_cache=disable_cache), default, not default
)
return pool
@classmethod
def create_package_source(
cls, source: dict[str, str], auth_config: Config, disable_cache: bool = False
......
from __future__ import annotations
from typing import TYPE_CHECKING
from typing import Callable
import pytest
from poetry.core.packages.package import Package
from poetry.__version__ import __version__
from poetry.factory import Factory
from poetry.repositories import RepositoryPool
from poetry.utils.env import EnvManager
......@@ -14,8 +16,10 @@ from poetry.utils.env import EnvManager
if TYPE_CHECKING:
import httpretty
from cleo.io.io import IO
from pytest_mock import MockerFixture
from poetry.config.config import Config
from poetry.repositories.repository import Repository
from poetry.utils.env import VirtualEnv
from tests.helpers import TestRepository
......@@ -38,6 +42,20 @@ def pool(repo: TestRepository) -> RepositoryPool:
return RepositoryPool([repo])
def create_pool_factory(
repo: Repository,
) -> Callable[[Config, IO, bool], RepositoryPool]:
def _create_pool(
config: Config, io: IO, disable_cache: bool = False
) -> RepositoryPool:
pool = RepositoryPool()
pool.add_repository(repo)
return pool
return _create_pool
@pytest.fixture(autouse=True)
def setup_mocks(
mocker: MockerFixture,
......@@ -45,6 +63,7 @@ def setup_mocks(
installed: Repository,
pool: RepositoryPool,
http: type[httpretty.httpretty],
repo: Repository,
) -> None:
mocker.patch.object(EnvManager, "get_system_env", return_value=tmp_venv)
mocker.patch(
......@@ -59,3 +78,4 @@ def setup_mocks(
"poetry.installation.installer.Installer._get_installed",
return_value=installed,
)
mocker.patch.object(Factory, "create_pool", side_effect=create_pool_factory(repo))
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