diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ac4fe899..667388ef 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11"] defaults: run: working-directory: . diff --git a/CHANGELOG.md b/CHANGELOG.md index b3994500..bc86f462 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,11 @@ This project adheres to [Semantic Versioning](http://semver.org/) and [Keep a Ch - adding info for destroy and list deployments when no deployments found - refactored git support logic to separate python file - added verbose messaging related to git issues +- updated `black~=24.3.0` in requirements-dev as per dependabot +- updated `werkzeug~=2.3.8` in requirements-dev as per dependabot +- removed explicit support for python 3.7 + - this was only due to support for black in requirements-dev, but was also removed from setup.py + ### Fixes - Add schema validation step checking that either `value` or `value_from` is present for each parameter diff --git a/requirements-dev.in b/requirements-dev.in index 79bb9889..5f2a5652 100644 --- a/requirements-dev.in +++ b/requirements-dev.in @@ -1,5 +1,5 @@ awscli~=1.31.13 -black~=23.3.0 +black~=24.3.0 certifi~=2023.7.22 check-manifest~=0.48 flake8~=5.0.4 @@ -22,4 +22,5 @@ sphinx-rtd-theme~=1.0.0 sphinx~=4.3.0 moto[s3,sts,iam,codebuild,secretsmanager,ssm]~=4.0.9 requests~=2.31.0 +werkzeug~=2.3.8 urllib3~=1.26.18 \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt index 6f14483b..964972ca 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.7 +# This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --resolver=backtracking requirements-dev.in +# pip-compile requirements-dev.in # alabaster==0.7.13 # via sphinx @@ -14,7 +14,7 @@ awscli==1.31.13 # via -r requirements-dev.in babel==2.14.0 # via sphinx -black==23.3.0 +black==24.3.0 # via -r requirements-dev.in bleach==6.0.0 # via readme-renderer @@ -48,9 +48,7 @@ click==8.1.7 colorama==0.4.4 # via awscli coverage[toml]==7.2.7 - # via - # coverage - # pytest-cov + # via pytest-cov cryptography==42.0.4 # via moto docutils==0.16 @@ -71,14 +69,7 @@ imagesize==1.4.1 # via sphinx importlib-metadata==4.2.0 # via - # attrs - # build - # click - # flake8 # keyring - # moto - # pluggy - # pytest # twine iniconfig==2.0.0 # via pytest @@ -119,9 +110,7 @@ mdurl==0.1.2 more-itertools==9.1.0 # via jaraco-classes moto[codebuild,iam,s3,secretsmanager,ssm,sts]==4.0.13 - # via - # -r requirements-dev.in - # moto + # via -r requirements-dev.in mypy==0.991 # via -r requirements-dev.in mypy-extensions==1.0.0 @@ -185,8 +174,6 @@ python-dateutil==2.8.2 # via # botocore # moto -pytz==2024.1 - # via babel pyyaml==6.0.1 # via # awscli @@ -261,11 +248,6 @@ trove-classifiers==2024.2.22 # via pyroma twine==4.0.2 # via -r requirements-dev.in -typed-ast==1.5.5 - # via - # astroid - # black - # mypy types-pyyaml==6.0.12.12 # via # -r requirements-dev.in @@ -276,13 +258,8 @@ typing-extensions==4.7.1 # via # astroid # black - # importlib-metadata - # markdown-it-py # mypy # myst-parser - # platformdirs - # responses - # rich unidecode==1.3.8 # via sphinx-autoapi urllib3==1.26.18 @@ -294,8 +271,10 @@ urllib3==1.26.18 # twine webencodings==0.5.1 # via bleach -werkzeug==2.2.3 - # via moto +werkzeug==2.3.8 + # via + # -r requirements-dev.in + # moto wheel==0.38.4 # via # -r requirements-dev.in diff --git a/seedfarmer/checksum.py b/seedfarmer/checksum.py index 537f22f9..c8db589f 100644 --- a/seedfarmer/checksum.py +++ b/seedfarmer/checksum.py @@ -128,9 +128,11 @@ def scandir(dirname: str) -> List[str]: subfolders = [f.path for f in os.scandir(dirname) if f.is_dir()] for dirname in list(subfolders): # ignore all hidden directories and any dir already in .gitignore - subfolders.extend(scandir(dirname)) if not os.path.split(dirname)[1].startswith(".") and not _evaluate_file( - dirname, ignore_maps - ) else None + ( + subfolders.extend(scandir(dirname)) + if not os.path.split(dirname)[1].startswith(".") and not _evaluate_file(dirname, ignore_maps) + else None + ) return subfolders _ = scandir(os.path.join(project_path, module_path)) diff --git a/seedfarmer/cli_groups/_list_group.py b/seedfarmer/cli_groups/_list_group.py index 6a29cb81..af349bf0 100644 --- a/seedfarmer/cli_groups/_list_group.py +++ b/seedfarmer/cli_groups/_list_group.py @@ -152,14 +152,22 @@ def list_dependencies( if dep_manifest: module_depends_on_dict, module_dependencies_dict = du.generate_dependency_maps(manifest=dep_manifest) - print_dependency_list( - header_message=f"Modules that {module} in {group} of {deployment} DEPENDS ON : ", - modules=module_depends_on_dict[f"{group}-{module}"], - ) if module_depends_on_dict.get(f"{group}-{module}") else None - print_dependency_list( - header_message=f"Modules that ARE DEPENDENT ON {module} in {group} of {deployment} : ", - modules=module_dependencies_dict[f"{group}-{module}"], - ) if module_dependencies_dict.get(f"{group}-{module}") else None + ( + print_dependency_list( + header_message=f"Modules that {module} in {group} of {deployment} DEPENDS ON : ", + modules=module_depends_on_dict[f"{group}-{module}"], + ) + if module_depends_on_dict.get(f"{group}-{module}") + else None + ) + ( + print_dependency_list( + header_message=f"Modules that ARE DEPENDENT ON {module} in {group} of {deployment} : ", + modules=module_dependencies_dict[f"{group}-{module}"], + ) + if module_dependencies_dict.get(f"{group}-{module}") + else None + ) @list.command(name="deployspec", help="List the stored deployspec of a module") diff --git a/seedfarmer/commands/_deployment_commands.py b/seedfarmer/commands/_deployment_commands.py index c4b4c76f..b90fb674 100644 --- a/seedfarmer/commands/_deployment_commands.py +++ b/seedfarmer/commands/_deployment_commands.py @@ -124,13 +124,17 @@ def _execute_deploy( f"Invalid value for ModuleManifest.deploy_spec in group {group_name} and module : {module_manifest.name}" ) - du.prepare_ssm_for_deploy( - deployment_name=deployment_manifest.name, - group_name=group_name, - module_manifest=module_manifest, - account_id=target_account_id, - region=target_region, - ) if deployment_manifest.name else None + ( + du.prepare_ssm_for_deploy( + deployment_name=deployment_manifest.name, + group_name=group_name, + module_manifest=module_manifest, + account_id=target_account_id, + region=target_region, + ) + if deployment_manifest.name + else None + ) return commands.deploy_module( deployment_name=cast(str, deployment_manifest.name), @@ -450,9 +454,13 @@ def _exec_destroy(args: Dict[str, Any]) -> Optional[ModuleDeploymentResponse]: for _module in _group.modules: _process_module_path(module=_module) if _module.path.startswith("git::") else None - _process_data_files( - data_files=_module.data_files, module_name=_module.name, group_name=_group.name - ) if _module.data_files is not None else None + ( + _process_data_files( + data_files=_module.data_files, module_name=_module.name, group_name=_group.name + ) + if _module.data_files is not None + else None + ) if _module and _module.deploy_spec: params = [ @@ -474,9 +482,11 @@ def _exec_destroy(args: Dict[str, Any]) -> Optional[ModuleDeploymentResponse]: ] destroy_response = list(workers.map(_exec_destroy, params)) _logger.debug(destroy_response) - print_modules_build_info("Build Info Debug Data", destroy_response) if _logger.isEnabledFor( - logging.DEBUG - ) else None + ( + print_modules_build_info("Build Info Debug Data", destroy_response) + if _logger.isEnabledFor(logging.DEBUG) + else None + ) for dep_resp_object in destroy_response: if dep_resp_object and dep_resp_object.status in ["ERROR", "error", "Error"]: _logger.error("At least one module failed to destroy...exiting deployment") @@ -555,9 +565,11 @@ def deploy_deployment( _process_module_path(module=module) if module.path.startswith("git::") else None - _process_data_files( - data_files=module.data_files, module_name=module.name, group_name=group.name - ) if module.data_files is not None else None + ( + _process_data_files(data_files=module.data_files, module_name=module.name, group_name=group.name) + if module.data_files is not None + else None + ) deployspec_path = get_deployspec_path(str(module.get_local_path())) with open(deployspec_path) as module_spec_file: @@ -615,9 +627,13 @@ def deploy_deployment( name=group.name, path=group.path, concurrency=group.concurrency, modules=modules_to_deploy ) ) - _print_modules( - f"Modules deployed that are up to date (will not be changed): {deployment_name} ", unchanged_modules - ) if unchanged_modules else None + ( + _print_modules( + f"Modules deployed that are up to date (will not be changed): {deployment_name} ", unchanged_modules + ) + if unchanged_modules + else None + ) _deploy_validated_deployment( deployment_manifest=deployment_manifest, deployment_manifest_wip=deployment_manifest_wip, diff --git a/seedfarmer/commands/_module_commands.py b/seedfarmer/commands/_module_commands.py index ea04e147..dbbb132b 100644 --- a/seedfarmer/commands/_module_commands.py +++ b/seedfarmer/commands/_module_commands.py @@ -56,9 +56,9 @@ def _env_vars( ) -> Dict[str, str]: env_vars = ( { - f"{_param('PARAMETER', use_project_prefix)}_{p.upper_snake_case}": p.value - if isinstance(p.value, str) or isinstance(p.value, EnvVar) - else json.dumps(p.value) + f"{_param('PARAMETER', use_project_prefix)}_{p.upper_snake_case}": ( + p.value if isinstance(p.value, str) or isinstance(p.value, EnvVar) else json.dumps(p.value) + ) for p in parameters } if parameters diff --git a/seedfarmer/mgmt/deploy_utils.py b/seedfarmer/mgmt/deploy_utils.py index fb84a3e4..11e2a055 100644 --- a/seedfarmer/mgmt/deploy_utils.py +++ b/seedfarmer/mgmt/deploy_utils.py @@ -296,29 +296,41 @@ def prepare_ssm_for_deploy( data=module_manifest_wip.model_dump(), session=session, ) - mi.write_deployspec( - deployment=deployment_name, - group=group_name, - module=module_manifest.name, - data=module_manifest.deploy_spec.model_dump(), - session=session, - ) if module_manifest.deploy_spec else None - mi.write_module_md5( - deployment=deployment_name, - group=group_name, - module=module_manifest.name, - hash=module_manifest.deployspec_md5, - type=mi.ModuleConst.DEPLOYSPEC, - session=session, - ) if module_manifest.deployspec_md5 else None - mi.write_module_md5( - deployment=deployment_name, - group=group_name, - module=module_manifest.name, - hash=module_manifest.manifest_md5, - type=mi.ModuleConst.MANIFEST, - session=session, - ) if module_manifest.manifest_md5 else None + ( + mi.write_deployspec( + deployment=deployment_name, + group=group_name, + module=module_manifest.name, + data=module_manifest.deploy_spec.model_dump(), + session=session, + ) + if module_manifest.deploy_spec + else None + ) + ( + mi.write_module_md5( + deployment=deployment_name, + group=group_name, + module=module_manifest.name, + hash=module_manifest.deployspec_md5, + type=mi.ModuleConst.DEPLOYSPEC, + session=session, + ) + if module_manifest.deployspec_md5 + else None + ) + ( + mi.write_module_md5( + deployment=deployment_name, + group=group_name, + module=module_manifest.name, + hash=module_manifest.manifest_md5, + type=mi.ModuleConst.MANIFEST, + session=session, + ) + if module_manifest.manifest_md5 + else None + ) mi.remove_module_md5( deployment=deployment_name, group=group_name, diff --git a/seedfarmer/output_utils.py b/seedfarmer/output_utils.py index 220d14d6..aa47b112 100644 --- a/seedfarmer/output_utils.py +++ b/seedfarmer/output_utils.py @@ -158,9 +158,11 @@ def print_modules_build_info( console.print( f" [cyan]{r_obj.deployment}-{r_obj.group}-{r_obj.module} status: {r_obj.status}", crop=False # type: ignore ) - console.print( - f" {r_obj.codeseeder_metadata.build_url}", crop=False # type: ignore - ) if r_obj.codeseeder_metadata and r_obj.codeseeder_metadata.build_url else None # type: ignore + ( + console.print(f" {r_obj.codeseeder_metadata.build_url}", crop=False) # type: ignore + if r_obj.codeseeder_metadata and r_obj.codeseeder_metadata.build_url # type: ignore + else None + ) def print_errored_modules_build_info( @@ -182,9 +184,11 @@ def print_errored_modules_build_info( for r_obj in modules_data: if r_obj and r_obj.status in ["ERROR", "error", "Error"]: console.print(f" [cyan]{r_obj.deployment}-{r_obj.group}-{r_obj.module}", crop=False) - console.print( - f" {r_obj.codeseeder_metadata.build_url}", crop=False - ) if r_obj.codeseeder_metadata and r_obj.codeseeder_metadata.build_url else None + ( + console.print(f" {r_obj.codeseeder_metadata.build_url}", crop=False) + if r_obj.codeseeder_metadata and r_obj.codeseeder_metadata.build_url + else None + ) def print_dependency_error_list(header_message: str, errored_list: List[Dict[str, List[str]]]) -> None: diff --git a/seedfarmer/services/session_manager.py b/seedfarmer/services/session_manager.py index 9f79cf16..8f994af5 100644 --- a/seedfarmer/services/session_manager.py +++ b/seedfarmer/services/session_manager.py @@ -48,16 +48,13 @@ def get_or_create( profile: Optional[str] = None, enable_reaper: bool = False, **kwargs: Optional[Any], - ) -> Any: - ... + ) -> Any: ... @abstractproperty - def toolchain_session(self) -> Session: - ... + def toolchain_session(self) -> Session: ... @abstractmethod - def get_deployment_session(self, account_id: str, region_name: str) -> Session: - ... + def get_deployment_session(self, account_id: str, region_name: str) -> Session: ... class SessionManager(ISessionManager, metaclass=SingletonMeta): diff --git a/setup.py b/setup.py index e5d73088..f32e113f 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ license=about["__license__"], packages=find_packages(include=["seed-farmer", "seedfarmer", "seedfarmer.*", "seed-farmer.*"]), keywords=["aws", "cdk"], - python_requires=">=3.7,<3.12", + python_requires=">=3.8,<3.12", install_requires=[ "aws-codeseeder~=0.11.0", "cookiecutter~=2.1.0",