kettle-dev 1.1.32 → 1.1.33

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.
@@ -0,0 +1,521 @@
1
+ | 📍 NOTE |
2
+ |-------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
+ | RubyGems.org was [recently compromised][draper-security] in a [hostile takeover][draper-takeover] about which [many lies][draper-lies] have been told. |
4
+ | I'm in the process of adding warnings to some important gems because I [don't condone the theft][draper-theft] of the bundler and rubygems-update projects. |
5
+ | Once publishing to [gem.coop][gem-coop] is available I will stop publishing to RubyGems.org. |
6
+ | Please see [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
7
+
8
+ [draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
9
+ [draper-takeover]: https://joel.drapper.me/p/ruby-central-takeover/
10
+ [draper-lies]: https://joel.drapper.me/p/ruby-central-fact-check/
11
+ [draper-theft]: https://joel.drapper.me/p/ruby-central/
12
+ [gem-coop]: https://gem.coop
13
+ [martin-ann]: https://martinemde.com/2025/10/05/announcing-gem-coop.html
14
+
15
+ [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-dev Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-dev-i]][🖼️kettle-dev]
16
+
17
+ [🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
18
+ [🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
19
+ [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
20
+ [🖼️ruby-lang]: https://www.ruby-lang.org/
21
+ [🖼️kettle-dev-i]: https://logos.galtzo.com/assets/images/kettle-rb/kettle-dev/avatar-192px.svg
22
+ [🖼️kettle-dev]: https://github.com/kettle-rb/kettle-dev
23
+
24
+ # 🍲 Kettle::Dev
25
+
26
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Legacy][🚎4-lg-wfi]][🚎4-lg-wf] [![CI Unsupported][🚎7-us-wfi]][🚎7-us-wf] [![CI Ancient][🚎1-an-wfi]][🚎1-an-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]
27
+
28
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
29
+
30
+ ---
31
+
32
+ `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.
33
+
34
+ [![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]
35
+
36
+ ## 🌻 Synopsis
37
+
38
+
39
+ ## 💡 Info you can shake a stick at
40
+
41
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
42
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
43
+ | Works with JRuby | ![JRuby 9.1 Compat][💎jruby-9.1i] ![JRuby 9.2 Compat][💎jruby-9.2i] ![JRuby 9.3 Compat][💎jruby-9.3i] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎10-j-wf] [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
44
+ | Works with Truffle Ruby | ![Truffle Ruby 22.3 Compat][💎truby-22.3i] ![Truffle Ruby 23.0 Compat][💎truby-23.0i] <br/> [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
45
+ | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎4-lg-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎6-s-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
46
+ | Works with MRI Ruby 2 | ![Ruby 2.0 Compat][💎ruby-2.0i] ![Ruby 2.1 Compat][💎ruby-2.1i] ![Ruby 2.2 Compat][💎ruby-2.2i] <br/> [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎1-an-wf] [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎1-an-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎1-an-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎7-us-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎7-us-wf] |
47
+ | Works with MRI Ruby 1 | ![Ruby 1.8 Compat][💎ruby-1.8i] ![Ruby 1.9 Compat][💎ruby-1.9i] |
48
+ | 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] |
49
+ | 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] |
50
+ | 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] |
51
+ | 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] |
52
+ | 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] |
53
+ | 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] |
54
+ | `...` 💖 | [![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] |
55
+
56
+ ### Compatibility
57
+
58
+ Compatible with MRI Ruby {K_D_MIN_RUBY}+, and concordant releases of JRuby, and TruffleRuby.
59
+
60
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
61
+ |------------------------------------------------|--------------------------------------------------------|
62
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
63
+
64
+ ### Federated DVCS
65
+
66
+ <details>
67
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
68
+
69
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
70
+ |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
71
+ | 🧪 [kettle-rb/kettle-dev on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
72
+ | 🧊 [kettle-rb/kettle-dev on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
73
+ | 🐙 [kettle-rb/kettle-dev on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
74
+ | 🎮️ [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] |
75
+
76
+ </details>
77
+
78
+ [gh-discussions]: https://github.com/kettle-rb/kettle-dev/discussions
79
+
80
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/kettle-dev)](https://tidelift.com/subscription/pkg/rubygems-kettle-dev?utm_source=rubygems-kettle-dev&utm_medium=referral&utm_campaign=readme)
81
+
82
+ Available as part of the Tidelift Subscription.
83
+
84
+ <details>
85
+ <summary>Need enterprise-level guarantees?</summary>
86
+
87
+ 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.
88
+
89
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
90
+
91
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
92
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
93
+ - 💡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
94
+
95
+ Alternatively:
96
+
97
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
98
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
99
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
100
+
101
+ </details>
102
+
103
+ ## ✨ Installation
104
+
105
+ Install the gem and add to the application's Gemfile by executing:
106
+
107
+ ```console
108
+ bundle add kettle-dev
109
+ ```
110
+
111
+ If bundler is not being used to manage dependencies, install the gem by executing:
112
+
113
+ ```console
114
+ gem install kettle-dev
115
+ ```
116
+
117
+ ### 🔒 Secure Installation
118
+
119
+ <details>
120
+ <summary>For Medium or High Security Installations</summary>
121
+
122
+ This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
123
+ [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
124
+ by following the instructions below.
125
+
126
+ Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
127
+
128
+ ```console
129
+ gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
130
+ ```
131
+
132
+ You only need to do that once. Then proceed to install with:
133
+
134
+ ```console
135
+ gem install kettle-dev -P HighSecurity
136
+ ```
137
+
138
+ The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
139
+
140
+ If you want to up your security game full-time:
141
+
142
+ ```console
143
+ bundle config set --global trust-policy MediumSecurity
144
+ ```
145
+
146
+ `MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
147
+
148
+ NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
149
+
150
+ </details>
151
+
152
+ ## ⚙️ Configuration
153
+
154
+
155
+ ## 🔧 Basic Usage
156
+
157
+
158
+ ## 🦷 FLOSS Funding
159
+
160
+ While kettle-rb tools are free software and will always be, the project would benefit immensely from some funding.
161
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
162
+
163
+ We welcome both individual and corporate sponsors! We also offer a
164
+ wide array of funding channels to account for your preferences.
165
+ Currently, [GitHub Sponsors][🖇sponsor], and [Liberapay][⛳liberapay] are our preferred funding platforms.
166
+
167
+ **If you're working in a company that's making significant use of kettle-rb tools we'd
168
+ appreciate it if you suggest to your company to become a kettle-rb sponsor.**
169
+
170
+ You can support the development of kettle-rb tools via
171
+ [GitHub Sponsors][🖇sponsor],
172
+ [Liberapay][⛳liberapay],
173
+ [PayPal][🖇paypal],
174
+ and [Tidelift][🏙️entsup-tidelift].
175
+
176
+ | 📍 NOTE |
177
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
178
+ | 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. |
179
+
180
+ ### Another way to support open-source
181
+
182
+ > How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
183
+ >—Anne Frank
184
+
185
+ 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 — totaling 79 hours of FLOSS coding over just the past seven days, a pretty regular week for me. 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).
186
+
187
+ 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`.
188
+
189
+ 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.
190
+
191
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
192
+
193
+ [![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 or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
194
+
195
+ ## 🔐 Security
196
+
197
+ See [SECURITY.md][🔐security].
198
+
199
+ ## 🤝 Contributing
200
+
201
+ If you need some ideas of where to help, you could work on adding more code coverage,
202
+ or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
203
+ or use the gem and think about how it could be better.
204
+
205
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
206
+
207
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
208
+
209
+ ### 🚀 Release Instructions
210
+
211
+ See [CONTRIBUTING.md][🤝contributing].
212
+
213
+ ### Code Coverage
214
+
215
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
216
+
217
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
218
+
219
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
220
+
221
+ ### 🪇 Code of Conduct
222
+
223
+ Everyone interacting with this project's codebases, issue trackers,
224
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
225
+
226
+ ## 🌈 Contributors
227
+
228
+ [![Contributors][🖐contributors-img]][🖐contributors]
229
+
230
+ Made with [contributors-img][🖐contrib-rocks].
231
+
232
+ Also see GitLab Contributors: [https://gitlab.com/kettle-rb/kettle-dev/-/graphs/main][🚎contributors-gl]
233
+
234
+ <details>
235
+ <summary>⭐️ Star History</summary>
236
+
237
+ <a href="https://star-history.com/#kettle-rb/kettle-dev&Date">
238
+ <picture>
239
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kettle-rb/kettle-dev&type=Date&theme=dark" />
240
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kettle-rb/kettle-dev&type=Date" />
241
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kettle-rb/kettle-dev&type=Date" />
242
+ </picture>
243
+ </a>
244
+
245
+ </details>
246
+
247
+ ## 📌 Versioning
248
+
249
+ This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
250
+ Violations of this scheme should be reported as bugs.
251
+ Specifically, if a minor or patch version is released that breaks backward compatibility,
252
+ a new version should be immediately released that restores compatibility.
253
+ Breaking changes to the public API will only be introduced with new major versions.
254
+
255
+ > dropping support for a platform is both obviously and objectively a breaking change <br/>
256
+ >—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
257
+
258
+ I understand that policy doesn't work universally ("exceptions to every rule!"),
259
+ but it is the policy here.
260
+ As such, in many cases it is good to specify a dependency on this library using
261
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
262
+
263
+ For example:
264
+
265
+ ```ruby
266
+ spec.add_dependency("kettle-dev", "~> 1.0")
267
+ ```
268
+
269
+ <details>
270
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
271
+
272
+ SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
273
+ is a *breaking change* to an API.
274
+ It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
275
+
276
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
277
+ read this article from the creator of SemVer:
278
+
279
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
280
+
281
+ </details>
282
+
283
+ See [CHANGELOG.md][📌changelog] for a list of releases.
284
+
285
+ ## 📄 License
286
+
287
+ The gem is available as open source under the terms of
288
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
289
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
290
+
291
+ ### © Copyright
292
+
293
+ <ul>
294
+ <li>
295
+ Copyright (c) 2023, 2025 Peter H. Boling, of
296
+ <a href="https://discord.gg/3qme4XHNKN">
297
+ Galtzo.com
298
+ <picture>
299
+ <img src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px-blank.svg" alt="Galtzo.com Logo (Wordless) by Aboling0, CC BY-SA 4.0" width="24">
300
+ </picture>
301
+ </a>, and kettle-dev contributors.
302
+ </li>
303
+ </ul>
304
+
305
+ ## 🤑 A request for help
306
+
307
+ Maintainers have teeth and need to pay their dentists.
308
+ After getting laid off in an RIF in March and filled with many dozens of rejections,
309
+ I'm now spending ~60+ hours a week building open source tools.
310
+ I'm hoping to be able to pay for my kids' health insurance this month,
311
+ so if you value the work I am doing, I need your support.
312
+ Please consider sponsoring me or the project.
313
+
314
+ To join the community or get help 👇️ Join the Discord.
315
+
316
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
317
+
318
+ To say "thanks!" ☝️ Join the Discord or 👇️ send money.
319
+
320
+ [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
321
+
322
+ ### Please give the project a star ⭐ ♥.
323
+
324
+ Thanks for RTFM. ☺️
325
+
326
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
327
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
328
+ [⛳liberapay]: https://liberapay.com/pboling/donate
329
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
330
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
331
+ [🖇sponsor]: https://github.com/sponsors/pboling
332
+ [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
333
+ [🖇polar]: https://polar.sh/pboling
334
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
335
+ [🖇kofi]: https://ko-fi.com/O5O86SNP4
336
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
337
+ [🖇patreon]: https://patreon.com/galtzo
338
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
339
+ [🖇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
340
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
341
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
342
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
343
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
344
+ [🖇floss-funding.dev]: https://floss-funding.dev
345
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
346
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
347
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
348
+ [✉️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
349
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
350
+
351
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
352
+ [⛳️gem-namespace]: https://github.com/kettle-rb/kettle-dev
353
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Kettle::Dev-3C2D2D.svg?style=square&logo=ruby&logoColor=white
354
+ [⛳️gem-name]: https://bestgems.org/gems/kettle-dev
355
+ [⛳️name-img]: https://img.shields.io/badge/name-kettle--dev-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
356
+ [⛳️tag-img]: https://img.shields.io/github/tag/kettle-rb/kettle-dev.svg
357
+ [⛳️tag]: http://github.com/kettle-rb/kettle-dev/releases
358
+ [🚂maint-blog]: http://www.railsbling.com/tags/kettle-dev
359
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
360
+ [🚂maint-contact]: http://www.railsbling.com/contact
361
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
362
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
363
+ [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
364
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
365
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
366
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
367
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
368
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
369
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
370
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
371
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
372
+ [💖🌳linktree]: https://linktr.ee/galtzo
373
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
374
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
375
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
376
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
377
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
378
+ [💖🧊berg]: https://codeberg.org/pboling
379
+ [💖🐙hub]: https://github.org/pboling
380
+ [💖🛖hut]: https://sr.ht/~galtzo/
381
+ [💖🧪lab]: https://gitlab.com/pboling
382
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
383
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
384
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
385
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
386
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-kettle-dev?utm_source=rubygems-kettle-dev&utm_medium=referral&utm_campaign=readme
387
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
388
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
389
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
390
+ [🚂railsbling]: http://www.railsbling.com
391
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
392
+ [📜src-gl]: https://gitlab.com/kettle-rb/kettle-dev/
393
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
394
+ [📜src-cb]: https://codeberg.org/kettle-rb/kettle-dev
395
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
396
+ [📜src-gh]: https://github.com/kettle-rb/kettle-dev
397
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
398
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
399
+ [📜gl-wiki]: https://gitlab.com/kettle-rb/kettle-dev/-/wikis/home
400
+ [📜gh-wiki]: https://github.com/kettle-rb/kettle-dev/wiki
401
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
402
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
403
+ [👽dl-rank]: https://bestgems.org/gems/kettle-dev
404
+ [👽dl-ranki]: https://img.shields.io/gem/rd/kettle-dev.svg
405
+ [👽oss-help]: https://www.codetriage.com/kettle-rb/kettle-dev
406
+ [👽oss-helpi]: https://www.codetriage.com/kettle-rb/kettle-dev/badges/users.svg
407
+ [👽version]: https://bestgems.org/gems/kettle-dev
408
+ [👽versioni]: https://img.shields.io/gem/v/kettle-dev.svg
409
+ [🏀qlty-mnt]: https://qlty.sh/gh/kettle-rb/projects/kettle-dev
410
+ [🏀qlty-mnti]: https://qlty.sh/gh/kettle-rb/projects/kettle-dev/maintainability.svg
411
+ [🏀qlty-cov]: https://qlty.sh/gh/kettle-rb/projects/kettle-dev/metrics/code?sort=coverageRating
412
+ [🏀qlty-covi]: https://qlty.sh/gh/kettle-rb/projects/kettle-dev/coverage.svg
413
+ [🏀codecov]: https://codecov.io/gh/kettle-rb/kettle-dev
414
+ [🏀codecovi]: https://codecov.io/gh/kettle-rb/kettle-dev/graph/badge.svg
415
+ [🏀coveralls]: https://coveralls.io/github/kettle-rb/kettle-dev?branch=main
416
+ [🏀coveralls-img]: https://coveralls.io/repos/github/kettle-rb/kettle-dev/badge.svg?branch=main
417
+ [🖐codeQL]: https://github.com/kettle-rb/kettle-dev/security/code-scanning
418
+ [🖐codeQL-img]: https://github.com/kettle-rb/kettle-dev/actions/workflows/codeql-analysis.yml/badge.svg
419
+ [🚎1-an-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/ancient.yml
420
+ [🚎1-an-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/ancient.yml/badge.svg
421
+ [🚎2-cov-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/coverage.yml
422
+ [🚎2-cov-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/coverage.yml/badge.svg
423
+ [🚎3-hd-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/heads.yml
424
+ [🚎3-hd-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/heads.yml/badge.svg
425
+ [🚎4-lg-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/legacy.yml
426
+ [🚎4-lg-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/legacy.yml/badge.svg
427
+ [🚎5-st-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/style.yml
428
+ [🚎5-st-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/style.yml/badge.svg
429
+ [🚎6-s-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/supported.yml
430
+ [🚎6-s-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/supported.yml/badge.svg
431
+ [🚎7-us-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/unsupported.yml
432
+ [🚎7-us-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/unsupported.yml/badge.svg
433
+ [🚎8-ho-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/hoary.yml
434
+ [🚎8-ho-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/hoary.yml/badge.svg
435
+ [🚎9-t-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/truffle.yml
436
+ [🚎9-t-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/truffle.yml/badge.svg
437
+ [🚎10-j-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/jruby.yml
438
+ [🚎10-j-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/jruby.yml/badge.svg
439
+ [🚎11-c-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml
440
+ [🚎11-c-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml/badge.svg
441
+ [🚎12-crh-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/dep-heads.yml
442
+ [🚎12-crh-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/dep-heads.yml/badge.svg
443
+ [🚎13-🔒️-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/locked_deps.yml
444
+ [🚎13-🔒️-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/locked_deps.yml/badge.svg
445
+ [🚎14-🔓️-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/unlocked_deps.yml
446
+ [🚎14-🔓️-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/unlocked_deps.yml/badge.svg
447
+ [🚎15-🪪-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/license-eye.yml
448
+ [🚎15-🪪-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/license-eye.yml/badge.svg
449
+ [💎ruby-1.8i]: https://img.shields.io/badge/Ruby-1.8_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
450
+ [💎ruby-1.9i]: https://img.shields.io/badge/Ruby-1.9_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
451
+ [💎ruby-2.0i]: https://img.shields.io/badge/Ruby-2.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
452
+ [💎ruby-2.1i]: https://img.shields.io/badge/Ruby-2.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
453
+ [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
454
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
455
+ [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
456
+ [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
457
+ [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
458
+ [💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
459
+ [💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
460
+ [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
461
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
462
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
463
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
464
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
465
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
466
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
467
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
468
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
469
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
470
+ [💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
471
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
472
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
473
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
474
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
475
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
476
+ [🤝gh-issues]: https://github.com/kettle-rb/kettle-dev/issues
477
+ [🤝gh-pulls]: https://github.com/kettle-rb/kettle-dev/pulls
478
+ [🤝gl-issues]: https://gitlab.com/kettle-rb/kettle-dev/-/issues
479
+ [🤝gl-pulls]: https://gitlab.com/kettle-rb/kettle-dev/-/merge_requests
480
+ [🤝cb-issues]: https://codeberg.org/kettle-rb/kettle-dev/issues
481
+ [🤝cb-pulls]: https://codeberg.org/kettle-rb/kettle-dev/pulls
482
+ [🤝cb-donate]: https://donate.codeberg.org/
483
+ [🤝contributing]: CONTRIBUTING.md
484
+ [🏀codecov-g]: https://codecov.io/gh/kettle-rb/kettle-dev/graphs/tree.svg
485
+ [🖐contrib-rocks]: https://contrib.rocks
486
+ [🖐contributors]: https://github.com/kettle-rb/kettle-dev/graphs/contributors
487
+ [🖐contributors-img]: https://contrib.rocks/image?repo=kettle-rb/kettle-dev
488
+ [🚎contributors-gl]: https://gitlab.com/kettle-rb/kettle-dev/-/graphs/main
489
+ [🪇conduct]: CODE_OF_CONDUCT.md
490
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
491
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
492
+ [📌semver]: https://semver.org/spec/v2.0.0.html
493
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
494
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
495
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
496
+ [📌changelog]: CHANGELOG.md
497
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
498
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
499
+ [📌gitmoji]:https://gitmoji.dev
500
+ [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
501
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
502
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.076-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
503
+ [🔐security]: SECURITY.md
504
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
505
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
506
+ [📄license]: LICENSE.txt
507
+ [📄license-ref]: https://opensource.org/licenses/MIT
508
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
509
+ [📄license-compat]: https://dev.to/galtzo/how-to-check-license-compatibility-41h0
510
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
511
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
512
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
513
+ [🚎yard-current]: http://rubydoc.info/gems/kettle-dev
514
+ [🚎yard-head]: https://kettle-dev.galtzo.com
515
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
516
+ [💎SHA_checksums]: https://gitlab.com/kettle-rb/kettle-dev/-/tree/main/checksums
517
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
518
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
519
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
520
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
521
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
data/REEK CHANGED
@@ -1,2 +0,0 @@
1
- Bundler is using a binstub that was created for a different gem (reek).
2
- You should run `bundle binstub flag_shih_tzu` to work around a system/bundle conflict.
data/Rakefile.example CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # kettle-dev Rakefile v1.1.32 - 2025-10-07
3
+ # kettle-dev Rakefile v1.1.33 - 2025-10-13
4
4
  # Ruby 2.3 (Safe Navigation) or higher required
5
5
  #
6
6
  # MIT License (see License.txt)
@@ -1 +1,5 @@
1
1
  # Optional dependencies are not depended on directly, but may be used if present.
2
+
3
+ # Required for kettle-pre-release
4
+ # URL parsing with Unicode support (falls back to URI if not available)
5
+ gem "addressable", ">= 2.8", "< 3" # ruby >= 2.2
@@ -99,29 +99,30 @@ module Kettle
99
99
 
100
100
  # Funding org (Open Collective handle) detection.
101
101
  # Precedence:
102
- # 1) ENV["FUNDING_ORG"] when set:
103
- # - value "false" (any case) disables funding (nil)
104
- # - otherwise use the value verbatim
105
- # 2) OpenCollectiveConfig.handle(required: false)
102
+ # 1) TemplateHelpers.opencollective_disabled? - when true, funding_org is nil
103
+ # 2) ENV["FUNDING_ORG"] when set and non-empty (unless already disabled above)
104
+ # 3) OpenCollectiveConfig.handle(required: false)
106
105
  # Be lenient: allow nil when not discoverable, with a concise warning.
107
106
  begin
108
- env_funding = ENV["FUNDING_ORG"]
109
- if env_funding && !env_funding.to_s.strip.empty?
110
- funding_org = if env_funding.to_s.strip.casecmp("false").zero?
111
- nil
112
- else
113
- env_funding.to_s
114
- end
107
+ # Check if Open Collective is explicitly disabled via environment variables
108
+ if TemplateHelpers.opencollective_disabled?
109
+ funding_org = nil
115
110
  else
116
- # Preflight: if a YAML exists under the provided root, attempt to read it here so
117
- # unexpected file IO errors surface within this rescue block (see specs).
118
- oc_path = OpenCollectiveConfig.yaml_path(root)
119
- File.read(oc_path) if File.file?(oc_path)
111
+ env_funding = ENV["FUNDING_ORG"]
112
+ if env_funding && !env_funding.to_s.strip.empty?
113
+ # FUNDING_ORG is set and non-empty; use it as-is (already filtered by opencollective_disabled?)
114
+ funding_org = env_funding.to_s
115
+ else
116
+ # Preflight: if a YAML exists under the provided root, attempt to read it here so
117
+ # unexpected file IO errors surface within this rescue block (see specs).
118
+ oc_path = OpenCollectiveConfig.yaml_path(root)
119
+ File.read(oc_path) if File.file?(oc_path)
120
120
 
121
- funding_org = OpenCollectiveConfig.handle(required: false, root: root)
122
- if funding_org.to_s.strip.empty?
123
- Kernel.warn("kettle-dev: Could not determine funding org.\n - Options:\n * Set ENV['FUNDING_ORG'] to your funding handle, or 'false' to disable.\n * Or set ENV['OPENCOLLECTIVE_HANDLE'].\n * Or add .opencollective.yml with: collective: <handle> (or org: <handle>).\n * Or proceed without funding if not applicable.")
124
- funding_org = nil
121
+ funding_org = OpenCollectiveConfig.handle(required: false, root: root)
122
+ if funding_org.to_s.strip.empty?
123
+ Kernel.warn("kettle-dev: Could not determine funding org.\n - Options:\n * Set ENV['FUNDING_ORG'] to your funding handle, or 'false' to disable.\n * Or set ENV['OPENCOLLECTIVE_HANDLE'].\n * Or add .opencollective.yml with: collective: <handle> (or org: <handle>).\n * Or proceed without funding if not applicable.")
124
+ funding_org = nil
125
+ end
125
126
  end
126
127
  end
127
128
  rescue StandardError => error