kettle-dev 1.0.10 → 1.0.11

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 CHANGED
@@ -33,6 +33,12 @@ Then, add to your `Rakefile`:
33
33
  require "kettle/dev"
34
34
  ```
35
35
 
36
+ Then run:
37
+
38
+ ```console
39
+ bundle exec rake kettle:dev:install
40
+ ```
41
+
36
42
  Now you have many powerful development and testing tools at your disposal, all fully [documented](#-configuration) and tested.
37
43
 
38
44
  I expect the current release of this gem to be compatible with Ruby 2.3+,
@@ -49,12 +55,12 @@ and concordant releases of JRuby, and TruffleRuby.
49
55
  <details>
50
56
  <summary>Find this repo on other forges (Coming soon!)</summary>
51
57
 
52
- | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
53
- |-------------------------------------------------------|-------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
58
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
59
+ |-------------------------------------------------|-------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
54
60
  | 🧪 [kettle-rb/kettle-dev on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜wiki] | 🏀 Tiny Matrix | ➖ |
55
61
  | 🧊 [kettle-rb/kettle-dev on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
56
- | 🐙 [kettle-rb/kettle-dev on GitHub][📜src-gh] | A Dirty Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | ➖ | 💯 Full Matrix | [💚][gh-discussions] |
57
- | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
62
+ | 🐙 [kettle-rb/kettle-dev on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | ➖ | 💯 Full Matrix | [💚][gh-discussions] |
63
+ | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
58
64
 
59
65
  </details>
60
66
 
@@ -81,8 +87,8 @@ Alternatively:
81
87
 
82
88
  | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
83
89
  |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
84
- | 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] |
85
- | Works with Truffle Ruby | ![Truffle Ruby 22.3 Compat][💎truby-22.3i] <br/> [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎9-t-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
90
+ | 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] |
91
+ | 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] |
86
92
  | 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] |
87
93
  | 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] |
88
94
  | Works with MRI Ruby 1 | ![Ruby 1.9 Compat][💎ruby-1.9i] |
@@ -157,14 +163,37 @@ Add to your `Rakefile`:
157
163
  require "kettle/dev"
158
164
  ```
159
165
 
160
- That’s it. When installed, kettle-dev:
166
+ Then run:
167
+
168
+ ```console
169
+ bundle exec rake kettle:dev:install
170
+ ```
171
+
172
+ If git status is not clean it will abort.
173
+ It may have some prompts, which can mostly be avoided by running with options:
174
+
175
+ ```console
176
+ # DANGER: options to reduce prompts will overwrite files without asking.
177
+ bundle exec rake kettle:dev:install allowed=true force=true
178
+ ```
179
+
180
+ Hopefully, all the files that get overwritten are tracked in git!
181
+ I wrote this for myself, and it fits my patterns of development.
182
+
183
+ The install task will write a report at the end with:
184
+ 1. A file list summary of the changes made.
185
+ 2. Next steps for using the tools.
186
+ 3. A warning about .env.local (DO NOT COMMIT IT, as it will likely have secrets added)
187
+
188
+ That’s it. Once installed, kettle-dev:
161
189
  - Registers RuboCop-LTS tasks and wires your default Rake task to run the gradual linter.
162
190
  - Locally: default task prefers `rubocop_gradual:autocorrect`.
163
191
  - On CI (`CI=true`): default task prefers `rubocop_gradual:check`.
164
192
  - Integrates optional coverage tasks via kettle-soup-cover (enabled locally when present).
165
193
  - Adds gem-shipped Rake tasks from `lib/kettle/dev/rakelib`, including:
166
194
  - `ci:act` — interactive selector for running GitHub Actions workflows via `act`.
167
- - `kettle:dev:install` — copies this repo’s .github automation and offers to install .git-hooks templates.
195
+ - `kettle:dev:install` — copies this repo’s .github automation, offers to install .git-hooks templates, and overwrites many files in your project.
196
+ - Grapheme syncing: detects the grapheme (e.g., emoji) immediately following the first `#` H1 in README.md and ensures the same grapheme, followed by a single space, prefixes both `spec.summary` and `spec.description` in your gemspec. If the H1 has none, you’ll be prompted to enter one; tests use an input adapter, so runs never hang in CI.
168
197
  - option: force: When truthy (1, true, y, yes), treat all y/N prompts as Yes. Useful for non-interactive runs or to accept defaults quickly. Example: `bundle exec rake kettle:dev:template force=true`
