Module continuous_delivery_scripts.utils.language_specifics_base
Base class for all Language plugins.
Expand source code
#
# Copyright (C) 2020-2025 Arm Limited or its affiliates and Contributors. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
"""Base class for all Language plugins."""
import logging
from abc import ABC, abstractmethod
from pathlib import Path
from typing import Optional, Dict
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
from continuous_delivery_scripts.utils.definitions import CommitType
from continuous_delivery_scripts.utils.git_helpers import GitWrapper
logger = logging.getLogger(__name__)
def get_language_from_file_name(filename: str) -> str:
"""Gets the language from the plugin filename."""
return Path(filename).resolve().with_suffix("").name
GENERIC_LICENCE_HEADER_TEMPLATE = """Copyright (C) {date} {author} or its affiliates and Contributors. All rights reserved.
SPDX-License-Identifier: {licence_identifier}
""" # noqa: E501
def _generate_generic_licence_header_template() -> str:
"""Generates the header template which is put at the top of source files."""
return GENERIC_LICENCE_HEADER_TEMPLATE.format(
licence_identifier=configuration.get_value(ConfigurationVariable.FILE_LICENCE_IDENTIFIER),
author="${owner}",
date="${years}",
)
class BaseLanguage(ABC):
"""Base class from which language plugins should inherit from.
To write a new language plugin, implement the following methods at a minimum
"""
def __str__(self) -> str:
"""String representation."""
return self.__class__.__name__
@abstractmethod
def get_related_language(self) -> str:
"""Gets the name of the corresponding language."""
pass
def get_version_tag(self, version: str) -> str:
"""Generates a tag based on the version string."""
return version
def generate_source_licence_header_template(self) -> str:
"""Generates the template of the licence header which is put at the top of source files."""
return _generate_generic_licence_header_template()
def can_add_licence_headers(self) -> bool:
"""States whether licence headers can be added."""
return False
def can_get_project_metadata(self) -> bool:
"""States whether project metadata can be retrieved."""
return False
def should_include_spdx_in_package(self) -> bool:
"""States whether the SPDX documents should be included in the package."""
return False
def should_clean_before_packaging(self) -> bool:
"""States whether the repository must be cleaned before packaging happens."""
return False
def tag_release(self, git: GitWrapper, version: str, shortcuts: Dict[str, bool]) -> None:
"""Tags release commit."""
logger.info(f"Tagging commit as release {version}")
git.create_tag(self.get_version_tag(version), message=f"release {version}")
for shortcut, versions in shortcuts.items():
if versions:
git.create_tag(self.get_version_tag(shortcut), message=f"{shortcut} release")
else:
git.create_tag(shortcut, message=shortcut)
@abstractmethod
def generate_code_documentation(self, output_directory: Path, module_to_document: str) -> None:
"""Generates the code documentation."""
logger.info("Generating code documentation")
pass
@abstractmethod
def package_software(self, mode: CommitType, version: str) -> None:
"""Package the software so that it can get released."""
if mode == CommitType.RELEASE:
logger.info(f"Generating a release package [{version}]")
elif mode == CommitType.BETA:
logger.info(f"Generating a pre-release package [{version}]")
else:
logger.info(f"Generating a development package [{version}]")
pass
@abstractmethod
def release_package_to_repository(self, mode: CommitType, version: str) -> None:
"""Release the package to the official software repository."""
logger.info(f"Uploading the package [{version}]")
pass
@abstractmethod
def get_current_spdx_project(self) -> Optional[SpdxProject]:
"""Gets current project SPDX."""
pass
def check_credentials(self) -> None:
"""Checks necessary credentials are set for releasing."""
# Checks the GitHub token is defined
configuration.get_value(ConfigurationVariable.GIT_TOKEN)
Functions
def get_language_from_file_name(filename: str) ‑> str
-
Gets the language from the plugin filename.
Expand source code
def get_language_from_file_name(filename: str) -> str: """Gets the language from the plugin filename.""" return Path(filename).resolve().with_suffix("").name
Classes
class BaseLanguage
-
Base class from which language plugins should inherit from.
To write a new language plugin, implement the following methods at a minimum
Expand source code
class BaseLanguage(ABC): """Base class from which language plugins should inherit from. To write a new language plugin, implement the following methods at a minimum """ def __str__(self) -> str: """String representation.""" return self.__class__.__name__ @abstractmethod def get_related_language(self) -> str: """Gets the name of the corresponding language.""" pass def get_version_tag(self, version: str) -> str: """Generates a tag based on the version string.""" return version def generate_source_licence_header_template(self) -> str: """Generates the template of the licence header which is put at the top of source files.""" return _generate_generic_licence_header_template() def can_add_licence_headers(self) -> bool: """States whether licence headers can be added.""" return False def can_get_project_metadata(self) -> bool: """States whether project metadata can be retrieved.""" return False def should_include_spdx_in_package(self) -> bool: """States whether the SPDX documents should be included in the package.""" return False def should_clean_before_packaging(self) -> bool: """States whether the repository must be cleaned before packaging happens.""" return False def tag_release(self, git: GitWrapper, version: str, shortcuts: Dict[str, bool]) -> None: """Tags release commit.""" logger.info(f"Tagging commit as release {version}") git.create_tag(self.get_version_tag(version), message=f"release {version}") for shortcut, versions in shortcuts.items(): if versions: git.create_tag(self.get_version_tag(shortcut), message=f"{shortcut} release") else: git.create_tag(shortcut, message=shortcut) @abstractmethod def generate_code_documentation(self, output_directory: Path, module_to_document: str) -> None: """Generates the code documentation.""" logger.info("Generating code documentation") pass @abstractmethod def package_software(self, mode: CommitType, version: str) -> None: """Package the software so that it can get released.""" if mode == CommitType.RELEASE: logger.info(f"Generating a release package [{version}]") elif mode == CommitType.BETA: logger.info(f"Generating a pre-release package [{version}]") else: logger.info(f"Generating a development package [{version}]") pass @abstractmethod def release_package_to_repository(self, mode: CommitType, version: str) -> None: """Release the package to the official software repository.""" logger.info(f"Uploading the package [{version}]") pass @abstractmethod def get_current_spdx_project(self) -> Optional[SpdxProject]: """Gets current project SPDX.""" pass def check_credentials(self) -> None: """Checks necessary credentials are set for releasing.""" # Checks the GitHub token is defined configuration.get_value(ConfigurationVariable.GIT_TOKEN)
Ancestors
- abc.ABC
Subclasses
Methods
def can_add_licence_headers(self) ‑> bool
-
States whether licence headers can be added.
Expand source code
def can_add_licence_headers(self) -> bool: """States whether licence headers can be added.""" return False
def can_get_project_metadata(self) ‑> bool
-
States whether project metadata can be retrieved.
Expand source code
def can_get_project_metadata(self) -> bool: """States whether project metadata can be retrieved.""" return False
def check_credentials(self) ‑> None
-
Checks necessary credentials are set for releasing.
Expand source code
def check_credentials(self) -> None: """Checks necessary credentials are set for releasing.""" # Checks the GitHub token is defined configuration.get_value(ConfigurationVariable.GIT_TOKEN)
def generate_code_documentation(self, output_directory: pathlib.Path, module_to_document: str) ‑> None
-
Generates the code documentation.
Expand source code
@abstractmethod def generate_code_documentation(self, output_directory: Path, module_to_document: str) -> None: """Generates the code documentation.""" logger.info("Generating code documentation") pass
def generate_source_licence_header_template(self) ‑> str
-
Generates the template of the licence header which is put at the top of source files.
Expand source code
def generate_source_licence_header_template(self) -> str: """Generates the template of the licence header which is put at the top of source files.""" return _generate_generic_licence_header_template()
def get_current_spdx_project(self) ‑> Optional[SpdxProject]
-
Gets current project SPDX.
Expand source code
@abstractmethod def get_current_spdx_project(self) -> Optional[SpdxProject]: """Gets current project SPDX.""" pass
-
Gets the name of the corresponding language.
Expand source code
@abstractmethod def get_related_language(self) -> str: """Gets the name of the corresponding language.""" pass
def get_version_tag(self, version: str) ‑> str
-
Generates a tag based on the version string.
Expand source code
def get_version_tag(self, version: str) -> str: """Generates a tag based on the version string.""" return version
def package_software(self, mode: CommitType, version: str) ‑> None
-
Package the software so that it can get released.
Expand source code
@abstractmethod def package_software(self, mode: CommitType, version: str) -> None: """Package the software so that it can get released.""" if mode == CommitType.RELEASE: logger.info(f"Generating a release package [{version}]") elif mode == CommitType.BETA: logger.info(f"Generating a pre-release package [{version}]") else: logger.info(f"Generating a development package [{version}]") pass
def release_package_to_repository(self, mode: CommitType, version: str) ‑> None
-
Release the package to the official software repository.
Expand source code
@abstractmethod def release_package_to_repository(self, mode: CommitType, version: str) -> None: """Release the package to the official software repository.""" logger.info(f"Uploading the package [{version}]") pass
def should_clean_before_packaging(self) ‑> bool
-
States whether the repository must be cleaned before packaging happens.
Expand source code
def should_clean_before_packaging(self) -> bool: """States whether the repository must be cleaned before packaging happens.""" return False
def should_include_spdx_in_package(self) ‑> bool
-
States whether the SPDX documents should be included in the package.
Expand source code
def should_include_spdx_in_package(self) -> bool: """States whether the SPDX documents should be included in the package.""" return False
def tag_release(self, git: GitWrapper, version: str, shortcuts: Dict[str, bool]) ‑> None
-
Tags release commit.
Expand source code
def tag_release(self, git: GitWrapper, version: str, shortcuts: Dict[str, bool]) -> None: """Tags release commit.""" logger.info(f"Tagging commit as release {version}") git.create_tag(self.get_version_tag(version), message=f"release {version}") for shortcut, versions in shortcuts.items(): if versions: git.create_tag(self.get_version_tag(shortcut), message=f"{shortcut} release") else: git.create_tag(shortcut, message=shortcut)