kettle-dev 1.1.32 → 1.1.34

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