def create_manifest2(name, description="", buildtool_depends=["catkin"], build_depends=[], depends=[], buildtool_export_depends=[], build_export_depends=[], exec_depends=[], test_depends=[], meta=False): package = Package( name=name, version="0.0.0", package_format=2, description=description, maintainers=[Person("John Foo", "*****@*****.**")], depends=[Dependency(d) for d in depends], buildtool_depends=[Dependency(d) for d in buildtool_depends], build_depends=[Dependency(d) for d in build_depends], buildtool_export_depends=[ Dependency(d) for d in buildtool_export_depends ], build_export_depends=[Dependency(d) for d in build_export_depends], exec_depends=[Dependency(d) for d in exec_depends], test_depends=[Dependency(d) for d in test_depends], exports=[Export("metapackage")] if meta else []) if hasattr(package, "evaluate_conditions"): package.evaluate_conditions({}) return package
def test_validate_person(self): auth1 = Person('foo') auth1.email = '*****@*****.**' auth1.validate() auth1.email = 'foo[at]bar.com' self.assertRaises(InvalidPackage, Person.validate, auth1) auth1.email = 'foo bar.com' self.assertRaises(InvalidPackage, Person.validate, auth1) auth1.email = 'foo<bar.com' self.assertRaises(InvalidPackage, Person.validate, auth1)
def create_manifest(name, description="", buildtool_depends=[ "catkin" ], build_depends=[], run_depends=[], test_depends=[], meta=False): return Package( name=name, version="0.0.0", package_format=1, description=description, maintainers=[ Person("John Foo", "*****@*****.**") ], buildtool_depends=[ Dependency(d) for d in buildtool_depends ], build_depends=[ Dependency(d) for d in build_depends ], run_depends=[ Dependency(d) for d in run_depends ], test_depends=[ Dependency(d) for d in test_depends ], exports=[ Export("metapackage") ] if meta else [] )
def main(self, *, args): available_licenses = {} for shortname, entry in ament_copyright.get_licenses().items(): available_licenses[entry.spdx] = entry.license_files if args.license == '?': print('Supported licenses:\n%s' % ('\n'.join(available_licenses))) sys.exit(0) maintainer = Person(args.maintainer_name) if args.maintainer_email: maintainer.email = args.maintainer_email else: # try getting the email from the global git config git = shutil.which('git') if git is not None: p = subprocess.Popen([git, 'config', 'user.email'], stdout=subprocess.PIPE) resp = p.communicate() email = resp[0].decode().rstrip() if email: maintainer.email = email if not maintainer.email: maintainer.email = maintainer.name + '@todo.todo' node_name = None library_name = None if args.library_name: library_name = args.library_name if args.node_name: node_name = args.node_name if args.node_name == args.library_name: node_name = args.node_name + '_node' print( '[WARNING] node name can not be equal to the library name', file=sys.stderr) print('[WARNING] renaming node to %s' % node_name, file=sys.stderr) buildtool_depends = [] if args.build_type == 'ament_cmake': if args.library_name: buildtool_depends = ['ament_cmake_ros'] else: buildtool_depends = ['ament_cmake'] test_dependencies = [] if args.build_type == 'ament_cmake': test_dependencies = ['ament_lint_auto', 'ament_lint_common'] if args.build_type == 'ament_python': test_dependencies = [ 'ament_copyright', 'ament_flake8', 'ament_pep257', 'python3-pytest' ] if args.build_type == 'ament_python' and args.package_name == 'test': # If the package name is 'test', there will be a conflict between # the directory the source code for the package goes in and the # directory the tests for the package go in. return "Aborted since 'ament_python' packages can't be named 'test'. Please " + \ 'choose a different package name.' package = Package( package_format=args.package_format, name=args.package_name, version='0.0.0', description=args.description, maintainers=[maintainer], licenses=[args.license], buildtool_depends=[Dependency(dep) for dep in buildtool_depends], build_depends=[Dependency(dep) for dep in args.dependencies], test_depends=[Dependency(dep) for dep in test_dependencies], exports=[Export('build_type', content=args.build_type)]) package_path = os.path.join(args.destination_directory, package.name) if os.path.exists(package_path): return '\nAborted!\nThe directory already exists: ' + package_path + '\nEither ' + \ 'remove the directory or choose a different destination directory or package name' print('going to create a new package') print('package name:', package.name) print('destination directory:', os.path.abspath(args.destination_directory)) print('package format:', package.package_format) print('version:', package.version) print('description:', package.description) print('maintainer:', [str(maintainer) for maintainer in package.maintainers]) print('licenses:', package.licenses) print('build type:', package.get_build_type()) print('dependencies:', [str(dependency) for dependency in package.build_depends]) if node_name: print('node_name:', node_name) if library_name: print('library_name:', library_name) package_directory, source_directory, include_directory = \ create_package_environment(package, args.destination_directory) if not package_directory: return 'unable to create folder: ' + args.destination_directory if args.build_type == 'cmake': populate_cmake(package, package_directory, node_name, library_name) if args.build_type == 'ament_cmake': populate_ament_cmake(package, package_directory, node_name, library_name) if args.build_type == 'ament_python': if not source_directory: return 'unable to create source folder in ' + args.destination_directory populate_ament_python(package, package_directory, source_directory, node_name) if node_name: populate_python_node(package, source_directory, node_name) if library_name: populate_python_libary(package, source_directory, library_name) if args.build_type == 'ament_cmake' or args.build_type == 'cmake': if node_name: if not source_directory: return 'unable to create source folder in ' + args.destination_directory populate_cpp_node(package, source_directory, node_name) if library_name: if not source_directory or not include_directory: return 'unable to create source or include folder in ' + \ args.destination_directory populate_cpp_library(package, source_directory, include_directory, library_name) if args.license in available_licenses: with open(os.path.join(package_directory, 'LICENSE'), 'w') as outfp: for lic in available_licenses[args.license]: outfp.write(lic) else: print( "\n[WARNING]: Unknown license '%s'. This has been set in the package.xml, but " 'no LICENSE file has been created.\nIt is recommended to use one of the ament ' 'license identitifers:\n%s' % (args.license, '\n'.join(available_licenses)))
def _create_package_template(package_name, description=None, licenses=None, maintainer_names=None, author_names=None, version=None, catkin_deps=None, system_deps=None, boost_comps=None): """ alternative factory method mapping CLI args to argument for Package class :param package_name: :param description: :param licenses: :param maintainer_names: :param authors: :param version: :param catkin_deps: """ # Sort so they are alphebetical licenses = list(licenses or ["TODO"]) licenses.sort() if not maintainer_names: maintainer_names = [getpass.getuser()] maintainer_names = list(maintainer_names or []) maintainer_names.sort() maintainers = [] for maintainer_name in maintainer_names: maintainers.append( Person(maintainer_name, '*****@*****.**' % maintainer_name.split()[-1])) author_names = list(author_names or []) author_names.sort() authors = [] for author_name in author_names: authors.append(Person(author_name)) catkin_deps = list(catkin_deps or []) catkin_deps.sort() pkg_catkin_deps = [] build_depends = [] run_depends = [] buildtool_depends = [Dependency('catkin')] for dep in catkin_deps: if dep.lower() == 'catkin': catkin_deps.remove(dep) continue if dep.lower() == 'genmsg': sys.stderr.write( 'WARNING: Packages with messages or services should not depend on genmsg, but on message_generation and message_runtime\n' ) buildtool_depends.append(Dependency('genmsg')) continue if dep.lower() == 'message_generation': if not 'message_runtime' in catkin_deps: sys.stderr.write( 'WARNING: Packages with messages or services should depend on both message_generation and message_runtime\n' ) build_depends.append(Dependency('message_generation')) continue if dep.lower() == 'message_runtime': if not 'message_generation' in catkin_deps: sys.stderr.write( 'WARNING: Packages with messages or services should depend on both message_generation and message_runtime\n' ) run_depends.append(Dependency('message_runtime')) continue pkg_catkin_deps.append(Dependency(dep)) for dep in pkg_catkin_deps: build_depends.append(dep) run_depends.append(dep) if boost_comps: if not system_deps: system_deps = ['boost'] elif not 'boost' in system_deps: system_deps.append('boost') for dep in system_deps or []: if not dep.lower().startswith('python-'): build_depends.append(Dependency(dep)) run_depends.append(Dependency(dep)) package_temp = PackageTemplate(name=package_name, version=version or '0.0.0', description=description or 'The %s package' % package_name, buildtool_depends=buildtool_depends, build_depends=build_depends, run_depends=run_depends, catkin_deps=catkin_deps, system_deps=system_deps, boost_comps=boost_comps, licenses=licenses, authors=authors, maintainers=maintainers, urls=[]) return package_temp
def main(self, *, args): maintainer = Person(args.maintainer_name) if args.maintainer_email: maintainer.email = args.maintainer_email else: # try getting the email from the global git config git = shutil.which('git') if git is not None: p = subprocess.Popen([git, 'config', '--global', 'user.email'], stdout=subprocess.PIPE) resp = p.communicate() email = resp[0].decode().rstrip() if email: maintainer.email = email if not maintainer.email: maintainer.email = maintainer.name + '@todo.todo' cpp_node_name = None if args.cpp_node_name: cpp_node_name = args.cpp_node_name if args.cpp_node_name == args.cpp_library_name: cpp_node_name = args.cpp_node_name + '_node' print( '[WARNING] node name can not be equal to the library name', file=sys.stderr) print('[WARNING] renaming node to %s' % cpp_node_name, file=sys.stderr) buildtool_depends = args.build_type if args.build_type == 'ament_cmake' and args.cpp_library_name: buildtool_depends = 'ament_cmake_ros' test_dependencies = [] if args.build_type == 'ament_cmake': test_dependencies = ['ament_lint_auto', 'ament_lint_common'] package = Package( package_format=args.package_format, name=args.package_name, version='0.0.0', description=args.description, maintainers=[maintainer], licenses=[args.license], buildtool_depends=[Dependency(buildtool_depends)], build_depends=[Dependency(dep) for dep in args.dependencies], test_depends=[Dependency(dep) for dep in test_dependencies], exports=[Export('build_type', content=args.build_type)]) package_path = os.path.join(args.destination_directory, package.name) if os.path.exists(package_path): return '\nAborted!\nThe directory already exists: ' + package_path + '\nEither ' + \ 'remove the directory or choose a different destination directory or package name' print('going to create a new package') print('package name:', package.name) print('destination directory:', os.path.abspath(args.destination_directory)) print('package format:', package.package_format) print('version:', package.version) print('description:', package.description) print('maintainer:', [str(maintainer) for maintainer in package.maintainers]) print('licenses:', [license_ for license_ in package.licenses]) print('build type:', package.get_build_type()) print('dependencies:', [str(dependency) for dependency in package.build_depends]) if args.cpp_node_name: print('cpp_node_name:', cpp_node_name) if args.cpp_library_name: print('cpp_library_name:', args.cpp_library_name) package_directory, source_directory, include_directory = \ create_package_environment(package, args.destination_directory) if not package_directory: return 'unable to create folder: ' + args.destination_directory if args.build_type == 'cmake': populate_cmake(package, package_directory, cpp_node_name, args.cpp_library_name) if args.build_type == 'ament_cmake': populate_ament_cmake(package, package_directory, cpp_node_name, args.cpp_library_name) if cpp_node_name: if not source_directory: return 'unable to create source folder in ' + args.destination_directory populate_cpp_node(package, source_directory, cpp_node_name) if args.cpp_library_name: if not source_directory or not include_directory: return 'unable to create source or include folder in ' + args.destination_directory populate_cpp_library(package, source_directory, include_directory, args.cpp_library_name)
def main(self, *, args): # when a package-type extension exists, delegate package creation to it. extension = get_package_type_extension(args.build_type) if extension: return extension.create_package(args) maintainer = Person(args.maintainer_name) if args.maintainer_email: maintainer.email = args.maintainer_email else: # try getting the email from the global git config git = shutil.which('git') if git is not None: p = subprocess.Popen([git, 'config', '--global', 'user.email'], stdout=subprocess.PIPE) resp = p.communicate() email = resp[0].decode().rstrip() if email: maintainer.email = email if not maintainer.email: maintainer.email = maintainer.name + '@todo.todo' node_name = None library_name = None if args.library_name: library_name = args.library_name if args.node_name: node_name = args.node_name if args.node_name == args.library_name: node_name = args.node_name + '_node' print( '[WARNING] node name can not be equal to the library name', file=sys.stderr) print('[WARNING] renaming node to %s' % node_name, file=sys.stderr) buildtool_depends = [] if args.build_type == 'ament_cmake': if args.library_name: buildtool_depends = ['ament_cmake_ros'] else: buildtool_depends = ['ament_cmake'] test_dependencies = [] if args.build_type == 'ament_cmake': test_dependencies = ['ament_lint_auto', 'ament_lint_common'] if args.build_type == 'ament_python': test_dependencies = [ 'ament_copyright', 'ament_flake8', 'ament_pep257', 'python3-pytest' ] if args.build_type == 'ament_python' and args.package_name == 'test': # If the package name is 'test', there will be a conflict between # the directory the source code for the package goes in and the # directory the tests for the package go in. return "Aborted since 'ament_python' packages can't be named 'test'. Please " + \ 'choose a different package name.' package = Package( package_format=args.package_format, name=args.package_name, version='0.0.0', description=args.description, maintainers=[maintainer], licenses=[args.license], buildtool_depends=[Dependency(dep) for dep in buildtool_depends], build_depends=[Dependency(dep) for dep in args.dependencies], test_depends=[Dependency(dep) for dep in test_dependencies], exports=[Export('build_type', content=args.build_type)]) package_path = os.path.join(args.destination_directory, package.name) if os.path.exists(package_path): return '\nAborted!\nThe directory already exists: ' + package_path + '\nEither ' + \ 'remove the directory or choose a different destination directory or package name' print('going to create a new package') print('package name:', package.name) print('destination directory:', os.path.abspath(args.destination_directory)) print('package format:', package.package_format) print('version:', package.version) print('description:', package.description) print('maintainer:', [str(maintainer) for maintainer in package.maintainers]) print('licenses:', package.licenses) print('build type:', package.get_build_type()) print('dependencies:', [str(dependency) for dependency in package.build_depends]) if node_name: print('node_name:', node_name) if library_name: print('library_name:', library_name) package_directory, source_directory, include_directory = \ create_package_environment(package, args.destination_directory) if not package_directory: return 'unable to create folder: ' + args.destination_directory if args.build_type == 'cmake': populate_cmake(package, package_directory, node_name, library_name) if args.build_type == 'ament_cmake': populate_ament_cmake(package, package_directory, node_name, library_name) if args.build_type == 'ament_python': if not source_directory: return 'unable to create source folder in ' + args.destination_directory populate_ament_python(package, package_directory, source_directory, node_name) if node_name: populate_python_node(package, source_directory, node_name) if library_name: populate_python_libary(package, source_directory, library_name) if args.build_type == 'ament_cmake' or args.build_type == 'cmake': if node_name: if not source_directory: return 'unable to create source folder in ' + args.destination_directory populate_cpp_node(package, source_directory, node_name) if library_name: if not source_directory or not include_directory: return 'unable to create source or include folder in ' + \ args.destination_directory populate_cpp_library(package, source_directory, include_directory, library_name)
def create_package_xml(package_template, rosdistro, meta=False): """ :param package_template: contains the required information :returns: file contents as string """ package_xml_template = \ read_template_file(PACKAGE_MANIFEST_FILENAME, rosdistro) ctemp = CatkinTemplate(package_xml_template) temp_dict = {} for key in package_template.__slots__: temp_dict[key] = getattr(package_template, key) if package_template.version_compatibility: temp_dict['version_compatibility'] = \ ' compatibility="%s"' % package_template.version_compatibility else: temp_dict['version_compatibility'] = '' if not package_template.description: temp_dict['description'] = 'The %s package ...' % package_template.name licenses = [] for plicense in package_template.licenses: licenses.append(' <license>%s</license>\n' % plicense) temp_dict['licenses'] = ''.join(licenses) def get_person_tag(tagname, person): email_string = ("" if person.email is None else 'email="%s"' % person.email) return ' <%s %s>%s</%s>\n' % (tagname, email_string, person.name, tagname) def make_comment(tag): return ' <!--%s -->\n' % (tag.rstrip('\n')) maintainers = [] for maintainer in package_template.maintainers: maintainers.append(get_person_tag('maintainer', maintainer)) temp_dict['maintainers'] = ''.join(maintainers) urls = [] if len(package_template.urls) > 0: for url in package_template.urls: type_string = ("" if url.type is None else 'type="%s"' % url.type) urls.append(' <url %s >%s</url>\n' % (type_string, url.url)) else: urls.append( make_comment( ' <url %s >%s</url>\n' % ('website', 'http://wiki.ors.org/%s' % temp_dict['name']))) temp_dict['urls'] = ''.join(urls) authors = [] if len(package_template.authors) > 0: for author in package_template.authors: authors.append(get_person_tag('author', author)) else: authors.append( make_comment( get_person_tag('author', Person('author_name', 'author_email')))) temp_dict['authors'] = ''.join(authors) dependencies = [] dep_map = { 'build_depend': package_template.build_depends, 'build_export_depend': package_template.build_export_depends, 'buildtool_depend': package_template.buildtool_depends, 'exec_depend': package_template.exec_depends, 'test_depend': package_template.test_depends, 'conflict': package_template.conflicts, 'replace': package_template.replaces } for dep_type in [ 'buildtool_depend', 'build_depend', 'build_export_depend', 'exec_depend', 'test_depend', 'conflict', 'replace' ]: if len(dep_map[dep_type]) > 0: for dep in sorted(dep_map[dep_type], key=lambda x: x.name): if 'depend' in dep_type: dep_tag = _create_depend_tag( dep_type, dep.name, dep.version_eq, dep.version_lt, dep.version_lte, dep.version_gt, dep.version_gte) dependencies.append(dep_tag) else: dependencies.append(_create_depend_tag(dep_type, dep.name)) else: dependencies.append( make_comment(_create_depend_tag(dep_type, 'some_pkg'))) if dep_type is not 'replace': dependencies.append('\n') temp_dict['dependencies'] = ''.join(dependencies) exports = [] if package_template.exports is not None: for export in package_template.exports: if export.content is not None: print('WARNING: Create package does not know how to ' 'serialize exports with content: ' '%s, %s, ' % (export.tagname, export.attributes) + '%s' % (export.content), file=sys.stderr) else: attribs = [ ' %s="%s"' % (k, v) for (k, v) in export.attributes.items() ] line = ' <%s%s/>\n' % (export.tagname, ''.join(attribs)) exports.append(line) if meta: exports.append(' <metapackage/>') temp_dict['exports'] = ''.join(exports) temp_dict['components'] = package_template.catkin_deps return ctemp.substitute(temp_dict)