Cleans up the mock generator script:
- updates the doc string. - adds a version number. - fixes the condition for error messages in _GenerateMocks().
This commit is contained in:
		| @@ -14,7 +14,7 @@ to generate a Google Mock class. | |||||||
| Make sure to install the scripts somewhere in your path.  Then you can | Make sure to install the scripts somewhere in your path.  Then you can | ||||||
| run the program. | run the program. | ||||||
|  |  | ||||||
|   gmock_gen.py header-file.h [ClassName1] [ClassName2] ... |   gmock_gen.py header-file.h [ClassName]... | ||||||
|  |  | ||||||
| If no ClassNames are specified, all classes in the file are emitted. | If no ClassNames are specified, all classes in the file are emitted. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,13 +14,14 @@ | |||||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||||
| # limitations under the License. | # limitations under the License. | ||||||
|  |  | ||||||
| """Generate a Google Mock class from a production class. | """Generate Google Mock classes from base classes. | ||||||
|  |  | ||||||
| This program will read in a C++ source file and output the Google Mock class | This program will read in a C++ source file and output the Google Mock | ||||||
| for the specified class. | classes for the specified classes.  If no class is specified, all | ||||||
|  | classes in the source file are emitted. | ||||||
|  |  | ||||||
| Usage: | Usage: | ||||||
|   gmock_class.py header-file.h [ClassName1] [ClassName2] ... |   gmock_class.py header-file.h [ClassName]... | ||||||
|  |  | ||||||
| Output is sent to stdout. | Output is sent to stdout. | ||||||
| """ | """ | ||||||
| @@ -35,7 +36,8 @@ import sys | |||||||
| from cpp import ast | from cpp import ast | ||||||
| from cpp import utils | from cpp import utils | ||||||
|  |  | ||||||
| # How many spaces to indent.  Can set me with INDENT environment variable. | _VERSION = (1, 0, 1)  # The version of this script. | ||||||
|  | # How many spaces to indent.  Can set me with the INDENT environment variable. | ||||||
| _INDENT = 2 | _INDENT = 2 | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -54,7 +56,7 @@ def _GenerateMethods(output_lines, source, class_node): | |||||||
|         const = 'CONST_' |         const = 'CONST_' | ||||||
|       return_type = 'void' |       return_type = 'void' | ||||||
|       if node.return_type: |       if node.return_type: | ||||||
|         # Add modifier bits like const. |         # Add modifiers like 'const'. | ||||||
|         modifiers = '' |         modifiers = '' | ||||||
|         if node.return_type.modifiers: |         if node.return_type.modifiers: | ||||||
|           modifiers = ' '.join(node.return_type.modifiers) + ' ' |           modifiers = ' '.join(node.return_type.modifiers) + ' ' | ||||||
| @@ -79,12 +81,15 @@ def _GenerateMethods(output_lines, source, class_node): | |||||||
|       output_lines.append(line) |       output_lines.append(line) | ||||||
|  |  | ||||||
|  |  | ||||||
| def _GenerateMock(filename, source, ast_list, desired_class_names): | def _GenerateMocks(filename, source, ast_list, desired_class_names): | ||||||
|  |   processed_class_names = set() | ||||||
|   lines = [] |   lines = [] | ||||||
|   for node in ast_list: |   for node in ast_list: | ||||||
|     if (isinstance(node, ast.Class) and node.body and  |     if (isinstance(node, ast.Class) and node.body and | ||||||
|         (desired_class_names is None or node.name in desired_class_names)): |         # desired_class_names being None means that all classes are selected. | ||||||
|  |         (not desired_class_names or node.name in desired_class_names)): | ||||||
|       class_name = node.name |       class_name = node.name | ||||||
|  |       processed_class_names.add(class_name) | ||||||
|       class_node = node |       class_node = node | ||||||
|       # Add namespace before the class. |       # Add namespace before the class. | ||||||
|       if class_node.namespace: |       if class_node.namespace: | ||||||
| @@ -114,19 +119,23 @@ def _GenerateMock(filename, source, ast_list, desired_class_names): | |||||||
|           lines.append('}  // namespace %s' % class_node.namespace[i]) |           lines.append('}  // namespace %s' % class_node.namespace[i]) | ||||||
|         lines.append('')  # Add an extra newline. |         lines.append('')  # Add an extra newline. | ||||||
|  |  | ||||||
|   if lines: |   sys.stdout.write('\n'.join(lines)) | ||||||
|     sys.stdout.write('\n'.join(lines)) |  | ||||||
|   else: |   if desired_class_names: | ||||||
|     if desired_class_names is None: |     missing_class_names = ', '.join( | ||||||
|       sys.stderr.write('No classes not found\n') |         sorted(desired_class_names - processed_class_names)) | ||||||
|     else: |     if missing_class_names: | ||||||
|       class_names = ', '.join(sorted(desired_class_names)) |       sys.stderr.write('Class(es) not found in %s: %s\n' % | ||||||
|       sys.stderr.write('Class(es) not found: %s\n' % class_names) |                        (filename, missing_class_names)) | ||||||
|  |   elif not processed_class_names: | ||||||
|  |       sys.stderr.write('No class found in %s\n' % filename) | ||||||
|  |  | ||||||
|  |  | ||||||
| def main(argv=sys.argv): | def main(argv=sys.argv): | ||||||
|   if len(argv) < 2: |   if len(argv) < 2: | ||||||
|     sys.stdout.write(__doc__) |     sys.stderr.write('Google Mock Class Generator v%s\n\n' % | ||||||
|  |                      '.'.join(map(str, _VERSION))) | ||||||
|  |     sys.stderr.write(__doc__) | ||||||
|     return 1 |     return 1 | ||||||
|  |  | ||||||
|   global _INDENT |   global _INDENT | ||||||
| @@ -138,9 +147,9 @@ def main(argv=sys.argv): | |||||||
|     sys.stderr.write('Unable to use indent of %s\n' % os.environ.get('INDENT')) |     sys.stderr.write('Unable to use indent of %s\n' % os.environ.get('INDENT')) | ||||||
|  |  | ||||||
|   filename = argv[1] |   filename = argv[1] | ||||||
|   class_name = None |   desired_class_names = None  # None means all classes in the source file. | ||||||
|   if len(argv) >= 3: |   if len(argv) >= 3: | ||||||
|     class_name = set(argv[2:]) |     desired_class_names = set(argv[2:]) | ||||||
|   source = utils.ReadFile(filename) |   source = utils.ReadFile(filename) | ||||||
|   if source is None: |   if source is None: | ||||||
|     return 1 |     return 1 | ||||||
| @@ -154,7 +163,7 @@ def main(argv=sys.argv): | |||||||
|     # An error message was already printed since we couldn't parse. |     # An error message was already printed since we couldn't parse. | ||||||
|     pass |     pass | ||||||
|   else: |   else: | ||||||
|     _GenerateMock(filename, source, entire_ast, class_name) |     _GenerateMocks(filename, source, entire_ast, desired_class_names) | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 zhanyong.wan
					zhanyong.wan