OLD | NEW |
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 fnmatch | 13 import fnmatch |
14 import json | 14 import json |
15 import logging | 15 import logging |
16 import os | 16 import os |
17 import re | 17 import re |
18 import sys | 18 import sys |
| 19 import time |
19 | 20 |
20 # Imports from within Skia | 21 # Imports from within Skia |
21 # | 22 # |
22 # We need to add the 'gm' directory, so that we can import gm_json.py within | 23 # We need to add the 'gm' directory, so that we can import gm_json.py within |
23 # that directory. That script allows us to parse the actual-results.json file | 24 # that directory. That script allows us to parse the actual-results.json file |
24 # written out by the GM tool. | 25 # written out by the GM tool. |
25 # Make sure that the 'gm' dir is in the PYTHONPATH, but add it at the *end* | 26 # Make sure that the 'gm' dir is in the PYTHONPATH, but add it at the *end* |
26 # so any dirs that are already in the PYTHONPATH will be preferred. | 27 # so any dirs that are already in the PYTHONPATH will be preferred. |
27 GM_DIRECTORY = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | 28 GM_DIRECTORY = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) |
28 if GM_DIRECTORY not in sys.path: | 29 if GM_DIRECTORY not in sys.path: |
(...skipping 17 matching lines...) Expand all Loading... |
46 | 47 |
47 def __init__(self, actuals_root, expected_root): | 48 def __init__(self, actuals_root, expected_root): |
48 """ | 49 """ |
49 Args: | 50 Args: |
50 actuals_root: root directory containing all actual-results.json files | 51 actuals_root: root directory containing all actual-results.json files |
51 expected_root: root directory containing all expected-results.json files | 52 expected_root: root directory containing all expected-results.json files |
52 """ | 53 """ |
53 self._actual_builder_dicts = Results._get_dicts_from_root(actuals_root) | 54 self._actual_builder_dicts = Results._get_dicts_from_root(actuals_root) |
54 self._expected_builder_dicts = Results._get_dicts_from_root(expected_root) | 55 self._expected_builder_dicts = Results._get_dicts_from_root(expected_root) |
55 self._combine_actual_and_expected() | 56 self._combine_actual_and_expected() |
| 57 self._timestamp = int(time.time()) |
| 58 |
| 59 def get_timestamp(self): |
| 60 """Return the time at which this object was created, in seconds past epoch |
| 61 (UTC). |
| 62 """ |
| 63 return self._timestamp |
56 | 64 |
57 def get_results_of_type(self, type): | 65 def get_results_of_type(self, type): |
58 """Return results of some/all tests (depending on 'type' parameter). | 66 """Return results of some/all tests (depending on 'type' parameter). |
59 | 67 |
60 Args: | 68 Args: |
61 type: string describing which types of results to include; must be one | 69 type: string describing which types of results to include; must be one |
62 of the RESULTS_* constants | 70 of the RESULTS_* constants |
63 | 71 |
64 Results are returned as a dictionary in this form: | 72 Results are returned as a dictionary in this form: |
65 | 73 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 def _get_dicts_from_root(root, pattern='*.json'): | 114 def _get_dicts_from_root(root, pattern='*.json'): |
107 """Read all JSON dictionaries within a directory tree. | 115 """Read all JSON dictionaries within a directory tree. |
108 | 116 |
109 Args: | 117 Args: |
110 root: path to root of directory tree | 118 root: path to root of directory tree |
111 pattern: which files to read within root (fnmatch-style pattern) | 119 pattern: which files to read within root (fnmatch-style pattern) |
112 | 120 |
113 Returns: | 121 Returns: |
114 A meta-dictionary containing all the JSON dictionaries found within | 122 A meta-dictionary containing all the JSON dictionaries found within |
115 the directory tree, keyed by the builder name of each dictionary. | 123 the directory tree, keyed by the builder name of each dictionary. |
| 124 |
| 125 Raises: |
| 126 IOError if root does not refer to an existing directory |
116 """ | 127 """ |
| 128 if not os.path.isdir(root): |
| 129 raise IOError('no directory found at path %s' % root) |
117 meta_dict = {} | 130 meta_dict = {} |
118 for dirpath, dirnames, filenames in os.walk(root): | 131 for dirpath, dirnames, filenames in os.walk(root): |
119 for matching_filename in fnmatch.filter(filenames, pattern): | 132 for matching_filename in fnmatch.filter(filenames, pattern): |
120 builder = os.path.basename(dirpath) | 133 builder = os.path.basename(dirpath) |
121 if builder.endswith('-Trybot'): | 134 if builder.endswith('-Trybot'): |
122 continue | 135 continue |
123 fullpath = os.path.join(dirpath, matching_filename) | 136 fullpath = os.path.join(dirpath, matching_filename) |
124 meta_dict[builder] = gm_json.LoadFromFile(fullpath) | 137 meta_dict[builder] = gm_json.LoadFromFile(fullpath) |
125 return meta_dict | 138 return meta_dict |
126 | 139 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 category_dict: category dict-of-dicts to modify | 291 category_dict: category dict-of-dicts to modify |
279 category_name: category name, as a string | 292 category_name: category name, as a string |
280 category_values: list of values we want to make sure are represented | 293 category_values: list of values we want to make sure are represented |
281 for this category | 294 for this category |
282 """ | 295 """ |
283 if not category_dict.get(category_name): | 296 if not category_dict.get(category_name): |
284 category_dict[category_name] = {} | 297 category_dict[category_name] = {} |
285 for category_value in category_values: | 298 for category_value in category_values: |
286 if not category_dict[category_name].get(category_value): | 299 if not category_dict[category_name].get(category_value): |
287 category_dict[category_name][category_value] = 0 | 300 category_dict[category_name][category_value] = 0 |
OLD | NEW |