• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2012 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import copy
6
7import json_parse
8
9
10def DeleteNodes(item, delete_key=None, matcher=None):
11  """Deletes certain nodes in item, recursively. If |delete_key| is set, all
12  dicts with |delete_key| as an attribute are deleted. If a callback is passed
13  as |matcher|, |DeleteNodes| will delete all dicts for which matcher(dict)
14  returns True.
15  """
16  assert (delete_key is not None) != (matcher is not None)
17
18  def ShouldDelete(thing):
19    return json_parse.IsDict(thing) and (
20        delete_key is not None and delete_key in thing or
21        matcher is not None and matcher(thing))
22
23  if json_parse.IsDict(item):
24    toDelete = []
25    for key, value in item.items():
26      if ShouldDelete(value):
27        toDelete.append(key)
28      else:
29        DeleteNodes(value, delete_key, matcher)
30    for key in toDelete:
31      del item[key]
32  elif type(item) == list:
33    item[:] = [DeleteNodes(thing, delete_key, matcher)
34        for thing in item if not ShouldDelete(thing)]
35
36  return item
37
38
39def Load(filename):
40  with open(filename, 'r') as handle:
41    schemas = json_parse.Parse(handle.read())
42  return schemas
43
44
45# A dictionary mapping |filename| to the object resulting from loading the JSON
46# at |filename|.
47_cache = {}
48
49
50def CachedLoad(filename):
51  """Equivalent to Load(filename), but caches results for subsequent calls"""
52  if filename not in _cache:
53    _cache[filename] = Load(filename)
54  # Return a copy of the object so that any changes a caller makes won't affect
55  # the next caller.
56  return copy.deepcopy(_cache[filename])
57
58