| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import copy |
| |
| import json_parse |
| |
| |
| 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. |
| """ |
| 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 ShouldDelete(value): |
| toDelete.append(key) |
| else: |
| DeleteNodes(value, delete_key, matcher) |
| for key in toDelete: |
| del item[key] |
| elif type(item) == list: |
| item[:] = [DeleteNodes(thing, delete_key, matcher) |
| for thing in item if not ShouldDelete(thing)] |
| |
| return item |
| |
| |
| def Load(filename): |
| with open(filename, 'r') as handle: |
| schemas = json_parse.Parse(handle.read()) |
| return schemas |
| |
| |
| # A dictionary mapping |filename| to the object resulting from loading the JSON |
| # at |filename|. |
| _cache = {} |
| |
| |
| def CachedLoad(filename): |
| """Equivalent to Load(filename), but caches results for subsequent calls""" |
| if filename not in _cache: |
| _cache[filename] = Load(filename) |
| # Return a copy of the object so that any changes a caller makes won't affect |
| # the next caller. |
| return copy.deepcopy(_cache[filename]) |
| |