Index: gm/rebaseline_server/server.py |
diff --git a/gm/rebaseline_server/server.py b/gm/rebaseline_server/server.py |
index fc090d25e8f16daaf90b467dc04137186aae2339..19b00355ffc5cead5daad041fb871b0c280df468 100755 |
--- a/gm/rebaseline_server/server.py |
+++ b/gm/rebaseline_server/server.py |
@@ -40,13 +40,14 @@ if TOOLS_DIRECTORY not in sys.path: |
import svn |
# Imports from local dir |
+# |
+# Note: we import results under a different name, to avoid confusion with the |
+# Server.results() property. See discussion at |
+# https://codereview.chromium.org/195943004/diff/1/gm/rebaseline_server/server.py#newcode44 |
import imagepairset |
-import results |
+import results as results_mod |
PATHSPLIT_RE = re.compile('/([^/]+)/(.+)') |
-EXPECTATIONS_DIR = os.path.join(TRUNK_DIRECTORY, 'expectations', 'gm') |
-GENERATED_IMAGES_ROOT = os.path.join(PARENT_DIRECTORY, 'static', |
- 'generated-images') |
# A simple dictionary of file name extensions to MIME types. The empty string |
# entry is used as the default when no extension was given or if the extension |
@@ -64,16 +65,8 @@ MIME_TYPE_MAP = {'': 'application/octet-stream', |
KEY__EDITS__MODIFICATIONS = 'modifications' |
KEY__EDITS__OLD_RESULTS_HASH = 'oldResultsHash' |
KEY__EDITS__OLD_RESULTS_TYPE = 'oldResultsType' |
-KEY__HEADER = 'header' |
-KEY__HEADER__DATAHASH = 'dataHash' |
-KEY__HEADER__IS_EDITABLE = 'isEditable' |
-KEY__HEADER__IS_EXPORTED = 'isExported' |
-KEY__HEADER__IS_STILL_LOADING = 'resultsStillLoading' |
-KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE = 'timeNextUpdateAvailable' |
-KEY__HEADER__TIME_UPDATED = 'timeUpdated' |
-KEY__HEADER__TYPE = 'type' |
- |
-DEFAULT_ACTUALS_DIR = '.gm-actuals' |
+ |
+DEFAULT_ACTUALS_DIR = results_mod.DEFAULT_ACTUALS_DIR |
DEFAULT_ACTUALS_REPO_REVISION = 'HEAD' |
DEFAULT_ACTUALS_REPO_URL = 'http://skia-autogen.googlecode.com/svn/gm-actual' |
DEFAULT_PORT = 8888 |
@@ -201,8 +194,8 @@ class Server(object): |
return self._reload_seconds |
def update_results(self, invalidate=False): |
- """ Create or update self._results, based on the expectations in |
- EXPECTATIONS_DIR and the latest actuals from skia-autogen. |
+ """ Create or update self._results, based on the latest expectations and |
+ actuals. |
We hold self.results_rlock while we do this, to guarantee that no other |
thread attempts to update either self._results or the underlying files at |
@@ -236,13 +229,10 @@ class Server(object): |
if self._reload_seconds: |
logging.info( |
'Updating expected GM results in %s by syncing Skia repo ...' % |
- EXPECTATIONS_DIR) |
+ results_mod.DEFAULT_EXPECTATIONS_DIR) |
_run_command(['gclient', 'sync'], TRUNK_DIRECTORY) |
- self._results = results.Results( |
- actuals_root=self._actuals_dir, |
- expected_root=EXPECTATIONS_DIR, |
- generated_images_root=GENERATED_IMAGES_ROOT) |
+ self._results = results_mod.Results(actuals_root=self._actuals_dir) |
def _result_loader(self, reload_seconds=0): |
""" Call self.update_results(), either once or periodically. |
@@ -315,14 +305,14 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
self.send_error(404) |
raise |
- def do_GET_results(self, type): |
+ def do_GET_results(self, results_type): |
""" Handle a GET request for GM results. |
Args: |
- type: string indicating which set of results to return; |
- must be one of the results.RESULTS_* constants |
+ results_type: string indicating which set of results to return; |
+ must be one of the results_mod.RESULTS_* constants |
""" |
- logging.debug('do_GET_results: sending results of type "%s"' % type) |
+ logging.debug('do_GET_results: sending results of type "%s"' % results_type) |
# Since we must make multiple calls to the Results object, grab a |
# reference to it in case it is updated to point at a new Results |
# object within another thread. |
@@ -333,60 +323,21 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
# the handler's .server instance variable. |
results_obj = _SERVER.results |
if results_obj: |
- response_dict = self.package_results(results_obj, type) |
+ response_dict = results_obj.get_packaged_results_of_type( |
+ results_type=results_type, reload_seconds=_SERVER.reload_seconds, |
+ is_editable=_SERVER.is_editable, is_exported=_SERVER.is_exported) |
else: |
now = int(time.time()) |
response_dict = { |
- KEY__HEADER: { |
- KEY__HEADER__IS_STILL_LOADING: True, |
- KEY__HEADER__TIME_UPDATED: now, |
- KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE: ( |
+ results_mod.KEY__HEADER: { |
+ results_mod.KEY__HEADER__IS_STILL_LOADING: True, |
+ results_mod.KEY__HEADER__TIME_UPDATED: now, |
+ results_mod.KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE: ( |
now + RELOAD_INTERVAL_UNTIL_READY), |
}, |
} |
self.send_json_dict(response_dict) |
- def package_results(self, results_obj, type): |
- """ Given a nonempty "results" object, package it as a response_dict |
- as needed within do_GET_results. |
- |
- Args: |
- results_obj: nonempty "results" object |
- type: string indicating which set of results to return; |
- must be one of the results.RESULTS_* constants |
- """ |
- response_dict = results_obj.get_results_of_type(type) |
- time_updated = results_obj.get_timestamp() |
- response_dict[KEY__HEADER] = { |
- # Timestamps: |
- # 1. when this data was last updated |
- # 2. when the caller should check back for new data (if ever) |
- # |
- # We only return these timestamps if the --reload argument was passed; |
- # otherwise, we have no idea when the expectations were last updated |
- # (we allow the user to maintain her own expectations as she sees fit). |
- KEY__HEADER__TIME_UPDATED: |
- time_updated if _SERVER.reload_seconds else None, |
- KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE: |
- (time_updated+_SERVER.reload_seconds) if _SERVER.reload_seconds |
- else None, |
- |
- # The type we passed to get_results_of_type() |
- KEY__HEADER__TYPE: type, |
- |
- # Hash of dataset, which the client must return with any edits-- |
- # this ensures that the edits were made to a particular dataset. |
- KEY__HEADER__DATAHASH: str(hash(repr( |
- response_dict[imagepairset.KEY__IMAGEPAIRS]))), |
- |
- # Whether the server will accept edits back. |
- KEY__HEADER__IS_EDITABLE: _SERVER.is_editable, |
- |
- # Whether the service is accessible from other hosts. |
- KEY__HEADER__IS_EXPORTED: _SERVER.is_exported, |
- } |
- return response_dict |
- |
def do_GET_static(self, path): |
""" Handle a GET request for a file under the 'static' directory. |
Only allow serving of files within the 'static' directory that is a |
@@ -441,7 +392,7 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
# client and server apply |
# modifications to the same base) |
KEY__EDITS__MODIFICATIONS: [ |
- # as needed by results.edit_expectations() |
+ # as needed by results_mod.edit_expectations() |
... |
], |
} |