|
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | from __future__ import annotations |
3 | 3 |
|
| 4 | +import argparse |
| 5 | +import ast |
4 | 6 | import os |
| 7 | +import re |
| 8 | +import subprocess |
5 | 9 | import sys |
6 | | -import unittest.mock |
7 | 10 |
|
| 11 | +ALL_RE = re.compile(r'__all__ = (\([^)]+\))') |
8 | 12 |
|
9 | | -def main() -> int: |
10 | | - assert sys.version_info[:2] == (3, 6), 'needs py36' |
11 | | - |
12 | | - mock = __import__('mock') # avoid self-rewriting! |
13 | 13 |
|
14 | | - mock_all, mock_version = mock.__all__, mock.__version__ |
15 | | - unittest_mock_all = unittest.mock.__all__ |
| 14 | +def _get_all(cpython: str, version: str) -> frozenset[str]: |
| 15 | + cmd = ('git', '-C', cpython, 'show', f'{version}:Lib/unittest/mock.py') |
| 16 | + out = subprocess.check_output(cmd, stderr=subprocess.DEVNULL).decode() |
| 17 | + match = ALL_RE.search(out) |
| 18 | + assert match is not None |
| 19 | + return frozenset(ast.literal_eval(match[1])) |
16 | 20 |
|
17 | | - attrs = set(mock_all).intersection(unittest_mock_all) |
18 | 21 |
|
19 | | - renames_s = '\n'.join( |
20 | | - sorted( |
21 | | - f" '{orig_mod}=unittest.mock:{attr}'," |
22 | | - for orig_mod in ('mock', 'mock.mock') |
23 | | - for attr in attrs |
24 | | - ), |
25 | | - ) |
26 | | - |
27 | | - print( |
28 | | - f'# GENERATED VIA {os.path.basename(sys.argv[0])}\n' |
29 | | - f'# Using mock=={mock_version}\n' |
30 | | - f'REPLACES[(3,)].update((\n{renames_s}\n))\n' |
31 | | - f'# END GENERATED\n', |
32 | | - ) |
| 22 | +def main() -> int: |
| 23 | + parser = argparse.ArgumentParser() |
| 24 | + parser.add_argument('cpython') |
| 25 | + args = parser.parse_args() |
| 26 | + |
| 27 | + prev = _get_all(args.cpython, 'v3.3.0') |
| 28 | + to_add: dict[tuple[int, ...], frozenset[str]] = {(3,): prev} |
| 29 | + |
| 30 | + for minor in range(6, 999): |
| 31 | + try: |
| 32 | + new = _get_all(args.cpython, f'v3.{minor}.0') |
| 33 | + except subprocess.CalledProcessError: |
| 34 | + break |
| 35 | + |
| 36 | + if new != prev: |
| 37 | + to_add[(3, minor)] = new - prev |
| 38 | + prev = new |
| 39 | + |
| 40 | + print(f'# GENERATED VIA {os.path.basename(sys.argv[0])}') |
| 41 | + print(f'# up until cpython 3.{minor - 1}.0') |
| 42 | + for k, v in sorted(to_add.items()): |
| 43 | + print(f'REPLACES[{k}].update((') |
| 44 | + for s in sorted( |
| 45 | + f" '{orig_mod}=unittest.mock:{attr}'," |
| 46 | + for orig_mod in ('mock', 'mock.mock') |
| 47 | + for attr in v |
| 48 | + ): |
| 49 | + print(s) |
| 50 | + print('))') |
| 51 | + print('# END GENERATED') |
33 | 52 |
|
34 | 53 | return 0 |
35 | 54 |
|
|
0 commit comments