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

Unified Diff: chrome/common/extensions/docs/server2/github_file_system.py

Issue 10825067: Extensions Docs Server: Apps samples page (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: no more zip file Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/server2/github_file_system.py
diff --git a/chrome/common/extensions/docs/server2/github_file_system.py b/chrome/common/extensions/docs/server2/github_file_system.py
new file mode 100644
index 0000000000000000000000000000000000000000..aeff81b0883f656e7d76437cf1bca86bdaa169c7
--- /dev/null
+++ b/chrome/common/extensions/docs/server2/github_file_system.py
@@ -0,0 +1,76 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+
+import file_system
+from future import Future
+
+class GithubFileSystem(file_system.FileSystem):
+ """Class to fetch resources from github.
+ """
+ def __init__(self, fetcher):
+ self._fetcher = fetcher
+
+ def Read(self, paths, binary=False):
+ return Future(delegate=_AsyncFetchFuture(paths, self._fetcher, binary))
+
+ def Stat(self, path):
+ if not path.strip('/'):
+ return self.StatInfo(0)
+ parts = path.strip('/').rsplit('/', 1)
+ if len(parts) == 1:
+ name = parts[0]
+ directory = '/'
+ else:
+ name = parts[-1]
+ directory = parts[-2]
+ json_ = json.loads(self._fetcher.Fetch(directory).content)
+ for item in json_:
+ if item['name'] == name:
+ return self.StatInfo(item['sha'])
+
+ def CheckStat(self, version1, version2):
+ return version1 != version2
+
+class _AsyncFetchFuture(object):
+ def __init__(self, paths, fetcher, binary):
+ # A list of tuples of the form (path, Future).
+ self._fetches = []
+ self._value = {}
+ self._error = None
+ self._fetches = [(path, fetcher.FetchAsync(path.strip('/')))
+ for path in paths]
+ self._binary = binary
+
+ def _ListDir(self, directory):
+ dir_json = json.loads(directory)
+ files = []
+ for entry in dir_json:
+ if entry['type'] == 'dir':
+ files.append(entry['name'] + '/')
+ else:
+ files.append(entry['name'])
+ return files
+
+ def _GetFile(self, data, binary, path):
+ file_json = json.loads(data)
+ file_contents = file_json['content'].decode(file_json['encoding'])
+ if binary:
+ return file_contents
+ return file_system._ProcessFileData(file_contents, path)
+
+ def Get(self):
+ for path, future in self._fetches:
+ result = future.Get()
+ if result.status_code == 404:
+ self._value[path] = None
+ elif path.endswith('/'):
+ self._value[path] = self._ListDir(result.content)
+ else:
+ self._value[path] = self._GetFile(result.content, self._binary, path)
+ if self._error is not None:
+ raise self._error
+ return self._value
+

Powered by Google App Engine
This is Rietveld 408576698