summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/common/extensions/docs/server2/reference_resolver.py24
-rwxr-xr-xchrome/common/extensions/docs/server2/reference_resolver_test.py256
-rw-r--r--chrome/common/extensions/docs/server2/server_instance.py1
-rw-r--r--chrome/common/extensions/docs/server2/test_data/test_json/fake_data_source.json112
4 files changed, 244 insertions, 149 deletions
diff --git a/chrome/common/extensions/docs/server2/reference_resolver.py b/chrome/common/extensions/docs/server2/reference_resolver.py
index fe06eeb..7ffb034 100644
--- a/chrome/common/extensions/docs/server2/reference_resolver.py
+++ b/chrome/common/extensions/docs/server2/reference_resolver.py
@@ -7,9 +7,10 @@ import logging
import re
from file_system import FileNotFoundError
+from third_party.json_schema_compiler.model import PropertyType
-def _ClassifySchemaNode(node_name, api):
+def _ClassifySchemaNode(node_name, node):
"""Attempt to classify |node_name| in an API, determining whether |node_name|
refers to a type, function, event, or property in |api|.
"""
@@ -21,8 +22,8 @@ def _ClassifySchemaNode(node_name, api):
('functions', 'method'),
('events', 'event'),
('properties', 'property')]:
- for item in api.get(key, []):
- if item['name'] == node_name:
+ for item in getattr(node, key, {}).itervalues():
+ if item.simple_name == node_name:
if rest is not None:
ret = _ClassifySchemaNode(rest, item)
if ret is not None:
@@ -60,8 +61,7 @@ class ReferenceResolver(object):
# Matches after a $ref: that doesn't have []s.
_bare_ref = re.compile('\w+(\.\w+)*')
- def __init__(self, api_data_source, api_models, object_store):
- self._api_data_source = api_data_source
+ def __init__(self, api_models, object_store):
self._api_models = api_models
self._object_store = object_store
@@ -73,24 +73,24 @@ class ReferenceResolver(object):
if api_name not in api_list:
continue
try:
- api = self._api_data_source.get(api_name, disable_refs=True)
+ api_model = self._api_models.GetModel(api_name).Get()
except FileNotFoundError:
continue
name = '.'.join(parts[i:])
# Attempt to find |name| in the API.
- node_info = _ClassifySchemaNode(name, api)
+ node_info = _ClassifySchemaNode(name, api_model)
if node_info is None:
# Check to see if this ref is a property. If it is, we want the ref to
# the underlying type the property is referencing.
- for prop in api.get('properties', []):
+ for prop in api_model.properties.itervalues():
# If the name of this property is in the ref text, replace the
# property with its type, and attempt to classify it.
- if prop['name'] in name and 'link' in prop:
- name_as_prop_type = name.replace(prop['name'], prop['link']['name'])
- node_info = _ClassifySchemaNode(name_as_prop_type, api)
+ if prop.name in name and prop.type_.property_type == PropertyType.REF:
+ name_as_prop_type = name.replace(prop.name, prop.type_.ref_type)
+ node_info = _ClassifySchemaNode(name_as_prop_type, api_model)
if node_info is not None:
name = name_as_prop_type
- text = ref.replace(prop['name'], prop['link']['name'])
+ text = ref.replace(prop.name, prop.type_.ref_type)
break
if node_info is None:
continue
diff --git a/chrome/common/extensions/docs/server2/reference_resolver_test.py b/chrome/common/extensions/docs/server2/reference_resolver_test.py
index fcb8842..f4b6f78 100755
--- a/chrome/common/extensions/docs/server2/reference_resolver_test.py
+++ b/chrome/common/extensions/docs/server2/reference_resolver_test.py
@@ -3,43 +3,253 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import json
import os
-import sys
import unittest
-from file_system import FileNotFoundError
from future import Future
from reference_resolver import ReferenceResolver
from test_object_store import TestObjectStore
from test_util import Server2Path
+from third_party.json_schema_compiler.model import Namespace
-class _FakeAPIDataSource(object):
- def __init__(self, json_data):
- self._json = json_data
-
- def get(self, key, disable_refs=False):
- assert disable_refs, 'ReferenceResolve should be disabling refs'
- if key not in self._json:
- raise FileNotFoundError(key)
- return self._json[key]
-
-
-class _FakeNamespace(object):
- def __init__(self):
- self.documentation_options = {}
+_TEST_DATA = {
+ 'baz': {
+ 'namespace': 'baz',
+ 'description': '',
+ 'types': [
+ {
+ 'id': 'baz_t1',
+ 'type': 'any',
+ },
+ {
+ 'id': 'baz_t2',
+ 'type': 'any',
+ },
+ {
+ 'id': 'baz_t3',
+ 'type': 'any',
+ }
+ ],
+ 'functions': [
+ {
+ 'name': 'baz_f1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'baz_f2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'baz_f3',
+ 'type': 'function'
+ }
+ ],
+ 'events': [
+ {
+ 'name': 'baz_e1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'baz_e2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'baz_e3',
+ 'type': 'function'
+ }
+ ],
+ 'properties': {
+ 'baz_p1': {'type': 'any'},
+ 'baz_p2': {'type': 'any'},
+ 'baz_p3': {'type': 'any'}
+ }
+ },
+ 'bar.bon': {
+ 'namespace': 'bar.bon',
+ 'description': '',
+ 'types': [
+ {
+ 'id': 'bar_bon_t1',
+ 'type': 'any',
+ },
+ {
+ 'id': 'bar_bon_t2',
+ 'type': 'any',
+ },
+ {
+ 'id': 'bar_bon_t3',
+ 'type': 'any',
+ }
+ ],
+ 'functions': [
+ {
+ 'name': 'bar_bon_f1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_bon_f2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_bon_f3',
+ 'type': 'function'
+ }
+ ],
+ 'events': [
+ {
+ 'name': 'bar_bon_e1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_bon_e2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_bon_e3',
+ 'type': 'function'
+ }
+ ],
+ 'properties': {
+ 'bar_bon_p1': {'type': 'any'},
+ 'bar_bon_p2': {'type': 'any'},
+ 'bar_bon_p3': {'type': 'any'}
+ }
+ },
+ 'bar': {
+ 'namespace': 'bar',
+ 'description': '',
+ 'types': [
+ {
+ 'id': 'bar_t1',
+ 'type': 'any',
+ 'properties': {
+ 'bar_t1_p1': {
+ 'type': 'any'
+ }
+ }
+ },
+ {
+ 'id': 'bar_t2',
+ 'type': 'any',
+ 'properties': {
+ 'bar_t2_p1': {
+ 'type': 'any'
+ }
+ }
+ },
+ {
+ 'id': 'bar_t3',
+ 'type': 'any',
+ },
+ {
+ 'id': 'bon',
+ 'type': 'any'
+ }
+ ],
+ 'functions': [
+ {
+ 'name': 'bar_f1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_f2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_f3',
+ 'type': 'function'
+ }
+ ],
+ 'events': [
+ {
+ 'name': 'bar_e1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_e2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'bar_e3',
+ 'type': 'function'
+ }
+ ],
+ 'properties': {
+ 'bar_p1': {'type': 'any'},
+ 'bar_p2': {'type': 'any'},
+ 'bar_p3': {'$ref': 'bar_t1'}
+ }
+ },
+ 'foo': {
+ 'namespace': 'foo',
+ 'description': '',
+ 'types': [
+ {
+ 'id': 'foo_t1',
+ 'type': 'any',
+ },
+ {
+ 'id': 'foo_t2',
+ 'type': 'any',
+ },
+ {
+ 'id': 'foo_t3',
+ 'type': 'any',
+ 'events': [
+ {
+ 'name': 'foo_t3_e1',
+ 'type': 'function'
+ }
+ ]
+ }
+ ],
+ 'functions': [
+ {
+ 'name': 'foo_f1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'foo_f2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'foo_f3',
+ 'type': 'function'
+ }
+ ],
+ 'events': [
+ {
+ 'name': 'foo_e1',
+ 'type': 'function'
+ },
+ {
+ 'name': 'foo_e2',
+ 'type': 'function'
+ },
+ {
+ 'name': 'foo_e3',
+ 'type': 'function'
+ }
+ ],
+ 'properties': {
+ 'foo_p1': {'$ref': 'foo_t3'},
+ 'foo_p2': {'type': 'any'},
+ 'foo_p3': {'type': 'any'}
+ }
+ }
+}
class _FakeAPIModels(object):
- def __init__(self, names):
- self._names = names
+ def __init__(self, apis):
+ self._apis = apis
def GetNames(self):
- return self._names
+ return self._apis.keys()
def GetModel(self, name):
- return Future(value=_FakeNamespace())
+ return Future(value=Namespace(self._apis[name], 'fake/path.json'))
class ReferenceResolverTest(unittest.TestCase):
@@ -51,9 +261,7 @@ class ReferenceResolverTest(unittest.TestCase):
return f.read()
def testGetLink(self):
- test_data = json.loads(self._ReadLocalFile('fake_data_source.json'))
- resolver = ReferenceResolver(_FakeAPIDataSource(test_data),
- _FakeAPIModels(test_data.keys()),
+ resolver = ReferenceResolver(_FakeAPIModels(_TEST_DATA),
TestObjectStore('test'))
self.assertEqual({
'href': 'foo',
diff --git a/chrome/common/extensions/docs/server2/server_instance.py b/chrome/common/extensions/docs/server2/server_instance.py
index 95cb56b..96de047 100644
--- a/chrome/common/extensions/docs/server2/server_instance.py
+++ b/chrome/common/extensions/docs/server2/server_instance.py
@@ -102,7 +102,6 @@ class ServerInstance(object):
self.object_store_creator)
self.ref_resolver = ReferenceResolver(
- self.api_data_source_factory.Create(None),
self.api_models,
self.object_store_creator.Create(ReferenceResolver))
diff --git a/chrome/common/extensions/docs/server2/test_data/test_json/fake_data_source.json b/chrome/common/extensions/docs/server2/test_data/test_json/fake_data_source.json
deleted file mode 100644
index 49a4b1c..0000000
--- a/chrome/common/extensions/docs/server2/test_data/test_json/fake_data_source.json
+++ /dev/null
@@ -1,112 +0,0 @@
-{
- "baz": {
- "events": [
- { "name": "baz_e1" },
- { "name": "baz_e2" },
- { "name": "baz_e3" }
- ],
- "functions": [
- { "name": "baz_f1" },
- { "name": "baz_f2" },
- { "name": "baz_f3" }
- ],
- "types": [
- { "name": "baz_t1" },
- { "name": "baz_t2" },
- { "name": "baz_t3" }
- ],
- "properties": [
- { "name": "baz_p1" },
- { "name": "baz_p2" },
- { "name": "baz_p3" }
- ]
- },
- "bar.bon": {
- "events": [
- { "name": "bar_bon_e1" },
- { "name": "bar_bon_e2" },
- { "name": "bar_bon_e3" }
- ],
- "functions": [
- { "name": "bar_bon_f1" },
- { "name": "bar_bon_f2" },
- { "name": "bar_bon_f3" }
- ],
- "types": [
- { "name": "bar_bon_t1" },
- { "name": "bar_bon_t2" },
- { "name": "bar_bon_t3" }
- ],
- "properties": [
- { "name": "bar_bon_p1" },
- { "name": "bar_bon_p2" },
- { "name": "bar_bon_p3" }
- ]
- },
- "bar": {
- "events": [
- { "name": "bar_e1" },
- { "name": "bar_e2" },
- { "name": "bar_e3" }
- ],
- "functions": [
- { "name": "bar_f1" },
- { "name": "bar_f2" },
- { "name": "bar_f3" }
- ],
- "types": [
- {
- "name": "bar_t1",
- "properties": [
- { "name": "bar_t1_p1" }
- ]
- },
- {
- "name": "bar_t2",
- "properties": [
- { "name": "bar_t2_p1" }
- ]
- },
- { "name": "bar_t3" },
- { "name": "bon" }
- ],
- "properties": [
- { "name": "bar_p1" },
- { "name": "bar_p2" },
- {
- "name": "bar_p3",
- "link": { "name": "bar_t1" }
- }
- ]
- },
- "foo": {
- "events": [
- { "name": "foo_e1" },
- { "name": "foo_e2" },
- { "name": "foo_e3" }
- ],
- "functions": [
- { "name": "foo_f1" },
- { "name": "foo_f2" },
- { "name": "foo_f3" }
- ],
- "types": [
- { "name": "foo_t1" },
- { "name": "foo_t2" },
- {
- "name": "foo_t3",
- "events": [
- { "name": "foo_t3_e1" }
- ]
- }
- ],
- "properties": [
- {
- "name": "foo_p1",
- "link": { "name": "foo_t3" }
- },
- { "name": "foo_p2" },
- { "name": "foo_p3" }
- ]
- }
-}