2014-02-02 17:42:21 +00:00
|
|
|
import pickle
|
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
from pipdeptree import (build_dist_index, construct_tree, peek_into,
|
2015-11-08 18:20:57 +00:00
|
|
|
DistPackage, ReqPackage, render_tree,
|
|
|
|
reverse_tree)
|
2014-02-02 17:42:21 +00:00
|
|
|
|
|
|
|
|
2014-06-18 04:54:04 +00:00
|
|
|
def venv_fixture(pickle_file):
|
|
|
|
"""Loads required virtualenv pkg data from a pickle file
|
2014-02-02 17:42:21 +00:00
|
|
|
|
2014-06-18 04:54:04 +00:00
|
|
|
:param pickle_file: path to a .pickle file
|
|
|
|
:returns: a tuple of pkgs, pkg_index, req_map
|
|
|
|
:rtype: tuple
|
2014-02-02 17:42:21 +00:00
|
|
|
|
2014-06-18 04:54:04 +00:00
|
|
|
"""
|
|
|
|
with open(pickle_file, 'rb') as f:
|
|
|
|
pkgs = pickle.load(f)
|
2015-11-07 17:05:24 +00:00
|
|
|
dist_index = build_dist_index(pkgs)
|
|
|
|
tree = construct_tree(dist_index)
|
|
|
|
return pkgs, dist_index, tree
|
2014-06-18 04:54:04 +00:00
|
|
|
|
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
pkgs, dist_index, tree = venv_fixture('tests/virtualenvs/testenv.pickle')
|
2014-02-02 17:42:21 +00:00
|
|
|
|
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
def find_dist(key):
|
|
|
|
return dist_index[key]
|
2014-02-02 17:42:21 +00:00
|
|
|
|
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
def find_req(key, parent_key):
|
|
|
|
parent = [x for x in tree.keys() if x.key == parent_key][0]
|
|
|
|
return [x for x in tree[parent] if x.key == key][0]
|
2014-02-02 17:42:21 +00:00
|
|
|
|
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
def test_build_dist_index():
|
|
|
|
assert len(dist_index) == len(pkgs)
|
|
|
|
assert all(isinstance(x, str) for x in dist_index.keys())
|
|
|
|
assert all(isinstance(x, DistPackage) for x in dist_index.values())
|
|
|
|
|
2014-02-02 17:42:21 +00:00
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
def test_tree():
|
|
|
|
assert len(tree) == len(pkgs)
|
|
|
|
assert all((isinstance(k, DistPackage) and
|
|
|
|
all(isinstance(v, ReqPackage) for v in vs))
|
2015-11-08 19:13:40 +00:00
|
|
|
for k, vs in tree.items())
|
2014-02-02 17:42:21 +00:00
|
|
|
|
|
|
|
|
2015-11-08 18:20:57 +00:00
|
|
|
def test_reverse_tree():
|
|
|
|
rtree = reverse_tree(tree)
|
|
|
|
assert all((isinstance(k, ReqPackage) and
|
|
|
|
all(isinstance(v, DistPackage) for v in vs))
|
2015-11-08 19:13:40 +00:00
|
|
|
for k, vs in rtree.items())
|
2015-11-08 18:20:57 +00:00
|
|
|
|
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
def test_DistPackage_render_as_root():
|
|
|
|
alembic = find_dist('alembic')
|
|
|
|
assert alembic.version == '0.6.2'
|
|
|
|
assert alembic.project_name == 'alembic'
|
|
|
|
assert alembic.render_as_root(frozen=False) == 'alembic==0.6.2'
|
2014-02-02 17:42:21 +00:00
|
|
|
|
2015-11-07 17:05:24 +00:00
|
|
|
|
|
|
|
def test_DistPackage_render_as_branch():
|
|
|
|
alembic = find_dist('alembic')
|
|
|
|
assert alembic.project_name == 'alembic'
|
|
|
|
assert alembic.version == '0.6.2'
|
|
|
|
sqlalchemy = find_req('sqlalchemy', 'alembic')
|
|
|
|
assert sqlalchemy.project_name == 'SQLAlchemy'
|
|
|
|
assert sqlalchemy.version_spec == '>=0.7.3'
|
|
|
|
assert sqlalchemy.installed_version == '0.9.1'
|
|
|
|
result_1 = alembic.render_as_branch(sqlalchemy, False)
|
|
|
|
result_2 = alembic.render_as_branch(sqlalchemy, False)
|
|
|
|
assert result_1 == result_2 == 'alembic==0.6.2 [requires: SQLAlchemy>=0.7.3]'
|
|
|
|
|
|
|
|
|
|
|
|
def test_ReqPackage_render_as_root():
|
|
|
|
flask = find_req('flask', 'flask-script')
|
|
|
|
assert flask.project_name == 'Flask'
|
|
|
|
assert flask.installed_version == '0.10.1'
|
|
|
|
assert flask.render_as_root(frozen=False) == 'Flask==0.10.1'
|
|
|
|
|
|
|
|
|
|
|
|
def test_ReqPackage_render_as_branch():
|
|
|
|
mks1 = find_req('markupsafe', 'jinja2')
|
|
|
|
jinja = find_dist('jinja2')
|
|
|
|
assert mks1.project_name == 'markupsafe'
|
|
|
|
assert mks1.installed_version == '0.18'
|
|
|
|
assert mks1.version_spec is None
|
|
|
|
assert mks1.render_as_branch(jinja, False) == 'markupsafe [installed: 0.18]'
|
|
|
|
assert mks1.render_as_branch(jinja, True) == 'MarkupSafe==0.18'
|
|
|
|
mks2 = find_req('markupsafe', 'mako')
|
|
|
|
mako = find_dist('mako')
|
|
|
|
assert mks2.project_name == 'MarkupSafe'
|
|
|
|
assert mks2.installed_version == '0.18'
|
|
|
|
assert mks2.version_spec == '>=0.9.2'
|
|
|
|
assert mks2.render_as_branch(mako, False) == 'MarkupSafe [required: >=0.9.2, installed: 0.18]'
|
|
|
|
assert mks2.render_as_branch(mako, True) == 'MarkupSafe==0.18'
|
2014-02-02 17:42:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_render_tree_only_top():
|
2015-11-07 17:05:24 +00:00
|
|
|
tree_str = render_tree(tree, list_all=False)
|
2014-02-02 17:42:21 +00:00
|
|
|
lines = set(tree_str.split('\n'))
|
2014-02-05 18:10:44 +00:00
|
|
|
assert 'Flask-Script==0.6.6' in lines
|
|
|
|
assert ' - SQLAlchemy [required: >=0.7.3, installed: 0.9.1]' in lines
|
2014-05-10 18:50:15 +00:00
|
|
|
assert 'Lookupy==0.1' in lines
|
2014-02-02 17:42:21 +00:00
|
|
|
assert 'itsdangerous==0.23' not in lines
|
|
|
|
|
|
|
|
|
|
|
|
def test_render_tree_list_all():
|
2015-11-07 17:05:24 +00:00
|
|
|
tree_str = render_tree(tree, list_all=True)
|
2014-02-02 17:42:21 +00:00
|
|
|
lines = set(tree_str.split('\n'))
|
2014-02-05 18:10:44 +00:00
|
|
|
assert 'Flask-Script==0.6.6' in lines
|
|
|
|
assert ' - SQLAlchemy [required: >=0.7.3, installed: 0.9.1]' in lines
|
2014-05-10 18:50:15 +00:00
|
|
|
assert 'Lookupy==0.1' in lines
|
2014-02-02 17:42:21 +00:00
|
|
|
assert 'itsdangerous==0.23' in lines
|
2014-05-10 18:50:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_render_tree_freeze():
|
2015-11-07 17:05:24 +00:00
|
|
|
tree_str = render_tree(tree, list_all=False, frozen=True)
|
2014-06-13 06:44:40 +00:00
|
|
|
lines = set()
|
|
|
|
for line in tree_str.split('\n'):
|
|
|
|
# Workaround for https://github.com/pypa/pip/issues/1867
|
|
|
|
# When hash randomization is enabled, pip can return different names
|
|
|
|
# for git editables from run to run
|
|
|
|
line = line.replace('origin/master', 'master')
|
|
|
|
line = line.replace('origin/HEAD', 'master')
|
|
|
|
lines.add(line)
|
2014-05-10 18:50:15 +00:00
|
|
|
assert 'Flask-Script==0.6.6' in lines
|
2015-07-26 17:37:07 +00:00
|
|
|
assert ' SQLAlchemy==0.9.1' in lines
|
2014-06-12 23:10:12 +00:00
|
|
|
assert '-e git+https://github.com/naiquevin/lookupy.git@cdbe30c160e1c29802df75e145ea4ad903c05386#egg=Lookupy-master' in lines
|
2014-05-10 18:50:15 +00:00
|
|
|
assert 'itsdangerous==0.23' not in lines
|
2014-06-14 01:56:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_render_tree_cyclic_dependency():
|
2015-11-07 17:05:24 +00:00
|
|
|
cyclic_pkgs, dist_index, tree = venv_fixture('tests/virtualenvs/cyclicenv.pickle')
|
|
|
|
tree_str = render_tree(tree, list_all=True)
|
2014-06-14 01:56:55 +00:00
|
|
|
lines = set(tree_str.split('\n'))
|
|
|
|
assert 'CircularDependencyA==0.0.0' in lines
|
|
|
|
assert ' - CircularDependencyB [installed: 0.0.0]' in lines
|
|
|
|
assert 'CircularDependencyB==0.0.0' in lines
|
|
|
|
assert ' - CircularDependencyA [installed: 0.0.0]' in lines
|
|
|
|
|
|
|
|
|
|
|
|
def test_render_tree_freeze_cyclic_dependency():
|
2015-11-07 17:05:24 +00:00
|
|
|
cyclic_pkgs, dist_index, tree = venv_fixture('tests/virtualenvs/cyclicenv.pickle')
|
|
|
|
tree_str = render_tree(tree, list_all=True, frozen=True)
|
2014-06-14 01:56:55 +00:00
|
|
|
lines = set(tree_str.split('\n'))
|
|
|
|
assert 'CircularDependencyA==0.0.0' in lines
|
2015-11-07 17:05:24 +00:00
|
|
|
assert ' CircularDependencyB==0.0.0' in lines
|
2014-06-14 01:56:55 +00:00
|
|
|
assert 'CircularDependencyB==0.0.0' in lines
|
2015-11-07 17:05:24 +00:00
|
|
|
assert ' CircularDependencyA==0.0.0' in lines
|
2014-10-07 17:58:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_peek_into():
|
|
|
|
r1, g1 = peek_into(i for i in [])
|
|
|
|
assert r1
|
|
|
|
assert len(list(g1)) == 0
|
|
|
|
r2, g2 = peek_into(i for i in range(100))
|
|
|
|
assert not r2
|
|
|
|
assert len(list(g2)) == 100
|