Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / tools / json_schema_compiler / json_schema.py
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
5 import copy
6
7 import json_parse
8
9
10 def 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
39 def 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
50 def 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