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."""
if self.option("outdated"):
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
if self.option("tree") and not package:
......@@ -95,6 +96,7 @@ lists all packages available."""
width = terminal.width
name_length = version_length = latest_length = 0
latest_packages = {}
latest_statuses = {}
installed_repo = InstalledRepository.load(self.env)
skipped = []
......@@ -118,15 +120,25 @@ lists all packages available."""
if installed_status == "not-installed":
current_length += 4
name_length = max(name_length, current_length)
version_length = max(version_length, len(locked.full_pretty_version))
if show_latest:
latest = self.find_latest_package(locked)
latest = self.find_latest_package(locked, include_dev)
if not latest:
latest = locked
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_latest = name_length + version_length + latest_length + 3 <= width
......@@ -157,22 +169,24 @@ lists all packages available."""
line += " <comment>{:{}}</comment>".format(
locked.full_pretty_version, version_length
)
if show_latest and write_latest:
if show_latest:
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":
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:
description = locked.description
remaining = width - name_length - version_length - 4
......@@ -286,18 +300,27 @@ lists all packages available."""
for color in self.colors:
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.puzzle.provider import Provider
from poetry.version.version_selector import VersionSelector
# find the latest version allowed in this pool
if package.source_type == "git":
for dep in self.poetry.package.requires:
if dep.name == package.name and dep.is_vcs():
return Provider(
self.poetry.package, self.poetry.pool, NullIO()
).search_for_vcs(dep)[0]
if package.source_type in ("git", "file", "directory"):
requires = self.poetry.package.requires
if include_dev:
requires = requires + self.poetry.package.dev_requires
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
selector = VersionSelector(self.poetry.pool)
......
......@@ -15,10 +15,11 @@ from poetry.installation.noop_installer import NoopInstaller
from poetry.poetry import Poetry as BasePoetry
from poetry.packages import Locker as BaseLocker
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.env import MockEnv
from poetry.utils.toml_file import TomlFile
from poetry.repositories.exceptions import PackageNotFound
@pytest.fixture()
......@@ -44,7 +45,7 @@ def mock_clone(self, source, dest):
@pytest.fixture
def installed():
return Repository()
return BaseRepository()
@pytest.fixture(autouse=True)
......@@ -148,14 +149,31 @@ class Poetry(BasePoetry):
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
def repo():
return Repository()
@pytest.fixture
def poetry(repo):
p = Poetry.create(Path(__file__).parent.parent / "fixtures" / "simple_project")
def project_directory():
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:
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