in tools/incremental_test/specification.py [0:0]
def from_json(input_json: Dict[str, Any]) -> "RepositoryUpdate":
try:
kind = input_json["kind"]
if kind == "hg":
return HgRepositoryUpdate(commit_hash=input_json["commit_hash"])
elif kind == "patch":
return PatchRepositoryUpdate(
patch=input_json["patch"],
patch_flags=input_json.get("patch_flags", ""),
)
elif kind == "file":
changes = input_json.get("changes", {})
removals = input_json.get("removals", [])
if not isinstance(changes, dict):
raise InvalidSpecificationException(
"File changes must be specified as dicts"
)
if not isinstance(removals, list):
raise InvalidSpecificationException(
"File removals must be specified as lists"
)
if len(changes) == 0 and len(removals) == 0:
raise InvalidSpecificationException("No file change is given")
return FileRepositoryUpdate(changes=changes, removals=removals)
elif kind == "batch":
updates = input_json["updates"]
if not isinstance(updates, list):
raise InvalidSpecificationException(
"Batch updates must be specified as lists"
)
parsed_updates: List[SingleUpdate] = []
for update in updates:
parsed_update = RepositoryUpdate.from_json(update)
parsed_updates.extend(parsed_update.update_steps())
return BatchRepositoryUpdate(parsed_updates)
else:
raise InvalidSpecificationException(
"Cannot create RepositoryUpdate due to unrecognized kind"
)
except KeyError as key:
raise InvalidSpecificationException(
f"Cannot create RepositoryUpdate due to missing field '{key}'"
)