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

Side by Side Diff: gm/rebaseline_server/compare_to_expectations.py

Issue 376623002: rebaseline_server: allow JSON to control column filtering (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Ravi suggestions Created 6 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 unified diff | Download patch
« no previous file with comments | « gm/rebaseline_server/column.py ('k') | gm/rebaseline_server/imagepairset.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 2
3 """ 3 """
4 Copyright 2013 Google Inc. 4 Copyright 2013 Google Inc.
5 5
6 Use of this source code is governed by a BSD-style license that can be 6 Use of this source code is governed by a BSD-style license that can be
7 found in the LICENSE file. 7 found in the LICENSE file.
8 8
9 Repackage expected/actual GM results as needed by our HTML rebaseline viewer. 9 Repackage expected/actual GM results as needed by our HTML rebaseline viewer.
10 """ 10 """
11 11
12 # System-level imports 12 # System-level imports
13 import argparse 13 import argparse
14 import fnmatch 14 import fnmatch
15 import json
16 import logging 15 import logging
17 import os 16 import os
18 import re
19 import sys
20 import time 17 import time
21 18
19 # Must fix up PYTHONPATH before importing from within Skia
20 # pylint: disable=W0611
21 import fix_pythonpath
22 # pylint: enable=W0611
23
22 # Imports from within Skia 24 # Imports from within Skia
23 import fix_pythonpath # must do this first
24 from pyutils import url_utils 25 from pyutils import url_utils
26 import column
25 import gm_json 27 import gm_json
26 import imagediffdb 28 import imagediffdb
27 import imagepair 29 import imagepair
28 import imagepairset 30 import imagepairset
29 import results 31 import results
30 32
31 EXPECTATION_FIELDS_PASSED_THRU_VERBATIM = [ 33 EXPECTATION_FIELDS_PASSED_THRU_VERBATIM = [
32 results.KEY__EXPECTATIONS__BUGS, 34 results.KEY__EXPECTATIONS__BUGS,
33 results.KEY__EXPECTATIONS__IGNOREFAILURE, 35 results.KEY__EXPECTATIONS__IGNOREFAILURE,
34 results.KEY__EXPECTATIONS__REVIEWED, 36 results.KEY__EXPECTATIONS__REVIEWED,
35 ] 37 ]
38 FREEFORM_COLUMN_IDS = [
39 results.KEY__EXTRACOLUMNS__BUILDER,
40 results.KEY__EXTRACOLUMNS__TEST,
41 ]
42 ORDERED_COLUMN_IDS = [
43 results.KEY__EXTRACOLUMNS__RESULT_TYPE,
44 results.KEY__EXTRACOLUMNS__BUILDER,
45 results.KEY__EXTRACOLUMNS__TEST,
46 results.KEY__EXTRACOLUMNS__CONFIG,
47 ]
48
36 TRUNK_DIRECTORY = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 49 TRUNK_DIRECTORY = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
37 DEFAULT_EXPECTATIONS_DIR = os.path.join(TRUNK_DIRECTORY, 'expectations', 'gm') 50 DEFAULT_EXPECTATIONS_DIR = os.path.join(TRUNK_DIRECTORY, 'expectations', 'gm')
38 DEFAULT_IGNORE_FAILURES_FILE = 'ignored-tests.txt' 51 DEFAULT_IGNORE_FAILURES_FILE = 'ignored-tests.txt'
39 52
40 IMAGEPAIR_SET_DESCRIPTIONS = ('expected image', 'actual image') 53 IMAGEPAIR_SET_DESCRIPTIONS = ('expected image', 'actual image')
41 54
42 55
43 class ExpectationComparisons(results.BaseComparisons): 56 class ExpectationComparisons(results.BaseComparisons):
44 """Loads actual and expected GM results into an ImagePairSet. 57 """Loads actual and expected GM results into an ImagePairSet.
45 58
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 pattern: which files to write within root (fnmatch-style pattern) 177 pattern: which files to write within root (fnmatch-style pattern)
165 178
166 Raises: 179 Raises:
167 IOError if root does not refer to an existing directory 180 IOError if root does not refer to an existing directory
168 KeyError if the set of per-builder dictionaries written out was 181 KeyError if the set of per-builder dictionaries written out was
169 different than expected 182 different than expected
170 """ 183 """
171 if not os.path.isdir(root): 184 if not os.path.isdir(root):
172 raise IOError('no directory found at path %s' % root) 185 raise IOError('no directory found at path %s' % root)
173 actual_builders_written = [] 186 actual_builders_written = []
174 for dirpath, dirnames, filenames in os.walk(root): 187 for dirpath, _, filenames in os.walk(root):
175 for matching_filename in fnmatch.filter(filenames, pattern): 188 for matching_filename in fnmatch.filter(filenames, pattern):
176 builder = os.path.basename(dirpath) 189 builder = os.path.basename(dirpath)
177 per_builder_dict = meta_dict.get(builder) 190 per_builder_dict = meta_dict.get(builder)
178 if per_builder_dict is not None: 191 if per_builder_dict is not None:
179 fullpath = os.path.join(dirpath, matching_filename) 192 fullpath = os.path.join(dirpath, matching_filename)
180 gm_json.WriteToFile(per_builder_dict, fullpath) 193 gm_json.WriteToFile(per_builder_dict, fullpath)
181 actual_builders_written.append(builder) 194 actual_builders_written.append(builder)
182 195
183 # Check: did we write out the set of per-builder dictionaries we 196 # Check: did we write out the set of per-builder dictionaries we
184 # expected to? 197 # expected to?
(...skipping 19 matching lines...) Expand all
204 expected_builder_dicts = self._read_builder_dicts_from_root( 217 expected_builder_dicts = self._read_builder_dicts_from_root(
205 self._expected_root) 218 self._expected_root)
206 219
207 all_image_pairs = imagepairset.ImagePairSet( 220 all_image_pairs = imagepairset.ImagePairSet(
208 descriptions=IMAGEPAIR_SET_DESCRIPTIONS, 221 descriptions=IMAGEPAIR_SET_DESCRIPTIONS,
209 diff_base_url=self._diff_base_url) 222 diff_base_url=self._diff_base_url)
210 failing_image_pairs = imagepairset.ImagePairSet( 223 failing_image_pairs = imagepairset.ImagePairSet(
211 descriptions=IMAGEPAIR_SET_DESCRIPTIONS, 224 descriptions=IMAGEPAIR_SET_DESCRIPTIONS,
212 diff_base_url=self._diff_base_url) 225 diff_base_url=self._diff_base_url)
213 226
227 # Override settings for columns that should be filtered using freeform text.
228 for column_id in FREEFORM_COLUMN_IDS:
229 factory = column.ColumnHeaderFactory(
230 header_text=column_id, use_freeform_filter=True)
231 all_image_pairs.set_column_header_factory(
232 column_id=column_id, column_header_factory=factory)
233 failing_image_pairs.set_column_header_factory(
234 column_id=column_id, column_header_factory=factory)
235
214 all_image_pairs.ensure_extra_column_values_in_summary( 236 all_image_pairs.ensure_extra_column_values_in_summary(
215 column_id=results.KEY__EXTRACOLUMNS__RESULT_TYPE, values=[ 237 column_id=results.KEY__EXTRACOLUMNS__RESULT_TYPE, values=[
216 results.KEY__RESULT_TYPE__FAILED, 238 results.KEY__RESULT_TYPE__FAILED,
217 results.KEY__RESULT_TYPE__FAILUREIGNORED, 239 results.KEY__RESULT_TYPE__FAILUREIGNORED,
218 results.KEY__RESULT_TYPE__NOCOMPARISON, 240 results.KEY__RESULT_TYPE__NOCOMPARISON,
219 results.KEY__RESULT_TYPE__SUCCEEDED, 241 results.KEY__RESULT_TYPE__SUCCEEDED,
220 ]) 242 ])
221 failing_image_pairs.ensure_extra_column_values_in_summary( 243 failing_image_pairs.ensure_extra_column_values_in_summary(
222 column_id=results.KEY__EXTRACOLUMNS__RESULT_TYPE, values=[ 244 column_id=results.KEY__EXTRACOLUMNS__RESULT_TYPE, values=[
223 results.KEY__RESULT_TYPE__FAILED, 245 results.KEY__RESULT_TYPE__FAILED,
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 imageA_relative_url=expected_image_relative_url, 354 imageA_relative_url=expected_image_relative_url,
333 imageB_relative_url=actual_image_relative_url, 355 imageB_relative_url=actual_image_relative_url,
334 expectations=expectations_dict, 356 expectations=expectations_dict,
335 extra_columns=extra_columns_dict) 357 extra_columns=extra_columns_dict)
336 all_image_pairs.add_image_pair(image_pair) 358 all_image_pairs.add_image_pair(image_pair)
337 if updated_result_type != results.KEY__RESULT_TYPE__SUCCEEDED: 359 if updated_result_type != results.KEY__RESULT_TYPE__SUCCEEDED:
338 failing_image_pairs.add_image_pair(image_pair) 360 failing_image_pairs.add_image_pair(image_pair)
339 except Exception: 361 except Exception:
340 logging.exception('got exception while creating new ImagePair') 362 logging.exception('got exception while creating new ImagePair')
341 363
364 # pylint: disable=W0201
342 self._results = { 365 self._results = {
343 results.KEY__HEADER__RESULTS_ALL: all_image_pairs.as_dict(), 366 results.KEY__HEADER__RESULTS_ALL: all_image_pairs.as_dict(
344 results.KEY__HEADER__RESULTS_FAILURES: failing_image_pairs.as_dict(), 367 column_ids_in_order=ORDERED_COLUMN_IDS),
368 results.KEY__HEADER__RESULTS_FAILURES: failing_image_pairs.as_dict(
369 column_ids_in_order=ORDERED_COLUMN_IDS),
345 } 370 }
346 371
347 372
348 def main(): 373 def main():
349 logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', 374 logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
350 datefmt='%m/%d/%Y %H:%M:%S', 375 datefmt='%m/%d/%Y %H:%M:%S',
351 level=logging.INFO) 376 level=logging.INFO)
352 parser = argparse.ArgumentParser() 377 parser = argparse.ArgumentParser()
353 parser.add_argument( 378 parser.add_argument(
354 '--actuals', default=results.DEFAULT_ACTUALS_DIR, 379 '--actuals', default=results.DEFAULT_ACTUALS_DIR,
(...skipping 27 matching lines...) Expand all
382 expected_root=args.expectations, 407 expected_root=args.expectations,
383 ignore_failures_file=args.ignore_failures_file, 408 ignore_failures_file=args.ignore_failures_file,
384 generated_images_root=args.workdir) 409 generated_images_root=args.workdir)
385 gm_json.WriteToFile( 410 gm_json.WriteToFile(
386 results_obj.get_packaged_results_of_type(results_type=args.results), 411 results_obj.get_packaged_results_of_type(results_type=args.results),
387 args.outfile) 412 args.outfile)
388 413
389 414
390 if __name__ == '__main__': 415 if __name__ == '__main__':
391 main() 416 main()
OLDNEW
« no previous file with comments | « gm/rebaseline_server/column.py ('k') | gm/rebaseline_server/imagepairset.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698