fontisan 0.4.25 → 0.4.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f8c0752461168f5fa647b8a581455a1daa4ed17f7649b1b28cf3850b1453748
4
- data.tar.gz: 99e14f77bfdb9cf1303b51d9f236a82c2cfbf284885d56fbe79be56fb338a237
3
+ metadata.gz: d9d761c9308f66218312a055b752135a728413c634fba54caa309c37076a03f0
4
+ data.tar.gz: 8ec9394bfde51dec443f7b854ab29d698a9cb70c63543ea4067b0fc23ffd10fc
5
5
  SHA512:
6
- metadata.gz: 15960f305c5c9f6cfef40e55adf0b5eb95a54f51aa902dae77d2db6c7735b821d7b3bb320582eebed3141a3a5d72cf396e51a3a7845a9222f283c6ca4e9a0e90
7
- data.tar.gz: 70d21559793f7c48965c8bf2601788dccf6f63c7c66db70cd49a3822b280664d30a333db717b61ad7348fbb831a31ab158ef22dc117f8e683321da131b52dad5
6
+ metadata.gz: a123990197a2754d9039c7c12f9ed8432165ded5f1c8c1b10c6f150d03907ecd09bc0baf50d40e853ccbad4c340b0694718ea74759b6dacb7fe3796212e8c703
7
+ data.tar.gz: c0510eee21f156b9f9d7e0110da16372a4c8418774144294efa7fcfcb7b049da72b42f6d683b1a8043e91b2f5ce66d201f3ec84173eead40d5bdab36d8d41ca2
@@ -45,28 +45,58 @@ ucode owns the Unicode-coverage axis (UCD parsing, block/script aggregation, per
45
45
 
46
46
  **The fontisan audit does NOT bundle UCDXML parsing.** Block aggregation is delegated: fontisan audit accepts an optional pre-built ucode index path, OR emits the codepoint list and lets the consumer (fontist-archive) run ucode separately.
47
47
 
48
- ## Beyond ucode: revised priority after self-debate
49
-
50
- A critical self-debate (see commit history) culled several "diagnostic" features that overlap with existing tools. The surviving axes:
51
-
52
- ### Keephigh value, fontisan-unique
53
- - **Identity + Style + Features** — justified for archival format (one YAML per face, with provenance). NOT a general font inspector.
54
- - **Subset report** when fontisan subsets, emit a structured report (glyph/codepoint/table breakdown). Web font engineers hit this daily; pyftsubset emits minimal output. fontisan has the subset infrastructure.
55
- - **Cross-format equivalence** — `fontisan equivalent font.ttf font.woff2` → true/false + diff. Catches CDN regeneration bugs from stale masters. fontTools diffs are too noisy.
56
- - **License/rights extraction** OS/2 fsType embedding bits, name ID 13 license, head macStyle commercial-use hints. Compliance teams need this before redistribution. Currently buried.
57
- - **Collection integrity** — narrow (CJK foundries, Apple system fonts) but real for that audience. Cheap to add once identity extraction exists.
58
-
59
- ### Drop — overlap with established tools
60
- - ~~**OTS-rejection predictor**~~ Chromium ships `ots-sanitize`, the actual tool Chrome uses. Reimplementing in Ruby means we're always behind Chrome's evolving rule set. Better: wrap ots-sanitize as subprocess.
61
- - ~~**Format-round-trip report**~~ WOFF2 is lossless by design; report would say "nothing changed" 99% of the time. TTF↔OTF outline-fidelity is a real check but it's one function, not an audit axis.
62
- - ~~**Variable-font readiness**~~ **fontbakery** owns this space. Hundreds of mature checks, Google Fonts uses it for every submission. Don't compete; wrap if needed.
63
- - ~~**Hinting audit**~~ audience is ~50 people worldwide. Modern web fonts ship largely unhinted. VF fonts don't use TT hints. Specialized tools (FontLab, ttfautohint) serve this niche better.
64
-
65
- ### Maybe later niche but real
66
- - **Performance profile** glyph count, table-level bytes, predicted parse time. Mobile/embedded niche. Apple has internal tools; nothing public.
67
- - **Identity hash** canonical hash of (name + post + head + OS/2 identity) surviving lossless conversion. CDN/asset-pipeline use case.
68
-
69
- The headline correction: the original proposal positioned fontisan audit as a "font inspector" competing with commodity tools. The actually-valuable features are **workflow-specific reports** (subset, conversion equivalence, license) that leverage fontisan's unique subsetting + conversion infrastructure. ucode can't do any of these.
48
+ ## Beyond ucode: fontisan as the pure-Ruby replacement for ALL font validators
49
+
50
+ **Positioning correction (after self-debate):** fontisan's stated mission is *"replaces two tools: otfinfo and extract_ttc"*. The natural extension: `fontisan audit` should replace **every** non-Ruby font validator — `fontbakery`, `ots-sanitize`, MS Font Validator, Apple `ftxvalidator`, `ttfautohint`'s verify mode. Each of these is a non-Ruby dependency that fontisan can eliminate for any Ruby-based font workflow.
51
+
52
+ The first-draft of this TODO deferred to those tools ("fontbakery owns this; wrap it"). That was wrong fontbakery being mature is exactly the reason fontisan should match it: eliminating Python from font toolchains is the value proposition. fontTools tracks the OT spec; fontisan tracks it the same way. The "always behind Chrome" concern is a maintenance discipline, not a reason not to build it.
53
+
54
+ ### The full audit axis inventory
55
+
56
+ Each axis below is currently owned by a non-Ruby tool. fontisan's audit command should provide a pure-Ruby equivalent.
57
+
58
+ | Axis | Replaces | Why fontisan |
59
+ |------|----------|--------------|
60
+ | Identity + style + features | `otfinfo` (LCDF) | Already replaced; `audit` is the structured-report sibling of `info` |
61
+ | Subset report | (no current tool) | fontisan-unique leverages subset infrastructure |
62
+ | Cross-format equivalence | `ttx` diff (fontTools) | Less noisy; first-class "is this the same font?" |
63
+ | License/rights extraction | (manual OS/2 reading) | One-liner compliance check |
64
+ | Collection integrity | (no current tool for TTC) | TTC is undertooled; CJK/Apple narrow but real |
65
+ | **OTS-rejection predictor** | **`ots-sanitize` (C++)** | Pure-Ruby; no system dependency; cross-platform |
66
+ | **Variable-font readiness** | **`fontbakery` (Python)** | Pure-Ruby replacement; eliminate Python from font toolchains |
67
+ | **Hinting audit** | **`ftxvalidator` + FontLab** | Pure-Ruby; covers Windows/embedded use cases |
68
+ | **Format-round-trip report** | **`ttx` diff** | Verifies fontisan's own conversions + cross-tool comparison |
69
+ | **WOFF2 spec validation** | (informal) | fontisan has the encoder; expose validation |
70
+ | **Glyph name validation** | (informal) | OT spec regex/length/reserved-name rules |
71
+ | **cmap subtable validation** | (informal) | Format 4 segment mismatches, format 12 group ordering — common bugs |
72
+ | **Table directory validation** | (informal) | Checksum, alignment, offset arithmetic |
73
+ | **OpenType conformance** | **`fontbakery` + MS Font Validator** | Hundreds of OT spec "should"/"must" rules |
74
+
75
+ ### Build order (priority)
76
+
77
+ Phase 1 (baseline + immediate-value workflow reports):
78
+ 1. Identity + style + features (archival format)
79
+ 2. Subset report
80
+ 3. Cross-format equivalence
81
+ 4. License/rights extraction
82
+
83
+ Phase 2 (replace the validators — incremental):
84
+ 5. Table directory validation (checksums, alignment — easy, foundational)
85
+ 6. cmap subtable validation (common real-world bugs)
86
+ 7. OTS-rejection predictor (port `ots-sanitize` rule set)
87
+ 8. Glyph name validation (cheap OT spec rules)
88
+
89
+ Phase 3 (broader scope):
90
+ 9. Variable-font readiness (port fontbakery's GF-VF check subset)
91
+ 10. Hinting audit
92
+ 11. WOFF2 spec validation
93
+ 12. Format-round-trip report
94
+ 13. Collection integrity
95
+ 14. Full OpenType conformance (long-running — tracks OT spec evolution)
96
+
97
+ ### Cross-language integration policy
98
+
99
+ When fontisan reaches parity with fontbakery/ots-sanitize on a given check, it's the consumer's choice: use the pure-Ruby implementation (zero system deps) OR shell out to the established tool (mature, may have checks fontisan hasn't ported yet). fontisan shouldn't *force* the replacement — it should *earn* it by being correct and cross-platform.
70
100
 
71
101
  ## Approach
72
102
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Fontisan
4
- VERSION = "0.4.25"
4
+ VERSION = "0.4.26"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fontisan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.25
4
+ version: 0.4.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.