pams.utils.json_extends のソースコード
from typing import Dict
from typing import List
from typing import Optional
[ドキュメント]def json_extends(
whole_json: Dict,
parent_name: str,
target_json: Dict,
excludes_fields: Optional[List[str]] = None,
) -> Dict:
"""extend target json. If "extends" keys are included in target_json, this try to extend the json dict recursively.
For the extension, the value for "extends" field is found in whole_json and target_json is extended using the dict under
the found part of whole_json. This process is recursively repeated. "parent_name" is only used for avoiding circle
extension of target_json and it should be parent key of taregt_json.
Args:
whole_json (Dict): whole of json.
parent_name (str): parent name of target_json.
target_json (Dict): target json.
excludes_fields (List[str], Optional): exclude list from json field.
Returns:
Dict: json output.
Examples:
>>> from pams.utils.json_extends import json_extends
>>> whole_json = {"parent": {"parent_attr": "1", "override_attr": "1"}}
>>> target_json = {"extends": "parent", "child_attr": "0", "override_attr": "0"}
>>> json_extends(whole_json=whole_json, parent_name="child", target_json=target_json)
{'parent_attr': '1', 'override_attr': '0', 'child_attr': '0'}
"""
# ToDo: add a code example to doc.
excludes_fields_: List[str] = excludes_fields if excludes_fields is not None else []
results = target_json.copy()
extending_history: List[str] = [parent_name]
while "extends" in results:
extends_class: str = results["extends"]
results.pop("extends")
if extends_class not in whole_json:
raise ValueError(
f"{parent_name} cannot extends {extends_class} because {extends_class} is missing"
)
if extends_class in extending_history:
raise ValueError(f"{parent_name} has extending loop")
extending_history.append(extends_class)
extending_dict: Dict = whole_json[extends_class]
results = dict(
[
(key, value)
for key, value in extending_dict.items()
if key not in excludes_fields_
],
**results,
)
return results