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

Side by Side Diff: Tools/Scripts/webkitpy/bindings/main.py

Issue 186433003: Clean up generate_event_interfaces.py (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « Source/bindings/tests/results/EventInterfaces.in ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (C) 2011 Google Inc. All rights reserved. 1 # Copyright (C) 2011 Google Inc. All rights reserved.
2 # 2 #
3 # Redistribution and use in source and binary forms, with or without 3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions 4 # modification, are permitted provided that the following conditions
5 # are met: 5 # are met:
6 # 1. Redistributions of source code must retain the above copyright 6 # 1. Redistributions of source code must retain the above copyright
7 # notice, this list of conditions and the following disclaimer. 7 # notice, this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright 8 # 2. Redistributions in binary form must reproduce the above copyright
9 # notice, this list of conditions and the following disclaimer in the 9 # notice, this list of conditions and the following disclaimer in the
10 # documentation and/or other materials provided with the distribution. 10 # documentation and/or other materials provided with the distribution.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 'TestImplements2.idl', 50 'TestImplements2.idl',
51 'TestImplements3.idl', 51 'TestImplements3.idl',
52 'TestPartialInterface.idl', 52 'TestPartialInterface.idl',
53 'TestPartialInterfacePython.idl', 53 'TestPartialInterfacePython.idl',
54 'TestPartialInterfacePython2.idl', 54 'TestPartialInterfacePython2.idl',
55 ]) 55 ])
56 56
57 all_input_directory = '.' # Relative to Source/ 57 all_input_directory = '.' # Relative to Source/
58 test_input_directory = os.path.join('bindings', 'tests', 'idls') 58 test_input_directory = os.path.join('bindings', 'tests', 'idls')
59 reference_directory = os.path.join('bindings', 'tests', 'results') 59 reference_directory = os.path.join('bindings', 'tests', 'results')
60 reference_event_names_filename = os.path.join(reference_directory, 'EventInterfa ces.in')
61 60
62 61
63 class ScopedTempFileProvider(object): 62 class ScopedTempFileProvider(object):
64 def __init__(self): 63 def __init__(self):
65 self.file_handles = [] 64 self.file_handles = []
66 self.file_paths = [] 65 self.file_paths = []
67 self.dir_paths = [] 66 self.dir_paths = []
68 67
69 def __enter__(self): 68 def __enter__(self):
70 return self 69 return self
(...skipping 26 matching lines...) Expand all
97 self.verbose = verbose 96 self.verbose = verbose
98 self.executive = executive.Executive() 97 self.executive = executive.Executive()
99 self.provider = provider 98 self.provider = provider
100 _, self.interfaces_info_filename = provider.new_temp_file() 99 _, self.interfaces_info_filename = provider.new_temp_file()
101 # Generate output into the reference directory if resetting results, or 100 # Generate output into the reference directory if resetting results, or
102 # a temp directory if not. 101 # a temp directory if not.
103 if reset_results: 102 if reset_results:
104 self.output_directory = reference_directory 103 self.output_directory = reference_directory
105 else: 104 else:
106 self.output_directory = provider.new_temp_dir() 105 self.output_directory = provider.new_temp_dir()
107 self.event_names_filename = os.path.join(self.output_directory, 'EventIn terfaces.in')
108 106
109 def run_command(self, cmd): 107 def run_command(self, cmd):
110 output = self.executive.run_command(cmd) 108 output = self.executive.run_command(cmd)
111 if output: 109 if output:
112 print output 110 print output
113 111
114 def generate_from_idl(self, idl_file): 112 def generate_from_idl(self, idl_file):
115 cmd = ['python', 113 cmd = ['python',
116 'bindings/scripts/idl_compiler.py', 114 'bindings/scripts/idl_compiler.py',
117 '--output-dir', self.output_directory, 115 '--output-dir', self.output_directory,
(...skipping 21 matching lines...) Expand all
139 for filename in fnmatch.filter(files, '*.idl')) 137 for filename in fnmatch.filter(files, '*.idl'))
140 return idl_paths 138 return idl_paths
141 139
142 def write_list_file(idl_paths): 140 def write_list_file(idl_paths):
143 list_file, list_filename = self.provider.new_temp_file() 141 list_file, list_filename = self.provider.new_temp_file()
144 list_contents = ''.join(idl_path + '\n' 142 list_contents = ''.join(idl_path + '\n'
145 for idl_path in idl_paths) 143 for idl_path in idl_paths)
146 os.write(list_file, list_contents) 144 os.write(list_file, list_contents)
147 return list_filename 145 return list_filename
148 146
149 def generate_event_interfaces(event_names_filename):
150 cmd = ['python',
151 'bindings/scripts/generate_event_interfaces.py',
152 '--interfaces-info-file', self.interfaces_info_filename,
153 '--event-names-file', event_names_filename,
154 '--write-file-only-if-changed', '0']
155 self.run_command(cmd)
156
157 def compute_interfaces_info(idl_files_list_filename): 147 def compute_interfaces_info(idl_files_list_filename):
158 cmd = ['python', 148 cmd = ['python',
159 'bindings/scripts/compute_interfaces_info.py', 149 'bindings/scripts/compute_interfaces_info.py',
160 '--idl-files-list', idl_files_list_filename, 150 '--idl-files-list', idl_files_list_filename,
161 '--interfaces-info-file', self.interfaces_info_filename, 151 '--interfaces-info-file', self.interfaces_info_filename,
162 '--write-file-only-if-changed', '0'] 152 '--write-file-only-if-changed', '0']
163 self.run_command(cmd) 153 self.run_command(cmd)
164 154
165 test_idl_files_list_filename = write_list_file(idl_paths(test_input_dire ctory)) 155 # We compute interfaces info for *all* IDL files, not just test IDL
156 # files, as code generator output depends on inheritance (both ancestor
157 # chain and inherited extended attributes), and some real interfaces
158 # are special-cased, such as Node.
159 #
160 # For example, when testing the behavior of interfaces that inherit
161 # from Node, we also need to know that these inherit from EventTarget,
162 # since this is also special-cased and Node inherits from EventTarget,
163 # but this inheritance information requires computing dependencies for
164 # the real Node.idl file.
166 all_idl_files_list_filename = write_list_file(idl_paths_recursive(all_in put_directory)) 165 all_idl_files_list_filename = write_list_file(idl_paths_recursive(all_in put_directory))
167
168 if self.reset_results and self.verbose:
169 print 'Reset results: EventInterfaces.in'
170 try: 166 try:
171 # We first compute interfaces info for testing files only,
172 # so we can compare EventInterfaces.in.
173 compute_interfaces_info(test_idl_files_list_filename)
174 generate_event_interfaces(self.event_names_filename)
175
176 # We then compute interfaces info for all IDL files, as code
177 # generator output depends on inheritance (both ancestor chain and
178 # inherited extended attributes), and some real interfaces are
179 # special-cased, such as Node.
180 # For example, when testing the behavior of interfaces that inherit
181 # from Node, we also need to know that these inherit from
182 # EventTarget, since this is also special-cased and Node inherits
183 # from EventTarget, but this inheritance information requires
184 # computing dependencies for the real Node.idl file.
185 #
186 # Don't overwrite the event names file generated for testing IDLs
187 compute_interfaces_info(all_idl_files_list_filename) 167 compute_interfaces_info(all_idl_files_list_filename)
188 except ScriptError, e: 168 except ScriptError, e:
189 print 'ERROR: compute_interfaces_info.py' 169 print 'ERROR: compute_interfaces_info.py'
190 print e.output 170 print e.output
191 return e.exit_code 171 return e.exit_code
192 return 0 172 return 0
193 173
194 def identical_file(self, reference_filename, output_filename): 174 def identical_file(self, reference_filename, output_filename):
195 reference_basename = os.path.basename(reference_filename) 175 reference_basename = os.path.basename(reference_filename)
196 cmd = ['diff', 176 cmd = ['diff',
(...skipping 19 matching lines...) Expand all
216 for output_file in os.listdir(self.output_directory) 196 for output_file in os.listdir(self.output_directory)
217 # Skip cache 197 # Skip cache
218 if (output_file != 'parsetab.py' and # PLY cache 198 if (output_file != 'parsetab.py' and # PLY cache
219 not output_file.endswith('.cache'))] # Jinja cache 199 not output_file.endswith('.cache'))] # Jinja cache
220 return all([self.identical_file(reference_filename, output_filename) 200 return all([self.identical_file(reference_filename, output_filename)
221 for (reference_filename, output_filename) in file_pairs]) 201 for (reference_filename, output_filename) in file_pairs])
222 202
223 def no_excess_files(self): 203 def no_excess_files(self):
224 generated_files = set(os.listdir(self.output_directory)) 204 generated_files = set(os.listdir(self.output_directory))
225 generated_files.add('.svn') # Subversion working copy directory 205 generated_files.add('.svn') # Subversion working copy directory
226 generated_files.add('EventInterfaces.in') # only in Perl, not Python
227 excess_files = [output_file 206 excess_files = [output_file
228 for output_file in os.listdir(reference_directory) 207 for output_file in os.listdir(reference_directory)
229 if output_file not in generated_files] 208 if output_file not in generated_files]
230 if excess_files: 209 if excess_files:
231 print ('Excess reference files! ' 210 print ('Excess reference files! '
232 '(probably cruft from renaming or deleting):\n' + 211 '(probably cruft from renaming or deleting):\n' +
233 '\n'.join(excess_files)) 212 '\n'.join(excess_files))
234 return False 213 return False
235 return True 214 return True
236 215
(...skipping 11 matching lines...) Expand all
248 print 'DEPENDENCY: %s' % input_filename 227 print 'DEPENDENCY: %s' % input_filename
249 continue 228 continue
250 229
251 idl_path = os.path.join(test_input_directory, input_filename) 230 idl_path = os.path.join(test_input_directory, input_filename)
252 if self.generate_from_idl(idl_path): 231 if self.generate_from_idl(idl_path):
253 return False 232 return False
254 if self.reset_results and self.verbose: 233 if self.reset_results and self.verbose:
255 print 'Reset results: %s' % input_filename 234 print 'Reset results: %s' % input_filename
256 235
257 # Detect all changes 236 # Detect all changes
258 passed = self.identical_file(reference_event_names_filename, 237 passed = self.identical_output_files()
259 self.event_names_filename)
260 passed &= self.identical_output_files()
261 passed &= self.no_excess_files() 238 passed &= self.no_excess_files()
262 return passed 239 return passed
263 240
264 def main(self): 241 def main(self):
265 current_scm = detect_scm_system(os.curdir) 242 current_scm = detect_scm_system(os.curdir)
266 os.chdir(os.path.join(current_scm.checkout_root, 'Source')) 243 os.chdir(os.path.join(current_scm.checkout_root, 'Source'))
267 244
268 all_tests_passed = self.run_tests() 245 all_tests_passed = self.run_tests()
269 if all_tests_passed: 246 if all_tests_passed:
270 if self.verbose: 247 if self.verbose:
271 print 248 print
272 print PASS_MESSAGE 249 print PASS_MESSAGE
273 return 0 250 return 0
274 print 251 print
275 print FAIL_MESSAGE 252 print FAIL_MESSAGE
276 return -1 253 return -1
277 254
278 255
279 def run_bindings_tests(reset_results, verbose): 256 def run_bindings_tests(reset_results, verbose):
280 with ScopedTempFileProvider() as provider: 257 with ScopedTempFileProvider() as provider:
281 return BindingsTests(reset_results, verbose, provider).main() 258 return BindingsTests(reset_results, verbose, provider).main()
OLDNEW
« no previous file with comments | « Source/bindings/tests/results/EventInterfaces.in ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698