def test_collects_classifiers(self): ivy_info = self.parse_ivy_report( "ivy_utils_resources/report_with_multiple_classifiers.xml") ref = IvyModuleRef("toplevel", "toplevelmodule", "latest") def collector(r): x = ivy_info.modules_by_ref.get(r) if x: return {x} else: return set() result = ivy_info.traverse_dependency_graph(ref, collector, dict()) self.assertEqual( { IvyModule( ref=IvyModuleRef(org="org1", name="name1", rev="0.0.1", classifier=None, ext="jar"), artifact="ivy2cache_path/org1/name1.jar", callers=(IvyModuleRef( org="toplevel", name="toplevelmodule", rev="latest", classifier=None, ext="jar", ), ), ), IvyModule( ref=IvyModuleRef(org="org1", name="name1", rev="0.0.1", classifier="wut", ext="jar"), artifact="ivy2cache_path/org1/name1-wut.jar", callers=(IvyModuleRef( org="toplevel", name="toplevelmodule", rev="latest", classifier=None, ext="jar", ), ), ), }, result, )
def mock_generate_ivy_jar_products(cache_key_ignored): ivy_products = defaultdict(list) ivy_info = IvyInfo() # Guava 16.0 would be evicted by Guava 16.0.1. But in a real # resolve, it's possible that before it was evicted, it would # generate some resolution data. artifact_1 = artifact_path('bogus0') unused_artifact = artifact_path('unused') # Because guava 16.0 was evicted, it has no artifacts guava_0 = IvyModule( IvyModuleRef('com.google.guava', 'guava', '16.0'), None, []) guava_1 = IvyModule( IvyModuleRef('com.google.guava', 'guava', '16.0.1'), artifact_1, []) ivy_info.add_module(guava_0) ivy_info.add_module(guava_1) artifact_dep_1 = artifact_path('bogus1') # Because fake#dep 16.0 was evicted before it was resolved, # its deps are never examined, so we don't call add_module. guava_dep_0 = IvyModule( IvyModuleRef('com.google.fake', 'dep', '16.0.0'), None, [guava_0.ref]) guava_dep_1 = IvyModule( IvyModuleRef('com.google.fake', 'dep', '16.0.1'), artifact_dep_1, [guava_1.ref]) ivy_info.add_module(guava_dep_0) ivy_info.add_module(guava_dep_1) # Add an unrelated module to ensure that it's not returned unrelated_parent = IvyModuleRef('com.google.other', 'parent', '1.0') unrelated = IvyModule( IvyModuleRef('com.google.unrelated', 'unrelated', '1.0'), unused_artifact, [unrelated_parent]) ivy_info.add_module(unrelated) ivy_products['default'] = [ivy_info] return ivy_products
def test_collects_classifiers(self): ivy_info = self.parse_ivy_report( 'ivy_utils_resources/report_with_multiple_classifiers.xml') ref = IvyModuleRef("toplevel", "toplevelmodule", "latest") def collector(r): x = ivy_info.modules_by_ref.get(r) if x: return {x} else: return set() result = ivy_info.traverse_dependency_graph(ref, collector, dict()) self.assertEqual( { IvyModule(ref=IvyModuleRef(org='org1', name='name1', rev='0.0.1', classifier=None, ext=u'jar'), artifact='ivy2cache_path/org1/name1.jar', callers=(IvyModuleRef(org='toplevel', name='toplevelmodule', rev='latest', classifier=None, ext=u'jar'), )), IvyModule(ref=IvyModuleRef(org='org1', name='name1', rev='0.0.1', classifier='wut', ext=u'jar'), artifact='ivy2cache_path/org1/name1-wut.jar', callers=(IvyModuleRef(org='toplevel', name='toplevelmodule', rev='latest', classifier=None, ext=u'jar'), )) }, result)
def mock_ivy_info_for(conf): ivy_info = IvyInfo(conf) # Guava 16.0 would be evicted by Guava 16.0.1. But in a real # resolve, it's possible that before it was evicted, it would # generate some resolution data. artifact_1 = artifact_path("bogus0") unused_artifact = artifact_path("unused") # Because guava 16.0 was evicted, it has no artifacts. guava_0 = IvyModule(IvyModuleRef("com.google.guava", "guava", "16.0"), None, []) guava_1 = IvyModule(IvyModuleRef("com.google.guava", "guava", "16.0.1"), artifact_1, []) ivy_info.add_module(guava_0) ivy_info.add_module(guava_1) artifact_dep_1 = artifact_path("bogus1") # Because fake#dep 16.0 was evicted before it was resolved, # its deps are never examined, so we don't call add_module. guava_dep_0 = IvyModule( IvyModuleRef("com.google.fake", "dep", "16.0.0"), None, [guava_0.ref] ) guava_dep_1 = IvyModule( IvyModuleRef("com.google.fake", "dep", "16.0.1"), artifact_dep_1, [guava_1.ref] ) ivy_info.add_module(guava_dep_0) ivy_info.add_module(guava_dep_1) # Add an unrelated module to ensure that it's not returned. unrelated_parent = IvyModuleRef("com.google.other", "parent", "1.0") unrelated = IvyModule( IvyModuleRef("com.google.unrelated", "unrelated", "1.0"), unused_artifact, [unrelated_parent], ) ivy_info.add_module(unrelated) return ivy_info
def test_traverse_dep_graph_sorted(self): """Make sure the modules are returned in a deterministic order by name""" def make_ref(org, name): return IvyModuleRef(org=org, name=name, rev='1.0') ref1 = make_ref('foo', '1') ref2 = make_ref('foo', 'child1') ref3 = make_ref('foo', 'child2') ref4 = make_ref('foo', 'child3') ref5 = make_ref('foo', 'grandchild1') ref6 = make_ref('foo', 'grandchild2') module1 = IvyModule(ref1, '/foo', []) module2 = IvyModule(ref2, '/foo', [ref1]) module3 = IvyModule(ref3, '/foo', [ref1]) module4 = IvyModule(ref4, '/foo', [ref1]) module5 = IvyModule(ref5, '/foo', [ref3]) module6 = IvyModule(ref6, '/foo', [ref3]) def assert_order(inputs): info = IvyInfo('default') for module in inputs: info.add_module(module) def collector(dep): return OrderedSet([dep]) result = [ ref for ref in info.traverse_dependency_graph(ref1, collector) ] self.assertEquals([ref1, ref2, ref3, ref5, ref6, ref4], result) # Make sure the order remains unchanged no matter what order we insert the into the structure assert_order([module1, module2, module3, module4, module5, module6]) assert_order([module6, module5, module4, module3, module2, module1]) assert_order([module5, module1, module2, module6, module3, module4]) assert_order([module6, module4, module3, module1, module2, module5]) assert_order([module4, module2, module1, module3, module6, module5]) assert_order([module4, module2, module5, module6, module1, module3])