예제 #1
0
    def identify(self, desc):  # noqa: D102
        if desc.type is not None and desc.type != 'python':
            return

        setup_py = desc.path / 'setup.py'
        if not setup_py.is_file():
            return

        setup_cfg = desc.path / 'setup.cfg'
        if not setup_cfg.is_file():
            return

        if not is_reading_cfg_sufficient(setup_py):
            logger.debug(
                "Python package in '{desc.path}' passes arguments to the "
                'setup() function which requires a different identification '
                "extension than '{self.PACKAGE_IDENTIFICATION_NAME}'".
                format_map(locals()))
            return

        config = get_configuration(setup_cfg)
        name = config.get('metadata', {}).get('name')
        if not name:
            return

        desc.type = 'python'
        if desc.name is not None and desc.name != name:
            msg = 'Package name already set to different value'
            logger.error(msg)
            raise RuntimeError(msg)
        desc.name = name
예제 #2
0
    def identify(self, desc):  # noqa: D102
        if desc.type is not None and desc.type != 'bazel':
            return

        build_file = desc.path / 'BUILD.bazel'
        if not build_file.is_file():
            # Dangerous, but valid for Bazel !
            build_file = desc.path / 'BUILD'
            if not build_file.is_file():
                return

        data = extract_data(build_file)
        if not data['name']:
            msg = ("Failed to extract project name from '%s'" % build_file)
            logger.error(msg)
            raise RuntimeError(msg)

        if desc.name is not None and desc.name != data['name']:
            msg = 'Package name already set to different value'
            logger.error(msg)
            raise RuntimeError(msg)

        desc.type = 'bazel'
        if desc.name is None:
            desc.name = data['name']
        desc.dependencies['build'] |= data['depends']['build']
        desc.dependencies['run'] |= data['depends']['run']
        desc.dependencies['test'] |= data['depends']['test']
예제 #3
0
    def identify(self, desc):  # noqa: D102
        if desc.type is not None and desc.type != 'python':
            return

        setup_py = desc.path / 'setup.py'
        if not setup_py.is_file():
            return

        setup_cfg = desc.path / 'setup.cfg'
        if not setup_cfg.is_file():
            return

        config = get_configuration(setup_cfg)
        name = config.get('metadata', {}).get('name')
        if not name:
            return

        desc.type = 'python'
        if desc.name is not None and desc.name != name:
            msg = 'Package name already set to different value'
            logger.error(msg)
            raise RuntimeError(msg)
        desc.name = name

        options = config.get('options', {})
        dependencies = extract_dependencies(options)
        for k, v in dependencies.items():
            desc.dependencies[k] |= v

        def getter(env):
            nonlocal options
            return options

        desc.metadata['get_python_setup_options'] = getter
    def identify(self, desc):  # noqa: D102
        if desc.type is not None and desc.type != 'python':
            return

        setup_py = desc.path / 'setup.py'
        if not setup_py.is_file():
            return

        kwargs = get_setup_arguments(setup_py)
        data = extract_data(**kwargs)

        if desc.type is not None and desc.type != 'python':
            logger.error('Package type already set to different value')
            raise RuntimeError('Package type already set to different value')
        desc.type = 'python'
        if desc.name is not None and desc.name != data['name']:
            logger.error('Package name already set to different value')
            raise RuntimeError('Package name already set to different value')
        desc.name = data['name']
        for key in ('build', 'run', 'test'):
            desc.dependencies[key] |= data['%s_depends' % key]

        path = str(desc.path)

        def getter(env):
            nonlocal path
            return get_setup_arguments_with_context(
                os.path.join(path, 'setup.py'), env)

        desc.metadata['get_python_setup_options'] = getter
예제 #5
0
    def identify(self, desc):  # noqa: D102
        if desc.type is not None and desc.type != 'python':
            return

        setup_py = desc.path / 'setup.py'
        if not setup_py.is_file():
            return

        setup_cfg = desc.path / 'setup.cfg'
        if not setup_cfg.is_file():
            return

        if not is_reading_cfg_sufficient(setup_py):
            logger.debug(
                "Python package in '{desc.path}' passes arguments to the "
                'setup() function which requires a different identification '
                "extension than '{self.PACKAGE_IDENTIFICATION_NAME}'".
                format_map(locals()))
            return

        config = get_configuration(setup_cfg)
        name = config.get('metadata', {}).get('name')
        if not name:
            return

        desc.type = 'python'
        if desc.name is not None and desc.name != name:
            msg = 'Package name already set to different value'
            logger.error(msg)
            raise RuntimeError(msg)
        desc.name = name

        version = config.get('metadata', {}).get('version')
        desc.metadata['version'] = version

        options = config.get('options', {})
        dependencies = extract_dependencies(options)
        for k, v in dependencies.items():
            desc.dependencies[k] |= v

        def getter(env):
            nonlocal options
            return options

        desc.metadata['get_python_setup_options'] = getter
    def identify(self, desc):  # noqa: D102
        if desc.type is not None and desc.type != 'python':
            return

        setup_py = desc.path / 'setup.py'
        if not setup_py.is_file():
            return

        config = get_setup_information(setup_py)

        desc.type = 'python'

        name = config['metadata'].get('name')
        if not name:
            logger.error('Failed to determine Python package name in '
                         "'{setup_py.parent}'".format_map(locals()))
            raise RuntimeError('Failed to determine Python package name in '
                               "'{setup_py.parent}'".format_map(locals()))
        if desc.name is not None and desc.name != name:
            logger.error('Package name already set to different value')
            raise RuntimeError('Package name already set to different value')
        desc.name = name
