Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: chrome/common/extensions/docs/server2/api_list_data_source.py

Issue 13470005: Refactor the devserver to make it easier to control caching (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cduvall, rebase Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging 5 import logging
6 import os 6 import os
7 7
8 from file_system import FileNotFoundError 8 from file_system import FileNotFoundError
9 import compiled_file_system as compiled_fs
10 import third_party.json_schema_compiler.model as model 9 import third_party.json_schema_compiler.model as model
11 from docs_server_utils import SanitizeAPIName 10 import docs_server_utils as utils
11
12 # Increment this if the data model changes for APIDataSource.
13 _VERSION = 1
12 14
13 # These files are special cases that shouldn't be in the API list. 15 # These files are special cases that shouldn't be in the API list.
14 IGNORED_FILES = [ 16 IGNORED_FILES = [
15 'devtools' 17 'devtools'
16 ] 18 ]
17 19
18 class APIListDataSource(object): 20 class APIListDataSource(object):
19 """ This class creates a list of chrome.* APIs and chrome.experimental.* APIs 21 """ This class creates a list of chrome.* APIs and chrome.experimental.* APIs
20 that are used in the api_index.html and experimental.html pages. 22 for extensions and apps that are used in the api_index.html and
23 experimental.html pages.
24 |api_path| is the path to the API schemas.
25 |public_path| is the path to the public HTML templates.
26 An API is considered listable if it's in both |api_path| and |public_path| -
27 the API schemas may contain undocumentable APIs, and the public HTML templates
28 will contain non-API articles.
21 """ 29 """
22 class Factory(object): 30 class Factory(object):
23 def __init__(self, cache_factory, file_system, api_path, public_path): 31 def __init__(self, compiled_fs_factory, api_path, public_path):
24 self._cache = cache_factory.Create(self._ListAPIs, compiled_fs.LIST) 32 self._compiled_fs = compiled_fs_factory.Create(
25 self._file_system = file_system 33 self._ListAPIs, APIListDataSource, version=_VERSION)
34 self._identity_fs = compiled_fs_factory.GetOrCreateIdentity()
26 def Normalize(string): 35 def Normalize(string):
27 return string if string.endswith('/') else (string + '/') 36 return string if string.endswith('/') else (string + '/')
28 self._api_path = Normalize(api_path) 37 self._api_path = Normalize(api_path)
29 self._public_path = Normalize(public_path) 38 self._public_path = Normalize(public_path)
30 39
31 def _GetAPIsInSubdirectory(self, api_names, doc_type): 40 def _GetAPIsInSubdirectory(self, api_names, doc_type):
32 public_templates = self._file_system.ReadSingle( 41 public_templates = self._identity_fs.GetFromFileListing(
33 self._public_path + doc_type + '/') 42 '%s%s/' % (self._public_path, doc_type))
34 template_names = [os.path.splitext(name)[0] 43 template_names = set(os.path.splitext(name)[0]
35 for name in public_templates] 44 for name in public_templates)
36 experimental_apis = [] 45 experimental_apis = []
37 chrome_apis = [] 46 chrome_apis = []
38 for template_name in sorted(template_names): 47 for template_name in sorted(template_names):
39 if template_name in IGNORED_FILES: 48 if template_name in IGNORED_FILES:
40 continue 49 continue
41 if model.UnixName(template_name) in api_names: 50 if model.UnixName(template_name) in api_names:
42 if template_name.startswith('experimental'): 51 if template_name.startswith('experimental'):
43 experimental_apis.append({ 52 experimental_apis.append({
44 'name': template_name.replace('_', '.') 53 'name': template_name.replace('_', '.')
45 }) 54 })
46 else: 55 else:
47 chrome_apis.append({ 'name': template_name.replace('_', '.') }) 56 chrome_apis.append({ 'name': template_name.replace('_', '.') })
48 if len(chrome_apis): 57 if len(chrome_apis):
49 chrome_apis[-1]['last'] = True 58 chrome_apis[-1]['last'] = True
50 if len(experimental_apis): 59 if len(experimental_apis):
51 experimental_apis[-1]['last'] = True 60 experimental_apis[-1]['last'] = True
52 return { 61 return {
53 'chrome': chrome_apis, 62 'chrome': chrome_apis,
54 'experimental': experimental_apis 63 'experimental': experimental_apis
55 } 64 }
56 65
57 def _ListAPIs(self, base_dir, apis): 66 def _ListAPIs(self, base_dir, apis):
58 api_names = set(SanitizeAPIName(name, self._api_path) for name in apis) 67 api_names = set(utils.SanitizeAPIName(name) for name in apis)
59 return { 68 return {
60 'apps': self._GetAPIsInSubdirectory(api_names, 'apps'), 69 'apps': self._GetAPIsInSubdirectory(api_names, 'apps'),
61 'extensions': self._GetAPIsInSubdirectory(api_names, 'extensions') 70 'extensions': self._GetAPIsInSubdirectory(api_names, 'extensions')
62 } 71 }
63 72
64 def Create(self): 73 def Create(self):
65 return APIListDataSource(self._cache, self._api_path) 74 return APIListDataSource(self._compiled_fs, self._api_path)
66 75
67 def __init__(self, cache, api_path): 76 def __init__(self, compiled_fs, api_path):
68 self._cache = cache 77 self._compiled_fs = compiled_fs
69 self._api_path = api_path 78 self._api_path = api_path
70 79
71 def GetAllNames(self): 80 def GetAllNames(self):
72 names = [] 81 names = []
73 for i in ['apps', 'extensions']: 82 for platform in ['apps', 'extensions']:
74 for j in ['chrome', 'experimental']: 83 for category in ['chrome', 'experimental']:
75 names.extend(self.get(i).get(j)) 84 names.extend(self.get(platform).get(category))
76 return [api_name['name'] for api_name in names] 85 return [api_name['name'] for api_name in names]
77 86
78 def get(self, key): 87 def get(self, key):
79 try: 88 try:
80 return self._cache.GetFromFileListing(self._api_path)[key] 89 return self._compiled_fs.GetFromFileListing(self._api_path)[key]
81 except FileNotFoundError as e: 90 except FileNotFoundError as e:
82 raise ValueError('%s: Error listing files for "%s".' % (e, key)) 91 raise ValueError('%s: Error listing files for "%s".' % (e, key))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698