| from __future__ import annotations |
| |
| import argparse |
| import os.path |
| import re |
| from typing import Sequence |
| |
| |
| def main(argv: Sequence[str] | None = None) -> int: |
| parser = argparse.ArgumentParser() |
| parser.add_argument('filenames', nargs='*') |
| mutex = parser.add_mutually_exclusive_group() |
| mutex.add_argument( |
| '--pytest', |
| dest='pattern', |
| action='store_const', |
| const=r'.*_test\.py', |
| default=r'.*_test\.py', |
| help='(the default) ensure tests match %(const)s', |
| ) |
| mutex.add_argument( |
| '--pytest-test-first', |
| dest='pattern', |
| action='store_const', |
| const=r'test_.*\.py', |
| help='ensure tests match %(const)s', |
| ) |
| mutex.add_argument( |
| '--django', '--unittest', |
| dest='pattern', |
| action='store_const', |
| const=r'test.*\.py', |
| help='ensure tests match %(const)s', |
| ) |
| args = parser.parse_args(argv) |
| |
| retcode = 0 |
| reg = re.compile(args.pattern) |
| for filename in args.filenames: |
| base = os.path.basename(filename) |
| if ( |
| not reg.fullmatch(base) and |
| not base == '__init__.py' and |
| not base == 'conftest.py' |
| ): |
| retcode = 1 |
| print(f'{filename} does not match pattern "{args.pattern}"') |
| |
| return retcode |
| |
| |
| if __name__ == '__main__': |
| raise SystemExit(main()) |