|
5 | 5 | """Language plugins Loader."""
|
6 | 6 |
|
7 | 7 | import logging
|
8 |
| -from typing import Optional, Dict, cast |
| 8 | +from typing import Optional, Dict, cast, Set, Type |
9 | 9 |
|
10 | 10 | from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
|
11 | 11 | from continuous_delivery_scripts.utils.language_specifics_base import BaseLanguage
|
|
16 | 16 | logger = logging.getLogger(__name__)
|
17 | 17 |
|
18 | 18 |
|
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 |
21 | 28 |
|
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 |
23 | 49 | """
|
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))) |
29 | 51 |
|
30 | 52 |
|
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() |
33 | 55 |
|
34 | 56 |
|
35 | 57 | 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 | + ) |
37 | 61 |
|
38 | 62 |
|
39 | 63 | class PluginLoader:
|
|
0 commit comments