|
9 | 9 | from rpdk.core.data_loaders import resource_stream
|
10 | 10 | from rpdk.core.exceptions import DownstreamError, SysExitRecommendedError
|
11 | 11 | 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 | +) |
13 | 18 | from rpdk.core.plugin_base import LanguagePlugin
|
14 | 19 | from rpdk.core.project import ARTIFACT_TYPE_HOOK
|
15 | 20 | from subprocess import PIPE, CalledProcessError, run as subprocess_run # nosec
|
@@ -210,8 +215,48 @@ def generate(self, project):
|
210 | 215 | contents = template.render(support_lib_pkg=SUPPORT_LIB_PKG, models=models)
|
211 | 216 | project.overwrite(path, contents)
|
212 | 217 |
|
| 218 | + if project.artifact_type == ARTIFACT_TYPE_HOOK: |
| 219 | + self._generate_target_models(project) |
| 220 | + |
213 | 221 | LOG.debug("Generate complete")
|
214 | 222 |
|
| 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 | + |
215 | 260 | # pylint: disable=unused-argument
|
216 | 261 | # the argument "project" is not used here but is used in codegen.py of other plugins
|
217 | 262 | # this method is called in cloudformation-cli/src/rpdk/core/project.py
|
|
0 commit comments