Commit da40171d by Arun Babu Neelicattu Committed by GitHub

Make imports lazier (#3938)

This change speeds up poetry command start time by 50ms compared to
current master and around 250ms compared to 1.1.5.

Relates-to: #3502
parent 6e53b90d
from pathlib import Path
from poetry.core.pyproject.toml import PyProjectTOML
from poetry.factory import Factory
from .command import Command
......@@ -12,6 +9,9 @@ class CheckCommand(Command):
description = "Checks the validity of the <comment>pyproject.toml</comment> file."
def handle(self) -> int:
from poetry.core.pyproject.toml import PyProjectTOML
from poetry.factory import Factory
# Load poetry config and display errors, if any
poetry_file = Factory.locate(Path.cwd())
config = PyProjectTOML(poetry_file).poetry_config
......
......@@ -5,7 +5,7 @@ from typing import List
from cleo.helpers import argument
from cleo.helpers import option
from .installer_command import InstallerCommand
from poetry.console.commands.installer_command import InstallerCommand
class RemoveCommand(InstallerCommand):
......
......@@ -10,8 +10,6 @@ from tomlkit.items import Table
from poetry.config.source import Source
from poetry.console.commands.command import Command
from poetry.factory import Factory
from poetry.repositories import Pool
class SourceAddCommand(Command):
......@@ -39,7 +37,7 @@ class SourceAddCommand(Command):
]
@staticmethod
def source_to_table(source: Source) -> Table:
def source_to_table(source: "Source") -> Table:
source_table: Table = table()
for key, value in source.to_dict().items():
source_table.add(key, value)
......@@ -47,6 +45,9 @@ class SourceAddCommand(Command):
return source_table
def handle(self) -> Optional[int]:
from poetry.factory import Factory
from poetry.repositories import Pool
name = self.argument("name")
url = self.argument("url")
is_default = self.option("default")
......
......@@ -16,7 +16,6 @@ from poetry.packages.locker import Locker
from poetry.packages.project_package import ProjectPackage
from poetry.plugins.plugin_manager import PluginManager
from poetry.poetry import Poetry
from poetry.repositories.pypi_repository import PyPiRepository
if TYPE_CHECKING:
......@@ -156,6 +155,8 @@ class Factory(BaseFactory):
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(PyPiRepository(), default, not default)
......
import re
from typing import TYPE_CHECKING
from typing import List
from typing import Optional
from typing import Tuple
......@@ -8,11 +9,14 @@ from packaging.tags import Tag
from poetry.core.packages.package import Package
from poetry.core.packages.utils.link import Link
from poetry.repositories.pool import Pool
from poetry.utils.env import Env
from poetry.utils.patterns import wheel_file_re
if TYPE_CHECKING:
from poetry.repositories.pool import Pool
class InvalidWheelName(Exception):
pass
......@@ -49,7 +53,7 @@ class Chooser:
A Chooser chooses an appropriate release archive for packages.
"""
def __init__(self, pool: Pool, env: Env) -> None:
def __init__(self, pool: "Pool", env: Env) -> None:
self._pool = pool
self._env = env
......
......@@ -12,7 +12,6 @@ from cleo.io.io import IO
from poetry.core.pyproject.toml import PyProjectTOML
from poetry.installation.base_installer import BaseInstaller
from poetry.repositories.pool import Pool
from poetry.utils._compat import encode
from poetry.utils.env import Env
from poetry.utils.helpers import safe_rmtree
......@@ -22,10 +21,11 @@ from poetry.utils.pip import pip_install
if TYPE_CHECKING:
from poetry.core.packages.package import Package
from poetry.repositories.pool import Pool
class PipInstaller(BaseInstaller):
def __init__(self, env: Env, io: IO, pool: Pool) -> None:
def __init__(self, env: Env, io: IO, pool: "Pool") -> None:
self._env = env
self._io = io
self._pool = pool
......
......@@ -24,8 +24,6 @@ from tomlkit import item
from tomlkit import table
from tomlkit.exceptions import TOMLKitError
import poetry.repositories
from poetry.core.packages.dependency import Dependency
from poetry.core.packages.package import Package
from poetry.core.semver.helpers import parse_constraint
......@@ -40,6 +38,8 @@ from poetry.utils.extras import get_extra_package_names
if TYPE_CHECKING:
from tomlkit.toml_document import TOMLDocument
from poetry.repositories import Repository
logger = logging.getLogger(__name__)
......@@ -87,19 +87,18 @@ class Locker:
return False
def locked_repository(
self, with_dev_reqs: bool = False
) -> poetry.repositories.Repository:
def locked_repository(self, with_dev_reqs: bool = False) -> "Repository":
"""
Searches and returns a repository of locked packages.
"""
from poetry.factory import Factory
from poetry.repositories import Repository
if not self.is_locked():
return poetry.repositories.Repository()
return Repository()
lock_data = self.lock_data
packages = poetry.repositories.Repository()
packages = Repository()
if with_dev_reqs:
locked_packages = lock_data["package"]
......
......@@ -6,6 +6,7 @@ import tempfile
from contextlib import contextmanager
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Any
from typing import Callable
from typing import Dict
......@@ -13,10 +14,7 @@ from typing import Iterator
from typing import List
from typing import Optional
import requests
from poetry.config.config import Config
from poetry.core.packages.package import Package
try:
......@@ -25,6 +23,12 @@ except ImportError:
from collections import Mapping
if TYPE_CHECKING:
from requests import Session
from poetry.core.packages.package import Package
_canonicalize_regex = re.compile("[-_]+")
......@@ -92,9 +96,11 @@ def merge_dicts(d1: Dict, d2: Dict) -> None:
def download_file(
url: str,
dest: str,
session: Optional[requests.Session] = None,
session: Optional["Session"] = None,
chunk_size: int = 1024,
) -> None:
import requests
get = requests.get if not session else session.get
with get(url, stream=True) as response:
......@@ -107,7 +113,7 @@ def download_file(
def get_package_version_display_string(
package: Package, root: Optional[Path] = None
package: "Package", root: Optional[Path] = None
) -> str:
if package.source_type in ["file", "directory"] and root:
return "{} {}".format(
......
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