def test_classpath_by_targets(self): b = self.make_target('b', JvmTarget) a = self.make_target('a', JvmTarget, dependencies=[b], excludes=[Exclude('com.example', 'lib')]) classpath_products = ClasspathProducts(self.pants_workdir) path1 = self._path('jar/path1') path2 = self._path('jar/path2') path3 = os.path.join(self.pants_workdir, 'jar/path3') resolved_jar = ResolvedJar(M2Coordinate(org='com.example', name='lib', rev='1.0'), cache_path='somewhere', pants_path=path3) classpath_products.add_for_target(a, [('default', path1)]) classpath_products.add_for_target(a, [('non-default', path2)]) classpath_products.add_for_target(b, [('default', path2)]) classpath_products.add_jars_for_targets([b], 'default', [resolved_jar]) classpath_products.add_excludes_for_targets([a]) # (a, path2) filtered because of conf # (b, path3) filtered because of excludes self.assertEqual( OrderedDict([(a, [ClasspathEntry(path1)]), (b, [ClasspathEntry(path2)])]), ClasspathUtil.classpath_by_targets(a.closure(bfs=True), classpath_products))
def test_create_canonical_classpath(self): a = self.make_target('a/b', JvmTarget) jar_path = 'ivy/jars/org.x/lib/x-1.0.jar' jar_path_excluded = 'ivy/jars/org.y/lib/y-1.0.jar' classpath_products = ClasspathProducts(self.pants_workdir) resolved_jar = ResolvedJar(M2Coordinate(org='org', name='x', rev='1.0'), cache_path='somewhere', pants_path=self._path(jar_path)) # org.y should be excluded from result canonical path resolved_jar_to_exclude = ResolvedJar( M2Coordinate(org='org', name='y', rev='1.0'), cache_path='somewhere', pants_path=self._path(jar_path_excluded)) classpath_products.add_for_target( a, [('default', self._path('a.jar')), ('default', self._path('resources'))]) classpath_products.add_jars_for_targets([a], 'default', [resolved_jar]) with temporary_dir() as base_dir: self._test_canonical_classpath_helper( classpath_products, [a], base_dir, True, [ 'a.b.b-0.jar', 'a.b.b-1', 'a.b.b-2.jar', ], { 'a.b.b-classpath.txt': '{}/a.jar:{}/resources:{}/{}\n'.format( self.pants_workdir, self.pants_workdir, self.pants_workdir, jar_path) }, excludes=set([Exclude(org='org', name='y')])) # incrementally delete the resource dendendency classpath_products = ClasspathProducts(self.pants_workdir) classpath_products.add_for_target(a, [('default', self._path('a.jar'))]) self._test_canonical_classpath_helper( classpath_products, [a], base_dir, True, [ 'a.b.b-0.jar', ], {'a.b.b-classpath.txt': '{}/a.jar\n'.format(self.pants_workdir)}) # incrementally add another jar dependency classpath_products = ClasspathProducts(self.pants_workdir) classpath_products.add_for_target(a, [('default', self._path('a.jar')), ('default', self._path('b.jar'))]) self._test_canonical_classpath_helper( classpath_products, [a], base_dir, True, ['a.b.b-0.jar', 'a.b.b-1.jar'], { 'a.b.b-classpath.txt': '{}/a.jar:{}/b.jar\n'.format(self.pants_workdir, self.pants_workdir) })
def test_create_canonical_classpath_no_duplicate_entry(self): """Test no more than one symlink are created for the same classpath entry.""" jar_path = "ivy/jars/org.x/lib/x-1.0.jar" resolved_jar = ResolvedJar( M2Coordinate(org="org", name="x", rev="1.0"), cache_path="somewhere", pants_path=self._create_file(jar_path), ) target_a = self.make_target("a", JvmTarget) target_b = self.make_target("b", JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) # Both target a and target b depend on the same jar library classpath_products.add_jars_for_targets([target_a], "default", [resolved_jar]) classpath_products.add_jars_for_targets([target_b], "default", [resolved_jar]) with temporary_dir() as base_dir: # Only target a generates symlink to jar library, target b skips creating the # symlink for the same jar library. Both targets' classpath.txt files should # still contain the jar library. self._test_canonical_classpath_helper( classpath_products, [target_a, target_b], base_dir, ["a.a-0.jar"], { "a.a-classpath.txt": f"{self.pants_workdir}/{jar_path}\n", "b.b-classpath.txt": f"{self.pants_workdir}/{jar_path}\n", }, )
def test_classpath_by_targets(self): b = self.make_target("b", JvmTarget) a = self.make_target("a", JvmTarget, dependencies=[b], excludes=[Exclude("com.example", "lib")]) classpath_products = ClasspathProducts(self.pants_workdir) path1 = self._path("jar/path1") path2 = self._path("jar/path2") path3 = os.path.join(self.pants_workdir, "jar/path3") resolved_jar = ResolvedJar( M2Coordinate(org="com.example", name="lib", rev="1.0"), cache_path="somewhere", pants_path=path3, ) classpath_products.add_for_target(a, [("default", path1)]) classpath_products.add_for_target(a, [("non-default", path2)]) classpath_products.add_for_target(b, [("default", path2)]) classpath_products.add_jars_for_targets([b], "default", [resolved_jar]) classpath_products.add_excludes_for_targets([a]) # (a, path2) filtered because of conf # (b, path3) filtered because of excludes self.assertEqual( OrderedDict([(a, [ClasspathEntry(path1)]), (b, [ClasspathEntry(path2)])]), ClasspathUtil.classpath_by_targets(a.closure(bfs=True), classpath_products), )
def test_classpath_by_targets(self): b = self.make_target('b', JvmTarget) a = self.make_target('a', JvmTarget, dependencies=[b], excludes=[Exclude('com.example', 'lib')]) classpath_products = ClasspathProducts(self.pants_workdir) path1 = self._path('jar/path1') path2 = self._path('jar/path2') path3 = os.path.join(self.pants_workdir, 'jar/path3') resolved_jar = ResolvedJar(M2Coordinate(org='com.example', name='lib', rev='1.0'), cache_path='somewhere', pants_path=path3) classpath_products.add_for_target(a, [('default', path1)]) classpath_products.add_for_target(a, [('non-default', path2)]) classpath_products.add_for_target(b, [('default', path2)]) classpath_products.add_jars_for_targets([b], 'default', [resolved_jar]) classpath_products.add_excludes_for_targets([a]) # (a, path2) filtered because of conf # (b, path3) filtered because of excludes self.assertEquals(OrderedDict([(a, [ClasspathEntry(path1)]), (b, [ClasspathEntry(path2)])]), ClasspathUtil.classpath_by_targets(a.closure(bfs=True), classpath_products))
def test_create_canonical_classpath_no_duplicate_entry(self): """Test no more than one symlink are created for the same classpath entry.""" jar_path = 'ivy/jars/org.x/lib/x-1.0.jar' resolved_jar = ResolvedJar(M2Coordinate(org='org', name='x', rev='1.0'), cache_path='somewhere', pants_path=self._create_file(jar_path)) target_a = self.make_target('a', JvmTarget) target_b = self.make_target('b', JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) # Both target a and target b depend on the same jar library classpath_products.add_jars_for_targets([target_a], 'default', [resolved_jar]) classpath_products.add_jars_for_targets([target_b], 'default', [resolved_jar]) with temporary_dir() as base_dir: # Only target a generates symlink to jar library, target b skips creating the # symlink for the same jar library. Both targets' classpath.txt files should # still contain the jar library. self._test_canonical_classpath_helper(classpath_products, [target_a, target_b], base_dir, ['a.a-0.jar'], { 'a.a-classpath.txt': '{}/{}\n'.format(self.pants_workdir, jar_path), 'b.b-classpath.txt': '{}/{}\n'.format(self.pants_workdir, jar_path), })
def test_create_canonical_classpath_no_duplicate_entry(self): """Test no more than one symlink are created for the same classpath entry.""" jar_path = 'ivy/jars/org.x/lib/x-1.0.jar' resolved_jar = ResolvedJar(M2Coordinate(org='org', name='x', rev='1.0'), cache_path='somewhere', pants_path=self._create_file(jar_path)) target_a = self.make_target('a', JvmTarget) target_b = self.make_target('b', JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) # Both target a and target b depend on the same jar library classpath_products.add_jars_for_targets([target_a], 'default', [resolved_jar]) classpath_products.add_jars_for_targets([target_b], 'default', [resolved_jar]) with temporary_dir() as base_dir: # Only target a generates symlink to jar library, target b skips creating the # symlink for the same jar library. Both targets' classpath.txt files should # still contain the jar library. self._test_canonical_classpath_helper( classpath_products, [target_a, target_b], base_dir, ['a.a-0.jar'], { 'a.a-classpath.txt': '{}/{}\n'.format(self.pants_workdir, jar_path), 'b.b-classpath.txt': '{}/{}\n'.format(self.pants_workdir, jar_path), })
def test_fails_if_jar_paths_outside_buildroot(self): a = self.make_target('a', JvmTarget) classpath_product = ClasspathProducts(self.pants_workdir) with self.assertRaises(TaskError) as cm: classpath_product.add_jars_for_targets([a], 'default', [(resolved_example_jar_at('/dev/null'))]) self.assertEqual( 'Classpath entry /dev/null for target a:a is located outside the working directory "{}".'.format(self.pants_workdir), str(cm.exception))
def test_jar_missing_pants_path_fails_adding(self): b = self.make_target("b", JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) with self.assertRaises(TaskError) as cm: classpath_products.add_jars_for_targets( [b], "default", [ResolvedJar(M2Coordinate(org="org", name="name"), cache_path="somewhere", pants_path=None)], ) self.assertEqual("Jar: org:name:::jar has no specified path.", str(cm.exception))
def test_jar_missing_pants_path_fails_adding(self): b = self.make_target('b', JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) with self.assertRaises(TaskError) as cm: classpath_products.add_jars_for_targets([b], 'default', [ResolvedJar(M2Coordinate(org='org', name='name'), cache_path='somewhere', pants_path=None)]) self.assertEqual( 'Jar: org:name: has no specified path.', str(cm.exception))
def test_jar_missing_pants_path_fails_adding(self): b = self.make_target('b', JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) with self.assertRaises(TaskError) as cm: classpath_products.add_jars_for_targets([b], 'default', [ ResolvedJar(M2Coordinate(org='org', name='name'), cache_path='somewhere', pants_path=None) ]) self.assertEqual('Jar: org:name: has no specified path.', str(cm.exception))
def test_exclude_leaves_other_jars_unaffected(self): b = self.make_target('b', JvmTarget, excludes=[Exclude('com.example', 'lib')]) a = self.make_target('a', JvmTarget, dependencies=[b]) classpath_product = ClasspathProducts(self.pants_workdir) com_example_jar_path = self._example_jar_path() org_example_jar_path = self.path('ivy/jars/org.example/lib/123.4.jar') classpath_product.add_jars_for_targets([a], 'default', [resolved_example_jar_at(com_example_jar_path), resolved_example_jar_at(org_example_jar_path, org='org.example')]) self.add_excludes_for_targets(classpath_product, b) classpath = classpath_product.get_for_target(a) self.assertEqual([('default', org_example_jar_path)], classpath)
def test_create_canonical_classpath_with_broken_classpath(self): """Test exception is thrown when the jar file is missing.""" a = self.make_target('a/b', JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) jar_path = 'ivy/jars/org.x/lib/x-1.0.jar' # this sets the path for the artifact without actually materializing it. resolved_jar = ResolvedJar(M2Coordinate(org='org', name='x', rev='1.0'), cache_path='somewhere', pants_path=os.path.join(self.pants_workdir, jar_path)) classpath_products.add_jars_for_targets([a], 'default', [resolved_jar]) with temporary_dir() as base_dir: with self.assertRaises(MissingClasspathEntryError): self._test_canonical_classpath_helper(classpath_products, [a], base_dir, False, [], {})
def test_jar_missing_pants_path_fails_adding(self): b = self.make_target("b", JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) with self.assertRaises(TaskError) as cm: classpath_products.add_jars_for_targets( [b], "default", [ ResolvedJar( M2Coordinate(org="org", name="name"), cache_path="somewhere", pants_path=None, ) ], ) self.assertEqual("Jar: org:name: has no specified path.", str(cm.exception))
def test_create_canonical_classpath_with_broken_classpath(self): """Test exception is thrown when the jar file is missing.""" a = self.make_target('a/b', JvmTarget) classpath_products = ClasspathProducts(self.pants_workdir) jar_path = 'ivy/jars/org.x/lib/x-1.0.jar' # this sets the path for the artifact without actually materializing it. resolved_jar = ResolvedJar(M2Coordinate(org='org', name='x', rev='1.0'), cache_path='somewhere', pants_path=os.path.join( self.pants_workdir, jar_path)) classpath_products.add_jars_for_targets([a], 'default', [resolved_jar]) with temporary_dir() as base_dir: with self.assertRaises(MissingClasspathEntryError): self._test_canonical_classpath_helper(classpath_products, [a], base_dir, [], {})
def test_exclude_leaves_other_jars_unaffected(self): b = self.make_target("b", JvmTarget, excludes=[Exclude("com.example", "lib")]) a = self.make_target("a", JvmTarget, dependencies=[b]) classpath_product = ClasspathProducts(self.pants_workdir) com_example_jar_path = self._example_jar_path() org_example_jar_path = self.path("ivy/jars/org.example/lib/123.4.jar") classpath_product.add_jars_for_targets( [a], "default", [ resolved_example_jar_at(com_example_jar_path), resolved_example_jar_at(org_example_jar_path, org="org.example"), ], ) self.add_excludes_for_targets(classpath_product, b) classpath = classpath_product.get_for_target(a) self.assertEqual([("default", org_example_jar_path)], classpath)
def test_create_canonical_classpath(self): a = self.make_target("a/b", JvmTarget) jar_path = "ivy/jars/org.x/lib/x-1.0.jar" classpath_products = ClasspathProducts(self.pants_workdir) resolved_jar = ResolvedJar( M2Coordinate(org="org", name="x", rev="1.0"), cache_path="somewhere", pants_path=self._create_file(jar_path), ) classpath_products.add_for_target( a, [("default", self._create_file("a.jar")), ("default", self._create_file("resources"))], ) classpath_products.add_jars_for_targets([a], "default", [resolved_jar]) with temporary_dir() as base_dir: self._test_canonical_classpath_helper( classpath_products, [a], base_dir, ["a.b.b-0.jar", "a.b.b-1", "a.b.b-2.jar"], { "a.b.b-classpath.txt": "{}/a.jar:{}/resources:{}/{}\n".format( self.pants_workdir, self.pants_workdir, self.pants_workdir, jar_path) }, excludes={Exclude(org="org", name="y")}, ) # incrementally delete the resource dependency classpath_products = ClasspathProducts(self.pants_workdir) classpath_products.add_for_target( a, [("default", self._create_file("a.jar"))]) self._test_canonical_classpath_helper( classpath_products, [a], base_dir, ["a.b.b-0.jar"], {"a.b.b-classpath.txt": f"{self.pants_workdir}/a.jar\n"}, ) # incrementally add another jar dependency classpath_products = ClasspathProducts(self.pants_workdir) classpath_products.add_for_target( a, [("default", self._create_file("a.jar")), ("default", self._create_file("b.jar"))]) self._test_canonical_classpath_helper( classpath_products, [a], base_dir, ["a.b.b-0.jar", "a.b.b-1.jar"], { "a.b.b-classpath.txt": "{}/a.jar:{}/b.jar\n".format(self.pants_workdir, self.pants_workdir) }, )
def test_create_canonical_classpath(self): a = self.make_target('a/b', JvmTarget) jar_path = 'ivy/jars/org.x/lib/x-1.0.jar' classpath_products = ClasspathProducts(self.pants_workdir) resolved_jar = ResolvedJar(M2Coordinate(org='org', name='x', rev='1.0'), cache_path='somewhere', pants_path=self._create_file(jar_path)) classpath_products.add_for_target(a, [('default', self._create_file('a.jar')), ('default', self._create_file('resources'))]) classpath_products.add_jars_for_targets([a], 'default', [resolved_jar]) with temporary_dir() as base_dir: self._test_canonical_classpath_helper(classpath_products, [a], base_dir, [ 'a.b.b-0.jar', 'a.b.b-1', 'a.b.b-2.jar', ], { 'a.b.b-classpath.txt': '{}/a.jar:{}/resources:{}/{}\n' .format(self.pants_workdir, self.pants_workdir, self.pants_workdir, jar_path) }, excludes={Exclude(org='org', name='y')}) # incrementally delete the resource dendendency classpath_products = ClasspathProducts(self.pants_workdir) classpath_products.add_for_target(a, [('default', self._create_file('a.jar'))]) self._test_canonical_classpath_helper(classpath_products, [a], base_dir, [ 'a.b.b-0.jar', ], { 'a.b.b-classpath.txt': '{}/a.jar\n'.format(self.pants_workdir) }) # incrementally add another jar dependency classpath_products = ClasspathProducts(self.pants_workdir) classpath_products.add_for_target(a, [('default', self._create_file('a.jar')), ('default', self._create_file('b.jar'))]) self._test_canonical_classpath_helper(classpath_products, [a], base_dir, [ 'a.b.b-0.jar', 'a.b.b-1.jar' ], { 'a.b.b-classpath.txt': '{}/a.jar:{}/b.jar\n'.format(self.pants_workdir, self.pants_workdir) })