token-resolver 1.0.1 → 2.0.0

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: 66d9dd5b6e50ded563ba876174ef20a039d7c074193136becdb5c49117b34039
4
- data.tar.gz: 24245d7bd943145c2c7096931d3d2b5c514b226538e2c1f0f35dc408c72a9cb8
3
+ metadata.gz: 2614ef5d4abd4335b18fcfb4a75a7f5fff7e9285ad7690659e3028997b69e765
4
+ data.tar.gz: 477a74ae8456d26cd15648bb1e521786e047f906875050960f8b1376a99d2c12
5
5
  SHA512:
6
- metadata.gz: 178cc7d07c311b8c8c66b022c71a6ef0e6fa6e903b00abe2c815d217ff03129ff546b66ea02f956e85c71149a56c02340e4f0fdff7c6acb02fe44e6d736736cb
7
- data.tar.gz: 9acb5dd248d648b4db87d34fa39f34401e365904b899736a0ef97f21dca47beb8446b02673e9ce7dd7bdca5045a909127b2765e18bc99a5a8ffd8d079cfd917e
6
+ metadata.gz: d7322c8f2d6ca25f538bc54f9450daf3edae06a07aee627909d1a01b431ba0d6a39f76234d1a9737807adf0c822055ce67ef36ff7166b615791b88b0a0fad7db
7
+ data.tar.gz: 393e05d3ab64f07d559bb0e2d4bbdfcd2bac219e05b04d7bdfc96d3cf72dd79403008cc062e69c68a6ccf6e5c5b8e2a053b7d9cc991d4bc2531a658848e2d487
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,81 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.0.0] - 2026-05-27
34
+
35
+ - TAG: [v2.0.0][2.0.0t]
36
+ - COVERAGE: 100.00% -- 265/265 lines in 10 files
37
+ - BRANCH COVERAGE: 100.00% -- 64/64 branches in 10 files
38
+ - 93.55% documented
39
+
40
+ ### Added
41
+
42
+ - **New CI workflows** — Expanded Ruby/engine matrix coverage:
43
+ - `jruby.yml` — JRuby CI workflow
44
+ - `ruby-3.4.yml` — Ruby 3.4 CI workflow
45
+ - `templating.yml` — Templating CI workflow
46
+ - `truffleruby-23.1.yml`, `truffleruby-23.2.yml`, `truffleruby-24.2.yml`, `truffleruby-25.0.yml` — TruffleRuby version-pinned CI workflows
47
+ - Renamed `legacy.yml` → `ruby-3.2.yml` and `supported.yml` → `ruby-3.3.yml` for consistency
48
+ - **Dev binaries** — New developer/tooling scripts in `bin/`: `ast-merge-recipe`, `kettle-gh-release`, `kettle-jem`, `print_matches`, `rbts`, `unparser`
49
+ - **Modular gemfiles** — Added `coverage_local.gemfile`, `style_local.gemfile`, `templating.gemfile`, `templating_local.gemfile`, and recording gemfiles for local-path sibling gem development
50
+ - **Dev container setup** — Added `devcontainer/scripts/setup-tree-sitter.sh` for Tree-sitter native library installation
51
+ - **mise environment management** — Added `mise.toml` for ENV-driven local development configuration; migrated from `.envrc`-only approach to mise + dotenvy
52
+ - **Template freeze markers** — Added `kettle-jem:freeze` / `kettle-jem:unfreeze` markers in `token-resolver.gemspec` to preserve custom sections across template runs
53
+ - **`.gemrc`** — Added project-level gem configuration file
54
+ - **`.rubocop_rspec.yml`** — Added RSpec-specific RuboCop configuration
55
+ - **GitHub Copilot instructions** — Added `.github/COPILOT_INSTRUCTIONS.md`
56
+ - **License texts** — Added `AGPL-3.0-only.md` and `PolyForm-Small-Business-1.0.0.md`
57
+
58
+ ### Changed
59
+
60
+ - **BREAKING: License changed from MIT to AGPL-3.0-only OR PolyForm-Small-Business-1.0.0** — `spec.licenses` updated in gemspec; license files, README badges, and compatibility metadata updated accordingly
61
+ - **`kettle-dev`** development dependency bumped from `~> 1.2` to `~> 2.0`
62
+ - **`bundler-audit`** development dependency bumped from `~> 0.9.2` to `~> 0.9.3`
63
+ - **`appraisal2`** version constraint loosened from `~> 3.0, ~> 3.0.6` to `~> 3.0, >= 3.0.6`
64
+ - **Local dev wiring** — Switched from ad hoc monorepo paths to `nomono` Gemfile macros for sibling gem resolution in `style.gemfile` and related local gemfiles
65
+ - **Template dependency** — Updated from `jsonc-merge` to `json-merge` in `templating_local.gemfile`
66
+ - **Gemspec `homepage_uri`** — Hardcoded to `https://token-resolver.galtzo.com/` (was dynamically constructed with `tr`)
67
+ - **Skip unresolved-token scan for gemspec** — Added `.kettle-jem.yml` config to exclude `token-resolver.gemspec` from the token scan
68
+ - **CI: `codecov/codecov-action`** bumped from v5 to v6
69
+ - **CI: `marocchino/sticky-pull-request-comment`** bumped from v2 to v3
70
+ - **CI: `addressable`** (transitive dependency) bumped from 2.8.8 to 2.8.9
71
+ - **CI: `json`** (bundler group) bumped from 2.18.1 to 2.19.2
72
+ - **Dev container** — Updated `devcontainer.json` and `apt-install` scripts with improved tooling setup
73
+
74
+ ### Removed
75
+
76
+ - **`LICENSE.txt`** — Replaced by `LICENSE.md`, `AGPL-3.0-only.md`, and `PolyForm-Small-Business-1.0.0.md`
77
+ - **Previous license options not included in the new dual-license set** — Removed retired license files such as `Big-Time-Public-License.md`
78
+
79
+ ### Fixed
80
+
81
+ - **Typos** — Minor documentation/comment typo corrections in `BENCHMARK.md` and IDE configuration
82
+
83
+ ### Security
84
+
85
+ - **`bundler-audit` ~> 0.9.3`** — Picked up latest security-advisory database and patch-level fixes
86
+
87
+ ## [1.0.2] - 2026-02-22
88
+
89
+ - TAG: [v1.0.2][1.0.2t]
90
+ - COVERAGE: 98.13% -- 263/268 lines in 10 files
91
+ - BRANCH COVERAGE: 91.18% -- 62/68 branches in 10 files
92
+ - 96.77% documented
93
+
94
+ ### Added
95
+
96
+ - **Benchmarking tools** — Performance comparison suite comparing `token-resolver` against simpler
97
+ alternatives (`String#gsub` and `Kernel#sprintf`):
98
+ - `benchmarks/comparison.rb` — Comprehensive benchmark script measuring iterations per second
99
+ across four realistic scenarios (simple replacement, moderate complexity, high complexity,
100
+ and large documents with sparse tokens)
101
+ - `gemfiles/modular/benchmark/ips.gemfile` — Development dependency for `benchmark-ips` gem
102
+ - Rake tasks: `rake bench:comparison` (run comparison), `rake bench:list` (list benchmarks),
103
+ `rake bench:run` (run all benchmarks), `rake bench` (alias)
104
+ - `BENCHMARK.md` — Results and analysis showing token-resolver is 100-3000x slower due to
105
+ PEG parsing, validation, and AST building; includes guidance on when to use each approach
106
+ and real-world performance context
107
+
33
108
  ## [1.0.1] - 2026-02-22
