Skip to content

Commit cc8f59a

Browse files
sdispaterabn
authored andcommitted
Fix the show command
1 parent 600c228 commit cc8f59a

File tree

16 files changed

+175
-70
lines changed

16 files changed

+175
-70
lines changed

poetry/console/commands/show.py

+27-14
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@ class ShowCommand(EnvCommand):
3535
def handle(self):
3636
from clikit.utils.terminal import Terminal
3737

38-
from poetry.core.semver import Version
38+
from poetry.io.null_io import NullIO
39+
from poetry.puzzle.solver import Solver
3940
from poetry.repositories.installed_repository import InstalledRepository
41+
from poetry.repositories.pool import Pool
42+
from poetry.repositories.repository import Repository
4043
from poetry.utils.helpers import get_package_version_display_string
4144

4245
package = self.argument("package")
@@ -48,7 +51,7 @@ def handle(self):
4851
self._args.set_option("latest", True)
4952

5053
include_dev = not self.option("no-dev")
51-
locked_repo = self.poetry.locker.locked_repository(include_dev)
54+
locked_repo = self.poetry.locker.locked_repository(True)
5255

5356
# Show tree view if requested
5457
if self.option("tree") and not package:
@@ -65,6 +68,25 @@ def handle(self):
6568
table = self.table(style="compact")
6669
# table.style.line_vc_char = ""
6770
locked_packages = locked_repo.packages
71+
pool = Pool()
72+
pool.add_repository(locked_repo)
73+
solver = Solver(
74+
self.poetry.package,
75+
pool=pool,
76+
installed=Repository(),
77+
locked=locked_repo,
78+
io=NullIO(),
79+
)
80+
solver.provider.load_deferred(False)
81+
with solver.use_environment(self.env):
82+
ops = solver.solve()
83+
84+
required_locked_packages = set([op.package for op in ops if not op.skipped])
85+
86+
if self.option("no-dev"):
87+
required_locked_packages = [
88+
p for p in locked_packages if p.category == "main"
89+
]
6890

6991
if package:
7092
pkg = None
@@ -110,20 +132,11 @@ def handle(self):
110132
latest_packages = {}
111133
latest_statuses = {}
112134
installed_repo = InstalledRepository.load(self.env)
113-
skipped = []
114-
115-
python = Version.parse(".".join([str(i) for i in self.env.version_info[:3]]))
116135

117136
# Computing widths
118137
for locked in locked_packages:
119-
python_constraint = locked.python_constraint
120-
if not python_constraint.allows(python) or not self.env.is_valid_for_marker(
121-
locked.marker
122-
):
123-
skipped.append(locked)
124-
125-
if not show_all:
126-
continue
138+
if locked not in required_locked_packages and not show_all:
139+
continue
127140

128141
current_length = len(locked.pretty_name)
129142
if not self._io.output.supports_ansi():
@@ -179,7 +192,7 @@ def handle(self):
179192
color = "cyan"
180193
name = locked.pretty_name
181194
install_marker = ""
182-
if locked in skipped:
195+
if locked not in required_locked_packages:
183196
if not show_all:
184197
continue
185198

poetry/mixology/version_solver.py

+17-12
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,12 @@ def _get_min(dependency):
340340
# only has one version to choose from.
341341
return 1
342342

343-
if dependency.name in self._locked:
343+
locked = self._get_locked(dependency)
344+
if locked and (
345+
dependency.constraint.allows(locked.version)
346+
or locked.is_prerelease()
347+
and dependency.constraint.allows(locked.version.next_patch)
348+
):
344349
return 1
345350

346351
# VCS, URL, File or Directory dependencies
@@ -377,17 +382,17 @@ def _get_min(dependency):
377382
version = packages[0]
378383
except IndexError:
379384
version = None
380-
else:
381-
version = locked
382385

