summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorahernandez.miralles@gmail.com <ahernandez.miralles@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-09 20:19:26 +0000
committerahernandez.miralles@gmail.com <ahernandez.miralles@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-09 20:19:26 +0000
commit2842a8f952bed9f6473ca274affbd5e56d167ef7 (patch)
tree55338e4c93bc85d6a7393141994825c450f96932
parente48d70271398c9f7cc0f4113aa85272f9fab449f (diff)
downloadchromium_src-2842a8f952bed9f6473ca274affbd5e56d167ef7.zip
chromium_src-2842a8f952bed9f6473ca274affbd5e56d167ef7.tar.gz
chromium_src-2842a8f952bed9f6473ca274affbd5e56d167ef7.tar.bz2
Refactor APIDataSource to work with DataSourceRegistry
BUG=275039 NOTRY=true Review URL: https://codereview.chromium.org/228723005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262792 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/common/extensions/docs/server2/api_data_source.py143
-rwxr-xr-xchrome/common/extensions/docs/server2/api_data_source_test.py44
-rw-r--r--chrome/common/extensions/docs/server2/data_source_registry.py2
-rw-r--r--chrome/common/extensions/docs/server2/server_instance.py11
-rw-r--r--chrome/common/extensions/docs/server2/template_renderer.py1
5 files changed, 54 insertions, 147 deletions
diff --git a/chrome/common/extensions/docs/server2/api_data_source.py b/chrome/common/extensions/docs/server2/api_data_source.py
index 8ed0daa..743bb08 100644
--- a/chrome/common/extensions/docs/server2/api_data_source.py
+++ b/chrome/common/extensions/docs/server2/api_data_source.py
@@ -7,8 +7,11 @@ import logging
import os
import posixpath
+from data_source import DataSource
from environment import IsPreviewServer
from extensions_paths import JSON_TEMPLATES, PRIVATE_TEMPLATES
+from file_system import FileNotFoundError
+from future import Future, Collect
import third_party.json_schema_compiler.json_parse as json_parse
import third_party.json_schema_compiler.model as model
from environment import IsPreviewServer
@@ -68,13 +71,11 @@ class _JSCModel(object):
def __init__(self,
api_name,
api_models,
- disable_refs,
availability_finder,
json_cache,
template_cache,
features_bundle,
event_byname_function):
- self._disable_refs = disable_refs
self._availability_finder = availability_finder
self._api_availabilities = json_cache.GetFromFile(
posixpath.join(JSON_TEMPLATES, 'api_availabilities.json'))
@@ -105,16 +106,12 @@ class _JSCModel(object):
'events': self._GenerateEvents(self._namespace.events),
'domEvents': self._GenerateDomEvents(self._namespace.events),
'properties': self._GenerateProperties(self._namespace.properties),
+ 'introList': self._GetIntroTableList(),
+ 'channelWarning': self._GetChannelWarning(),
}
if self._namespace.deprecated:
as_dict['deprecated'] = self._namespace.deprecated
- # Rendering the intro list is really expensive and there's no point doing it
- # unless we're rending the page - and disable_refs=True implies we're not.
- if not self._disable_refs:
- as_dict.update({
- 'introList': self._GetIntroTableList(),
- 'channelWarning': self._GetChannelWarning(),
- })
+
as_dict['byName'] = _GetByNameDict(as_dict)
return as_dict
@@ -193,9 +190,7 @@ class _JSCModel(object):
}
self._AddCommonProperties(event_dict, event)
# Add the Event members to each event in this object.
- # If refs are disabled then don't worry about this, since it's only needed
- # for rendering, and disable_refs=True implies we're not rendering.
- if self._event_byname_function and not self._disable_refs:
+ if self._event_byname_function:
event_dict['byName'].update(self._event_byname_function())
# We need to create the method description for addListener based on the
# information stored in |event|.
@@ -468,87 +463,51 @@ class _LazySamplesGetter(object):
return self._samples.FilterSamples(key, self._api_name)
-class APIDataSource(object):
+class APIDataSource(DataSource):
'''This class fetches and loads JSON APIs from the FileSystem passed in with
|compiled_fs_factory|, so the APIs can be plugged into templates.
'''
-
- class Factory(object):
- def __init__(self,
- compiled_fs_factory,
- file_system,
- availability_finder,
- api_models,
- features_bundle,
- object_store_creator):
- self._json_cache = compiled_fs_factory.ForJson(file_system)
- self._template_cache = compiled_fs_factory.ForTemplates(file_system)
- self._availability_finder = availability_finder
- self._api_models = api_models
- self._features_bundle = features_bundle
- self._model_cache_refs = object_store_creator.Create(
- APIDataSource, 'model-cache-refs')
- self._model_cache_no_refs = object_store_creator.Create(
- APIDataSource, 'model-cache-no-refs')
-
- # These must be set later via the SetFooDataSourceFactory methods.
- self._samples_data_source_factory = None
-
- # This caches the result of _LoadEventByName.
- self._event_byname = None
-
- def SetSamplesDataSourceFactory(self, samples_data_source_factory):
- self._samples_data_source_factory = samples_data_source_factory
-
- def Create(self, request):
- '''Creates an APIDataSource.
- '''
- if self._samples_data_source_factory is None:
- # Only error if there is a request, which means this APIDataSource is
- # actually being used to render a page.
- if request is not None:
- logging.error('SamplesDataSource.Factory was never set in '
- 'APIDataSource.Factory.')
- samples = None
- else:
- samples = self._samples_data_source_factory.Create(request)
- return APIDataSource(self._GetSchemaModel, samples)
-
- def _LoadEventByName(self):
- '''All events have some members in common. We source their description
- from Event in events.json.
- '''
- if self._event_byname is None:
- self._event_byname = _GetEventByNameFromEvents(
- self._GetSchemaModel('events', True))
- return self._event_byname
-
- def _GetModelCache(self, disable_refs):
- if disable_refs:
- return self._model_cache_no_refs
- return self._model_cache_refs
-
- def _GetSchemaModel(self, api_name, disable_refs):
- jsc_model = self._GetModelCache(disable_refs).Get(api_name).Get()
- if jsc_model is not None:
- return jsc_model
-
- jsc_model = _JSCModel(
- api_name,
- self._api_models,
- disable_refs,
- self._availability_finder,
- self._json_cache,
- self._template_cache,
- self._features_bundle,
- self._LoadEventByName).ToDict()
-
- self._GetModelCache(disable_refs).Set(api_name, jsc_model)
+ def __init__(self, server_instance, request):
+ file_system = server_instance.host_file_system_provider.GetTrunk()
+ self._json_cache = server_instance.compiled_fs_factory.ForJson(file_system)
+ self._template_cache = server_instance.compiled_fs_factory.ForTemplates(
+ file_system)
+ self._availability_finder = server_instance.availability_finder
+ self._api_models = server_instance.api_models
+ self._features_bundle = server_instance.features_bundle
+ self._model_cache = server_instance.object_store_creator.Create(
+ APIDataSource)
+
+ # This caches the result of _LoadEventByName.
+ self._event_byname = None
+ self._samples = server_instance.samples_data_source_factory.Create(request)
+
+ def _LoadEventByName(self):
+ '''All events have some members in common. We source their description
+ from Event in events.json.
+ '''
+ if self._event_byname is None:
+ self._event_byname = _GetEventByNameFromEvents(
+ self._GetSchemaModel('events'))
+ return self._event_byname
+
+ def _GetSchemaModel(self, api_name):
+ jsc_model = self._model_cache.Get(api_name).Get()
+ if jsc_model is not None:
return jsc_model
- def __init__(self, get_schema_model, samples):
- self._get_schema_model = get_schema_model
- self._samples = samples
+ jsc_model = _JSCModel(
+ api_name,
+ self._api_models,
+ self._availability_finder,
+ self._json_cache,
+ self._template_cache,
+ self._features_bundle,
+ self._LoadEventByName).ToDict()
+
+ self._model_cache.Set(api_name, jsc_model)
+ return jsc_model
+
def _GenerateHandlebarContext(self, handlebar_dict):
# Parsing samples on the preview server takes seconds and doesn't add
@@ -559,6 +518,8 @@ class APIDataSource(object):
self._samples)
return handlebar_dict
- def get(self, api_name, disable_refs=False):
- return self._GenerateHandlebarContext(
- self._get_schema_model(api_name, disable_refs))
+ def get(self, api_name):
+ return self._GenerateHandlebarContext(self._GetSchemaModel(api_name))
+
+ def Cron(self):
+ return Future(value=())
diff --git a/chrome/common/extensions/docs/server2/api_data_source_test.py b/chrome/common/extensions/docs/server2/api_data_source_test.py
index 9d0a537..836c4b4 100755
--- a/chrome/common/extensions/docs/server2/api_data_source_test.py
+++ b/chrome/common/extensions/docs/server2/api_data_source_test.py
@@ -42,45 +42,6 @@ class _FakeAvailabilityFinder(object):
return ChannelInfo('stable', '396', 5)
-class _FakeSamplesDataSource(object):
-
- def Create(self, request):
- return {}
-
-
-# Sad irony :(
-class _FakeAPIDataSource(object):
-
- def __init__(self, json_data):
- self._json = json_data
-
- def Create(self, *args, **kwargs):
- return self
-
- def get(self, key, disable_refs=False):
- if key not in self._json:
- raise FileNotFoundError(key)
- return self._json[key]
-
-
-class _FakeNamespace(object):
-
- def __init__(self):
- self.documentation_options = {}
-
-
-class _FakeAPIModels(object):
-
- def __init__(self, names):
- self._names = names
-
- def GetNames(self):
- return self._names
-
- def GetModel(self, name):
- return Future(value=_FakeNamespace())
-
-
class _FakeTemplateCache(object):
def GetFromFile(self, key):
@@ -120,7 +81,6 @@ class APIDataSourceTest(unittest.TestCase):
def testCreateId(self):
dict_ = _JSCModel('tester',
self._api_models,
- False,
_FakeAvailabilityFinder(),
self._json_cache,
_FakeTemplateCache(),
@@ -137,7 +97,6 @@ class APIDataSourceTest(unittest.TestCase):
expected_json = self._LoadJSON('expected_tester.json')
dict_ = _JSCModel('tester',
self._api_models,
- False,
_FakeAvailabilityFinder(),
self._json_cache,
_FakeTemplateCache(),
@@ -162,7 +121,6 @@ class APIDataSourceTest(unittest.TestCase):
for api_name, availability in api_availabilities.iteritems():
model = _JSCModel(api_name,
self._avail_api_models,
- True,
self._avail_finder,
self._avail_json_cache,
_FakeTemplateCache(),
@@ -173,7 +131,6 @@ class APIDataSourceTest(unittest.TestCase):
def testGetIntroList(self):
model = _JSCModel('tester',
self._api_models,
- False,
_FakeAvailabilityFinder(),
self._json_cache,
_FakeTemplateCache(),
@@ -245,7 +202,6 @@ class APIDataSourceTest(unittest.TestCase):
def testAddRules(self):
dict_ = _JSCModel('add_rules_tester',
self._api_models,
- False,
_FakeAvailabilityFinder(),
self._json_cache,
_FakeTemplateCache(),
diff --git a/chrome/common/extensions/docs/server2/data_source_registry.py b/chrome/common/extensions/docs/server2/data_source_registry.py
index 7588811..c864561 100644
--- a/chrome/common/extensions/docs/server2/data_source_registry.py
+++ b/chrome/common/extensions/docs/server2/data_source_registry.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from api_data_source import APIDataSource
from api_list_data_source import APIListDataSource
from data_source import DataSource
from manifest_data_source import ManifestDataSource
@@ -14,6 +15,7 @@ from whats_new_data_source import WhatsNewDataSource
_all_data_sources = {
+ 'apis': APIDataSource,
'api_list': APIListDataSource,
'articles': ArticleDataSource,
'intros': IntroDataSource,
diff --git a/chrome/common/extensions/docs/server2/server_instance.py b/chrome/common/extensions/docs/server2/server_instance.py
index 96de047..ced220c 100644
--- a/chrome/common/extensions/docs/server2/server_instance.py
+++ b/chrome/common/extensions/docs/server2/server_instance.py
@@ -93,14 +93,6 @@ class ServerInstance(object):
host_fs_at_trunk,
compiled_fs_factory)
- self.api_data_source_factory = APIDataSource.Factory(
- self.compiled_fs_factory,
- host_fs_at_trunk,
- self.availability_finder,
- self.api_models,
- self.features_bundle,
- self.object_store_creator)
-
self.ref_resolver = ReferenceResolver(
self.api_models,
self.object_store_creator.Create(ReferenceResolver))
@@ -123,9 +115,6 @@ class ServerInstance(object):
self.ref_resolver,
base_path)
- self.api_data_source_factory.SetSamplesDataSourceFactory(
- self.samples_data_source_factory)
-
self.content_providers = ContentProviders(
object_store_creator,
self.compiled_fs_factory,
diff --git a/chrome/common/extensions/docs/server2/template_renderer.py b/chrome/common/extensions/docs/server2/template_renderer.py
index 3316ec7..d2b1147 100644
--- a/chrome/common/extensions/docs/server2/template_renderer.py
+++ b/chrome/common/extensions/docs/server2/template_renderer.py
@@ -51,7 +51,6 @@ class TemplateRenderer(object):
server_instance = self._server_instance
data_sources = CreateDataSources(server_instance, request=request)
data_sources.update({
- 'apis': server_instance.api_data_source_factory.Create(request),
'samples': server_instance.samples_data_source_factory.Create(request),
})
return data_sources