auth-sanitizer 0.2.2 → 0.2.4

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: e553dcb05812a620438872bb9726ae4b87806b78e4a188f475db2962fb3ace16
4
- data.tar.gz: c6f928c8ede605a82cce0bb88238eb855529d5464b0655372b6662b90770f537
3
+ metadata.gz: 133e8f52ab2988ce4f62b80654a92286a9bc7c9edb1092790cace4b4dbd581e6
4
+ data.tar.gz: e0ceaea5693cf3c9ba036acdd8162b4added1e5c441ac5e726e325c0ce4a23e6
5
5
  SHA512:
6
- metadata.gz: '018736223d93b251e19b6b47f87ade2c70dd033762a97830cd73c13ea40dce3c175d4629140ca151d04ee64672fc3a46423ab70ea25d59b5e368078cbf119f3b'
7
- data.tar.gz: '0897d315fefb00a8fd951e58a8a9ed0e85f97444394357b2a98d0e4b122cbff788da6fef4250512170eb18ee03bd5ba263bc6cb6512328527b7de0d1e9ad80bd'
6
+ metadata.gz: 38242e0bed6885c8b2a4855e7c46ab177e1fc272aef04425d1cec5de9674bb1c9acc38ee6c7e6d637e9a7b0c8ed3ee93052f6fccd85c9267810c3a1e27e3402f
7
+ data.tar.gz: 756ddde554ae8d459b4b664ab1fda0f2436a296f6610ca6d076ad76e21a620d144ad248a85203f0f949624f484e10cd1373ae2dce95ecca2602f1701e6e6bf7e
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,132 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [0.2.4] - 2026-10-23
34
+
35
+ - TAG: [v0.2.4][0.2.4t]
36
+ - COVERAGE: 100.00% -- 172/172 lines in 7 files
37
+ - BRANCH COVERAGE: 100.00% -- 34/34 branches in 7 files
38
+ - 98.08% documented
39
+
40
+ ### Added
41
+
42
+ - kettle-jem-template-20260720-005 - README Support & Community links now
43
+ include RubyForum.
44
+ - kettle-jem-template-20260726-001 - Projects now include YARD lint
45
+ configuration and documentation dependencies so documentation issues fail
46
+ before generated docs are refreshed.
47
+ - kettle-jem-template-20260727-001 - Spec harness documentation now lists the
48
+ RSpec helpers provided by `kettle-test`.
49
+
50
+ - kettle-jem-template-20260913-001 - Templating now also surfaces a review
51
+ entry in `dependency_conflicts.resolve` when a direct development
52
+ dependency doesn't support one or more of this project's declared
53
+ `engines:` and has no template-managed modular home (e.g. `sqlite3` on
54
+ `jruby`). Review each entry and pick a resolution per the project's own
55
+ engine support needs.
56
+
57
+ ### Changed
58
+
59
+ - kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
60
+ repository-only files by default to reduce downstream distro packaging churn.
61
+
62
+ - kettle-jem-template-20260720-002 - Development Gemfiles now use the released
63
+ `tree_sitter_language_pack` gem 1.13.3 or newer by default.
64
+ - kettle-jem-template-20260725-002 - Version specs now use `anonymous_loader` to
65
+ cover `version.rb` without redefining constants, or are removed when version
66
+ specs are not managed for the project.
67
+ - kettle-jem-template-20260728-001 - Generated Ruby workflows now use clearer
68
+ setup-ruby-flash planning and can prepare appraisal-only jobs without
69
+ installing the main Gemfile bundle.
70
+
71
+ - kettle-jem-template-20260801-001 - Generated README gem dashboard links now
72
+ use ClickGems instead of BestGems.
73
+
74
+ - [kc] kettle-jem/prepare: updated 17 project files:
75
+ - configuration (1)
76
+ - dependencies (16)
77
+
78
+ - [kc] kettle-jem/template: updated 52 project files:
79
+ - code and tests (4)
80
+ - configuration (1)
81
+ - dependencies (8)
82
+ - documentation (2)
83
+ - other (5)
84
+ - workflows (32)
85
+
86
+ ### Fixed
87
+
88
+ - kettle-jem-template-20260720-003 - StructuredMerge Git diff driver config now
89
+ uses the installed `smorg-rb` driver command.
90
+ - kettle-jem-template-20260725-001 - Release pull request branches beginning
91
+ with `feature/release` now run JRuby and TruffleRuby workflows.
92
+ - kettle-jem-template-20260726-002 - Generated version files now document their
93
+ version namespace and constants, reducing warning-only YARD lint output.
94
+ - kettle-jem-template-20260726-003 - Coverage upload steps now treat Coveralls,
95
+ QLTY, and Codecov as optional, so provider outages do not fail CI when local
96
+ coverage thresholds still pass.
97
+ - kettle-jem-template-20260728-002 - Generated RuboCop configs now ignore the
98
+ same `gemfiles/vendor/bundle` tree as `.gitignore`, so vendored dependency
99
+ installs are not reported as project lint debt.
100
+ - kettle-jem-template-20260728-003 - Generated dep-heads workflows now run
101
+ TruffleRuby jobs with current RubyGems and Bundler, avoiding setup failures
102
+ before the test suite starts.
103
+ - kettle-jem-template-20260728-004 - Generated dep-heads workflows now use the
104
+ setup-ruby Bundler install path for direct appraisal Gemfiles, avoiding rv
105
+ lockfile parser failures on Git and path dependencies.
106
+ - kettle-jem-template-20260728-005 - VersionGem bootstrap now creates the
107
+ missing canonical version spec when a project only has shim namespace version
108
+ specs.
109
+ - kettle-jem-template-20260729-001 - Generated JRuby 9.4 workflows now use the
110
+ legacy manual bundle install path, avoiding setup-time Bundler full-index
111
+ failures against `gem.coop`.
112
+ - kettle-jem-template-20260730-001 - Gemspec package file enumeration now runs
113
+ relative to the gemspec directory, so release package contents stay correct
114
+ even when the gemspec is loaded from another working directory.
115
+
116
+ - kettle-jem-template-20260801-002 - Generated RSpec helpers now normalize
117
+ managed configuration block bindings structurally, preventing mixed block
118
+ parameter names from producing invalid configuration after a merge.
119
+ - kettle-jem-template-20260801-003 - Generated project metadata and
120
+ documentation now normalize configured underscore hostnames to valid
121
+ hyphenated hostnames.
122
+ - kettle-jem-template-20260801-004 - Generated organization README logos now
123
+ use GitHub's stable organization avatar endpoint instead of assuming a
124
+ matching Galtzo-hosted asset exists.
125
+ - kettle-jem-template-20260802-001 - Devcontainer JSON files now merge as JSONC,
126
+ preserving comments and trailing commas during template updates.
127
+
128
+ - Fix load-order `NameError: uninitialized constant Auth::Sanitizer::Version` by removing a duplicate `VersionGem::Basic` class_eval from `auth/sanitizer/core` (the version constant is loaded after `core` in `auth/sanitizer.rb`).
129
+
130
+ - Gemspec no longer defines a top-level `Auth` constant when evaluated on Ruby < 3.1 (e.g. by `bundler/setup`); the version file now loads into an anonymous module via `Module#module_eval` on all supported Rubies. This un-breaks the isolated-loading specs and the ruby-2.4 CI workflow.
131
+
132
+ ### Security
133
+
134
+ - SanitizedLogger now redacts configured keys in Ruby `Hash#inspect` output (both Ruby 3.4+ `{"key" => "value"}` / `{key: "value"}` and pre-3.4 hash-rocket formats), fixes a mangling bug where the form-pair pattern partially matched `:key=>"value"` pairs, and no longer raises on invalid-encoded message bytes. This closes the OAUTH_DEBUG cleartext-logging bypass reported for oauth2 as GHSA-cmh8-5q25-68v6, where Faraday renders Hash request bodies with `pretty_inspect`. Reported by iamibi.
135
+
136
+ ## [0.2.3] - 2026-07-14
137
+
138
+ - TAG: [v0.2.3][0.2.3t]
139
+ - COVERAGE: 85.80% -- 145/169 lines in 7 files
140
+ - BRANCH COVERAGE: 82.35% -- 28/34 branches in 7 files
141
+ - 84.62% documented
142
+
143
+ ### Added
144
+
145
+ - Added support for JRuby 10.1 and TruffleRuby 34.0.
146
+
147
+ ### Changed
148
+
149
+ - Retemplated project metadata and CI/development automation with `kettle-jem` v7.0.0.
150
+
151
+ ### Fixed
152
+
153
+ - Package configured license files in gem release file lists.
154
+
155
+ - Removed stale local-path `version_gem` state from the main lockfile.
156
+ - Prevented gemspec version detection from defining top-level `Auth` on older
157
+ Rubies.
158
+
33
159
  ## [0.2.2] - 2026-06-18