예제 #7
0
    def identify(self, desc):  # noqa: D102
        if desc.type is not None and desc.type != 'python':
            return

        setup_py = desc.path / 'setup.py'
        if not setup_py.is_file():
            return

        config = get_setup_information(setup_py)

        if desc.type is not None and desc.type != 'python':
            logger.error('Package type already set to different value')
            raise RuntimeError('Package type already set to different value')
        desc.type = 'python'

        name = config['metadata'].get('name')
        if not name:
            logger.error(
                'Failed to determine Python package name in '
                "'{setup_py.parent}'".format_map(locals()))
            raise RuntimeError(
                'Failed to determine Python package name in '
                "'{setup_py.parent}'".format_map(locals()))
        if desc.name is not None and desc.name != name:
            logger.error('Package name already set to different value')
            raise RuntimeError('Package name already set to different value')
        desc.name = name

        for dependency_type, option_name in [
            ('build', 'setup_requires'),
            ('run', 'install_requires'),
            ('test', 'tests_require')
        ]:
            desc.dependencies[dependency_type] = {
                create_dependency_descriptor(d)
                for d in config[option_name] or ()}

        def getter(env):
            nonlocal setup_py
            return get_setup_information(setup_py, env=env)

        desc.metadata['get_python_setup_options'] = getter

        desc.metadata['version'] = config['metadata'].get('version')
예제 #8
0
    def identify(self, desc):  # noqa: D102
        # ignore packages which have been identified with a different type
        if desc.type is not None and desc.type != 'ros':
            return

        # skip paths with an ignore marker file
        if (desc.path / 'CATKIN_IGNORE').exists():
            raise IgnoreLocationException()
        if (desc.path / 'AMENT_IGNORE').exists():
            raise IgnoreLocationException()

        # parse package manifest and get build type
        pkg, build_type = get_package_with_build_type(str(desc.path))
        if not pkg or not build_type:
            # if it is not a wet ROS package check for a dry ROS package
            if (desc.path / 'manifest.xml').exists():
                # ignore location to avoid being identified as a CMake package
                raise IgnoreLocationException()
            return

        # for Python build types ensure that a setup.py file exists
        if build_type == 'ament_python':
            setup_py = desc.path / 'setup.py'
            if not setup_py.is_file():
                logger.error(
                    "ROS package '{desc.path}' with build type '{build_type}' "
                    "has no 'setup.py' file".format_map(locals()))
                raise IgnoreLocationException()

        desc.type = 'ros.{build_type}'.format_map(locals())

        # use package name from manifest if not already set
        # e.g. from external configuration
        if desc.name is None:
            desc.name = pkg.name

        desc.metadata['version'] = pkg.version

        # get dependencies
        for d in pkg.build_depends + pkg.buildtool_depends:
            assert d.evaluated_condition is not None
            if d.evaluated_condition:
                desc.dependencies['build'].add(
                    DependencyDescriptor(d.name, metadata=_create_metadata(d)))

        for d in (pkg.build_export_depends + pkg.buildtool_export_depends +
                  pkg.exec_depends):
            assert d.evaluated_condition is not None
            if d.evaluated_condition:
                desc.dependencies['run'].add(
                    DependencyDescriptor(d.name, metadata=_create_metadata(d)))

        for d in pkg.test_depends:
            assert d.evaluated_condition is not None
            if d.evaluated_condition:
                desc.dependencies['test'].add(
                    DependencyDescriptor(d.name, metadata=_create_metadata(d)))

        # for Python build types ensure that a setup.py file exists
        if build_type == 'ament_python':
            setup_cfg = desc.path / 'setup.cfg'
            for _ in (1, ):
                # try to get information from setup.cfg file
                if setup_cfg.is_file():
                    if is_reading_cfg_sufficient(setup_py):
                        config = get_configuration(setup_cfg)
                        name = config.get('metadata', {}).get('name')
                        if name:
                            options = config.get('options', {})

                            def getter(env):
                                nonlocal options
                                return options

                            break
            else:
                # use information from setup.py file

                def getter(env):  # noqa: F811
                    nonlocal desc
                    return get_setup_information(desc.path / 'setup.py',
                                                 env=env)

            desc.metadata['get_python_setup_options'] = getter