Beispiel #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
Beispiel #2
0
    def test_init(self):
        maint = self.get_maintainer()
        pack = Package(name='foo',
                       version='0.0.0',
                       maintainers=[maint],
                       licenses=['BSD'])
        self.assertEqual(None, pack.filename)
        self.assertEqual('0.0.0', pack.version)
        self.assertEqual(None, pack.version_compatibility)
        self.assertEqual([], pack.urls)
        self.assertEqual([], pack.authors)
        self.assertEqual([maint], pack.maintainers)
        self.assertEqual(['BSD'], pack.licenses)
        self.assertEqual([], pack.build_depends)
        self.assertEqual([], pack.buildtool_depends)
        self.assertEqual([], pack.run_depends)
        self.assertEqual([], pack.test_depends)
        self.assertEqual([], pack.conflicts)
        self.assertEqual([], pack.replaces)
        self.assertEqual([], pack.exports)
        self.assertEqual([], pack.group_depends)
        self.assertEqual([], pack.member_of_groups)
        pack = Package('foo',
                       name='bar',
                       version='0.0.0',
                       licenses=['BSD'],
                       maintainers=[self.get_maintainer()])
        self.assertEqual('foo', pack.filename)

        self.assertRaises(TypeError, Package, unknownattribute=42)
Beispiel #3
0
def parse_package(path):
    if not package_exists_at(path):
        return None
    cmakelists = os.path.join(path, 'CMakeLists.txt')
    data = extract_data(cmakelists)
    pkg = Package(filename=cmakelists, **data)
    pkg.exports = [Export('build_type', content='cmake')]
    return pkg
Beispiel #4
0
def parse_package(path):
    if not package_exists_at(path):
        return None
    setuppy = os.path.join(path, 'setup.py')
    kwargs = get_setup_arguments(setuppy)
    data = extract_data(**kwargs)
    pkg = Package(filename=setuppy, **data)
    pkg.exports = [Export('build_type', content='ament_python')]
    return pkg
Beispiel #5
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 []
    )
Beispiel #6
0
 def test_init_kwargs_object(self):
     mmain = [self.get_maintainer(), self.get_maintainer()]
     mlis = ['MIT', License('BSD', 'LICENSE')]
     mauth = [self.get_maintainer(), self.get_maintainer()]
     murl = [Mock(), Mock()]
     mbuilddep = [Mock(), Mock()]
     mbuildtooldep = [Mock(), Mock()]
     mrundep = [Mock(), Mock()]
     mtestdep = [Mock(), Mock()]
     mconf = [Mock(), Mock()]
     mrepl = [Mock(), Mock()]
     mexp = [Mock(), Mock()]
     mgroup = [
         self.get_group_dependency('group1'),
         self.get_group_dependency('group2')
     ]
     mmember = ['member1', 'member2']
     pack = Package(package_format='3',
                    name='bar',
                    version='0.0.0',
                    maintainers=mmain,
                    licenses=mlis,
                    urls=murl,
                    authors=mauth,
                    build_depends=mbuilddep,
                    buildtool_depends=mbuildtooldep,
                    run_depends=mrundep,
                    test_depends=mtestdep,
                    conflicts=mconf,
                    replaces=mrepl,
                    group_depends=mgroup,
                    member_of_groups=mmember,
                    exports=mexp)
     self.assertEqual(mmain, pack.maintainers)
     self.assertEqual(mlis, pack.licenses)
     self.assertEqual([None, 'LICENSE'],
                      [license_.file for license_ in pack.licenses])
     self.assertEqual(murl, pack.urls)
     self.assertEqual(mauth, pack.authors)
     self.assertEqual(mbuilddep, pack.build_depends)
     self.assertEqual(mbuildtooldep, pack.buildtool_depends)
     # since run_depends are getting stores as build_export_depends as well as exec_depends
     # and the dependency objects are being cloned only the double count can be checked for
     self.assertEqual(2 * len(mrundep), len(pack.run_depends))
     self.assertEqual(mtestdep, pack.test_depends)
     self.assertEqual(mconf, pack.conflicts)
     self.assertEqual(mrepl, pack.replaces)
     self.assertEqual(mexp, pack.exports)
     self.assertEqual(mgroup, pack.group_depends)
     self.assertEqual(mmember, pack.member_of_groups)
