Skip to content

Commit ce55582

Browse files
authored
🐛 Fixed plugin loader (#61)
<!-- Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved. SPDX-License-Identifier: Apache-2.0 --> ### Description - Fixed plugin loader - Added a basic plugin - redefined the NoOp plugin ### Test Coverage <!-- Please put an `x` in the correct box e.g. `[x]` to indicate the testing coverage of this change. --> - [x] This change is covered by existing or additional automated tests. - [ ] Manual testing has been performed (and evidence provided) as automated testing was not feasible. - [ ] Additional tests are not required for this change (e.g. documentation update).
1 parent 44d632f commit ce55582

File tree

14 files changed

+163
-37
lines changed

14 files changed

+163
-37
lines changed

.secrets.baseline

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
"filename": "continuous_delivery_scripts/plugins/python.py",
108108
"hashed_secret": "a5c8a5463c338b832f4afbe616ae77b4ecbfadc0",
109109
"is_verified": false,
110-
"line_number": 27
110+
"line_number": 26
111111
}
112112
],
113113
"continuous_delivery_scripts/utils/git_helpers.py": [
@@ -425,5 +425,5 @@
425425
}
426426
]
427427
},
428-
"generated_at": "2022-12-21T20:50:40Z"
428+
"generated_at": "2022-12-22T00:31:43Z"
429429
}

continuous_delivery_scripts/language_specifics.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""Language plugins Loader."""
66

77
import logging
8-
from typing import Optional, Dict, cast
8+
from typing import Optional, Dict, cast, Set, Type
99

1010
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
1111
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage
@@ -16,24 +16,48 @@
1616
logger = logging.getLogger(__name__)
1717

1818

19-
def _all_language_plugins() -> Dict[str, BaseLanguage]:
20-
"""Get all language plugins which inherit from BaseLanguage (with the exception of other base class).
19+
def _retrieve_all_subclasses(subclass: Type[BaseLanguage]) -> Set[Type[BaseLanguage]]:
20+
subclasses = set()
21+
if not subclass:
22+
return subclasses
23+
if subclass != BaseLanguage:
24+
subclasses.add(subclass)
25+
for s in subclass.__subclasses__():
26+
subclasses.update(_retrieve_all_subclasses(s))
27+
return subclasses
2128

22-
:return: A list of classes containing language plugins
29+
30+
def all_language_plugins() -> Dict[str, BaseLanguage]:
31+
"""Fetches all language plugins which inherit from BaseLanguage.
32+
33+
Returns:
34+
A list of classes containing language plugins
35+
"""
36+
all_plugins = _retrieve_all_subclasses(BaseLanguage)
37+
return {la.get_related_language().lower().strip(): la for la in [lang() for lang in all_plugins]} # type: ignore
38+
39+
40+
def fetch_project_language_plugin(all_plugins: Dict[str, BaseLanguage], language: str) -> BaseLanguage:
41+
"""Fetches a language CD flow.
42+
43+
Arguments:
44+
all_plugins: all the plugins at disposal
45+
language: the language to select
46+
47+
Returns:
48+
A language plugin corresponding to the language requested
2349
"""
24-
all_plugins = BaseLanguage.__subclasses__()
25-
return {
26-
la.get_related_language().lower().strip(): la
27-
for la in [lang() for lang in all_plugins if lang != BaseLanguage] # type: ignore
28-
}
50+
return cast(BaseLanguage, all_plugins.get(_sanitise_program_language(language)))
2951

3052

31-
def _sanitise_program_language() -> str:
32-
return str(configuration.get_value(ConfigurationVariable.PROGRAMMING_LANGUAGE)).lower().strip()
53+
def _sanitise_program_language(language: str) -> str:
54+
return language.lower().strip()
3355

3456

3557
def _fetch_project_language_specifics() -> BaseLanguage:
36-
return cast(BaseLanguage, _all_language_plugins().get(_sanitise_program_language()))
58+
return fetch_project_language_plugin(
59+
all_language_plugins(), str(configuration.get_value(ConfigurationVariable.PROGRAMMING_LANGUAGE))
60+
)
3761

3862

3963
class PluginLoader:
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Basic plugin
2+
3+
This plugin is used for simple git projects when `PROGRAMMING_LANGUAGE` is set to `basic`.
4+
5+
## Release
6+
Only basic git operations (tagging, version incrementation, changelog commit) are performed
7+
8+
## Documentation
9+
N/A

continuous_delivery_scripts/plugins/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
#
55
"""Language specific actions."""
66
import glob
7-
import os
7+
from pathlib import Path
88

99
all_plugin_files = [
10-
os.path.splitext(os.path.basename(filename))[0]
11-
for filename in glob.glob(os.path.join(os.path.dirname(__file__), "*.py"))
10+
Path(filename).stem
11+
for filename in glob.glob(str(Path(__file__).parent.joinpath("*.py")))
12+
if not filename.endswith("__init__.py")
1213
]
1314
__all__ = all_plugin_files
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#
2+
# Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
3+
# SPDX-License-Identifier: Apache-2.0
4+
#
5+
"""Basic plugin."""
6+
import logging
7+
from pathlib import Path
8+
from typing import Optional
9+
10+
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
11+
from continuous_delivery_scripts.utils.definitions import CommitType
12+
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
13+
14+
logger = logging.getLogger(__name__)
15+
16+
17+
class Basic(BaseLanguage):
18+
"""Specific actions for a Basic project."""
19+
20+
def get_related_language(self) -> str:
21+
"""Gets the related language."""
22+
return get_language_from_file_name(__file__)
23+
24+
def package_software(self, mode: CommitType, version: str) -> None:
25+
"""Basic."""
26+
super().package_software(mode, version)
27+
28+
def release_package_to_repository(self, mode: CommitType, version: str) -> None:
29+
"""Basic."""
30+
super().release_package_to_repository(mode, version)
31+
32+
def check_credentials(self) -> None:
33+
"""Basic."""
34+
super().check_credentials()
35+
36+
def generate_code_documentation(self, output_directory: Path, module_to_document: str) -> None:
37+
"""Basic."""
38+
super().generate_code_documentation(output_directory, module_to_document)
39+
40+
def can_add_licence_headers(self) -> bool:
41+
"""Basic."""
42+
return False
43+
44+
def can_get_project_metadata(self) -> bool:
45+
"""States whether project metadata can be retrieved."""
46+
return False
47+
48+
def get_current_spdx_project(self) -> Optional[SpdxProject]:
49+
"""Basic."""
50+
return None

