Skip to content

Commit 0c00340

Browse files
Generate models for hook targets (#251)
1 parent 1e0b1a9 commit 0c00340

File tree

3 files changed

+50
-6
lines changed

3 files changed

+50
-6
lines changed

python/rpdk/python/codegen.py

+46-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
from rpdk.core.data_loaders import resource_stream
1010
from rpdk.core.exceptions import DownstreamError, SysExitRecommendedError
1111
from rpdk.core.init import input_with_validation
12-
from rpdk.core.jsonutils.resolver import ContainerType, resolve_models
12+
from rpdk.core.jsonutils.resolver import (
13+
UNDEFINED,
14+
ContainerType,
15+
ResolvedType,
16+
resolve_models,
17+
)
1318
from rpdk.core.plugin_base import LanguagePlugin
1419
from rpdk.core.project import ARTIFACT_TYPE_HOOK
1520
from subprocess import PIPE, CalledProcessError, run as subprocess_run # nosec
@@ -210,8 +215,48 @@ def generate(self, project):
210215
contents = template.render(support_lib_pkg=SUPPORT_LIB_PKG, models=models)
211216
project.overwrite(path, contents)
212217

218+
if project.artifact_type == ARTIFACT_TYPE_HOOK:
219+
self._generate_target_models(project)
220+
213221
LOG.debug("Generate complete")
214222

223+
def _generate_target_models(self, project):
224+
target_model_dir = self.package_root / self.package_name / "target_models"
225+
226+
LOG.debug("Removing generated models: %s", target_model_dir)
227+
shutil.rmtree(target_model_dir, ignore_errors=True)
228+
229+
target_model_dir.mkdir(parents=True, exist_ok=True)
230+
template = self.env.get_template("target_model.py")
231+
232+
for target_type_name, target_info in project.target_info.items():
233+
target_schema = target_info["Schema"]
234+
target_namespace = [
235+
s.lower() for s in target_type_name.split("::")
236+
] # AWS::SQS::Queue -> awssqsqueue
237+
target_name = "".join(
238+
[s.capitalize() for s in target_namespace]
239+
) # awssqsqueue -> AwsSqsQueue
240+
target_model_file = "{}.py".format(
241+
"_".join(target_namespace)
242+
) # awssqsqueue -> aws_sqs_queue.py
243+
244+
models = resolve_models(target_schema, target_name)
245+
246+
# TODO: Remove once tagging is fully supported
247+
if models.get(target_name, {}).get("Tags"): # pragma: no cover
248+
models[target_name]["Tags"] = ResolvedType(
249+
ContainerType.PRIMITIVE, UNDEFINED
250+
)
251+
252+
path = target_model_dir / target_model_file
253+
LOG.debug("Writing file: %s", path)
254+
255+
contents = template.render(
256+
support_lib_pkg=SUPPORT_LIB_PKG, models=models, target_name=target_name
257+
)
258+
project.overwrite(path, contents)
259+
215260
# pylint: disable=unused-argument
216261
# the argument "project" is not used here but is used in codegen.py of other plugins
217262
# this method is called in cloudformation-cli/src/rpdk/core/project.py

python/rpdk/python/templates/target_model.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,8 @@ def _deserialize(
4343
if not json_data:
4444
return None
4545
{% if model == (target_name) %}
46-
data = dict(filter(lambda e: e[0] in cls.__dataclass_fields__, json_data.items()))
47-
if not data:
48-
return None
49-
5046
dataclasses = {n: o for n, o in getmembers(sys.modules[__name__]) if isclass(o)}
51-
recast_object(cls, data, dataclasses)
47+
recast_object(cls, json_data, dataclasses)
5248
{% endif %}
5349
return cls(
5450
{% for name, type in properties.items() %}

tests/plugin/codegen_test.py

+3
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,9 @@ def test_generate_hook(hook_project):
415415
print("Project files: ", get_files_in_project(hook_project))
416416
assert files == {
417417
f"{os.path.join('src', 'foo_bar_baz', 'models.py')}",
418+
f"{os.path.join('src', 'foo_bar_baz', 'target_models')}",
419+
f"{os.path.join('src', 'foo_bar_baz', 'target_models', 'my_example_resource.py')}", # noqa: B950 pylint: disable=line-too-long
420+
f"{os.path.join('src', 'foo_bar_baz', 'target_models', 'my_other_resource.py')}", # noqa: B950 pylint: disable=line-too-long
418421
"foo-bar-baz-configuration.json",
419422
}
420423

0 commit comments

Comments
 (0)