Commit cc8f59a3 by Sébastien Eustace Committed by Arun Babu Neelicattu

Fix the show command

parent 600c2285
......@@ -35,8 +35,11 @@ lists all packages available."""
def handle(self):
from clikit.utils.terminal import Terminal
from poetry.core.semver import Version
from poetry.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.repositories.repository import Repository
from poetry.utils.helpers import get_package_version_display_string
package = self.argument("package")
......@@ -48,7 +51,7 @@ lists all packages available."""
self._args.set_option("latest", True)
include_dev = not self.option("no-dev")
locked_repo = self.poetry.locker.locked_repository(include_dev)
locked_repo = self.poetry.locker.locked_repository(True)
# Show tree view if requested
if self.option("tree") and not package:
......@@ -65,6 +68,25 @@ lists all packages available."""
table = self.table(style="compact")
# table.style.line_vc_char = ""
locked_packages = locked_repo.packages
pool = Pool()
pool.add_repository(locked_repo)
solver = Solver(
self.poetry.package,
pool=pool,
installed=Repository(),
locked=locked_repo,
io=NullIO(),
)
solver.provider.load_deferred(False)
with solver.use_environment(self.env):
ops = solver.solve()
required_locked_packages = set([op.package for op in ops if not op.skipped])
if self.option("no-dev"):
required_locked_packages = [
p for p in locked_packages if p.category == "main"
]
if package:
pkg = None
......@@ -110,20 +132,11 @@ lists all packages available."""
latest_packages = {}
latest_statuses = {}
installed_repo = InstalledRepository.load(self.env)
skipped = []
python = Version.parse(".".join([str(i) for i in self.env.version_info[:3]]))
# Computing widths
for locked in locked_packages:
python_constraint = locked.python_constraint
if not python_constraint.allows(python) or not self.env.is_valid_for_marker(
locked.marker
):
skipped.append(locked)
if not show_all:
continue
if locked not in required_locked_packages and not show_all:
continue
current_length = len(locked.pretty_name)
if not self._io.output.supports_ansi():
......@@ -179,7 +192,7 @@ lists all packages available."""
color = "cyan"
name = locked.pretty_name
install_marker = ""
if locked in skipped:
if locked not in required_locked_packages:
if not show_all:
continue
......
......@@ -340,7 +340,12 @@ class VersionSolver:
# only has one version to choose from.
return 1
if dependency.name in self._locked:
locked = self._get_locked(dependency)
if locked and (
dependency.constraint.allows(locked.version)
or locked.is_prerelease()
and dependency.constraint.allows(locked.version.next_patch)
):
return 1
# VCS, URL, File or Directory dependencies
......@@ -377,17 +382,17 @@ class VersionSolver:
version = packages[0]
except IndexError:
version = None
else:
version = locked
if version is None:
# If there are no versions that satisfy the constraint,
# add an incompatibility that indicates that.
self._add_incompatibility(
Incompatibility([Term(dependency, True)], NoVersionsCause())
)
if version is None:
# If there are no versions that satisfy the constraint,
# add an incompatibility that indicates that.
self._add_incompatibility(
Incompatibility([Term(dependency, True)], NoVersionsCause())
)
return dependency.complete_name
return dependency.complete_name
else:
version = locked
version = self._provider.complete_package(version)
......@@ -451,10 +456,10 @@ class VersionSolver:
)
def _get_locked(self, dependency): # type: (Dependency) -> Union[Package, None]
if dependency.complete_name in self._use_latest:
if dependency.name in self._use_latest:
return
locked = self._locked.get(dependency.complete_name)
locked = self._locked.get(dependency.name)
if not locked:
return
......
......@@ -67,6 +67,7 @@ class Provider:
self._in_progress = False
self._overrides = {}
self._deferred_cache = {}
self._load_deferred = True
@property
def pool(self): # type: () -> Pool
......@@ -78,6 +79,9 @@ class Provider:
def set_overrides(self, overrides):
self._overrides = overrides
def load_deferred(self, load_deferred): # type: (bool) -> None
self._load_deferred = load_deferred
@contextmanager
def use_environment(self, env): # type: (Env) -> Provider
original_env = self._env
......@@ -436,16 +440,17 @@ class Provider:
else:
requires = package.requires
# Retrieving constraints for deferred dependencies
for r in requires:
if r.is_directory():
self.search_for_directory(r)
elif r.is_file():
self.search_for_file(r)
elif r.is_vcs():
self.search_for_vcs(r)
elif r.is_url():
self.search_for_url(r)
if self._load_deferred:
# Retrieving constraints for deferred dependencies
for r in requires:
if r.is_directory():
self.search_for_directory(r)
elif r.is_file():
self.search_for_file(r)
elif r.is_vcs():
self.search_for_vcs(r)
elif r.is_url():
self.search_for_url(r)
optional_dependencies = []
activated_extras = []
......
......@@ -386,9 +386,11 @@ class PackageNode(DFSNode):
continue
for pkg in self.packages:
if (
pkg.complete_name == dependency.complete_name
and dependency.constraint.allows(pkg.version)
if pkg.complete_name == dependency.complete_name and (
dependency.constraint.allows(pkg.version)
or dependency.allows_prereleases()
and pkg.version.is_prerelease()
and dependency.constraint.allows(pkg.version.stable)
):
# If there is already a child with this name
# we merge the requirements
......
......@@ -44,7 +44,7 @@ class Repository(BaseRepository):
if not isinstance(constraint, VersionConstraint):
constraint = parse_constraint(constraint)
allow_prereleases = dependency.allows_prereleases
allow_prereleases = dependency.allows_prereleases()
if isinstance(constraint, VersionRange):
if (
constraint.max is not None
......@@ -68,7 +68,10 @@ class Repository(BaseRepository):
ignored_pre_release_packages.append(package)
continue
if constraint.allows(package.version):
if constraint.allows(package.version) or (
package.is_prerelease()
and constraint.allows(package.version.next_patch)
):
packages.append(package)
return packages or ignored_pre_release_packages
......
......@@ -8,6 +8,11 @@ from tests.helpers import get_package
def test_show_basic_with_installed_packages(app, poetry, installed):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
poetry.package.add_dependency(
Factory.create_dependency("pytest", "^3.7.3", category="dev")
)
command = app.find("show")
tester = CommandTester(command)
......@@ -80,6 +85,9 @@ pytest 3.7.3 Pytest package
def test_show_basic_with_not_installed_packages_non_decorated(app, poetry, installed):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -134,6 +142,9 @@ pendulum (!) 2.0.0 Pendulum package
def test_show_basic_with_not_installed_packages_decorated(app, poetry, installed):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -189,6 +200,9 @@ def test_show_basic_with_not_installed_packages_decorated(app, poetry, installed
def test_show_latest_non_decorated(app, poetry, installed, repo):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -254,6 +268,9 @@ pendulum 2.0.0 2.0.1 Pendulum package
def test_show_latest_decorated(app, poetry, installed, repo):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -320,6 +337,9 @@ def test_show_latest_decorated(app, poetry, installed, repo):
def test_show_outdated(app, poetry, installed, repo):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -421,6 +441,9 @@ def test_show_outdated_with_only_up_to_date_packages(app, poetry, installed, rep
def test_show_outdated_has_prerelease_but_not_allowed(app, poetry, installed, repo):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -487,6 +510,13 @@ cachy 0.1.0 0.2.0 Cachy package
def test_show_outdated_has_prerelease_and_allowed(app, poetry, installed, repo):
poetry.package.add_dependency(
Factory.create_dependency(
"cachy", {"version": "^0.1.0", "allow-prereleases": True}
)
)
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -553,6 +583,9 @@ cachy 0.1.0.dev1 0.3.0.dev123 Cachy package
def test_show_outdated_formatting(app, poetry, installed, repo):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -622,10 +655,10 @@ def test_show_outdated_local_dependencies(app, poetry, installed, repo):
command = app.find("show")
tester = CommandTester(command)
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
cachy_020 = get_package("cachy", "0.2.0")
cachy_020.description = "Cachy package"
cachy_030 = get_package("cachy", "0.3.0")
cachy_030.description = "Cachy package"
pendulum_200 = get_package("pendulum", "2.0.0")
pendulum_200.description = "Pendulum package"
......@@ -633,16 +666,16 @@ def test_show_outdated_local_dependencies(app, poetry, installed, repo):
demo_010 = get_package("demo", "0.1.0")
demo_010.description = ""
my_package_012 = get_package("my-package", "0.1.2")
my_package_012 = get_package("project-with-setup", "0.1.2")
my_package_012.description = "Demo project."
installed.add_package(cachy_010)
installed.add_package(cachy_020)
installed.add_package(pendulum_200)
installed.add_package(demo_010)
installed.add_package(my_package_012)
repo.add_package(cachy_010)
repo.add_package(cachy_020)
repo.add_package(cachy_030)
repo.add_package(pendulum_200)
poetry.locker.mock_lock_data(
......@@ -650,7 +683,7 @@ def test_show_outdated_local_dependencies(app, poetry, installed, repo):
"package": [
{
"name": "cachy",
"version": "0.1.0",
"version": "0.2.0",
"description": "Cachy package",
"category": "main",
"optional": False,
......@@ -684,7 +717,7 @@ def test_show_outdated_local_dependencies(app, poetry, installed, repo):
},
},
{
"name": "my-package",
"name": "project-with-setup",
"version": "0.1.1",
"description": "Demo project.",
"category": "main",
......@@ -692,6 +725,10 @@ def test_show_outdated_local_dependencies(app, poetry, installed, repo):
"platform": "*",
"python-versions": "*",
"checksum": [],
"dependencies": {
"pendulum": "pendulum>=1.4.4",
"cachy": {"version": ">=0.2.0", "extras": ["msgpack"]},
},
"source": {
"type": "directory",
"reference": "",
......@@ -703,7 +740,12 @@ def test_show_outdated_local_dependencies(app, poetry, installed, repo):
"python-versions": "*",
"platform": "*",
"content-hash": "123456789",
"hashes": {"cachy": [], "pendulum": [], "demo": [], "my-package": []},
"hashes": {
"cachy": [],
"pendulum": [],
"demo": [],
"project-with-setup": [],
},
},
}
)
......@@ -711,8 +753,8 @@ def test_show_outdated_local_dependencies(app, poetry, installed, repo):
tester.execute("--outdated")
expected = """\
cachy 0.1.0 0.2.0
my-package 0.1.1 ../project_with_setup 0.1.2 ../project_with_setup
cachy 0.2.0 0.3.0
project-with-setup 0.1.1 ../project_with_setup 0.1.2 ../project_with_setup
"""
assert expected.rstrip() == "\n".join(
line.rstrip() for line in tester.io.fetch_output().splitlines()
......@@ -723,6 +765,7 @@ my-package 0.1.1 ../project_with_setup 0.1.2 ../project_with_setup
def test_show_outdated_git_dev_dependency(app, poetry, installed, repo):
command = app.find("show")
tester = CommandTester(command)
print(poetry.package.all_requires)
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
......@@ -735,13 +778,18 @@ def test_show_outdated_git_dev_dependency(app, poetry, installed, repo):
demo_011 = get_package("demo", "0.1.1")
demo_011.description = "Demo package"
pytest = get_package("pytest", "3.4.3")
pytest.description = "Pytest"
installed.add_package(cachy_010)
installed.add_package(pendulum_200)
installed.add_package(demo_011)
installed.add_package(pytest)
repo.add_package(cachy_010)
repo.add_package(cachy_020)
repo.add_package(pendulum_200)
repo.add_package(pytest)
poetry.locker.mock_lock_data(
{
......@@ -778,15 +826,26 @@ def test_show_outdated_git_dev_dependency(app, poetry, installed, repo):
"source": {
"type": "git",
"reference": "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24",
"url": "https://github.com/demo/pyproject-demo.git",
"resolved_reference": "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24",
"url": "https://github.com/demo/demo.git",
},
},
{
"name": "pytest",
"version": "3.4.3",
"description": "Pytest",
"category": "dev",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
],
"metadata": {
"python-versions": "*",
"platform": "*",
"content-hash": "123456789",
"hashes": {"cachy": [], "pendulum": [], "demo": []},
"hashes": {"cachy": [], "pendulum": [], "demo": [], "pytest": []},
},
}
)
......@@ -817,13 +876,18 @@ def test_show_outdated_no_dev_git_dev_dependency(app, poetry, installed, repo):
demo_011 = get_package("demo", "0.1.1")
demo_011.description = "Demo package"
pytest = get_package("pytest", "3.4.3")
pytest.description = "Pytest"
installed.add_package(cachy_010)
installed.add_package(pendulum_200)
installed.add_package(demo_011)
installed.add_package(pytest)
repo.add_package(cachy_010)
repo.add_package(cachy_020)
repo.add_package(pendulum_200)
repo.add_package(pytest)
poetry.locker.mock_lock_data(
{
......@@ -863,12 +927,22 @@ def test_show_outdated_no_dev_git_dev_dependency(app, poetry, installed, repo):
"url": "https://github.com/demo/pyproject-demo.git",
},
},
{
"name": "pytest",
"version": "3.4.3",
"description": "Pytest",
"category": "dev",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
],
"metadata": {
"python-versions": "*",
"platform": "*",
"content-hash": "123456789",
"hashes": {"cachy": [], "pendulum": [], "demo": []},
"hashes": {"cachy": [], "pendulum": [], "demo": [], "pytest": []},
},
}
)
......@@ -883,6 +957,10 @@ cachy 0.1.0 0.2.0 Cachy package
def test_show_hides_incompatible_package(app, poetry, installed, repo):
poetry.package.add_dependency(
Factory.create_dependency("cachy", {"version": "^0.1.0", "python": "< 2.0"})
)
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
command = app.find("show")
tester = CommandTester(command)
......@@ -906,7 +984,6 @@ def test_show_hides_incompatible_package(app, poetry, installed, repo):
"platform": "*",
"python-versions": "*",
"checksum": [],
"requirements": {"python": "1.0"},
},
{
"name": "pendulum",
......
......@@ -27,7 +27,7 @@ python = "~2.7 || ^3.4"
demo = { path = "../distributions/demo-0.1.0-py2.py3-none-any.whl" }
# Dir dependency with setup.py
my-package = { path = "../project_with_setup/" }
project-with-setup = { path = "../project_with_setup/" }
[tool.poetry.scripts]
......
Metadata-Version: 1.0
Name: my-package
Name: project-with-setup
Version: 0.1.2
Summary: Demo project.
Home-page: https://github.com/demo/demo
......
......@@ -4,7 +4,7 @@ from setuptools import setup
kwargs = dict(
name="my-package",
name="project-with-setup",
license="MIT",
version="0.1.2",
description="Demo project.",
......
......@@ -7,7 +7,15 @@ optional = false
python-versions = "*"
[[package]]
name = "my-package"
name = "pendulum"
version = "1.4.4"
description = ""
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "project-with-setup"
version = "0.1.2"
develop = false
description = "Demo project."
......@@ -23,14 +31,6 @@ url = "tests/fixtures/project_with_setup"
cachy = {version = ">=0.2.0", extras = ["msgpack"]}
pendulum = ">=1.4.4"
[[package]]
name = "pendulum"
version = "1.4.4"
description = ""
category = "main"
optional = false
python-versions = "*"
[metadata]
python-versions = "*"
lock-version = "1.1"
......@@ -38,5 +38,5 @@ content-hash = "123456789"
[metadata.files]
cachy = []
my-package = []
project-with-setup = []
pendulum = []
......@@ -891,7 +891,7 @@ def test_run_installs_with_local_setuptools_directory(
):
file_path = fixtures_dir / "project_with_setup/"
package.add_dependency(
Factory.create_dependency("my-package", {"path": str(file_path)})
Factory.create_dependency("project-with-setup", {"path": str(file_path)})
)
repo.add_package(get_package("pendulum", "1.4.4"))
......
......@@ -859,7 +859,7 @@ def test_run_installs_with_local_setuptools_directory(
):
file_path = fixtures_dir / "project_with_setup/"
package.add_dependency(
Factory.create_dependency("my-package", {"path": str(file_path)})
Factory.create_dependency("project-with-setup", {"path": str(file_path)})
)
repo.add_package(get_package("pendulum", "1.4.4"))
......
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