Commit 9f7c9f8b by Arun Babu Neelicattu Committed by finswimmer

locker: move export logic into locker for reuse

This change, moves common functionality from exporter into the locker
to allow for sharing of logic that can generate `DependencyPackage`
instances given a a list of requirements using the lock data.

(cherry picked from commit c2adb3283c0b76e290a8f25053bf035500b47cb2)
parent 4738c9a1
...@@ -6,9 +6,11 @@ import re ...@@ -6,9 +6,11 @@ import re
from copy import deepcopy from copy import deepcopy
from hashlib import sha256 from hashlib import sha256
from typing import Any from typing import Iterator
from typing import List from typing import List
from typing import Optional from typing import Optional
from typing import Sequence
from typing import Union
from tomlkit import array from tomlkit import array
from tomlkit import document from tomlkit import document
...@@ -25,8 +27,10 @@ from poetry.core.semver import parse_constraint ...@@ -25,8 +27,10 @@ from poetry.core.semver import parse_constraint
from poetry.core.semver.version import Version from poetry.core.semver.version import Version
from poetry.core.toml.file import TOMLFile from poetry.core.toml.file import TOMLFile
from poetry.core.version.markers import parse_marker from poetry.core.version.markers import parse_marker
from poetry.packages import DependencyPackage
from poetry.utils._compat import OrderedDict from poetry.utils._compat import OrderedDict
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils.extras import get_extra_package_names
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -183,7 +187,7 @@ class Locker(object): ...@@ -183,7 +187,7 @@ class Locker(object):
def get_project_dependencies( def get_project_dependencies(
self, project_requires, pinned_versions=False, with_nested=False, with_dev=False self, project_requires, pinned_versions=False, with_nested=False, with_dev=False
): # type: (List[Dependency], bool, bool, bool) -> Any ): # type: (List[Dependency], bool, bool, bool) -> List[Dependency]
packages = self.locked_repository(with_dev).packages packages = self.locked_repository(with_dev).packages
# group packages entries by name, this is required because requirement might use # group packages entries by name, this is required because requirement might use
...@@ -263,6 +267,42 @@ class Locker(object): ...@@ -263,6 +267,42 @@ class Locker(object):
key=lambda x: x.name.lower(), key=lambda x: x.name.lower(),
) )
def get_project_dependency_packages(
self, project_requires, dev=False, extras=None
): # type: (List[Dependency], bool, Optional[Union[bool, Sequence[str]]]) -> Iterator[DependencyPackage]
repository = self.locked_repository(with_dev_reqs=dev)
# Build a set of all packages required by our selected extras
extra_package_names = (
None if (isinstance(extras, bool) and extras is True) else ()
)
if extra_package_names is not None:
extra_package_names = set(
get_extra_package_names(
repository.packages, self.lock_data.get("extras", {}), extras or (),
)
)
for dependency in self.get_project_dependencies(
project_requires=project_requires, with_nested=True, with_dev=dev,
):
try:
package = repository.find_packages(dependency=dependency)[0]
except IndexError:
continue
# If a package is optional and we haven't opted in to it, continue
if extra_package_names is not None and (
package.optional and package.name not in extra_package_names
):
continue
for extra in dependency.extras:
package.requires_extras.append(extra)
yield DependencyPackage(dependency=dependency, package=package)
def set_lock_data(self, root, packages): # type: (...) -> bool def set_lock_data(self, root, packages): # type: (...) -> bool
files = table() files = table()
packages = self._lock_packages(packages) packages = self._lock_packages(packages)
......
from typing import Optional
from typing import Sequence
from typing import Union from typing import Union
from clikit.api.io import IO from clikit.api.io import IO
...@@ -5,7 +7,6 @@ from clikit.api.io import IO ...@@ -5,7 +7,6 @@ from clikit.api.io import IO
from poetry.poetry import Poetry from poetry.poetry import Poetry
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils._compat import decode from poetry.utils._compat import decode
from poetry.utils.extras import get_extra_package_names
class Exporter(object): class Exporter(object):
...@@ -51,38 +52,19 @@ class Exporter(object): ...@@ -51,38 +52,19 @@ class Exporter(object):
dev=False, dev=False,
extras=None, extras=None,
with_credentials=False, with_credentials=False,
): # type: (Path, Union[IO, str], bool, bool, bool) -> None ): # type: (Path, Union[IO, str], bool, bool, Optional[Union[bool, Sequence[str]]], bool) -> None
indexes = set() indexes = set()
content = "" content = ""
repository = self._poetry.locker.locked_repository(dev)
# Build a set of all packages required by our selected extras
extra_package_names = set(
get_extra_package_names(
repository.packages,
self._poetry.locker.lock_data.get("extras", {}),
extras or (),
)
)
dependency_lines = set() dependency_lines = set()
for dependency in self._poetry.locker.get_project_dependencies( for dependency_package in self._poetry.locker.get_project_dependency_packages(
project_requires=self._poetry.package.all_requires, project_requires=self._poetry.package.all_requires, dev=dev, extras=extras
with_nested=True,
with_dev=dev,
): ):
try:
package = repository.find_packages(dependency=dependency)[0]
except IndexError:
continue
# If a package is optional and we haven't opted in to it, continue
if package.optional and package.name not in extra_package_names:
continue
line = "" line = ""
dependency = dependency_package.dependency
package = dependency_package.package
if package.develop: if package.develop:
line += "-e " line += "-e "
......
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