Commit 692bdaa9 by Mathieu Kniewallner Committed by GitHub

Refactor `show` command a bit (#5738)

Refactor `show` command a tiny bit to separate the different cases into
dedicated functions, since right now `handle` method is 300 lines long.
This also has the advantage of making some imports necessary only on a
specific variant of the command.

The package named is also canonicalized only once, for a minor performance
improvement/to avoid extra work.
parent 88ba18d5
......@@ -69,15 +69,6 @@ lists all packages available."""
colors = ["cyan", "yellow", "green", "magenta", "blue"]
def handle(self) -> int:
import shutil
from cleo.io.null_io import NullIO
from poetry.puzzle.solver import Solver
from poetry.repositories.installed_repository import InstalledRepository
from poetry.repositories.pool import Pool
from poetry.utils.helpers import get_package_version_display_string
package = self.argument("package")
if self.option("tree"):
......@@ -111,48 +102,34 @@ lists all packages available."""
return 1
locked_repo = self.poetry.locker.locked_repository()
root = self.project_with_activated_groups_only()
# Show tree view if requested
if self.option("tree") and package is None:
requires = root.all_requires
packages = locked_repo.packages
for p in packages:
for require in requires:
if p.name == require.name:
self.display_package_tree(self.io, p, packages)
break
if package:
return self._display_single_package_information(package, locked_repo)
return 0
root = self.project_with_activated_groups_only()
table = self.table(style="compact")
locked_packages = locked_repo.packages
pool = Pool(ignore_repository_names=True)
pool.add_repository(locked_repo)
solver = Solver(
root,
pool=pool,
installed=[],
locked=locked_packages,
io=NullIO(),
)
solver.provider.load_deferred(False)
with solver.use_environment(self.env):
ops = solver.solve().calculate_operations()
# Show tree view if requested
if self.option("tree"):
return self._display_packages_tree_information(locked_repo, root)
required_locked_packages = {op.package for op in ops if not op.skipped}
return self._display_packages_information(locked_repo, root)
if package:
def _display_single_package_information(
self, package: str, locked_repository: Repository
) -> int:
locked_packages = locked_repository.packages
canonicalized_package = canonicalize_name(package)
pkg = None
for locked in locked_packages:
if canonicalize_name(package) == locked.name:
if locked.name == canonicalized_package:
pkg = locked
break
if not pkg:
raise ValueError(f"Package {package} not found")
required_by = reverse_deps(pkg, locked_repo)
required_by = reverse_deps(pkg, locked_repository)
if self.option("tree"):
if self.option("why"):
......@@ -189,8 +166,7 @@ lists all packages available."""
["<info>description</>", f" : {pkg.description}"],
]
table.add_rows(rows)
table.render()
self.table(rows=rows, style="compact").render()
if pkg.requires:
self.line("")
......@@ -209,6 +185,34 @@ lists all packages available."""
return 0
def _display_packages_information(
self, locked_repository: Repository, root: ProjectPackage
) -> int:
import shutil
from cleo.io.null_io import NullIO
from poetry.puzzle.solver import Solver
from poetry.repositories.installed_repository import InstalledRepository
from poetry.repositories.pool import Pool
from poetry.utils.helpers import get_package_version_display_string
locked_packages = locked_repository.packages
pool = Pool(ignore_repository_names=True)
pool.add_repository(locked_repository)
solver = Solver(
root,
pool=pool,
installed=[],
locked=locked_packages,
io=NullIO(),
)
solver.provider.load_deferred(False)
with solver.use_environment(self.env):
ops = solver.solve().calculate_operations()
required_locked_packages = {op.package for op in ops if not op.skipped}
show_latest = self.option("latest")
show_all = self.option("all")
width = shutil.get_terminal_size().columns
......@@ -261,7 +265,7 @@ lists all packages available."""
)
if self.option("why"):
required_by = reverse_deps(locked, locked_repo)
required_by = reverse_deps(locked, locked_repository)
required_by_length = max(
required_by_length,
len(" from " + ",".join(required_by.keys())),
......@@ -278,7 +282,7 @@ lists all packages available."""
)
if self.option("why"):
required_by = reverse_deps(locked, locked_repo)
required_by = reverse_deps(locked, locked_repository)
required_by_length = max(
required_by_length, len(" from " + ",".join(required_by.keys()))
)
......@@ -345,7 +349,7 @@ lists all packages available."""
line += f" <fg={color}>{version:{latest_length}}</>"
if write_why:
required_by = reverse_deps(locked, locked_repo)
required_by = reverse_deps(locked, locked_repository)
if required_by:
content = ",".join(required_by.keys())
# subtract 6 for ' from '
......@@ -371,6 +375,19 @@ lists all packages available."""
return 0
def _display_packages_tree_information(
self, locked_repository: Repository, root: ProjectPackage
) -> int:
packages = locked_repository.packages
for p in packages:
for require in root.all_requires:
if p.name == require.name:
self.display_package_tree(self.io, p, packages)
break
return 0
def display_package_tree(
self,
io: IO,
......
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