383-
if version is None:
384-
# If there are no versions that satisfy the constraint,
385-
# add an incompatibility that indicates that.
386-
self._add_incompatibility(
387-
Incompatibility([Term(dependency, True)], NoVersionsCause())
388-
)
386+
if version is None:
387+
# If there are no versions that satisfy the constraint,
388+
# add an incompatibility that indicates that.
389+
self._add_incompatibility(
390+
Incompatibility([Term(dependency, True)], NoVersionsCause())
391+
)
389392

390-
return dependency.complete_name
393+
return dependency.complete_name
394+
else:
395+
version = locked
391396

392397
version = self._provider.complete_package(version)
393398

@@ -451,10 +456,10 @@ def _add_incompatibility(self, incompatibility): # type: (Incompatibility) -> N
451456
)
452457

453458
def _get_locked(self, dependency): # type: (Dependency) -> Union[Package, None]
454-
if dependency.complete_name in self._use_latest:
459+
if dependency.name in self._use_latest:
455460
return
456461

457-
locked = self._locked.get(dependency.complete_name)
462+
locked = self._locked.get(dependency.name)
458463
if not locked:
459464
return
460465

poetry/puzzle/provider.py

+15-10
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def __init__(
6767
self._in_progress = False
6868
self._overrides = {}
6969
self._deferred_cache = {}
70+
self._load_deferred = True
7071

7172
@property
7273
def pool(self): # type: () -> Pool
@@ -78,6 +79,9 @@ def is_debugging(self):
7879
def set_overrides(self, overrides):
7980
self._overrides = overrides
8081

82+
def load_deferred(self, load_deferred): # type: (bool) -> None
83+
self._load_deferred = load_deferred
84+
8185
@contextmanager
8286
def use_environment(self, env): # type: (Env) -> Provider
8387
original_env = self._env
@@ -436,16 +440,17 @@ def complete_package(
436440
else:
437441
requires = package.requires
438442

439-
# Retrieving constraints for deferred dependencies
440-
for r in requires:
441-
if r.is_directory():
442-
self.search_for_directory(r)
443-
elif r.is_file():
444-
self.search_for_file(r)
445-
elif r.is_vcs():
446-
self.search_for_vcs(r)
447-
elif r.is_url():
448-
self.search_for_url(r)
443+
if self._load_deferred:
444+
# Retrieving constraints for deferred dependencies
445+
for r in requires:
446+
if r.is_directory():
447+
self.search_for_directory(r)
448+
elif r.is_file():
449+
self.search_for_file(r)
450+
elif r.is_vcs():
451+
self.search_for_vcs(r)
452+
elif r.is_url():
453+
self.search_for_url(r)
449454

450455
optional_dependencies = []
451456
activated_extras = []

poetry/puzzle/solver.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,11 @@ def reachable(self):
386386
continue
387387

388388
for pkg in self.packages:
389-
if (
390-
pkg.complete_name == dependency.complete_name
391-
and dependency.constraint.allows(pkg.version)
389+
if pkg.complete_name == dependency.complete_name and (
390+
dependency.constraint.allows(pkg.version)
391+
or dependency.allows_prereleases()
392+
and pkg.version.is_prerelease()
393+
and dependency.constraint.allows(pkg.version.stable)
392394
):
393395
# If there is already a child with this name
394396
# we merge the requirements

poetry/repositories/repository.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def find_packages(self, dependency):
4444
if not isinstance(constraint, VersionConstraint):
4545
constraint = parse_constraint(constraint)
4646

47-
allow_prereleases = dependency.allows_prereleases
47+
allow_prereleases = dependency.allows_prereleases()
4848
if isinstance(constraint, VersionRange):
4949
if (
5050
constraint.max is not None
@@ -68,7 +68,10 @@ def find_packages(self, dependency):
6868
ignored_pre_release_packages.append(package)
6969
continue
7070

71-
if constraint.allows(package.version):
71+
if constraint.allows(package.version) or (
72+
package.is_prerelease()
73+
and constraint.allows(package.version.next_patch)
74+
):
7275
packages.append(package)
7376

7477
return packages or ignored_pre_release_packages

0 commit comments

Comments
 (0)