diff options
author | ahernandez.miralles@gmail.com <ahernandez.miralles@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-09 20:19:26 +0000 |
---|---|---|
committer | ahernandez.miralles@gmail.com <ahernandez.miralles@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-09 20:19:26 +0000 |
commit | 2842a8f952bed9f6473ca274affbd5e56d167ef7 (patch) | |
tree | 55338e4c93bc85d6a7393141994825c450f96932 | |
parent | e48d70271398c9f7cc0f4113aa85272f9fab449f (diff) | |
download | chromium_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
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 |