File size: 2,241 Bytes
1c730d1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python3
# Copyright (c) 2025-2026, RTE (https://www.rte-france.com)
# SPDX-License-Identifier: MPL-2.0
"""Pack Game Mode grid networks for commit: network.xiidm -> .gz.b64.

The inverse of scripts/game_mode/decode_tht_grids.py. Run it after (re)building
a family's grids, before committing them: the raw XIIDM is far too large to
commit (~20 MB per Matpower grid) and a binary .zip would need Git-LFS, whose
object endpoint is blocked in some CI egress policies. gzip + base64 keeps the
payload text, diff-safe for git's packing, and dependency-free to decode.

    python scripts/game_mode/pack_grids.py                   # every family
    python scripts/game_mode/pack_grids.py data/rte_matpower  # one family
"""
from __future__ import annotations

import argparse
import base64
import gzip
from pathlib import Path

from decode_tht_grids import ROOTS  # noqa: E402  (same directory)


def pack_root(root: Path, force: bool = False) -> int:
    n = 0
    for src in sorted(root.glob("*/network.xiidm")):
        out = src.with_name(src.name + ".gz.b64")
        if out.exists() and not force and out.stat().st_mtime >= src.stat().st_mtime:
            print(f"à jour  {root.parent.name}/{src.parent.name}")
            continue
        blob = base64.b64encode(gzip.compress(src.read_bytes(), 9))
        out.write_bytes(blob)
        n += 1
        print(f"packé   {root.parent.name}/{src.parent.name}: "
              f"{src.stat().st_size / 1e6:.1f} Mo -> {len(blob) / 1e6:.1f} Mo "
              f"({src.stat().st_size / max(1, len(blob)):.1f}x)")
    return n


def main() -> int:
    ap = argparse.ArgumentParser(description=__doc__.split("\n")[0])
    ap.add_argument("family", nargs="*", type=Path,
                    help="racine(s) de famille (défaut: toutes)")
    ap.add_argument("--force", action="store_true",
                    help="re-packer même si le .gz.b64 est plus récent")
    args = ap.parse_args()
    roots = [f / "grids" if (f / "grids").is_dir() else f
             for f in args.family] or list(ROOTS)
    total = sum(pack_root(r, args.force) for r in roots if r.is_dir())
    print(f"{total} réseau(x) packé(s)")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())