| 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 """Class for parsing metadata about extension samples.""" | 5 """Class for parsing metadata about extension samples.""" |
| 6 | 6 |
| 7 import locale | 7 import locale |
| 8 import os | 8 import os |
| 9 import os.path | 9 import os.path |
| 10 import re | 10 import re |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 | 76 |
| 77 def parse_idl_file(path): | 77 def parse_idl_file(path): |
| 78 """ Load the specified file and parse it as IDL. | 78 """ Load the specified file and parse it as IDL. |
| 79 | 79 |
| 80 Args: | 80 Args: |
| 81 path: Path to a file containing JSON-encoded data. | 81 path: Path to a file containing JSON-encoded data. |
| 82 """ | 82 """ |
| 83 api_def = idl_schema.Load(path) | 83 api_def = idl_schema.Load(path) |
| 84 for namespace_def in api_def: | 84 for namespace_def in api_def: |
| 85 namespace_dot = namespace_def['namespace'] + '.' | 85 namespace_dot = namespace_def['namespace'] + '.' |
| 86 types = dict((type_['id'], type_) | 86 inline_types = dict((type_['id'], type_) |
| 87 for type_ in namespace_def.get('types', []) | 87 for type_ in namespace_def.get('types', []) |
| 88 if type_) | 88 if type_ and type_.get('inline_doc', False)) |
| 89 def SubstituteInlineDoc(prop): | 89 def SubstituteInlineDoc(prop): |
| 90 prop_ref_type = prop.get('$ref', '') | 90 prop_ref_type = prop.get('$ref', '') |
| 91 type_obj = types.get(namespace_dot + prop_ref_type, | 91 type_obj = inline_types.get(namespace_dot + prop_ref_type, |
| 92 types.get(prop_ref_type, {})) | 92 inline_types.get(prop_ref_type, {})) |
| 93 if not type_obj: | 93 if not type_obj: |
| 94 return | 94 return |
| 95 if 'properties' in type_obj: | 95 if 'properties' in type_obj: |
| 96 del prop['$ref'] | 96 del prop['$ref'] |
| 97 prop['properties'] = dict(type_obj['properties']) | 97 prop['properties'] = dict(type_obj['properties']) |
| 98 prop['type'] = 'object' | 98 prop['type'] = 'object' |
| 99 for sub_prop in prop['properties'].values(): | 99 for sub_prop in prop['properties'].values(): |
| 100 if isinstance(sub_prop, dict): | 100 if isinstance(sub_prop, dict): |
| 101 if 'nodoc' in sub_prop: | 101 if 'nodoc' in sub_prop: |
| 102 del sub_prop['nodoc'] | 102 del sub_prop['nodoc'] |
| 103 if 'name' in sub_prop: | 103 if 'name' in sub_prop: |
| 104 del sub_prop['name'] | 104 del sub_prop['name'] |
| 105 elif 'enum' in type_obj and 'type' in type_obj: | 105 elif 'enum' in type_obj and 'type' in type_obj: |
| 106 del prop['$ref'] | 106 del prop['$ref'] |
| 107 prop['type'] = type_obj['type'] | 107 prop['type'] = type_obj['type'] |
| 108 prop['enum'] = type_obj['enum'] | 108 prop['enum'] = type_obj['enum'] |
| 109 def FixReferences(prop): | 109 def FixReferences(prop): |
| 110 # Strip namespace_dot from $ref names. | 110 # Strip namespace_dot from $ref names. |
| 111 if prop.get('$ref', '').startswith(namespace_dot): | 111 if prop.get('$ref', '').startswith(namespace_dot): |
| 112 prop['$ref'] = prop['$ref'][len(namespace_dot):] | 112 prop['$ref'] = prop['$ref'][len(namespace_dot):] |
| 113 if (prop.get('type', '') == 'array' and | 113 if (prop.get('type', '') == 'array' and |
| 114 prop.get('items', {}).get('$ref', '').startswith(namespace_dot)): | 114 prop.get('items', {}).get('$ref', '').startswith(namespace_dot)): |
| 115 prop['items']['$ref'] = prop['items']['$ref'][len(namespace_dot):] | 115 prop['items']['$ref'] = prop['items']['$ref'][len(namespace_dot):] |
| 116 if prop.get('inline_doc', False): | 116 SubstituteInlineDoc(prop) |
| 117 del prop['inline_doc'] | 117 if 'items' in prop: |
| 118 SubstituteInlineDoc(prop) | 118 SubstituteInlineDoc(prop['items']) |
| 119 if 'items' in prop: | |
| 120 SubstituteInlineDoc(prop['items']) | |
| 121 | 119 |
| 122 for type_ in namespace_def.get('types', []): | 120 for type_ in namespace_def.get('types', []): |
| 123 if type_.get('id', '').startswith(namespace_dot): | 121 if type_.get('id', '').startswith(namespace_dot): |
| 124 type_['id'] = type_['id'][len(namespace_dot):] | 122 type_['id'] = type_['id'][len(namespace_dot):] |
| 125 for prop in type_.get('properties', {}).values(): | 123 for prop in type_.get('properties', {}).values(): |
| 126 FixReferences(prop) | 124 FixReferences(prop) |
| 125 if type_.get('inline_doc', False): |
| 126 del type_['inline_doc'] |
| 127 type_['nodoc'] = True |
| 127 for func in namespace_def.get('functions', []): | 128 for func in namespace_def.get('functions', []): |
| 128 for param in func.get('parameters', []): | 129 for param in func.get('parameters', []): |
| 129 FixReferences(param) | 130 FixReferences(param) |
| 130 for cb_param in param.get('parameters', []): | 131 for cb_param in param.get('parameters', []): |
| 131 FixReferences(cb_param) | 132 FixReferences(cb_param) |
| 132 for event in namespace_def.get('events', []): | 133 for event in namespace_def.get('events', []): |
| 133 for param in event.get('parameters', []): | 134 for param in event.get('parameters', []): |
| 134 FixReferences(param) | 135 FixReferences(param) |
| 135 return api_def | 136 return api_def |
| 136 | 137 |
| (...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 zip_file.write(abspath, relpath) | 862 zip_file.write(abspath, relpath) |
| 862 if file == 'manifest.json': | 863 if file == 'manifest.json': |
| 863 info = zip_file.getinfo(zip_manifest_path) | 864 info = zip_file.getinfo(zip_manifest_path) |
| 864 info.comment = self['source_hash'] | 865 info.comment = self['source_hash'] |
| 865 except RuntimeError, msg: | 866 except RuntimeError, msg: |
| 866 raise Exception("Could not write zip at %s: %s" % (zip_path, msg)) | 867 raise Exception("Could not write zip at %s: %s" % (zip_path, msg)) |
| 867 finally: | 868 finally: |
| 868 zip_file.close() | 869 zip_file.close() |
| 869 | 870 |
| 870 return self._get_relative_zip_path() | 871 return self._get_relative_zip_path() |
| OLD | NEW |