Ejemplo n.º 1
0
 def test_deploy_jar_excludes(self):
   target = self.make_target(':foo',
                             JvmBinary,
                             main='com.example.Foo',
                             deploy_excludes=[Exclude(org='example.com', name='foo-lib')])
   self.assertEquals([Exclude(org='example.com', name='foo-lib')],
                     target.deploy_excludes)
Ejemplo n.º 2
0
 def test_excludes_field(self):
     empty = ExcludesField()
     empty_fp = empty.fingerprint()
     self.assertEqual(empty_fp, empty.fingerprint())
     normal = ExcludesField([Exclude('com', 'foozle'), Exclude('org')])
     normal_fp = normal.fingerprint()
     self.assertEqual(normal_fp, normal.fingerprint())
     normal_dup = ExcludesField([Exclude('com', 'foozle'), Exclude('org')])
     self.assertEqual(normal_fp, normal_dup.fingerprint())
     self.assertNotEqual(empty_fp, normal_fp)
Ejemplo n.º 3
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)
            })
Ejemplo n.º 4
0
  def test_create_invalidation_strategy(self):
    task = self.create_task(self.context())
    invalidation_strategy = task.create_invalidation_strategy()

    target = self.make_target('java:target',
                              target_type=JavaLibrary,
                              services={'com.foo.bars.Baz': ['com.spam.bars.BaxImplA']})
    fingerprint1 = invalidation_strategy.fingerprint_target(target)
    self.assertIsNotNone(fingerprint1)

    # Removal of services should be detected.
    self.reset_build_graph()
    target = self.make_target('java:target', target_type=JavaLibrary)
    fingerprint2 = invalidation_strategy.fingerprint_target(target)
    self.assertIsNotNone(fingerprint2)
    self.assertNotEqual(fingerprint1, fingerprint2)

    # Target payload should not affect fingerprinting.
    self.reset_build_graph()
    target = self.make_target('java:target',
                              excludes=[Exclude('com.foo', 'fiz')],
                              target_type=JavaLibrary)
    fingerprint3 = invalidation_strategy.fingerprint_target(target)
    self.assertEqual(fingerprint2, fingerprint3)

    # A change in services should be detected.
    self.reset_build_graph()
    target = self.make_target('java:target',
                              target_type=JavaLibrary,
                              services={'com.foo.bars.Baz': ['com.spam.bars.BazImplA',
                                                             'com.spam.bars.BazImplB']})
    fingerprint4 = invalidation_strategy.fingerprint_target(target)
    self.assertIsNotNone(fingerprint4)
    self.assertNotEqual(fingerprint1, fingerprint4)
    self.assertNotEqual(fingerprint2, fingerprint4)
Ejemplo n.º 5
0
  def test_copy(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)
    resolved_jar = self.add_jar_classpath_element_for_path(classpath_product,
                                                           a,
                                                           self._example_jar_path())
    classpath_product.add_for_target(a, [('default', self.path('a/path'))])

    copied = classpath_product.copy()

    a_closure = a.closure(bfs=True)

    self.assertEqual([('default', resolved_jar.pants_path), ('default', self.path('a/path'))],
                     classpath_product.get_for_targets(a_closure))
    self.assertEqual([('default', resolved_jar.pants_path), ('default', self.path('a/path'))],
                     copied.get_for_targets(a_closure))

    self.add_excludes_for_targets(copied, b, a)
    self.assertEqual([('default', resolved_jar.pants_path), ('default', self.path('a/path'))],
                     classpath_product.get_for_targets(a_closure))
    self.assertEqual([('default', self.path('a/path'))],
                     copied.get_for_targets(a_closure))

    copied.add_for_target(b, [('default', self.path('b/path'))])
    self.assertEqual([('default', resolved_jar.pants_path), ('default', self.path('a/path'))],
                     classpath_product.get_for_targets(a_closure))
    self.assertEqual([('default', self.path('a/path')), ('default', self.path('b/path'))],
                     copied.get_for_targets(a_closure))
Ejemplo n.º 6
0
    def test_get_classpath_entries_for_targets_intransitive(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)
        example_jar_path = self._example_jar_path()
        resolved_jar = self.add_jar_classpath_element_for_path(
            classpath_product, a, example_jar_path)

        classpath_product.add_for_target(
            b, [('default', self.path('b/loose/classes/dir'))])
        classpath_product.add_for_target(
            a, [('default', self.path('a/loose/classes/dir')),
                ('default', self.path('an/internally/generated.jar'))])

        classpath = classpath_product.get_classpath_entries_for_targets([a])
        self.assertEqual(
            [('default',
              ArtifactClasspathEntry(example_jar_path, resolved_jar.coordinate,
                                     resolved_jar.cache_path)),
             ('default', ClasspathEntry(self.path('a/loose/classes/dir'))),
             ('default',
              ClasspathEntry(self.path('an/internally/generated.jar')))],
            classpath)
