auth-sanitizer 0.1.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.
data/README.md ADDED
@@ -0,0 +1,532 @@
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] [![oauth2 Logo by Chris Messina, CC BY-SA 3.0][🖼️oauth2-i]][🖼️oauth2]
2
+
3
+ [🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
+ [🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
5
+ [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
6
+ [🖼️ruby-lang]: https://www.ruby-lang.org/
7
+ [🖼️oauth2-i]: https://logos.galtzo.com/assets/images/oauth/oauth2/avatar-192px.svg
8
+ [🖼️oauth2]: https://github.com/ruby-oauth/oauth2
9
+
10
+ # 🍲 Auth::Sanitizer
11
+
12
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![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] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
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].
15
+
16
+ ---
17
+
18
+ `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.
19
+
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
+
22
+ <details>
23
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
24
+
25
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
26
+
27
+ </details>
28
+
29
+ ## 🌻 Synopsis
30
+
31
+ ## 💡 Info you can shake a stick at
32
+
33
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
34
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
35
+ | Works with JRuby | [![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]|
36
+ | 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]|
37
+ | 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]|
38
+ | 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]|
39
+ | Works with MRI Ruby 2 | ![Ruby 2.2 Compat][💎ruby-2.2i] <br/> [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎ruby-2.3-wf] [![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]|
40
+ | 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] |
41
+ | 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] |
42
+ | 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] |
43
+ | 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] |
44
+ | 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] |
45
+ | 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] |
46
+ | `...` 💖 | [![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] |
47
+
48
+ ### Compatibility
49
+
50
+ Compatible with MRI Ruby 2.2.0+, and concordant releases of JRuby, and TruffleRuby.
51
+
52
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
53
+ |------------------------------------------------|--------------------------------------------------------|
54
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
55
+
56
+ ### Federated DVCS
57
+
58
+ <details markdown="1">
59
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
60
+
61
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
62
+ |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
63
+ | 🧪 [ruby-oauth/auth-sanitizer on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
64
+ | 🧊 [ruby-oauth/auth-sanitizer on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
65
+ | 🐙 [ruby-oauth/auth-sanitizer on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
66
+ | 🎮️ [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] |
67
+
68
+ </details>
69
+
70
+ [gh-discussions]: https://github.com/ruby-oauth/auth-sanitizer/discussions
71
+
72
+ ### 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)
73
+
74
+ Available as part of the Tidelift Subscription.
75
+
76
+ <details markdown="1">
77
+ <summary>Need enterprise-level guarantees?</summary>
78
+
79
+ 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.
80
+
81
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
82
+
83
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
84
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
85
+ - 💡Tidelift pays maintainers to maintain the software you depend on!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
86
+
87
+ Alternatively:
88
+
89
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
90
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
91
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
92
+
93
+ </details>
94
+
95
+ ## ✨ Installation
96
+
97
+ Install the gem and add to the application's Gemfile by executing:
98
+
99
+ ```console
100
+ bundle add auth-sanitizer
101
+ ```
102
+
103
+ If bundler is not being used to manage dependencies, install the gem by executing:
104
+
105
+ ```console
106
+ gem install auth-sanitizer
107
+ ```
108
+
109
+ ### 🔒 Secure Installation
110
+
111
+ <details markdown="1">
112
+ <summary>For Medium or High Security Installations</summary>
113
+
114
+ This gem is cryptographically signed and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
115
+ [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
116
+ by following the instructions below.
117
+
118
+ Add my public key (if you haven’t already; key expires 2045-04-29) as a trusted certificate:
119
+
120
+ ```console
121
+ gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
122
+ ```
123
+
124
+ You only need to do that once. Then proceed to install with:
125
+
126
+ ```console
127
+ gem install auth-sanitizer -P HighSecurity
128
+ ```
129
+
130
+ The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
131
+
132
+ If you want to up your security game full-time:
133
+
134
+ ```console
135
+ bundle config set --global trust-policy MediumSecurity
136
+ ```
137
+
138
+ `MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
139
+
140
+ NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
141
+
142
+ </details>
143
+
144
+ ## ⚙️ Configuration
145
+
146
+ ## 🔧 Basic Usage
147
+
148
+ ## 🦷 FLOSS Funding
149
+
150
+ While ruby-oauth tools are free software and will always be, the project would benefit immensely from some funding.
151
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
152
+
153
+ We welcome both individual and corporate sponsors! We also offer a
154
+ wide array of funding channels to account for your preferences
155
+ (although currently [Open Collective][🖇osc] is our preferred funding platform).
156
+
157
+ **If you're working in a company that's making significant use of ruby-oauth tools we'd
158
+ appreciate it if you suggest to your company to become a ruby-oauth sponsor.**
159
+
160
+ You can support the development of ruby-oauth tools via
161
+ [GitHub Sponsors][🖇sponsor],
162
+ [Liberapay][⛳liberapay],
163
+ [PayPal][🖇paypal],
164
+ [Open Collective][🖇osc]
165
+ and [Tidelift][🏙️entsup-tidelift].
166
+
167
+ | 📍 NOTE |
168
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
169
+ | 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. |
170
+
171
+ ### Open Collective for Individuals
172
+
173
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/ruby-oauth#backer)]
174
+
175
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
176
+
177
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
178
+ No backers yet. Be the first!
179
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
180
+
181
+ ### Open Collective for Organizations
182
+
183
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/ruby-oauth#sponsor)]
184
+
185
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
186
+
187
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
188
+ No sponsors yet. Be the first!
189
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
190
+
191
+ [kettle-readme-backers]: https://github.com/ruby-oauth/auth-sanitizer/blob/main/exe/kettle-readme-backers
192
+
193
+ ### Another way to support open-source
194
+
195
+ 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).
196
+
197
+ 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`.
198
+
199
+ 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.
200
+
201
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
202
+
203
+ [![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]
204
+
205
+ ## 🔐 Security
206
+
207
+ See [SECURITY.md][🔐security].
208
+
209
+ ## 🤝 Contributing
210
+
211
+ If you need some ideas of where to help, you could work on adding more code coverage,
212
+ or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
213
+ or use the gem and think about how it could be better.
214
+
215
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
216
+
217
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
218
+
219
+ ### 🚀 Release Instructions
220
+
221
+ See [CONTRIBUTING.md][🤝contributing].
222
+
223
+ ### Code Coverage
224
+
225
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
226
+
227
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
228
+
229
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
230
+
231
+ ### 🪇 Code of Conduct
232
+
233
+ Everyone interacting with this project's codebases, issue trackers,
234
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
235
+
236
+ ## 🌈 Contributors
237
+
238
+ [![Contributors][🖐contributors-img]][🖐contributors]
239
+
240
+ Made with [contributors-img][🖐contrib-rocks].
241
+
242
+ Also see GitLab Contributors: [https://gitlab.com/ruby-oauth/auth-sanitizer/-/graphs/main][🚎contributors-gl]
243
+
244
+ <details>
245
+ <summary>⭐️ Star History</summary>
246
+
247
+ <a href="https://star-history.com/#ruby-oauth/auth-sanitizer&Date">
248
+ <picture>
249
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/auth-sanitizer&type=Date&theme=dark" />
250
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/auth-sanitizer&type=Date" />
251
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=ruby-oauth/auth-sanitizer&type=Date" />
252
+ </picture>
253
+ </a>
254
+
255
+ </details>
256
+
257
+ ## 📌 Versioning
258
+
259
+ This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
260
+ Violations of this scheme should be reported as bugs.
261
+ Specifically, if a minor or patch version is released that breaks backward compatibility,
262
+ a new version should be immediately released that restores compatibility.
263
+ Breaking changes to the public API will only be introduced with new major versions.
264
+
265
+ > dropping support for a platform is both obviously and objectively a breaking change <br/>
266
+ >—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
267
+
268
+ I understand that policy doesn't work universally ("exceptions to every rule!"),
269
+ but it is the policy here.
270
+ As such, in many cases it is good to specify a dependency on this library using
271
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
272
+
273
+ For example:
274
+
275
+ ```ruby
276
+ spec.add_dependency("auth-sanitizer", "~> 0.0")
277
+ ```
278
+
279
+ <details markdown="1">
280
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
281
+
282
+ SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
283
+ is a *breaking change* to an API, and for that reason the bike shedding is endless.
284
+
285
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
286
+ read this article from the creator of SemVer:
287
+
288
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
289
+
290
+ </details>
291
+
292
+ See [CHANGELOG.md][📌changelog] for a list of releases.
293
+
294
+ ## 📄 License
295
+
296
+ The gem is available as open source under the terms of
297
+ the [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].
298
+
299
+ ### © Copyright
300
+
301
+ See [LICENSE.md][📄license] for the official copyright notice.
302
+
303
+ ## 🤑 A request for help
304
+
305
+ Maintainers have teeth and need to pay their dentists.
306
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
307
+ I began spending most of my time building open source tools.
308
+ I'm hoping to be able to pay for my kids' health insurance this month,
309
+ so if you value the work I am doing, I need your support.
310
+ Please consider sponsoring me or the project.
311
+
312
+ To join the community or get help 👇️ Join the Discord.
313
+
314
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
315
+
316
+ To say "thanks!" ☝️ Join the Discord or 👇️ send money.
317
+
318
+ [![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]
319
+
320
+ ### Please give the project a star ⭐ ♥.
321
+
322
+ Thanks for RTFM. ☺️
323
+
324
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
325
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
326
+ [⛳liberapay]: https://liberapay.com/pboling/donate
327
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth
328
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth
329
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth
330
+ [🖇osc-backers]: https://opencollective.com/ruby-oauth#backer
331
+ [🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat
332
+ [🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor
333
+ [🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat
334
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge
335
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge
336
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge
337
+ [🖇osc]: https://opencollective.com/ruby-oauth
338
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
339
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
340
+ [🖇sponsor]: https://github.com/sponsors/pboling
341
+ [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
342
+ [🖇polar]: https://polar.sh/pboling
343
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
344
+ [🖇kofi]: https://ko-fi.com/pboling
345
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
346
+ [🖇patreon]: https://patreon.com/galtzo
347
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
348
+ [🖇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
349
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
350
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
351
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
352
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
353
+ [🖇floss-funding.dev]: https://floss-funding.dev
354
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
355
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
356
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
357
+ [✉️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
358
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
359
+
360
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
361
+ [⛳️gem-namespace]: https://github.com/ruby-oauth/auth-sanitizer
362
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Auth::Sanitizer-3C2D2D.svg?style=square&logo=ruby&logoColor=white
363
+ [⛳️gem-name]: https://bestgems.org/gems/auth-sanitizer
364
+ [⛳️name-img]: https://img.shields.io/badge/name-auth--sanitizer-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
365
+ [⛳️tag-img]: https://img.shields.io/github/tag/ruby-oauth/auth-sanitizer.svg
366
+ [⛳️tag]: http://github.com/ruby-oauth/auth-sanitizer/releases
367
+ [🚂maint-blog]: http://www.railsbling.com/tags/auth-sanitizer
368
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
369
+ [🚂maint-contact]: http://www.railsbling.com/contact
370
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
371
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
372
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
373
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
374
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
375
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
376
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
377
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
378
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
379
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
380
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
381
+ [💖🌳linktree]: https://linktr.ee/galtzo
382
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
383
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
384
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
385
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
386
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
387
+ [💖🧊berg]: https://codeberg.org/pboling
388
+ [💖🐙hub]: https://github.org/pboling
389
+ [💖🛖hut]: https://sr.ht/~galtzo/
390
+ [💖🧪lab]: https://gitlab.com/pboling
391
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
392
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
393
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
394
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
395
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-auth-sanitizer?utm_source=rubygems-auth-sanitizer&utm_medium=referral&utm_campaign=readme
396
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
397
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
398
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
399
+ [🚂railsbling]: http://www.railsbling.com
400
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
401
+ [📜src-gl]: https://gitlab.com/ruby-oauth/auth-sanitizer/
402
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
403
+ [📜src-cb]: https://codeberg.org/ruby-oauth/auth-sanitizer
404
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
405
+ [📜src-gh]: https://github.com/ruby-oauth/auth-sanitizer
406
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
407
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
408
+ [📜gl-wiki]: https://gitlab.com/ruby-oauth/auth-sanitizer/-/wikis/home
409
+ [📜gh-wiki]: https://github.com/ruby-oauth/auth-sanitizer/wiki
410
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
411
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
412
+ [👽dl-rank]: https://bestgems.org/gems/auth-sanitizer
413
+ [👽dl-ranki]: https://img.shields.io/gem/rd/auth-sanitizer.svg
414
+ [👽version]: https://bestgems.org/gems/auth-sanitizer
415
+ [👽versioni]: https://img.shields.io/gem/v/auth-sanitizer.svg
416
+ [🏀qlty-mnt]: https://qlty.sh/gh/ruby-oauth/projects/auth-sanitizer
417
+ [🏀qlty-mnti]: https://qlty.sh/gh/ruby-oauth/projects/auth-sanitizer/maintainability.svg
418
+ [🏀qlty-cov]: https://qlty.sh/gh/ruby-oauth/projects/auth-sanitizer/metrics/code?sort=coverageRating
419
+ [🏀qlty-covi]: https://qlty.sh/gh/ruby-oauth/projects/auth-sanitizer/coverage.svg
420
+ [🏀codecov]: https://codecov.io/gh/ruby-oauth/auth-sanitizer
421
+ [🏀codecovi]: https://codecov.io/gh/ruby-oauth/auth-sanitizer/graph/badge.svg
422
+ [🏀coveralls]: https://coveralls.io/github/ruby-oauth/auth-sanitizer?branch=main
423
+ [🏀coveralls-img]: https://coveralls.io/repos/github/ruby-oauth/auth-sanitizer/badge.svg?branch=main
424
+ [🖐codeQL]: https://github.com/ruby-oauth/auth-sanitizer/security/code-scanning
425
+ [🖐codeQL-img]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/codeql-analysis.yml/badge.svg
426
+ [🚎ruby-2.3-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-2.3.yml
427
+ [🚎ruby-2.4-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-2.4.yml
428
+ [🚎ruby-2.5-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-2.5.yml
429
+ [🚎ruby-2.6-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-2.6.yml
430
+ [🚎ruby-2.7-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-2.7.yml
431
+ [🚎ruby-3.0-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-3.0.yml
432
+ [🚎ruby-3.1-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-3.1.yml
433
+ [🚎ruby-3.2-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-3.2.yml
434
+ [🚎ruby-3.3-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-3.3.yml
435
+ [🚎ruby-3.4-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/ruby-3.4.yml
436
+ [🚎jruby-9.3-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby-9.3.yml
437
+ [🚎jruby-9.4-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby-9.4.yml
438
+ [🚎truby-22.3-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-22.3.yml
439
+ [🚎truby-23.0-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-23.0.yml
440
+ [🚎truby-23.1-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-23.1.yml
441
+ [🚎truby-24.2-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-24.2.yml
442
+ [🚎truby-25.0-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffleruby-25.0.yml
443
+ [🚎2-cov-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/coverage.yml
444
+ [🚎2-cov-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/coverage.yml/badge.svg
445
+ [🚎3-hd-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/heads.yml
446
+ [🚎3-hd-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/heads.yml/badge.svg
447
+ [🚎5-st-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/style.yml
448
+ [🚎5-st-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/style.yml/badge.svg
449
+ [🚎9-t-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffle.yml
450
+ [🚎9-t-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/truffle.yml/badge.svg
451
+ [🚎10-j-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby.yml
452
+ [🚎10-j-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/jruby.yml/badge.svg
453
+ [🚎11-c-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/current.yml
454
+ [🚎11-c-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/current.yml/badge.svg
455
+ [🚎12-crh-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/dep-heads.yml
456
+ [🚎12-crh-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/dep-heads.yml/badge.svg
457
+ [🚎13-🔒️-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/locked_deps.yml
458
+ [🚎13-🔒️-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/locked_deps.yml/badge.svg
459
+ [🚎14-🔓️-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/unlocked_deps.yml
460
+ [🚎14-🔓️-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/unlocked_deps.yml/badge.svg
461
+ [🚎15-🪪-wf]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/license-eye.yml
462
+ [🚎15-🪪-wfi]: https://github.com/ruby-oauth/auth-sanitizer/actions/workflows/license-eye.yml/badge.svg
463
+ [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
464
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
465
+ [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
466
+ [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
467
+ [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
468
+ [💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
469
+ [💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
470
+ [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
471
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
472
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
473
+ [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
474
+ [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
475
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
476
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
477
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
478
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
479
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
480
+ [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
481
+ [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
482
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
483
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
484
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
485
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
486
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
487
+ [🤝gh-issues]: https://github.com/ruby-oauth/auth-sanitizer/issues
488
+ [🤝gh-pulls]: https://github.com/ruby-oauth/auth-sanitizer/pulls
489
+ [🤝gl-issues]: https://gitlab.com/ruby-oauth/auth-sanitizer/-/issues
490
+ [🤝gl-pulls]: https://gitlab.com/ruby-oauth/auth-sanitizer/-/merge_requests
491
+ [🤝cb-issues]: https://codeberg.org/ruby-oauth/auth-sanitizer/issues
492
+ [🤝cb-pulls]: https://codeberg.org/ruby-oauth/auth-sanitizer/pulls
493
+ [🤝cb-donate]: https://donate.codeberg.org/
494
+ [🤝contributing]: CONTRIBUTING.md
495
+ [🏀codecov-g]: https://codecov.io/gh/ruby-oauth/auth-sanitizer/graphs/tree.svg
496
+ [🖐contrib-rocks]: https://contrib.rocks
497
+ [🖐contributors]: https://github.com/ruby-oauth/auth-sanitizer/graphs/contributors
498
+ [🖐contributors-img]: https://contrib.rocks/image?repo=ruby-oauth/auth-sanitizer
499
+ [🚎contributors-gl]: https://gitlab.com/ruby-oauth/auth-sanitizer/-/graphs/main
500
+ [🪇conduct]: CODE_OF_CONDUCT.md
501
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
502
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
503
+ [📌semver]: https://semver.org/spec/v2.0.0.html
504
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
505
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
506
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
507
+ [📌changelog]: CHANGELOG.md
508
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
509
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
510
+ [📌gitmoji]: https://gitmoji.dev
511
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
512
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
513
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.134-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
514
+ [🔐security]: SECURITY.md
515
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
516
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
517
+ [📄license]: LICENSE.md
518
+ [📄license-ref]: https://opensource.org/licenses/MIT
519
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
520
+ [📄license-compat]: https://dev.to/galtzo/how-to-check-license-compatibility-41h0
521
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
522
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
523
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
524
+ [🚎yard-current]: http://rubydoc.info/gems/auth-sanitizer
525
+ [🚎yard-head]: https://auth-sanitizer.galtzo.com
526
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
527
+ [💎SHA_checksums]: https://gitlab.com/ruby-oauth/auth-sanitizer/-/tree/main/checksums
528
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
529
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
530
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
531
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
532
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
data/REEK ADDED
@@ -0,0 +1,2 @@
1
+ Error: No such file - is
2
+ Error: No such file - empty
data/RUBOCOP.md ADDED
@@ -0,0 +1,71 @@
1
+ # RuboCop Usage Guide
2
+
3
+ ## Overview
4
+
5
+ A tale of two RuboCop plugin gems.
6
+
7
+ ### RuboCop Gradual
8
+
9
+ This project uses `rubocop_gradual` instead of vanilla RuboCop for code style checking. The `rubocop_gradual` tool allows for gradual adoption of RuboCop rules by tracking violations in a lock file.
10
+
11
+ ### RuboCop LTS
12
+
13
+ This project uses `rubocop-lts` to ensure, on a best-effort basis, compatibility with Ruby >= 1.9.2.
14
+ RuboCop rules are meticulously configured by the `rubocop-lts` family of gems to ensure that a project is compatible with a specific version of Ruby. See: https://rubocop-lts.gitlab.io for more.
15
+
16
+ ## Checking RuboCop Violations
17
+
18
+ To check for RuboCop violations in this project, always use:
19
+
20
+ ```bash
21
+ bundle exec rake rubocop_gradual:check
22
+ ```
23
+
24
+ **Do not use** the standard RuboCop commands like:
25
+ - `bundle exec rubocop`
26
+ - `rubocop`
27
+
28
+ ## Understanding the Lock File
29
+
30
+ The `.rubocop_gradual.lock` file tracks all current RuboCop violations in the project. This allows the team to:
31
+
32
+ 1. Prevent new violations while gradually fixing existing ones
33
+ 2. Track progress on code style improvements
34
+ 3. Ensure CI builds don't fail due to pre-existing violations
35
+
36
+ ## Common Commands
37
+
38
+ - **Check violations**
39
+ - `bundle exec rake rubocop_gradual`
40
+ - `bundle exec rake rubocop_gradual:check`
41
+ - **(Safe) Autocorrect violations, and update lockfile if no new violations**
42
+ - `bundle exec rake rubocop_gradual:autocorrect`
43
+ - **Force update the lock file (w/o autocorrect) to match violations present in code**
44
+ - `bundle exec rake rubocop_gradual:force_update`
45
+
46
+ ## Workflow
47
+
48
+ 1. Before submitting a PR, run `bundle exec rake rubocop_gradual:autocorrect`
49
+ a. or just the default `bundle exec rake`, as autocorrection is a pre-requisite of the default task.
50
+ 2. If there are new violations, either:
51
+ - Fix them in your code
52
+ - Run `bundle exec rake rubocop_gradual:force_update` to update the lock file (only for violations you can't fix immediately)
53
+ 3. Commit the updated `.rubocop_gradual.lock` file along with your changes
54
+
55
+ ## Never add inline RuboCop disables
56
+
57
+ Do not add inline `rubocop:disable` / `rubocop:enable` comments anywhere in the codebase (including specs, except when following the few existing `rubocop:disable` patterns for a rule already being disabled elsewhere in the code). We handle exceptions in two supported ways:
58
+
59
+ - Permanent/structural exceptions: prefer adjusting the RuboCop configuration (e.g., in `.rubocop.yml`) to exclude a rule for a path or file pattern when it makes sense project-wide.
60
+ - Temporary exceptions while improving code: record the current violations in `.rubocop_gradual.lock` via the gradual workflow:
61
+ - `bundle exec rake rubocop_gradual:autocorrect` (preferred; will autocorrect what it can and update the lock only if no new violations were introduced)
62
+ - If needed, `bundle exec rake rubocop_gradual:force_update` (as a last resort when you cannot fix the newly reported violations immediately)
63
+
64
+ In general, treat the rules as guidance to follow; fix violations rather than ignore them. For example, RSpec conventions in this project expect `described_class` to be used in specs that target a specific class under test.
65
+
66
+ ## Benefits of rubocop_gradual
67
+
68
+ - Allows incremental adoption of code style rules
69
+ - Prevents CI failures due to pre-existing violations
70
+ - Provides a clear record of code style debt
71
+ - Enables focused efforts on improving code quality over time
data/SECURITY.md ADDED
@@ -0,0 +1,24 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ | Version | Supported |
6
+ |----------|-----------|
7
+ | 1.latest | ✅ |
8
+
9
+ ## Security contact information
10
+
11
+ To report a security vulnerability, please use the
12
+ [Tidelift security contact](https://tidelift.com/security).
13
+ Tidelift will coordinate the fix and disclosure.
14
+
15
+ More detailed explanation of the process is in [IRP.md][IRP]
16
+
17
+ ## Additional Support
18
+
19
+ If you are interested in support for versions older than the latest release,
20
+ please consider sponsoring the project / maintainer @ https://liberapay.com/pboling/donate,
21
+ or find other sponsorship links in the [README].
22
+
23
+ [README]: README.md
24
+ [IRP]: IRP.md