34
109
 
35
110
  - TAG: [v1.0.1][1.0.1t]
@@ -70,7 +145,11 @@ Please file a bug if you notice a violation of semantic versioning.
70
145
 
71
146
  ### Security
72
147
 
73
- [Unreleased]: https://github.com/kettle-rb/token-resolver/compare/v1.0.1...HEAD
148
+ [Unreleased]: https://github.com/kettle-rb/token-resolver/compare/v2.0.0...HEAD
149
+ [2.0.0]: https://github.com/kettle-rb/token-resolver/compare/v1.0.2...v2.0.0
150
+ [2.0.0t]: https://github.com/kettle-rb/token-resolver/releases/tag/v2.0.0
151
+ [1.0.2]: https://github.com/kettle-rb/token-resolver/compare/v1.0.1...v1.0.2
152
+ [1.0.2t]: https://github.com/kettle-rb/token-resolver/releases/tag/v1.0.2
74
153
  [1.0.1]: https://github.com/kettle-rb/token-resolver/compare/v1.0.0...v1.0.1
75
154
  [1.0.1t]: https://github.com/kettle-rb/token-resolver/releases/tag/v1.0.1
76
155
  [1.0.0]: https://github.com/kettle-rb/ast-merge/compare/e0e299cad6e6914d512845c71df6b7ac8009e5ac...v1.0.0
data/CITATION.cff CHANGED
@@ -1,19 +1,19 @@
1
1
  cff-version: 1.2.0
2
- title: token-resolver
2
+ title: "token-resolver"
3
3
  message: >-
4
4
  If you use this work and you want to cite it,
5
5
  then you can use the metadata from this file.
6
6
  type: software
7
7
  authors:
8
- - given-names: Peter Hurn
9
- family-names: Boling
10
- email: floss@galtzo.com
11
- affiliation: galtzo.com
8
+ - given-names: "Peter H."
9
+ family-names: "Boling"
10
+ email: "floss@galtzo.com"
11
+ affiliation: "galtzo.com"
12
12
  orcid: 'https://orcid.org/0009-0008-8519-441X'
13
13
  identifiers:
14
14
  - type: url
15
15
  value: 'https://github.com/kettle-rb/token-resolver'
16
- description: token-resolver
16
+ description: "token-resolver"
17
17
  repository-code: 'https://github.com/kettle-rb/token-resolver'
18
18
  abstract: >-
19
19
  token-resolver
data/CONTRIBUTING.md CHANGED
@@ -8,19 +8,27 @@ To submit a patch, please fork the project, create a patch with tests, and send
8
8
 
9
9
  Remember to [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] if you make changes.
10
10
 
