Commit 89d52018 by Bryan Forbes Committed by Sébastien Eustace

Improve show command output (#679)

* Improve show command output:

* Handle file and directory dependencies
* Handle git dev-dependencies
* Only include a package's width for output if it needs updating

* Update git show tests to have an outdated git dependency
parent 7018bd32
...@@ -35,7 +35,8 @@ lists all packages available.""" ...@@ -35,7 +35,8 @@ lists all packages available."""
if self.option("outdated"): if self.option("outdated"):
self.input.set_option("latest", True) self.input.set_option("latest", True)
locked_repo = self.poetry.locker.locked_repository(not self.option("no-dev")) include_dev = not self.option("no-dev")
locked_repo = self.poetry.locker.locked_repository(include_dev)
# Show tree view if requested # Show tree view if requested
if self.option("tree") and not package: if self.option("tree") and not package:
...@@ -95,6 +96,7 @@ lists all packages available.""" ...@@ -95,6 +96,7 @@ lists all packages available."""
width = terminal.width width = terminal.width
name_length = version_length = latest_length = 0 name_length = version_length = latest_length = 0
latest_packages = {} latest_packages = {}
latest_statuses = {}
installed_repo = InstalledRepository.load(self.env) installed_repo = InstalledRepository.load(self.env)
skipped = [] skipped = []
...@@ -118,15 +120,25 @@ lists all packages available.""" ...@@ -118,15 +120,25 @@ lists all packages available."""
if installed_status == "not-installed": if installed_status == "not-installed":
current_length += 4 current_length += 4
name_length = max(name_length, current_length)
version_length = max(version_length, len(locked.full_pretty_version))
if show_latest: if show_latest:
latest = self.find_latest_package(locked) latest = self.find_latest_package(locked, include_dev)
if not latest: if not latest:
latest = locked latest = locked
latest_packages[locked.pretty_name] = latest latest_packages[locked.pretty_name] = latest
latest_length = max(latest_length, len(latest.full_pretty_version)) update_status = latest_statuses[
locked.pretty_name
] = self.get_update_status(latest, locked)
if not self.option("outdated") or update_status != "up-to-date":
name_length = max(name_length, current_length)
version_length = max(
version_length, len(locked.full_pretty_version)
)
latest_length = max(latest_length, len(latest.full_pretty_version))
else:
name_length = max(name_length, current_length)
version_length = max(version_length, len(locked.full_pretty_version))
write_version = name_length + version_length + 3 <= width write_version = name_length + version_length + 3 <= width
write_latest = name_length + version_length + latest_length + 3 <= width write_latest = name_length + version_length + latest_length + 3 <= width
...@@ -157,22 +169,24 @@ lists all packages available.""" ...@@ -157,22 +169,24 @@ lists all packages available."""
line += " <comment>{:{}}</comment>".format( line += " <comment>{:{}}</comment>".format(
locked.full_pretty_version, version_length locked.full_pretty_version, version_length
) )
if show_latest and write_latest: if show_latest:
latest = latest_packages[locked.pretty_name] latest = latest_packages[locked.pretty_name]
update_status = latest_statuses[locked.pretty_name]
update_status = self.get_update_status(latest, locked)
color = "green"
if update_status == "semver-safe-update":
color = "red"
elif update_status == "update-possible":
color = "yellow"
line += " <fg={}>{:{}}</>".format(
color, latest.full_pretty_version, latest_length
)
if self.option("outdated") and update_status == "up-to-date": if self.option("outdated") and update_status == "up-to-date":
continue continue
if write_latest:
color = "green"
if update_status == "semver-safe-update":
color = "red"
elif update_status == "update-possible":
color = "yellow"
line += " <fg={}>{:{}}</>".format(
color, latest.full_pretty_version, latest_length
)
if write_description: if write_description:
description = locked.description description = locked.description
remaining = width - name_length - version_length - 4 remaining = width - name_length - version_length - 4
...@@ -286,18 +300,27 @@ lists all packages available.""" ...@@ -286,18 +300,27 @@ lists all packages available."""
for color in self.colors: for color in self.colors:
self.set_style(color, color) self.set_style(color, color)
def find_latest_package(self, package): def find_latest_package(self, package, include_dev):
from poetry.io import NullIO from poetry.io import NullIO
from poetry.puzzle.provider import Provider from poetry.puzzle.provider import Provider
from poetry.version.version_selector import VersionSelector from poetry.version.version_selector import VersionSelector
# find the latest version allowed in this pool # find the latest version allowed in this pool
if package.source_type == "git": if package.source_type in ("git", "file", "directory"):
for dep in self.poetry.package.requires: requires = self.poetry.package.requires
if dep.name == package.name and dep.is_vcs(): if include_dev:
return Provider( requires = requires + self.poetry.package.dev_requires
self.poetry.package, self.poetry.pool, NullIO()
).search_for_vcs(dep)[0] for dep in requires:
if dep.name == package.name:
provider = Provider(self.poetry.package, self.poetry.pool, NullIO())
if dep.is_vcs():
return provider.search_for_vcs(dep)[0]
if dep.is_file():
return provider.search_for_file(dep)[0]
if dep.is_directory():
return provider.search_for_directory(dep)[0]
name = package.name name = package.name
selector = VersionSelector(self.poetry.pool) selector = VersionSelector(self.poetry.pool)
......
...@@ -15,10 +15,11 @@ from poetry.installation.noop_installer import NoopInstaller ...@@ -15,10 +15,11 @@ from poetry.installation.noop_installer import NoopInstaller
from poetry.poetry import Poetry as BasePoetry from poetry.poetry import Poetry as BasePoetry
from poetry.packages import Locker as BaseLocker from poetry.packages import Locker as BaseLocker
from poetry.repositories import Pool from poetry.repositories import Pool
from poetry.repositories import Repository from poetry.repositories import Repository as BaseRepository
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils.env import MockEnv from poetry.utils.env import MockEnv
from poetry.utils.toml_file import TomlFile from poetry.utils.toml_file import TomlFile
from poetry.repositories.exceptions import PackageNotFound
@pytest.fixture() @pytest.fixture()
...@@ -44,7 +45,7 @@ def mock_clone(self, source, dest): ...@@ -44,7 +45,7 @@ def mock_clone(self, source, dest):
@pytest.fixture @pytest.fixture
def installed(): def installed():
return Repository() return BaseRepository()
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
...@@ -148,14 +149,31 @@ class Poetry(BasePoetry): ...@@ -148,14 +149,31 @@ class Poetry(BasePoetry):
self._pool = Pool() self._pool = Pool()
class Repository(BaseRepository):
def find_packages(
self, name, constraint=None, extras=None, allow_prereleases=False
):
packages = super(Repository, self).find_packages(
name, constraint, extras, allow_prereleases
)
if len(packages) == 0:
raise PackageNotFound("Package [{}] not found.".format(name))
return packages
@pytest.fixture @pytest.fixture
def repo(): def repo():
return Repository() return Repository()
@pytest.fixture @pytest.fixture
def poetry(repo): def project_directory():
p = Poetry.create(Path(__file__).parent.parent / "fixtures" / "simple_project") return "simple_project"
@pytest.fixture
def poetry(repo, project_directory):
p = Poetry.create(Path(__file__).parent.parent / "fixtures" / project_directory)
with p.file.path.open() as f: with p.file.path.open() as f:
content = f.read() content = f.read()
......
[tool.poetry]
name = "my-package"
version = "1.2.3"
description = "Some description."
authors = [
"Sébastien Eustace <sebastien@eustace.io>"
]
license = "MIT"
homepage = "https://poetry.eustace.io"
repository = "https://github.com/sdispater/poetry"
documentation = "https://poetry.eustace.io/docs"
keywords = ["packaging", "dependency", "poetry"]
classifiers = [
"Topic :: Software Development :: Build Tools",
"Topic :: Software Development :: Libraries :: Python Modules"
]
# Requirements
[tool.poetry.dependencies]
python = "~2.7 || ^3.6"
cachy = "^0.1.0"
pendulum = "^2.0.0"
[tool.poetry.dev-dependencies]
pytest = "~3.4"
demo = { git = "https://github.com/demo/demo.git", rev = "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24" }
[tool.poetry.scripts]
my-script = "my_package:main"
[tool.poetry.plugins."blogtool.parsers"]
".rst" = "some_module::SomeClass"
[tool.poetry]
name = "my-package"
version = "1.2.3"
description = "Some description."
authors = [
"Sébastien Eustace <sebastien@eustace.io>"
]
license = "MIT"
readme = "README.rst"
homepage = "https://poetry.eustace.io"
repository = "https://github.com/sdispater/poetry"
documentation = "https://poetry.eustace.io/docs"
keywords = ["packaging", "dependency", "poetry"]
classifiers = [
"Topic :: Software Development :: Build Tools",
"Topic :: Software Development :: Libraries :: Python Modules"
]
# Requirements
[tool.poetry.dependencies]
python = "~2.7 || ^3.6"
# File dependency
demo = { path = "../distributions/demo-0.1.0-py2.py3-none-any.whl" }
# Dir dependency with setup.py
my-package = { path = "../project_with_setup/" }
[tool.poetry.scripts]
my-script = "my_package:main"
[tool.poetry.plugins."blogtool.parsers"]
".rst" = "some_module::SomeClass"
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