Ejemplo n.º 1
0
def _get_info_file_packages(open_ce_info):
    """
    Get a list of all of the license information from a package's open-ce-info file.
    """
    if not os.path.exists(open_ce_info):
        return []

    with open(open_ce_info) as file_stream:
        license_data = open_ce.yaml_utils.load(file_stream)

    utils.validate_dict_schema(license_data, _OPEN_CE_INFO_SCHEMA)

    third_party_info = []
    for package in license_data.get(Key.third_party_packages.name, []):
        info = LicenseGenerator.LicenseInfo(
            package[Key.name.name], package[Key.version.name],
            [package[Key.license_url.name]]
            if Key.license_url.name in package else package[Key.url.name],
            package.get(Key.license.name),
            [package[Key.copyright_string.name]]
            if Key.copyright_string.name in package else None,
            package.get(Key.license_files.name))
        third_party_info.append(info)

    return third_party_info
Ejemplo n.º 2
0
def render_yaml(path,
                variants=None,
                variant_config_files=None,
                schema=None,
                permit_undefined_jinja=False):
    """
    Call conda-build's render tool to get a list of dictionaries of the
    rendered YAML file for each variant that will be built.
    """
    config = get_or_merge_config(None, variant=variants)
    config.variant_config_files = variant_config_files
    config.verbose = False

    if not os.path.isfile(path):
        metas = conda_build.api.render(path,
                                       config=config,
                                       bypass_env_check=True,
                                       finalize=False)
    else:
        # api.render will only work if path is pointing to a meta.yaml file.
        # For other files, use the MetaData class directly.
        # The absolute path is needed because MetaData seems to do some caching based on file name.
        metas = conda_build.metadata.MetaData(
            os.path.abspath(path), config=config).get_rendered_recipe_text(
                permit_undefined_jinja=permit_undefined_jinja)
    if schema:
        validate_dict_schema(metas, schema)
    return metas
Ejemplo n.º 3
0
    def add_licenses_from_info_file(self, license_file):
        """
        Add all of the licensing information from an info file.
        """
        if not os.path.exists(license_file):
            return

        with open(license_file) as file_stream:
            license_data = yaml.safe_load(file_stream)

        utils.validate_dict_schema(license_data, _OPEN_CE_INFO_SCHEMA)

        for package in license_data.get(Key.third_party_packages.name, []):
            source_folder = os.path.join(utils.TMP_LICENSE_DIR,
                                         package[Key.name.name] + "-" + str(package[Key.version.name]))
            if not os.path.exists(source_folder):
                os.makedirs(source_folder)

                urls = [package[Key.license_url.name]] if Key.license_url.name in package else package[Key.url.name]

                # Download the source from each URL
                for url in urls:
                    if url.endswith(".git"):
                        try:
                            utils.git_clone(url, package[Key.version.name], source_folder)
                        except OpenCEError:
                            print("Unable to clone source for " + package[Key.name.name])
                    else:
                        try:
                            res = requests.get(url)
                            local_path = os.path.join(source_folder, os.path.basename(url))
                            with open(local_path, 'wb') as file_stream:
                                file_stream.write(res.content)
                            _extract(local_path, source_folder)

                        #pylint: disable=broad-except
                        except Exception:
                            print("Unable to download source for " + package[Key.name.name])

            # Find every license file within the downloaded source
            license_files = _find_license_files(source_folder)

            # Get copyright information from the downloaded source (unless the copyright string is provided)
            if Key.copyright_string.name in package:
                copyright_string = [package[Key.copyright_string.name]]
            else:
                copyright_string = _get_copyrights_from_files(license_files)

            info = LicenseGenerator.LicenseInfo(package[Key.name.name],
                                                package[Key.version.name],
                                                package[Key.url.name],
                                                package[Key.license.name],
                                                copyright_string)
            self._licenses.add(info)