def setUp(self): # Current Env: self.nodes = [('A', '1.0.0'), ('B', '1.0.0'), ('C', '1.0.0')] self.edges = [[('A', '1.0.0'), ('B', '1.0.0'), ('==', '1.0.0')], [('A', '1.0.0'), ('C', '1.0.0'), ('>=', '0.5.0')], ] self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package('A', self.edges)
def setUp(self): self.nodes = [('A', '1.0.0'), ('B', '1.0.0'), ('C', '1.0.0')] self.edges = [ [('A', '1.0.0'), ('B', '1.0.0'), ('==', '1.0.0')], [('A', '1.0.0'), ('C', '1.0.0'), ('>=', '0.5.0')], ] self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package('A', self.edges)
def setUp(self): super(TestAncestorDependencies, self).setUp() self.package = "fabtools" self.version = "0.19.0" self.fab_reqs = json.load( open("tests/deputils_data/fabtools_0_19_0_req.json", 'r')) self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package( self.package, self.venv.edges)
def setUp(self): super(TestAncestorDependencies, self).setUp() self.package = "fabtools" self.version = "0.19.0" self.fab_reqs = json.load( open("tests/deputils_data/fabtools_0_19_0_req.json", 'r')) self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package( self.package, self.venv.edges)
def setUp(self): """Augment prior setup for specific requirements""" super(TestDependencySet, self).setUp() self.package = "fabtools" self.version = "0.19.0" self.fab_reqs = json.load( open("tests/deputils_data/fabtools_0_19_0_req.json", 'r')) self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package( self.package, self.venv.edges)
def setUp(self): """Augment prior setup for specific requirements""" super(TestDependencySet, self).setUp() self.package = "fabtools" self.version = "0.19.0" self.fab_reqs = json.load( open("tests/deputils_data/fabtools_0_19_0_req.json", 'r')) self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package( self.package, self.venv.edges)
def test_z_fails(self): """ Z should fail with B<1 """ package = 'B' version = '0.0.1' ancestors, _ = Package.get_direct_links_to_any_package('B', self.edges) res = DepTools.check_if_ancestors_still_satisfied( package, version, ancestors, self.package_requirements) self.assertIn('z', res['conflicts'])
def test_z_fails(self): """ Z should fail with B<1 """ package = 'B' version = '0.0.1' ancestors, _ = Package.get_direct_links_to_any_package('B', self.edges) res = DepTools.check_if_ancestors_still_satisfied( package, version, ancestors, self.package_requirements) self.assertIn('z', res['conflicts'])
def setUp(self): self.nodes = [ ('A', '1.0.0'), ('B', '1.0.0'), ('C', '1.0.0'), ('X', '1.0.0'), ('Y', '1.0.0'), ('Z', '1.0.0'), ] self.edges = [ [('A', '1.0.0'), ('B', '1.0.0'), ('==', '1.0.0')], [('A', '1.0.0'), ('C', '1.0.0'), ('>=', '0.5.0')], [('X', '1.0.0'), ('A', '1.0.0'), ('>=', '1.0.0')], [('Y', '1.0.0'), ('A', '1.0.0'), ('<=', '2.0.0')], [('Z', '1.0.0'), ('B', '1.0.0'), ('>=', '1.0.0')], ] self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package('A', self.edges) p_r = {} # package_requirements: build from edges. for e in self.edges: print(e) project_name = e[0][0] version = e[0][1] key = project_name.lower() if key not in p_r: p_r[key] = { 'project_name': project_name, 'version': version, 'requires': {} } sub_project_name = e[1][0] sub_key = sub_project_name.lower() sub_version = e[1][1] specs = e[2] p_r[key]['requires'][sub_key] = { 'project_name': sub_project_name, 'version': sub_version, 'specs': [specs] } self.package_requirements = p_r
def setUp(self): self.nodes = [ ('A', '1.0.0'), ('B', '1.0.0'), ('C', '1.0.0'), ('X', '1.0.0'), ('Y', '1.0.0'), ('Z', '1.0.0'), ] self.edges = [[('A', '1.0.0'), ('B', '1.0.0'), ('==', '1.0.0')], [('A', '1.0.0'), ('C', '1.0.0'), ('>=', '0.5.0')], [('X', '1.0.0'), ('A', '1.0.0'), ('>=', '1.0.0')], [('Y', '1.0.0'), ('A', '1.0.0'), ('<=', '2.0.0')], [('Z', '1.0.0'), ('B', '1.0.0'), ('>=', '1.0.0')], ] self.ancestors, self.descendants = \ Package.get_direct_links_to_any_package('A', self.edges) p_r = {} # package_requirements: build from edges. for e in self.edges: print(e) project_name = e[0][0] version = e[0][1] key = project_name.lower() if key not in p_r: p_r[key] = {'project_name': project_name, 'version': version, 'requires': {}} sub_project_name = e[1][0] sub_key = sub_project_name.lower() sub_version = e[1][1] specs = e[2] p_r[key]['requires'][sub_key] = {'project_name': sub_project_name, 'version': sub_version, 'specs': [specs]} self.package_requirements = p_r
def detect_upgrade_conflicts(packages, venv, pretty=False): """ Detect conflicts between packages in current environment when upgrading other packages. At present this routine will look at just the immediate connections to a graph in the environment. It does this in 3 major ways: 1. DEPENDENCY SET - check_changes_in_requirements_vs_env Checks the required dependencies of new version against current environment to see additions/removals BY NAME ONLY. 2. REQUIRED VERSIONS - check_req_deps_satisfied_by_current_env For all dependencies of new version, checks to see whether they are satisfied by current environment versions. 3. ANCESTOR DEPENDENCIES - check_if_ancestors_still_satisfied For all the ancestor nodes that depend on PACKAGE, it checks whether the dependency specs are satisfied by the new version. :param list packages: List of (package, desired_version)'s :param Environment venv: virtual environment """ uc_deps = {} conflicts = {} for u in packages: package = u[0] version = u[1] p_v = "{0}_{1}".format(package, version.replace('.', '_')) uc_deps[p_v] = {} p_key = package.lower() cur_ver = venv.all_packages[p_key].version if parse_version(cur_ver) == parse_version(version): s = ("{} version {} is same as current!".format( package, version)) print_col(s, 'red', 'black', pretty) continue if not PyPIHelper.check_package_version_on_pypi(package, version): continue uc_deps[p_v]['requirements'] = \ DepTools.get_deps_for_package_version( package, version, vex_options=MagellanConfig.vex_options) ancestors, descendants = Package.get_direct_links_to_any_package( package, venv.edges) # 1: DEPENDENCY SET - check_changes_in_requirements_vs_env uc_deps[p_v]['dependency_set'] = \ DepTools.check_changes_in_requirements_vs_env( uc_deps[p_v]['requirements'], descendants) # 2. REQUIRED VERSIONS - check_req_deps_satisfied_by_current_env uc_deps[p_v]['required_versions'] = \ DepTools.check_req_deps_satisfied_by_current_env( uc_deps[p_v]['requirements'], venv.nodes) # 3. ANCESTOR DEPENDENCIES - check_if_ancestors_still_satisfied uc_deps[p_v]['ancestor_dependencies'] = \ DepTools.check_if_ancestors_still_satisfied( package, version, ancestors, venv.package_requirements) conflicts[p_v] = {} try: conflicts[p_v]['dep_set'] = uc_deps[p_v]['dependency_set'] conflicts[p_v]['req_ver'] = \ uc_deps[p_v]['required_versions']['conflicts'] conflicts[p_v]['missing_packages'] = \ uc_deps[p_v]['required_versions']['missing'] conflicts[p_v]['anc_dep'] = \ uc_deps[p_v]['ancestor_dependencies']['conflicts'] except TypeError as e: maglog.debug( "Error when attempting to assess conflicts {}".format(e)) return conflicts, uc_deps
def test_empty_list_returned_from_invalid_package(self): """[],[] should be returned if package is invalid.""" anc, dec = Package.get_direct_links_to_any_package( 'NONSENSE_PACKAGE', self.edges) self.assertEqual(anc, []) self.assertEqual(dec, [])
def test_return_from_celery(self): """ancestors and descendants should match test data.""" anc, dec = Package.get_direct_links_to_any_package( 'celery', self.edges) self.assertEqual(anc, self.celery_ancestors) self.assertEqual(dec, self.celery_descendants)
def detect_upgrade_conflicts(packages, venv, pretty=False): """ Detect conflicts between packages in current environment when upgrading other packages. At present this routine will look at just the immediate connections to a graph in the environment. It does this in 3 major ways: 1. DEPENDENCY SET - check_changes_in_requirements_vs_env Checks the required dependencies of new version against current environment to see additions/removals BY NAME ONLY. 2. REQUIRED VERSIONS - check_req_deps_satisfied_by_current_env For all dependencies of new version, checks to see whether they are satisfied by current environment versions. 3. ANCESTOR DEPENDENCIES - check_if_ancestors_still_satisfied For all the ancestor nodes that depend on PACKAGE, it checks whether the dependency specs are satisfied by the new version. :param list packages: List of (package, desired_version)'s :param Environment venv: virtual environment """ uc_deps = {} conflicts = {} for u in packages: package = u[0] version = u[1] p_v = "{0}_{1}".format(package, version.replace('.', '_')) uc_deps[p_v] = {} p_key = package.lower() cur_ver = venv.all_packages[p_key].version if parse_version(cur_ver) == parse_version(version): s = ("{} version {} is same as current!" .format(package, version)) print_col(s, 'red', 'black', pretty) continue if not PyPIHelper.check_package_version_on_pypi(package, version): continue uc_deps[p_v]['requirements'] = \ DepTools.get_deps_for_package_version( package, version, vex_options=MagellanConfig.vex_options) ancestors, descendants = Package.get_direct_links_to_any_package( package, venv.edges) # 1: DEPENDENCY SET - check_changes_in_requirements_vs_env uc_deps[p_v]['dependency_set'] = \ DepTools.check_changes_in_requirements_vs_env( uc_deps[p_v]['requirements'], descendants) # 2. REQUIRED VERSIONS - check_req_deps_satisfied_by_current_env uc_deps[p_v]['required_versions'] = \ DepTools.check_req_deps_satisfied_by_current_env( uc_deps[p_v]['requirements'], venv.nodes) # 3. ANCESTOR DEPENDENCIES - check_if_ancestors_still_satisfied uc_deps[p_v]['ancestor_dependencies'] = \ DepTools.check_if_ancestors_still_satisfied( package, version, ancestors, venv.package_requirements) conflicts[p_v] = {} try: conflicts[p_v]['dep_set'] = uc_deps[p_v]['dependency_set'] conflicts[p_v]['req_ver'] = \ uc_deps[p_v]['required_versions']['conflicts'] conflicts[p_v]['missing_packages'] = \ uc_deps[p_v]['required_versions']['missing'] conflicts[p_v]['anc_dep'] = \ uc_deps[p_v]['ancestor_dependencies']['conflicts'] except TypeError as e: maglog.debug("Error when attempting to assess conflicts {}" .format(e)) return conflicts, uc_deps
def test_empty_list_returned_from_invalid_package(self): """[],[] should be returned if package is invalid.""" anc, dec = Package.get_direct_links_to_any_package( 'NONSENSE_PACKAGE', self.edges) self.assertEqual(anc, []) self.assertEqual(dec, [])
def test_return_from_celery(self): """ancestors and descendants should match test data.""" anc, dec = Package.get_direct_links_to_any_package( 'celery', self.edges) self.assertEqual(anc, self.celery_ancestors) self.assertEqual(dec, self.celery_descendants)