Cached Generation
ci / checks (push) Successful in 2h36m35s

This commit is contained in:
khodowany
2026-09-20 10:39:12 -05:00
parent 7244cebe68
commit 68ded4d8c8
8 changed files with 322 additions and 16 deletions
+23 -1
View File
@@ -4,6 +4,7 @@ import argparse
import shutil
import tempfile
from pathlib import Path
from time import monotonic
from generator.arrange.generate import generate_performance_scores
from generator.practice.generate import generate_practice_scores
@@ -29,12 +30,27 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--output-dir", type=Path, required=True)
parser.add_argument("--static-assets-dir", type=Path, default=Path("package/assets"))
parser.add_argument("--check", action="store_true")
parser.add_argument("--engraving-cache", type=Path)
parser.add_argument("--jobs", type=int, default=1, choices=range(1, 17), metavar="1-16")
parser.add_argument("--progress", action="store_true")
return parser.parse_args()
def generate_assets(args: argparse.Namespace) -> None:
data_dir = args.data_dir.resolve()
output_dir = args.output_dir.resolve()
static_assets_dir = args.static_assets_dir.resolve()
cache_dir = getattr(args, 'engraving_cache', None)
cache_dir = cache_dir.resolve() if cache_dir else None
if cache_dir and (cache_dir.is_relative_to(output_dir) or output_dir.is_relative_to(cache_dir)):
raise ValueError('engraving cache and generated assets must not overlap')
progress = getattr(args, 'progress', False)
started = monotonic()
def report(message):
if progress:
print(f'Assets [{monotonic() - started:.0f}s]: {message}', flush=True)
report('validating MusicXML sources')
for source in sorted(data_dir.rglob('*.xml')):
load_musicxml(source)
output_dir.parent.mkdir(parents=True, exist_ok=True)
@@ -42,15 +58,20 @@ def generate_assets(args: argparse.Namespace) -> None:
staged = Path(temporary) / 'assets'
staged.mkdir(parents=True, exist_ok=True)
copy_runtime_fonts(static_assets_dir, staged)
report('generating performance parts and practice variants')
performance_count = generate_performance_scores(data_dir / 'songs', staged / 'songs')
practice_count = generate_practice_scores(data_dir, staged / 'practice')
validate_generated_tree(staged)
if args.check:
validate_expected_performance_summary(data_dir / 'expected' / 'performance_summary.json', staged / 'songs')
validate_practice_variants(staged / 'practice')
report('compiling playback')
compile_tree(staged)
engrave_tree(staged, static_assets_dir / 'fonts' / 'petaluma')
report('engraving pages')
engrave_tree(staged, static_assets_dir / 'fonts' / 'petaluma', cache_dir=cache_dir, jobs=getattr(args, 'jobs', 1), progress=progress)
report('validating score, page, and audio assets')
validate_generated_tree(staged)
report('building catalogue database')
build_catalogue(staged)
backup = Path(temporary) / 'previous'
if output_dir.exists():
@@ -61,6 +82,7 @@ def generate_assets(args: argparse.Namespace) -> None:
if backup.exists():
backup.rename(output_dir)
raise
report('publishing complete')
print(f'Generated Product Vamp assets: {performance_count} performance scores, '
f'{practice_count} practice score variants, {count_json_files(output_dir)} total JSON files.')
if args.check: