diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33dfff0..dff5793 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,7 +30,7 @@ pylint: stage: lint&test script: - pip install -r dev_requirements.txt - - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W1203,W0702,W0702,R0913,R0902,R0914,R1732 src/main/python/ddadevops/ + - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W1203,W0702,W0702,R0913,R0902,R0914,R1732,R1705,W0707,C0123,W0703,C0103 src/main/python/ddadevops/ pytest: stage: lint&test diff --git a/src/main/python/ddadevops/application/image_build_service.py b/src/main/python/ddadevops/application/image_build_service.py index 65d37b4..cc77ca3 100644 --- a/src/main/python/ddadevops/application/image_build_service.py +++ b/src/main/python/ddadevops/application/image_build_service.py @@ -1,5 +1,5 @@ from pathlib import Path -from ..domain import Image, Devops, BuildType +from ..domain import Devops, BuildType from ..infrastructure import FileApi, ResourceApi, ImageApi diff --git a/src/main/python/ddadevops/application/release_mixin_services.py b/src/main/python/ddadevops/application/release_mixin_services.py index 5a9565a..1557390 100644 --- a/src/main/python/ddadevops/application/release_mixin_services.py +++ b/src/main/python/ddadevops/application/release_mixin_services.py @@ -1,4 +1,4 @@ -from typing import Optional, List +from typing import List from pathlib import Path from ..infrastructure import GitApi, BuildFileRepository from ..domain import Version, Release, ReleaseType @@ -53,8 +53,8 @@ class ReleaseService: def __set_version_and_commit__( self, version: Version, build_file_ids: List[str], message: str ): - for id in build_file_ids: - build_file = self.build_file_repository.get(Path(id)) + for build_file_id in build_file_ids: + build_file = self.build_file_repository.get(Path(build_file_id)) build_file.set_version(version) self.build_file_repository.write(build_file) self.git_api.add_file(build_file.file_path) diff --git a/src/main/python/ddadevops/c4k_build.py b/src/main/python/ddadevops/c4k_build.py index 7964917..c2f9685 100644 --- a/src/main/python/ddadevops/c4k_build.py +++ b/src/main/python/ddadevops/c4k_build.py @@ -49,7 +49,7 @@ class C4kBuild(DevopsBuild): self.execution_api = ExecutionApi() devops = self.devops_repo.get_devops(self.project) if BuildType.C4K not in devops.specialized_builds: - raise ValueError(f"C4kBuild requires BuildType.C4K") + raise ValueError("C4kBuild requires BuildType.C4K") def update_runtime_config(self, dns_record: DnsRecord): devops = self.devops_repo.get_devops(self.project) diff --git a/src/main/python/ddadevops/devops_build.py b/src/main/python/ddadevops/devops_build.py index f2622a9..40441b1 100644 --- a/src/main/python/ddadevops/devops_build.py +++ b/src/main/python/ddadevops/devops_build.py @@ -1,6 +1,5 @@ -from typing import Optional import deprecation -from .domain import Devops, InitService +from .domain import InitService from .infrastructure import DevopsRepository, FileApi @@ -21,12 +20,12 @@ def get_devops_build(project): class DevopsBuild: - def __init__(self, project, input: dict): + def __init__(self, project, inp: dict): self.project = project self.file_api = FileApi() self.init_service = InitService.prod(project.basedir) self.devops_repo = DevopsRepository() - devops = self.init_service.initialize(input) + devops = self.init_service.initialize(inp) self.devops_repo.set_devops(self.project, devops) self.project.set_property("build", self) diff --git a/src/main/python/ddadevops/devops_image_build.py b/src/main/python/ddadevops/devops_image_build.py index c5684bb..4dd3863 100644 --- a/src/main/python/ddadevops/devops_image_build.py +++ b/src/main/python/ddadevops/devops_image_build.py @@ -1,4 +1,3 @@ -from typing import Optional import deprecation from .domain import BuildType from .application import ImageBuildService @@ -33,12 +32,12 @@ def create_devops_docker_build_config( class DevopsImageBuild(DevopsBuild): - def __init__(self, project, input: dict): - super().__init__(project, input) + def __init__(self, project, inp: dict): + super().__init__(project, inp) self.image_build_service = ImageBuildService.prod() devops = self.devops_repo.get_devops(self.project) if BuildType.IMAGE not in devops.specialized_builds: - raise ValueError(f"ImageBuild requires BuildType.IMAGE") + raise ValueError("ImageBuild requires BuildType.IMAGE") def initialize_build_dir(self): super().initialize_build_dir() diff --git a/src/main/python/ddadevops/domain/__init__.py b/src/main/python/ddadevops/domain/__init__.py index f55faa3..0378707 100644 --- a/src/main/python/ddadevops/domain/__init__.py +++ b/src/main/python/ddadevops/domain/__init__.py @@ -6,4 +6,4 @@ from .release import Release from .credentials import Credentials, CredentialMapping, GopassType from .version import Version from .build_file import BuildFileType, BuildFile -from .init_service import InitService \ No newline at end of file +from .init_service import InitService diff --git a/src/main/python/ddadevops/domain/build_file.py b/src/main/python/ddadevops/domain/build_file.py index c69a737..c7537a8 100644 --- a/src/main/python/ddadevops/domain/build_file.py +++ b/src/main/python/ddadevops/domain/build_file.py @@ -1,16 +1,9 @@ +import json +import re from enum import Enum -from typing import Optional from pathlib import Path -import re -import json -from .common import ( - Validateable, - Devops, - ReleaseType, -) -from .version import ( - Version, -) +from .common import Validateable +from .version import Version class BuildFileType(Enum): @@ -110,18 +103,12 @@ class BuildFile(Validateable): ) self.content = substitute case BuildFileType.JAVA_CLOJURE: - version_line = re.search("\\(defproject .*\n", self.content) - version_line_group = version_line.group() # TODO: we should stick here on defproject instead of first line! - version_string = re.search( - "[0-9]*\\.[0-9]*\\.[0-9]*(-SNAPSHOT)?", version_line_group - ) - version_str = version_string.group() substitute = re.sub( '"[0-9]*\\.[0-9]*\\.[0-9]*(-SNAPSHOT)?"', f'"{new_version.to_string()}"', self.content, - 1 + 1, ) self.content = substitute except: diff --git a/src/main/python/ddadevops/domain/c4k.py b/src/main/python/ddadevops/domain/c4k.py index ca086a6..16b8760 100644 --- a/src/main/python/ddadevops/domain/c4k.py +++ b/src/main/python/ddadevops/domain/c4k.py @@ -7,18 +7,18 @@ from .common import ( class C4k(Validateable): - def __init__(self, input: dict): - self.module = input.get("module") - self.stage = input.get("stage") - self.c4k_executable_name = input.get("c4k_executable_name", input.get("module")) - self.c4k_config = input.get("c4k_config", {}) - self.c4k_grafana_cloud_url = input.get( + def __init__(self, inp: dict): + self.module = inp.get("module") + self.stage = inp.get("stage") + self.c4k_executable_name = inp.get("c4k_executable_name", inp.get("module")) + self.c4k_config = inp.get("c4k_config", {}) + self.c4k_grafana_cloud_url = inp.get( "c4k_grafana_cloud_url", "https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push", ) - self.c4k_auth = input.get("c4k_auth", {}) - self.c4k_grafana_cloud_user = input.get('c4k_grafana_cloud_user') - self.c4k_grafana_cloud_password = input.get('c4k_grafana_cloud_password') + self.c4k_auth = inp.get("c4k_auth", {}) + self.c4k_grafana_cloud_user = inp.get('c4k_grafana_cloud_user') + self.c4k_grafana_cloud_password = inp.get('c4k_grafana_cloud_password') self.dns_record: Optional[DnsRecord] = None # TODO: these functions should be located at TerraformBuild later on. diff --git a/src/main/python/ddadevops/domain/common.py b/src/main/python/ddadevops/domain/common.py index 0ed8664..3eb17a2 100644 --- a/src/main/python/ddadevops/domain/common.py +++ b/src/main/python/ddadevops/domain/common.py @@ -1,7 +1,5 @@ -import deprecation from enum import Enum -from typing import List, TypedDict -import deprecation +from typing import List def filter_none(list_to_filter): @@ -70,15 +68,15 @@ class DnsRecord(Validateable): class Devops(Validateable): def __init__( self, - input: dict, + inp: dict, specialized_builds: dict[BuildType, Validateable], mixins: dict[MixinType, Validateable], ): - self.stage = input.get("stage") - self.project_root_path = input.get("project_root_path") - self.module = input.get("module") - self.name = input.get("name", self.module) - self.build_dir_name = input.get("build_dir_name", "target") + self.stage = inp.get("stage") + self.project_root_path = inp.get("project_root_path") + self.module = inp.get("module") + self.name = inp.get("name", self.module) + self.build_dir_name = inp.get("build_dir_name", "target") self.specialized_builds = specialized_builds self.mixins = mixins @@ -99,15 +97,3 @@ class Devops(Validateable): for mixin in self.mixins: result += self.mixins[mixin].validate() return result - - def __put__(self, key, value): - self.stack[key] = value - - def __get(self, key): - return self.stack[key] - - def __get_keys__(self, keys): - result = {} - for key in keys: - result[key] = self.__get(key) - return result diff --git a/src/main/python/ddadevops/domain/credentials.py b/src/main/python/ddadevops/domain/credentials.py index f144394..26bba2a 100644 --- a/src/main/python/ddadevops/domain/credentials.py +++ b/src/main/python/ddadevops/domain/credentials.py @@ -1,8 +1,6 @@ -import deprecation from enum import Enum -from typing import List, TypedDict +from typing import List from inflection import underscore -import deprecation from .common import ( Validateable, ) @@ -23,7 +21,7 @@ class CredentialMapping(Validateable): result = [] result += self.__validate_is_not_empty__("gopass_path") if not self.name and not self.gopass_field: - result.append(f"Either name or gopass field has to be defined.") + result.append("Either name or gopass field has to be defined.") return result def gopass_type(self): @@ -46,14 +44,14 @@ class CredentialMapping(Validateable): class Credentials(Validateable): - def __init__(self, input: dict, default_mappings: list = []): - input_mappings = input.get("credentials_mapping", []) + def __init__(self, inp: dict, default_mappings: list = []): + inp_mappings = inp.get("credentials_mapping", []) self.mappings = {} - for input_mapping in default_mappings: - mapping = CredentialMapping(input_mapping) + for inp_mapping in default_mappings: + mapping = CredentialMapping(inp_mapping) self.mappings[mapping.name_for_input()] = mapping - for input_mapping in input_mappings: - mapping = CredentialMapping(input_mapping) + for inp_mapping in inp_mappings: + mapping = CredentialMapping(inp_mapping) self.mappings[mapping.name_for_input()] = mapping def validate(self) -> List[str]: diff --git a/src/main/python/ddadevops/domain/devops_factory.py b/src/main/python/ddadevops/domain/devops_factory.py index f933266..48d1089 100644 --- a/src/main/python/ddadevops/domain/devops_factory.py +++ b/src/main/python/ddadevops/domain/devops_factory.py @@ -1,5 +1,3 @@ -import deprecation -from enum import Enum from typing import List, Optional, Dict from .common import Validateable, Devops, BuildType, MixinType from .image import Image @@ -12,28 +10,28 @@ class DevopsFactory: def __init__(self): pass - def build_devops(self, input: dict, version: Optional[Version] = None) -> Devops: - build_types = self.__parse_build_types__(input["build_types"]) - mixin_types = self.__parse_mixin_types__(input["mixin_types"]) + def build_devops(self, inp: dict, version: Optional[Version] = None) -> Devops: + build_types = self.__parse_build_types__(inp["build_types"]) + mixin_types = self.__parse_mixin_types__(inp["mixin_types"]) specialized_builds: Dict[BuildType, Validateable] = {} if BuildType.IMAGE in build_types: - specialized_builds[BuildType.IMAGE] = Image(input) + specialized_builds[BuildType.IMAGE] = Image(inp) if BuildType.C4K in build_types: - specialized_builds[BuildType.C4K] = C4k(input) + specialized_builds[BuildType.C4K] = C4k(inp) mixins: Dict[MixinType, Validateable] = {} if MixinType.RELEASE in mixin_types: - mixins[MixinType.RELEASE] = Release(input, version) + mixins[MixinType.RELEASE] = Release(inp, version) - devops = Devops(input, specialized_builds=specialized_builds, mixins=mixins) + devops = Devops(inp, specialized_builds=specialized_builds, mixins=mixins) devops.throw_if_invalid() return devops - def merge(self, input: dict, context: dict, authorization: dict) -> dict: - return {} | context | authorization | input + def merge(self, inp: dict, context: dict, authorization: dict) -> dict: + return {} | context | authorization | inp def __parse_build_types__(self, build_types: List[str]) -> List[BuildType]: result = [] diff --git a/src/main/python/ddadevops/domain/image.py b/src/main/python/ddadevops/domain/image.py index b959c3c..a3cd888 100644 --- a/src/main/python/ddadevops/domain/image.py +++ b/src/main/python/ddadevops/domain/image.py @@ -1,4 +1,4 @@ -from typing import Optional, List +from typing import List from .common import ( filter_none, Validateable, @@ -8,16 +8,16 @@ from .common import ( class Image(Validateable): def __init__( self, - input: dict, + inp: dict, ): - self.image_dockerhub_user = input.get("image_dockerhub_user") - self.image_dockerhub_password = input.get("image_dockerhub_password") - self.image_tag = input.get("image_tag") - self.image_build_commons_path = input.get("image_build_commons_path") - self.image_use_package_common_files = input.get( + self.image_dockerhub_user = inp.get("image_dockerhub_user") + self.image_dockerhub_password = inp.get("image_dockerhub_password") + self.image_tag = inp.get("image_tag") + self.image_build_commons_path = inp.get("image_build_commons_path") + self.image_use_package_common_files = inp.get( "image_use_package_common_files", True ) - self.image_build_commons_dir_name = input.get( + self.image_build_commons_dir_name = inp.get( "image_build_commons_dir_name", "docker" ) diff --git a/src/main/python/ddadevops/domain/init_service.py b/src/main/python/ddadevops/domain/init_service.py index bb42860..3d50203 100644 --- a/src/main/python/ddadevops/domain/init_service.py +++ b/src/main/python/ddadevops/domain/init_service.py @@ -1,9 +1,8 @@ from pathlib import Path -from typing import List, Dict +from typing import Dict from .common import Devops, MixinType, BuildType from .credentials import CredentialMapping, Credentials, GopassType from .devops_factory import DevopsFactory -from .version import Version from .release import ReleaseType from ..infrastructure import BuildFileRepository, CredentialsApi, EnvironmentApi, GitApi @@ -33,9 +32,9 @@ class InitService: GitApi(), ) - def initialize(self, input: dict) -> Devops: - build_types = self.devops_factory.__parse_build_types__(input["build_types"]) - mixin_types = self.devops_factory.__parse_mixin_types__(input["mixin_types"]) + def initialize(self, inp: dict) -> Devops: + build_types = self.devops_factory.__parse_build_types__(inp["build_types"]) + mixin_types = self.devops_factory.__parse_mixin_types__(inp["mixin_types"]) version = None default_mappings = [] @@ -66,7 +65,7 @@ class InitService: ] if MixinType.RELEASE in mixin_types: - primary_build_file_id = input.get( + primary_build_file_id = inp.get( "release_primary_build_file", "./project.clj" ) primary_build_file = self.build_file_repository.get( @@ -74,12 +73,12 @@ class InitService: ) version = primary_build_file.get_version() - credentials = Credentials(input, default_mappings) + credentials = Credentials(inp, default_mappings) authorization = self.authorization(credentials) context = self.context(mixin_types, version) - merged = self.devops_factory.merge(input, context, authorization) + merged = self.devops_factory.merge(inp, context, authorization) return self.devops_factory.build_devops(merged, version=version) diff --git a/src/main/python/ddadevops/domain/release.py b/src/main/python/ddadevops/domain/release.py index 1edfac8..7be61d8 100644 --- a/src/main/python/ddadevops/domain/release.py +++ b/src/main/python/ddadevops/domain/release.py @@ -1,9 +1,7 @@ -from enum import Enum from typing import Optional, List from pathlib import Path from .common import ( Validateable, - Devops, ReleaseType, ) from .version import ( @@ -12,14 +10,14 @@ from .version import ( class Release(Validateable): - def __init__(self, input: dict, version: Optional[Version]): - self.release_type = ReleaseType[input.get("release_type", "NONE")] - self.release_main_branch = input.get("release_main_branch", "main") - self.release_current_branch = input.get("release_current_branch") - self.release_primary_build_file = input.get( + def __init__(self, inp: dict, version: Optional[Version]): + self.release_type = ReleaseType[inp.get("release_type", "NONE")] + self.release_main_branch = inp.get("release_main_branch", "main") + self.release_current_branch = inp.get("release_current_branch") + self.release_primary_build_file = inp.get( "release_primary_build_file", "./project.clj" ) - self.release_secondary_build_files = input.get( + self.release_secondary_build_files = inp.get( "release_secondary_build_files", [] ) self.version = version diff --git a/src/main/python/ddadevops/domain/version.py b/src/main/python/ddadevops/domain/version.py index f5cee17..22d2566 100644 --- a/src/main/python/ddadevops/domain/version.py +++ b/src/main/python/ddadevops/domain/version.py @@ -1,4 +1,3 @@ -from enum import Enum from typing import Optional from .common import ( Validateable, @@ -37,7 +36,7 @@ class Version(Validateable): return self.to_string().__hash__() def is_snapshot(self): - return not self.snapshot_suffix == None + return not self.snapshot_suffix is None def to_string(self) -> str: version_no = ".".join([str(x) for x in self.version_list]) @@ -49,7 +48,7 @@ class Version(Validateable): result = [] result += self.__validate_is_not_empty__("version_list") if self.version_list and len(self.version_list) < 3: - result += [f"version_list must have at least 3 levels."] + result += ["version_list must have at least 3 levels."] if ( self.version_list and self.version_string diff --git a/src/main/python/ddadevops/infrastructure/infrastructure.py b/src/main/python/ddadevops/infrastructure/infrastructure.py index 7a44048..7e1df4b 100644 --- a/src/main/python/ddadevops/infrastructure/infrastructure.py +++ b/src/main/python/ddadevops/infrastructure/infrastructure.py @@ -1,10 +1,9 @@ +from subprocess import check_output, Popen, PIPE, run from pathlib import Path from sys import stdout from os import chmod, environ from pkg_resources import resource_string import yaml -from subprocess import check_output, Popen, PIPE, run -from ..domain import Devops, Image, C4k, Release, BuildFile class ResourceApi: @@ -99,7 +98,7 @@ class ExecutionApi: output = output.rstrip() return output - def execute_live(command): + def execute_live(self, command): process = Popen(command, stdout=PIPE) for line in iter(process.stdout.readline, b""): print(line.decode("utf-8"), end="") diff --git a/src/main/python/ddadevops/infrastructure/repository.py b/src/main/python/ddadevops/infrastructure/repository.py index 057f083..07d1ccc 100644 --- a/src/main/python/ddadevops/infrastructure/repository.py +++ b/src/main/python/ddadevops/infrastructure/repository.py @@ -1,12 +1,6 @@ from pathlib import Path -from sys import stdout -from os import chmod -from subprocess import run -from pkg_resources import resource_string -import yaml -import deprecation -from ..domain import Devops, Image, C4k, Release, BuildFile -from ..python_util import execute +from ..domain.common import Devops +from ..domain.build_file import BuildFile class DevopsRepository: diff --git a/src/main/python/ddadevops/release_mixin.py b/src/main/python/ddadevops/release_mixin.py index 79e0a25..fd909e8 100644 --- a/src/main/python/ddadevops/release_mixin.py +++ b/src/main/python/ddadevops/release_mixin.py @@ -5,12 +5,12 @@ from .domain import MixinType class ReleaseMixin(DevopsBuild): - def __init__(self, project: Project, input: dict): - super().__init__(project, input) + def __init__(self, project: Project, inp: dict): + super().__init__(project, inp) self.release_service = ReleaseService.prod(project.basedir) devops = self.devops_repo.get_devops(self.project) if MixinType.RELEASE not in devops.mixins: - raise ValueError(f"ReleaseMixin requires MixinType.RELEASE") + raise ValueError("ReleaseMixin requires MixinType.RELEASE") def prepare_release(self): devops = self.devops_repo.get_devops(self.project)