Mon, 22 Jan 2018 13:51:13 +0200
Commit work done on test loading
| 16 | 1 | from warnings import warn |
| 2 | ||
| 3 | def report_element(bad_object, type, error_name, args): | |
| 12 | 4 | return { |
| 16 | 5 | 'type': type, |
| 6 | 'object': bad_object, | |
| 7 | 'name': error_name, | |
| 8 | 'args': args, | |
| 13 | 9 | } |
| 10 | ||
| 16 | 11 | def warning(bad_object, error_name, *args): |
| 12 | return report_element(bad_object, 'warning', error_name, args) | |
| 13 | ||
| 14 | def error(bad_object, error_name, *args): | |
| 15 | return report_element(bad_object, 'error', error_name, args) | |
| 16 | ||
| 17 | def test_discovery(): | |
| 18 | ''' | |
| 19 | Finds all test modules and yields their names. | |
| 20 | ''' | |
| 21 | from pkgutil import walk_packages | |
| 22 | import tests | |
| 23 | yield from sorted( | |
| 24 | 'tests.' + result.name | |
| 25 | for result in walk_packages(tests.__path__) | |
| 26 | ) | |
| 27 | ||
| 28 | def do_manifest_integrity_checks(test_suite, module): | |
| 29 | ''' | |
| 30 | Runs integrity checks on a given module's manifest. | |
| 31 | ''' | |
| 32 | def check_for_extra_keys(): | |
| 33 | extra_keys = module.manifest.keys() - test_suite.keys() | |
| 34 | if extra_keys: | |
| 35 | warn(str.format( | |
| 36 | '{}: extra keys in manifest: {}', | |
| 37 | module.__name__, | |
| 38 | ', '.join(map(str, extra_keys)) | |
| 39 | )) | |
| 40 | def check_for_manifest_duplicates(): | |
| 41 | for key in test_suite.keys(): | |
| 42 | duplicates = module.manifest[key].keys() & test_suite[key].keys() | |
| 43 | if duplicates: | |
| 44 | warn(str.format( | |
| 45 | '{}: redefined {} in manifests: {}', | |
| 46 | module.__name__, | |
| 47 | key, | |
| 48 | duplicates, | |
| 49 | )) | |
| 50 | check_for_extra_keys() | |
| 51 | check_for_manifest_duplicates() | |
| 52 | ||
| 53 | def load_tests(): | |
| 54 | ''' | |
| 55 | Imports test modules and combines their manifests into a test suite. | |
| 56 | ''' | |
| 57 | test_suite = {'tests': {}, 'messages': {}} | |
| 58 | for module_name in test_discovery(): | |
| 59 | from importlib import import_module | |
| 60 | module = import_module(module_name) | |
| 61 | if hasattr(module, 'manifest'): | |
| 62 | do_manifest_integrity_checks(test_suite, module) | |
| 63 | # Merge the data from the manifest | |
| 64 | for key in module.manifest.keys() & test_suite.keys(): | |
| 65 | test_suite[key].update(module.manifest[key]) | |
| 66 | else: | |
| 67 | warn(str.format('Module {} does not have a manifest', module_name)) | |
| 68 | return test_suite | |
| 69 | ||
| 70 | if __name__ == '__main__': | |
| 71 | from pprint import pprint | |
| 72 | pprint(load_tests()) |