Index: gm/rebaseline_server/imagepair.py |
diff --git a/gm/rebaseline_server/imagepair.py b/gm/rebaseline_server/imagepair.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1c71bd989caf436c097af45ac2237744d81916af |
--- /dev/null |
+++ b/gm/rebaseline_server/imagepair.py |
@@ -0,0 +1,83 @@ |
+#!/usr/bin/python |
+ |
+""" |
+Copyright 2014 Google Inc. |
+ |
+Use of this source code is governed by a BSD-style license that can be |
+found in the LICENSE file. |
+ |
+ImagePair class (see class docstring for details) |
+""" |
+ |
+import posixpath |
+ |
+# Keys used within ImagePair dictionary representations. |
+KEY_DIFFERENCE_DATA = 'differenceData' |
+KEY_EXPECTATIONS_DATA = 'expectationsData' |
+KEY_EXTRA_COLUMN_VALUES = 'extraColumnValues' |
+KEY_IMAGE_A_URL = 'imageAUrl' |
+KEY_IMAGE_B_URL = 'imageBUrl' |
+KEY_IS_DIFFERENT = 'isDifferent' |
+ |
+ |
+class ImagePair(object): |
+ """ |
+ Describes a pair of images, along with optional metadata (pixel difference |
+ metrics, whether to ignore mismatches, etc.) |
+ """ |
+ |
+ def __init__(self, image_diff_db, |
+ base_url, imageA_relative_url, imageB_relative_url, |
+ expectations=None, extra_columns=None): |
+ """ |
+ Args: |
+ image_diff_db: ImageDiffDB instance we use to generate/store image diffs |
+ base_url: base of all image URLs |
+ imageA_relative_url: URL pointing at an image, relative to base_url |
+ imageB_relative_url: URL pointing at an image, relative to base_url |
+ expectations: optional dictionary containing expectations-specific |
+ metadata (ignore-failure, bug numbers, etc.) |
+ extra_columns: optional dictionary containing more metadata (test name, |
+ builder name, etc.) |
+ """ |
+ self.base_url = base_url |
+ self.imageA_relative_url = imageA_relative_url |
+ self.imageB_relative_url = imageB_relative_url |
+ self.expectations_dict = expectations |
+ self.extra_columns_dict = extra_columns |
+ if imageA_relative_url == imageB_relative_url: |
+ 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. |
+ 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) |
+ |
+ def as_dict(self): |
+ """ |
+ Return a dictionary describing this ImagePair, as needed when constructing |
+ the JSON representation. Uses the KEY_* constants as keys. |
+ """ |
+ asdict = { |
+ KEY_IMAGE_A_URL: self.imageA_relative_url, |
+ KEY_IMAGE_B_URL: self.imageB_relative_url, |
+ } |
+ if self.expectations_dict: |
+ asdict[KEY_EXPECTATIONS_DATA] = self.expectations_dict |
+ if self.extra_columns_dict: |
+ asdict[KEY_EXTRA_COLUMN_VALUES] = self.extra_columns_dict |
+ if self.diff_record and (self.diff_record.get_num_pixels_differing() > 0): |
+ asdict[KEY_IS_DIFFERENT] = True |
+ asdict[KEY_DIFFERENCE_DATA] = self.diff_record.as_dict() |
+ else: |
+ asdict[KEY_IS_DIFFERENT] = False |
+ return asdict |