continuous_delivery_scripts/plugins/ci.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
"""Plugin for CI projects."""
66
import logging
77
from pathlib import Path
8-
from typing import Optional, Dict
8+
from typing import Optional
99

1010
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
1111
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
1212
from continuous_delivery_scripts.utils.definitions import CommitType
13-
from continuous_delivery_scripts.utils.git_helpers import GitWrapper
1413
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
1514

1615
logger = logging.getLogger(__name__)
@@ -25,8 +24,7 @@ def package_software(self, mode: CommitType, version: str) -> None:
2524

2625
def generate_code_documentation(self, output_directory: Path, module_to_document: str) -> None:
2726
"""Generates the code documentation."""
28-
super().generate_code_documentation(output_directory, module_to_document)
29-
# Nothing to do
27+
pass
3028

3129
def get_related_language(self) -> str:
3230
"""Gets the related language."""
@@ -62,7 +60,3 @@ def get_current_spdx_project(self) -> Optional[SpdxProject]:
6260
def should_clean_before_packaging(self) -> bool:
6361
"""States whether the repository must be cleaned before packaging happens."""
6462
return True
65-
66-
def tag_release(self, git: GitWrapper, version: str, shortcuts: Dict[str, bool]) -> None:
67-
"""Tags release commit."""
68-
super().tag_release(git, version, shortcuts)

continuous_delivery_scripts/plugins/docker.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
import logging
77
from pathlib import Path
88
from typing import Optional
9-
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
10-
from continuous_delivery_scripts.utils.definitions import CommitType
9+
1110
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
11+
from continuous_delivery_scripts.utils.definitions import CommitType
12+
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
1213

1314
logger = logging.getLogger(__name__)
1415

continuous_delivery_scripts/plugins/golang.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
import logging
77
import os
88
from pathlib import Path
9-
from typing import Optional, List, Dict
109
from subprocess import check_call
11-
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
10+
from typing import Optional, List, Dict
11+
1212
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
1313
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
1414
from continuous_delivery_scripts.utils.definitions import CommitType
1515
from continuous_delivery_scripts.utils.git_helpers import LocalProjectRepository, GitWrapper
16+
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
1617

1718
logger = logging.getLogger(__name__)
1819

continuous_delivery_scripts/plugins/noop.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
"""No Operation plugin."""
66
import logging
77
from pathlib import Path
8+
from typing import Optional, Dict
89

910
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
1011
from continuous_delivery_scripts.utils.definitions import CommitType
12+
from continuous_delivery_scripts.utils.git_helpers import GitWrapper
1113
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
12-
from typing import Optional
1314

1415
logger = logging.getLogger(__name__)
1516

@@ -23,19 +24,19 @@ def get_related_language(self) -> str:
2324

2425
def package_software(self, mode: CommitType, version: str) -> None:
2526
"""No Op."""
26-
super().package_software(mode, version)
27+
pass
2728

2829
def release_package_to_repository(self, mode: CommitType, version: str) -> None:
2930
"""No Op."""
30-
super().release_package_to_repository(mode, version)
31+
pass
3132

3233
def check_credentials(self) -> None:
3334
"""No Op."""
34-
super().check_credentials()
35+
pass
3536

3637
def generate_code_documentation(self, output_directory: Path, module_to_document: str) -> None:
3738
"""No Op."""
38-
super().generate_code_documentation(output_directory, module_to_document)
39+
pass
3940

4041
def can_add_licence_headers(self) -> bool:
4142
"""No Op."""
@@ -49,3 +50,7 @@ def can_get_project_metadata(self) -> bool:
4950
def get_current_spdx_project(self) -> Optional[SpdxProject]:
5051
"""No Op."""
5152
return None
53+
54+
def tag_release(self, git: GitWrapper, version: str, shortcuts: Dict[str, bool]) -> None:
55+
"""Tags release commit."""
56+
pass

continuous_delivery_scripts/plugins/python.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,17 @@
55
"""Plugin for Python projects."""
66
import logging
77
import shutil
8-
98
import sys
109
from pathlib import Path
10+
from subprocess import check_call
1111
from typing import List, Optional
1212

13-
from subprocess import check_call
14-
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
1513
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
1614
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
1715
from continuous_delivery_scripts.utils.definitions import CommitType
1816
from continuous_delivery_scripts.utils.filesystem_helpers import TemporaryDirectory
1917
from continuous_delivery_scripts.utils.filesystem_helpers import cd
18+
from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage, get_language_from_file_name
2019
from continuous_delivery_scripts.utils.logging import log_exception
2120
from continuous_delivery_scripts.utils.python.package_helpers import (
2221
CurrentPythonProjectMetadataFetcher,

0 commit comments

Comments
 (0)