All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning, and yes, platform and engine support are part of the public API. Please file a bug if you notice a violation of semantic versioning.
1.0.2 - 2026-02-22
- TAG: v1.0.2
- COVERAGE: 98.13% -- 263/268 lines in 10 files
- BRANCH COVERAGE: 91.18% -- 62/68 branches in 10 files
- 96.77% documented
- Benchmarking tools — Performance comparison suite comparing
token-resolveragainst simpler alternatives (String#gsubandKernel#sprintf):benchmarks/comparison.rb— Comprehensive benchmark script measuring iterations per second across four realistic scenarios (simple replacement, moderate complexity, high complexity, and large documents with sparse tokens)gemfiles/modular/benchmark/ips.gemfile— Development dependency forbenchmark-ipsgem- Rake tasks:
rake bench:comparison(run comparison),rake bench:list(list benchmarks),rake bench:run(run all benchmarks),rake bench(alias) BENCHMARK.md— Results and analysis showing token-resolver is 100-3000x slower due to PEG parsing, validation, and AST building; includes guidance on when to use each approach and real-world performance context
1.0.1 - 2026-02-22
- TAG: v1.0.1
- COVERAGE: 98.13% -- 263/268 lines in 10 files
- BRANCH COVERAGE: 91.18% -- 62/68 branches in 10 files
- 96.77% documented
Config#segment_patternoption — a parslet character class constraining which characters are valid inside token segments (default:"[A-Za-z0-9_]"). This prevents false positive token matches against Ruby block parameters ({ |x| expr }), shell variable expansion (${VAR:+val}), and other syntax that structurally resembles tokens but contains spaces or punctuation in the "segments".Resolve#resolvenow validates replacement keys against the config'ssegment_patternand raisesArgumentErrorif a key contains characters that the grammar would never parse.
- False positive token matches — the grammar previously used
any(match any character) for segment content, which allowed spaces, operators, and punctuation inside token segments. This caused Ruby block syntax like{ |fp| File.exist?(fp) }and shell expansion like${CLASSPATH:+:$CLASSPATH}to be incorrectly parsed as tokens. With multi-separator configs (["|", ":"]), the second|was reconstructed as:duringon_missing: :keeproundtripping, silently corrupting source files. The grammar now usesmatch(segment_pattern)instead ofany, limiting segments to word characters by default.
1.0.0 - 2026-02-21
- TAG: v1.0.0
- COVERAGE: 97.67% -- 252/258 lines in 10 files
- BRANCH COVERAGE: 89.39% -- 59/66 branches in 10 files
- 96.72% documented
- Initial release