Commit cc6f9bbe by Sébastien Eustace

Update the `show` command to support groups

parent 20589be5
...@@ -14,6 +14,7 @@ if TYPE_CHECKING: ...@@ -14,6 +14,7 @@ if TYPE_CHECKING:
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.packages.project_package import ProjectPackage
from poetry.repositories import Repository from poetry.repositories import Repository
from poetry.repositories.installed_repository import InstalledRepository from poetry.repositories.installed_repository import InstalledRepository
...@@ -25,7 +26,35 @@ class ShowCommand(EnvCommand): ...@@ -25,7 +26,35 @@ class ShowCommand(EnvCommand):
arguments = [argument("package", "The package to inspect", optional=True)] arguments = [argument("package", "The package to inspect", optional=True)]
options = [ options = [
option("no-dev", None, "Do not list the development dependencies."), option(
"without",
None,
"Do not show the information of the specified groups' dependencies.",
flag=False,
multiple=True,
),
option(
"with",
None,
"Show the information of the specified optional groups' dependencies as well.",
flag=False,
multiple=True,
),
option(
"default", None, "Only show the information of the default dependencies."
),
option(
"only",
None,
"Only show the information of dependencies belonging to the specified groups.",
flag=False,
multiple=True,
),
option(
"no-dev",
None,
"Do not list the development dependencies. (<warning>Deprecated</warning>)",
),
option("tree", "t", "List the dependencies as a tree."), option("tree", "t", "List the dependencies as a tree."),
option("latest", "l", "Show the latest version."), option("latest", "l", "Show the latest version."),
option( option(
...@@ -63,17 +92,53 @@ lists all packages available.""" ...@@ -63,17 +92,53 @@ lists all packages available."""
if self.option("outdated"): if self.option("outdated"):
self._io.input.set_option("latest", True) self._io.input.set_option("latest", True)
include_dev = not self.option("no-dev") excluded_groups = []
included_groups = []
only_groups = []
if self.option("no-dev"):
self.line(
"<warning>The `<fg=yellow;options=bold>--no-dev</>` option is deprecated,"
"use the `<fg=yellow;options=bold>--without dev</>` notation instead.</warning>"
)
excluded_groups.append("dev")
excluded_groups.extend(
[
group.strip()
for groups in self.option("without")
for group in groups.split(",")
]
)
included_groups.extend(
[
group.strip()
for groups in self.option("with")
for group in groups.split(",")
]
)
only_groups.extend(
[
group.strip()
for groups in self.option("only")
for group in groups.split(",")
]
)
if self.option("default"):
only_groups.append("default")
locked_repo = self.poetry.locker.locked_repository(True) locked_repo = self.poetry.locker.locked_repository(True)
if only_groups:
root = self.poetry.package.with_dependency_groups(only_groups, only=True)
else:
root = self.poetry.package.with_dependency_groups(
included_groups
).without_dependency_groups(excluded_groups)
# Show tree view if requested # Show tree view if requested
if self.option("tree") and not package: if self.option("tree") and not package:
groups = ["default"] requires = root.all_requires
if include_dev:
groups.append("dev")
package = self.poetry.package.with_dependency_groups(groups, only=True)
requires = package.all_requires
packages = locked_repo.packages packages = locked_repo.packages
for pkg in packages: for pkg in packages:
for require in requires: for require in requires:
...@@ -88,7 +153,7 @@ lists all packages available.""" ...@@ -88,7 +153,7 @@ lists all packages available."""
pool = Pool(ignore_repository_names=True) pool = Pool(ignore_repository_names=True)
pool.add_repository(locked_repo) pool.add_repository(locked_repo)
solver = Solver( solver = Solver(
self.poetry.package, root,
pool=pool, pool=pool,
installed=Repository(), installed=Repository(),
locked=locked_repo, locked=locked_repo,
...@@ -100,11 +165,6 @@ lists all packages available.""" ...@@ -100,11 +165,6 @@ lists all packages available."""
required_locked_packages = set([op.package for op in ops if not op.skipped]) 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: if package:
pkg = None pkg = None
for locked in locked_packages: for locked in locked_packages:
...@@ -163,7 +223,7 @@ lists all packages available.""" ...@@ -163,7 +223,7 @@ lists all packages available."""
current_length += 4 current_length += 4
if show_latest: if show_latest:
latest = self.find_latest_package(locked, include_dev) latest = self.find_latest_package(locked, root)
if not latest: if not latest:
latest = locked latest = locked
...@@ -380,7 +440,7 @@ lists all packages available.""" ...@@ -380,7 +440,7 @@ lists all packages available."""
io.error_output.formatter.set_style(color, style) io.error_output.formatter.set_style(color, style)
def find_latest_package( def find_latest_package(
self, package: "Package", include_dev: bool self, package: "Package", root: "ProjectPackage"
) -> Union["Package", bool]: ) -> Union["Package", bool]:
from cleo.io.null_io import NullIO from cleo.io.null_io import NullIO
...@@ -389,11 +449,6 @@ lists all packages available.""" ...@@ -389,11 +449,6 @@ lists all packages available."""
# find the latest version allowed in this pool # find the latest version allowed in this pool
if package.source_type in ("git", "file", "directory"): if package.source_type in ("git", "file", "directory"):
groups = ["default"]
if include_dev:
groups.append("dev")
root = self.poetry.package.with_dependency_groups(groups, only=True)
requires = root.all_requires requires = root.all_requires
for dep in requires: for dep in requires:
......
import pytest import pytest
from poetry.core.packages.dependency_group import DependencyGroup
from poetry.factory import Factory from poetry.factory import Factory
from tests.helpers import get_package from tests.helpers import get_package
...@@ -952,7 +953,7 @@ def test_show_outdated_no_dev_git_dev_dependency(tester, poetry, installed, repo ...@@ -952,7 +953,7 @@ def test_show_outdated_no_dev_git_dev_dependency(tester, poetry, installed, repo
} }
) )
tester.execute("--outdated --no-dev") tester.execute("--outdated --without dev")
expected = """\ expected = """\
cachy 0.1.0 0.2.0 Cachy package cachy 0.1.0 0.2.0 Cachy package
...@@ -1071,6 +1072,12 @@ pendulum 2.0.0 Pendulum package ...@@ -1071,6 +1072,12 @@ pendulum 2.0.0 Pendulum package
def test_show_non_dev_with_basic_installed_packages(tester, poetry, installed): def test_show_non_dev_with_basic_installed_packages(tester, 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", "*", groups=["dev"])
)
cachy_010 = get_package("cachy", "0.1.0") cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package" cachy_010.description = "Cachy package"
...@@ -1128,7 +1135,7 @@ def test_show_non_dev_with_basic_installed_packages(tester, poetry, installed): ...@@ -1128,7 +1135,7 @@ def test_show_non_dev_with_basic_installed_packages(tester, poetry, installed):
} }
) )
tester.execute("--no-dev") tester.execute("--without dev")
expected = """\ expected = """\
cachy 0.1.0 Cachy package cachy 0.1.0 Cachy package
...@@ -1138,6 +1145,163 @@ pendulum 2.0.0 Pendulum package ...@@ -1138,6 +1145,163 @@ pendulum 2.0.0 Pendulum package
assert expected == tester.io.fetch_output() assert expected == tester.io.fetch_output()
def test_show_with_group_only(tester, 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", "*", groups=["dev"])
)
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
pendulum_200 = get_package("pendulum", "2.0.0")
pendulum_200.description = "Pendulum package"
pytest_373 = get_package("pytest", "3.7.3")
pytest_373.description = "Pytest package"
pytest_373.category = "dev"
installed.add_package(cachy_010)
installed.add_package(pendulum_200)
installed.add_package(pytest_373)
poetry.locker.mock_lock_data(
{
"package": [
{
"name": "cachy",
"version": "0.1.0",
"description": "Cachy package",
"category": "main",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
{
"name": "pendulum",
"version": "2.0.0",
"description": "Pendulum package",
"category": "main",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
{
"name": "pytest",
"version": "3.7.3",
"description": "Pytest package",
"category": "dev",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
],
"metadata": {
"python-versions": "*",
"platform": "*",
"content-hash": "123456789",
"hashes": {"cachy": [], "pendulum": [], "pytest": []},
},
}
)
tester.execute("--only dev")
expected = """\
pytest 3.7.3 Pytest package
"""
assert expected == tester.io.fetch_output()
def test_show_with_optional_group(tester, poetry, installed):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
group = DependencyGroup("dev", optional=True)
group.add_dependency(Factory.create_dependency("pytest", "*", groups=["dev"]))
poetry.package.add_dependency_group(group)
cachy_010 = get_package("cachy", "0.1.0")
cachy_010.description = "Cachy package"
pendulum_200 = get_package("pendulum", "2.0.0")
pendulum_200.description = "Pendulum package"
pytest_373 = get_package("pytest", "3.7.3")
pytest_373.description = "Pytest package"
pytest_373.category = "dev"
installed.add_package(cachy_010)
installed.add_package(pendulum_200)
installed.add_package(pytest_373)
poetry.locker.mock_lock_data(
{
"package": [
{
"name": "cachy",
"version": "0.1.0",
"description": "Cachy package",
"category": "main",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
{
"name": "pendulum",
"version": "2.0.0",
"description": "Pendulum package",
"category": "main",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
{
"name": "pytest",
"version": "3.7.3",
"description": "Pytest package",
"category": "dev",
"optional": False,
"platform": "*",
"python-versions": "*",
"checksum": [],
},
],
"metadata": {
"python-versions": "*",
"platform": "*",
"content-hash": "123456789",
"hashes": {"cachy": [], "pendulum": [], "pytest": []},
},
}
)
tester.execute()
expected = """\
cachy 0.1.0 Cachy package
pendulum 2.0.0 Pendulum package
"""
assert expected == tester.io.fetch_output()
tester.execute("--with dev")
expected = """\
cachy 0.1.0 Cachy package
pendulum 2.0.0 Pendulum package
pytest 3.7.3 Pytest package
"""
assert expected == tester.io.fetch_output()
def test_show_tree(tester, poetry, installed): def test_show_tree(tester, poetry, installed):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.2.0")) poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.2.0"))
...@@ -1247,7 +1411,7 @@ def test_show_tree_no_dev(tester, poetry, installed): ...@@ -1247,7 +1411,7 @@ def test_show_tree_no_dev(tester, poetry, installed):
} }
) )
tester.execute("--tree --no-dev") tester.execute("--tree --without dev")
expected = """\ expected = """\
cachy 0.2.0 cachy 0.2.0
......
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