Skip to content
This repository has been archived by the owner on Jan 12, 2021. It is now read-only.

Commit

Permalink
Merge branch 'command-tree'
Browse files Browse the repository at this point in the history
  • Loading branch information
orsinium committed Apr 4, 2019
2 parents d3a0e7c + f1b777b commit b716f77
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 2 deletions.
3 changes: 3 additions & 0 deletions dephell/commands/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from .deps_install import DepsInstallCommand
from .deps_licenses import DepsLicensesCommand
from .deps_outdated import DepsOutdatedCommand
from .deps_tree import DepsTreeCommand
from .generate_authors import GenerateAuthorsCommand
from .generate_config import GenerateConfigCommand
from .generate_editorconfig import GenerateEditorconfigCommand
Expand Down Expand Up @@ -34,6 +35,7 @@
'DepsInstallCommand',
'DepsLicensesCommand',
'DepsOutdatedCommand',
'DepsTreeCommand',
'GenerateAuthorsCommand',
'GenerateConfigCommand',
'GenerateEditorconfigCommand',
Expand Down Expand Up @@ -63,6 +65,7 @@
'deps install': DepsInstallCommand,
'deps licenses': DepsLicensesCommand,
'deps outdated': DepsOutdatedCommand,
'deps tree': DepsTreeCommand,
# 'deps remove': ...,
# 'deps sync': ...,
'generate authors': GenerateAuthorsCommand,
Expand Down
2 changes: 1 addition & 1 deletion dephell/commands/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def validate(self):
return is_valid

@classmethod
def get_value(cls, data, key, sep: Optional[str] = '-'):
def get_value(cls, data, key: str = None, sep: Optional[str] = '-'):
json_params = dict(indent=2, sort_keys=True, ensure_ascii=False)
# print all config
if not key:
Expand Down
90 changes: 90 additions & 0 deletions dephell/commands/deps_tree.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# built-in
from argparse import ArgumentParser, REMAINDER
from typing import List

# app
from ..config import builders
from ..controllers import analize_conflict
from ..converters import CONVERTERS, PIPConverter
from .base import BaseCommand


class DepsTreeCommand(BaseCommand):
"""Show dependencies tree.
https://dephell.readthedocs.io/en/latest/cmd-deps-tree.html
"""
@classmethod
def get_parser(cls):
parser = ArgumentParser(
prog='dephell deps tree',
description=cls.__doc__,
)
builders.build_config(parser)
builders.build_from(parser)
builders.build_resolver(parser)
builders.build_api(parser)
builders.build_output(parser)
builders.build_other(parser)
parser.add_argument(
'--type',
nargs='?',
choices=('pretty', 'json', 'graph'),
default='pretty',
help='format for tree output.',
)
parser.add_argument('name', nargs=REMAINDER, help='package to get dependencies from')
return parser

def __call__(self):
if self.args.name:
resolver = PIPConverter(lock=False).loads_resolver(' '.join(self.args.name))
else:
loader = CONVERTERS[self.config['from']['format']]
resolver = loader.load_resolver(path=self.config['from']['path'])

# resolve
self.logger.debug('resolving...')
resolved = resolver.resolve()
if not resolved:
conflict = analize_conflict(resolver=resolver)
self.logger.warning('conflict was found')
print(conflict)
return False
self.logger.debug('resolved')

if self.args.type == 'pretty':
for dep in sorted(resolver.graph.get_layer(1)):
print('\n'.join(self._make_tree(dep)))
return True

if self.args.type == 'json':
result = []
for dep in sorted(resolver.graph):
result.append(dict(
name=dep.name,
constraint=str(dep.constraint) or '*',
best=str(dep.group.best_release.version),
latest=str(dep.groups.releases[0].version),
dependencies=[subdep.name for subdep in dep.dependencies]
))
print(self.get_value(result, key=self.config.get('filter')))
return True

if self.args.type == 'graph':
resolver.graph.draw()
self.logger.info('graph saved into .dephell_report/')
return True

@classmethod
def _make_tree(cls, dep, *, level: int = 0) -> List[str]:
lines = ['{level}- {name} [required: {constraint}, locked: {best}, latest: {latest}]'.format(
level=' ' * level,
name=dep.name,
constraint=str(dep.constraint) or '*',
best=str(dep.group.best_release.version),
latest=str(dep.groups.releases[0].version),
)]
for subdep in sorted(dep.dependencies):
lines.extend(cls._make_tree(subdep, level=level + 1))
return lines
2 changes: 1 addition & 1 deletion dephell/config/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

class Config:
env = ''
_skip = ('config', 'env', 'key', 'name')
_skip = ('config', 'env', 'key', 'name', 'type')

def __init__(self, data: Optional[dict] = None):
self._data = data or DEFAULT
Expand Down
1 change: 1 addition & 0 deletions docs/cmd-deps-convert.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ You can specify input and output in three different ways:

1. [dephell build](cmd-deps-install) to fast convert dependencies into setup.py, sdist and wheel.
1. [dephell deps install](cmd-deps-install) to install project dependencies.
1. [dephell deps tree](cmd-deps-tree) to show dependencies tree for project.
38 changes: 38 additions & 0 deletions docs/cmd-deps-tree.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# dephell deps tree

Show dependencies tree for your dependencies from `from` section or given package.

Show project dependencies:

```bash
$ dephell deps tree
- aiofiles [required: *, locked: 0.4.0, latest: 0.4.0]
- aiohttp [required: *, locked: 3.5.4, latest: 3.5.4]
- async-timeout [required: <4.0,>=3.0, locked: 3.0.1, latest: 3.0.1]
- attrs [required: >=17.3.0, locked: 19.1.0, latest: 19.1.0]
- chardet [required: <4.0,>=2.0, locked: 3.0.4, latest: 3.0.4]
- idna-ssl [required: >=1.0, locked: 1.1.0, latest: 1.1.0]
- idna [required: >=2.0, locked: 2.8, latest: 2.8]
...
```

Field `locked` shows version that was resolved by this command, **not** the version that represented in any environment or lockfile.

Show dependencies for given package:

```bash
$ dephell deps tree aiohttp==3.5.4
- aiohttp [required: ==3.5.4, locked: 3.5.4, latest: 3.5.4]
- async-timeout [required: <4.0,>=3.0, locked: 3.0.1, latest: 3.0.1]
- attrs [required: >=17.3.0, locked: 19.1.0, latest: 19.1.0]
- chardet [required: <4.0,>=2.0, locked: 3.0.4, latest: 3.0.4]
- idna-ssl [required: >=1.0, locked: 1.1.0, latest: 1.1.0]
- idna [required: >=2.0, locked: 2.8, latest: 2.8]
...
```

## See also

1. [dephell package outdated](cmd-package-list) to show outdated packages in a lockfile or project virtual environment.
1. [dephell package list](cmd-package-list) to show information about installed packages.
1. [dephell package show](cmd-package-show) to get information about single package.
1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
cmd-deps-install
cmd-deps-licenses
cmd-deps-outdated
cmd-deps-tree
cmd-generate-authors
cmd-generate-config
cmd-generate-editorconfig
Expand Down

0 comments on commit b716f77

Please sign in to comment.