Ejemplo n.º 7
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))
Ejemplo n.º 8
0
 def get_excludes(cls):
     if cls._excludes == None:
         excludes = []
         for exclude in cls.global_instance().get_options().excludes:
             excludes.append(
                 Exclude(org=exclude['org'], name=exclude['name']))
         cls._excludes = excludes
     return cls._excludes
Ejemplo n.º 9
0
 def _test_copy(self, original):
   # A no-op clone results in an equal object.
   self.assertEqual(original, original.copy())
   # Excludes included in equality.
   excludes_added = original.copy(excludes=[Exclude(org='com.blah', name='blah')])
   self.assertNotEqual(original, excludes_added)
   # Clones are equal with equal content.
   self.assertEqual(original.copy(rev='1.2.3'), original.copy(rev='1.2.3'))
Ejemplo n.º 10
0
 def collect_provide_excludes(target):
     if not target.is_exported:
         return
     logger.debug(
         'Automatically excluding jar {}.{}, which is provided by {}'.
         format(target.provides.org, target.provides.name, target))
     provide_excludes.add(
         Exclude(org=target.provides.org, name=target.provides.name))
Ejemplo n.º 11
0
 def test_jar_dependency_excludes_change_hash(self):
     exclude = Exclude(org='example.com', name='foo-lib')
     with_excludes = JarDependency(org='foo',
                                   name='foo',
                                   excludes=[exclude])
     without_excludes = JarDependency(org='foo', name='foo')
     self.assertNotEqual(with_excludes.cache_key(),
                         without_excludes.cache_key())
Ejemplo n.º 12
0
  def test_transitive_dependencies_excluded_classpath_element(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)
    self.add_jar_classpath_element_for_path(classpath_product, a, self._example_jar_path())
    self.add_excludes_for_targets(classpath_product, b, a)

    classpath = classpath_product.get_for_target(a)
    self.assertEqual([], classpath)
Ejemplo n.º 13
0
 def test_deploy_jar_excludes(self):
   self.add_to_build_file('BUILD', dedent('''
   jvm_binary(name='foo',
     main='com.example.Foo',
     deploy_excludes=[exclude(org='example.com', name='foo-lib')],
   )
   '''))
   target = self.target('//:foo')
   self.assertEquals([Exclude(org='example.com', name='foo-lib')],
                     target.deploy_excludes)
Ejemplo n.º 14
0
    def test_jvm_target_with_excludes_is_hashed(self):
        confs = ()
        strategy = IvyResolveFingerprintStrategy(confs)

        target_with_excludes = self.make_target(':jvm-target',
                                                target_type=JvmTarget,
                                                excludes=[Exclude('org.some')])

        self.assertIsNotNone(
            strategy.compute_fingerprint(target_with_excludes))
Ejemplo n.º 15
0
 def collect_automatic_excludes(target):
     if not target.is_exported:
         return
     # if a source dep is exported, it should always override remote/binary versions
     # of itself, ie "round trip" dependencies
     logger.debug(
         'Automatically excluding jar {}.{}, which is provided by {}'.
         format(target.provides.org, target.provides.name, target))
     excludes.add(
         Exclude(org=target.provides.org, name=target.provides.name))
Ejemplo n.º 16
0
  def test_excludes_similar_org_name(self):
    b = self.make_target('b', JvmTarget)
    a = self.make_target('a', JvmTarget, excludes=[Exclude('com.exam')], dependencies=[b])

    classpath_product = ClasspathProducts(self.pants_workdir)
    self.add_example_jar_classpath_element_for(classpath_product, b)
    self.add_excludes_for_targets(classpath_product, a)

    classpath = classpath_product.get_for_targets(a.closure(bfs=True))

    self.assertEqual([('default', self._example_jar_path())], classpath)
Ejemplo n.º 17
0
  def test_excludes_used_across_targets(self):
    b = self.make_target('b', JvmTarget)
    a = self.make_target('a', JvmTarget, excludes=[Exclude('com.example', 'lib')])

    classpath_product = ClasspathProducts(self.pants_workdir)
    self.add_example_jar_classpath_element_for(classpath_product, b)
    self.add_excludes_for_targets(classpath_product, a)

    classpath = classpath_product.get_for_target(a)

    self.assertEqual([], classpath)
