Battery Status API: add UMA logging for Linux.
[chromium-blink-merge.git] / tools / json_schema_compiler / schema_loader.py
blob358381f847f4766c0fbbe57da4e0db205963ef05
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.
5 import os
6 import re
7 import sys
9 import idl_schema
10 import json_schema
11 from model import Model, UnixName
13 class SchemaLoader(object):
14 '''Resolves a type name into the namespace the type belongs to.
16 Properties:
17 - |display_path| path to the directory with the API header files, intended for
18 use with the Model.
19 - |real_path| path to the directory with the API header files, used for file
20 access.
21 '''
22 def __init__(self, display_path, real_path):
23 self._display_path = display_path
24 self._real_path = real_path
26 def ResolveType(self, full_name, default_namespace):
27 name_parts = full_name.rsplit('.', 1)
28 if len(name_parts) == 1:
29 if full_name not in default_namespace.types:
30 return None
31 return default_namespace
32 namespace_name, type_name = name_parts
33 real_name = None
34 # Try to find the file defining the namespace. Eg. for
35 # nameSpace.sub_name_space.Type' the following heuristics looks for:
36 # 1. name_space_sub_name_space.json,
37 # 2. name_space_sub_name_space.idl.
38 for ext in ['json', 'idl']:
39 basename = UnixName(namespace_name)
40 filename = '%s.%s' % (basename, ext)
41 filepath = os.path.join(self._real_path, filename);
42 if os.path.exists(filepath):
43 real_name = filename
44 break
45 if real_name is None:
46 return None
47 namespace = Model().AddNamespace(
48 self.LoadSchema(real_name)[0],
49 os.path.join(self._display_path, real_name))
50 if type_name not in namespace.types:
51 return None
52 return namespace
54 def LoadSchema(self, schema):
55 '''Load a schema definition. The schema parameter must be a file name
56 without any path component - the file is loaded from the path defined by
57 the real_path argument passed to the constructor.'''
58 schema_filename, schema_extension = os.path.splitext(schema)
60 schema_path = os.path.join(self._real_path, schema);
61 if schema_extension == '.json':
62 api_defs = json_schema.Load(schema_path)
63 elif schema_extension == '.idl':
64 api_defs = idl_schema.Load(schema_path)
65 else:
66 sys.exit('Did not recognize file extension %s for schema %s' %
67 (schema_extension, schema))
69 return api_defs