asset-release.py (2353B)
1 #!/usr/bin/env python3 2 """Determinism and invalidation tests for the complete release namespace.""" 3 import importlib.util 4 import json 5 from pathlib import Path 6 import sys 7 import tempfile 8 9 spec = importlib.util.spec_from_file_location('assets', sys.argv[1]) 10 assets = importlib.util.module_from_spec(spec) 11 spec.loader.exec_module(assets) 12 with tempfile.TemporaryDirectory() as temporary: 13 parent = Path(temporary) 14 entries = ['dist/app.js', 'dist/wasm-worker.js', 'dist/local-module-worker.js', 15 'dist/dependency.js', 'runtime/haskell/worker.mjs', 16 'runtime/haskell/shim/index.js', 'runtime/haskell/reactor.wasm', 17 'runtime/haskell/data/compiler.dag', 'runtime/zig/site-session.mjs', 18 'runtime/zig/arboricx.wasm', 'catalogue.json', 'packages.json', 19 'compiler.json', 'environments.json', 'style.css', 'images/icon.svg', 20 'reference/libraries/example.md', 'reference/libraries.md', 'reference/getting-started.md', 'reference/libraries.json', 'images/favicon.png', 'images/apple-touch-icon.png', 'images/preview.png'] 21 def build(number, changed=None, reverse=False): 22 root = parent / str(number) 23 root.mkdir() 24 (root / 'index.html').write_text('<link href="./style.css"><script type="module" src="./dist/app.js"></script>' + ''.join('<link href="./images/'+n+'">' for n in ['icon.svg','favicon.png','apple-touch-icon.png']) + '<meta content="https://arbori.cx/images/preview.png">') 25 for name in reversed(entries) if reverse else entries: 26 file = root / name 27 file.parent.mkdir(parents=True, exist_ok=True) 28 file.write_text(name + (' changed' if name == changed else '')) 29 assets.freeze(root) 30 manifest = json.loads((root / 'assets.json').read_text()) 31 base = root / manifest['base'] 32 for name in entries: 33 assert (base / name).read_text() == name + (' changed' if name == changed else '') 34 assert not (root / name).is_file() 35 return manifest 36 first = build(0) 37 assert first == build(1, reverse=True), 'Creation order must not affect identity' 38 for i, name in enumerate(entries, 2): 39 assert build(i, name)['version'] != first['version'], name 40 print('PASS deterministic release identity; every asset kind invalidates the namespace')