11
+ ## Developer Certificate of Origin
12
+
13
+ In order to protect users of this project, we require all contributors to comply with the
14
+ [Developer Certificate of Origin](https://developercertificate.org/).
15
+ This ensures that all contributions are properly licensed and attributed.
16
+
11
17
  ## Help out!
12
18
 
13
- Take a look at the `reek` list which is the file called `REEK` and find something to improve.
19
+ Take a look at the open issues and pull requests, or use the gem and find something to improve.
14
20
 
15
21
  Follow these instructions:
16
22
 
17
- 1. Fork the repository
18
- 2. Create a feature branch (`git checkout -b my-new-feature`)
19
- 3. Make some fixes.
20
- 4. Commit changes (`git commit -am 'Added some feature'`)
21
- 5. Push to the branch (`git push origin my-new-feature`)
22
- 6. Make sure to add tests for it. This is important, so it doesn't break in a future release.
23
- 7. Create new Pull Request.
23
+ 1. Join the Discord: [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
24
+ 2. Fork the repository
25
+ 3. Create your feature branch (`git checkout -b my-new-feature`)
26
+ 4. Make some fixes.
27
+ 5. Commit your changes (`git commit -am 'Added some feature'`)
28
+ 6. Push to the branch (`git push origin my-new-feature`)
29
+ 7. Make sure to add tests for it. This is important, so it doesn't break in a future release.
30
+ 8. Create new Pull Request.
31
+ 9. Announce it in the channel for this org in the [Discord][✉️discord-invite]!
24
32
 
25
33
  ## Executables vs Rake tasks
26
34
 
@@ -42,6 +50,22 @@ There are many Rake tasks available as well. You can see them by running:
42
50
  bin/rake -T
43
51
  ```
44
52
 
53
+ ## Code quality checks
54
+
55
+ Run the Reek task when you want a smell check that fails on current findings:
56
+
57
+ ```shell
58
+ bin/rake reek
59
+ ```
60
+
61
+ Refresh the checked-in `REEK` backlog through the rake task, not by redirecting
62
+ the raw `reek` executable output. The rake task uses the project bundle and
63
+ avoids stale generated binstubs shadowing the Reek gem executable:
64
+
65
+ ```shell
66
+ bin/rake reek:update
67
+ ```
68
+
45
69
  ## Environment Variables for Local Development
46
70
 
47
71
  Below are the primary environment variables recognized by stone_checksums (and its integrated tools). Unless otherwise noted, set boolean values to the string "true" to enable.
@@ -52,7 +76,7 @@ General/runtime
52
76
  - CI: When set to true, adjusts default rake tasks toward CI behavior
53
77
 
54
78
  Coverage (kettle-soup-cover / SimpleCov)
55
- - K_SOUP_COV_DO: Enable coverage collection (default: true in .envrc)
79
+ - K_SOUP_COV_DO: Enable coverage collection (default: true in `mise.toml`)
56
80
  - K_SOUP_COV_FORMATTERS: Comma-separated list of formatters (html, xml, rcov, lcov, json, tty)
57
81
  - K_SOUP_COV_MIN_LINE: Minimum line coverage threshold (integer, e.g., 100)
58
82
  - K_SOUP_COV_MIN_BRANCH: Minimum branch coverage threshold (integer, e.g., 100)
@@ -78,11 +102,16 @@ Git hooks and commit message helpers (exe/kettle-commit-msg)
78
102
  - GIT_HOOK_FOOTER_SENTINEL: Required when footer append is enabled — a unique first-line sentinel to prevent duplicates
79
103
  - GIT_HOOK_FOOTER_APPEND_DEBUG: Extra debug output in the footer template (true/false)
80
104
 
81
- For a quick starting point, this repository’s `.envrc` shows sane defaults, and `.env.local` can override them locally.
105
+ For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`.
82
106
 
83
107
  ## Appraisals
84
108
 
85
109
  From time to time the [appraisal2][🚎appraisal2] gemfiles in `gemfiles/` will need to be updated.
110
+ Generated appraisal and CI workflow floors are controlled by `ruby.test_minimum`
111
+ in `.kettle-jem.yml`; this project was templated with `ruby.test_minimum: 3.2.0`.
112
+ That value describes the lowest Ruby version expected to run the test/development
113
+ toolchain, and it may be higher than the gemspec runtime floor.
114
+
86
115
  They are created and updated with the commands:
87
116
 
88
117
  ```console
@@ -97,22 +126,20 @@ bin/rake appraisal:reset
97
126
 
98
127
  When adding an appraisal to CI, check the [runner tool cache][🏃‍♂️runner-tool-cache] to see which runner to use.
99
128
 
100
- ## The Reek List
101
-
102
- Take a look at the `reek` list which is the file called `REEK` and find something to improve.
129
+ ## Run Tests
103
130
 
104
- To refresh the `reek` list:
131
+ Run tests via `kettle-test` (provided by `kettle-test`). It runs RSpec, writes the full log to
132
+ `tmp/kettle-test/rspec-TIMESTAMP.log`, and prints a compact highlight block with timing, seed,
133
+ pass/fail count, failing example list, and SimpleCov coverage percentages.
105
134
 
106
135
  ```console
107
- bundle exec reek > REEK
136
+ bundle exec kettle-test
108
137
  ```
109
138
 
110
- ## Run Tests
111
-
112
- To run all tests
139
+ For targeted runs, disable the hard coverage threshold to avoid false failures:
113
140
 
114
141
  ```console
115
- bundle exec rake test
142
+ K_SOUP_COV_MIN_HARD=false bundle exec kettle-test spec/path/to/spec.rb
116
143
  ```
117
144
 
118
145
  ### Spec organization (required)
@@ -183,33 +210,34 @@ NOTE: To build without signing the gem set `SKIP_GEM_SIGNING` to any value in th
183
210
  1. Run `bin/setup && bin/rake` as a "test, coverage, & linting" sanity check
184
211
  2. Update the version number in `version.rb`, and ensure `CHANGELOG.md` reflects changes
185
212
  3. Run `bin/setup && bin/rake` again as a secondary check, and to update `Gemfile.lock`
186
- 4. Run `git commit -am "🔖 Prepare release v<VERSION>"` to commit the changes
187
- 5. Run `git push` to trigger the final CI pipeline before release, and merge PRs
213
+ 4. Run `bin/rake yard` to regenerate the docs site using the canonical docs task
214
+ 5. Run `git commit -am "🔖 Prepare release v<VERSION>"` to commit the changes
215
+ 6. Run `git push` to trigger the final CI pipeline before release, and merge PRs
188
216
  - NOTE: Remember to [check the build][🧪build].
189
- 6. Run `export GIT_TRUNK_BRANCH_NAME="$(git remote show origin | grep 'HEAD branch' | cut -d ' ' -f5)" && echo $GIT_TRUNK_BRANCH_NAME`
190
- 7. Run `git checkout $GIT_TRUNK_BRANCH_NAME`
191
- 8. Run `git pull origin $GIT_TRUNK_BRANCH_NAME` to ensure latest trunk code
192
- 9. Optional for older Bundler (< 2.7.0): Set `SOURCE_DATE_EPOCH` so `rake build` and `rake release` use the same timestamp and generate the same checksums
217
+ 7. Run `export GIT_TRUNK_BRANCH_NAME="$(git remote show origin | grep 'HEAD branch' | cut -d ' ' -f5)" && echo $GIT_TRUNK_BRANCH_NAME`
218
+ 8. Run `git checkout $GIT_TRUNK_BRANCH_NAME`
219
+ 9. Run `git pull origin $GIT_TRUNK_BRANCH_NAME` to ensure latest trunk code
220
+ 10. Optional for older Bundler (< 2.7.0): Set `SOURCE_DATE_EPOCH` so `rake build` and `rake release` use the same timestamp and generate the same checksums
193
221
  - If your Bundler is >= 2.7.0, you can skip this; builds are reproducible by default.
194
222
  - Run `export SOURCE_DATE_EPOCH=$EPOCHSECONDS && echo $SOURCE_DATE_EPOCH`
195
223
  - If the echo above has no output, then it didn't work.
196
224
  - Note: `zsh/datetime` module is needed, if running `zsh`.
197
225
  - In older versions of `bash` you can use `date +%s` instead, i.e. `export SOURCE_DATE_EPOCH=$(date +%s) && echo $SOURCE_DATE_EPOCH`
198
- 10. Run `bundle exec rake build`
199
- 11. Run `bin/gem_checksums` (more context [1][🔒️rubygems-checksums-pr], [2][🔒️rubygems-guides-pr])
226
+ 11. Run `bundle exec rake build`
227
+ 12. Run `bin/gem_checksums` (more context [1][🔒️rubygems-checksums-pr], [2][🔒️rubygems-guides-pr])
200
228
  to create SHA-256 and SHA-512 checksums. This functionality is provided by the `stone_checksums`
201
229
  [gem][💎stone_checksums].
202
230
  - The script automatically commits but does not push the checksums
203
- 12. Sanity check the SHA256, comparing with the output from the `bin/gem_checksums` command:
231
+ 13. Sanity check the SHA256, comparing with the output from the `bin/gem_checksums` command:
204
232
  - `sha256sum pkg/<gem name>-<version>.gem`
205
- 13. Run `bundle exec rake release` which will create a git tag for the version,
233
+ 14. Run `bundle exec rake release` which will create a git tag for the version,
206
234
  push git commits and tags, and push the `.gem` file to the gem host configured in the gemspec.
207
235
 
208
- [📜src-gl]: https://gitlab.com/kettle-rb/token-resolver/
209
- [📜src-cb]: https://codeberg.org/kettle-rb/token-resolver
210
- [📜src-gh]: https://github.com/kettle-rb/token-resolver
236
+ [📜src-gl]: https://gitlab.com/kettle-rb/token-resolver/-/tree/main/gems/token-resolver
237
+ [📜src-cb]: https://codeberg.org/kettle-rb/token-resolver/src/branch/main/gems/token-resolver
238
+ [📜src-gh]: https://github.com/kettle-rb/token-resolver/tree/main/gems/token-resolver
211
239
  [🧪build]: https://github.com/kettle-rb/token-resolver/actions
212
- [🤝conduct]: https://gitlab.com/kettle-rb/token-resolver/-/blob/main/CODE_OF_CONDUCT.md
240
+ [🤝conduct]: https://github.com/kettle-rb/token-resolver/blob/main/CODE_OF_CONDUCT.md
213
241
  [🖐contrib-rocks]: https://contrib.rocks
214
242
  [🖐contributors]: https://github.com/kettle-rb/token-resolver/graphs/contributors
215
243
  [🚎contributors-gl]: https://gitlab.com/kettle-rb/token-resolver/-/graphs/main
@@ -225,3 +253,4 @@ NOTE: To build without signing the gem set `SKIP_GEM_SIGNING` to any value in th
225
253
  [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
226
254
  [🚎appraisal2]: https://github.com/appraisal-rb/appraisal2
227
255
  [🏃‍♂️runner-tool-cache]: https://github.com/ruby/ruby-builder/releases/tag/toolcache
256
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
data/FUNDING.md CHANGED
@@ -19,7 +19,7 @@ Many paths lead to being a sponsor or a backer of this project. Are you on such
19
19
  [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
20
20
  [🖇polar]: https://polar.sh/pboling
21
21
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
22
- [🖇kofi]: https://ko-fi.com/O5O86SNP4
22
+ [🖇kofi]: https://ko-fi.com/pboling
23
23
  [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
24
24
  [🖇patreon]: https://patreon.com/galtzo
25
25
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
data/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ # License
2
+
3
+ This project is made available under the following licenses.
4
+ Choose the option that best fits your use case:
5
+
6
+ - [AGPL-3.0-only](AGPL-3.0-only.md)
7
+ - [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md)
8
+
9
+ If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
10
+
11
+ ## Copyright Notice
12
+
13
+ Required Notice: Copyright (c) 2026 Peter H. Boling
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
- [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-rb Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-rb-i]][🖼️kettle-rb]
1
+ [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-floss-i]][🖼️galtzo-floss] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-rb Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-rb-i]][🖼️kettle-rb]
2
2
 
3
- [🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
- [🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
3
+ [🖼️galtzo-floss-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
+ [🖼️galtzo-floss]: https://discord.gg/3qme4XHNKN
5
5
  [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
6
6
  [🖼️ruby-lang]: https://www.ruby-lang.org/
7
7
  [🖼️kettle-rb-i]: https://logos.galtzo.com/assets/images/kettle-rb/avatar-192px.svg
@@ -9,9 +9,9 @@
9
9
 
10
10
  # 🪙 Token::Resolver
11
11
 
12
- [![Version][👽versioni]][👽dl-rank] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
12
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL]
13
13
 
14
- `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
14
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-floss], as I may have missed the [discord notification][🖼️galtzo-floss].
15
15
 
16
16
  ---
17
17
 
@@ -20,7 +20,7 @@
20
20
  [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
21
21
 
22
22
  <details>
23
- <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
23
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
24
24
 
25
25
  I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
26
26
 
@@ -43,39 +43,43 @@ result = Token::Resolver.resolve(
43
43
 
44
44
  ## 💡 Info you can shake a stick at
45
45
 
46
- | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
46
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
47
47
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
48
- | Works with JRuby | [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
49
- | Works with Truffle Ruby | ![Truffle Ruby 23.1 Compat][💎truby-23.1i] ![Truffle Ruby 24.2 Compat][💎truby-24.2i] <br/> [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎9-t-wf] [![Truffle Ruby 33.0 Compat][💎truby-c-i]][🚎11-c-wf] |
50
- | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
51
- | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎6-s-wf] |
52
- | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
53
- | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
54
- | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
55
- | Compliance | [![License: MIT][📄license-img]][📄license-ref] [![Compatible with Apache Software Projects: Verified by SkyWalking Eyes][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
56
- | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
57
- | Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
58
- | `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
48
+ | Works with JRuby | [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
49
+ | Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf]|
50
+ | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-4.0i]][🚎11-c-wf] [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
51
+ | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
52
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
53
+ | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
54
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
55
+ | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
56
+ | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
57
+ | Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
58
+ | `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
59
59
 
60
60
  ### Compatibility
61
61
 
62
62
  Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRuby.
63
+ CI workflows and Appraisals are generated for MRI Ruby 3.2.0+.
64
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
65
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
66
+ not practical for the current toolchain.
63
67
 
64
- | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
68
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
65
69
  |------------------------------------------------|--------------------------------------------------------|
66
- | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
70
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
67
71
 
68
72
  ### Federated DVCS
69
73
 
70
74
  <details markdown="1">
71
- <summary>Find this repo on federated forges (Coming soon!)</summary>
75
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
72
76
 
73
- | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
77
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
74
78
  |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
75
- | 🧪 [kettle-rb/token-resolver on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
76
- | 🧊 [kettle-rb/token-resolver on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
77
- | 🐙 [kettle-rb/token-resolver on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
78
- | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
79
+ | 🧪 [kettle-rb/token-resolver on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
80
+ | 🧊 [kettle-rb/token-resolver on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
81
+ | 🐙 [kettle-rb/token-resolver on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
82
+ | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
79
83
 
80
84
  </details>
81
85
 
@@ -86,7 +90,7 @@ Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRu
86
90
  Available as part of the Tidelift Subscription.
87
91
 
88
92
  <details markdown="1">
89
- <summary>Need enterprise-level guarantees?</summary>
93
+ <summary>Need enterprise-level guarantees?</summary>
90
94
 
91
95
  The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
92
96
 
@@ -118,41 +122,6 @@ If bundler is not being used to manage dependencies, install the gem by executin
118
122
  gem install token-resolver
119
123
  ```
120
124
 
121
- ### 🔒 Secure Installation
122
-
123
- <details markdown="1">
124
- <summary>For Medium or High Security Installations</summary>
125
-
126
- This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
127
- [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
128
- by following the instructions below.
129
-
130
- Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
131
-
132
- ```console
133
- gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
134
- ```
135
-
136
- You only need to do that once. Then proceed to install with:
137
-
138
- ```console
139
- gem install token-resolver -P HighSecurity
140
- ```
141
-
142
- The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
143
-
144
- If you want to up your security game full-time:
145
-
146
- ```console
147
- bundle config set --global trust-policy MediumSecurity
148
- ```
149
-
150
- `MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
151
-
152
- NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
153
-
154
- </details>
155
-
156
125
  ## ⚙️ Configuration
157
126
 
158
127
  ### Token Config Options
@@ -268,90 +237,6 @@ result = resolver.resolve(doc, {"KJ|NAME" => "World"})
268
237
  # => "Hello World!"
269
238
  ```
270
239
 
271
- ## Design
272
-
273
- ### Grammar Never Fails
274
-
275
- The parslet grammar is designed so that **any input is valid**. When the parser encounters
276
- `{` but it doesn't start a valid token, the `{` is consumed as plain text. No input can
277
- cause a parse failure.
278
-
279
- ### Single-Pass Resolution
280
-
281
- Replacement values are emitted as-is and are **not** re-scanned for tokens. This prevents
282
- infinite loops and ensures predictable behavior when replacement values contain token-like strings.
283
-
284
- ### Performance
285
-
286
- If the input doesn't contain the `pre` delimiter at all, the parser fast-paths and returns
287
- a single Text node without invoking parslet.
288
-
289
- ### False Positive Prevention
290
-
291
- The grammar constrains segment content to the configured `segment_pattern` (default: word
292
- characters). This ensures that syntax using the same delimiter characters — such as Ruby
293
- block parameters (`{ |x| expr }`) or shell variable expansion (`${VAR:+val}`) — is never
294
- mistakenly parsed as a token. Replacement keys that contain characters outside the
295
- `segment_pattern` are rejected with an `ArgumentError` at resolve time.
296
-
297
-
298
- ## 🦷 FLOSS Funding
299
-
300
- While kettle-rb tools are free software and will always be, the project would benefit immensely from some funding.
301
- Raising a monthly budget of... "dollars" would make the project more sustainable.
302
-
303
- We welcome both individual and corporate sponsors! We also offer a
304
- wide array of funding channels to account for your preferences
305
- (although currently [Open Collective][🖇osc] is our preferred funding platform).
306
-
307
- **If you're working in a company that's making significant use of kettle-rb tools we'd
308
- appreciate it if you suggest to your company to become a kettle-rb sponsor.**
309
-
310
- You can support the development of kettle-rb tools via
311
- [GitHub Sponsors][🖇sponsor],
312
- [Liberapay][⛳liberapay],
313
- [PayPal][🖇paypal],
314
- [Open Collective][🖇osc]
315
- and [Tidelift][🏙️entsup-tidelift].
316
-
317
- | 📍 NOTE |
318
- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
319
- | If doing a sponsorship in the form of donation is problematic for your company <br/> from an accounting standpoint, we'd recommend the use of Tidelift, <br/> where you can get a support-like subscription instead. |
320
-
321
- ### Open Collective for Individuals
322
-
323
- Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/kettle-rb#backer)]
324
-
325
- NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
326
-
327
- <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
328
- No backers yet. Be the first!
329
- <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
330
-
331
- ### Open Collective for Organizations
332
-
333
- Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/kettle-rb#sponsor)]
334
-
335
- NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
336
-
337
- <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
338
- No sponsors yet. Be the first!
339
- <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
340
-
341
- [kettle-readme-backers]: https://github.com/kettle-rb/token-resolver/blob/main/exe/kettle-readme-backers
342
-
343
- ### Another way to support open-source
344
-
345
- I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
346
-
347
- If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
348
-
349
- I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
350
-
351
- **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
352
-
353
- [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
354
-
355
240
  ## 🔐 Security
356
241
 
357
242
  See [SECURITY.md][🔐security].
@@ -359,7 +244,7 @@ See [SECURITY.md][🔐security].
359
244
  ## 🤝 Contributing
360
245
 
361
246
  If you need some ideas of where to help, you could work on adding more code coverage,
362
- or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
247
+ or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
363
248
  or use the gem and think about how it could be better.
364
249
 
365
250
  We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
@@ -372,12 +257,17 @@ See [CONTRIBUTING.md][🤝contributing].
372
257
 
373
258
  ### Code Coverage
374
259
 
260
+ <details markdown="1">
261
+ <summary>Coverage service badges</summary>
262
+
375
263
  [![Coverage Graph][🏀codecov-g]][🏀codecov]
376
264
 
377
265
  [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
378
266
 
379
267
  [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
380
268
 
269
+ </details>
270
+
381
271
  ### 🪇 Code of Conduct
382
272
 
383
273
  Everyone interacting with this project's codebases, issue trackers,
@@ -392,13 +282,13 @@ Made with [contributors-img][🖐contrib-rocks].
392
282
  Also see GitLab Contributors: [https://gitlab.com/kettle-rb/token-resolver/-/graphs/main][🚎contributors-gl]
393
283
 
394
284
  <details>
395
- <summary>⭐️ Star History</summary>
285
+ <summary>⭐️ Star History</summary>
396
286
 
397
- <a href="https://star-history.com/#kettle-rb/token-resolver&Date">
287
+ <a href="https://star-history.com/kettle-rb/token-resolver&Date">
398
288
  <picture>
399
- <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date&theme=dark" />
400
- <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date" />
401
- <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date" />
289
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date&theme=dark" />
290
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date" />
291
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date" />
402
292
  </picture>
403
293
  </a>
404
294
 
@@ -406,31 +296,20 @@ Also see GitLab Contributors: [https://gitlab.com/kettle-rb/token-resolver/-/gra
406
296
 
407
297
  ## 📌 Versioning
408
298
 
409
- This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
410
- Violations of this scheme should be reported as bugs.
411
- Specifically, if a minor or patch version is released that breaks backward compatibility,
412
- a new version should be immediately released that restores compatibility.
413
- Breaking changes to the public API will only be introduced with new major versions.
414
-
415
- > dropping support for a platform is both obviously and objectively a breaking change <br/>
416
- >—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
417
-
418
- I understand that policy doesn't work universally ("exceptions to every rule!"),
419
- but it is the policy here.
420
- As such, in many cases it is good to specify a dependency on this library using
421
- the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
299
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
300
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
422
301
 
423
302
  For example:
424
303
 
425
304
  ```ruby
426
- spec.add_dependency("token-resolver", "~> 1.0")
305
+ spec.add_dependency("token-resolver", "~> 2.0")
427
306
  ```
428
307
 
429
308
  <details markdown="1">
430
309
  <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
431
310
 
432
- SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
433
- is a *breaking change* to an API, and for that reason the bike shedding is endless.
311
+ Dropping support for a platform can be a breaking change for affected users.
312
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
434
313
 
435
314
  To get a better understanding of how SemVer is intended to work over a project's lifetime,
436
315
  read this article from the creator of SemVer:
@@ -443,23 +322,21 @@ See [CHANGELOG.md][📌changelog] for a list of releases.
443
322
 
444
323
  ## 📄 License
445
324
 
446
- The gem is available as open source under the terms of
447
- the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
448
- See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
325
+ The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md).
326
+ See [LICENSE.md][📄license] for details.
327
+
328
+ If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
449
329
 
450
330
  ### © Copyright
451
331
 
452
- <ul>
453
- <li>
454
- Copyright (c) 2026 Peter H. Boling, of
455
- <a href="https://discord.gg/3qme4XHNKN">
456
- Galtzo.com
457
- <picture>
458
- <img src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px-blank.svg" alt="Galtzo.com Logo (Wordless) by Aboling0, CC BY-SA 4.0" width="24">
459
- </picture>
460
- </a>, and token-resolver contributors.
461
- </li>
462
- </ul>
332
+ See [LICENSE.md][📄license] for the official copyright notice.
333
+
334
+ <details markdown="1">
335
+ <summary>Copyright holders</summary>
336
+
337
+ - Required Notice: Copyright (c) 2026 Peter H. Boling
338
+
339
+ </details>
463
340
 
464
341
  ## 🤑 A request for help
465
342
 
@@ -502,7 +379,7 @@ Thanks for RTFM. ☺️
502
379
  [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
503
380
  [🖇polar]: https://polar.sh/pboling
504
381
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
505
- [🖇kofi]: https://ko-fi.com/O5O86SNP4
382
+ [🖇kofi]: https://ko-fi.com/pboling
506
383
  [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
507
384
  [🖇patreon]: https://patreon.com/galtzo
508
385
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
@@ -519,18 +396,18 @@ Thanks for RTFM. ☺️
519
396
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
520
397
 
521
398
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
522
- [⛳️gem-namespace]: https://github.com/kettle-rb/token-resolver
399
+ [⛳️gem-namespace]: https://github.com/kettle-rb/token-resolver/tree/main/gems/token-resolver
523
400
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-Token::Resolver-3C2D2D.svg?style=square&logo=ruby&logoColor=white
524
401
  [⛳️gem-name]: https://bestgems.org/gems/token-resolver
525
402
  [⛳️name-img]: https://img.shields.io/badge/name-token--resolver-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
526
403
  [⛳️tag-img]: https://img.shields.io/github/tag/kettle-rb/token-resolver.svg
527
- [⛳️tag]: http://github.com/kettle-rb/token-resolver/releases
404
+ [⛳️tag]: https://github.com/kettle-rb/token-resolver/releases
528
405
  [🚂maint-blog]: http://www.railsbling.com/tags/token-resolver
529
406
  [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
530
407
  [🚂maint-contact]: http://www.railsbling.com/contact
531
408
  [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
532
409
  [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
533
- [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
410
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
534
411
  [💖✌️wellfound]: https://wellfound.com/u/peter-boling
535
412
  [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
536
413
  [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
@@ -559,21 +436,19 @@ Thanks for RTFM. ☺️
559
436
  [💁🏼‍♂️peterboling]: http://www.peterboling.com
560
437
  [🚂railsbling]: http://www.railsbling.com
561
438
  [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
562
- [📜src-gl]: https://gitlab.com/kettle-rb/token-resolver/
439
+ [📜src-gl]: https://gitlab.com/kettle-rb/token-resolver/-/tree/main/gems/token-resolver
563
440
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
564
- [📜src-cb]: https://codeberg.org/kettle-rb/token-resolver
441
+ [📜src-cb]: https://codeberg.org/kettle-rb/token-resolver/src/branch/main/gems/token-resolver
565
442
  [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
566
- [📜src-gh]: https://github.com/kettle-rb/token-resolver
443
+ [📜src-gh]: https://github.com/kettle-rb/token-resolver/tree/main/gems/token-resolver
567
444
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
568
445
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
569
446
  [📜gl-wiki]: https://gitlab.com/kettle-rb/token-resolver/-/wikis/home
570
447
  [📜gh-wiki]: https://github.com/kettle-rb/token-resolver/wiki
571
- [📜gl-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
572
- [📜gh-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
448
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
449
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
573
450
  [👽dl-rank]: https://bestgems.org/gems/token-resolver
574
451
  [👽dl-ranki]: https://img.shields.io/gem/rd/token-resolver.svg
575
- [👽oss-help]: https://www.codetriage.com/kettle-rb/token-resolver
576
- [👽oss-helpi]: https://www.codetriage.com/kettle-rb/token-resolver/badges/users.svg
577
452
  [👽version]: https://bestgems.org/gems/token-resolver
578
453
  [👽versioni]: https://img.shields.io/gem/v/token-resolver.svg
579
454
  [🏀qlty-mnt]: https://qlty.sh/gh/kettle-rb/projects/token-resolver
@@ -586,22 +461,17 @@ Thanks for RTFM. ☺️
586
461
  [🏀coveralls-img]: https://coveralls.io/repos/github/kettle-rb/token-resolver/badge.svg?branch=main
587
462
  [🖐codeQL]: https://github.com/kettle-rb/token-resolver/security/code-scanning
588
463
  [🖐codeQL-img]: https://github.com/kettle-rb/token-resolver/actions/workflows/codeql-analysis.yml/badge.svg
589
- [🚎1-an-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/ancient.yml
590
- [🚎1-an-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/ancient.yml/badge.svg
464
+ [🚎ruby-3.2-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/ruby-3.2.yml
465
+ [🚎ruby-3.3-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/ruby-3.3.yml
466
+ [🚎ruby-3.4-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/ruby-3.4.yml
467
+ [🚎truby-24.2-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/truffleruby-24.2.yml
468
+ [🚎truby-25.0-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/truffleruby-25.0.yml
591
469
  [🚎2-cov-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/coverage.yml
592
470
  [🚎2-cov-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/coverage.yml/badge.svg
593
471
  [🚎3-hd-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/heads.yml
594
472
  [🚎3-hd-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/heads.yml/badge.svg
595
- [🚎4-lg-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/legacy.yml
596
- [🚎4-lg-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/legacy.yml/badge.svg
597
473
  [🚎5-st-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/style.yml
598
474
  [🚎5-st-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/style.yml/badge.svg
599
- [🚎6-s-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/supported.yml
600
- [🚎6-s-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/supported.yml/badge.svg
601
- [🚎7-us-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/unsupported.yml
602
- [🚎7-us-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/unsupported.yml/badge.svg
603
- [🚎8-ho-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/hoary.yml
604
- [🚎8-ho-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/hoary.yml/badge.svg
605
475
  [🚎9-t-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/truffle.yml
606
476
  [🚎9-t-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/truffle.yml/badge.svg
607
477
  [🚎10-j-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/jruby.yml
@@ -614,18 +484,15 @@ Thanks for RTFM. ☺️
614
484
  [🚎13-🔒️-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/locked_deps.yml/badge.svg
615
485
  [🚎14-🔓️-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/unlocked_deps.yml
616
486
  [🚎14-🔓️-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/unlocked_deps.yml/badge.svg
617
- [🚎15-🪪-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/license-eye.yml
618
- [🚎15-🪪-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/license-eye.yml/badge.svg
619
487
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
620
488
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
621
489
  [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
490
+ [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
622
491
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
623
492
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
624
- [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
625
- [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
493
+ [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
626
494
  [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
627
495
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
628
- [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
629
496
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
630
497
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
631
498
  [🤝gh-issues]: https://github.com/kettle-rb/token-resolver/issues
@@ -635,34 +502,35 @@ Thanks for RTFM. ☺️
635
502
  [🤝cb-issues]: https://codeberg.org/kettle-rb/token-resolver/issues
636
503
  [🤝cb-pulls]: https://codeberg.org/kettle-rb/token-resolver/pulls
637
504
  [🤝cb-donate]: https://donate.codeberg.org/
638
- [🤝contributing]: CONTRIBUTING.md
639
- [🏀codecov-g]: https://codecov.io/gh/kettle-rb/token-resolver/graphs/tree.svg
505
+ [🤝contributing]: https://github.com/kettle-rb/token-resolver/blob/main/CONTRIBUTING.md
506
+ [🏀codecov-g]: https://codecov.io/gh/kettle-rb/token-resolver/graph/badge.svg
640
507
  [🖐contrib-rocks]: https://contrib.rocks
641
508
  [🖐contributors]: https://github.com/kettle-rb/token-resolver/graphs/contributors
642
509
  [🖐contributors-img]: https://contrib.rocks/image?repo=kettle-rb/token-resolver
643
510
  [🚎contributors-gl]: https://gitlab.com/kettle-rb/token-resolver/-/graphs/main
644
- [🪇conduct]: CODE_OF_CONDUCT.md
511
+ [🪇conduct]: https://github.com/kettle-rb/token-resolver/blob/main/CODE_OF_CONDUCT.md
645
512
  [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
646
513
  [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
647
514
  [📌semver]: https://semver.org/spec/v2.0.0.html
648
515
  [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
649
516
  [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
650
517
  [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
651
- [📌changelog]: CHANGELOG.md
518
+ [📌changelog]: https://github.com/kettle-rb/token-resolver/blob/main/CHANGELOG.md
652
519
  [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
653
520
  [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
654
521
  [📌gitmoji]: https://gitmoji.dev
655
522
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
656
523
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
657
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.268-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
658
- [🔐security]: SECURITY.md
524
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.265-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
525
+ [🔐security]: https://github.com/kettle-rb/token-resolver/blob/main/SECURITY.md
659
526
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
660
527
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
661
- [📄license]: LICENSE.txt
662
- [📄license-ref]: https://opensource.org/licenses/MIT
663
- [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
664
- [📄license-compat]: https://dev.to/galtzo/how-to-check-license-compatibility-41h0
665
- [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
528
+ [📄license]: LICENSE.md
529
+ [📄license-ref]: LICENSE.md
530
+ [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only_OR_PolyForm--Small--Business--1.0.0-259D6C.svg
531
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
532
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-✗-C0392B.svg?style=flat&logo=Apache
533
+
666
534
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
667
535
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
668
536
  [🚎yard-current]: http://rubydoc.info/gems/token-resolver
@@ -674,3 +542,14 @@ Thanks for RTFM. ☺️
674
542
  [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
675
543
  [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
676
544
  [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
545
+
546
+ <!-- kettle-jem:metadata:start -->
547
+ | Field | Value |
548
+ |---|---|
549
+ | Package | token-resolver |
550
+ | Description | 🪙 Token::Resolver provides configurable PEG-based (parslet) parsing and resolution of structured tokens (e.g., {KJ\|GEM_NAME}) in arbitrary text. Useful for template ETL pipelines where tokens in template files must be resolved before format-specific merging. |
551
+ | Homepage | https://github.com/kettle-rb/token-resolver |
552
+ | Source | https://github.com/kettle-rb/token-resolver/tree/v2.0.0 |
553
+ | License | `AGPL-3.0-only` OR `PolyForm-Small-Business-1.0.0` |
554
+ | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/kettle-rb, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/token-resolver, https://www.buymeacoffee.com/pboling |
555
+ <!-- kettle-jem:metadata:end -->
data/certs/pboling.pem ADDED
@@ -0,0 +1,27 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
3
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
4
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
5
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
6
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
7
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
8
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
9
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
10
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
11
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
12
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
13
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
14
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
15
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
16
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
17
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
18
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
19
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
20
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
21
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
22
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
23
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
24
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
25
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
26
+ L9nRqA==
27
+ -----END CERTIFICATE-----
@@ -82,6 +82,7 @@ module Token
82
82
  private
83
83
 
84
84
  def handle_missing(token_node, result)
85
+ # :nocov:
85
86
  case @on_missing
86
87
  when :raise
87
88
  raise UnresolvedTokenError.new(token_node.key)
@@ -90,6 +91,7 @@ module Token
90
91
  when :remove
91
92
  # emit nothing
92
93
  end
94
+ # :nocov:
93
95
  end
94
96
 
95
97
  # Validate that all replacement keys only contain characters allowed by the config.
@@ -2,11 +2,9 @@
2
2
 
3
3
  module Token
4
4
  module Resolver
5
- # Version information for Token::Resolver
6
5
  module Version
7
- # Current version of the token-resolver gem
8
- VERSION = "1.0.1"
6
+ VERSION = "2.0.0"
9
7
  end
10
- VERSION = Version::VERSION # traditional location
8
+ VERSION = Version::VERSION # Traditional Constant Location
11
9
  end
12
10
  end
@@ -0,0 +1,8 @@
1
+ module Token
2
+ module Resolver
3
+ module Version
4
+ VERSION: String
5
+ end
6
+ VERSION: String
7
+ end
8
+ end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: token-resolver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -77,28 +77,34 @@ dependencies:
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '1.2'
80
+ version: '2.0'
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 2.0.4
81
84
  type: :development
82
85
  prerelease: false
83
86
  version_requirements: !ruby/object:Gem::Requirement
84
87
  requirements:
85
88
  - - "~>"
86
89
  - !ruby/object:Gem::Version
87
- version: '1.2'
90
+ version: '2.0'
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: 2.0.4
88
94
  - !ruby/object:Gem::Dependency
89
95
  name: bundler-audit
90
96
  requirement: !ruby/object:Gem::Requirement
91
97
  requirements:
92
98
  - - "~>"
93
99
  - !ruby/object:Gem::Version
94
- version: 0.9.2
100
+ version: 0.9.3
95
101
  type: :development
96
102
  prerelease: false
97
103
  version_requirements: !ruby/object:Gem::Requirement
98
104
  requirements:
99
105
  - - "~>"
100
106
  - !ruby/object:Gem::Version
101
- version: 0.9.2
107
+ version: 0.9.3
102
108
  - !ruby/object:Gem::Dependency
103
109
  name: rake
104
110
  requirement: !ruby/object:Gem::Requirement
@@ -140,7 +146,7 @@ dependencies:
140
146
  - - "~>"
141
147
  - !ruby/object:Gem::Version
142
148
  version: '3.0'
143
- - - "~>"
149
+ - - ">="
144
150
  - !ruby/object:Gem::Version
145
151
  version: 3.0.6
146
152
  type: :development
@@ -150,7 +156,7 @@ dependencies:
150
156
  - - "~>"
151
157
  - !ruby/object:Gem::Version
152
158
  version: '3.0'
153
- - - "~>"
159
+ - - ">="
154
160
  - !ruby/object:Gem::Version
155
161
  version: 3.0.6
156
162
  - !ruby/object:Gem::Dependency
@@ -159,20 +165,20 @@ dependencies:
159
165
  requirements:
160
166
  - - "~>"
161
167
  - !ruby/object:Gem::Version
162
- version: '1.0'
168
+ version: '2.0'
163
169
  - - ">="
164
170
  - !ruby/object:Gem::Version
165
- version: 1.0.10
171
+ version: 2.0.1
166
172
  type: :development
167
173
  prerelease: false
168
174
  version_requirements: !ruby/object:Gem::Requirement
169
175
  requirements:
170
176
  - - "~>"
171
177
  - !ruby/object:Gem::Version
172
- version: '1.0'
178
+ version: '2.0'
173
179
  - - ">="
174
180
  - !ruby/object:Gem::Version
175
- version: 1.0.10
181
+ version: 2.0.1
176
182
  - !ruby/object:Gem::Dependency
177
183
  name: ruby-progressbar
178
184
  requirement: !ruby/object:Gem::Requirement
@@ -213,20 +219,20 @@ dependencies:
213
219
  requirements:
214
220
  - - "~>"
215
221
  - !ruby/object:Gem::Version
216
- version: '1.0'
222
+ version: '2.0'
217
223
  - - ">="
218
224
  - !ruby/object:Gem::Version
219
- version: 1.0.3
225
+ version: 2.0.0
220
226
  type: :development
221
227
  prerelease: false
222
228
  version_requirements: !ruby/object:Gem::Requirement
223
229
  requirements:
224
230
  - - "~>"
225
231
  - !ruby/object:Gem::Version
226
- version: '1.0'
232
+ version: '2.0'
227
233
  - - ">="
228
234
  - !ruby/object:Gem::Version
229
- version: 1.0.3
235
+ version: 2.0.0
230
236
  description: "\U0001FA99 Token::Resolver provides configurable PEG-based (parslet)
231
237
  parsing and resolution of structured tokens (e.g., {KJ|GEM_NAME}) in arbitrary text.
232
238
  Useful for template ETL pipelines where tokens in template files must be resolved
@@ -241,9 +247,8 @@ extra_rdoc_files:
241
247
  - CODE_OF_CONDUCT.md
242
248
  - CONTRIBUTING.md
243
249
  - FUNDING.md
244
- - LICENSE.txt
250
+ - LICENSE.md
245
251
  - README.md
246
- - REEK
247
252
  - RUBOCOP.md
248
253
  - SECURITY.md
249
254
  files:
@@ -252,11 +257,11 @@ files:
252
257
  - CODE_OF_CONDUCT.md
253
258
  - CONTRIBUTING.md
254
259
  - FUNDING.md
255
- - LICENSE.txt
260
+ - LICENSE.md
256
261
  - README.md
257
- - REEK
258
262
  - RUBOCOP.md
259
263
  - SECURITY.md
264
+ - certs/pboling.pem
260
265
  - lib/token-resolver.rb
261
266
  - lib/token/resolver.rb
262
267
  - lib/token/resolver/config.rb
@@ -269,15 +274,17 @@ files:
269
274
  - lib/token/resolver/transform.rb
270
275
  - lib/token/resolver/version.rb
271
276
  - sig/token/resolver.rbs
277
+ - sig/token/resolver/version.rbs
272
278
  homepage: https://github.com/kettle-rb/token-resolver
273
279
  licenses:
274
- - MIT
280
+ - AGPL-3.0-only
281
+ - PolyForm-Small-Business-1.0.0
275
282
  metadata:
276
283
  homepage_uri: https://token-resolver.galtzo.com/
277
- source_code_uri: https://github.com/kettle-rb/token-resolver/tree/v1.0.1
278
- changelog_uri: https://github.com/kettle-rb/token-resolver/blob/v1.0.1/CHANGELOG.md
284
+ source_code_uri: https://github.com/kettle-rb/token-resolver/tree/v2.0.0
285
+ changelog_uri: https://github.com/kettle-rb/token-resolver/blob/v2.0.0/CHANGELOG.md
279
286
  bug_tracker_uri: https://github.com/kettle-rb/token-resolver/issues
280
- documentation_uri: https://www.rubydoc.info/gems/token-resolver/1.0.1
287
+ documentation_uri: https://www.rubydoc.info/gems/token-resolver/2.0.0
281
288
  funding_uri: https://github.com/sponsors/pboling
282
289
  wiki_uri: https://github.com/kettle-rb/token-resolver/wiki
283
290
  news_uri: https://www.railsbling.com/tags/token-resolver
@@ -307,7 +314,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
307
314
  - !ruby/object:Gem::Version
308
315
  version: '0'
309
316
  requirements: []
310
- rubygems_version: 4.0.5
317
+ rubygems_version: 4.0.10
311
318
  specification_version: 4
312
319
  summary: "\U0001FA99 Configurable PEG-based token parser and resolver for structured
313
320
  token detection and replacement in arbitrary text"
metadata.gz.sig CHANGED
Binary file
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2026 Peter H. Boling
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
data/REEK DELETED
File without changes