34
160
 
35
161
  - TAG: [v0.2.2][0.2.2t]
@@ -169,7 +295,11 @@ Please file a bug if you notice a violation of semantic versioning.
169
295
 
170
296
  - Initial release
171
297
 
172
- [Unreleased]: https://github.com/ruby-oauth/auth-sanitizer/compare/v0.2.2...HEAD
298
+ [Unreleased]: https://github.com/ruby-oauth/auth-sanitizer/compare/v0.2.4...HEAD
299
+ [0.2.4]: https://github.com/ruby-oauth/auth-sanitizer/compare/v0.2.3...v0.2.4
300
+ [0.2.4t]: https://github.com/ruby-oauth/auth-sanitizer/releases/tag/v0.2.4
301
+ [0.2.3]: https://github.com/ruby-oauth/auth-sanitizer/compare/v0.2.2...v0.2.3
302
+ [0.2.3t]: https://github.com/ruby-oauth/auth-sanitizer/releases/tag/v0.2.3
173
303
  [0.2.2]: https://github.com/ruby-oauth/auth-sanitizer/compare/v0.2.1...v0.2.2
174
304
  [0.2.2t]: https://github.com/ruby-oauth/auth-sanitizer/releases/tag/v0.2.2
175
305
  [0.2.1]: https://github.com/ruby-oauth/auth-sanitizer/compare/v0.2.0...v0.2.1
