Extension Docs Server: Include a list of samples used in the api reference page.

BUG=
TEST=


Review URL: https://chromiumcodereview.appspot.com/10835012

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149690 0039d316-1c4b-4281-b951-d872f2087c98
parent 9b205782
...@@ -16,24 +16,42 @@ class APIDataSource(object): ...@@ -16,24 +16,42 @@ class APIDataSource(object):
"""This class fetches and loads JSON APIs from the FileSystem passed in with """This class fetches and loads JSON APIs from the FileSystem passed in with
|cache_builder|, so the APIs can be plugged into templates. |cache_builder|, so the APIs can be plugged into templates.
""" """
def __init__(self, cache_builder, base_path): class Factory(object):
self._json_cache = cache_builder.build(self._LoadJsonAPI) def __init__(self, cache_builder, base_path, samples_factory):
self._idl_cache = cache_builder.build(self._LoadIdlAPI) self._permissions_cache = cache_builder.build(self._LoadPermissions)
self._permissions_cache = cache_builder.build(self._LoadPermissions) self._json_cache = cache_builder.build(self._LoadJsonAPI)
self._base_path = base_path self._idl_cache = cache_builder.build(self._LoadIdlAPI)
self._samples_factory = samples_factory
self._base_path = base_path
def Create(self, request):
return APIDataSource(self._permissions_cache,
self._json_cache,
self._idl_cache,
self._base_path,
self._samples_factory.Create(request))
def _LoadPermissions(self, json_str):
return json.loads(json_comment_eater.Nom(json_str))
def _LoadJsonAPI(self, api): def _LoadJsonAPI(self, api):
generator = HandlebarDictGenerator( return HandlebarDictGenerator(json.loads(json_comment_eater.Nom(api))[0])
json.loads(json_comment_eater.Nom(api))[0])
return generator.Generate()
def _LoadIdlAPI(self, api): def _LoadIdlAPI(self, api):
idl = idl_parser.IDLParser().ParseData(api) idl = idl_parser.IDLParser().ParseData(api)
generator = HandlebarDictGenerator(idl_schema.IDLSchema(idl).process()[0]) return HandlebarDictGenerator(idl_schema.IDLSchema(idl).process()[0])
return generator.Generate()
def _LoadPermissions(self, perms_json): def __init__(self,
return json.loads(json_comment_eater.Nom(perms_json)) permissions_cache,
json_cache,
idl_cache,
base_path,
samples):
self._base_path = base_path
self._permissions_cache = permissions_cache
self._json_cache = json_cache
self._idl_cache = idl_cache
self._samples = samples
def _GetFeature(self, path): def _GetFeature(self, path):
# Remove 'experimental_' from path name to match the keys in # Remove 'experimental_' from path name to match the keys in
...@@ -49,11 +67,17 @@ class APIDataSource(object): ...@@ -49,11 +67,17 @@ class APIDataSource(object):
except Exception: except Exception:
return None return None
def _AddPermissionsDict(self, api_dict, path): def _GenerateHandlebarContext(self, api_name, handlebar, path):
return_dict = { 'permissions': self._GetFeature(path) } return_dict = { 'permissions': self._GetFeature(path) }
return_dict.update(api_dict) return_dict.update(handlebar.Generate(
self._FilterSamples(api_name, self._samples.values())))
return return_dict return return_dict
def _FilterSamples(self, api_name, samples):
api_search = '.' + api_name + '.'
return [sample for sample in samples
if any(api_search in api['name'] for api in sample['api_calls'])]
def __getitem__(self, key): def __getitem__(self, key):
return self.get(key) return self.get(key)
...@@ -63,12 +87,13 @@ class APIDataSource(object): ...@@ -63,12 +87,13 @@ class APIDataSource(object):
json_path = unix_name + '.json' json_path = unix_name + '.json'
idl_path = unix_name + '.idl' idl_path = unix_name + '.idl'
try: try:
return self._AddPermissionsDict(self._json_cache.GetFromFile( return self._GenerateHandlebarContext(key,
self._base_path + '/' + json_path), path) self._json_cache.GetFromFile(self._base_path + '/' + json_path),
except Exception: path)
except OSError:
try: try:
return self._AddPermissionsDict(self._idl_cache.GetFromFile( return self._GenerateHandlebarContext(key,
self._base_path + '/' + idl_path), path) self._idl_cache.GetFromFile(self._base_path + '/' + idl_path),
except Exception as e: path)
logging.warn(e) except OSError as e:
raise raise
...@@ -11,6 +11,10 @@ from file_system_cache import FileSystemCache ...@@ -11,6 +11,10 @@ from file_system_cache import FileSystemCache
from local_file_system import LocalFileSystem from local_file_system import LocalFileSystem
from api_data_source import APIDataSource from api_data_source import APIDataSource
class FakeSamplesDataSource:
def Create(self, request):
return {}
class APIDataSourceTest(unittest.TestCase): class APIDataSourceTest(unittest.TestCase):
def setUp(self): def setUp(self):
self._base_path = os.path.join('test_data', 'test_json') self._base_path = os.path.join('test_data', 'test_json')
...@@ -21,11 +25,14 @@ class APIDataSourceTest(unittest.TestCase): ...@@ -21,11 +25,14 @@ class APIDataSourceTest(unittest.TestCase):
def testSimple(self): def testSimple(self):
cache_builder = FileSystemCache.Builder(LocalFileSystem(self._base_path)) cache_builder = FileSystemCache.Builder(LocalFileSystem(self._base_path))
data_source = APIDataSource(cache_builder, './') data_source_factory = APIDataSource.Factory(cache_builder,
'./',
FakeSamplesDataSource())
data_source = data_source_factory.Create({})
# Take the dict out of the list. # Take the dict out of the list.
expected = json.loads(self._ReadLocalFile('expected_test_file.json')) expected = json.loads(self._ReadLocalFile('expected_test_file.json'))
expected.update({ 'permissions': None }) expected['permissions'] = None
self.assertEqual(expected, data_source['test_file']) self.assertEqual(expected, data_source['test_file'])
self.assertEqual(expected, data_source['testFile']) self.assertEqual(expected, data_source['testFile'])
self.assertEqual(expected, data_source['testFile.html']) self.assertEqual(expected, data_source['testFile.html'])
......
...@@ -67,14 +67,15 @@ class HandlebarDictGenerator(object): ...@@ -67,14 +67,15 @@ class HandlebarDictGenerator(object):
{ 'href': ref_dict['href'], 'text': ref_dict['text'], 'rest': rest }) { 'href': ref_dict['href'], 'text': ref_dict['text'], 'rest': rest })
return ''.join(formatted_description) return ''.join(formatted_description)
def Generate(self): def Generate(self, samples):
try: try:
return { return {
'name': self._namespace.name, 'name': self._namespace.name,
'types': map(self._GenerateType, self._namespace.types.values()), 'types': map(self._GenerateType, self._namespace.types.values()),
'functions': self._GenerateFunctions(self._namespace.functions), 'functions': self._GenerateFunctions(self._namespace.functions),
'events': map(self._GenerateEvent, self._namespace.events.values()), 'events': map(self._GenerateEvent, self._namespace.events.values()),
'properties': self._GenerateProperties(self._namespace.properties) 'properties': self._GenerateProperties(self._namespace.properties),
'samples': samples,
} }
except Exception as e: except Exception as e:
logging.error(e) logging.error(e)
......
...@@ -35,7 +35,7 @@ class DictGeneratorTest(unittest.TestCase): ...@@ -35,7 +35,7 @@ class DictGeneratorTest(unittest.TestCase):
def _GenerateTest(self, filename): def _GenerateTest(self, filename):
expected_json = json.loads(self._ReadLocalFile('expected_' + filename)) expected_json = json.loads(self._ReadLocalFile('expected_' + filename))
gen = HandlebarDictGenerator(self._LoadJSON(filename)) gen = HandlebarDictGenerator(self._LoadJSON(filename))
self.assertEquals(expected_json, gen.Generate()) self.assertEquals(expected_json, gen.Generate([]))
def testGenerate(self): def testGenerate(self):
self._GenerateTest('test_file.json') self._GenerateTest('test_file.json')
...@@ -57,7 +57,7 @@ class DictGeneratorTest(unittest.TestCase): ...@@ -57,7 +57,7 @@ class DictGeneratorTest(unittest.TestCase):
self.assertEquals('234,567', _FormatValue(234567)) self.assertEquals('234,567', _FormatValue(234567))
def testFormatDescription(self): def testFormatDescription(self):
dict_ = HandlebarDictGenerator(self._LoadJSON('ref_test.json')).Generate() dict_ = HandlebarDictGenerator(self._LoadJSON('ref_test.json')).Generate([])
self.assertEquals(_MakeLink('#type-type2', 'type2'), self.assertEquals(_MakeLink('#type-type2', 'type2'),
_GetType(dict_, 'type1')['description']) _GetType(dict_, 'type1')['description'])
self.assertEquals( self.assertEquals(
......
...@@ -68,7 +68,6 @@ def _GetInstanceForBranch(branch, local_path): ...@@ -68,7 +68,6 @@ def _GetInstanceForBranch(branch, local_path):
AppEngineMemcache(branch)) AppEngineMemcache(branch))
cache_builder = FileSystemCache.Builder(file_system) cache_builder = FileSystemCache.Builder(file_system)
api_data_source = APIDataSource(cache_builder, API_PATH)
api_list_data_source = APIListDataSource(cache_builder, api_list_data_source = APIListDataSource(cache_builder,
file_system, file_system,
API_PATH, API_PATH,
...@@ -79,9 +78,12 @@ def _GetInstanceForBranch(branch, local_path): ...@@ -79,9 +78,12 @@ def _GetInstanceForBranch(branch, local_path):
file_system, file_system,
cache_builder, cache_builder,
EXAMPLES_PATH) EXAMPLES_PATH)
api_data_source_factory = APIDataSource.Factory(cache_builder,
API_PATH,
samples_data_source_factory)
template_data_source_factory = TemplateDataSource.Factory( template_data_source_factory = TemplateDataSource.Factory(
branch, branch,
api_data_source, api_data_source_factory,
api_list_data_source, api_list_data_source,
intro_data_source, intro_data_source,
samples_data_source_factory, samples_data_source_factory,
......
...@@ -111,6 +111,12 @@ class SamplesDataSource(object): ...@@ -111,6 +111,12 @@ class SamplesDataSource(object):
self._samples_path = samples_path self._samples_path = samples_path
self._request = request self._request = request
def GetSamplesForAPI(self, api_name):
samples = self.values()
api_search = '.' + api_name + '.'
return [sample for sample in samples
if any(api_search in api['name'] for api in sample['api_calls'])]
def _GetAcceptedLanguages(self): def _GetAcceptedLanguages(self):
accept_language = self._request.headers.get('Accept-Language', None) accept_language = self._request.headers.get('Accept-Language', None)
if accept_language is None: if accept_language is None:
...@@ -121,6 +127,9 @@ class SamplesDataSource(object): ...@@ -121,6 +127,9 @@ class SamplesDataSource(object):
def __getitem__(self, key): def __getitem__(self, key):
return self.get(key) return self.get(key)
def values(self):
return self.get('')
def get(self, key): def get(self, key):
samples_list = self._cache.GetFromFileListing(self._samples_path + '/') samples_list = self._cache.GetFromFileListing(self._samples_path + '/')
return_list = [] return_list = []
......
...@@ -39,7 +39,7 @@ class TemplateDataSource(object): ...@@ -39,7 +39,7 @@ class TemplateDataSource(object):
""" """
def __init__(self, def __init__(self,
branch, branch,
api_data_source, api_data_source_factory,
api_list_data_source, api_list_data_source,
intro_data_source, intro_data_source,
samples_data_source_factory, samples_data_source_factory,
...@@ -49,7 +49,7 @@ class TemplateDataSource(object): ...@@ -49,7 +49,7 @@ class TemplateDataSource(object):
self._branch_info = _MakeBranchDict(branch) self._branch_info = _MakeBranchDict(branch)
self._static_resources = ((('/' + branch) if branch != 'local' else '') + self._static_resources = ((('/' + branch) if branch != 'local' else '') +
'/static') '/static')
self._api_data_source = api_data_source self._api_data_source_factory = api_data_source_factory
self._api_list_data_source = api_list_data_source self._api_list_data_source = api_list_data_source
self._intro_data_source = intro_data_source self._intro_data_source = intro_data_source
self._samples_data_source_factory = samples_data_source_factory self._samples_data_source_factory = samples_data_source_factory
...@@ -60,16 +60,17 @@ class TemplateDataSource(object): ...@@ -60,16 +60,17 @@ class TemplateDataSource(object):
def Create(self, request): def Create(self, request):
"""Returns a new TemplateDataSource bound to |request|. """Returns a new TemplateDataSource bound to |request|.
""" """
return TemplateDataSource(self._branch_info, return TemplateDataSource(
self._static_resources, self._branch_info,
self._api_data_source, self._static_resources,
self._api_list_data_source, self._api_data_source_factory.Create(request),
self._intro_data_source, self._api_list_data_source,
self._samples_data_source_factory, self._intro_data_source,
self._cache, self._samples_data_source_factory.Create(request),
self._public_template_path, self._cache,
self._private_template_path, self._public_template_path,
request) self._private_template_path,
request)
def __init__(self, def __init__(self,
branch_info, branch_info,
...@@ -77,17 +78,17 @@ class TemplateDataSource(object): ...@@ -77,17 +78,17 @@ class TemplateDataSource(object):
api_data_source, api_data_source,
api_list_data_source, api_list_data_source,
intro_data_source, intro_data_source,
samples_data_source_factory, samples_data_source,
cache, cache,
public_template_path, public_template_path,
private_template_path, private_template_path,
request): request):
self._branch_info = branch_info self._branch_info = branch_info
self._static_resources = static_resources self._static_resources = static_resources
self._api_data_source = api_data_source
self._api_list_data_source = api_list_data_source self._api_list_data_source = api_list_data_source
self._intro_data_source = intro_data_source self._intro_data_source = intro_data_source
self._samples_data_source = samples_data_source_factory.Create(request) self._samples_data_source = samples_data_source
self._api_data_source = api_data_source
self._cache = cache self._cache = cache
self._public_template_path = public_template_path self._public_template_path = public_template_path
self._private_template_path = private_template_path self._private_template_path = private_template_path
......
...@@ -15,6 +15,13 @@ from third_party.handlebar import Handlebar ...@@ -15,6 +15,13 @@ from third_party.handlebar import Handlebar
class _FakeRequest(object): class _FakeRequest(object):
pass pass
class _FakeApiDataSourceFactory(object):
def __init__(self, input_dict):
self._input_dict = input_dict
def Create(self, samples):
return self._input_dict
class _FakeSamplesDataSource(object): class _FakeSamplesDataSource(object):
def Create(self, request): def Create(self, request):
return {} return {}
...@@ -22,7 +29,7 @@ class _FakeSamplesDataSource(object): ...@@ -22,7 +29,7 @@ class _FakeSamplesDataSource(object):
class TemplateDataSourceTest(unittest.TestCase): class TemplateDataSourceTest(unittest.TestCase):
def setUp(self): def setUp(self):
self._base_path = os.path.join('test_data', 'template_data_source') self._base_path = os.path.join('test_data', 'template_data_source')
self._fake_api_data_source = {} self._fake_api_data_source_factory = _FakeApiDataSourceFactory({})
self._fake_api_list_data_source = {} self._fake_api_list_data_source = {}
self._fake_intro_data_source = {} self._fake_intro_data_source = {}
self._fake_samples_data_source = _FakeSamplesDataSource() self._fake_samples_data_source = _FakeSamplesDataSource()
...@@ -40,7 +47,7 @@ class TemplateDataSourceTest(unittest.TestCase): ...@@ -40,7 +47,7 @@ class TemplateDataSourceTest(unittest.TestCase):
def _CreateTemplateDataSource(self, input_dict, cache_builder): def _CreateTemplateDataSource(self, input_dict, cache_builder):
return (TemplateDataSource.Factory('fake_branch', return (TemplateDataSource.Factory('fake_branch',
input_dict, _FakeApiDataSourceFactory(input_dict),
self._fake_api_list_data_source, self._fake_api_list_data_source,
self._fake_intro_data_source, self._fake_intro_data_source,
self._fake_samples_data_source, self._fake_samples_data_source,
...@@ -53,8 +60,8 @@ class TemplateDataSourceTest(unittest.TestCase): ...@@ -53,8 +60,8 @@ class TemplateDataSourceTest(unittest.TestCase):
self._base_path = os.path.join(self._base_path, 'simple') self._base_path = os.path.join(self._base_path, 'simple')
fetcher = LocalFileSystem(self._base_path) fetcher = LocalFileSystem(self._base_path)
cache_builder = FileSystemCache.Builder(fetcher) cache_builder = FileSystemCache.Builder(fetcher)
t_data_source = self._CreateTemplateDataSource(self._fake_api_data_source, t_data_source = self._CreateTemplateDataSource(
cache_builder) self._fake_api_data_source_factory, cache_builder)
template_a1 = Handlebar(self._ReadLocalFile('test1.html')) template_a1 = Handlebar(self._ReadLocalFile('test1.html'))
self.assertEqual(template_a1.render({}, {'templates': {}}).text, self.assertEqual(template_a1.render({}, {'templates': {}}).text,
t_data_source['test1'].render({}, {'templates': {}}).text) t_data_source['test1'].render({}, {'templates': {}}).text)
...@@ -69,8 +76,8 @@ class TemplateDataSourceTest(unittest.TestCase): ...@@ -69,8 +76,8 @@ class TemplateDataSourceTest(unittest.TestCase):
self._base_path = os.path.join(self._base_path, 'partials') self._base_path = os.path.join(self._base_path, 'partials')
fetcher = LocalFileSystem(self._base_path) fetcher = LocalFileSystem(self._base_path)
cache_builder = FileSystemCache.Builder(fetcher) cache_builder = FileSystemCache.Builder(fetcher)
t_data_source = self._CreateTemplateDataSource(self._fake_api_data_source, t_data_source = self._CreateTemplateDataSource(
cache_builder) self._fake_api_data_source_factory, cache_builder)
self.assertEqual( self.assertEqual(
self._ReadLocalFile('test_expected.html'), self._ReadLocalFile('test_expected.html'),
t_data_source['test_tmpl'].render( t_data_source['test_tmpl'].render(
......
...@@ -26,3 +26,9 @@ ...@@ -26,3 +26,9 @@
{{/}} {{/}}
{{/api.events}} {{/api.events}}
</div> </div>
<a name="samples"></a>
{{?api.samples}}<h2>Sample extensions that use chrome.{{api.name}}</h2>{{/}}
{{#api.samples}}
<a name="sample-{{?prefix}}{{prefix}}-{{/}}{{name}}"></a>
<li><b><a href="{{path}}.zip">{{name}}</a></b> &ndash; {{description}}</li>
{{/}}
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
{{?api.properties}}<li>{{+partials.toc_properties}}</li>{{/}} {{?api.properties}}<li>{{+partials.toc_properties}}</li>{{/}}
{{?api.functions}}<li>{{+partials.toc_functions}}</li>{{/}} {{?api.functions}}<li>{{+partials.toc_functions}}</li>{{/}}
{{?api.events}}<li>{{+partials.toc_events}}</li>{{/}} {{?api.events}}<li>{{+partials.toc_events}}</li>{{/}}
{{?api.samples}}<li>{{+partials.toc_samples}}</li>{{/}}
{{/api}} {{/api}}
</ol> </ol>
</li> </li>
......
<a href="#{{?prefix}}{{prefix}}-{{/}}samples">Sample Extensions</a>
...@@ -101,8 +101,8 @@ ...@@ -101,8 +101,8 @@
"description": "Gets stuff." "description": "Gets stuff."
} }
], ],
"properties": [],
"name": "tester", "name": "tester",
"properties": [],
"types": [ "types": [
{ {
"functions": [], "functions": [],
...@@ -159,5 +159,6 @@ ...@@ -159,5 +159,6 @@
], ],
"description": "A cool event." "description": "A cool event."
} }
] ],
"samples": []
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment