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
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(), )
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"))
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")
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
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(), )