Home | History | Annotate | Download | only in json_schema_compiler
      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 
     58