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