Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
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 []
    )
Ejemplo n.º 5
0
    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)))
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
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)