token-resolver 1.0.2 → 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: 6b23a9edef4ee26b3306a11c3829662efdfd3d813f325125fea41a12ab52a4d8
4
- data.tar.gz: 69f56a454fb92a428d07c19357f7f30f6c343c9538ad7931797bb0c40263d61c
3
+ metadata.gz: 2614ef5d4abd4335b18fcfb4a75a7f5fff7e9285ad7690659e3028997b69e765
4
+ data.tar.gz: 477a74ae8456d26cd15648bb1e521786e047f906875050960f8b1376a99d2c12
5
5
  SHA512:
6
- metadata.gz: 2eb601757412886989daabc322e8128c24c0afc8cbad62195a6d987fe11e6ff6c9b0946831d2b570b589991f0070ecbca60a47787343b9b1c973b07c23f4baec
7
- data.tar.gz: 62b7ec4552e63c67d80ca72e67931b87091a71311adb4e6c3fcc560fc6efff888606970fe24bacbcf201ab5b58c73f58fba497cfa25963060348df8b01271770
6
+ metadata.gz: d7322c8f2d6ca25f538bc54f9450daf3edae06a07aee627909d1a01b431ba0d6a39f76234d1a9737807adf0c822055ce67ef36ff7166b615791b88b0a0fad7db
7
+ data.tar.gz: 393e05d3ab64f07d559bb0e2d4bbdfcd2bac219e05b04d7bdfc96d3cf72dd79403008cc062e69c68a6ccf6e5c5b8e2a053b7d9cc991d4bc2531a658848e2d487
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,60 @@ 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
+
33
87
  ## [1.0.2] - 2026-02-22
34
88
 
35
89
  - TAG: [v1.0.2][1.0.2t]
@@ -91,7 +145,9 @@ Please file a bug if you notice a violation of semantic versioning.
91
145
 
92
146
  ### Security
93
147
 
94
- [Unreleased]: https://github.com/kettle-rb/token-resolver/compare/v1.0.2...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
95
151
  [1.0.2]: https://github.com/kettle-rb/token-resolver/compare/v1.0.1...v1.0.2
96
152
  [1.0.2t]: https://github.com/kettle-rb/token-resolver/releases/tag/v1.0.2