169
198
  - option: allowed: When truthy (1, true, y, yes), resume task after you have reviewed `.envrc`/`.env.local` and run `direnv allow`. If either file is created or updated, the task will abort with instructions unless `allowed=true` is present. Example: `bundle exec rake kettle:dev:install allowed=true`
170
199
  - `kettle:dev:template` — templates files from this gem into your project (e.g., .github workflows, .devcontainer, .qlty, modular Gemfiles, README/CONTRIBUTING stubs). You can run this independently to refresh templates without the extra install prompts.
@@ -261,6 +290,15 @@ Project automation bootstrap
261
290
  - `bundle binstubs kettle-dev --path bin`
262
291
  - Add to `.envrc`: `PATH_add bin` (so `bin/` tools run without the prefix)
263
292
 
293
+ ### Template .example files are preferred
294
+
295
+ - The templating step dynamically prefers any `*.example` file present in this gem’s templates. When a `*.example` exists alongside the non-example template, the `.example` content is used, and the destination file is written without the `.example` suffix.
296
+ - This applies across all templated files, including:
297
+ - Root files like `.gitlab-ci.yml` (copied from `.gitlab-ci.yml.example` when present).
298
+ - Nested files like `.github/workflows/coverage.yml` (copied from `.github/workflows/coverage.yml.example` when present).
299
+ - This behavior is automatic for any future `*.example` files added to the templates.
300
+ - Exception: `.env.local` is handled specially for safety. Regardless of whether the template provides `.env.local` or `.env.local.example`, the installer copies it to `.env.local.example` in your project, and will never create or overwrite `.env.local`.
301
+
264
302
  Releasing (maintainers)
265
303
  - `exe/kettle-release` — guided release helper that:
266
304
  - Runs sanity checks (`bin/setup`, `bin/rake`), confirms version/changelog, optionally updates Appraisals, commits “🔖 Prepare release vX.Y.Z”.
