import hashlib import json import os from pathlib import Path import py_compile import runpy import shutil import struct import subprocess import sys import tempfile from types import SimpleNamespace import unittest from unittest import mock import venv ROOT = Path(__file__).resolve().parents[1] APP_DIR = ROOT / 'app' sys.path.insert(0, str(APP_DIR)) import lifecycle_authority import supervisor def file_sha256(path): return hashlib.sha256(Path(path).read_bytes()).hexdigest() def canonical(path): return os.path.normcase(os.path.realpath(os.path.abspath(os.fspath(path)))) def copy_bootstraps(app_dir): app_dir.mkdir() for name in ('child_bootstrap.py', 'runtime_bootstrap.py'): shutil.copy2(APP_DIR / name, app_dir / name) def write_scanner_cache(app_dir, marker, invalidation_mode): scanner = app_dir / 'scanner.py' scanner.write_text('VALUE = "source"\n', encoding='ascii') payload = app_dir.parent / 'scanner_payload.py' payload.write_text( 'import os\n' 'with open(os.environ["PYC_PAYLOAD_MARKER"], "w", encoding="ascii") as handle:\n' ' handle.write("executed")\n', encoding='ascii', ) cache = Path(importlib_cache_path(scanner)) cache.parent.mkdir() py_compile.compile( str(payload), cfile=str(cache), dfile=str(scanner), doraise=True, invalidation_mode=invalidation_mode, ) payload.unlink() if invalidation_mode == py_compile.PycInvalidationMode.TIMESTAMP: data = bytearray(cache.read_bytes()) details = scanner.stat() data[8:16] = struct.pack('