def generate_targets_map(self, targets, classpath_products=None): """Generates a dictionary containing all pertinent information about the target graph. The return dictionary is suitable for serialization by json.dumps. :param targets: The list of targets to generate the map for. :param classpath_products: Optional classpath_products. If not provided when the --libraries option is `True`, this task will perform its own jar resolution. """ targets_map = {} resource_target_map = {} python_interpreter_targets_mapping = defaultdict(list) if self.get_options().libraries: # NB(gmalmquist): This supports mocking the classpath_products in tests. if classpath_products is None: classpath_products = self.resolve_jars(targets) else: classpath_products = None def process_target(current_target): """ :type current_target:pants.build_graph.target.Target """ def get_target_type(target): if target.is_test: return ExportTask.SourceRootTypes.TEST else: if (isinstance(target, Resources) and target in resource_target_map and resource_target_map[target].is_test): return ExportTask.SourceRootTypes.TEST_RESOURCE elif isinstance(target, Resources): return ExportTask.SourceRootTypes.RESOURCE else: return ExportTask.SourceRootTypes.SOURCE info = { 'targets': [], 'libraries': [], 'roots': [], 'target_type': get_target_type(current_target), 'is_code_gen': current_target.is_codegen, 'pants_target_type': self._get_pants_target_alias(type(current_target)) } if not current_target.is_synthetic: info['globs'] = current_target.globs_relative_to_buildroot() if self.get_options().sources: info['sources'] = list(current_target.sources_relative_to_buildroot()) if isinstance(current_target, PythonRequirementLibrary): reqs = current_target.payload.get_field_value('requirements', set()) """:type : set[pants.backend.python.python_requirement.PythonRequirement]""" info['requirements'] = [req.key for req in reqs] if isinstance(current_target, PythonTarget): interpreter_for_target = self.select_interpreter_for_targets([current_target]) if interpreter_for_target is None: raise TaskError('Unable to find suitable interpreter for {}' .format(current_target.address)) python_interpreter_targets_mapping[interpreter_for_target].append(current_target) info['python_interpreter'] = str(interpreter_for_target.identity) def iter_transitive_jars(jar_lib): """ :type jar_lib: :class:`pants.backend.jvm.targets.jar_library.JarLibrary` :rtype: :class:`collections.Iterator` of :class:`pants.backend.jvm.jar_dependency_utils.M2Coordinate` """ if classpath_products: jar_products = classpath_products.get_artifact_classpath_entries_for_targets((jar_lib,)) for _, jar_entry in jar_products: coordinate = jar_entry.coordinate # We drop classifier and type_ since those fields are represented in the global # libraries dict and here we just want the key into that dict (see `_jar_id`). yield M2Coordinate(org=coordinate.org, name=coordinate.name, rev=coordinate.rev) target_libraries = OrderedSet() if isinstance(current_target, JarLibrary): target_libraries = OrderedSet(iter_transitive_jars(current_target)) for dep in current_target.dependencies: info['targets'].append(dep.address.spec) if isinstance(dep, JarLibrary): for jar in dep.jar_dependencies: target_libraries.add(M2Coordinate(jar.org, jar.name, jar.rev)) # Add all the jars pulled in by this jar_library target_libraries.update(iter_transitive_jars(dep)) if isinstance(dep, Resources): resource_target_map[dep] = current_target if isinstance(current_target, ScalaLibrary): for dep in current_target.java_sources: info['targets'].append(dep.address.spec) process_target(dep) if isinstance(current_target, JvmTarget): info['excludes'] = [self._exclude_id(exclude) for exclude in current_target.excludes] info['platform'] = current_target.platform.name info['roots'] = map(lambda (source_root, package_prefix): { 'source_root': source_root, 'package_prefix': package_prefix }, self._source_roots_for_target(current_target)) if classpath_products: info['libraries'] = [self._jar_id(lib) for lib in target_libraries] targets_map[current_target.address.spec] = info for target in targets: process_target(target) jvm_platforms_map = { 'default_platform' : JvmPlatform.global_instance().default_platform.name, 'platforms': { str(platform_name): { 'target_level' : str(platform.target_level), 'source_level' : str(platform.source_level), 'args' : platform.args, } for platform_name, platform in JvmPlatform.global_instance().platforms_by_name.items() } } graph_info = { 'version': self.DEFAULT_EXPORT_VERSION, 'targets': targets_map, 'jvm_platforms': jvm_platforms_map, } jvm_distributions = DistributionLocator.global_instance().all_jdk_paths() if jvm_distributions: graph_info['jvm_distributions'] = jvm_distributions if classpath_products: graph_info['libraries'] = self._resolve_jars_info(targets, classpath_products) if python_interpreter_targets_mapping: interpreters = self.interpreter_cache.select_interpreter( python_interpreter_targets_mapping.keys()) default_interpreter = interpreters[0] interpreters_info = {} for interpreter, targets in six.iteritems(python_interpreter_targets_mapping): chroot = self.cached_chroot( interpreter=interpreter, pex_info=PexInfo.default(), targets=targets ) interpreters_info[str(interpreter.identity)] = { 'binary': interpreter.binary, 'chroot': chroot.path() } graph_info['python_setup'] = { 'default_interpreter': str(default_interpreter.identity), 'interpreters': interpreters_info } return graph_info
def generate_targets_map(self, targets, classpath_products=None): """Generates a dictionary containing all pertinent information about the target graph. The return dictionary is suitable for serialization by json.dumps. :param targets: The list of targets to generate the map for. :param classpath_products: Optional classpath_products. If not provided when the --libraries option is `True`, this task will perform its own jar resolution. """ targets_map = {} resource_target_map = {} python_interpreter_targets_mapping = defaultdict(list) if self.get_options().libraries: # NB(gmalmquist): This supports mocking the classpath_products in tests. if classpath_products is None: classpath_products = self.resolve_jars(targets) else: classpath_products = None def process_target(current_target): """ :type current_target:pants.build_graph.target.Target """ def get_target_type(target): if target.is_test: return ExportTask.SourceRootTypes.TEST else: if (isinstance(target, Resources) and target in resource_target_map and resource_target_map[target].is_test): return ExportTask.SourceRootTypes.TEST_RESOURCE elif isinstance(target, Resources): return ExportTask.SourceRootTypes.RESOURCE else: return ExportTask.SourceRootTypes.SOURCE info = { 'targets': [], 'libraries': [], 'roots': [], 'id': current_target.id, 'target_type': get_target_type(current_target), # NB: is_code_gen should be removed when export format advances to 1.1.0 or higher 'is_code_gen': current_target.is_codegen, 'is_synthetic': current_target.is_synthetic, 'pants_target_type': self._get_pants_target_alias(type(current_target)) } if not current_target.is_synthetic: info['globs'] = current_target.globs_relative_to_buildroot() if self.get_options().sources: info['sources'] = list(current_target.sources_relative_to_buildroot()) if isinstance(current_target, PythonRequirementLibrary): reqs = current_target.payload.get_field_value('requirements', set()) """:type : set[pants.backend.python.python_requirement.PythonRequirement]""" info['requirements'] = [req.key for req in reqs] if isinstance(current_target, PythonTarget): interpreter_for_target = self.select_interpreter_for_targets([current_target]) if interpreter_for_target is None: raise TaskError('Unable to find suitable interpreter for {}' .format(current_target.address)) python_interpreter_targets_mapping[interpreter_for_target].append(current_target) info['python_interpreter'] = str(interpreter_for_target.identity) def iter_transitive_jars(jar_lib): """ :type jar_lib: :class:`pants.backend.jvm.targets.jar_library.JarLibrary` :rtype: :class:`collections.Iterator` of :class:`pants.backend.jvm.jar_dependency_utils.M2Coordinate` """ if classpath_products: jar_products = classpath_products.get_artifact_classpath_entries_for_targets((jar_lib,)) for _, jar_entry in jar_products: coordinate = jar_entry.coordinate # We drop classifier and type_ since those fields are represented in the global # libraries dict and here we just want the key into that dict (see `_jar_id`). yield M2Coordinate(org=coordinate.org, name=coordinate.name, rev=coordinate.rev) target_libraries = OrderedSet() if isinstance(current_target, JarLibrary): target_libraries = OrderedSet(iter_transitive_jars(current_target)) for dep in current_target.dependencies: info['targets'].append(dep.address.spec) if isinstance(dep, JarLibrary): for jar in dep.jar_dependencies: target_libraries.add(M2Coordinate(jar.org, jar.name, jar.rev)) # Add all the jars pulled in by this jar_library target_libraries.update(iter_transitive_jars(dep)) if isinstance(dep, Resources): resource_target_map[dep] = current_target if isinstance(current_target, ScalaLibrary): for dep in current_target.java_sources: info['targets'].append(dep.address.spec) process_target(dep) if isinstance(current_target, JvmTarget): info['excludes'] = [self._exclude_id(exclude) for exclude in current_target.excludes] info['platform'] = current_target.platform.name info['roots'] = map(lambda (source_root, package_prefix): { 'source_root': source_root, 'package_prefix': package_prefix }, self._source_roots_for_target(current_target)) if classpath_products: info['libraries'] = [self._jar_id(lib) for lib in target_libraries] targets_map[current_target.address.spec] = info for target in targets: process_target(target) jvm_platforms_map = { 'default_platform' : JvmPlatform.global_instance().default_platform.name, 'platforms': { str(platform_name): { 'target_level' : str(platform.target_level), 'source_level' : str(platform.source_level), 'args' : platform.args, } for platform_name, platform in JvmPlatform.global_instance().platforms_by_name.items() } } graph_info = { 'version': self.DEFAULT_EXPORT_VERSION, 'targets': targets_map, 'jvm_platforms': jvm_platforms_map, } jvm_distributions = DistributionLocator.global_instance().all_jdk_paths() if jvm_distributions: graph_info['jvm_distributions'] = jvm_distributions if classpath_products: graph_info['libraries'] = self._resolve_jars_info(targets, classpath_products) if python_interpreter_targets_mapping: interpreters = self.interpreter_cache.select_interpreter( python_interpreter_targets_mapping.keys()) default_interpreter = interpreters[0] interpreters_info = {} for interpreter, targets in six.iteritems(python_interpreter_targets_mapping): chroot = self.cached_chroot( interpreter=interpreter, pex_info=PexInfo.default(), targets=targets ) interpreters_info[str(interpreter.identity)] = { 'binary': interpreter.binary, 'chroot': chroot.path() } graph_info['python_setup'] = { 'default_interpreter': str(default_interpreter.identity), 'interpreters': interpreters_info } return graph_info
def console_output(self, targets): targets_map = {} resource_target_map = {} ivy_info = None if self.get_options().libraries: ivy_jar_products = self.context.products.get_data('ivy_jar_products') or {} # This product is a list for historical reasons (exclusives groups) but in practice should # have either 0 or 1 entries. ivy_info_list = ivy_jar_products.get('default') if ivy_info_list: assert len(ivy_info_list) == 1, ( 'The values in ivy_jar_products should always be length 1,' ' since we no longer have exclusives groups.' ) ivy_info = ivy_info_list[0] ivy_jar_memo = {} def process_target(current_target): """ :type current_target:pants.base.target.Target """ def get_target_type(target): if target.is_test: return Export.SourceRootTypes.TEST else: if (isinstance(target, Resources) and target in resource_target_map and resource_target_map[target].is_test): return Export.SourceRootTypes.TEST_RESOURCE elif isinstance(target, Resources): return Export.SourceRootTypes.RESOURCE else: return Export.SourceRootTypes.SOURCE def get_transitive_jars(jar_lib): """ :type jar_lib: pants.backend.jvm.targets.jar_library.JarLibrary :rtype: twitter.common.collections.orderedset.OrderedSet """ if not ivy_info or not self.get_options().libraries: return OrderedSet() transitive_jars = OrderedSet() for jar in jar_lib.jar_dependencies: transitive_jars.update(ivy_info.get_jars_for_ivy_module(jar, memo=ivy_jar_memo)) return transitive_jars info = { 'targets': [], 'libraries': [], 'roots': [], 'target_type': get_target_type(current_target), 'is_code_gen': current_target.is_codegen, 'pants_target_type': self._get_pants_target_alias(type(current_target)) } if not current_target.is_synthetic: info['globs'] = current_target.globs_relative_to_buildroot() if self.get_options().sources: info['sources'] = list(current_target.sources_relative_to_buildroot()) target_libraries = OrderedSet() if isinstance(current_target, JarLibrary): target_libraries = get_transitive_jars(current_target) for dep in current_target.dependencies: info['targets'].append(dep.address.spec) if isinstance(dep, JarLibrary): for jar in dep.jar_dependencies: target_libraries.add(IvyModuleRef(jar.org, jar.name, jar.rev)) # Add all the jars pulled in by this jar_library target_libraries.update(get_transitive_jars(dep)) if isinstance(dep, Resources): resource_target_map[dep] = current_target if isinstance(current_target, ScalaLibrary): for dep in current_target.java_sources: info['targets'].append(dep.address.spec) process_target(dep) if isinstance(current_target, JvmTarget): info['excludes'] = [self._exclude_id(exclude) for exclude in current_target.excludes] info['platform'] = current_target.platform.name info['roots'] = map(lambda (source_root, package_prefix): { 'source_root': source_root, 'package_prefix': package_prefix }, self._source_roots_for_target(current_target)) if self.get_options().libraries: info['libraries'] = [self._jar_id(lib) for lib in target_libraries] targets_map[current_target.address.spec] = info for target in targets: process_target(target) jvm_platforms_map = { 'default_platform' : JvmPlatform.global_instance().default_platform.name, 'platforms': { str(platform_name): { 'target_level' : str(platform.target_level), 'source_level' : str(platform.source_level), 'args' : platform.args, } for platform_name, platform in JvmPlatform.global_instance().platforms_by_name.items() } } graph_info = { 'targets': targets_map, 'jvm_platforms' : jvm_platforms_map, } jvm_distributions = DistributionLocator.global_instance().all_jdk_paths() if jvm_distributions: graph_info['jvm_distributions'] = jvm_distributions if self.get_options().libraries: graph_info['libraries'] = self._resolve_jars_info() graph_info['version'] = self.DEFAULT_EXPORT_VERSION if self.format: return json.dumps(graph_info, indent=4, separators=(',', ': ')).splitlines() else: return [json.dumps(graph_info)]
def console_output(self, targets): targets_map = {} resource_target_map = {} ivy_info = None if self.get_options().libraries: ivy_jar_products = self.context.products.get_data( 'ivy_jar_products') or {} # This product is a list for historical reasons (exclusives groups) but in practice should # have either 0 or 1 entries. ivy_info_list = ivy_jar_products.get('default') if ivy_info_list: assert len(ivy_info_list) == 1, ( 'The values in ivy_jar_products should always be length 1,' ' since we no longer have exclusives groups.') ivy_info = ivy_info_list[0] ivy_jar_memo = {} python_interpreter_targets_mapping = defaultdict(list) def process_target(current_target): """ :type current_target:pants.base.target.Target """ def get_target_type(target): if target.is_test: return Export.SourceRootTypes.TEST else: if (isinstance(target, Resources) and target in resource_target_map and resource_target_map[target].is_test): return Export.SourceRootTypes.TEST_RESOURCE elif isinstance(target, Resources): return Export.SourceRootTypes.RESOURCE else: return Export.SourceRootTypes.SOURCE def get_transitive_jars(jar_lib): """ :type jar_lib: pants.backend.jvm.targets.jar_library.JarLibrary :rtype: twitter.common.collections.orderedset.OrderedSet """ if not ivy_info or not self.get_options().libraries: return OrderedSet() transitive_jars = OrderedSet() for jar in jar_lib.jar_dependencies: transitive_jars.update( ivy_info.get_jars_for_ivy_module(jar, memo=ivy_jar_memo)) return transitive_jars info = { 'targets': [], 'libraries': [], 'roots': [], 'target_type': get_target_type(current_target), 'is_code_gen': current_target.is_codegen, 'pants_target_type': self._get_pants_target_alias(type(current_target)) } if not current_target.is_synthetic: info['globs'] = current_target.globs_relative_to_buildroot() if self.get_options().sources: info['sources'] = list( current_target.sources_relative_to_buildroot()) if isinstance(current_target, PythonRequirementLibrary): reqs = current_target.payload.get_field_value( 'requirements', set()) """:type : set[pants.backend.python.python_requirement.PythonRequirement]""" info['requirements'] = [req.key for req in reqs] if isinstance(current_target, PythonTarget): interpreter_for_target = self.select_interpreter_for_targets( [current_target]) if interpreter_for_target is None: raise TaskError( 'Unable to find suitable interpreter for {}'.format( current_target.address)) python_interpreter_targets_mapping[ interpreter_for_target].append(current_target) info['python_interpreter'] = str( interpreter_for_target.identity) target_libraries = OrderedSet() if isinstance(current_target, JarLibrary): target_libraries = get_transitive_jars(current_target) for dep in current_target.dependencies: info['targets'].append(dep.address.spec) if isinstance(dep, JarLibrary): for jar in dep.jar_dependencies: target_libraries.add( IvyModuleRef(jar.org, jar.name, jar.rev)) # Add all the jars pulled in by this jar_library target_libraries.update(get_transitive_jars(dep)) if isinstance(dep, Resources): resource_target_map[dep] = current_target if isinstance(current_target, ScalaLibrary): for dep in current_target.java_sources: info['targets'].append(dep.address.spec) process_target(dep) if isinstance(current_target, JvmTarget): info['excludes'] = [ self._exclude_id(exclude) for exclude in current_target.excludes ] info['platform'] = current_target.platform.name info['roots'] = map( lambda (source_root, package_prefix): { 'source_root': source_root, 'package_prefix': package_prefix }, self._source_roots_for_target(current_target)) if self.get_options().libraries: info['libraries'] = [ self._jar_id(lib) for lib in target_libraries ] targets_map[current_target.address.spec] = info for target in targets: process_target(target) jvm_platforms_map = { 'default_platform': JvmPlatform.global_instance().default_platform.name, 'platforms': { str(platform_name): { 'target_level': str(platform.target_level), 'source_level': str(platform.source_level), 'args': platform.args, } for platform_name, platform in JvmPlatform.global_instance().platforms_by_name.items() } } graph_info = { 'version': self.DEFAULT_EXPORT_VERSION, 'targets': targets_map, 'jvm_platforms': jvm_platforms_map, } jvm_distributions = DistributionLocator.global_instance( ).all_jdk_paths() if jvm_distributions: graph_info['jvm_distributions'] = jvm_distributions if self.get_options().libraries: graph_info['libraries'] = self._resolve_jars_info() if python_interpreter_targets_mapping: default_interpreter = self.interpreter_cache.select_interpreter( python_interpreter_targets_mapping.keys())[0] interpreters_info = {} for interpreter, targets in python_interpreter_targets_mapping.iteritems( ): chroot = self.cached_chroot(interpreter=interpreter, pex_info=PexInfo.default(), targets=targets) interpreters_info[str(interpreter.identity)] = { 'binary': interpreter.binary, 'chroot': chroot.path() } graph_info['python_setup'] = { 'default_interpreter': str(default_interpreter.identity), 'interpreters': interpreters_info } if self.format: return json.dumps(graph_info, indent=4, separators=(',', ': ')).splitlines() else: return [json.dumps(graph_info)]
def console_output(self, targets): targets_map = {} resource_target_map = {} ivy_info = None if self.get_options().libraries: ivy_jar_products = self.context.products.get_data("ivy_jar_products") or {} # This product is a list for historical reasons (exclusives groups) but in practice should # have either 0 or 1 entries. ivy_info_list = ivy_jar_products.get("default") if ivy_info_list: assert len(ivy_info_list) == 1, ( "The values in ivy_jar_products should always be length 1," " since we no longer have exclusives groups." ) ivy_info = ivy_info_list[0] ivy_jar_memo = {} python_interpreter_targets_mapping = defaultdict(list) def process_target(current_target): """ :type current_target:pants.base.target.Target """ def get_target_type(target): if target.is_test: return Export.SourceRootTypes.TEST else: if ( isinstance(target, Resources) and target in resource_target_map and resource_target_map[target].is_test ): return Export.SourceRootTypes.TEST_RESOURCE elif isinstance(target, Resources): return Export.SourceRootTypes.RESOURCE else: return Export.SourceRootTypes.SOURCE def get_transitive_jars(jar_lib): """ :type jar_lib: pants.backend.jvm.targets.jar_library.JarLibrary :rtype: twitter.common.collections.orderedset.OrderedSet """ if not ivy_info or not self.get_options().libraries: return OrderedSet() transitive_jars = OrderedSet() for jar in jar_lib.jar_dependencies: transitive_jars.update(ivy_info.get_jars_for_ivy_module(jar, memo=ivy_jar_memo)) return transitive_jars info = { "targets": [], "libraries": [], "roots": [], "target_type": get_target_type(current_target), "is_code_gen": current_target.is_codegen, "pants_target_type": self._get_pants_target_alias(type(current_target)), } if not current_target.is_synthetic: info["globs"] = current_target.globs_relative_to_buildroot() if self.get_options().sources: info["sources"] = list(current_target.sources_relative_to_buildroot()) if isinstance(current_target, PythonRequirementLibrary): reqs = current_target.payload.get_field_value("requirements", set()) """:type : set[pants.backend.python.python_requirement.PythonRequirement]""" info["requirements"] = [req.key for req in reqs] if isinstance(current_target, PythonTarget): interpreter_for_target = self.select_interpreter_for_targets([current_target]) if interpreter_for_target is None: raise TaskError("Unable to find suitable interpreter for {}".format(current_target.address)) python_interpreter_targets_mapping[interpreter_for_target].append(current_target) info["python_interpreter"] = str(interpreter_for_target.identity) target_libraries = OrderedSet() if isinstance(current_target, JarLibrary): target_libraries = get_transitive_jars(current_target) for dep in current_target.dependencies: info["targets"].append(dep.address.spec) if isinstance(dep, JarLibrary): for jar in dep.jar_dependencies: target_libraries.add(IvyModuleRef(jar.org, jar.name, jar.rev)) # Add all the jars pulled in by this jar_library target_libraries.update(get_transitive_jars(dep)) if isinstance(dep, Resources): resource_target_map[dep] = current_target if isinstance(current_target, ScalaLibrary): for dep in current_target.java_sources: info["targets"].append(dep.address.spec) process_target(dep) if isinstance(current_target, JvmTarget): info["excludes"] = [self._exclude_id(exclude) for exclude in current_target.excludes] info["platform"] = current_target.platform.name info["roots"] = map( lambda (source_root, package_prefix): {"source_root": source_root, "package_prefix": package_prefix}, self._source_roots_for_target(current_target), ) if self.get_options().libraries: info["libraries"] = [self._jar_id(lib) for lib in target_libraries] targets_map[current_target.address.spec] = info for target in targets: process_target(target) jvm_platforms_map = { "default_platform": JvmPlatform.global_instance().default_platform.name, "platforms": { str(platform_name): { "target_level": str(platform.target_level), "source_level": str(platform.source_level), "args": platform.args, } for platform_name, platform in JvmPlatform.global_instance().platforms_by_name.items() }, } graph_info = { "version": self.DEFAULT_EXPORT_VERSION, "targets": targets_map, "jvm_platforms": jvm_platforms_map, } jvm_distributions = DistributionLocator.global_instance().all_jdk_paths() if jvm_distributions: graph_info["jvm_distributions"] = jvm_distributions if self.get_options().libraries: graph_info["libraries"] = self._resolve_jars_info() if python_interpreter_targets_mapping: default_interpreter = self.interpreter_cache.select_interpreter(python_interpreter_targets_mapping.keys())[ 0 ] interpreters_info = {} for interpreter, targets in python_interpreter_targets_mapping.iteritems(): chroot = self.cached_chroot(interpreter=interpreter, pex_info=PexInfo.default(), targets=targets) interpreters_info[str(interpreter.identity)] = {"binary": interpreter.binary, "chroot": chroot.path()} graph_info["python_setup"] = { "default_interpreter": str(default_interpreter.identity), "interpreters": interpreters_info, } if self.format: return json.dumps(graph_info, indent=4, separators=(",", ": ")).splitlines() else: return [json.dumps(graph_info)]
def console_output(self, targets): targets_map = {} resource_target_map = {} classpath_products = ( self.context.products.get_data("compile_classpath") if self.get_options().libraries else None ) python_interpreter_targets_mapping = defaultdict(list) def process_target(current_target): """ :type current_target:pants.build_graph.target.Target """ def get_target_type(target): if target.is_test: return Export.SourceRootTypes.TEST else: if ( isinstance(target, Resources) and target in resource_target_map and resource_target_map[target].is_test ): return Export.SourceRootTypes.TEST_RESOURCE elif isinstance(target, Resources): return Export.SourceRootTypes.RESOURCE else: return Export.SourceRootTypes.SOURCE info = { "targets": [], "libraries": [], "roots": [], "target_type": get_target_type(current_target), "is_code_gen": current_target.is_codegen, "pants_target_type": self._get_pants_target_alias(type(current_target)), } if not current_target.is_synthetic: info["globs"] = current_target.globs_relative_to_buildroot() if self.get_options().sources: info["sources"] = list(current_target.sources_relative_to_buildroot()) if isinstance(current_target, PythonRequirementLibrary): reqs = current_target.payload.get_field_value("requirements", set()) """:type : set[pants.backend.python.python_requirement.PythonRequirement]""" info["requirements"] = [req.key for req in reqs] if isinstance(current_target, PythonTarget): interpreter_for_target = self.select_interpreter_for_targets([current_target]) if interpreter_for_target is None: raise TaskError("Unable to find suitable interpreter for {}".format(current_target.address)) python_interpreter_targets_mapping[interpreter_for_target].append(current_target) info["python_interpreter"] = str(interpreter_for_target.identity) def iter_transitive_jars(jar_lib): """ :type jar_lib: :class:`pants.backend.jvm.targets.jar_library.JarLibrary` :rtype: :class:`collections.Iterator` of :class:`pants.backend.jvm.jar_dependency_utils.M2Coordinate` """ if classpath_products: jar_products = classpath_products.get_artifact_classpath_entries_for_targets((jar_lib,)) for _, jar_entry in jar_products: coordinate = jar_entry.coordinate # We drop classifier and type_ since those fields are represented in the global # libraries dict and here we just want the key into that dict (see `_jar_id`). yield M2Coordinate(org=coordinate.org, name=coordinate.name, rev=coordinate.rev) target_libraries = OrderedSet() if isinstance(current_target, JarLibrary): target_libraries = OrderedSet(iter_transitive_jars(current_target)) for dep in current_target.dependencies: info["targets"].append(dep.address.spec) if isinstance(dep, JarLibrary): for jar in dep.jar_dependencies: target_libraries.add(M2Coordinate(jar.org, jar.name, jar.rev)) # Add all the jars pulled in by this jar_library target_libraries.update(iter_transitive_jars(dep)) if isinstance(dep, Resources): resource_target_map[dep] = current_target if isinstance(current_target, ScalaLibrary): for dep in current_target.java_sources: info["targets"].append(dep.address.spec) process_target(dep) if isinstance(current_target, JvmTarget): info["excludes"] = [self._exclude_id(exclude) for exclude in current_target.excludes] info["platform"] = current_target.platform.name info["roots"] = map( lambda (source_root, package_prefix): {"source_root": source_root, "package_prefix": package_prefix}, self._source_roots_for_target(current_target), ) if classpath_products: info["libraries"] = [self._jar_id(lib) for lib in target_libraries] targets_map[current_target.address.spec] = info for target in targets: process_target(target) jvm_platforms_map = { "default_platform": JvmPlatform.global_instance().default_platform.name, "platforms": { str(platform_name): { "target_level": str(platform.target_level), "source_level": str(platform.source_level), "args": platform.args, } for platform_name, platform in JvmPlatform.global_instance().platforms_by_name.items() }, } graph_info = { "version": self.DEFAULT_EXPORT_VERSION, "targets": targets_map, "jvm_platforms": jvm_platforms_map, } jvm_distributions = DistributionLocator.global_instance().all_jdk_paths() if jvm_distributions: graph_info["jvm_distributions"] = jvm_distributions if classpath_products: graph_info["libraries"] = self._resolve_jars_info(targets, classpath_products) if python_interpreter_targets_mapping: interpreters = self.interpreter_cache.select_interpreter(python_interpreter_targets_mapping.keys()) default_interpreter = interpreters[0] interpreters_info = {} for interpreter, targets in six.iteritems(python_interpreter_targets_mapping): chroot = self.cached_chroot(interpreter=interpreter, pex_info=PexInfo.default(), targets=targets) interpreters_info[str(interpreter.identity)] = {"binary": interpreter.binary, "chroot": chroot.path()} graph_info["python_setup"] = { "default_interpreter": str(default_interpreter.identity), "interpreters": interpreters_info, } if self.format: return json.dumps(graph_info, indent=4, separators=(",", ": ")).splitlines() else: return [json.dumps(graph_info)]