def format_jar_library(cls, target_name, jar_deps, pom_file=None): """Given a list of jar dependencies, format a jar_library target. Exposed for testing. :param target_name: the target name for the jar_library. :param jar_deps: - <jar> dependency names to add to the jar_library. :returns: A jar_library declaration. :rtype: string """ if not jar_deps: return '' # There is a bug in Target.jar_library.format(). See test_target_template.py #return Target.jar_library.format( # name=target_name, # jars=sorted(set(jar_deps)), # symbols=pom_file.properties if pom_file else None, # file_name=pom_file.path if pom_file else None, #) jar_library = dedent(''' jar_library(name='{name}', jars=[{jars} ], ) ''').format(name=target_name, jars=','.join('\n{}{}'.format(' '*4, jar) for jar in sorted(set(jar_deps)))) if pom_file: jar_library = GenerationUtils.symbol_substitution(pom_file.properties, jar_library) return GenerationUtils.autoindent(jar_library)
def generate(self): config_data = self._dedent_xml(self.pom.jooq_config) config_data = '<configuration>{tail}'.format(tail=config_data[config_data.find('\n'):]) config_data = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n{body}'.format( body=config_data, ) try: symbols = dict(self.pom.properties) # NB(gmalmquist): We switched to using build_symbols for dynamic properties, # however that only works in BUILD files, and this is raw xml. So we have to # explicitly define the dynamic properites. basedir = os.path.abspath(self.pom.directory) symbols.update({ 'basedir': basedir, 'project.basedir': basedir, 'project.baseUri': 'file://{}'.format(os.path.realpath(basedir)), 'project.build.directory': os.path.join(basedir, 'target'), 'user.name': getpass.getuser(), }) config_data = GenerationUtils.symbol_substitution(symbols, config_data, symbols_name=self.pom.path, fail_on_missing=True) except GenerationUtils.MissingSymbolError as e: logger.debug('{} Skipping jooq target generation.'.format(e)) return '' config_path = os.path.join(self.pom.directory, self.gen_context.jooq_config_file) with open(config_path, 'w+') as f: f.write(config_data.strip()) setup_target = None if not self.pom.jooq_info.skip_setup: try: setup_target = self._generate_setup_target() except self.JdbcConfig.MissingConfigError as e: logger.debug('Skipping jooq target generation for {} due to missing jdbc config.\n{}' .format(self.pom.path, e)) return '' jooq_target_deps = list(self._jooq_target_deps) if setup_target: sql_name = self.gen_context.infer_target_name(self.pom.directory, 'jooq-sql-setup') jooq_target_deps.append(':{}'.format(sql_name)) targets = [ self.create_project_target( Target.jvm_prep_command, name='jooq', goal='jooq', mainclass='org.jooq.util.GenerationTool', args=[ config_path, ], dependencies=format_dependency_list(jooq_target_deps), ) ] if setup_target: targets.append(setup_target) return '\n'.join(targets)
def format_body(self): """The body of the target (ie jar_library(...)) for inclusion in a build file. If this library has no body, this returns the emptystring. """ if not self.has_body: return "" management = "" if self.managed_dependencies: management = "\n managed_dependencies=':{}',".format(self.managed_dependencies.name) return GenerationUtils.autoindent( ThirdPartyBuildGenerator._substitute_symbols( dedent( """ jar_library(name='{name}', jars=[ {jars}, ],{management} ) """ ).format( name=self.name, jars=",\n ".join(jar.format() for jar in self.artifacts), management=management, ) ) )
def format_body(self): """The body of the target (ie jar_library(...)) for inclusion in a build file. If this library has no body, this returns the emptystring. """ if not self.has_body: return '' management = '' if self.managed_dependencies: management = "\n managed_dependencies=':{}',".format( self.managed_dependencies.name) return GenerationUtils.autoindent( ThirdPartyBuildGenerator._substitute_symbols( dedent(''' jar_library(name='{name}', jars=[ {jars}, ],{management} ) ''').format( name=self.name, jars=',\n '.join(jar.format() for jar in self.artifacts), management=management, )))
def _parse(self, source_file_name, rootdir): pomHandler = _DFPomContentHandler() if rootdir: full_source_path = os.path.join(rootdir, source_file_name) else: full_source_path = source_file_name if os.path.basename(full_source_path) != 'pom.xml': full_source_path = os.path.join(full_source_path, 'pom.xml') try: with open(full_source_path) as source: xml.sax.parse(source, pomHandler) except IOError: # assume this file has been removed for a good reason and just continue normally return except xml.sax.SAXParseException as e: raise MalformattedPOMException(source_file_name, e) self._artifactId = pomHandler.artifactId self._groupId = pomHandler.groupId self._parent = pomHandler.parent # Since dependencies are just dicts, we keep track of keys separately. Maybe in the future # it would be good to create a Dependency data structure and return a set or ordered dictionary # of those instances instead. dep_keys = set() for dep in pomHandler.dependencies: if 'groupId' in dep and 'artifactId' in dep: dep_keys.add('{0} {1}'.format(dep['groupId'], dep['artifactId'])) self._dependencies.append(dep) parent_df = self.parent if parent_df: for dep in parent_df.dependencies: key = '{0} {1}'.format(dep['groupId'], dep['artifactId']) # dependencies declared in parent poms can be overridden if key not in dep_keys: self._dependencies.append(dep) self._properties.update(parent_df.properties) self._properties.update(pomHandler.properties) for key, value in self._properties.items(): self._properties[key] = GenerationUtils.symbol_substitution(self._properties, value) self._dependencies = GenerationUtils.symbol_substitution_on_dicts(self._properties, self._dependencies)
def get_jvm_platform_name(self): # if self.is_test: # return self.get_jvm_platform_test_name() options = self.pom.java_options if not any([options.target_level, options.source_level, options.compile_args]): return None args = [GenerationUtils.symbol_substitution(self.pom.properties, arg, symbols_name=self.pom.path) for arg in options.compile_args] return self.gen_context.jvm_platform(options.target_level, options.source_level, args,)
def find_dependencies(self, source_file_name): """Process a pom.xml file containing the <dependencyManagement> tag. Returns an array of dictionaries containing the children of the <dependency> tag. """ if source_file_name in DependencyManagementFinder._cache: return DependencyManagementFinder._cache[source_file_name] if self._rootdir: source_file_name = os.path.join(self._rootdir, source_file_name) pomHandler = _DMFPomContentHandler() with open(source_file_name) as source: xml.sax.parse(source, pomHandler) source.close() return GenerationUtils.symbol_substitution_on_dicts(pomHandler.properties, pomHandler.dependency_management)
def format(self): """Generates a formatted string for inclusion in a BUILD file.""" references = sorted(self._formatted_jars()) return GenerationUtils.autoindent( ThirdPartyBuildGenerator._substitute_symbols( dedent(''' # {type_explanation} managed_jar_{type_}(name='{name}', artifacts=[{artifacts} ],{parent} ) ''').format( name=self.name, artifacts=''.join('\n {},'.format(s) for s in references), parent='' if not self.parent else "\n dependencies=[':{}'],".format(self.parent), type_='libraries' if self.generate_libraries else 'dependencies', type_explanation=self._type_explanation, )))
def format(self): """Generates a formatted string for inclusion in a BUILD file.""" references = sorted(self._formatted_jars()) return GenerationUtils.autoindent( ThirdPartyBuildGenerator._substitute_symbols( dedent( """ # {type_explanation} managed_jar_{type_}(name='{name}', artifacts=[{artifacts} ],{parent} ) """ ).format( name=self.name, artifacts="".join("\n {},".format(s) for s in references), parent="" if not self.parent else "\n dependencies=[':{}'],".format(self.parent), type_="libraries" if self.generate_libraries else "dependencies", type_explanation=self._type_explanation, ) ) )
def substitute(value): return GenerationUtils.symbol_substitution(symbols, value, symbols_name=file_name)
def _substitute_symbols(cls, s): return GenerationUtils.symbol_substitution(PomFile("parents/base/pom.xml").properties, s)
def _substitute_symbols(cls, s): return GenerationUtils.symbol_substitution( PomFile('parents/base/pom.xml').properties, s)