Beispiel #7
0
 def test_init_kwargs_string(self):
     pack = Package('foo',
                    name='bar',
                    package_format='1',
                    version='0.0.1',
                    version_compatibility='0.0.0',
                    description='pdesc',
                    licenses=['BSD'],
                    maintainers=[self.get_maintainer()])
     self.assertEqual('foo', pack.filename)
     self.assertEqual('bar', pack.name)
     self.assertEqual('1', pack.package_format)
     self.assertEqual('0.0.0', pack.version_compatibility)
     self.assertEqual('0.0.1', pack.version)
     self.assertEqual('pdesc', pack.description)
 def test_init_kwargs_object(self):
     mmain = [self.get_maintainer(), self.get_maintainer()]
     mlis = ['MIT', 'BSD']
     mauth = [self.get_maintainer(), self.get_maintainer()]
     murl = [Mock(), Mock()]
     mbuilddep = [Mock(), Mock()]
     mbuildtooldep = [Mock(), Mock()]
     mrundep = [Mock(), Mock()]
     mtestdep = [Mock(), Mock()]
     mconf = [Mock(), Mock()]
     mrepl = [Mock(), Mock()]
     mexp = [Mock(), Mock()]
     pack = Package(name='bar',
                    version='0.0.0',
                    maintainers=mmain,
                    licenses=mlis,
                    urls=murl,
                    authors=mauth,
                    build_depends=mbuilddep,
                    buildtool_depends=mbuildtooldep,
                    run_depends=mrundep,
                    test_depends=mtestdep,
                    conflicts=mconf,
                    replaces=mrepl,
                    exports=mexp)
     self.assertEqual(mmain, pack.maintainers)
     self.assertEqual(mlis, pack.licenses)
     self.assertEqual(murl, pack.urls)
     self.assertEqual(mauth, pack.authors)
     self.assertEqual(mbuilddep, pack.build_depends)
     self.assertEqual(mbuildtooldep, pack.buildtool_depends)
     # since run_depends are getting stores as build_export_depends as well as exec_depends
     # and the dependency objects are being cloned only the double count can be checked for
     self.assertEqual(2 * len(mrundep), len(pack.run_depends))
     self.assertEqual(mtestdep, pack.test_depends)
     self.assertEqual(mconf, pack.conflicts)
     self.assertEqual(mrepl, pack.replaces)
     self.assertEqual(mexp, pack.exports)
