tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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')