diff options
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" } - ] - } -} |