data/LICENSE.md CHANGED
@@ -3,7 +3,7 @@
3
3
  This project is made available under the following license.
4
4
  Choose the option that best fits your use case:
5
5
 
6
- - [MIT](MIT.md)
6
+ - [MIT](https://github.com/ruby-oauth/auth-sanitizer/blob/main/MIT.md)
7
7
 
8
8
  ## Copyright Notice
9
9
 
data/README.md CHANGED
@@ -1,18 +1,18 @@
1
- <a href="https://github.com/ruby-oauth"><img alt="ruby-oauth Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/ruby-oauth/avatar-128px.svg" width="14%" align="right"/></a>
1
+ <a href="https://github.com/ruby-oauth"><img alt="ruby-oauth Logo by GitHub" src="https://github.com/ruby-oauth.png?size=192" width="14%" align="right"/></a>
2
2
 
3
- # 💎 Auth::Sanitizer
3
+ # 🧼 Auth::Sanitizer
4
4
 
5
- [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄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] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
5
+ [![Version][👽versioni]][👽version] [![Ruby Users Forum][✉️ruby-forum-top-img]][✉️ruby-forum] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Total downloads][👽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] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
6
6
 
7
- `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know on Discord][✉️discord-invite] or [RubyForum][✉️ruby-forum], as I may have missed the notification.
8
8
 
9
9
  ---
10
10
 
11
11
  `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
12
12
 
13
- [![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]
13
+ [![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 at ko-fi.com][🖇kofi-img]][🖇kofi]
14
14
 
15
- <details>
15
+ <details markdown="1">
16
16
  <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
17
17
 
18
18
  I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
@@ -80,13 +80,13 @@ This gem is used by the following libraries to ensure clean output:
80
80
 
81
81
  | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
82
82
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
83
- | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎jruby-9.2-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎jruby-9.3-wf] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎jruby-9.4-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
84
- | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎truby-22.3-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎truby-23.0-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎truby-23.1-wf] <br/> [![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]|
85
- | 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]|
83
+ | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎jruby-9.2-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎jruby-9.3-wf] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎jruby-9.4-wf] [![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
84
+ | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎truby-22.3-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎truby-23.1-wf] <br/> [![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 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf]|
85
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
86
86
  | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎ruby-3.0-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎ruby-3.1-wf] [![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]|
87
87
  | Works with MRI Ruby 2 | ![Ruby 2.2 Compat][💎ruby-2.2i] ![Ruby 2.3 Compat][💎ruby-2.3i] <br/> [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎ruby-2.4-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎ruby-2.5-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎ruby-2.6-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎ruby-2.7-wf]|
88
- | 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] |
89
- | 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] |
88
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![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] |
89
+ | 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] |
90
90
  | 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] |
