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 |