def test_diff_should_install(from_line): installed = [] # empty env reqs = [from_line('django==1.8')] to_install, to_uninstall = diff(reqs, installed) assert {str(x.req) for x in to_install} == {'django==1.8'} assert to_uninstall == set()
def test_diff_leave_piptools_alone(fake_dist, from_line): # Suppose an env contains Django, and pip-tools itself (including all of # its dependencies) installed = [ fake_dist('django==1.7'), fake_dist('first==2.0.1'), fake_dist('pip-tools==1.1.1', [ 'click>=4', 'first', 'six', ]), fake_dist('six==1.9.0'), fake_dist('click==4.1'), fake_dist('foobar==0.3.6'), ] # Then this Django-only requirement should keep pip around (i.e. NOT # uninstall it), but uninstall first reqs = [ from_line('django==1.7'), ] to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == {'foobar'}
def test_diff_should_do_nothing(): installed = [] # empty env reqs = [] # no requirements to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == set()
def test_diff_should_install_with_markers(from_line): installed = [] reqs = [from_line("subprocess32==3.2.7 ; python_version=='2.7'")] to_install, to_uninstall = diff(reqs, installed) assert {str(x.req) for x in to_install} == ({'subprocess32==3.2.7'} if sys.version.startswith('2.7') else set()) assert to_uninstall == set()
def test_diff_should_uninstall_with_markers(fake_dist, from_line): installed = [fake_dist('subprocess32==3.2.7')] reqs = [from_line("subprocess32==3.2.7 ; python_version=='2.7'")] to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == (set() if sys.version.startswith('2.7') else {'subprocess32'})
def test_diff_should_update(fake_dist, from_line): installed = [fake_dist('django==1.7')] reqs = [from_line('django==1.8')] to_install, to_uninstall = diff(reqs, installed) assert {str(x.req) for x in to_install} == {'django==1.8'} assert to_uninstall == set()
def test_diff_should_uninstall_with_markers(fake_dist, from_line): installed = [fake_dist("subprocess32==3.2.7")] reqs = [from_line("subprocess32==3.2.7 ; python_version=='2.7'")] to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == {"subprocess32"}
def test_diff_should_uninstall(fake_dist): installed = [fake_dist('django==1.8')] reqs = [] to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == {'django'} # no version spec when uninstalling
def test_diff_should_not_uninstall(fake_dist): ignored = ('pip==7.1.0', 'pip-tools==1.1.1', 'pip-review==1.1.1', 'pkg-resources==0.0.0', 'setuptools==34.0.0', 'wheel==0.29.0') installed = [fake_dist(pkg) for pkg in ignored] reqs = [] to_uninstall = diff(reqs, installed)[1] assert to_uninstall == set()
def test_diff_with_matching_url_versions(fake_dist, from_line): # if URL version is explicitly provided, use it to avoid reinstalling installed = [fake_dist("example==1.0")] reqs = [from_line("file:///example.zip#egg=example==1.0")] to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == set()
def test_diff_with_no_url_versions(fake_dist, from_line): # if URL version is not provided, assume the contents have # changed and reinstall installed = [fake_dist("example==1.0")] reqs = [from_line("file:///example.zip#egg=example")] to_install, to_uninstall = diff(reqs, installed) assert to_install == set(reqs) assert to_uninstall == {"example"}
def test_diff_with_editable(fake_dist, from_editable): installed = [fake_dist("small-fake-with-deps==0.0.1"), fake_dist("six==1.10.0")] path_to_package = os.path.join(PACKAGES_PATH, "small_fake_with_deps") reqs = [from_editable(path_to_package)] to_install, to_uninstall = diff(reqs, installed) # FIXME: The editable package is uninstalled and reinstalled, including # all its dependencies, even if the version numbers match. assert to_uninstall == {"six", "small-fake-with-deps"} assert len(to_install) == 1 package = list(to_install)[0] assert package.editable assert package.link.url == path_to_url(path_to_package)
def test_diff_leave_packaging_packages_alone(fake_dist, from_line): # Suppose an env contains Django, and pip itself installed = [ fake_dist("django==1.7"), fake_dist("first==2.0.1"), fake_dist("pip==7.1.0"), ] # Then this Django-only requirement should keep pip around (i.e. NOT # uninstall it), but uninstall first reqs = [from_line("django==1.7")] to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == {"first"}
def test_diff_with_editable(fake_dist, from_editable): installed = [fake_dist("small-fake-with-deps==0.0.1"), fake_dist("six==1.10.0")] path_to_package = os.path.join( os.path.dirname(__file__), "test_data", "small_fake_package" ) reqs = [from_editable(path_to_package)] to_install, to_uninstall = diff(reqs, installed) # FIXME: The editable package is uninstalled and reinstalled, including # all its dependencies, even if the version numbers match. assert to_uninstall == {"six", "small-fake-with-deps"} assert len(to_install) == 1 package = list(to_install)[0] assert package.editable assert str(package.link) == _get_file_url(path_to_package)
def main(requirements): """ Get installed pip packages, compare them to the passed packages `requirements` file, install missing packages, uninstall packages not needed anymore """ install_command = create_command("install") options, _ = install_command.parse_args([]) session = install_command._build_session(options) finder = install_command._build_package_finder(options=options, session=session) requirements = parse_requirements(requirements, finder=finder, session=session) installed_dists = get_installed_distributions() to_install, to_uninstall = sync.diff(requirements, installed_dists) sync.sync(to_install, to_uninstall, verbose=True)
def test_diff_should_not_uninstall(fake_dist): ignored = ( "pip==7.1.0", "pip-tools==1.1.1", "pip-review==1.1.1", "pkg-resources==0.0.0", "setuptools==34.0.0", "wheel==0.29.0", "python==3.0", "distribute==0.1", "wsgiref==0.1", "argparse==0.1", ) installed = [fake_dist(pkg) for pkg in ignored] reqs = [] to_uninstall = diff(reqs, installed)[1] assert to_uninstall == set()
def test_diff_with_editable(fake_dist, from_editable): installed = [ fake_dist('small-fake-with-deps==0.0.1'), fake_dist('six==1.10.0'), ] path_to_package = os.path.join(os.path.dirname(__file__), 'fixtures', 'small_fake_package') reqs = [ from_editable(path_to_package), ] to_install, to_uninstall = diff(reqs, installed) # FIXME: The editable package is uninstalled and reinstalled, including all its dependencies, # even if the version numbers match. assert to_uninstall == {'six', 'small-fake-with-deps'} assert len(to_install) == 1 package = list(to_install)[0] assert package.editable assert str(package.link) == _get_file_url(path_to_package)
def test_diff_leave_piptools_alone(fake_dist, from_line): # Suppose an env contains Django, and pip-tools itself (including all of # its dependencies) installed = [ fake_dist("django==1.7"), fake_dist("first==2.0.1"), fake_dist("pip-tools==1.1.1", ["click>=4", "first", "six"]), fake_dist("six==1.9.0"), fake_dist("click==4.1"), fake_dist("foobar==0.3.6"), ] # Then this Django-only requirement should keep pip around (i.e. NOT # uninstall it), but uninstall first reqs = [from_line("django==1.7")] to_install, to_uninstall = diff(reqs, installed) assert to_install == set() assert to_uninstall == {"foobar"}
def test_diff_with_editable(fake_dist, from_editable): installed = [ fake_dist('small-fake-with-deps==0.0.1'), fake_dist('six==1.10.0'), ] path_to_package = os.path.join(os.path.dirname(__file__), 'test_data', 'small_fake_package') reqs = [ from_editable(path_to_package), ] to_install, to_uninstall = diff(reqs, installed) # FIXME: The editable package is uninstalled and reinstalled, including all its dependencies, # even if the version numbers match. assert to_uninstall == {'six', 'small-fake-with-deps'} assert len(to_install) == 1 package = list(to_install)[0] assert package.editable assert str(package.link) == _get_file_url(path_to_package)