Ejemplo n.º 18
0
  def test_intransitive_dependencies_excluded_classpath_element(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)
    example_jar_path = self._example_jar_path()
    classpath_product.add_for_target(a, [('default', example_jar_path)])
    classpath_product.add_excludes_for_targets([a, b])

    intransitive_classpath = classpath_product.get_for_target(a)
    self.assertEqual([('default', example_jar_path)], intransitive_classpath)
Ejemplo n.º 19
0
  def test_get_classpath_entries_for_targets_respect_excludes(self):
    a = self.make_target('a', JvmTarget, excludes=[Exclude('com.example', 'lib')])

    classpath_product = ClasspathProducts()
    example_jar_path = self._example_jar_path()
    self.add_jar_classpath_element_for_path(classpath_product, a, example_jar_path)
    self.add_excludes_for_targets(classpath_product, a)

    classpath = classpath_product.get_classpath_entries_for_targets([a])

    self.assertEqual([], classpath)
Ejemplo n.º 20
0
  def test_excludes_org_name(self):
    b = self.make_target('b', JvmTarget)
    a = self.make_target('a', JvmTarget, excludes=[Exclude('com.example')], dependencies=[b])

    classpath_product = ClasspathProducts(self.pants_workdir)
    self.add_example_jar_classpath_element_for(classpath_product, b)
    self.add_excludes_for_targets(classpath_product, a)

    classpath = classpath_product.get_for_target(a)

    self.assertEqual([], classpath)
Ejemplo n.º 21
0
  def test_excluded_classpath_element(self):
    a = self.make_target('a', JvmTarget, excludes=[Exclude('com.example', 'lib')])

    classpath_product = ClasspathProducts(self.pants_workdir)
    example_jar_path = self._example_jar_path()
    self.add_jar_classpath_element_for_path(classpath_product, a, example_jar_path)
    self.add_excludes_for_targets(classpath_product, a)

    classpath = classpath_product.get_for_target(a)

    self.assertEqual([], classpath)
Ejemplo n.º 22
0
  def test_parent_excludes_ignored_for_resolving_child_target(self):
    b = self.make_target('b', JvmTarget)
    a = self.make_target('a', JvmTarget, dependencies=[b], excludes=[Exclude('com.example', 'lib')])

    example_jar_path = self._example_jar_path()
    classpath_product = ClasspathProducts(self.pants_workdir)
    self.add_jar_classpath_element_for_path(classpath_product, b, example_jar_path)
    self.add_excludes_for_targets(classpath_product, a)

    classpath = classpath_product.get_for_target(b)

    self.assertEqual([('default', example_jar_path)], classpath)
Ejemplo n.º 23
0
  def test_parent_exclude_excludes_dependency_jar(self):
    b = self.make_target('b', JvmTarget)
    a = self.make_target('a', JvmTarget, dependencies=[b], excludes=[Exclude('com.example', 'lib')])

    classpath_product = ClasspathProducts()
    example_jar_path = self._example_jar_path()
    self.add_jar_classpath_element_for_path(classpath_product, b, example_jar_path)
    self.add_excludes_for_targets(classpath_product, b, a)

    classpath = classpath_product.get_for_target(a)

    self.assertEqual([], classpath)
Ejemplo n.º 24
0
    def test_excludes_in_java_lib_excludes_all_from_jar_lib(self):
        junit_jar_lib = self._make_junit_target()

        excluding_target = self.make_target(
            '//:b', JavaLibrary, excludes=[Exclude('junit', 'junit')])
        compile_classpath = self.resolve([junit_jar_lib, excluding_target])

        junit_jar_cp = compile_classpath.get_for_target(junit_jar_lib)
        excluding_cp = compile_classpath.get_for_target(excluding_target)

        self.assertEquals(0, len(junit_jar_cp))
        self.assertEquals(0, len(excluding_cp))
Ejemplo n.º 25
0
    def test_excludes_in_java_lib_excludes_all_from_jar_lib(self):
        junit_dep = JarDependency('junit', 'junit', rev='4.12')

        junit_jar_lib = self.make_target('//:a', JarLibrary, jars=[junit_dep])
        excluding_target = self.make_target(
            '//:b', JavaLibrary, excludes=[Exclude('junit', 'junit')])
        compile_classpath = self.resolve([junit_jar_lib, excluding_target])

        junit_jar_cp = compile_classpath.get_for_target(junit_jar_lib)
        excluding_cp = compile_classpath.get_for_target(excluding_target)

        self.assertEquals(0, len(junit_jar_cp))
        self.assertEquals(0, len(excluding_cp))
