Spaces:
Paused
Paused
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())
|