Skip to content

Commit 2f45e3d

Browse files
authored
Fix an issue with nested in schema (#3189)
1 parent 1654c78 commit 2f45e3d

File tree

1 file changed

+44
-33
lines changed

1 file changed

+44
-33
lines changed

src/cfnlint/template/template.py

+44-33
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,46 @@ def get_valid_refs(self):
351351
results[pseudoparam] = element
352352
return results
353353

354+
def _get_valid_getatts_from_schema(self, schema, pointer):
355+
results = {}
356+
try:
357+
item = resolve_pointer(schema, pointer)
358+
except KeyError:
359+
return results
360+
361+
pointer = pointer.replace("/properties/", "").replace("#/definitions/", "")
362+
363+
item_type = item.get("type")
364+
if item_type is None:
365+
if "$ref" in item:
366+
results.update(
367+
self._get_valid_getatts_from_schema(schema, item.get("$ref"))
368+
)
369+
else:
370+
return results
371+
_type = None
372+
primitive_type = None
373+
if item_type == "string":
374+
primitive_type = "String"
375+
elif item_type == "number":
376+
primitive_type = "Double"
377+
elif item_type == "integer":
378+
primitive_type = "Integer"
379+
elif item_type == "boolean":
380+
primitive_type = "Boolean"
381+
elif item_type == "array":
382+
_type = "List"
383+
primitive_type = "String"
384+
385+
results[".".join(pointer.split("/"))] = {}
386+
if _type:
387+
results[".".join(pointer.split("/"))]["Type"] = _type
388+
results[".".join(pointer.split("/"))]["PrimitiveItemType"] = primitive_type
389+
elif primitive_type:
390+
results[".".join(pointer.split("/"))]["PrimitiveType"] = primitive_type
391+
392+
return results
393+
354394
# pylint: disable=too-many-locals
355395
def get_valid_getatts(self):
356396
resourcetypes = cfnlint.helpers.RESOURCE_SPECS["us-east-1"].get("ResourceTypes")
@@ -424,40 +464,11 @@ def build_output_string(resource_type, property_name):
424464
if value["Type"] == schema["typeName"]:
425465
results[name] = {}
426466
for ro_property in schema.get("readOnlyProperties", []):
427-
try:
428-
item = resolve_pointer(schema, ro_property)
429-
except KeyError:
430-
continue
431-
item_type = item["type"]
432-
_type = None
433-
primitive_type = None
434-
if item_type == "string":
435-
primitive_type = "String"
436-
elif item_type == "number":
437-
primitive_type = "Double"
438-
elif item_type == "integer":
439-
primitive_type = "Integer"
440-
elif item_type == "boolean":
441-
primitive_type = "Boolean"
442-
elif item_type == "array":
443-
_type = "List"
444-
primitive_type = "String"
445-
446-
ro_property = ro_property.replace(
447-
"/properties/", ""
467+
results[name].update(
468+
self._get_valid_getatts_from_schema(
469+
schema, ro_property
470+
)
448471
)
449-
results[name][".".join(ro_property.split("/"))] = {}
450-
if _type:
451-
results[name][".".join(ro_property.split("/"))][
452-
"Type"
453-
] = _type
454-
results[name][".".join(ro_property.split("/"))][
455-
"PrimitiveItemType"
456-
] = primitive_type
457-
elif primitive_type:
458-
results[name][".".join(ro_property.split("/"))][
459-
"PrimitiveType"
460-
] = primitive_type
461472

462473
return results
463474

0 commit comments

Comments
 (0)