Ejemplo n.º 26
0
    def test_excluded_classpath_element(self):
        a = self.make_target('a',
                             JvmTarget,
                             excludes=[Exclude('com.example', 'lib')])

        classpath_product = ClasspathProducts()
        example_jar_path = self._example_jar_path()
        classpath_product.add_for_target(a, [('default', example_jar_path)])
        classpath_product.add_excludes_for_targets([a])

        classpath = classpath_product.get_for_target(a)

        self.assertEqual([], classpath)
Ejemplo n.º 27
0
  def test_jar_in_classpath_not_a_resolved_jar_ignored_by_excludes(self):
    b = self.make_target('b', JvmTarget)
    a = self.make_target('a', JvmTarget, excludes=[Exclude('com.example')], dependencies=[b])

    example_jar_path = self._example_jar_path()

    classpath_product = ClasspathProducts(self.pants_workdir)
    classpath_product.add_for_target(b, [('default', example_jar_path)])
    self.add_excludes_for_targets(classpath_product, a)

    classpath = classpath_product.get_for_targets(a.closure(bfs=True))

    self.assertEqual([('default', example_jar_path)], classpath)
Ejemplo n.º 28
0
    def test_excludes_used_across_targets(self):
        b = self.make_target('b', JvmTarget)
        a = self.make_target('a',
                             JvmTarget,
                             excludes=[Exclude('com.example', 'lib')])

        classpath_product = ClasspathProducts()
        classpath_product.add_for_target(
            b, [('default', self._example_jar_path())])
        classpath_product.add_excludes_for_targets([a])

        classpath = classpath_product.get_for_target(a)

        self.assertEqual([], classpath)
Ejemplo n.º 29
0
    def collect_jars(target):
      targets_processed.add(target)
      if isinstance(target, JarLibrary):
        for jar in target.jar_dependencies:
          if jar.rev:
            add_jar(jar)

      target_excludes = target.payload.get_field_value('excludes')
      if target_excludes:
        excludes.update(target_excludes)
      if target.is_exported:
        # if a source dep is exported, it should always override remote/binary versions
        # of itself, ie "round trip" dependencies
        excludes.add(Exclude(org=target.provides.org, name=target.provides.name))
Ejemplo n.º 30
0
    def test_jvm_binaries_deploy_excludes(self):
        foo_jar_lib = self.make_target(
            spec='3rdparty/jvm/org/example:foo',
            target_type=JarLibrary,
            jars=[JarDependency(org='org.example', name='foo', rev='1.0.0')])
        binary_target = self.make_target(
            spec='//bar:bar-binary',
            target_type=JvmBinary,
            source='Bar.java',
            dependencies=[foo_jar_lib],
            deploy_excludes=[Exclude(org='org.pantsbuild')])
        context = self.context(target_roots=[binary_target])
        classpath_products = self.ensure_classpath_products(context)

        foo_artifact = self.create_artifact(org='org.example',
                                            name='foo',
                                            rev='1.0.0')
        with open_zip(foo_artifact.pants_path, 'w') as jar:
            jar.writestr('foo/Foo.class', '')

        baz_artifact = self.create_artifact(org='org.pantsbuild',
                                            name='baz',
                                            rev='2.0.0')
        with open_zip(baz_artifact.pants_path, 'w') as jar:
            # This file should not be included in the binary jar since org.pantsbuild is deploy excluded.
            jar.writestr('baz/Baz.class', '')

        classpath_products.add_jars_for_targets(
            targets=[foo_jar_lib],
            conf='default',
            resolved_jars=[foo_artifact, baz_artifact])

        self.add_to_runtime_classpath(context, binary_target, {
            'Bar.class': '',
            'bar.txt': ''
        })

        self.execute(context)
        jvm_binary_products = context.products.get('jvm_binaries')
        self.assertIsNotNone(jvm_binary_products)
        product_data = jvm_binary_products.get(binary_target)
        dist_root = os.path.join(self.build_root, 'dist')
        self.assertEquals({dist_root: ['bar-binary.jar']}, product_data)

        with open_zip(os.path.join(dist_root, 'bar-binary.jar')) as jar:
            self.assertEqual(
                sorted([
                    'META-INF/', 'META-INF/MANIFEST.MF', 'foo/',
                    'foo/Foo.class', 'Bar.class', 'bar.txt'
                ]), sorted(jar.namelist()))