in src/sagemaker_core/tools/shapes_codegen.py [0:0]
def build_graph(self):
"""
Builds a directed acyclic graph (DAG) representing the dependencies between shapes.
Steps:
1. Loop over the Service Json shapes.
1.1. If dependency(members) found, add association of node -> dependency.
1.1.1. Sometimes members are not shape themselves, but have associated links to actual shapes.
In that case add link to node -> dependency (actual)
CreateExperimentRequest -> [ExperimentEntityName, ExperimentDescription, TagList]
1.2. else leaf node found (no dependent members), add association of node -> None.
:return: A dict which defines the structure of the DAG in the format:
{key : [dependencies]}
Example input:
{'CreateExperimentRequest': ['ExperimentEntityName', 'ExperimentEntityName',
'ExperimentDescription', 'TagList'],
'CreateExperimentResponse': ['ExperimentArn'],
'DeleteExperimentRequest': ['ExperimentEntityName'],
'DeleteExperimentResponse': ['ExperimentArn']}
"""
graph = {}
for node, attributes in self.combined_shapes.items():
if "members" in attributes:
for member, member_attributes in attributes["members"].items():
# add shapes and not shape attribute
# i.e. ExperimentEntityName taken over ExperimentName
if member_attributes["shape"] in self.combined_shapes.keys():
node_deps = graph.get(node, [])
# evaluate the member shape and then append to node deps
member_shape = self.combined_shapes[member_attributes["shape"]]
if member_shape["type"] == "list":
node_deps.append(member_shape["member"]["shape"])
elif member_shape["type"] == "map":
node_deps.append(member_shape["key"]["shape"])
node_deps.append(member_shape["value"]["shape"])
else:
node_deps.append(member_attributes["shape"])
graph[node] = node_deps
else:
graph[node] = None
return graph