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

Unified Diff: chrome/common/extensions/docs/server2/schema_util.py

Issue 532423002: Inlining references to internal APIs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Re-adding comment 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 side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/server2/schema_util.py
diff --git a/chrome/common/extensions/docs/server2/schema_util.py b/chrome/common/extensions/docs/server2/schema_util.py
deleted file mode 100644
index c5d1456a4dbc4ee8de6899a7e63364717987602d..0000000000000000000000000000000000000000
--- a/chrome/common/extensions/docs/server2/schema_util.py
+++ /dev/null
@@ -1,129 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from collections import defaultdict, Mapping
-import traceback
-
-from third_party.json_schema_compiler import json_parse, idl_schema, idl_parser
-
-
-def RemoveNoDocs(item):
- '''Removes nodes that should not be rendered from an API schema.
- '''
- if json_parse.IsDict(item):
- if item.get('nodoc', False):
- return True
- for key, value in item.items():
- if RemoveNoDocs(value):
- del item[key]
- elif type(item) == list:
- to_remove = []
- for i in item:
- if RemoveNoDocs(i):
- to_remove.append(i)
- for i in to_remove:
- item.remove(i)
- return False
-
-
-def DetectInlineableTypes(schema):
- '''Look for documents that are only referenced once and mark them as inline.
- Actual inlining is done by _InlineDocs.
- '''
- if not schema.get('types'):
- return
-
- ignore = frozenset(('value', 'choices'))
- refcounts = defaultdict(int)
- # Use an explicit stack instead of recursion.
- stack = [schema]
-
- while stack:
- node = stack.pop()
- if isinstance(node, list):
- stack.extend(node)
- elif isinstance(node, Mapping):
- if '$ref' in node:
- refcounts[node['$ref']] += 1
- stack.extend(v for k, v in node.iteritems() if k not in ignore)
-
- for type_ in schema['types']:
- if not 'noinline_doc' in type_:
- if refcounts[type_['id']] == 1:
- type_['inline_doc'] = True
-
-
-def InlineDocs(schema, retain_inlined_types):
- '''Replace '$ref's that refer to inline_docs with the json for those docs.
- If |retain_inlined_types| is False, then the inlined nodes are removed
- from the schema.
- '''
- types = schema.get('types')
- if types is None:
- return
-
- inline_docs = {}
- types_without_inline_doc = []
-
- # Gather the types with inline_doc.
- for type_ in types:
- if type_.get('inline_doc'):
- inline_docs[type_['id']] = type_
- if not retain_inlined_types:
- for k in ('description', 'id', 'inline_doc'):
- type_.pop(k, None)
- else:
- types_without_inline_doc.append(type_)
- if not retain_inlined_types:
- schema['types'] = types_without_inline_doc
-
- def apply_inline(node):
- if isinstance(node, list):
- for i in node:
- apply_inline(i)
- elif isinstance(node, Mapping):
- ref = node.get('$ref')
- if ref and ref in inline_docs:
- node.update(inline_docs[ref])
- del node['$ref']
- for k, v in node.iteritems():
- apply_inline(v)
-
- apply_inline(schema)
-
-
-def ProcessSchema(path, file_data, retain_inlined_types=False):
- '''Parses |file_data| using a method determined by checking the
- extension of the file at the given |path|. Then, trims 'nodoc' and if
- |retain_inlined_types| is given and False, removes inlineable types from
- the parsed schema data.
- '''
- def trim_and_inline(schema, is_idl=False):
- '''Modifies an API schema in place by removing nodes that shouldn't be
- documented and inlining schema types that are only referenced once.
- '''
- if RemoveNoDocs(schema):
- # A return of True signifies that the entire schema should not be
- # documented. Otherwise, only nodes that request 'nodoc' are removed.
- return None
- if is_idl:
- DetectInlineableTypes(schema)
- InlineDocs(schema, retain_inlined_types)
- return schema
-
- if path.endswith('.idl'):
- idl = idl_schema.IDLSchema(idl_parser.IDLParser().ParseData(file_data))
- # Wrap the result in a list so that it behaves like JSON API data.
- return [trim_and_inline(idl.process()[0], is_idl=True)]
-
- try:
- schemas = json_parse.Parse(file_data)
- except:
- raise ValueError('Cannot parse "%s" as JSON:\n%s' %
- (path, traceback.format_exc()))
- for schema in schemas:
- # Schemas could consist of one API schema (data for a specific API file)
- # or multiple (data from extension_api.json).
- trim_and_inline(schema)
- return schemas

Powered by Google App Engine
This is Rietveld 408576698