91
91
  | Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄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] |
92
92
  | 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] |
@@ -95,33 +95,65 @@ This gem is used by the following libraries to ensure clean output:
95
95
 
96
96
  ### Compatibility
97
97
 
98
- Compatible with MRI Ruby 2.2.0+, and concordant releases of JRuby, and TruffleRuby.
98
+ Compatible with MRI Ruby 2.2.0+, JRuby, and TruffleRuby.
99
99
  CI workflows and Appraisals are generated for MRI Ruby 2.4+.
100
100
  This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
101
101
  may be higher than the gem's runtime compatibility floor when legacy Rubies are
102
102
  not practical for the current toolchain.
103
103
 
104
- | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
105
- |------------------------------------------------|--------------------------------------------------------|
106
- | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
104
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
105
+
106
+ The _amazing_ test matrix is powered by the kettle-dev stack.
107
+
108
+ <details markdown="1">
109
+ <summary>How kettle-dev manages complexity in tests</summary>
110
+
111
+ | Gem | Source | Role | Total downloads |
112
+ |-----|--------|------|---------------------|
113
+ | [appraisal2](https://clickgems.clickhouse.com/dashboard/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Total downloads for appraisal2](https://img.shields.io/gem/dt/appraisal2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2) |
114
+ | [appraisal2-rubocop](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Total downloads for appraisal2-rubocop](https://img.shields.io/gem/dt/appraisal2-rubocop.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) |
115
+ | [kettle-dev](https://clickgems.clickhouse.com/dashboard/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Total downloads for kettle-dev](https://img.shields.io/gem/dt/kettle-dev.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-dev) |
116
+ | [kettle-jem](https://clickgems.clickhouse.com/dashboard/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Total downloads for kettle-jem](https://img.shields.io/gem/dt/kettle-jem.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-jem) |
117
+ | [kettle-soup-cover](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Total downloads for kettle-soup-cover](https://img.shields.io/gem/dt/kettle-soup-cover.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) |
118
+ | [kettle-test](https://clickgems.clickhouse.com/dashboard/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Total downloads for kettle-test](https://img.shields.io/gem/dt/kettle-test.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-test) |
119
+ | [rubocop-lts](https://clickgems.clickhouse.com/dashboard/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Total downloads for rubocop-lts](https://img.shields.io/gem/dt/rubocop-lts.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/rubocop-lts) |
120
+ | [turbo_tests2](https://clickgems.clickhouse.com/dashboard/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Total downloads for turbo_tests2](https://img.shields.io/gem/dt/turbo_tests2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/turbo_tests2) |
121
+
122
+ </details>
123
+
124
+ ### Runtime and Platform Support
125
+
126
+ Support tiers describe what this project's CI actually exercises, not what may
127
+ work in an untested environment:
128
+
129
+ - **Parallel support**: CI runs the test suite with multiple workers available.
130
+ - **Unsupported**: the engine/platform combination is not covered by CI and is
131
+ not a project compatibility claim.
132
+
133
+ | Ruby engine/version | Linux | macOS | Windows | Notes |
134
+ |---------------------|-------|-------|---------|-------|
135
+ | MRI 3.1-3.4 | Parallel support | Unsupported | Unsupported | Versioned Ruby workflows run on Linux. |
136
+ | MRI current | Parallel support | Parallel support | Unsupported | Current Ruby workflow covers the declared OS platforms. |
137
+ | MRI head | Parallel support | Unsupported | Unsupported | CI is allowed to fail while Ruby is in development. |
138
+ | JRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Engine workflows run on Linux; macOS and Windows are not exercised by CI. |
139
+ | TruffleRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Never shipped a Windows build (zero Windows assets across 66 releases scanned 2026-10-10); setup-ruby hard-fails ([source](https://github.com/ruby/setup-ruby/blob/master/README.md)) |
107
140
 
108
141
  ### Federated DVCS
109
142
 
110
143
  <details markdown="1">
111
144
  <summary>Find this repo on federated forges (Coming soon!)</summary>
112
145
 
113
- | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
114
- |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
115
- | 🧪 [ruby-oauth/auth-sanitizer on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
116
- | 🧊 [ruby-oauth/auth-sanitizer on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
117
- | 🐙 [ruby-oauth/auth-sanitizer on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
118
- | 🎮️ [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] |
146
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI |
147
+ |-------------------------------------------------|-------------------------------------------|-------------------|------------------|-----------------|----------------|
148
+ | 🧪 [ruby-oauth/auth-sanitizer on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix |
149
+ | 🧊 [ruby-oauth/auth-sanitizer on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix |
150
+ | 🐙 [ruby-oauth/auth-sanitizer on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix |
119
151
 
120
152
  </details>
121
153
 
122
- [gh-discussions]: https://github.com/ruby-oauth/auth-sanitizer/discussions
154
+ ### Enterprise Support
123
155
 
124
- ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/auth-sanitizer)](https://tidelift.com/subscription/pkg/rubygems-auth-sanitizer?utm_source=rubygems-auth-sanitizer&utm_medium=referral&utm_campaign=readme)
156
+ [![Tidelift](https://tidelift.com/badges/package/rubygems/auth-sanitizer)](https://tidelift.com/subscription/pkg/rubygems-auth-sanitizer?utm_source=rubygems-auth-sanitizer&utm_medium=referral&utm_campaign=readme)
125
157
 
126
158
  Available as part of the Tidelift Subscription.
127
159
 
@@ -138,6 +170,7 @@ The maintainers of this and thousands of other packages are working with Tidelif
138
170
 
139
171
  Alternatively:
140
172
 
173
+ - [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
141
174
  - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
142
175
  - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
143
176
  - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
@@ -575,13 +608,9 @@ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day
575
608
 
576
609
  <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
577
610
  No sponsors yet. Be the first!
578
-
579
- ### Open Collective for Donors
580
-
581
- [Bill Woika](https://opencollective.com/bill-woika) [Philipp Ebneter](https://opencollective.com/guest-e77282f7) [Grigoriy](https://opencollective.com/guest-c93e0c48)
582
611
  <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
583
612
 
584
- [kettle-readme-backers]: https://github.com/ruby-oauth/auth-sanitizer/blob/main/exe/kettle-readme-backers
613
+ [kettle-readme-backers]: https://github.com/ruby-oauth/auth-sanitizer/blob/main/bin/kettle-readme-backers
585
614
 
586
615
  ### Another way to support open-source
587
616
 
@@ -593,7 +622,7 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
593
622
 
594
623
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
595
624
 
596
- [![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]
625
+ [![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 to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
597
626
 
598
627
  ## 🔐 Security
599
628
 
@@ -602,8 +631,7 @@ See [SECURITY.md][🔐security].
602
631
  ## 🤝 Contributing
603
632
 
604
633
  If you need some ideas of where to help, you could work on adding more code coverage,
605
- or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
606
- or use the gem and think about how it could be better.
634
+ check [issues][🤝gh-issues] or [PRs][🤝gh-pulls], or use the gem and think about how it could be better.
607
635
 
608
636
  We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
609
637
 
@@ -639,19 +667,6 @@ Made with [contributors-img][🖐contrib-rocks].
639
667
 
640
668
  Also see GitLab Contributors: [https://gitlab.com/ruby-oauth/auth-sanitizer/-/graphs/main][🚎contributors-gl]
641
669
 
642
- <details>
643
- <summary>⭐️ Star History</summary>
644
-
645
- <a href="https://star-history.com/ruby-oauth/auth-sanitizer&Date">
646
- <picture>
647
- <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/auth-sanitizer&type=Date&theme=dark" />
648
- <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/auth-sanitizer&type=Date" />
649
- <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=ruby-oauth/auth-sanitizer&type=Date" />
650
- </picture>
651
- </a>
652
-
653
- </details>
654
-
655
670
  ## 📌 Versioning
656
671
 
657
672
  This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
@@ -681,7 +696,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases.
681
696
  ## 📄 License
682
697
 
683
698
  The gem is available as open source under the terms of
684
- the [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].
699
+ the [MIT](https://github.com/ruby-oauth/auth-sanitizer/blob/main/MIT.md) [![License: MIT][📄license-img]][📄license-ref].
685
700
 
686
701
  ### © Copyright
687
702
 
@@ -703,11 +718,12 @@ I'm hoping to be able to pay for my kids' health insurance this month,
703
718
  so if you value the work I am doing, I need your support.
704
719
  Please consider sponsoring me or the project.
705
720
 
706
- To join the community or get help 👇️ Join the Discord.
721
+ To join the community or get help, use the RubyForum or Discord.
707
722
 
723
+ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
708
724
  [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
709
725
 
710
- To say "thanks!" ☝️ Join the Discord or 👇️ send money.
726
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
711
727
 
712
728
  [![Sponsor ruby-oauth/auth-sanitizer on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
713
729
 
@@ -734,12 +750,8 @@ Thanks for RTFM. ☺️
734
750
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
735
751
  [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
736
752
  [🖇sponsor]: https://github.com/sponsors/pboling
737
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
738
- [🖇polar]: https://polar.sh/pboling
739
753
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
740
754
  [🖇kofi]: https://ko-fi.com/pboling
741
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
742
- [🖇patreon]: https://patreon.com/galtzo
743
755
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
744
756
  [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
745
757
  [🖇buyme]: https://www.buymeacoffee.com/pboling
@@ -752,11 +764,14 @@ Thanks for RTFM. ☺️
752
764
  [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
753
765
  [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
754
766
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
767
+ [✉️ruby-forum-top-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=flat&logo=discourse&label=Ruby%20Users%20Forum
768
+ [✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=for-the-badge&logo=discourse&label=Ruby%20Users%20Forum
769
+ [✉️ruby-forum]: https://www.rubyforum.org/tag/ruby-oauth
755
770
 
756
771
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
757
772
  [⛳️gem-namespace]: https://github.com/ruby-oauth/auth-sanitizer
758
773
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-Auth::Sanitizer-3C2D2D.svg?style=square&logo=ruby&logoColor=white
759
- [⛳️gem-name]: https://bestgems.org/gems/auth-sanitizer
774
+ [⛳️gem-name]: https://clickgems.clickhouse.com/dashboard/auth-sanitizer
760
775
  [⛳️name-img]: https://img.shields.io/badge/name-auth--sanitizer-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
761
776
  [⛳️tag-img]: https://img.shields.io/github/tag/ruby-oauth/auth-sanitizer.svg
762
777
  [⛳️tag]: https://github.com/ruby-oauth/auth-sanitizer/releases
@@ -797,7 +812,7 @@ Thanks for RTFM. ☺️
797
812
  [📜src-gl]: https://gitlab.com/ruby-oauth/auth-sanitizer
798
813
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
799
814
  [📜src-cb]: https://codeberg.org/ruby-oauth/auth-sanitizer
800
- [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
815
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
801
816
  [📜src-gh]: https://github.com/ruby-oauth/auth-sanitizer
802
817
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
803
818
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
@@ -805,9 +820,9 @@ Thanks for RTFM. ☺️
805
820
  [📜gh-wiki]: https://github.com/ruby-oauth/auth-sanitizer/wiki
806
821
  [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
807
822
  [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
808
- [👽dl-rank]: https://bestgems.org/gems/auth-sanitizer
809
- [👽dl-ranki]: https://img.shields.io/gem/rd/auth-sanitizer.svg
810
- [👽version]: https://bestgems.org/gems/auth-sanitizer
823
+ [👽dl-rank]: https://clickgems.clickhouse.com/dashboard/auth-sanitizer
824
+ [👽dl-ranki]: https://img.shields.io/gem/dt/auth-sanitizer.svg
825
+ [👽version]: https://clickgems.clickhouse.com/dashboard/auth-sanitizer
811
826
  [👽versioni]: https://img.shields.io/gem/v/auth-sanitizer.svg
812
827
  [🏀qlty-mnt]: https://qlty.sh/gh/ruby-oauth/projects/auth-sanitizer
813
828
  [🏀qlty-mnti]: https://qlty.sh/gh/ruby-oauth/projects/auth-sanitizer/maintainability.svg
@@ -829,11 +844,12 @@ Thanks for RTFM. ☺️
829
844
  [🚎jruby-9.2-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby-9.2.yml
830
845
  [🚎jruby-9.3-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby-9.3.yml
831
846
  [🚎jruby-9.4-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby-9.4.yml
847
+ [🚎jruby-10.0-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby-10.0.yml
832
848
  [🚎truby-22.3-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-22.3.yml
833
- [🚎truby-23.0-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-23.0.yml
834
849
  [🚎truby-23.1-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-23.1.yml
835
850
  [🚎truby-24.2-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-24.2.yml
836
851
  [🚎truby-25.0-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-25.0.yml
852
+ [🚎truby-33.0-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-33.0.yml
837
853
  [🚎2-cov-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/coverage.yml
838
854
  [🚎2-cov-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/coverage.yml/badge.svg
839
855
  [🚎3-hd-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/heads.yml
@@ -865,18 +881,18 @@ Thanks for RTFM. ☺️
865
881
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
866
882
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
867
883
  [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
868
- [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
869
884
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
870
885
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
871
886
  [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
872
- [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
873
887
  [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
874
888
  [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
875
889
  [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
890
+ [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
876
891
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
877
892
  [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
878
893
  [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
879
894
  [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
895
+ [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
880
896
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
881
897
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
882
898
  [🤝gh-issues]: https://github.com/ruby-oauth/auth-sanitizer/issues
@@ -905,15 +921,15 @@ Thanks for RTFM. ☺️
905
921
  [📌gitmoji]: https://gitmoji.dev
906
922
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
907
923
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
908
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.145-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
924
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.172-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
909
925
  [🔐security]: https://github.com/ruby-oauth/auth-sanitizer/blob/main/SECURITY.md
910
926
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
911
927
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
912
928
  [📄license]: LICENSE.md
913
- [📄license-ref]: MIT.md
929
+ [📄license-ref]: https://github.com/ruby-oauth/auth-sanitizer/blob/main/MIT.md
914
930
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
915
931
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
916
- [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-✓-259D6C.svg?style=flat&logo=Apache
932
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
917
933
 
918
934
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
919
935
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
@@ -931,9 +947,9 @@ Thanks for RTFM. ☺️
931
947
  | Field | Value |
932
948
  |---|---|
933
949
  | Package | auth-sanitizer |
934
- | Description | 💎 Configurable KV output redaction. Sanitize/filter your secrets. |
950
+ | Description | 🧼 Configurable KV output redaction. Sanitize/filter your secrets. |
935
951
  | Homepage | https://github.com/ruby-oauth/auth-sanitizer |
936
- | Source | https://github.com/ruby-oauth/auth-sanitizer/tree/v0.2.0 |
952
+ | Source | https://github.com/ruby-oauth/auth-sanitizer |
937
953
  | License | `MIT` |
938
- | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/ruby-oauth, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/auth-sanitizer, https://www.buymeacoffee.com/pboling |
954
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/ruby-oauth, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/auth-sanitizer, https://www.buymeacoffee.com/pboling |
939
955
  <!-- kettle-jem:metadata:end -->
@@ -1,13 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "version_gem"
4
-
5
- Auth::Sanitizer::Version.class_eval do
6
- extend VersionGem::Basic
7
- end
8
-
3
+ # Top-level namespace for authentication-adjacent helpers.
9
4
  module Auth
5
+ # Credential redaction for inspect output and debug logging.
10
6
  module Sanitizer
7
+ # Error raised for auth-sanitizer failures.
11
8
  class Error < StandardError; end
12
9
 
13
10
  # Default keys filtered from debug log output.
@@ -42,16 +39,13 @@ module Auth
42
39
 
43
40
  # Install a custom provider for the filtered label.
44
41
  #
45
- # The provider is called each time a new {FilteredAttributes}- or
46
- # {SanitizedLogger}-bearing object is initialized, allowing the label to
47
- # track a host gem's live configuration while still being snapshotted per
48
- # object instance.
42
+ # The provider callable is invoked each time a new {FilteredAttributes}- or
43
+ # {SanitizedLogger}-bearing object is initialized, allowing the label to track a host gem's
44
+ # live configuration while still being snapshotted per object instance.
49
45
  #
46
+ # @return [void]
50
47
  # @example Delegate to a host gem's config
51
48
  # Auth::Sanitizer.filtered_label_provider = -> { MyGem.config[:filtered_label] }
52
- #
53
- # @param [#call] provider A callable that returns the label string
54
- # @return [void]
55
49
  define_singleton_method(:filtered_label_provider=) do |provider|
56
50
  filtered_label_provider_mutex.synchronize do
57
51
  filtered_label_provider = provider
@@ -4,13 +4,11 @@ module Auth
4
4
  module Sanitizer
5
5
  # Mixin that redacts sensitive instance variables in `#inspect` output.
6
6
  #
7
- # Classes include this module and declare which attribute names should be
8
- # filtered via {.filtered_attributes}. Matching and replacement behavior is
9
- # delegated to {ThingFilter}, which is initialized once per object.
7
+ # Classes include this module and declare attribute names to filter via {.filtered_attributes}.
8
+ # Matching and replacement behavior is delegated to {ThingFilter}, initialized once per object.
10
9
  #
11
- # This means existing objects keep the filter configuration that was present
12
- # when they were initialized, even if global config or class-level filter
13
- # declarations change later.
10
+ # This means existing objects keep the filter configuration that was present when they were
11
+ # initialized, even if global config or class-level filter declarations change later.
14
12
  #
15
13
  # The label used for redaction is resolved from {Auth::Sanitizer.filtered_label}
16
14
  # at object initialization time. Host gems may customize this by installing a
@@ -20,7 +18,7 @@ module Auth
20
18
  # Hook invoked when the module is included. Extends the including class with
21
19
  # class-level helpers and prepends the initializer hook.
22
20
  #
23
- # @param [Class] base The including class
21
+ # @param base [Class] The including class
24
22
  # @return [void]
25
23
  def included(base)
26
24
  base.extend(ClassMethods)
@@ -47,7 +45,8 @@ module Auth
47
45
  class << self
48
46
  # Declare attributes that should be redacted in inspect output.
49
47
  #
50
- # @param [Array<Symbol, String>] attributes One or more attribute names
48
+ # @param base [Class] The class the attributes are declared on
49
+ # @param attributes [Array<Symbol, String>] One or more attribute names
51
50
  # @return [void]
52
51
  def filtered_attributes(base, *attributes)
53
52
  base.instance_variable_set(:@filtered_attribute_names, attributes.map(&:to_sym))
@@ -55,7 +54,7 @@ module Auth
55
54
 
56
55
  # The configured attribute names to filter.
57
56
  #
58
- # @param [Class] base The class to get filtered attributes for
57
+ # @param base [Class] The class to get filtered attributes for
59
58
  # @return [Array<Symbol>]
60
59
  def filtered_attribute_names(base)
61
60
  return [] unless base.instance_variable_defined?(:@filtered_attribute_names)
@@ -66,7 +65,7 @@ module Auth
66
65
 
67
66
  # Declare attributes that should be redacted in inspect output.
68
67
  #
69
- # @param [Array<Symbol, String>] attributes One or more attribute names
68
+ # @param attributes [Array<Symbol, String>] One or more attribute names
70
69
  # @return [void]
71
70
  def filtered_attributes(*attributes)
72
71
  ClassMethods.filtered_attributes(self, *attributes)
@@ -101,7 +100,9 @@ module Auth
101
100
 
102
101
  private
103
102
 
103
+ # Matches a quoted string literal inside `#inspect` output.
104
104
  INSPECTED_STRING_VALUE = /"(?:(?:\\.)|[^"\\])*"/
105
+ # Matches redactable key/value pairs inside `#inspect` output.
105
106
  INSPECTED_REDACTABLE_VALUE = /
106
107
  (?:
107
108
  (@([A-Za-z_]\w*[!?=]?)=) |
@@ -113,6 +114,10 @@ module Auth
113
114
  /x
114
115
  private_constant :INSPECTED_STRING_VALUE, :INSPECTED_REDACTABLE_VALUE
115
116
 
117
+ # Redact filtered values from `#inspect` output text.
118
+ #
119
+ # @param inspected [String] The `#inspect` output to redact
120
+ # @return [String] The redacted inspect output
116
121
  def redact_inspected_values(inspected)
117
122
  inspected.gsub(INSPECTED_REDACTABLE_VALUE) do |match|
118
123
  captures = Regexp.last_match.captures