Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(315)

Side by Side Diff: tools/json_schema_compiler/schema_loader.py

Issue 487533005: Add support for references in different paths in apis (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import os 5 import os
6 import re 6 import re
7 import sys 7 import sys
8 8
9 import idl_schema 9 import idl_schema
10 import json_schema 10 import json_schema
11 from cpp_namespace_environment import CppNamespaceEnvironment
11 from model import Model, UnixName 12 from model import Model, UnixName
12 13
14 def GenerateFilenames(full_namespace):
15 # Try to find the file defining the namespace. Eg. for
16 # nameSpace.sub_name_space.Type' the following heuristics looks for:
17 # 1. name_space_sub_name_space.json,
18 # 2. name_space_sub_name_space.idl,
19 # 3. sub_name_space.json,
20 # 4. sub_name_space.idl,
21 # 5. etc.
22 sub_namespaces = full_namespace.split('.')
23 filenames = [ ]
24 basename = None
25 for namespace in reversed(sub_namespaces):
26 if basename is not None:
27 basename = UnixName(namespace + '.' + basename)
28 else:
29 basename = UnixName(namespace)
30 for ext in ['json', 'idl']:
31 filenames.append('%s.%s' % (basename, ext))
32 return filenames
33
13 class SchemaLoader(object): 34 class SchemaLoader(object):
14 '''Resolves a type name into the namespace the type belongs to. 35 '''Resolves a type name into the namespace the type belongs to.
15 36
16 Properties: 37 Properties:
17 - |display_path| path to the directory with the API header files, intended for 38 - |display_path| path to the directory with the API header files, intended for
18 use with the Model. 39 use with the Model.
19 - |real_path| path to the directory with the API header files, used for file 40 - |real_path| path to the directory with the API header files, used for file
20 access. 41 access.
21 ''' 42 '''
22 def __init__(self, display_path, real_path): 43 def __init__(self, display_path, real_path, includes, cpp_namespace_pattern):
23 self._display_path = display_path 44 self._display_path = display_path
24 self._real_path = real_path 45 self._real_path = real_path
46 self._includes = [
47 { 'path': real_path, 'namespace': cpp_namespace_pattern } ]
48 self._includes.extend(includes)
25 49
26 def ResolveType(self, full_name, default_namespace): 50 def ResolveType(self, full_name, default_namespace):
27 name_parts = full_name.rsplit('.', 1) 51 name_parts = full_name.rsplit('.', 1)
28 if len(name_parts) == 1: 52 if len(name_parts) == 1:
29 if full_name not in default_namespace.types: 53 if full_name not in default_namespace.types:
30 return None 54 return None
31 return default_namespace 55 return default_namespace
32 namespace_name, type_name = name_parts 56 full_namespace, type_name = full_name.rsplit('.', 1)
33 real_name = None 57 filenames = GenerateFilenames(full_namespace)
34 # Try to find the file defining the namespace. Eg. for 58 for include in self._includes:
not at google - send to devlin 2014/08/26 20:16:06 You should be able to write here: for path, names
lfg 2014/08/26 21:18:44 I don't think this can be done with dictionaries,
not at google - send to devlin 2014/08/27 23:11:23 That's what iteritems() does, turns a dictionary i
not at google - send to devlin 2014/08/27 23:14:20 (but tuples is fine as well)
lfg 2014/08/28 18:57:10 Done.
35 # nameSpace.sub_name_space.Type' the following heuristics looks for: 59 path = include['path']
36 # 1. name_space_sub_name_space.json, 60 for filename in reversed(filenames):
37 # 2. name_space_sub_name_space.idl. 61 filepath = os.path.join(path, filename);
38 for ext in ['json', 'idl']: 62 if os.path.exists(filepath):
39 basename = UnixName(namespace_name) 63 namespace = Model().AddNamespace(
40 filename = '%s.%s' % (basename, ext) 64 self.LoadSchema(filepath)[0],
41 filepath = os.path.join(self._real_path, filename); 65 os.path.join(self._display_path, filepath),
42 if os.path.exists(filepath): 66 environment=CppNamespaceEnvironment(include['namespace']))
43 real_name = filename 67 if type_name in namespace.types:
44 break 68 return namespace
45 if real_name is None: 69 return 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
53 70
54 def LoadSchema(self, schema): 71 def LoadSchema(self, schema):
55 '''Load a schema definition. The schema parameter must be a file name 72 '''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 73 without any path component - the file is loaded from the path defined by
57 the real_path argument passed to the constructor.''' 74 the real_path argument passed to the constructor.'''
58 schema_filename, schema_extension = os.path.splitext(schema) 75 schema_filename, schema_extension = os.path.splitext(schema)
59 76
60 schema_path = os.path.join(self._real_path, schema); 77 schema_path = os.path.join(self._real_path, schema);
61 if schema_extension == '.json': 78 if schema_extension == '.json':
62 api_defs = json_schema.Load(schema_path) 79 api_defs = json_schema.Load(schema_path)
63 elif schema_extension == '.idl': 80 elif schema_extension == '.idl':
64 api_defs = idl_schema.Load(schema_path) 81 api_defs = idl_schema.Load(schema_path)
65 else: 82 else:
66 sys.exit('Did not recognize file extension %s for schema %s' % 83 sys.exit('Did not recognize file extension %s for schema %s' %
67 (schema_extension, schema)) 84 (schema_extension, schema))
68 85
69 return api_defs 86 return api_defs
OLDNEW
« tools/json_schema_compiler/h_generator.py ('K') | « tools/json_schema_compiler/model.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698