@@ -623,7 +661,7 @@ Thanks for RTFM. ☺️
623
661
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
624
662
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
625
663
  [💎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
626
- [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
664
+ [💎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
627
665
  [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
628
666
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
629
667
  [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
data/README.md.example ADDED
@@ -0,0 +1,515 @@
1
+ [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-dev Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-dev-i]][🖼️kettle-dev]
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
+ [🖼️kettle-dev-i]: https://logos.galtzo.com/assets/images/kettle-rb/kettle-dev/avatar-192px.svg
8
+ [🖼️kettle-dev]: https://github.com/kettle-rb/kettle-dev
9
+
10
+ # 🍲 Kettle::Dev
11
+
12
+ [![Version][👽versioni]][👽version] [![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 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]
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
+ OTOH, if `ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS is now my full-time job.
19
+
20
+ [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![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]
21
+
22
+ ## 🌻 Synopsis
23
+
24
+
25
+ ## 💡 Info you can shake a stick at
26
+
27
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
28
+ |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
29
+ | 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] |
30
+ | 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] |
31
+ | 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] |
32
+ | 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] |
33
+ | Works with MRI Ruby 1 | ![Ruby 1.8 Compat][💎ruby-1.8i] ![Ruby 1.9 Compat][💎ruby-1.9i] |
34
+ | 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] |
35
+ | 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] [![Wiki][📜wiki-img]][📜wiki] |
36
+ | Compliance | [![License: MIT][📄license-img]][📄license-ref] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
37
+ | 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] |
38
+ | Support | [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
39
+ | 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] |
40
+ | `...` 💖 | [![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] |
41
+
42
+ ### Compatibility
43
+
44
+ Compatible with Ruby 2.3+, and concordant releases of JRuby, and TruffleRuby.
45
+
46
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 |
47
+ |------------------------------------------------|-------------------------------------------------------------------------------------|
48
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
49
+
50
+ ### Federated DVCS
51
+
52
+ <details>
53
+ <summary>Find this repo on other forges (Coming soon!)</summary>
54
+
55
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
56
+ |-------------------------------------------------|-------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
57
+ | 🧪 [kettle-rb/kettle-dev on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜wiki] | 🏀 Tiny Matrix | ➖ |
58
+ | 🧊 [kettle-rb/kettle-dev on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
59
+ | 🐙 [kettle-rb/kettle-dev on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | ➖ | 💯 Full Matrix | [💚][gh-discussions] |
60
+ | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
61
+
62
+ </details>
63
+
64
+ [gh-discussions]: https://github.com/kettle-rb/kettle-dev/discussions
65
+
66
+ ### 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)
67
+
68
+ <details>
69
+ <summary>Need enterprise-level guarantees?</summary>
70
+
71
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
72
+
73
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
74
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
75
+ - 💡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
76
+
77
+ Alternatively:
78
+
79
+ - [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
80
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
81
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
82
+
83
+ </details>
84
+
85
+ ## ✨ Installation
86
+
87
+ Install the gem and add to the application's Gemfile by executing:
88
+
89
+ ```console
90
+ bundle add kettle-dev
91
+ ```
92
+
93
+ If bundler is not being used to manage dependencies, install the gem by executing:
94
+
95
+ ```console
96
+ gem install kettle-dev
97
+ ```
98
+
99
+ ### 🔒 Secure Installation
100
+
101
+ <details>
102
+ <summary>For Medium or High Security Installations</summary>
103
+
104
+ This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
105
+ [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
106
+ by following the instructions below.
107
+
108
+ Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
109
+
110
+ ```console
111
+ gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
112
+ ```
113
+
114
+ You only need to do that once. Then proceed to install with:
115
+
116
+ ```console
117
+ gem install kettle-dev -P HighSecurity
118
+ ```
119
+
120
+ The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
121
+
122
+ If you want to up your security game full-time:
123
+
124
+ ```console
125
+ bundle config set --global trust-policy MediumSecurity
126
+ ```
127
+
128
+ `MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
129
+
130
+ NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
131
+
132
+ </details>
133
+
134
+ ## ⚙️ Configuration
135
+
136
+
137
+ ## 🔧 Basic Usage
138
+
139
+
140
+ ## 🦷 FLOSS Funding
141
+
142
+ While kettle-rb tools are free software and will always be, the project would benefit immensely from some funding.
143
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
144
+
145
+ We welcome both individual and corporate sponsors! We also offer a
146
+ wide array of funding channels to account for your preferences
147
+ (although currently [Open Collective][🖇osc] is our preferred funding platform).
148
+
149
+ **If you're working in a company that's making significant use of kettle-rb tools we'd
150
+ appreciate it if you suggest to your company to become a kettle-rb sponsor.**
151
+
152
+ You can support the development of kettle-rb tools via
153
+ [GitHub Sponsors][🖇sponsor],
154
+ [Liberapay][⛳liberapay],
155
+ [PayPal][🖇paypal],
156
+ [Open Collective][🖇osc]
157
+ and [Tidelift][🏙️entsup-tidelift].
158
+
159
+ | 📍 NOTE |
160
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
161
+ | 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. |
162
+
163
+ ### Open Collective for Individuals
164
+
165
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
166
+ No backers yet. Be the first!
167
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
168
+
169
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/kettle-rb#backer)]
170
+
171
+ ### Open Collective for Organizations
172
+
173
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
174
+ No sponsors yet. Be the first!
175
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
176
+
177
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/kettle-rb#sponsor)]
178
+
179
+ ### Another way to support open-source
180
+
181
+ > How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
182
+ >—Anne Frank
183
+
184
+ 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).
185
+
186
+ 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`.
187
+
188
+ 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.
189
+
190
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
191
+
192
+ [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![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]
193
+
194
+ ## 🔐 Security
195
+
196
+ See [SECURITY.md][🔐security].
197
+
198
+ ## 🤝 Contributing
199
+
200
+ If you need some ideas of where to help, you could work on adding more code coverage,
201
+ or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
202
+ or use the gem and think about how it could be better.
203
+
204
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
205
+
206
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
207
+
208
+ ### 🚀 Release Instructions
209
+
210
+ See [CONTRIBUTING.md][🤝contributing].
211
+
212
+ ### Code Coverage
213
+
214
+ [![Coverage Graph][🔑codecov-g]][🔑codecov]
215
+
216
+ [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
217
+
218
+ [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov]
219
+
220
+ ### 🪇 Code of Conduct
221
+
222
+ Everyone interacting with this project's codebases, issue trackers,
223
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
224
+
225
+ ## 🌈 Contributors
226
+
227
+ [![Contributors][🖐contributors-img]][🖐contributors]
228
+
229
+ Made with [contributors-img][🖐contrib-rocks].
230
+
231
+ Also see GitLab Contributors: [https://gitlab.com/kettle-rb/kettle-dev/-/graphs/main][🚎contributors-gl]
232
+
233
+ <details>
234
+ <summary>⭐️ Star History</summary>
235
+
236
+ <a href="https://star-history.com/#kettle-rb/kettle-dev&Date">
237
+ <picture>
238
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kettle-rb/kettle-dev&type=Date&theme=dark" />
239
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kettle-rb/kettle-dev&type=Date" />
240
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kettle-rb/kettle-dev&type=Date" />
241
+ </picture>
242
+ </a>
243
+
244
+ </details>
245
+
246
+ ## 📌 Versioning
247
+
248
+ This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
249
+ Violations of this scheme should be reported as bugs.
250
+ Specifically, if a minor or patch version is released that breaks backward compatibility,
251
+ a new version should be immediately released that restores compatibility.
252
+ Breaking changes to the public API will only be introduced with new major versions.
253
+
254
+ > dropping support for a platform is both obviously and objectively a breaking change <br/>
255
+ >—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
256
+
257
+ I understand that policy doesn't work universally ("exceptions to every rule!"),
258
+ but it is the policy here.
259
+ As such, in many cases it is good to specify a dependency on this library using
260
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
261
+
262
+ For example:
263
+
264
+ ```ruby
265
+ spec.add_dependency("kettle-dev", "~> 1.0")
266
+ ```
267
+
268
+ <details>
269
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
270
+
271
+ SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
272
+ is a *breaking change* to an API.
273
+ It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
274
+
275
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
276
+ read this article from the creator of SemVer:
277
+
278
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
279
+
280
+ </details>
281
+
282
+ See [CHANGELOG.md][📌changelog] for a list of releases.
283
+
284
+ ## 📄 License
285
+
286
+ The gem is available as open source under the terms of
287
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
288
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
289
+
290
+ ### © Copyright
291
+
292
+ <ul>
293
+ <li>
294
+ Copyright (c) 2023, 2025 Peter H. Boling, of
295
+ <a href="https://discord.gg/3qme4XHNKN">
296
+ Galtzo.com
297
+ <picture>
298
+ <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">
299
+ </picture>
300
+ </a>, and kettle-dev contributors.
301
+ </li>
302
+ </ul>
303
+
304
+ ## 🤑 A request for help
305
+
306
+ Maintainers have teeth, and need to pay their dentists.
307
+ After getting laid off in an RIF in March, and filled with many dozens of rejections,
308
+ I'm now spending ~80 hours a week building open source tools.
309
+ I'm hoping to be able to pay for my kids' health insurance this month,
310
+ so if you value the work I am doing, I need your support.
311
+ Please consider sponsoring me or the project.
312
+
313
+ [![Sponsor kettle-rb/kettle-dev 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-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
314
+
315
+ To say "thanks for maintaining such a great tool" 👇️ Join the Discord or ☝️ send money.
316
+
317
+ To join the community or get help 👇️ Join the Discord.
318
+
319
+ [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
320
+
321
+ ### Please give the project a star ⭐ ♥.
322
+
323
+ Thanks for RTFM. ☺️
324
+
325
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611
326
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
327
+ [⛳liberapay]: https://liberapay.com/pboling/donate
328
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/kettle-rb
329
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/kettle-rb
330
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/kettle-rb
331
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/kettle-rb?style=for-the-badge
332
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/kettle-rb?style=for-the-badge
333
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/kettle-rb?style=for-the-badge
334
+ [🖇osc]: https://opencollective.com/kettle-rb
335
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
336
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
337
+ [🖇sponsor]: https://github.com/sponsors/pboling
338
+ [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg
339
+ [🖇polar]: https://polar.sh/pboling
340
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-✓-a51611.svg
341
+ [🖇kofi]: https://ko-fi.com/O5O86SNP4
342
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg
343
+ [🖇patreon]: https://patreon.com/galtzo
344
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-✓-a51611.svg?style=flat
345
+ [🖇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
346
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
347
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
348
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
349
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
350
+ [🖇floss-funding.dev]: https://floss-funding.dev
351
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
352
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
353
+ [✉️discord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
354
+
355
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
356
+ [⛳️gem-namespace]: https://github.com/kettle-rb/kettle-dev
357
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Kettle%3A%3ADev-3C2D2D.svg?style=square&logo=ruby&logoColor=white
358
+ [⛳️gem-name]: https://rubygems.org/gems/kettle-dev
359
+ [⛳️name-img]: https://img.shields.io/badge/name-kettle--dev-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
360
+ [🚂maint-blog]: http://www.railsbling.com/tags/kettle-dev
361
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
362
+ [🚂maint-contact]: http://www.railsbling.com/contact
363
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
364
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
365
+ [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
366
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling/u/peter-boling
367
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
368
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
369
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
370
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
371
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=flat&logo=mastodon&label=Ruby%20%40galtzo
372
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
373
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
374
+ [💖🌳linktree]: https://linktr.ee/galtzo
375
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
376
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
377
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
378
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
379
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
380
+ [💖🧊berg]: https://codeberg.org/pboling
381
+ [💖🐙hub]: https://github.org/pboling
382
+ [💖🛖hut]: https://sr.ht/~galtzo/
383
+ [💖🧪lab]: https://gitlab.com/pboling
384
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
385
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
386
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
387
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
388
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-kettle-dev?utm_source=rubygems-kettle-dev&utm_medium=referral&utm_campaign=readme
389
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
390
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
391
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
392
+ [🚂railsbling]: http://www.railsbling.com
393
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
394
+ [📜src-gl]: https://gitlab.com/kettle-rb/kettle-dev/
395
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
396
+ [📜src-cb]: https://codeberg.org/kettle-rb/kettle-dev
397
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
398
+ [📜src-gh]: https://github.com/kettle-rb/kettle-dev
399
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
400
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
401
+ [📜wiki]: https://gitlab.com/kettle-rb/kettle-dev/-/wikis/home
402
+ [📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=Wiki&logoColor=white
403
+ [👽dl-rank]: https://rubygems.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://rubygems.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
+ [🚎13-🔒️-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/locked_deps.yml
442
+ [🚎13-🔒️-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/locked_deps.yml/badge.svg
443
+ [🚎14-🔓️-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/unlocked_deps.yml
444
+ [🚎14-🔓️-wfi]: https://github.com/kettle-rb/kettle-dev/actions/workflows/unlocked_deps.yml/badge.svg
445
+ [💎ruby-1.8i]: https://img.shields.io/badge/Ruby-1.8_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
446
+ [💎ruby-1.9i]: https://img.shields.io/badge/Ruby-1.9_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
447
+ [💎ruby-2.0i]: https://img.shields.io/badge/Ruby-2.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
448
+ [💎ruby-2.1i]: https://img.shields.io/badge/Ruby-2.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
449
+ [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
450
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
451
+ [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
452
+ [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
453
+ [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
454
+ [💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
455
+ [💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
456
+ [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
457
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
458
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
459
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
460
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
461
+ [💎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
462
+ [💎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
463
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
464
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
465
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
466
+ [💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
467
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
468
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
469
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
470
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
471
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
472
+ [🤝gh-issues]: https://github.com/kettle-rb/kettle-dev/issues
473
+ [🤝gh-pulls]: https://github.com/kettle-rb/kettle-dev/pulls
474
+ [🤝gl-issues]: https://gitlab.com/kettle-rb/kettle-dev/-/issues
475
+ [🤝gl-pulls]: https://gitlab.com/kettle-rb/kettle-dev/-/merge_requests
476
+ [🤝cb-issues]: https://codeberg.org/kettle-rb/kettle-dev/issues
477
+ [🤝cb-pulls]: https://codeberg.org/kettle-rb/kettle-dev/pulls
478
+ [🤝cb-donate]: https://donate.codeberg.org/
479
+ [🤝contributing]: CONTRIBUTING.md
480
+ [🔑codecov-g]: https://codecov.io/gh/kettle-rb/kettle-dev/graphs/tree.svg
481
+ [🖐contrib-rocks]: https://contrib.rocks
482
+ [🖐contributors]: https://github.com/kettle-rb/kettle-dev/graphs/contributors
483
+ [🖐contributors-img]: https://contrib.rocks/image?repo=kettle-rb/kettle-dev
484
+ [🚎contributors-gl]: https://gitlab.com/kettle-rb/kettle-dev/-/graphs/main
485
+ [🪇conduct]: CODE_OF_CONDUCT.md
486
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
487
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
488
+ [📌semver]: https://semver.org/spec/v2.0.0.html
489
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
490
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
491
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
492
+ [📌changelog]: CHANGELOG.md
493
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
494
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
495
+ [📌gitmoji]:https://gitmoji.dev
496
+ [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20😜%20😍-34495e.svg?style=flat-square
497
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
498
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.725-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
499
+ [🔐security]: SECURITY.md
500
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
501
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
502
+ [📄license]: LICENSE.txt
503
+ [📄license-ref]: https://opensource.org/licenses/MIT
504
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
505
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
506
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
507
+ [🚎yard-current]: http://rubydoc.info/gems/kettle-dev
508
+ [🚎yard-head]: https://rspec-stubbed-env.galtzo.com
509
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
510
+ [💎SHA_checksums]: https://gitlab.com/kettle-rb/kettle-dev/-/tree/main/checksums
511
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
512
+ [💎rlts-img]: https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
513
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
514
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
515
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/