예제 #1
0
    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))
예제 #2
0
    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)
            })
예제 #3
0
    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",
                },
            )
예제 #4
0
    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),
        )
예제 #5
0
  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),
                                            })
예제 #7
0
    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))
예제 #9
0
  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))
예제 #10
0
    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))
예제 #12
0
    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)
예제 #14
0
  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)
예제 #15
0
  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,
                                              [], {})
예제 #16
0
    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))
예제 #17
0
    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, [], {})
예제 #18
0
    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)
예제 #19
0
    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)
예제 #20
0
    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)
                                          })