97
153
  [1.0.1]: https://github.com/kettle-rb/token-resolver/compare/v1.0.0...v1.0.1
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,117 +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
- #### 📊 Benchmarks
290
-
291
- Token-resolver prioritizes **flexibility, configurability, and maintainability** over raw speed.
292
-
293
- **⚠️ Important**: Token-resolver is **100-3000x slower** than simple alternatives like `String#gsub` and `Kernel#sprintf`.
294
- because it does significantly more work:
295
- - Full PEG parsing of the input string
296
- - Token validation and structure enforcement
297
- - Building an AST for introspection
298
- - Flexible error handling for missing tokens
299
-
300
- This performance difference is **expected and acceptable** because these are fundamentally different
301
- approaches solving different problems.
302
-
303
- See [BENCHMARK.md](BENCHMARK.md) for detailed performance comparisons and guidance on:
304
-
305
- - **When to use token-resolver**: Configurable token structures, validation, introspection, flexible error handling
306
- - **When to use String#gsub**: Fixed token patterns, maximum performance, simple one-shot replacements
307
- - **When to use Kernel#sprintf**: Positional formatting, fixed templates, printf-style output
308
-
309
- The choice should be based on your actual requirements, not just raw performance metrics.
310
-
311
- To run benchmarks on your system:
312
-
313
- ```bash
314
- bundle exec rake bench:comparison
315
- ```
316
-
317
- ### False Positive Prevention
318
-
319
- The grammar constrains segment content to the configured `segment_pattern` (default: word
320
- characters). This ensures that syntax using the same delimiter characters — such as Ruby
321
- block parameters (`{ |x| expr }`) or shell variable expansion (`${VAR:+val}`) — is never
322
- mistakenly parsed as a token. Replacement keys that contain characters outside the
323
- `segment_pattern` are rejected with an `ArgumentError` at resolve time.
324
-
325
- ## 🦷 FLOSS Funding
326
-
327
- While kettle-rb tools are free software and will always be, the project would benefit immensely from some funding.
328
- Raising a monthly budget of... "dollars" would make the project more sustainable.
329
-
330
- We welcome both individual and corporate sponsors! We also offer a
331
- wide array of funding channels to account for your preferences
332
- (although currently [Open Collective][🖇osc] is our preferred funding platform).
333
-
334
- **If you're working in a company that's making significant use of kettle-rb tools we'd
335
- appreciate it if you suggest to your company to become a kettle-rb sponsor.**
336
-
337
- You can support the development of kettle-rb tools via
338
- [GitHub Sponsors][🖇sponsor],
339
- [Liberapay][⛳liberapay],
340
- [PayPal][🖇paypal],
341
- [Open Collective][🖇osc]
342
- and [Tidelift][🏙️entsup-tidelift].
343
-
344
- | 📍 NOTE |
345
- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
346
- | 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. |
347
-
348
- ### Open Collective for Individuals
349
-
350
- Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/kettle-rb#backer)]
351
-
352
- NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
353
-
354
- <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
355
- No backers yet. Be the first!
356
- <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
357
-
358
- ### Open Collective for Organizations
359
-
360
- 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)]
361
-
362
- NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
363
-
364
- <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
365
- No sponsors yet. Be the first!
366
- <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
367
-
368
- [kettle-readme-backers]: https://github.com/kettle-rb/token-resolver/blob/main/exe/kettle-readme-backers
369
-
370
- ### Another way to support open-source
371
-
372
- 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).
373
-
374
- 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`.
375
-
376
- 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.
377
-
378
- **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
379
-
380
- [![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]
381
-
382
240
  ## 🔐 Security
383
241
 
384
242
  See [SECURITY.md][🔐security].
@@ -386,7 +244,7 @@ See [SECURITY.md][🔐security].
386
244
  ## 🤝 Contributing
387
245
 
388
246
  If you need some ideas of where to help, you could work on adding more code coverage,
389
- 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],
390
248
  or use the gem and think about how it could be better.
391
249
 
392
250
  We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
@@ -399,12 +257,17 @@ See [CONTRIBUTING.md][🤝contributing].
399
257
 
400
258
  ### Code Coverage
401
259
 
260
+ <details markdown="1">
261
+ <summary>Coverage service badges</summary>
262
+
402
263
  [![Coverage Graph][🏀codecov-g]][🏀codecov]
403
264
 
404
265
  [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
405
266
 
406
267
  [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
407
268
 
269
+ </details>
270
+
408
271
  ### 🪇 Code of Conduct
409
272
 
410
273
  Everyone interacting with this project's codebases, issue trackers,
@@ -419,13 +282,13 @@ Made with [contributors-img][🖐contrib-rocks].
419
282
  Also see GitLab Contributors: [https://gitlab.com/kettle-rb/token-resolver/-/graphs/main][🚎contributors-gl]
420
283
 
421
284
  <details>
422
- <summary>⭐️ Star History</summary>
285
+ <summary>⭐️ Star History</summary>
423
286
 
424
- <a href="https://star-history.com/#kettle-rb/token-resolver&Date">
287
+ <a href="https://star-history.com/kettle-rb/token-resolver&Date">
425
288
  <picture>
426
- <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date&theme=dark" />
427
- <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kettle-rb/token-resolver&type=Date" />
428
- <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" />
429
292
  </picture>
430
293
  </a>
431
294
 
@@ -433,31 +296,20 @@ Also see GitLab Contributors: [https://gitlab.com/kettle-rb/token-resolver/-/gra
433
296
 
434
297
  ## 📌 Versioning
435
298
 
436
- This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
437
- Violations of this scheme should be reported as bugs.
438
- Specifically, if a minor or patch version is released that breaks backward compatibility,
439
- a new version should be immediately released that restores compatibility.
440
- Breaking changes to the public API will only be introduced with new major versions.
441
-
442
- > dropping support for a platform is both obviously and objectively a breaking change <br/>
443
- >—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
444
-
445
- I understand that policy doesn't work universally ("exceptions to every rule!"),
446
- but it is the policy here.
447
- As such, in many cases it is good to specify a dependency on this library using
448
- 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.
449
301
 
450
302
  For example:
451
303
 
452
304
  ```ruby
