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

Side by Side Diff: chrome/common/extensions/docs/server2/schema_util.py

Issue 385703005: Docserver: Modify doc inlining so all relevant data is present in availability_finder.py (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Final nit Created 6 years, 5 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 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 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 from collections import defaultdict, Mapping 5 from collections import defaultdict, Mapping
6 import traceback 6 import traceback
7 7
8 from third_party.json_schema_compiler import json_parse, idl_schema, idl_parser 8 from third_party.json_schema_compiler import json_parse, idl_schema, idl_parser
9 9
10 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 if '$ref' in node: 47 if '$ref' in node:
48 refcounts[node['$ref']] += 1 48 refcounts[node['$ref']] += 1
49 stack.extend(v for k, v in node.iteritems() if k not in ignore) 49 stack.extend(v for k, v in node.iteritems() if k not in ignore)
50 50
51 for type_ in schema['types']: 51 for type_ in schema['types']:
52 if not 'noinline_doc' in type_: 52 if not 'noinline_doc' in type_:
53 if refcounts[type_['id']] == 1: 53 if refcounts[type_['id']] == 1:
54 type_['inline_doc'] = True 54 type_['inline_doc'] = True
55 55
56 56
57 def InlineDocs(schema): 57 def InlineDocs(schema, retain_inlined_types):
58 '''Replace '$ref's that refer to inline_docs with the json for those docs. 58 '''Replace '$ref's that refer to inline_docs with the json for those docs.
59 If |retain_inlined_types| is False, then the inlined nodes are removed
60 from the schema.
59 ''' 61 '''
60 types = schema.get('types') 62 types = schema.get('types')
61 if types is None: 63 if types is None:
62 return 64 return
63 65
64 inline_docs = {} 66 inline_docs = {}
65 types_without_inline_doc = [] 67 types_without_inline_doc = []
66 68
67 # Gather the types with inline_doc. 69 # Gather the types with inline_doc.
68 for type_ in types: 70 for type_ in types:
69 if type_.get('inline_doc'): 71 if type_.get('inline_doc'):
70 inline_docs[type_['id']] = type_ 72 inline_docs[type_['id']] = type_
71 for k in ('description', 'id', 'inline_doc'): 73 if not retain_inlined_types:
72 type_.pop(k, None) 74 for k in ('description', 'id', 'inline_doc'):
75 type_.pop(k, None)
73 else: 76 else:
74 types_without_inline_doc.append(type_) 77 types_without_inline_doc.append(type_)
75 schema['types'] = types_without_inline_doc 78 if not retain_inlined_types:
79 schema['types'] = types_without_inline_doc
76 80
77 def apply_inline(node): 81 def apply_inline(node):
78 if isinstance(node, list): 82 if isinstance(node, list):
79 for i in node: 83 for i in node:
80 apply_inline(i) 84 apply_inline(i)
81 elif isinstance(node, Mapping): 85 elif isinstance(node, Mapping):
82 ref = node.get('$ref') 86 ref = node.get('$ref')
83 if ref and ref in inline_docs: 87 if ref and ref in inline_docs:
84 node.update(inline_docs[ref]) 88 node.update(inline_docs[ref])
85 del node['$ref'] 89 del node['$ref']
86 for k, v in node.iteritems(): 90 for k, v in node.iteritems():
87 apply_inline(v) 91 apply_inline(v)
88 92
89 apply_inline(schema) 93 apply_inline(schema)
90 94
91 95
92 def ProcessSchema(path, file_data, inline=False): 96 def ProcessSchema(path, file_data, retain_inlined_types=False):
93 '''Parses |file_data| using a method determined by checking the extension of 97 '''Parses |file_data| using a method determined by checking the
94 the file at the given |path|. Then, trims 'nodoc' and if |inline| is given 98 extension of the file at the given |path|. Then, trims 'nodoc' and if
95 and True, handles inlineable types from the parsed schema data. 99 |retain_inlined_types| is given and False, removes inlineable types from
100 the parsed schema data.
96 ''' 101 '''
97 def trim_and_inline(schema, is_idl=False): 102 def trim_and_inline(schema, is_idl=False):
98 '''Modifies an API schema in place by removing nodes that shouldn't be 103 '''Modifies an API schema in place by removing nodes that shouldn't be
99 documented and inlining schema types that are only referenced once. 104 documented and inlining schema types that are only referenced once.
100 ''' 105 '''
101 if RemoveNoDocs(schema): 106 if RemoveNoDocs(schema):
102 # A return of True signifies that the entire schema should not be 107 # A return of True signifies that the entire schema should not be
103 # documented. Otherwise, only nodes that request 'nodoc' are removed. 108 # documented. Otherwise, only nodes that request 'nodoc' are removed.
104 return None 109 return None
105 if inline: 110 if is_idl:
106 if is_idl: 111 DetectInlineableTypes(schema)
107 DetectInlineableTypes(schema) 112 InlineDocs(schema, retain_inlined_types)
108 InlineDocs(schema)
109 return schema 113 return schema
110 114
111 if path.endswith('.idl'): 115 if path.endswith('.idl'):
112 idl = idl_schema.IDLSchema(idl_parser.IDLParser().ParseData(file_data)) 116 idl = idl_schema.IDLSchema(idl_parser.IDLParser().ParseData(file_data))
113 # Wrap the result in a list so that it behaves like JSON API data. 117 # Wrap the result in a list so that it behaves like JSON API data.
114 return [trim_and_inline(idl.process()[0], is_idl=True)] 118 return [trim_and_inline(idl.process()[0], is_idl=True)]
115 119
116 try: 120 try:
117 schemas = json_parse.Parse(file_data) 121 schemas = json_parse.Parse(file_data)
118 except: 122 except:
119 raise ValueError('Cannot parse "%s" as JSON:\n%s' % 123 raise ValueError('Cannot parse "%s" as JSON:\n%s' %
120 (path, traceback.format_exc())) 124 (path, traceback.format_exc()))
121 for schema in schemas: 125 for schema in schemas:
122 # Schemas could consist of one API schema (data for a specific API file) 126 # Schemas could consist of one API schema (data for a specific API file)
123 # or multiple (data from extension_api.json). 127 # or multiple (data from extension_api.json).
124 trim_and_inline(schema) 128 trim_and_inline(schema)
125 return schemas 129 return schemas
OLDNEW
« no previous file with comments | « chrome/common/extensions/docs/server2/cron.yaml ('k') | chrome/common/extensions/docs/server2/schema_util_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698