The core in modell/kjerne/ is an unmodified copy of sim.py, diagnose.py and forlop.py from den-dynamiske-rettsstaten @2badc25, pinned by sha256. kjor.py is the single entry point; kontroll.py reproduces the note's 22 data files and printed results. Skills: diagnose and forlop (Norwegian). Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
# Copyright (c) 2026 Kjell Tore Guttormsen. MIT License, see LICENSE.
|
|
"""Felles hjelpere for testene: stier, kjøring av kjor.py og en kopi av pluginens modell."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
ROT = Path(__file__).resolve().parent.parent
|
|
MODELL = ROT / "modell"
|
|
KJOR = MODELL / "kjor.py"
|
|
FASIT = ROT / "fasit"
|
|
EKSEMPLER = ROT / "eksempler"
|
|
DOMSTOL = EKSEMPLER / "eksempel_domstol.json"
|
|
NORGE = EKSEMPLER / "norge_2025.json"
|
|
|
|
|
|
def kjor(
|
|
*args: str,
|
|
python: list[str] | None = None,
|
|
hjem: Path | None = None,
|
|
cwd: Path | None = None,
|
|
) -> subprocess.CompletedProcess[str]:
|
|
"""Kjør kjor.py som brukeren gjør, og fang utskrift og exit-kode.
|
|
|
|
python: tolken (med valg), standard er den som kjører testene (har numpy og scipy).
|
|
hjem: HOME for prosessen, slik at standardmappa ~/.dynamisk-rettsstat aldri er brukerens egen.
|
|
"""
|
|
miljo = dict(os.environ, PYTHONIOENCODING="utf-8", PYTHONDONTWRITEBYTECODE="1")
|
|
miljo.pop("DYNAMISK_RETTSSTAT_VENV", None)
|
|
if hjem is not None:
|
|
miljo["HOME"] = str(hjem)
|
|
return subprocess.run(
|
|
[*(python or [sys.executable]), str(KJOR), *args],
|
|
capture_output=True, text=True, encoding="utf-8", env=miljo, cwd=str(cwd or ROT), check=False,
|
|
)
|
|
|
|
|
|
def fasit(navn: str) -> str:
|
|
"""Innholdet i en fasitfil."""
|
|
return (FASIT / navn).read_text(encoding="utf-8")
|
|
|
|
|
|
def lag_venv_omvei(data: Path, *python: str) -> Path:
|
|
"""Lag en «egen mappe» i data/venv der bin/python er et lite skript som starter en gitt Python.
|
|
|
|
Testene installerer ingenting: omveien peker på en Python som allerede finnes.
|
|
"""
|
|
bin_mappe = data / "venv" / "bin"
|
|
bin_mappe.mkdir(parents=True)
|
|
tolk = bin_mappe / "python"
|
|
kommando = " ".join(f'"{p}"' for p in python)
|
|
tolk.write_text(f'#!/bin/sh\nexec {kommando} "$@"\n', encoding="utf-8")
|
|
tolk.chmod(0o755)
|
|
return tolk
|
|
|
|
|
|
@pytest.fixture
|
|
def hjem(tmp_path: Path) -> Path:
|
|
"""En tom hjemmemappe for prosessen."""
|
|
mappe = tmp_path / "hjem"
|
|
mappe.mkdir()
|
|
return mappe
|
|
|
|
|
|
@pytest.fixture
|
|
def kopi(tmp_path: Path) -> Path:
|
|
"""En kopi av modell/, fasit/ og eksempler/ som testen kan endre. Returnerer kopiens rot."""
|
|
rot = tmp_path / "kopi"
|
|
for navn in ("modell", "fasit", "eksempler"):
|
|
shutil.copytree(ROT / navn, rot / navn, ignore=shutil.ignore_patterns("__pycache__"))
|
|
for navn in ("scenario.py", "arbeidskopi.py"):
|
|
(rot / "modell" / navn).unlink(missing_ok=True)
|
|
return rot
|