From 349884cb6cfc66f4c4bcc6ce90371524b102f29b Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 13:28:40 +0200 Subject: [PATCH 01/21] Refactor to C4kBuild --- src/main/python/ddadevops/__init__.py | 2 +- src/main/python/ddadevops/c4k_mixin.py | 4 +--- src/test/python/test_c4k_mixin.py | 6 +++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/python/ddadevops/__init__.py b/src/main/python/ddadevops/__init__.py index fc4363f..f62b93d 100644 --- a/src/main/python/ddadevops/__init__.py +++ b/src/main/python/ddadevops/__init__.py @@ -9,7 +9,7 @@ from .provs_k3s_mixin import ProvsK3sMixin, add_provs_k3s_mixin_config from .aws_rds_pg_mixin import AwsRdsPgMixin, add_aws_rds_pg_mixin_config from .aws_mfa_mixin import AwsMfaMixin, add_aws_mfa_mixin_config from .aws_backend_properties_mixin import AwsBackendPropertiesMixin, add_aws_backend_properties_mixin_config -from .c4k_mixin import C4kMixin, add_c4k_mixin_config +from .c4k_mixin import C4kBuild, add_c4k_mixin_config from .exoscale_mixin import ExoscaleMixin, add_exoscale_mixin_config from .digitalocean_backend_properties_mixin import DigitaloceanBackendPropertiesMixin, add_digitalocean_backend_properties_mixin_config from .digitalocean_terraform_build import DigitaloceanTerraformBuild, create_digitalocean_terraform_build_config diff --git a/src/main/python/ddadevops/c4k_mixin.py b/src/main/python/ddadevops/c4k_mixin.py index 61edc8c..8a5f3f2 100644 --- a/src/main/python/ddadevops/c4k_mixin.py +++ b/src/main/python/ddadevops/c4k_mixin.py @@ -44,9 +44,7 @@ def add_c4k_mixin_config( ) return config - -#TODO: refactor this to C4kBuild -class C4kMixin(DevopsBuild): +class C4kBuild(DevopsBuild): def __init__(self, project, config): super().__init__(project, config) self.execution_api = ExecutionApi() diff --git a/src/test/python/test_c4k_mixin.py b/src/test/python/test_c4k_mixin.py index 59cf436..c4c2b17 100644 --- a/src/test/python/test_c4k_mixin.py +++ b/src/test/python/test_c4k_mixin.py @@ -1,9 +1,9 @@ import os from pybuilder.core import Project from src.main.python.ddadevops.domain import DnsRecord -from src.main.python.ddadevops.c4k_mixin import C4kMixin, add_c4k_mixin_config +from src.main.python.ddadevops.c4k_mixin import C4kBuild, add_c4k_mixin_config -class MyC4kMixin(C4kMixin): +class MyC4kBuild(C4kBuild): pass def test_c4k_mixin(tmp_path): @@ -29,7 +29,7 @@ def test_c4k_mixin(tmp_path): assert project_config.get('C4kMixin') is not None - mixin = MyC4kMixin(project, project_config) + mixin = MyC4kBuild(project, project_config) mixin.initialize_build_dir() assert mixin.build_path() == f'{tmp_path_str}/{build_dir}/{project_name}/{module_name}' From 91a5964448e2cfd1db749cfe70936c311d9db653 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 13:32:10 +0200 Subject: [PATCH 02/21] Remove deprecated function --- src/main/python/ddadevops/__init__.py | 2 +- src/main/python/ddadevops/devops_build.py | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/main/python/ddadevops/__init__.py b/src/main/python/ddadevops/__init__.py index f62b93d..3cd3560 100644 --- a/src/main/python/ddadevops/__init__.py +++ b/src/main/python/ddadevops/__init__.py @@ -16,7 +16,7 @@ from .digitalocean_terraform_build import DigitaloceanTerraformBuild, create_dig from .hetzner_mixin import HetznerMixin, add_hetzner_mixin_config from .devops_image_build import DevopsImageBuild, create_devops_docker_build_config from .devops_terraform_build import DevopsTerraformBuild, create_devops_terraform_build_config -from .devops_build import DevopsBuild, create_devops_build_config, get_devops_build, get_tag_from_latest_commit +from .devops_build import DevopsBuild, create_devops_build_config, get_devops_build from .credential import gopass_password_from_path, gopass_field_from_path from .release_mixin import ReleaseMixin diff --git a/src/main/python/ddadevops/devops_build.py b/src/main/python/ddadevops/devops_build.py index cc3f860..36ddb84 100644 --- a/src/main/python/ddadevops/devops_build.py +++ b/src/main/python/ddadevops/devops_build.py @@ -19,22 +19,6 @@ def create_devops_build_config( def get_devops_build(project): return project.get_property("devops_build") - -@deprecation.deprecated(deprecated_in="3.2") -# TODO: Remove from here! # pylint: disable=W0511 -def get_tag_from_latest_commit(): - try: - value = run( - "git describe --abbrev=0 --tags --exact-match", - shell=True, - capture_output=True, - check=True, - ) - return value.stdout.decode("UTF-8").rstrip() - except CalledProcessError: - return None - - class DevopsBuild: def __init__(self, project, config: Optional[dict] = None, devops: Optional[Devops] = None): self.project = project From 2ad63b8a753464d225224b326bea8fbb66b694ea Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 13:32:40 +0200 Subject: [PATCH 03/21] Remove unused files --- src/test/resources/alt_config.json | 4 --- src/test/resources/build.py | 49 ------------------------------ 2 files changed, 53 deletions(-) delete mode 100644 src/test/resources/alt_config.json delete mode 100644 src/test/resources/build.py diff --git a/src/test/resources/alt_config.json b/src/test/resources/alt_config.json deleted file mode 100644 index 359f087..0000000 --- a/src/test/resources/alt_config.json +++ /dev/null @@ -1,4 +0,0 @@ -// TODO: jem, zam - 2023_04_18: move this to an build-test repo ? -{ - "version": "123.125.1-SNAPSHOT" -} \ No newline at end of file diff --git a/src/test/resources/build.py b/src/test/resources/build.py deleted file mode 100644 index 641ae3a..0000000 --- a/src/test/resources/build.py +++ /dev/null @@ -1,49 +0,0 @@ -# TODO: jem, zam - 2023_04_18: move this to an build-test repo? - -import sys -import os -from pathlib import Path -from ddadevops import * - -# getting the name of the directory -# where the this file is present. -current = os.path.dirname(os.path.realpath(__file__)) - -# adding the current directory to -# the sys.path. -sys.path.append(current) - -# now we can import the module in the current -# directory. - -from pybuilder.core import task, init -from ddadevops import * -from release_mixin import ReleaseMixin, create_release_mixin_config - -CONFIG_FILE = Path('config.json') -MAIN_BRANCH = 'main' -STAGE = 'test' -PROJECT_ROOT_PATH = '.' -MODULE = 'test' -BUILD_DIR_NAME = "build_dir" - -class MyBuild(ReleaseMixin): - pass - -@init -def initialize(project): - project.build_depends_on('ddadevops>=3.1.2') - config = create_release_mixin_config(CONFIG_FILE, MAIN_BRANCH) - config.update({'stage': STAGE, - 'module': MODULE, - 'project_root_path': PROJECT_ROOT_PATH, - 'build_dir_name': BUILD_DIR_NAME}) - build = MyBuild(project, config) - build.initialize_build_dir() - -@task -def release(project): - build = get_devops_build(project) - - build.prepare_release() - build.tag_and_push_release() From 7637f65779f7aca7bddfd28d8ed5e03239f4796b Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 13:50:15 +0200 Subject: [PATCH 04/21] [Sip-CI] Update Type Hints --- src/main/python/ddadevops/domain/common.py | 2 +- src/main/python/ddadevops/domain/release.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/python/ddadevops/domain/common.py b/src/main/python/ddadevops/domain/common.py index b077512..d944d32 100644 --- a/src/main/python/ddadevops/domain/common.py +++ b/src/main/python/ddadevops/domain/common.py @@ -47,7 +47,7 @@ class Devops(Validateable): self.name = module self.build_dir_name = build_dir_name # Deprecated - no longer use generic stack ... - self.stack = {} + self.stack : dict = {} @deprecation.deprecated(deprecated_in="3.2") # use .name instead diff --git a/src/main/python/ddadevops/domain/release.py b/src/main/python/ddadevops/domain/release.py index c340154..040db05 100644 --- a/src/main/python/ddadevops/domain/release.py +++ b/src/main/python/ddadevops/domain/release.py @@ -25,7 +25,7 @@ class Version(): self.version_string: Optional[str | None] = None self.is_snapshot: Optional[bool | None] = None - def increment(self, release_type: ReleaseType): + def increment(self, release_type: ReleaseType | None): self.is_snapshot = False match release_type: case ReleaseType.BUMP: @@ -51,7 +51,7 @@ class Version(): self.version_string += "-SNAPSHOT" return self.version_string - def create_release_version(self, release_type: ReleaseType): + def create_release_version(self, release_type: ReleaseType | None): release_version = Version(self.id, self.version_list.copy()) release_version.is_snapshot = self.is_snapshot release_version.increment(release_type) @@ -98,9 +98,9 @@ class Release(Validateable): self.devops = devops self.main_branch = main_branch self.config_file = config_file - self.release_context = None + self.release_context: ReleaseContext | None = None - def set_release_context(self, set_release_context: ReleaseContext) -> None: + def set_release_context(self, set_release_context: ReleaseContext): self.release_context = set_release_context def release_version(self): From f4fed5293abc3b241f6ad29312c606edf0dd8027 Mon Sep 17 00:00:00 2001 From: bom Date: Fri, 28 Apr 2023 13:33:54 +0200 Subject: [PATCH 05/21] Add and use throw_if_invalid function Validates objects and raises an error if they are invalid --- src/main/python/ddadevops/domain/common.py | 5 +++++ .../python/ddadevops/infrastructure/release_mixin/repo.py | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/python/ddadevops/domain/common.py b/src/main/python/ddadevops/domain/common.py index d944d32..a5f1fc8 100644 --- a/src/main/python/ddadevops/domain/common.py +++ b/src/main/python/ddadevops/domain/common.py @@ -18,6 +18,11 @@ class Validateable: def is_valid(self) -> bool: return len(self.validate()) < 1 + + def throw_if_invalid(self): + if not self.is_valid(): + issues = '\n'.join(self.validate()) + raise ValueError(f"Invalid Validateable: {issues}") class DnsRecord(Validateable): diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py index 4ab3ae5..2bfbb37 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py @@ -124,7 +124,5 @@ class ReleaseContextRepository: self.version_repository.get_version(), self.main_branch, ) - if not result.is_valid(): - issues = '\n'.join(result.validate()) - raise ValueError(f"invalid release: {issues}") + result.throw_if_invalid() return result From d801a71b49e795dc69a349d0e7c3ec48c4d3a6a8 Mon Sep 17 00:00:00 2001 From: bom Date: Fri, 28 Apr 2023 13:38:22 +0200 Subject: [PATCH 06/21] Make ReleaseContextRepository stateless --- .../python/ddadevops/infrastructure/release_mixin/repo.py | 7 ++----- src/main/python/ddadevops/release_mixin.py | 5 +++-- src/test/python/release_mixin/test_infrastructure.py | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py index 2bfbb37..308d6c0 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py @@ -106,23 +106,20 @@ class ReleaseTypeRepository: raise ValueError("No valid api passed to ReleaseTypeRepository") -# TODO: Repo has state & repository should exist only for AggregateRoot class ReleaseContextRepository: def __init__( self, version_repository: VersionRepository, release_type_repository: ReleaseTypeRepository, - main_branch: str, ): self.version_repository = version_repository self.release_type_repository = release_type_repository - self.main_branch = main_branch - def get_release(self) -> ReleaseContext: + def get_release(self, main_branch: str) -> ReleaseContext: result = ReleaseContext( self.release_type_repository.get_release_type(), self.version_repository.get_version(), - self.main_branch, + main_branch, ) result.throw_if_invalid() return result diff --git a/src/main/python/ddadevops/release_mixin.py b/src/main/python/ddadevops/release_mixin.py index c992a1f..c7eddb7 100644 --- a/src/main/python/ddadevops/release_mixin.py +++ b/src/main/python/ddadevops/release_mixin.py @@ -9,6 +9,7 @@ class ReleaseMixin(DevopsBuild): def __init__(self, project: Project, release: Release): super().__init__(project, devops=release.devops) self.repo.set_release(self.project, release) + self.main_branch = release.main_branch git_api = GitApi() environment_api = EnvironmentApi() @@ -21,13 +22,13 @@ class ReleaseMixin(DevopsBuild): release_type_repo = ReleaseTypeRepository.from_git(git_api) version_repo = VersionRepository(release.config_file) - self.release_repo = ReleaseContextRepository(version_repo, release_type_repo, release.main_branch) + self.release_repo = ReleaseContextRepository(version_repo, release_type_repo) self.prepare_release_service = PrepareReleaseService() self.tag_and_push_release_service = TagAndPushReleaseService(git_api) def prepare_release(self): - release = self.release_repo.get_release() + release = self.release_repo.get_release(self.main_branch) self.prepare_release_service.write_and_commit_release(release, self.release_repo.version_repository) self.prepare_release_service.write_and_commit_bump(release, self.release_repo.version_repository) diff --git a/src/test/python/release_mixin/test_infrastructure.py b/src/test/python/release_mixin/test_infrastructure.py index 5bfe27d..6233c64 100644 --- a/src/test/python/release_mixin/test_infrastructure.py +++ b/src/test/python/release_mixin/test_infrastructure.py @@ -22,9 +22,9 @@ def test_release_repository(tmp_path): release_type_repo = ReleaseTypeRepository.from_git(MockGitApi('MINOR test')) # test - sut = ReleaseContextRepository(version_repo, release_type_repo, 'main') + sut = ReleaseContextRepository(version_repo, release_type_repo) - release = sut.get_release() + release = sut.get_release('main') assert release is not None From 953e05ecfb4fbe837ab51dc5c7a58ea7a44dee46 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 14:27:41 +0200 Subject: [PATCH 07/21] Remove unused imports --- src/main/python/ddadevops/devops_build.py | 1 - src/main/python/ddadevops/domain/image.py | 1 - src/main/python/ddadevops/domain/release.py | 1 - .../infrastructure/release_mixin/infrastructure_api.py | 1 - src/main/python/ddadevops/infrastructure/release_mixin/repo.py | 2 +- src/main/python/ddadevops/release_mixin.py | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/python/ddadevops/devops_build.py b/src/main/python/ddadevops/devops_build.py index 36ddb84..a239ae2 100644 --- a/src/main/python/ddadevops/devops_build.py +++ b/src/main/python/ddadevops/devops_build.py @@ -1,5 +1,4 @@ from typing import Optional -from subprocess import run, CalledProcessError import deprecation from .domain import Devops from .infrastructure import ProjectRepository, FileApi diff --git a/src/main/python/ddadevops/domain/image.py b/src/main/python/ddadevops/domain/image.py index 49ca555..37a23aa 100644 --- a/src/main/python/ddadevops/domain/image.py +++ b/src/main/python/ddadevops/domain/image.py @@ -1,4 +1,3 @@ -from typing import Optional from .common import ( filter_none, Validateable, diff --git a/src/main/python/ddadevops/domain/release.py b/src/main/python/ddadevops/domain/release.py index 040db05..882a8fc 100644 --- a/src/main/python/ddadevops/domain/release.py +++ b/src/main/python/ddadevops/domain/release.py @@ -2,7 +2,6 @@ from enum import Enum from typing import Optional from pathlib import Path from .common import ( - filter_none, Validateable, Devops, ) diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py b/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py index 09587b9..5d297b9 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py @@ -1,6 +1,5 @@ import json import re -import subprocess as sub from abc import ABC, abstractmethod from typing import Optional from pathlib import Path diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py index 308d6c0..4fd65df 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py @@ -1,4 +1,4 @@ -from typing import Optional + from src.main.python.ddadevops.domain import ( ReleaseContext, Version, diff --git a/src/main/python/ddadevops/release_mixin.py b/src/main/python/ddadevops/release_mixin.py index c7eddb7..597ee6a 100644 --- a/src/main/python/ddadevops/release_mixin.py +++ b/src/main/python/ddadevops/release_mixin.py @@ -1,4 +1,3 @@ -from typing import Optional from pybuilder.core import Project from src.main.python.ddadevops.devops_build import DevopsBuild from src.main.python.ddadevops.infrastructure.release_mixin import ReleaseContextRepository, ReleaseTypeRepository, VersionRepository, GitApi, EnvironmentApi From 0214cdd99a527341f05081b149f95b52cfedc372 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 14:33:49 +0200 Subject: [PATCH 08/21] Update Ignore Settings --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1c2920c..023a56b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,7 +27,7 @@ pylint: stage: lint&test script: - pip install -r dev_requirements.txt - - pylint -d C0301,W0614,C0114,C0115,C0116,similarities,W0702,W0702,R0913,R0902,R0914,R1732 src/main/python/ddadevops/ + - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W0702,W0702,R0913,R0902,R0914,R1732 src/main/python/ddadevops/ pytest: stage: lint&test From 9db91c0a16c40b656af23ef9460e882498f6c94f Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 14:41:37 +0200 Subject: [PATCH 09/21] Fix pylint messages for repo --- .../infrastructure/release_mixin/repo.py | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py index 4fd65df..2dab0c1 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py @@ -23,9 +23,8 @@ class VersionRepository: def write_file(self, version_string): if self.file_handler is None: - raise Exception("Version was not created by load_file method.") - else: - self.file_handler.write(version_string) + raise RuntimeError("Version was not created by load_file method.") + self.file_handler.write(version_string) def parse_file(self): version_list, is_snapshot = self.file_handler.parse() @@ -53,29 +52,30 @@ class ReleaseTypeRepository: @classmethod def from_git(cls, git_api: GitApi): - releaseTypeRepo = cls(git_api=git_api) - releaseTypeRepo.get_from_git = True - return releaseTypeRepo + release_type_repo = cls(git_api=git_api) + release_type_repo.get_from_git = True + return release_type_repo @classmethod def from_environment(cls, environment_api: EnvironmentApi): - releaseTypeRepo = cls(environment_api=environment_api) - releaseTypeRepo.get_from_env = True - return releaseTypeRepo + release_type_repo = cls(environment_api=environment_api) + release_type_repo.get_from_env = True + return release_type_repo def __get_release_type_git(self) -> ReleaseType | None: latest_commit = self.git_api.get_latest_commit() - if ReleaseType.MAJOR.name in latest_commit.upper(): - return ReleaseType.MAJOR - elif ReleaseType.MINOR.name in latest_commit.upper(): - return ReleaseType.MINOR - elif ReleaseType.PATCH.name in latest_commit.upper(): - return ReleaseType.PATCH - elif ReleaseType.SNAPSHOT.name in latest_commit.upper(): - return ReleaseType.SNAPSHOT - else: - return None + match latest_commit.upper(): + case ReleaseType.MAJOR.name: + return ReleaseType.MAJOR + case ReleaseType.MINOR.name: + return ReleaseType.MINOR + case ReleaseType.PATCH.name: + return ReleaseType.PATCH + case ReleaseType.SNAPSHOT.name: + return ReleaseType.SNAPSHOT + case _: + return None def __get_release_type_environment(self) -> ReleaseType | None: release_name = self.environment_api.get( @@ -86,24 +86,25 @@ class ReleaseTypeRepository: raise ValueError( "Release Name not found. Is the Environment correctly configured?" ) - elif ReleaseType.MAJOR.name in release_name.upper(): - return ReleaseType.MAJOR - elif ReleaseType.MINOR.name in release_name.upper(): - return ReleaseType.MINOR - elif ReleaseType.PATCH.name in release_name.upper(): - return ReleaseType.PATCH - elif ReleaseType.SNAPSHOT.name in release_name.upper(): - return ReleaseType.SNAPSHOT - else: - return None + + match release_name.upper(): + case ReleaseType.MAJOR.name: + return ReleaseType.MAJOR + case ReleaseType.MINOR.name: + return ReleaseType.MINOR + case ReleaseType.PATCH.name: + return ReleaseType.PATCH + case ReleaseType.SNAPSHOT.name: + return ReleaseType.SNAPSHOT + case _: + return None def get_release_type(self) -> ReleaseType | None: if self.get_from_git: return self.__get_release_type_git() - elif self.get_from_env: + if self.get_from_env: return self.__get_release_type_environment() - else: - raise ValueError("No valid api passed to ReleaseTypeRepository") + raise ValueError("No valid api passed to ReleaseTypeRepository") class ReleaseContextRepository: From 2463d3667498a8a18415cd55d2df69abdad4bb68 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 14:42:36 +0200 Subject: [PATCH 10/21] [Skip-CI] More specific exception --- .../infrastructure/release_mixin/infrastructure_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py b/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py index 5d297b9..33bb455 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py @@ -25,7 +25,7 @@ class FileHandler(ABC): case '.py': file_handler = PythonFileHandler() case _: - raise Exception( + raise RuntimeError( f'The file type "{config_file_type}" is not implemented') # TODO: Attribute is only set in classmethod. Should this be initialized outside of this class? file_handler.config_file_path = file_path From c70daa346d3d6a6e687d362d697888e9ec8ec312 Mon Sep 17 00:00:00 2001 From: bom Date: Fri, 28 Apr 2023 14:50:35 +0200 Subject: [PATCH 11/21] Resolve pylint errors in release.py --- .gitlab-ci.yml | 2 +- src/main/python/ddadevops/domain/release.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 023a56b..6d8e287 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,7 +27,7 @@ pylint: stage: lint&test script: - pip install -r dev_requirements.txt - - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W0702,W0702,R0913,R0902,R0914,R1732 src/main/python/ddadevops/ + - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W0719,W0702,W0702,R0913,R0902,R0914,R1732 src/main/python/ddadevops/ pytest: stage: lint&test diff --git a/src/main/python/ddadevops/domain/release.py b/src/main/python/ddadevops/domain/release.py index 882a8fc..2c27b4a 100644 --- a/src/main/python/ddadevops/domain/release.py +++ b/src/main/python/ddadevops/domain/release.py @@ -18,8 +18,8 @@ class EnvironmentKeys(Enum): class Version(): - def __init__(self, id: Path, version_list: list): - self.id = id + def __init__(self, path: Path, version_list: list): + self.path = path self.version_list = version_list self.version_string: Optional[str | None] = None self.is_snapshot: Optional[bool | None] = None @@ -42,7 +42,7 @@ class Version(): self.version_list[ReleaseType.MINOR.value] = 0 self.version_list[ReleaseType.MAJOR.value] += 1 case None: - raise Exception("Release Type was not set!") + raise RuntimeError("Release Type was not set!") def get_version_string(self) -> str: self.version_string = ".".join([str(x) for x in self.version_list]) @@ -51,13 +51,13 @@ class Version(): return self.version_string def create_release_version(self, release_type: ReleaseType | None): - release_version = Version(self.id, self.version_list.copy()) + release_version = Version(self.path, self.version_list.copy()) release_version.is_snapshot = self.is_snapshot release_version.increment(release_type) return release_version def create_bump_version(self): - bump_version = Version(self.id, self.version_list.copy()) + bump_version = Version(self.path, self.version_list.copy()) bump_version.is_snapshot = self.is_snapshot bump_version.increment(ReleaseType.BUMP) return bump_version @@ -99,9 +99,9 @@ class Release(Validateable): self.config_file = config_file self.release_context: ReleaseContext | None = None - def set_release_context(self, set_release_context: ReleaseContext): + def set_release_context(self, set_release_context: ReleaseContext): self.release_context = set_release_context - + def release_version(self): return self.release_context.release_version() From 837b58d5b893d3deddbf87c67f3f7b99d4761c0d Mon Sep 17 00:00:00 2001 From: bom Date: Fri, 28 Apr 2023 14:57:19 +0200 Subject: [PATCH 12/21] Resolve pylint errors in common.py --- .gitlab-ci.yml | 2 +- src/main/python/ddadevops/domain/common.py | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6d8e287..1abb7b6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,7 +27,7 @@ pylint: stage: lint&test script: - pip install -r dev_requirements.txt - - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W0719,W0702,W0702,R0913,R0902,R0914,R1732 src/main/python/ddadevops/ + - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W1203,W0719,W0702,W0702,R0913,R0902,R0914,R1732 src/main/python/ddadevops/ pytest: stage: lint&test diff --git a/src/main/python/ddadevops/domain/common.py b/src/main/python/ddadevops/domain/common.py index a5f1fc8..5ffdb14 100644 --- a/src/main/python/ddadevops/domain/common.py +++ b/src/main/python/ddadevops/domain/common.py @@ -1,6 +1,6 @@ -import deprecation -import logging from typing import List +import logging +import deprecation def filter_none(list_to_filter): return [x for x in list_to_filter if x is not None] @@ -10,15 +10,15 @@ class Validateable: value = self.__dict__[field_name] if value is None or value == "": return [f"Field '{field_name}' must not be empty."] - else: - return [] + + return [] def validate(self) -> List[str]: return [] def is_valid(self) -> bool: return len(self.validate()) < 1 - + def throw_if_invalid(self): if not self.is_valid(): issues = '\n'.join(self.validate()) @@ -46,7 +46,7 @@ class Devops(Validateable): self.stage = stage self.name = name self.project_root_path = project_root_path - logging.warn(f"Set project root in DevOps {self.project_root_path}") + logging.warning(f"Set project root in DevOps {self.project_root_path}") self.module = module if not name: self.name = module @@ -56,22 +56,23 @@ class Devops(Validateable): @deprecation.deprecated(deprecated_in="3.2") # use .name instead + #pylint: disable=method-hidden def name(self): return self.name def build_path(self): path = [self.project_root_path, self.build_dir_name, self.name, self.module] - logging.warn(f"Set project build_path in Devops {path}") + logging.warning(f"Set project build_path in Devops {path}") return "/".join(filter_none(path)) def __put__(self, key, value): self.stack[key] = value - def __get__(self, key): + def __get(self, key): return self.stack[key] def __get_keys__(self, keys): result = {} for key in keys: - result[key] = self.__get__(key) + result[key] = self.__get(key) return result From af0d6cc43e8e9f8037846767c87e1e590ba80d0d Mon Sep 17 00:00:00 2001 From: bom Date: Fri, 28 Apr 2023 15:01:03 +0200 Subject: [PATCH 13/21] Resolve pylint errors in infrastructure_api.py --- .../release_mixin/infrastructure_api.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py b/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py index 33bb455..f65140e 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/infrastructure_api.py @@ -46,7 +46,7 @@ class JsonFileHandler(FileHandler): def parse(self) -> tuple[list[int], bool]: if self.config_file_path is None: raise ValueError("No file name given.") - with open(self.config_file_path, 'r') as json_file: + with open(self.config_file_path, 'r', encoding='utf-8') as json_file: json_version = json.load(json_file)['version'] is_snapshot = False if '-SNAPSHOT' in json_version: @@ -56,7 +56,7 @@ class JsonFileHandler(FileHandler): return version, is_snapshot def write(self, version_string): - with open(self.config_file_path, 'r+') as json_file: + with open(self.config_file_path, 'r+', encoding='utf-8') as json_file: json_data = json.load(json_file) json_data['version'] = version_string json_file.seek(0) @@ -69,7 +69,7 @@ class GradleFileHandler(FileHandler): def parse(self) -> tuple[list[int], bool]: if self.config_file_path is None: raise ValueError("No file name given.") - with open(self.config_file_path, 'r') as gradle_file: + with open(self.config_file_path, 'r', encoding='utf-8') as gradle_file: contents = gradle_file.read() version_line = re.search("\nversion = .*", contents) exception = Exception("Version not found in gradle file") @@ -93,7 +93,7 @@ class GradleFileHandler(FileHandler): return version, is_snapshot def write(self, version_string): - with open(self.config_file_path, 'r+') as gradle_file: + with open(self.config_file_path, 'r+', encoding='utf-8') as gradle_file: contents = gradle_file.read() version_substitute = re.sub( '\nversion = "[0-9]*\\.[0-9]*\\.[0-9]*(-SNAPSHOT)?"', f'\nversion = "{version_string}"', contents) @@ -107,7 +107,7 @@ class PythonFileHandler(FileHandler): def parse(self) -> tuple[list[int], bool]: if self.config_file_path is None: raise ValueError("No file name given.") - with open(self.config_file_path, 'r') as python_file: + with open(self.config_file_path, 'r', encoding='utf-8') as python_file: contents = python_file.read() version_line = re.search("\nversion = .*\n", contents) exception = Exception("Version not found in gradle file") @@ -131,7 +131,7 @@ class PythonFileHandler(FileHandler): return version, is_snapshot def write(self, version_string): - with open(self.config_file_path, 'r+') as python_file: + with open(self.config_file_path, 'r+', encoding='utf-8') as python_file: contents = python_file.read() version_substitute = re.sub( '\nversion = "[0-9]*\\.[0-9]*\\.[0-9]*(-SNAPSHOT)?"', f'\nversion = "{version_string}"', contents) @@ -145,7 +145,7 @@ class ClojureFileHandler(FileHandler): def parse(self) -> tuple[list[int], bool]: if self.config_file_path is None: raise ValueError("No file name given.") - with open(self.config_file_path, 'r') as clj_file: + with open(self.config_file_path, 'r', encoding='utf-8') as clj_file: contents = clj_file.read() version_line = re.search("^\\(defproject .*\n", contents) exception = Exception("Version not found in clj file") @@ -169,7 +169,7 @@ class ClojureFileHandler(FileHandler): return version, is_snapshot def write(self, version_string): - with open(self.config_file_path, 'r+') as clj_file: + with open(self.config_file_path, 'r+', encoding='utf-8') as clj_file: clj_first = clj_file.readline() clj_rest = clj_file.read() version_substitute = re.sub( @@ -185,6 +185,7 @@ class GitApi(): def __init__(self): self.execution_api = ExecutionApi() + # pylint: disable=invalid-name def get_latest_n_commits(self, n: int): return self.execution_api.execute( f'git log --oneline --format="%s %b" -n {n}') @@ -203,11 +204,10 @@ class GitApi(): return self.execution_api.execute('git describe --tags --abbrev=0') def get_current_branch(self): - self.execution_api.execute('git branch --show-current') - return ''.join(self.execution_api.stdout).rstrip() + return ''.join(self.execution_api.execute('git branch --show-current')).rstrip() def init(self, default_branch: str = "main"): - self.execution_api.execute(f'git init') + self.execution_api.execute('git init') self.execution_api.execute(f'git checkout -b {default_branch}') def set_user_config(self, email: str, name: str): From 93d6063e6e85ec4f98bf10b385e010cb0437c233 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 15:31:54 +0200 Subject: [PATCH 14/21] Remove Cyclic import --- src/main/python/ddadevops/infrastructure/release_mixin/repo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py index 2dab0c1..588118a 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py @@ -5,7 +5,7 @@ from src.main.python.ddadevops.domain import ( ReleaseType, EnvironmentKeys, ) -from src.main.python.ddadevops.infrastructure.release_mixin import ( +from src.main.python.ddadevops.infrastructure.release_mixin.infrastructure_api import ( FileHandler, GitApi, EnvironmentApi, From 172d0b848f0491e99d1487f759b9d95d79d83f4d Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 15:32:15 +0200 Subject: [PATCH 15/21] Format --- src/main/python/ddadevops/domain/common.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/python/ddadevops/domain/common.py b/src/main/python/ddadevops/domain/common.py index 5ffdb14..fd15e27 100644 --- a/src/main/python/ddadevops/domain/common.py +++ b/src/main/python/ddadevops/domain/common.py @@ -24,7 +24,6 @@ class Validateable: issues = '\n'.join(self.validate()) raise ValueError(f"Invalid Validateable: {issues}") - class DnsRecord(Validateable): def __init__(self, fqdn, ipv4=None, ipv6=None): self.fqdn = fqdn From 9e519519cbfbc07d5274d4c371593ad989bc7484 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 28 Apr 2023 15:33:06 +0200 Subject: [PATCH 16/21] [Skip-CI] Fix method override --- src/main/python/ddadevops/domain/image.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/python/ddadevops/domain/image.py b/src/main/python/ddadevops/domain/image.py index 37a23aa..62e7c63 100644 --- a/src/main/python/ddadevops/domain/image.py +++ b/src/main/python/ddadevops/domain/image.py @@ -10,7 +10,6 @@ class Image(Validateable): dockerhub_user, dockerhub_password, devops: Devops, - build_dir_name="target", use_package_common_files=True, build_commons_path=None, docker_build_commons_dir_name="docker", @@ -25,5 +24,5 @@ class Image(Validateable): self.devops = devops def docker_build_commons_path(self): - list = [self.build_commons_path, self.docker_build_commons_dir_name] - return "/".join(filter_none(list)) + "/" + commons_path = [self.build_commons_path, self.docker_build_commons_dir_name] + return "/".join(filter_none(commons_path)) + "/" From 97c5c4eb91b327eaed918f0ba3f626199f841fbd Mon Sep 17 00:00:00 2001 From: erik Date: Tue, 2 May 2023 12:54:31 +0200 Subject: [PATCH 17/21] Add missing arguments --- .../python/ddadevops/application/release_mixin_services.py | 5 +++-- src/main/python/ddadevops/release_mixin.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/python/ddadevops/application/release_mixin_services.py b/src/main/python/ddadevops/application/release_mixin_services.py index 22c904c..6b33e52 100644 --- a/src/main/python/ddadevops/application/release_mixin_services.py +++ b/src/main/python/ddadevops/application/release_mixin_services.py @@ -22,11 +22,12 @@ class PrepareReleaseService(): class TagAndPushReleaseService(): - def __init__(self, git_api: GitApi): + def __init__(self, git_api: GitApi, main_branch: str): self.git_api = git_api + self.main_branch = main_branch def tag_release(self, release_repo: ReleaseContextRepository): - annotation = 'v' + release_repo.get_release().version.get_version_string() + annotation = 'v' + release_repo.get_release(self.main_branch).version.get_version_string() message = 'Release ' + annotation self.git_api.tag_annotated_second_last(annotation, message) diff --git a/src/main/python/ddadevops/release_mixin.py b/src/main/python/ddadevops/release_mixin.py index 597ee6a..d30e6d5 100644 --- a/src/main/python/ddadevops/release_mixin.py +++ b/src/main/python/ddadevops/release_mixin.py @@ -24,7 +24,7 @@ class ReleaseMixin(DevopsBuild): self.release_repo = ReleaseContextRepository(version_repo, release_type_repo) self.prepare_release_service = PrepareReleaseService() - self.tag_and_push_release_service = TagAndPushReleaseService(git_api) + self.tag_and_push_release_service = TagAndPushReleaseService(git_api, self.main_branch) def prepare_release(self): release = self.release_repo.get_release(self.main_branch) From 8fd243a60d199e7cd97183a151cfdeac708a0218 Mon Sep 17 00:00:00 2001 From: erik Date: Tue, 2 May 2023 13:10:27 +0200 Subject: [PATCH 18/21] WIP fixing tests --- src/test/python/release_mixin/mock_infrastructure.py | 7 +++---- src/test/python/release_mixin/test_services.py | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/test/python/release_mixin/mock_infrastructure.py b/src/test/python/release_mixin/mock_infrastructure.py index 81b09b5..78c731b 100644 --- a/src/test/python/release_mixin/mock_infrastructure.py +++ b/src/test/python/release_mixin/mock_infrastructure.py @@ -32,12 +32,11 @@ class MockReleaseTypeRepository(): return ReleaseType.MINOR class MockReleaseRepository(): - def __init__(self, version_repository: MockVersionRepository, release_type_repository: MockReleaseTypeRepository, main_branch: str): + def __init__(self, version_repository: MockVersionRepository, release_type_repository: MockReleaseTypeRepository): self.version_repository = version_repository self.release_type_repository = release_type_repository - self.main_branch = main_branch self.get_release_count = 0 - def get_release(self) -> ReleaseContext: + def get_release(self, main_branch) -> ReleaseContext: self.get_release_count += 1 - return ReleaseContext(self.release_type_repository.get_release_type(), self.version_repository.get_version(), self.main_branch) + return ReleaseContext(self.release_type_repository.get_release_type(), self.version_repository.get_version(), main_branch) diff --git a/src/test/python/release_mixin/test_services.py b/src/test/python/release_mixin/test_services.py index 35063d8..c7dbf80 100644 --- a/src/test/python/release_mixin/test_services.py +++ b/src/test/python/release_mixin/test_services.py @@ -4,17 +4,17 @@ from src.test.python.release_mixin import MockGitApi def test_prepare_release_service(): # init - mock_release_repo = MockReleaseRepository(MockVersionRepository(), MockReleaseTypeRepository(MockGitApi()), 'main') + mock_release_repo = MockReleaseRepository(MockVersionRepository(), MockReleaseTypeRepository(MockGitApi())) prepare_release_service = PrepareReleaseService() prepare_release_service.git_api = MockGitApi() - prepare_release_service.write_and_commit_release(mock_release_repo.get_release(), mock_release_repo.version_repository) + prepare_release_service.write_and_commit_release(mock_release_repo.get_release("main"), mock_release_repo.version_repository) #test assert prepare_release_service.git_api.add_file_count == 1 assert prepare_release_service.git_api.commit_count == 1 # init - prepare_release_service.write_and_commit_bump(mock_release_repo.get_release(), mock_release_repo.version_repository) + prepare_release_service.write_and_commit_bump(mock_release_repo.get_release("main"), mock_release_repo.version_repository) # test assert prepare_release_service.git_api.add_file_count == 2 @@ -22,8 +22,8 @@ def test_prepare_release_service(): def test_tag_and_push_release_service(): # init - mock_release_repo = MockReleaseRepository(MockVersionRepository(), MockReleaseTypeRepository(MockGitApi()), 'main') - tag_and_push_release_service = TagAndPushReleaseService(MockGitApi()) + mock_release_repo = MockReleaseRepository(MockVersionRepository(), MockReleaseTypeRepository(MockGitApi())) + tag_and_push_release_service = TagAndPushReleaseService(MockGitApi(), "main") tag_and_push_release_service.tag_release(mock_release_repo) tag_and_push_release_service.push_release() From e27db8647777f61b63b6a972b8af18907ca1d0ab Mon Sep 17 00:00:00 2001 From: erik Date: Tue, 2 May 2023 13:23:42 +0200 Subject: [PATCH 19/21] Fix logical error Using match would always produce None results, as we are matching a string exactly. Reintroducing more fuzzy "in" logic fixed tests. --- .../infrastructure/release_mixin/repo.py | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py index 588118a..dc27457 100644 --- a/src/main/python/ddadevops/infrastructure/release_mixin/repo.py +++ b/src/main/python/ddadevops/infrastructure/release_mixin/repo.py @@ -63,41 +63,36 @@ class ReleaseTypeRepository: return release_type_repo def __get_release_type_git(self) -> ReleaseType | None: - latest_commit = self.git_api.get_latest_commit() - - match latest_commit.upper(): - case ReleaseType.MAJOR.name: - return ReleaseType.MAJOR - case ReleaseType.MINOR.name: - return ReleaseType.MINOR - case ReleaseType.PATCH.name: - return ReleaseType.PATCH - case ReleaseType.SNAPSHOT.name: - return ReleaseType.SNAPSHOT - case _: - return None + latest_commit = self.git_api.get_latest_commit().upper() + if ReleaseType.MAJOR.name in latest_commit: + return ReleaseType.MAJOR + if ReleaseType.MINOR.name in latest_commit: + return ReleaseType.MINOR + if ReleaseType.PATCH.name in latest_commit: + return ReleaseType.PATCH + if ReleaseType.SNAPSHOT.name in latest_commit: + return ReleaseType.SNAPSHOT + return None def __get_release_type_environment(self) -> ReleaseType | None: release_name = self.environment_api.get( EnvironmentKeys.DDADEVOPS_RELEASE_TYPE.name - ) + ).upper() if release_name is None: raise ValueError( "Release Name not found. Is the Environment correctly configured?" ) - match release_name.upper(): - case ReleaseType.MAJOR.name: - return ReleaseType.MAJOR - case ReleaseType.MINOR.name: - return ReleaseType.MINOR - case ReleaseType.PATCH.name: - return ReleaseType.PATCH - case ReleaseType.SNAPSHOT.name: - return ReleaseType.SNAPSHOT - case _: - return None + if ReleaseType.MAJOR.name in release_name: + return ReleaseType.MAJOR + if ReleaseType.MINOR.name in release_name: + return ReleaseType.MINOR + if ReleaseType.PATCH.name in release_name: + return ReleaseType.PATCH + if ReleaseType.SNAPSHOT.name in release_name: + return ReleaseType.SNAPSHOT + return None def get_release_type(self) -> ReleaseType | None: if self.get_from_git: From 6171d15241486e92ea8e81bc9df72c44acc7189e Mon Sep 17 00:00:00 2001 From: erik Date: Tue, 2 May 2023 13:31:14 +0200 Subject: [PATCH 20/21] [Skip-CI] Remove logging from domain --- src/main/python/ddadevops/domain/common.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/python/ddadevops/domain/common.py b/src/main/python/ddadevops/domain/common.py index fd15e27..076bfd3 100644 --- a/src/main/python/ddadevops/domain/common.py +++ b/src/main/python/ddadevops/domain/common.py @@ -1,5 +1,4 @@ from typing import List -import logging import deprecation def filter_none(list_to_filter): @@ -45,7 +44,6 @@ class Devops(Validateable): self.stage = stage self.name = name self.project_root_path = project_root_path - logging.warning(f"Set project root in DevOps {self.project_root_path}") self.module = module if not name: self.name = module @@ -61,7 +59,6 @@ class Devops(Validateable): def build_path(self): path = [self.project_root_path, self.build_dir_name, self.name, self.module] - logging.warning(f"Set project build_path in Devops {path}") return "/".join(filter_none(path)) def __put__(self, key, value): From 1d6bffcc975bb0c6d004ecae9f461ee61957abcd Mon Sep 17 00:00:00 2001 From: Clemens Date: Fri, 5 May 2023 08:54:21 +0200 Subject: [PATCH 21/21] Remove invalid pylint option --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1abb7b6..5c1518f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,7 +27,7 @@ pylint: stage: lint&test script: - pip install -r dev_requirements.txt - - pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W1203,W0719,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 src/main/python/ddadevops/ pytest: stage: lint&test