|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
| 3 | +import argparse |
3 | 4 | import os |
4 | 5 | import shutil |
| 6 | +import sys |
| 7 | +from pathlib import Path |
5 | 8 |
|
6 | 9 | from .web_scraping_api.generate_parameters import generate_parameters_file |
7 | 10 | from .web_scraping_api.generate_targets import generate_targets_enum_file, generate_targets_file |
8 | | -from .web_scraping_api.shared import local_ir_path, out_dir |
| 11 | +from .web_scraping_api.shared import local_ir_path, out_dir as _default_out_dir |
| 12 | + |
| 13 | + |
| 14 | +def _in_site_packages() -> bool: |
| 15 | + return "site-packages" in str(Path(__file__).resolve()) |
9 | 16 |
|
10 | 17 |
|
11 | 18 | def main() -> None: |
| 19 | + parser = argparse.ArgumentParser( |
| 20 | + prog="python -m decodo.codegen.codegen", |
| 21 | + description="Generate typed parameter classes from the Decodo IR schema.", |
| 22 | + ) |
| 23 | + parser.add_argument( |
| 24 | + "--out-dir", |
| 25 | + metavar="PATH", |
| 26 | + default=None, |
| 27 | + help=( |
| 28 | + "Directory to write generated files into. " |
| 29 | + "Defaults to the package's built-in generated/ directory " |
| 30 | + "(editable installs only). Required for non-editable installs." |
| 31 | + ), |
| 32 | + ) |
| 33 | + args = parser.parse_args() |
| 34 | + |
| 35 | + if args.out_dir is not None: |
| 36 | + out_dir = str(Path(args.out_dir).resolve()) |
| 37 | + elif _in_site_packages(): |
| 38 | + print( |
| 39 | + "error: running from a non-editable install.\n" |
| 40 | + "Generated files would be written into site-packages and silently reverted\n" |
| 41 | + "on the next `pip install --upgrade`.\n" |
| 42 | + "Use --out-dir <path> to specify a project-local output directory.", |
| 43 | + file=sys.stderr, |
| 44 | + ) |
| 45 | + sys.exit(1) |
| 46 | + else: |
| 47 | + out_dir = _default_out_dir |
| 48 | + |
12 | 49 | os.makedirs(out_dir, exist_ok=True) |
13 | 50 | init_path = os.path.join(out_dir, "__init__.py") |
14 | 51 | if not os.path.exists(init_path): |
15 | 52 | open(init_path, "w").close() |
16 | 53 |
|
17 | | - generate_parameters_file() |
18 | | - generate_targets_enum_file() |
19 | | - generate_targets_file() |
| 54 | + generate_parameters_file(out_dir) |
| 55 | + # The Target enum lives in decodo/targets.py (committed source). Only regenerate |
| 56 | + # it when we have write access to the source tree (editable install). Non-editable |
| 57 | + # installs already ship the enum baked into the package. |
| 58 | + if not _in_site_packages(): |
| 59 | + generate_targets_enum_file() |
| 60 | + generate_targets_file(out_dir) |
20 | 61 |
|
21 | 62 | # Copy the downloaded IR JSON into generated/ so BundledSchema can load |
22 | 63 | # schemas directly at runtime without a generated Python file. |
|
0 commit comments