Class: Ucode::Audit::Release::Emitter

Inherits:
Object
  • Object
show all
Includes:
Repo::AtomicWrites
Defined in:
lib/ucode/audit/release/emitter.rb

Overview

Orchestrator that assembles the fontist.org release tree from a list of per-formula FormulaAudits (TODO 27).

Drives Emitter::FaceDirectory per formula to emit each face's audit subtree under <release_root>/audit/<slug>/<face>/, then writes the two top-level indices:

- `<release_root>/library.json` — formula + face card index
via {LibraryIndexBuilder}.
- `<release_root>/manifest.json` — release manifest via
{ManifestBuilder} (a {Models::Audit::ReleaseManifest}).

The universal-set directory is NOT copied by this emitter. The CI collector is expected to pre-stage <release_root>/universal_glyph_set/ (built separately by ucode universal-set build). The manifest records whether that directory is present.

Idempotent: every write goes through Repo::AtomicWrites (byte-compare, then rename). Re-running on unchanged input produces zero file writes on the second pass.

Defined Under Namespace

Classes: Result

Instance Method Summary collapse

Methods included from Repo::AtomicWrites

#same_content?, #to_pretty_json, #write_atomic

Constructor Details

#initialize(output_root:, universal_set_root: nil, face_directory: nil, verbose: false, with_glyphs: false, with_missing_glyph_pages: true) ⇒ Emitter

Returns a new instance of Emitter.

Parameters:

  • output_root (String, Pathname)

    parent of the release root. The release tree lives at <output_root>/font_audit_release/.

  • universal_set_root (String, Pathname, nil) (defaults to: nil)

    location of the universal_glyph_set directory. Defaults to <release_root>/universal_glyph_set (the canonical location inside the release tree).

  • face_directory (Emitter::FaceDirectory) (defaults to: nil)

    injectable for testing. Defaults to a fresh instance configured with the same universal_set_root and emit_browser: true.

  • verbose (Boolean) (defaults to: false)

    emit per-codepoint detail chunks per face. Forwarded to Emitter::FaceDirectory.

  • with_glyphs (Boolean) (defaults to: false)

    emit per-codepoint SVG chunks. Forwarded to Emitter::FaceDirectory.

  • with_missing_glyph_pages (Boolean) (defaults to: true)

    emit per-block missing-glyph galleries. Forwarded to Emitter::FaceDirectory.



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/ucode/audit/release/emitter.rb', line 62

def initialize(output_root:, universal_set_root: nil, face_directory: nil,
               verbose: false, with_glyphs: false, with_missing_glyph_pages: true)
  @output_root = output_root
  @universal_set_root = universal_set_root
  @verbose = verbose
  @with_glyphs = with_glyphs
  @with_missing_glyph_pages = with_missing_glyph_pages
  @face_directory = face_directory || build_default_face_directory
  @library_index_builder = LibraryIndexBuilder.new
  @manifest_builder = ManifestBuilder.new
end

Instance Method Details

#emit(formulas:, unicode_version:, generated_at:, source_config_sha256: nil) ⇒ Result

Parameters:

  • formulas (Array<FormulaAudits>)
  • unicode_version (String, nil)
  • generated_at (String)

    ISO8601 timestamp

  • source_config_sha256 (String, nil) (defaults to: nil)

Returns:



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ucode/audit/release/emitter.rb', line 79

def emit(formulas:, unicode_version:, generated_at:,
         source_config_sha256: nil)
  release_root = Ucode::Audit::Emitter::Paths.release_root(@output_root)
  formulas.each { |fa| emit_formula(release_root, fa) }
  manifest = @manifest_builder.build(
    formulas: formulas,
    release_root: release_root,
    unicode_version: unicode_version,
    ucode_version: Ucode::VERSION,
    generated_at: generated_at,
    source_config_sha256: source_config_sha256,
    universal_set_root: resolved_universal_set_root(release_root),
  )
  library_written = write_library_index(release_root, formulas, generated_at)
  manifest_written = write_manifest(release_root, manifest)
  Result.new(
    release_root: release_root.to_s,
    formulas_total: formulas.size,
    faces_total: formulas.sum(&:faces_total),
    library_index_written: library_written,
    manifest_written: manifest_written,
    universal_set_available: manifest.universal_set.available,
  )
end