| Index: tools/json_schema_compiler/json_schema.py
|
| diff --git a/tools/json_schema_compiler/json_schema.py b/tools/json_schema_compiler/json_schema.py
|
| index ae126c2de911251418b608558d6c5b027e81b42b..bb4e9c4bc5d6f0c9e556ef40cb06cefa23232ad8 100644
|
| --- a/tools/json_schema_compiler/json_schema.py
|
| +++ b/tools/json_schema_compiler/json_schema.py
|
| @@ -6,25 +6,32 @@ import copy
|
|
|
| import json_parse
|
|
|
| -def DeleteNodes(item, delete_key):
|
| - """Deletes the given nodes in item, recursively, that have |delete_key| as
|
| - an attribute.
|
| +
|
| +def DeleteNodes(item, delete_key=None, matcher=None):
|
| + """Deletes certain nodes in item, recursively. If |delete_key| is set, all
|
| + dicts with |delete_key| as an attribute are deleted. If a callback is passed
|
| + as |matcher|, |DeleteNodes| will delete all dicts for which matcher(dict)
|
| + returns True.
|
| """
|
| - def HasKey(thing):
|
| - return json_parse.IsDict(thing) and thing.get(delete_key, False)
|
| + assert (delete_key is not None) != (matcher is not None)
|
| +
|
| + def ShouldDelete(thing):
|
| + return json_parse.IsDict(thing) and (
|
| + delete_key is not None and delete_key in thing or
|
| + matcher is not None and matcher(thing))
|
|
|
| if json_parse.IsDict(item):
|
| toDelete = []
|
| for key, value in item.items():
|
| - if HasKey(value):
|
| + if ShouldDelete(value):
|
| toDelete.append(key)
|
| else:
|
| - DeleteNodes(value, delete_key)
|
| + DeleteNodes(value, delete_key, matcher)
|
| for key in toDelete:
|
| del item[key]
|
| elif type(item) == list:
|
| - item[:] = [DeleteNodes(thing, delete_key)
|
| - for thing in item if not HasKey(thing)]
|
| + item[:] = [DeleteNodes(thing, delete_key, matcher)
|
| + for thing in item if not ShouldDelete(thing)]
|
|
|
| return item
|
|
|
|
|