| # 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): |
| """Deletes the given nodes in item, recursively, that have |delete_key| as |
| an attribute. |
| """ |
| def HasKey(thing): |
| return json_parse.IsDict(thing) and thing.get(delete_key, False) |
| |
| if json_parse.IsDict(item): |
| toDelete = [] |
| for key, value in item.items(): |
| if HasKey(value): |
| toDelete.append(key) |
| else: |
| DeleteNodes(value, delete_key) |
| for key in toDelete: |
| del item[key] |
| elif type(item) == list: |
| item[:] = [DeleteNodes(thing, delete_key) |
| for thing in item if not HasKey(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]) |
| |