OLD | NEW |
---|---|
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 copy | 5 import copy |
6 import logging | 6 import logging |
7 import os | 7 import os |
8 | 8 |
9 import third_party.json_schema_compiler.model as model | 9 import third_party.json_schema_compiler.model as model |
10 | 10 |
11 def _RemoveNoDocs(item): | 11 def _RemoveNoDocs(item): |
12 if type(item) == dict: | 12 if type(item) == dict: |
13 if item.get('nodoc', False): | 13 if item.get('nodoc', False): |
14 return True | 14 return True |
15 for key, value in item.items(): | 15 for key, value in item.items(): |
16 if _RemoveNoDocs(value): | 16 if _RemoveNoDocs(value): |
17 del item[key] | 17 del item[key] |
18 elif type(item) == list: | 18 elif type(item) == list: |
19 for i in item: | 19 for i in item: |
20 if _RemoveNoDocs(i): | 20 if _RemoveNoDocs(i): |
21 item.remove(i) | 21 item.remove(i) |
22 return False | 22 return False |
23 | 23 |
24 def _GetLinkToRefType(namespace_name, ref_type): | 24 def _GetLinkToRefType(namespace_name, ref_type): |
25 terms = ref_type.split('.') | 25 if ref_type.startswith(namespace_name + '.'): |
26 if len(terms) > 1: | 26 type_name = ref_type[namespace_name + '.':] |
not at google - send to devlin
2012/07/26 03:12:27
is this supposed to be len(namespace_name + '.') ?
cduvall
2012/07/26 17:57:44
Done.
| |
27 text = '.'.join(terms[1:]) | 27 return { 'href': '#type-' + type_name, 'text': type_name } |
28 href = terms[0] + '.html' + '#type-' + text | 28 elif '.' not in ref_type: |
29 else: | 29 return { 'href': '#type-' + ref_type, 'text': ref_type } |
30 href = namespace_name + '.html' + '#type-' +ref_type | 30 api, type_name = ref_type.rsplit('.', 1) |
31 text = ref_type | 31 return { 'href': api + '.html#type-' + type_name, 'text': ref_type } |
32 return ({ | |
33 "href": href, | |
34 "text": text | |
35 }) | |
36 | 32 |
37 def _FormatValue(value): | 33 def _FormatValue(value): |
38 """Inserts commas every three digits for integer values. It is magic. | 34 """Inserts commas every three digits for integer values. It is magic. |
39 """ | 35 """ |
40 s = str(value) | 36 s = str(value) |
41 return ','.join([s[max(0, i - 3):i] for i in range(len(s), 0, -3)][::-1]) | 37 return ','.join([s[max(0, i - 3):i] for i in range(len(s), 0, -3)][::-1]) |
42 | 38 |
43 class HandlebarDictGenerator(object): | 39 class HandlebarDictGenerator(object): |
44 """Uses a Model from the JSON Schema Compiler and generates a dict that | 40 """Uses a Model from the JSON Schema Compiler and generates a dict that |
45 a Handlebar template can use for a data source. | 41 a Handlebar template can use for a data source. |
46 """ | 42 """ |
47 def __init__(self, json): | 43 def __init__(self, json): |
48 clean_json = copy.deepcopy(json) | 44 clean_json = copy.deepcopy(json) |
49 _RemoveNoDocs(clean_json) | 45 _RemoveNoDocs(clean_json) |
50 try: | 46 try: |
51 self._namespace = model.Namespace(clean_json, clean_json['namespace']) | 47 self._namespace = model.Namespace(clean_json, clean_json['namespace']) |
52 except Exception as e: | 48 except Exception as e: |
53 logging.info(e) | 49 logging.info(e) |
54 | 50 |
51 def _StripPrefix(self, name): | |
52 if name.startswith(self._namespace.name + '.'): | |
53 return name[len(self._namespace.name + '.'):] | |
54 return name | |
55 | |
56 def _ReplaceRefsInDescription(self, description): | |
not at google - send to devlin
2012/07/26 03:12:27
function needs -2 indentation
cduvall
2012/07/26 17:57:44
Done.
| |
57 if description is None or '$ref:' not in description: | |
58 return description | |
59 refs = description.split('$ref:') | |
not at google - send to devlin
2012/07/26 03:12:27
This is awesome. We should convert all those chrom
cduvall
2012/07/26 17:57:44
I shouldn't do this now because it will break the
not at google - send to devlin
2012/07/30 08:04:34
Actually it looks like it _does_ deal with $ref:
| |
60 formatted_description = refs[0] | |
61 for ref in refs[1:]: | |
not at google - send to devlin
2012/07/26 03:12:27
I don't think this algorithm works if the descript
cduvall
2012/07/26 17:57:44
I think it does:
'$ref:Reffy is cool'.split('$ref
| |
62 ref, rest = ref.split(' ', 1) | |
63 ref_dict = _GetLinkToRefType(self._namespace.name, ref) | |
64 formatted_description += ('<a href="' + ref_dict['href'] + '">' + | |
65 ref_dict['text'] + '</a> ' + rest) | |
not at google - send to devlin
2012/07/26 03:12:27
use a format string?
also, tip: += is inefficient
cduvall
2012/07/26 17:57:44
Done.
| |
66 return formatted_description | |
67 | |
55 def Generate(self): | 68 def Generate(self): |
56 try: | 69 try: |
57 return { | 70 return { |
58 'name': self._namespace.name, | 71 'name': self._namespace.name, |
59 'types': map(self._GenerateType, self._namespace.types.values()), | 72 'types': map(self._GenerateType, self._namespace.types.values()), |
60 'functions': self._GenerateFunctions(self._namespace.functions), | 73 'functions': self._GenerateFunctions(self._namespace.functions), |
61 'events': map(self._GenerateEvent, self._namespace.events.values()), | 74 'events': map(self._GenerateEvent, self._namespace.events.values()), |
62 'properties': self._GenerateProperties(self._namespace.properties) | 75 'properties': self._GenerateProperties(self._namespace.properties) |
63 } | 76 } |
64 except Exception as e: | 77 except Exception as e: |
65 logging.info(e) | 78 logging.info(e) |
66 | 79 |
67 def _GenerateType(self, type_): | 80 def _GenerateType(self, type_): |
68 type_dict = { | 81 type_dict = { |
69 'name': type_.name, | 82 'name': self._StripPrefix(type_.name), |
70 'description': type_.description, | 83 'description': type_.description, |
not at google - send to devlin
2012/07/26 03:12:27
run *all* descriptions of through ReplaceRefsInDes
cduvall
2012/07/26 17:57:44
Done.
| |
71 'properties': self._GenerateProperties(type_.properties), | 84 'properties': self._GenerateProperties(type_.properties), |
72 'functions': self._GenerateFunctions(type_.functions), | 85 'functions': self._GenerateFunctions(type_.functions), |
73 'events': map(self._GenerateEvent, type_.events.values()) | 86 'events': map(self._GenerateEvent, type_.events.values()) |
74 } | 87 } |
75 self._RenderTypeInformation(type_, type_dict) | 88 self._RenderTypeInformation(type_, type_dict) |
76 return type_dict | 89 return type_dict |
77 | 90 |
78 def _GenerateFunctions(self, functions): | 91 def _GenerateFunctions(self, functions): |
79 return map(self._GenerateFunction, functions.values()) | 92 return map(self._GenerateFunction, functions.values()) |
80 | 93 |
(...skipping 10 matching lines...) Expand all Loading... | |
91 for param in function.params: | 104 for param in function.params: |
92 function_dict['parameters'].append(self._GenerateProperty(param)) | 105 function_dict['parameters'].append(self._GenerateProperty(param)) |
93 if function_dict['callback']: | 106 if function_dict['callback']: |
94 function_dict['parameters'].append(function_dict['callback']) | 107 function_dict['parameters'].append(function_dict['callback']) |
95 if len(function_dict['parameters']) > 0: | 108 if len(function_dict['parameters']) > 0: |
96 function_dict['parameters'][-1]['last'] = True | 109 function_dict['parameters'][-1]['last'] = True |
97 return function_dict | 110 return function_dict |
98 | 111 |
99 def _GenerateEvent(self, event): | 112 def _GenerateEvent(self, event): |
100 event_dict = { | 113 event_dict = { |
101 'name': event.name, | 114 'name': self._StripPrefix(event.name), |
102 'description': event.description, | 115 'description': event.description, |
103 'parameters': map(self._GenerateProperty, event.params) | 116 'parameters': map(self._GenerateProperty, event.params) |
104 } | 117 } |
105 if len(event_dict['parameters']) > 0: | 118 if len(event_dict['parameters']) > 0: |
106 event_dict['parameters'][-1]['last'] = True | 119 event_dict['parameters'][-1]['last'] = True |
107 return event_dict | 120 return event_dict |
108 | 121 |
109 def _GenerateCallback(self, callback): | 122 def _GenerateCallback(self, callback): |
110 if not callback: | 123 if not callback: |
111 return None | 124 return None |
112 callback_dict = { | 125 callback_dict = { |
113 'name': 'callback', | 126 'name': 'callback', |
114 'description': callback.description, | 127 'description': callback.description, |
115 'simple_type': {'simple_type': 'function'}, | 128 'simple_type': {'simple_type': 'function'}, |
116 'optional': callback.optional, | 129 'optional': callback.optional, |
117 'parameters': [] | 130 'parameters': [] |
118 } | 131 } |
119 for param in callback.params: | 132 for param in callback.params: |
120 callback_dict['parameters'].append(self._GenerateProperty(param)) | 133 callback_dict['parameters'].append(self._GenerateProperty(param)) |
121 if (len(callback_dict['parameters']) > 0): | 134 if (len(callback_dict['parameters']) > 0): |
122 callback_dict['parameters'][-1]['last'] = True | 135 callback_dict['parameters'][-1]['last'] = True |
123 return callback_dict | 136 return callback_dict |
124 | 137 |
125 def _GenerateProperties(self, properties): | 138 def _GenerateProperties(self, properties): |
126 return map(self._GenerateProperty, properties.values()) | 139 return map(self._GenerateProperty, properties.values()) |
127 | 140 |
128 def _GenerateProperty(self, property_): | 141 def _GenerateProperty(self, property_): |
129 property_dict = { | 142 property_dict = { |
130 'name': property_.name, | 143 'name': self._StripPrefix(property_.name), |
131 'optional': property_.optional, | 144 'optional': property_.optional, |
132 'description': property_.description, | 145 'description': self._ReplaceRefsInDescription(property_.description), |
133 'properties': self._GenerateProperties(property_.properties), | 146 'properties': self._GenerateProperties(property_.properties), |
134 'functions': self._GenerateFunctions(property_.functions) | 147 'functions': self._GenerateFunctions(property_.functions) |
135 } | 148 } |
136 if property_.has_value: | 149 if property_.has_value: |
137 if isinstance(property_.value, int): | 150 if isinstance(property_.value, int): |
138 property_dict['value'] = _FormatValue(property_.value) | 151 property_dict['value'] = _FormatValue(property_.value) |
139 else: | 152 else: |
140 property_dict['value'] = property_.value | 153 property_dict['value'] = property_.value |
141 else: | 154 else: |
142 self._RenderTypeInformation(property_, property_dict) | 155 self._RenderTypeInformation(property_, property_dict) |
(...skipping 17 matching lines...) Expand all Loading... | |
160 elif property_.type_ == model.PropertyType.ENUM: | 173 elif property_.type_ == model.PropertyType.ENUM: |
161 dst_dict['enum_values'] = [] | 174 dst_dict['enum_values'] = [] |
162 for enum_value in property_.enum_values: | 175 for enum_value in property_.enum_values: |
163 dst_dict['enum_values'].append({'name': enum_value}) | 176 dst_dict['enum_values'].append({'name': enum_value}) |
164 if len(dst_dict['enum_values']) > 0: | 177 if len(dst_dict['enum_values']) > 0: |
165 dst_dict['enum_values'][-1]['last'] = True | 178 dst_dict['enum_values'][-1]['last'] = True |
166 elif property_.instance_of: | 179 elif property_.instance_of: |
167 dst_dict['simple_type'] = property_.instance_of.lower() | 180 dst_dict['simple_type'] = property_.instance_of.lower() |
168 else: | 181 else: |
169 dst_dict['simple_type'] = property_.type_.name.lower() | 182 dst_dict['simple_type'] = property_.type_.name.lower() |
OLD | NEW |