Skip to content

Commit 44b09ee

Browse files
authored
Lifecycle python to 3.11 drop 3.6 (#427)
1 parent 745f5ca commit 44b09ee

File tree

6 files changed

+69
-66
lines changed

6 files changed

+69
-66
lines changed

.github/workflows/pr-ci.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
AWS_REGION: us-east-1
1515
strategy:
1616
matrix:
17-
python: [3.7, 3.8, 3.9]
17+
python: ["3.8", "3.9", "3.10", "3.11"]
1818
java: [8, 11]
1919
runs-on: ubuntu-latest
2020
steps:

.pre-commit-config.yaml

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
repos:
22
- repo: https://github.com/pre-commit/mirrors-isort
3-
rev: v5.9.3
3+
rev: v5.10.1
44
hooks:
55
- id: isort
6-
# language_version: python3.6
76
- repo: https://github.com/ambv/black
8-
rev: 22.3.0
7+
rev: 23.9.1
98
hooks:
109
- id: black
11-
# language_version: python3.6
1210
- repo: https://github.com/pre-commit/pre-commit-hooks
13-
rev: v2.0.0
11+
rev: v4.5.0
1412
hooks:
1513
- id: check-case-conflict
1614
- id: end-of-file-fixer
1715
- id: mixed-line-ending
1816
args:
1917
- --fix=lf
2018
- id: trailing-whitespace
19+
- id: pretty-format-json
20+
args:
21+
- --autofix
22+
- --indent=4
23+
- --no-sort-keys
24+
- id: check-merge-conflict
25+
- id: check-yaml
26+
- repo: https://github.com/pycqa/flake8
27+
rev: 6.1.0
28+
hooks:
2129
- id: flake8
2230
additional_dependencies:
2331
- flake8-bugbear>=19.3.0
@@ -26,22 +34,14 @@ repos:
2634
- flake8-comprehensions>=2.1.0
2735
- flake8-debugger>=3.1.0
2836
- flake8-pep3101>=1.2.1
29-
# language_version: python3.6
30-
- id: pretty-format-json
31-
args:
32-
- --autofix
33-
- --indent=4
34-
- --no-sort-keys
35-
- id: check-merge-conflict
36-
- id: check-yaml
3737
- repo: https://github.com/pre-commit/pygrep-hooks
38-
rev: v1.9.0
38+
rev: v1.10.0
3939
hooks:
4040
- id: python-check-blanket-noqa
4141
- id: python-check-mock-methods
4242
- id: python-no-log-warn
4343
- repo: https://github.com/PyCQA/bandit
44-
rev: 1.7.0 # TODO: update once a release > 1.5.1 hits with this change in
44+
rev: 1.7.5 # TODO: update once a release > 1.5.1 hits with this change in
4545
hooks:
4646
- id: bandit
4747
files: "^python/"

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ If you are using this package to build resource providers for CloudFormation, in
1111

1212
**Prerequisites**
1313

14-
- Python version 3.6 or above
14+
- Python version 3.8 or above
1515
- Your choice of Java IDE
1616
- Lombok: The code generated by the CloudFormation CLI uses [Lombok](https://projectlombok.org/), which requires support in IDEs for some syntax highlighting to work. For the best development experience, it is recommended you install Lombok support in your IDE.
1717

python/rpdk/java/codegen.py

+39-35
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@
3131
def logdebug(func: object):
3232
def wrapper(*args, **kwargs):
3333
log_msg = func.__name__ if not func.__doc__ else func.__doc__
34-
entry_message = "{} started".format(log_msg)
34+
entry_message = f"{log_msg} started".format()
3535
LOG.debug(entry_message)
3636
if "entity" in kwargs:
37-
writing_message = "Writing {}".format(kwargs["entity"])
37+
writing_message = f"Writing {log_msg}"
3838
LOG.debug(writing_message)
3939
result = func(*args, **kwargs)
40-
exit_message = "{} complete".format(log_msg)
40+
exit_message = f"{log_msg} complete"
4141
LOG.debug(exit_message)
4242
return result
4343

@@ -109,9 +109,7 @@ def _prompt_for_namespace(self, project):
109109

110110
namespace = tuple(safe_reserved(s.lower()) for s in namespace)
111111

112-
prompt = "Enter a package name (empty for default '{}'): ".format(
113-
".".join(namespace)
114-
)
112+
prompt = f"Enter a package name (empty for default '{'.'.join(namespace)}'): "
115113

116114
self.namespace = input_with_validation(prompt, validate_namespace(namespace))
117115
project.settings["namespace"] = self.namespace
@@ -225,7 +223,7 @@ def init_shared(self, project, src, tst, resources):
225223
path = project.root / "pom.xml"
226224
LOG.debug("Writing Maven POM: %s", path)
227225
template = self.env.get_template("init/shared/pom.xml")
228-
artifact_id = "{}-handler".format(project.hypenated_name)
226+
artifact_id = f"{project.hypenated_name}-handler"
229227
jacoco_excluded_paths = self._get_jacoco_maven_plugin_excluded_paths(
230228
project=project,
231229
)
@@ -355,14 +353,18 @@ def init_hook_handlers(self, project, src, tst):
355353
"""Writing hook stub handlers and tests"""
356354
handlers = project.schema.get("handlers")
357355
for operation in HOOK_OPERATIONS:
358-
entity = "{}HookHandler.java".format(operation)
359-
entity_test = "{}HookHandlerTest.java".format(operation)
356+
entity = f"{operation}HookHandler.java"
357+
entity_test = f"{operation}HookHandlerTest.java"
360358

361-
stub_entity = "Stub{}HookHandler.java".format(
362-
operation if self._is_aws_guided(project) else ""
359+
stub_entity = (
360+
"Stub"
361+
f"{operation if self._is_aws_guided(project) else ''}"
362+
"HookHandler.java"
363363
)
364-
stub_entity_test = "Stub{}HookHandlerTest.java".format(
365-
operation if self._is_aws_guided(project) else ""
364+
stub_entity_test = (
365+
"Stub"
366+
f"{operation if self._is_aws_guided(project) else ''}"
367+
"HookHandlerTest.java"
366368
)
367369
target_names = handlers.get(operation[0].lower() + operation[1:], {}).get(
368370
"targetNames", ["My::Example::Resource"]
@@ -391,14 +393,17 @@ def init_resource_handlers(self, project, src, tst):
391393
"""Writing stub handlers and tests"""
392394
pojo_name = "ResourceModel"
393395
for operation in RESOURCE_OPERATIONS:
394-
entity = "{}Handler.java".format(operation)
395-
entity_test = "{}HandlerTest.java".format(operation)
396-
397-
stub_entity = "Stub{}Handler.java".format(
398-
operation if operation == "List" or self._is_aws_guided(project) else ""
396+
entity = f"{operation}Handler.java"
397+
entity_test = f"{operation}HandlerTest.java"
398+
399+
stub_entity = (
400+
"Stub"
401+
# pylint: disable=line-too-long
402+
f"{operation if operation == 'List' or self._is_aws_guided(project) else ''}" # noqa: B950
403+
"Handler.java"
399404
)
400-
stub_entity_test = "Stub{}HandlerTest.java".format(
401-
operation if operation == "List" else ""
405+
stub_entity_test = (
406+
f"Stub{operation if operation == 'List' else ''}HandlerTest.java"
402407
)
403408

404409
self._writing_component(
@@ -535,7 +540,7 @@ def generate_resource(self, src, project):
535540
pojo_template = self.env.get_template("generate/POJO.java")
536541

537542
for model_name, properties in models.items():
538-
path = src / "{}.java".format(model_name)
543+
path = src / f"{model_name}.java"
539544
LOG.debug("%s POJO: %s", model_name, path)
540545

541546
if model_name == "ResourceModel":
@@ -609,7 +614,7 @@ def generate_hook(self, src, project): # pylint: disable=too-many-statements
609614
pojo_template = self.env.get_template("generate/POJO.java")
610615

611616
for model_name, properties in models.items():
612-
path = src / "{}.java".format(model_name)
617+
path = src / f"{model_name}.java"
613618
LOG.debug("%s POJO: %s", model_name, path)
614619

615620
if model_name == "HookInputModel": # pragma: no cover
@@ -640,11 +645,10 @@ def generate_hook(self, src, project): # pylint: disable=too-many-statements
640645
target_name = "".join(
641646
[s.capitalize() for s in target_namespace]
642647
) # awssqsqueue -> AwsSqsQueue
643-
target_schema_file_name = "{}.json".format(
644-
"-".join(target_namespace)
645-
) # awssqsqueue -> aws-sqs-queue.json
646-
target_model_package_name = "{}.model.{}".format(
647-
self.package_name, ".".join(target_namespace)
648+
target_schema_file_name = f"{'-'.join(target_namespace)}.json"
649+
# awssqsqueue -> aws-sqs-queue.json
650+
target_model_package_name = (
651+
f"{self.package_name}.model.{'.'.join(target_namespace)}"
648652
)
649653
target_model_dir = (src / "model").joinpath(*target_namespace)
650654
target_model_dir.mkdir(parents=True, exist_ok=True)
@@ -691,7 +695,7 @@ def generate_hook(self, src, project): # pylint: disable=too-many-statements
691695
pojo_template = self.env.get_template("generate/POJO.java")
692696

693697
for model_name, properties in models.items():
694-
path = target_model_dir / "{}.java".format(model_name)
698+
path = target_model_dir / f"{model_name}.java"
695699
LOG.debug("%s POJO: %s", model_name, path)
696700

697701
if model_name == target_name:
@@ -724,7 +728,7 @@ def generate_hook(self, src, project): # pylint: disable=too-many-statements
724728
)
725729
project.overwrite(path, contents)
726730

727-
path = target_model_dir / "{}TargetModel.java".format(target_name)
731+
path = target_model_dir / f"{target_name}TargetModel.java"
728732
contents = base_template.render(
729733
type_name=target_type_name,
730734
model_name=target_name,
@@ -799,10 +803,10 @@ def _update_settings(self, project):
799803
)
800804
if java_plugin_dependency_version < MINIMUM_JAVA_DEPENDENCY_VERSION:
801805
raise JavaPluginVersionNotSupportedError(
802-
"'aws-cloudformation-rpdk-java-plugin' {} is no longer supported."
803-
"Please update it in pom.xml to version {} or above.".format(
804-
java_plugin_dependency_version, MINIMUM_JAVA_DEPENDENCY_VERSION
805-
)
806+
f"'aws-cloudformation-rpdk-java-plugin' "
807+
f"{java_plugin_dependency_version} "
808+
"is no longer supported. Please update it in pom.xml to version "
809+
f"{MINIMUM_JAVA_DEPENDENCY_VERSION} or above."
806810
)
807811
except JavaPluginNotFoundError:
808812
LOG.info(
@@ -833,7 +837,7 @@ def _update_settings(self, project):
833837
@staticmethod
834838
def _find_jar(project):
835839
jar_glob = list(
836-
(project.root / "target").glob("{}-*.jar".format(project.hypenated_name))
840+
(project.root / "target").glob(f"{project.hypenated_name}-*.jar")
837841
)
838842
if not jar_glob:
839843
LOG.debug("No Java Archives matched at %s", str(project.root / "target"))
@@ -855,7 +859,7 @@ def _find_jar(project):
855859
@staticmethod
856860
def _get_java_plugin_dependency_version(project):
857861
try:
858-
tree = ET.parse(project.root / "pom.xml")
862+
tree = ET.parse(project.root / "pom.xml") # nosec
859863
root = tree.getroot()
860864
namespace = {"mvn": "http://maven.apache.org/POM/4.0.0"}
861865
plugin_dependency_version = root.find(

setup.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def find_version(*file_paths):
3737
include_package_data=True,
3838
zip_safe=True,
3939
install_requires=["cloudformation-cli>=0.2.23"],
40-
python_requires=">=3.6",
40+
python_requires=">=3.8",
4141
entry_points={"rpdk.v1.languages": ["java = rpdk.java.codegen:JavaLanguagePlugin"]},
4242
license="Apache License 2.0",
4343
classifiers=[
@@ -50,9 +50,10 @@ def find_version(*file_paths):
5050
"Topic :: Software Development :: Code Generators",
5151
"Operating System :: OS Independent",
5252
"Programming Language :: Python :: 3 :: Only",
53-
"Programming Language :: Python :: 3.6",
54-
"Programming Language :: Python :: 3.7",
5553
"Programming Language :: Python :: 3.8",
54+
"Programming Language :: Python :: 3.9",
55+
"Programming Language :: Python :: 3.10",
56+
"Programming Language :: Python :: 3.11",
5657
],
5758
keywords="Amazon Web Services AWS CloudFormation",
5859
)

tests/test_codegen.py

+9-11
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def mock_input_with_validation(prompt, validate): # pylint: disable=unused-argu
104104
{"test": lambda: JavaLanguagePlugin},
105105
clear=True,
106106
), patch("rpdk.java.codegen.input_with_validation", new=mock_cli):
107-
project.init("AWS::Foo::{}".format(RESOURCE), "test")
107+
project.init(f"AWS::Foo::{RESOURCE}", "test")
108108
return project
109109

110110

@@ -124,7 +124,7 @@ def mock_input_with_validation(prompt, validate): # pylint: disable=unused-argu
124124
{"test": lambda: JavaLanguagePlugin},
125125
clear=True,
126126
), patch("rpdk.java.codegen.input_with_validation", new=mock_cli):
127-
hook_project.init_hook("AWS::Foo::{}".format(RESOURCE), "test")
127+
hook_project.init_hook(f"AWS::Foo::{RESOURCE}", "test")
128128
return hook_project
129129

130130

@@ -134,14 +134,14 @@ def test_java_language_plugin_module_is_set():
134134

135135

136136
def test_initialize(project):
137-
expected_group_id = "software.amazon.foo.{}".format(RESOURCE.lower())
138-
handler = "{}.HandlerWrapper::handleRequest".format(expected_group_id)
137+
expected_group_id = f"software.amazon.foo.{RESOURCE.lower()}"
138+
handler = f"{expected_group_id}.HandlerWrapper::handleRequest"
139139
assert_test_initialize(project, handler, expected_group_id)
140140

141141

142142
def test_hook_initialize(hook_project):
143-
expected_group_id = "software.amazon.foo.{}".format(HOOK.lower())
144-
handler = "{}.HookHandlerWrapper::handleRequest".format(expected_group_id)
143+
expected_group_id = f"software.amazon.foo.{HOOK.lower()}"
144+
handler = f"{expected_group_id}.HookHandlerWrapper::handleRequest"
145145
assert_test_initialize(hook_project, handler, expected_group_id)
146146

147147

@@ -158,9 +158,7 @@ def assert_test_initialize(
158158
with path.open("r", encoding="utf-8") as f:
159159
template = yaml.safe_load(f)
160160
handler_properties = template["Resources"]["TypeFunction"]["Properties"]
161-
code_uri = "./target/{}-handler-1.0-SNAPSHOT.jar".format(
162-
test_project.hypenated_name
163-
)
161+
code_uri = f"./target/{test_project.hypenated_name}-handler-1.0-SNAPSHOT.jar"
164162
assert handler_properties["CodeUri"] == code_uri
165163
assert handler_properties["Handler"] == handler
166164
assert handler_properties["Runtime"] == test_project._plugin.RUNTIME
@@ -372,7 +370,7 @@ def make_target(project, count):
372370
target.mkdir(exist_ok=True)
373371
jar_paths = []
374372
for i in range(count):
375-
jar_path = target / "{}-{}.0-SNAPSHOT.jar".format(project.hypenated_name, i)
373+
jar_path = target / f"{project.hypenated_name}-{i}.0-SNAPSHOT.jar"
376374
jar_path.touch()
377375
jar_paths.append(jar_path)
378376
return jar_paths
@@ -423,7 +421,7 @@ def test_generate_without_java_plugin_in_pom_should_not_fail(project):
423421

424422

425423
def test__get_plugin_version_invalid_pom(project):
426-
with open(project.root / "pom.xml", "w") as pom:
424+
with open(project.root / "pom.xml", "w", encoding="utf-8") as pom:
427425
pom.write("invalid pom")
428426
pom.close()
429427
with pytest.raises(InvalidMavenPOMError):

0 commit comments

Comments
 (0)