Ejemplo n.º 1
0
def create_snap_packaging(project_config: _config.Config) -> str:
    """Create snap.yaml and related assets in meta.

    Create the meta directory and provision it with snap.yaml in the snap dir
    using information from config_data. Also copy in the local 'snap'
    directory, and generate wrappers for hooks coming from parts.

    :param dict config_data: project values defined in snapcraft.yaml.
    :return: meta_dir.
    """

    # Update config_data using metadata extracted from the project
    _update_yaml_with_extracted_metadata(
        project_config.data, project_config.parts, project_config.project.prime_dir
    )

    # Now that we've updated config_data with random stuff extracted from
    # parts, re-validate it to ensure the it still conforms with the schema.
    validator = _schema.Validator(project_config.data)
    validator.validate(source="properties")

    # Update default values
    _update_yaml_with_defaults(project_config.data, project_config.validator.schema)

    # Ensure the YAML contains all required keywords before continuing to
    # use it to generate the snap.yaml.
    _ensure_required_keywords(project_config.data)

    packaging = _SnapPackaging(project_config)
    packaging.write_snap_yaml()
    packaging.setup_assets()
    packaging.generate_hook_wrappers()
    packaging.write_snap_directory()

    return packaging.meta_dir
Ejemplo n.º 2
0
    def load_part(
        self,
        part_name,
        plugin_name=None,
        part_properties=None,
        project=None,
        stage_packages_repo=None,
        base="core18",
        build_base=None,
        confinement="strict",
        snap_type="app",
    ):
        if not plugin_name:
            plugin_name = "nil"
        properties = {"plugin": plugin_name}
        if part_properties:
            properties.update(part_properties)
        if not project:
            project = snapcraft.project.Project()

        project._snap_meta.type = snap_type
        project._snap_meta.confinement = confinement
        project._snap_meta.base = base
        if build_base is not None:
            project._snap_meta.build_base = build_base

        validator = _schema.Validator()
        schema = validator.part_schema
        definitions_schema = validator.definitions_schema
        plugin = snapcraft.internal.pluginhandler.load_plugin(
            part_name=part_name,
            plugin_name=plugin_name,
            properties=properties,
            project=project,
            part_schema=schema,
            definitions_schema=definitions_schema,
        )

        if not stage_packages_repo:
            stage_packages_repo = mock.Mock()
        grammar_processor = grammar_processing.PartGrammarProcessor(
            plugin=plugin,
            properties=properties,
            project=project,
            repo=stage_packages_repo,
        )

        return snapcraft.internal.pluginhandler.PluginHandler(
            plugin=plugin,
            part_properties=properties,
            project=project,
            part_schema=schema,
            definitions_schema=definitions_schema,
            grammar_processor=grammar_processor,
            stage_packages_repo=stage_packages_repo,
            snap_base_path="/snap/fake-name/current",
            soname_cache=elf.SonameCache(),
        )
Ejemplo n.º 3
0
    def test_command_chain_without_adapter_raises(self):
        project = snapcraft.project.Project()
        yaml_data = {"apps": {"test-app": {"command-chain": ["test-command-chain"]}}}

        raised = self.assertRaises(
            errors.CommandChainWithLegacyAdapterError,
            conduct_environment_sanity_check,
            project,
            yaml_data,
            _schema.Validator().schema,
        )

        self.assertThat(raised.app_name, Equals("test-app"))
Ejemplo n.º 4
0
    def test_command_chain_with_full_adapter(self):
        project = snapcraft.project.Project()
        yaml_data = {
            "apps": {
                "test-app": {"command-chain": ["test-command-chain"], "adapter": "full"}
            }
        }

        try:
            conduct_environment_sanity_check(
                project, yaml_data, _schema.Validator().schema
            )
        except Exception:
            self.fail("No exception was expected")
Ejemplo n.º 5
0
def create_snap_packaging(project_config: _config.Config) -> str:
    """Create snap.yaml and related assets in meta.

    Create the meta directory and provision it with snap.yaml in the snap dir
    using information from config_data. Also copy in the local 'snap'
    directory, and generate wrappers for hooks coming from parts.

    :param dict config_data: project values defined in snapcraft.yaml.
    :return: meta_dir.
    """

    # Update config_data using metadata extracted from the project
    extracted_metadata = _update_yaml_with_extracted_metadata(
        project_config.data, project_config.parts, project_config.project.prime_dir
    )

    # Now that we've updated config_data with random stuff extracted from
    # parts, re-validate it to ensure the it still conforms with the schema.
    validator = _schema.Validator(project_config.data)
    validator.validate(source="properties")

    # Get the required grade if the global state file exists.
    if os.path.exists(project_config.project._get_global_state_file_path()):
        required_grade = states.GlobalState.load(
            filepath=project_config.project._get_global_state_file_path()
        ).get_required_grade()
    else:
        required_grade = None

    # Update default values
    _update_yaml_with_defaults(
        project_config.data, project_config.validator.schema, required_grade
    )

    packaging = _SnapPackaging(project_config, extracted_metadata)
    packaging.cleanup()
    packaging.validate_common_ids()
    packaging.finalize_snap_meta_commands()
    packaging.finalize_snap_meta_command_chains()
    packaging.finalize_snap_meta_version()
    packaging.write_snap_yaml()
    packaging.setup_assets()
    packaging.generate_hook_wrappers()
    packaging.write_snap_directory()
    packaging.warn_ld_library_paths()

    return packaging.meta_dir
Ejemplo n.º 6
0
def load_part(
    part_name,
    plugin_name=None,
    part_properties=None,
    project=None,
    stage_packages_repo=None,
    snap_name="test-snap",
    base="core18",
    build_base=None,
    confinement="strict",
    snap_type="app",
):
    if not plugin_name:
        plugin_name = "nil"
    properties = {"plugin": plugin_name}
    if part_properties:
        properties.update(part_properties)
    if "build-environment" not in properties:
        properties["build-environment"] = list()
    if not project:
        project = Project()

    project._snap_meta.name = snap_name
    project._snap_meta.version = "1.0"
    project._snap_meta.grade = "devel"
    project._snap_meta.type = snap_type
    project._snap_meta.confinement = confinement
    project._snap_meta.base = base
    if build_base is not None:
        project._snap_meta.build_base = build_base

    validator = _schema.Validator()
    schema = validator.part_schema
    definitions_schema = validator.definitions_schema
    plugin = pluginhandler.load_plugin(
        part_name=part_name,
        plugin_name=plugin_name,
        properties=properties,
        project=project,
        part_schema=schema,
        definitions_schema=definitions_schema,
    )

    if not stage_packages_repo:
        stage_packages_repo = mock.Mock()
    grammar_processor = grammar_processing.PartGrammarProcessor(
        plugin=plugin,
        properties=properties,
        project=project,
        repo=stage_packages_repo)

    return pluginhandler.PluginHandler(
        plugin=plugin,
        part_properties=properties,
        project=project,
        part_schema=schema,
        definitions_schema=definitions_schema,
        grammar_processor=grammar_processor,
        stage_packages_repo=stage_packages_repo,
        snap_base_path="/snap/fake-name/current",
        soname_cache=elf.SonameCache(),
    )