Index: gm/rebaseline_server/imagepair.py |
diff --git a/gm/rebaseline_server/imagepair.py b/gm/rebaseline_server/imagepair.py |
index 446858d3a5a9badc405b5a8ad7c7dc0654ad138d..12d6718857aa68c5afb221aa4286ee3e15ce36ae 100644 |
--- a/gm/rebaseline_server/imagepair.py |
+++ b/gm/rebaseline_server/imagepair.py |
@@ -21,6 +21,10 @@ KEY__IMAGEPAIRS__IMAGE_A_URL = 'imageAUrl' |
KEY__IMAGEPAIRS__IMAGE_B_URL = 'imageBUrl' |
KEY__IMAGEPAIRS__IS_DIFFERENT = 'isDifferent' |
+# If self._diff_record is set to this, we haven't asked ImageDiffDB for the |
+# image diff details yet. |
+_DIFF_RECORD_STILL_LOADING = 'still_loading' |
+ |
class ImagePair(object): |
"""Describes a pair of images, pixel difference info, and optional metadata. |
@@ -42,6 +46,7 @@ class ImagePair(object): |
extra_columns: optional dictionary containing more metadata (test name, |
builder name, etc.) |
""" |
+ self._image_diff_db = image_diff_db |
self.base_url = base_url |
self.imageA_relative_url = imageA_relative_url |
self.imageB_relative_url = imageB_relative_url |
@@ -49,27 +54,20 @@ class ImagePair(object): |
self.extra_columns_dict = extra_columns |
if not imageA_relative_url or not imageB_relative_url: |
self._is_different = True |
- self.diff_record = None |
+ self._diff_record = None |
elif imageA_relative_url == imageB_relative_url: |
self._is_different = False |
- self.diff_record = None |
+ self._diff_record = None |
else: |
- # TODO(epoger): Rather than blocking until image_diff_db can read in |
- # the image pair and generate diffs, it would be better to do it |
- # asynchronously: tell image_diff_db to download a bunch of file pairs, |
- # and only block later if we're still waiting for diff_records to come |
- # back. |
+ # Tell image_diff_db to add an entry for this diff asynchronously. |
+ # Later on, we will call image_diff_db.get_diff_record() to find it. |
self._is_different = True |
+ self._diff_record = _DIFF_RECORD_STILL_LOADING |
image_diff_db.add_image_pair( |
expected_image_locator=imageA_relative_url, |
expected_image_url=posixpath.join(base_url, imageA_relative_url), |
actual_image_locator=imageB_relative_url, |
actual_image_url=posixpath.join(base_url, imageB_relative_url)) |
- self.diff_record = image_diff_db.get_diff_record( |
- expected_image_locator=imageA_relative_url, |
- actual_image_locator=imageB_relative_url) |
- if self.diff_record and self.diff_record.get_num_pixels_differing() == 0: |
- self._is_different = False |
def as_dict(self): |
"""Returns a dictionary describing this ImagePair. |
@@ -85,6 +83,17 @@ class ImagePair(object): |
asdict[KEY__IMAGEPAIRS__EXPECTATIONS] = self.expectations_dict |
if self.extra_columns_dict: |
asdict[KEY__IMAGEPAIRS__EXTRACOLUMNS] = self.extra_columns_dict |
- if self.diff_record and (self.diff_record.get_num_pixels_differing() > 0): |
- asdict[KEY__IMAGEPAIRS__DIFFERENCES] = self.diff_record.as_dict() |
+ if self._diff_record is _DIFF_RECORD_STILL_LOADING: |
+ # We have waited as long as we can to ask ImageDiffDB for details of |
+ # this image diff. Now we must block until ImageDiffDB can provide |
+ # those details. |
+ # |
+ # TODO(epoger): Is it wasteful for every imagepair to have its own |
+ # reference to image_diff_db? If so, we could pass an image_diff_db |
+ # reference into this method call instead... |
+ self._diff_record = self._image_diff_db.get_diff_record( |
+ expected_image_locator=self.imageA_relative_url, |
+ actual_image_locator=self.imageB_relative_url) |
+ if self._diff_record != None: |
+ asdict[KEY__IMAGEPAIRS__DIFFERENCES] = self._diff_record.as_dict() |
return asdict |