Beispiel #9
0
 def test_init_kwargs_object(self):
     mmain = [self.get_maintainer(), self.get_maintainer()]
     mlis = ['MIT', 'BSD']
     mauth = [self.get_maintainer(), self.get_maintainer()]
     murl = [Mock(), Mock()]
     mbuilddep = [Mock(), Mock()]
     mbuildtooldep = [Mock(), Mock()]
     mrundep = [Mock(), Mock()]
     mtestdep = [Mock(), Mock()]
     mconf = [Mock(), Mock()]
     mrepl = [Mock(), Mock()]
     mexp = [Mock(), Mock()]
     pack = Package(name='bar',
                    version='0.0.0',
                    maintainers=mmain,
                    licenses=mlis,
                    urls=murl,
                    authors=mauth,
                    build_depends=mbuilddep,
                    buildtool_depends=mbuildtooldep,
                    run_depends=mrundep,
                    test_depends=mtestdep,
                    conflicts=mconf,
                    replaces=mrepl,
                    exports=mexp)
     self.assertEqual(mmain, pack.maintainers)
     self.assertEqual(mlis, pack.licenses)
     self.assertEqual(murl, pack.urls)
     self.assertEqual(mauth, pack.authors)
     self.assertEqual(mbuilddep, pack.build_depends)
     self.assertEqual(mbuildtooldep, pack.buildtool_depends)
     self.assertEqual(mrundep, pack.run_depends)
     self.assertEqual(mtestdep, pack.test_depends)
     self.assertEqual(mconf, pack.conflicts)
     self.assertEqual(mrepl, pack.replaces)
     self.assertEqual(mexp, pack.exports)
    def test_evaluate_conditions(self):
        """Test if dependency conditions are properly evaluated"""

        env = create_env(system_pkgs=['python-yaml'])
        pkg = Package(
            name="mock",
            package_format=3,
            exec_depends=[
                Dependency('python-yaml',
                           condition='$ROS_PYTHON_VERSION == 2'),
                Dependency('python3-yaml',
                           condition='$ROS_PYTHON_VERSION == 3')
            ],
        )
        pkg.evaluate_conditions({'ROS_PYTHON_VERSION': 2})
        result = mock_lint(env, pkg, "", checks=cc.depends)
        self.assertEqual([], result)

        pkg.evaluate_conditions({'ROS_PYTHON_VERSION': 3})
        result = mock_lint(env, pkg, "", checks=cc.depends)
        self.assertEqual(["UNKNOWN_PACKAGE"], result)
Beispiel #11
0
    def test_validate_package(self):
        maint = self.get_maintainer()
        pack = Package('foo',
                       name='bar_2go',
                       package_format='1',
                       version='0.0.1',
                       description='pdesc',
                       licenses=['BSD'],
                       maintainers=[maint])
        pack.validate()

        # names that should error
        pack.name = 'bar bza'
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.name = 'foo%'
        self.assertRaises(InvalidPackage, Package.validate, pack)

        # names that should throw warnings
        pack.name = '2bar'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertIn('naming conventions', warnings[0])

        pack.name = 'bar-bza'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertEquals(warnings, [])

        pack.name = 'BAR'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertIn('naming conventions', warnings[0])

        # dashes are permitted for a non-catkin package
        pack.exports.append(Export('build_type', 'other'))
        pack.name = 'bar-bza'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertEquals(warnings, [])
        pack.exports.pop()

        # check authors emails
        pack.name = 'bar'
        auth1 = Mock()
        auth2 = Mock()
        auth2.validate.side_effect = InvalidPackage('foo')
        pack.authors = [auth1, auth2]
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.authors = []
        pack.validate()

        # check maintainer required with email
        pack.maintainers = []
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.maintainers = [maint]
        maint.email = None
        self.assertRaises(InvalidPackage, Package.validate, pack)
        maint.email = '*****@*****.**'

        for dep_type in [
                pack.build_depends, pack.buildtool_depends,
                pack.build_export_depends, pack.buildtool_export_depends,
                pack.exec_depends, pack.test_depends, pack.doc_depends
        ]:
            pack.validate()
            depend = Dependency(pack.name)
            dep_type.append(depend)
            self.assertRaises(InvalidPackage, Package.validate, pack)
            dep_type.remove(depend)