453
- spec.add_dependency("token-resolver", "~> 1.0")
305
+ spec.add_dependency("token-resolver", "~> 2.0")
454
306
  ```
455
307
 
456
308
  <details markdown="1">
457
309
  <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
458
310
 
459
- SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
460
- 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.
461
313
 
462
314
  To get a better understanding of how SemVer is intended to work over a project's lifetime,
463
315
  read this article from the creator of SemVer:
@@ -470,23 +322,21 @@ See [CHANGELOG.md][📌changelog] for a list of releases.
470
322
 
471
323
  ## 📄 License
472
324
 
473
- The gem is available as open source under the terms of
474
- the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
475
- 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.
476
329
 
477
330
  ### © Copyright
478
331
 
479
- <ul>
480
- <li>
481
- Copyright (c) 2026 Peter H. Boling, of
482
- <a href="https://discord.gg/3qme4XHNKN">
483
- Galtzo.com
484
- <picture>
485
- <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">
486
- </picture>
487
- </a>, and token-resolver contributors.
488
- </li>
489
- </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>
490
340
 
491
341
  ## 🤑 A request for help
492
342
 
@@ -529,7 +379,7 @@ Thanks for RTFM. ☺️
529
379
  [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
530
380
  [🖇polar]: https://polar.sh/pboling
531
381
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
532
- [🖇kofi]: https://ko-fi.com/O5O86SNP4
382
+ [🖇kofi]: https://ko-fi.com/pboling
533
383
  [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
534
384
  [🖇patreon]: https://patreon.com/galtzo
535
385
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
@@ -546,18 +396,18 @@ Thanks for RTFM. ☺️
546
396
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
547
397
 
548
398
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
549
- [⛳️gem-namespace]: https://github.com/kettle-rb/token-resolver
399
+ [⛳️gem-namespace]: https://github.com/kettle-rb/token-resolver/tree/main/gems/token-resolver
550
400
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-Token::Resolver-3C2D2D.svg?style=square&logo=ruby&logoColor=white
551
401
  [⛳️gem-name]: https://bestgems.org/gems/token-resolver
552
402
  [⛳️name-img]: https://img.shields.io/badge/name-token--resolver-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
553
403
  [⛳️tag-img]: https://img.shields.io/github/tag/kettle-rb/token-resolver.svg
554
- [⛳️tag]: http://github.com/kettle-rb/token-resolver/releases
404
+ [⛳️tag]: https://github.com/kettle-rb/token-resolver/releases
555
405
  [🚂maint-blog]: http://www.railsbling.com/tags/token-resolver
556
406
  [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
557
407
  [🚂maint-contact]: http://www.railsbling.com/contact
558
408
  [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
559
409
  [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
560
- [💖🖇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
561
411
  [💖✌️wellfound]: https://wellfound.com/u/peter-boling
562
412
  [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
563
413
  [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
@@ -586,21 +436,19 @@ Thanks for RTFM. ☺️
586
436
  [💁🏼‍♂️peterboling]: http://www.peterboling.com
587
437
  [🚂railsbling]: http://www.railsbling.com
588
438
  [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
589
- [📜src-gl]: https://gitlab.com/kettle-rb/token-resolver/
439
+ [📜src-gl]: https://gitlab.com/kettle-rb/token-resolver/-/tree/main/gems/token-resolver
590
440
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
591
- [📜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
592
442
  [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
593
- [📜src-gh]: https://github.com/kettle-rb/token-resolver
443
+ [📜src-gh]: https://github.com/kettle-rb/token-resolver/tree/main/gems/token-resolver
594
444
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
595
445
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
596
446
  [📜gl-wiki]: https://gitlab.com/kettle-rb/token-resolver/-/wikis/home
597
447
  [📜gh-wiki]: https://github.com/kettle-rb/token-resolver/wiki
598
- [📜gl-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
599
- [📜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
600
450
  [👽dl-rank]: https://bestgems.org/gems/token-resolver
601
451
  [👽dl-ranki]: https://img.shields.io/gem/rd/token-resolver.svg
602
- [👽oss-help]: https://www.codetriage.com/kettle-rb/token-resolver
603
- [👽oss-helpi]: https://www.codetriage.com/kettle-rb/token-resolver/badges/users.svg
604
452
  [👽version]: https://bestgems.org/gems/token-resolver
605
453
  [👽versioni]: https://img.shields.io/gem/v/token-resolver.svg
606
454
  [🏀qlty-mnt]: https://qlty.sh/gh/kettle-rb/projects/token-resolver
@@ -613,22 +461,17 @@ Thanks for RTFM. ☺️
613
461
  [🏀coveralls-img]: https://coveralls.io/repos/github/kettle-rb/token-resolver/badge.svg?branch=main
614
462
  [🖐codeQL]: https://github.com/kettle-rb/token-resolver/security/code-scanning
615
463
  [🖐codeQL-img]: https://github.com/kettle-rb/token-resolver/actions/workflows/codeql-analysis.yml/badge.svg
616
- [🚎1-an-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/ancient.yml
617
- [🚎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
618
469
  [🚎2-cov-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/coverage.yml
619
470
  [🚎2-cov-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/coverage.yml/badge.svg
620
471
  [🚎3-hd-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/heads.yml
621
472
  [🚎3-hd-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/heads.yml/badge.svg
622
- [🚎4-lg-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/legacy.yml
623
- [🚎4-lg-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/legacy.yml/badge.svg
624
473
  [🚎5-st-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/style.yml
625
474
  [🚎5-st-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/style.yml/badge.svg
626
- [🚎6-s-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/supported.yml
627
- [🚎6-s-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/supported.yml/badge.svg
628
- [🚎7-us-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/unsupported.yml
629
- [🚎7-us-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/unsupported.yml/badge.svg
630
- [🚎8-ho-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/hoary.yml
631
- [🚎8-ho-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/hoary.yml/badge.svg
632
475
  [🚎9-t-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/truffle.yml
633
476
  [🚎9-t-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/truffle.yml/badge.svg
634
477
  [🚎10-j-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/jruby.yml
@@ -641,18 +484,15 @@ Thanks for RTFM. ☺️
641
484
  [🚎13-🔒️-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/locked_deps.yml/badge.svg
642
485
  [🚎14-🔓️-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/unlocked_deps.yml
643
486
  [🚎14-🔓️-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/unlocked_deps.yml/badge.svg
644
- [🚎15-🪪-wf]: https://github.com/kettle-rb/token-resolver/actions/workflows/license-eye.yml
645
- [🚎15-🪪-wfi]: https://github.com/kettle-rb/token-resolver/actions/workflows/license-eye.yml/badge.svg
646
487
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
647
488
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
648
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
649
491
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
650
492
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
651
- [💎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
652
- [💎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
653
494
  [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
654
495
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
655
- [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
656
496
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
657
497
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
658
498
  [🤝gh-issues]: https://github.com/kettle-rb/token-resolver/issues
@@ -662,34 +502,35 @@ Thanks for RTFM. ☺️
662
502
  [🤝cb-issues]: https://codeberg.org/kettle-rb/token-resolver/issues
663
503
  [🤝cb-pulls]: https://codeberg.org/kettle-rb/token-resolver/pulls
664
504
  [🤝cb-donate]: https://donate.codeberg.org/
665
- [🤝contributing]: CONTRIBUTING.md
666
- [🏀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
667
507
  [🖐contrib-rocks]: https://contrib.rocks
668
508
  [🖐contributors]: https://github.com/kettle-rb/token-resolver/graphs/contributors
669
509
  [🖐contributors-img]: https://contrib.rocks/image?repo=kettle-rb/token-resolver
670
510
  [🚎contributors-gl]: https://gitlab.com/kettle-rb/token-resolver/-/graphs/main
671
- [🪇conduct]: CODE_OF_CONDUCT.md
511
+ [🪇conduct]: https://github.com/kettle-rb/token-resolver/blob/main/CODE_OF_CONDUCT.md
672
512
  [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
673
513
  [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
674
514
  [📌semver]: https://semver.org/spec/v2.0.0.html
675
515
  [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
676
516
  [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
677
517
  [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
678
- [📌changelog]: CHANGELOG.md
518
+ [📌changelog]: https://github.com/kettle-rb/token-resolver/blob/main/CHANGELOG.md
679
519
  [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
680
520
  [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
681
521
  [📌gitmoji]: https://gitmoji.dev
682
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
683
523
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
684
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.268-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
685
- [🔐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
686
526
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
687
527
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
688
- [📄license]: LICENSE.txt
689
- [📄license-ref]: https://opensource.org/licenses/MIT
690
- [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
691
- [📄license-compat]: https://dev.to/galtzo/how-to-check-license-compatibility-41h0
692
- [📄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
+
693
534
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
694
535
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
695
536
  [🚎yard-current]: http://rubydoc.info/gems/token-resolver
@@ -701,3 +542,14 @@ Thanks for RTFM. ☺️
701
542
  [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
702
543
  [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
703
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.2"
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.2
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.2
278
- changelog_uri: https://github.com/kettle-rb/token-resolver/blob/v1.0.2/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.2
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