Beispiel #12
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)))
    def test_validate_package(self):
        maint = self.get_maintainer()
        pack = Package('foo',
                       name='bar_2go',
                       package_format='1',
                       version='0.0.0',
                       version_abi='pabi',
                       description='pdesc',
                       licenses=['BSD'],
                       maintainers=[maint])
        pack.validate()
        # check invalid names
        pack.name = '2bar'
        pack.validate()
        pack.name = 'bar bza'
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.name = 'bar-bza'
        # valid for now because for backward compatibility only
        #self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.name = 'BAR'
        pack.validate()
        # check authors emails
        pack.name = 'bar'
        auth1 = Mock()
        auth2 = Mock()
        auth2.validate.side_effect = InvalidPackage('foo')
        pack.authors = [auth1, auth2]
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.authors = []
        pack.validate()
        # check maintainer required with email
        pack.maintainers = []
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.maintainers = [maint]
        maint.email = None
        self.assertRaises(InvalidPackage, Package.validate, pack)
        maint.email = '*****@*****.**'

        for dep_type in [pack.build_depends, pack.buildtool_depends, pack.run_depends, pack.test_depends]:
            pack.validate()
            depend = Dependency(pack.name)
            dep_type.append(depend)
            self.assertRaises(InvalidPackage, Package.validate, pack)
            dep_type.remove(depend)
    def test_validate_package(self):
        maint = self.get_maintainer()
        pack = Package('foo',
                       name='bar_2go',
                       package_format='1',
                       version='0.0.0',
                       version_abi='pabi',
                       description='pdesc',
                       licenses=['BSD'],
                       maintainers=[maint])
        pack.validate()
        # check invalid names
        pack.name = '2bar'
        pack.validate()
        pack.name = 'bar bza'
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.name = 'bar-bza'
        # valid for now because for backward compatibility only
        #self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.name = 'BAR'
        pack.validate()
        # check authors emails
        pack.name = 'bar'
        auth1 = Mock()
        auth2 = Mock()
        auth2.validate.side_effect = InvalidPackage('foo')
        pack.authors = [auth1, auth2]
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.authors = []
        pack.validate()
        # check maintainer required with email
        pack.maintainers = []
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.maintainers = [maint]
        maint.email = None
        self.assertRaises(InvalidPackage, Package.validate, pack)
        maint.email = '*****@*****.**'

        for dep_type in [
                pack.build_depends, pack.buildtool_depends,
                pack.build_export_depends, pack.buildtool_export_depends,
                pack.exec_depends, pack.test_depends, pack.doc_depends
        ]:
            pack.validate()
            depend = Dependency(pack.name)
            dep_type.append(depend)
            self.assertRaises(InvalidPackage, Package.validate, pack)
            dep_type.remove(depend)
Beispiel #15
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)
    def test_validate_package(self):
        maint = self.get_maintainer()
        pack = Package('foo',
                       name='bar_2go',
                       package_format='1',
                       version='0.0.1',
                       description='pdesc',
                       licenses=['BSD'],
                       maintainers=[maint])
        pack.validate()

        # names that should error
        pack.name = 'bar bza'
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.name = 'foo%'
        self.assertRaises(InvalidPackage, Package.validate, pack)

        # names that should throw warnings
        pack.name = '2bar'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertIn('naming conventions', warnings[0])

        pack.name = 'bar-bza'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertEqual(warnings, [])

        pack.name = 'BAR'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertIn('naming conventions', warnings[0])

        # dashes are permitted for a non-catkin package
        pack.exports.append(Export('build_type', 'other'))
        pack.name = 'bar-bza'
        warnings = []
        pack.validate(warnings=warnings)
        self.assertEqual(warnings, [])
        pack.exports.pop()

        # check authors emails
        pack.name = 'bar'
        auth1 = Mock()
        auth2 = Mock()
        auth2.validate.side_effect = InvalidPackage('foo')
        pack.authors = [auth1, auth2]
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.authors = []
        pack.validate()

        # check maintainer required with email
        pack.maintainers = []
        self.assertRaises(InvalidPackage, Package.validate, pack)
        pack.maintainers = [maint]
        maint.email = None
        self.assertRaises(InvalidPackage, Package.validate, pack)
        maint.email = '*****@*****.**'

        for dep_type in [pack.build_depends, pack.buildtool_depends, pack.build_export_depends, pack.buildtool_export_depends, pack.exec_depends, pack.test_depends, pack.doc_depends]:
            pack.validate()
            depend = Dependency(pack.name)
            dep_type.append(depend)
            self.assertRaises(InvalidPackage, Package.validate, pack)
            dep_type.remove(depend)
Beispiel #17
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)