kettle-jem 7.0.0 → 7.1.3

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.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +1505 -0
  4. data/LICENSE.md +13 -0
  5. data/README.md +794 -0
  6. data/exe/kettle-jem +20 -0
  7. data/lib/kettle/jem/cli.rb +334 -0
  8. data/lib/kettle/jem/license_txt_migrator.rb +33 -0
  9. data/lib/kettle/jem/rakelib/install.rake +10 -0
  10. data/lib/kettle/jem/rakelib/prepare.rake +10 -0
  11. data/lib/kettle/jem/rakelib/selftest.rake +10 -0
  12. data/lib/kettle/jem/rakelib/template.rake +10 -0
  13. data/lib/kettle/jem/tasks/install_task.rb +2178 -0
  14. data/lib/kettle/jem/tasks/prepare_task.rb +274 -0
  15. data/lib/kettle/jem/tasks/self_test_task.rb +256 -0
  16. data/lib/kettle/jem/tasks/template_task.rb +124 -0
  17. data/lib/kettle/jem/tasks.rb +6 -0
  18. data/lib/kettle/jem/templates/.aiignore.example +19 -0
  19. data/lib/kettle/jem/templates/.config/mise/env.sh +26 -0
  20. data/lib/kettle/jem/templates/.devcontainer/apt-install/devcontainer-feature.json.example +9 -0
  21. data/lib/kettle/jem/templates/.devcontainer/apt-install/install.sh.example +19 -0
  22. data/lib/kettle/jem/templates/.devcontainer/devcontainer.json.example +27 -0
  23. data/lib/kettle/jem/templates/.devcontainer/scripts/setup-tree-sitter.sh.example +210 -0
  24. data/lib/kettle/jem/templates/.env.local.example +67 -0
  25. data/lib/kettle/jem/templates/.envrc.example +4 -0
  26. data/lib/kettle/jem/templates/.envrc.no-osc.example +4 -0
  27. data/lib/kettle/jem/templates/.gemrc.example +1 -0
  28. data/lib/kettle/jem/templates/.git-hooks/commit-msg.example +60 -0
  29. data/lib/kettle/jem/templates/.git-hooks/commit-subjects-goalie.txt.example +8 -0
  30. data/lib/kettle/jem/templates/.git-hooks/footer-template.erb.txt.example +16 -0
  31. data/lib/kettle/jem/templates/.git-hooks/prepare-commit-msg.example +9 -0
  32. data/lib/kettle/jem/templates/.github/.codecov.yml.example +14 -0
  33. data/lib/kettle/jem/templates/.github/FUNDING.yml.example +10 -0
  34. data/lib/kettle/jem/templates/.github/FUNDING.yml.no-osc.example +10 -0
  35. data/lib/kettle/jem/templates/.github/copilot_instructions.md.example +1 -0
  36. data/lib/kettle/jem/templates/.github/dependabot.yml.example +13 -0
  37. data/lib/kettle/jem/templates/.github/workflows/auto-assign.yml.example +21 -0
  38. data/lib/kettle/jem/templates/.github/workflows/coverage.yml.example +102 -0
  39. data/lib/kettle/jem/templates/.github/workflows/current.yml.example +86 -0
  40. data/lib/kettle/jem/templates/.github/workflows/dep-heads.yml.example +249 -0
  41. data/lib/kettle/jem/templates/.github/workflows/dependency-review.yml.example +22 -0
  42. data/lib/kettle/jem/templates/.github/workflows/discord-notifier.yml.example +39 -0
  43. data/lib/kettle/jem/templates/.github/workflows/framework-ci.yml.example +81 -0
  44. data/lib/kettle/jem/templates/.github/workflows/heads.yml.example +212 -0
  45. data/lib/kettle/jem/templates/.github/workflows/jruby-10.0.yml.example +91 -0
  46. data/lib/kettle/jem/templates/.github/workflows/jruby-9.1.yml.example +90 -0
  47. data/lib/kettle/jem/templates/.github/workflows/jruby-9.2.yml.example +95 -0
  48. data/lib/kettle/jem/templates/.github/workflows/jruby-9.3.yml.example +95 -0
  49. data/lib/kettle/jem/templates/.github/workflows/jruby-9.4.yml.example +95 -0
  50. data/lib/kettle/jem/templates/.github/workflows/jruby.yml.example +91 -0
  51. data/lib/kettle/jem/templates/.github/workflows/license-eye.yml.example +43 -0
  52. data/lib/kettle/jem/templates/.github/workflows/locked_deps.yml.example +89 -0
  53. data/lib/kettle/jem/templates/.github/workflows/opencollective.yml.example +44 -0
  54. data/lib/kettle/jem/templates/.github/workflows/ruby-2.3.yml.example +80 -0
  55. data/lib/kettle/jem/templates/.github/workflows/ruby-2.4.yml.example +84 -0
  56. data/lib/kettle/jem/templates/.github/workflows/ruby-2.5.yml.example +84 -0
  57. data/lib/kettle/jem/templates/.github/workflows/ruby-2.6.yml.example +84 -0
  58. data/lib/kettle/jem/templates/.github/workflows/ruby-2.7.yml.example +84 -0
  59. data/lib/kettle/jem/templates/.github/workflows/ruby-3.0.yml.example +85 -0
  60. data/lib/kettle/jem/templates/.github/workflows/ruby-3.1.yml.example +83 -0
  61. data/lib/kettle/jem/templates/.github/workflows/ruby-3.2.yml.example +80 -0
  62. data/lib/kettle/jem/templates/.github/workflows/ruby-3.3.yml.example +80 -0
  63. data/lib/kettle/jem/templates/.github/workflows/ruby-3.4.yml.example +80 -0
  64. data/lib/kettle/jem/templates/.github/workflows/style.yml.example +78 -0
  65. data/lib/kettle/jem/templates/.github/workflows/templating.yml.example +86 -0
  66. data/lib/kettle/jem/templates/.github/workflows/truffle.yml.example +91 -0
  67. data/lib/kettle/jem/templates/.github/workflows/truffleruby-22.3.yml.example +92 -0
  68. data/lib/kettle/jem/templates/.github/workflows/truffleruby-23.0.yml.example +92 -0
  69. data/lib/kettle/jem/templates/.github/workflows/truffleruby-23.1.yml.example +78 -0
  70. data/lib/kettle/jem/templates/.github/workflows/truffleruby-24.2.yml.example +91 -0
  71. data/lib/kettle/jem/templates/.github/workflows/truffleruby-25.0.yml.example +96 -0
  72. data/lib/kettle/jem/templates/.github/workflows/truffleruby-33.0.yml.example +91 -0
  73. data/lib/kettle/jem/templates/.github/workflows/unlocked_deps.yml.example +93 -0
  74. data/lib/kettle/jem/templates/.gitignore.example +53 -0
  75. data/lib/kettle/jem/templates/.gitlab-ci.yml.example +134 -0
  76. data/lib/kettle/jem/templates/.idea/.gitignore.example +44 -0
  77. data/lib/kettle/jem/templates/.licenserc.yaml.example +8 -0
  78. data/lib/kettle/jem/templates/.opencollective.yml.example +3 -0
  79. data/lib/kettle/jem/templates/.qlty/qlty.toml.example +79 -0
  80. data/lib/kettle/jem/templates/.rspec.example +10 -0
  81. data/lib/kettle/jem/templates/.rubocop.example +1 -0
  82. data/lib/kettle/jem/templates/.rubocop.yml.example +47 -0
  83. data/lib/kettle/jem/templates/.rubocop_rspec.yml.example +55 -0
  84. data/lib/kettle/jem/templates/.simplecov.example +18 -0
  85. data/lib/kettle/jem/templates/.structuredmerge/git-drivers.toml.example +86 -0
  86. data/lib/kettle/jem/templates/.structuredmerge/kettle-jem.yml.example +519 -0
  87. data/lib/kettle/jem/templates/.yard-lint.yml.example +54 -0
  88. data/lib/kettle/jem/templates/.yardignore.example +13 -0
  89. data/lib/kettle/jem/templates/.yardopts.example +14 -0
  90. data/lib/kettle/jem/templates/AGENTS.md.example +283 -0
  91. data/lib/kettle/jem/templates/AGPL-3.0-only.md.example +235 -0
  92. data/lib/kettle/jem/templates/Appraisal.root.gemfile.example +26 -0
  93. data/lib/kettle/jem/templates/Appraisals.example +150 -0
  94. data/lib/kettle/jem/templates/Big-Time-Public-License.md.example +99 -0
  95. data/lib/kettle/jem/templates/CHANGELOG.md.example +33 -0
  96. data/lib/kettle/jem/templates/CHANGELOG.transfer.md +109 -0
  97. data/lib/kettle/jem/templates/CITATION.cff.example +20 -0
  98. data/lib/kettle/jem/templates/CODE_OF_CONDUCT.md.example +134 -0
  99. data/lib/kettle/jem/templates/CONTRIBUTING.md.example +292 -0
  100. data/lib/kettle/jem/templates/FUNDING.md.example +74 -0
  101. data/lib/kettle/jem/templates/FUNDING.md.no-osc.example +63 -0
  102. data/lib/kettle/jem/templates/Gemfile.example +52 -0
  103. data/lib/kettle/jem/templates/IRP.md.example +34 -0
  104. data/lib/kettle/jem/templates/LICENSE.md.example +3 -0
  105. data/lib/kettle/jem/templates/MIT.md.example +21 -0
  106. data/lib/kettle/jem/templates/PolyForm-Noncommercial-1.0.0.md.example +131 -0
  107. data/lib/kettle/jem/templates/PolyForm-Small-Business-1.0.0.md.example +121 -0
  108. data/lib/kettle/jem/templates/README.md.example +544 -0
  109. data/lib/kettle/jem/templates/REEK +0 -0
  110. data/lib/kettle/jem/templates/RUBOCOP.md.example +78 -0
  111. data/lib/kettle/jem/templates/Rakefile.example +163 -0
  112. data/lib/kettle/jem/templates/SECURITY.md.example +21 -0
  113. data/lib/kettle/jem/templates/bin/setup.example +36 -0
  114. data/lib/kettle/jem/templates/certs/pboling.pem.example +27 -0
  115. data/lib/kettle/jem/templates/gem.gemspec.example +161 -0
  116. data/lib/kettle/jem/templates/gemfiles/modular/benchmark/r4/v0.5.gemfile.example +2 -0
  117. data/lib/kettle/jem/templates/gemfiles/modular/benchmark/vHEAD.gemfile.example +2 -0
  118. data/lib/kettle/jem/templates/gemfiles/modular/cgi/r4/v0.5.gemfile.example +1 -0
  119. data/lib/kettle/jem/templates/gemfiles/modular/cgi/vHEAD.gemfile.example +1 -0
  120. data/lib/kettle/jem/templates/gemfiles/modular/changelog.gemfile.example +6 -0
  121. data/lib/kettle/jem/templates/gemfiles/modular/coverage.gemfile.example +14 -0
  122. data/lib/kettle/jem/templates/gemfiles/modular/coverage_local.gemfile.example +34 -0
  123. data/lib/kettle/jem/templates/gemfiles/modular/debug.gemfile.example +22 -0
  124. data/lib/kettle/jem/templates/gemfiles/modular/documentation.gemfile.example +24 -0
  125. data/lib/kettle/jem/templates/gemfiles/modular/documentation_local.gemfile.example +20 -0
  126. data/lib/kettle/jem/templates/gemfiles/modular/erb/r2/v3.0.gemfile.example +1 -0
  127. data/lib/kettle/jem/templates/gemfiles/modular/erb/r2.3/default.gemfile.example +6 -0
  128. data/lib/kettle/jem/templates/gemfiles/modular/erb/r2.6/v2.2.gemfile.example +3 -0
  129. data/lib/kettle/jem/templates/gemfiles/modular/erb/r3/v5.0.gemfile.example +1 -0
  130. data/lib/kettle/jem/templates/gemfiles/modular/erb/r3.1/v4.0.gemfile.example +2 -0
  131. data/lib/kettle/jem/templates/gemfiles/modular/erb/r4/v5.0.gemfile.example +1 -0
  132. data/lib/kettle/jem/templates/gemfiles/modular/erb/vHEAD.gemfile.example +2 -0
  133. data/lib/kettle/jem/templates/gemfiles/modular/json/truffleruby_22_3.gemfile.example +6 -0
  134. data/lib/kettle/jem/templates/gemfiles/modular/json/truffleruby_23_0.gemfile.example +6 -0
  135. data/lib/kettle/jem/templates/gemfiles/modular/json/truffleruby_23_1.gemfile.example +6 -0
  136. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r2/v0.3.gemfile.example +2 -0
  137. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r2.4/v0.1.gemfile.example +3 -0
  138. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r3/v0.3.gemfile.example +2 -0
  139. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r4/v0.3.gemfile.example +2 -0
  140. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/vHEAD.gemfile.example +2 -0
  141. data/lib/kettle/jem/templates/gemfiles/modular/optional.gemfile.example +16 -0
  142. data/lib/kettle/jem/templates/gemfiles/modular/recording/r2.3/recording.gemfile.example +16 -0
  143. data/lib/kettle/jem/templates/gemfiles/modular/recording/r2.4/recording.gemfile.example +18 -0
  144. data/lib/kettle/jem/templates/gemfiles/modular/recording/r2.5/recording.gemfile.example +16 -0
  145. data/lib/kettle/jem/templates/gemfiles/modular/recording/r3/recording.gemfile.example +16 -0
  146. data/lib/kettle/jem/templates/gemfiles/modular/recording/r4/recording.gemfile.example +16 -0
  147. data/lib/kettle/jem/templates/gemfiles/modular/recording/vHEAD.gemfile.example +2 -0
  148. data/lib/kettle/jem/templates/gemfiles/modular/rspec.gemfile.example +4 -0
  149. data/lib/kettle/jem/templates/gemfiles/modular/runtime_heads.gemfile.example +14 -0
  150. data/lib/kettle/jem/templates/gemfiles/modular/shunted.gemfile.example +21 -0
  151. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r2/v3.0.gemfile.example +5 -0
  152. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r2.4/v0.0.2.gemfile.example +4 -0
  153. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r3/v3.0.gemfile.example +5 -0
  154. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r4/v3.0.gemfile.example +5 -0
  155. data/lib/kettle/jem/templates/gemfiles/modular/stringio/vHEAD.gemfile.example +2 -0
  156. data/lib/kettle/jem/templates/gemfiles/modular/style.gemfile.example +33 -0
  157. data/lib/kettle/jem/templates/gemfiles/modular/style_local.gemfile.example +26 -0
  158. data/lib/kettle/jem/templates/gemfiles/modular/templating.gemfile.example +34 -0
  159. data/lib/kettle/jem/templates/gemfiles/modular/templating_local.gemfile.example +73 -0
  160. data/lib/kettle/jem/templates/gemfiles/modular/webrick/r4/v1.9.gemfile.example +1 -0
  161. data/lib/kettle/jem/templates/gemfiles/modular/webrick/vHEAD.gemfile.example +1 -0
  162. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2/libs.gemfile.example +3 -0
  163. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2.3/libs.gemfile.example +3 -0
  164. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2.4/libs.gemfile.example +3 -0
  165. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2.6/libs.gemfile.example +3 -0
  166. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r3/libs.gemfile.example +3 -0
  167. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r3.1/libs.gemfile.example +5 -0
  168. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r4/libs.gemfile.example +6 -0
  169. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/vHEAD.gemfile.example +6 -0
  170. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs.gemfile.example +12 -0
  171. data/lib/kettle/jem/templates/lib/gem/version.rb.example +1 -0
  172. data/lib/kettle/jem/templates/lib/gem/version_gem.rb.example +1 -0
  173. data/lib/kettle/jem/templates/mise.toml.example +25 -0
  174. data/lib/kettle/jem/templates/mise.toml.no-osc.example +25 -0
  175. data/lib/kettle/jem/templates/parsers.toml.example +19 -0
  176. data/lib/kettle/jem/templates/readme/partials/basic_usage.md.example +28 -0
  177. data/lib/kettle/jem/templates/readme/partials/configuration.md.example +112 -0
  178. data/lib/kettle/jem/templates/readme/partials/synopsis.md.example +3 -0
  179. data/lib/kettle/jem/templates/shim/.github/workflows/current.yml.example +40 -0
  180. data/lib/kettle/jem/templates/shim/.rspec.example +5 -0
  181. data/lib/kettle/jem/templates/shim/.structuredmerge/kettle-jem.yml.example +28 -0
  182. data/lib/kettle/jem/templates/shim/CHANGELOG.md.example +9 -0
  183. data/lib/kettle/jem/templates/shim/Gemfile.example +14 -0
  184. data/lib/kettle/jem/templates/shim/README.md.example +25 -0
  185. data/lib/kettle/jem/templates/shim/Rakefile.example +8 -0
  186. data/lib/kettle/jem/templates/shim/gem.gemspec.example +45 -0
  187. data/lib/kettle/jem/templates/shim/lib/compat_require.rb.example +3 -0
  188. data/lib/kettle/jem/templates/shim/lib/entrypoint.rb.example +3 -0
  189. data/lib/kettle/jem/templates/shim/lib/version.rb.example +1 -0
  190. data/lib/kettle/jem/templates/shim/spec/shim_spec.rb.example +15 -0
  191. data/lib/kettle/jem/templates/shim/spec/spec_helper.rb.example +23 -0
  192. data/lib/kettle/jem/templates/sig/gem.rbs.example +1 -0
  193. data/lib/kettle/jem/templates/spec/README.md.example +28 -0
  194. data/lib/kettle/jem/templates/spec/spec_helper.rb.example +39 -0
  195. data/lib/kettle/jem/version.rb +5 -3
  196. data/lib/kettle/jem/version_gem.rb +8 -0
  197. data/lib/kettle/jem.rb +18540 -1517
  198. data/lib/kettle-jem.rb +2 -1
  199. data/sig/kettle/jem.rbs +8 -0
  200. data.tar.gz.sig +0 -0
  201. metadata +870 -32
  202. metadata.gz.sig +0 -0
@@ -0,0 +1,292 @@
1
+ # Contributing
2
+
3
+ Bug reports and pull requests are welcome on [CodeBerg][📜src-cb], [GitLab][📜src-gl], or [GitHub][📜src-gh].
4
+ This project should be a safe, welcoming space for collaboration, so contributors agree to adhere to
5
+ the [code of conduct][🤝conduct].
6
+
7
+ To submit a patch, please fork the project, create a patch with tests, and send a pull request.
8
+
9
+ Remember to [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] if you make changes.
10
+
11
+ ## Developer Certificate of Origin
12
+
13
+ In order to protect users of this project, we require all contributors to comply with the
14
+ [Developer Certificate of Origin](https://developercertificate.org/).
15
+ This ensures that all contributions are properly licensed and attributed.
16
+
17
+ ## Help out!
18
+
19
+ Take a look at the open issues and pull requests, or use the gem and find something to improve.
20
+
21
+ Follow these instructions:
22
+
23
+ 1. Join the community: [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
24
+ 2. Fork the repository
25
+ 3. Create your feature branch (`git checkout -b my-new-feature`)
26
+ 4. Make some fixes.
27
+ 5. Commit your changes (`git commit -am 'Added some feature'`)
28
+ 6. Push to the branch (`git push origin my-new-feature`)
29
+ 7. Make sure to add tests for it. This is important, so it doesn't break in a future release.
30
+ 8. Create new Pull Request.
31
+ 9. Announce it in the project tag on [RubyForum][✉️ruby-forum] or the org channel on [Discord][✉️discord-invite]!
32
+
33
+ ## Ruby engine CI branches
34
+
35
+ Pull requests run MRI workflows by default. JRuby and TruffleRuby workflows are
36
+ available by branch naming convention so ordinary PRs do not spend CI time on
37
+ alternate Ruby engines.
38
+
39
+ - Use a branch named `jruby/*` to run JRuby workflows for a pull request.
40
+ - Use a branch named `truffleruby/*` to run TruffleRuby workflows for a pull
41
+ request.
42
+ - Use a branch named `engines/*` to run both JRuby and TruffleRuby workflows for
43
+ a pull request.
44
+
45
+ Pushes to the default branch continue to run the configured engine workflows.
46
+
47
+ ## Executables vs Rake tasks
48
+
49
+ Executables shipped by dependencies, such as kettle-dev, and stone_checksums, are available
50
+ after running `bin/setup`. These include:
51
+
52
+ - gem_checksums
53
+ - kettle-changelog
54
+ - kettle-commit-msg
55
+ - kettle-dev-setup
56
+ - kettle-dvcs
57
+ - kettle-pre-release
58
+ - kettle-readme-backers
59
+ - kettle-release
60
+
61
+ There are many Rake tasks available as well. You can see them by running:
62
+
63
+ ```shell
64
+ bin/rake -T
65
+ ```
66
+
67
+ ## Code quality checks
68
+
69
+ Run the Reek task when you want a smell check that fails on current findings:
70
+
71
+ ```shell
72
+ bin/rake reek
73
+ ```
74
+
75
+ Refresh the checked-in `REEK` backlog through the rake task, not by redirecting
76
+ the raw `reek` executable output. The rake task uses the project bundle and
77
+ avoids stale generated binstubs shadowing the Reek gem executable:
78
+
79
+ ```shell
80
+ bin/rake reek:update
81
+ ```
82
+
83
+ ## Environment Variables for Local Development
84
+
85
+ Below are the primary environment variables recognized by stone_checksums (and its integrated tools). Unless otherwise noted, set boolean values to the string "true" to enable.
86
+
87
+ General/runtime
88
+ - DEBUG: Enable extra internal logging for this library (default: false)
89
+ - REQUIRE_BENCH: Enable `require_bench` to profile requires (default: false)
90
+ - CI: When set to true, adjusts default rake tasks toward CI behavior
91
+
92
+ Coverage (kettle-soup-cover / SimpleCov)
93
+ - K_SOUP_COV_DO: Enable coverage collection (default: true in `mise.toml`)
94
+ - K_SOUP_COV_FORMATTERS: Comma-separated list of formatters (html, xml, rcov, lcov, json, tty)
95
+ - K_SOUP_COV_MIN_LINE: Minimum line coverage threshold (integer, e.g., 100)
96
+ - K_SOUP_COV_MIN_BRANCH: Minimum branch coverage threshold (integer, e.g., 100)
97
+ - K_SOUP_COV_MIN_HARD: Fail the run if thresholds are not met (true/false)
98
+ - K_SOUP_COV_MULTI_FORMATTERS: Enable multiple formatters at once (true/false)
99
+ - K_SOUP_COV_OPEN_BIN: Path to browser opener for HTML (empty disables auto-open)
100
+ - MAX_ROWS: Limit console output rows for simplecov-console (e.g., 1)
101
+ Tip: When running a single spec file locally, you may want `K_SOUP_COV_MIN_HARD=false` to avoid failing thresholds for a partial run.
102
+
103
+ GitHub API and CI helpers
104
+ - GITHUB_TOKEN or GH_TOKEN: Token used by `ci:act` and release workflow checks to query GitHub Actions status at higher rate limits
105
+
106
+ Releasing and signing
107
+ - SKIP_GEM_SIGNING: If set, skip gem signing during build/release
108
+ - GEM_CERT_USER: Username for selecting your public cert in `certs/<USER>.pem` (defaults to $USER)
109
+ - SOURCE_DATE_EPOCH: Reproducible build timestamp.
110
+ - `kettle-release` will set this automatically for the session.
111
+ - Not needed on bundler >= 2.7.0, as reproducible builds have become the default.
112
+
113
+ Git hooks and commit message helpers (exe/kettle-commit-msg)
114
+ - GIT_HOOK_BRANCH_VALIDATE: Branch name validation mode (e.g., `jira`) or `false` to disable
115
+ - GIT_HOOK_FOOTER_APPEND: Append a footer to commit messages when goalie allows (true/false)
116
+ - GIT_HOOK_FOOTER_SENTINEL: Required when footer append is enabled — a unique first-line sentinel to prevent duplicates
117
+ - GIT_HOOK_FOOTER_APPEND_DEBUG: Extra debug output in the footer template (true/false)
118
+
119
+ Git diff driver setup
120
+ - Local setup writes repository `.gitattributes` entries and local Git `diff.smorg-*` command config so this checkout uses StructuredMerge semantic diffs.
121
+ - Global setup registers `diff.smorg-*` commands once in the user Git config; use it when you work across several StructuredMerge-enabled repositories.
122
+ - Include-file setup writes `.git/smorg/config` and includes it from local Git config, keeping command registrations out of the repository files.
123
+ - Git hosting forges generally ignore external diff drivers, so pull request views may still show raw textual diffs even when local `git diff` uses semantic drivers.
124
+
125
+ ```console
126
+ K_JEM_TEMPLATING=true kettle-jem install
127
+ ```
128
+
129
+ Troubleshooting Git diffs
130
+ - Use `git diff --no-ext-diff` to compare against Git's built-in diff output.
131
+ - Use `git diff --no-textconv` when a textconv projection obscures the raw file bytes you need to inspect.
132
+ - If Git reports a missing `smorg-*` executable, rerun `bundle install` and the setup command above, then check `git config --local --get-regexp '^diff\.smorg-'`.
133
+ - To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-rb.command`, `git config --global --unset-all merge.smorg-rb.driver`, and `git config --global --unset-all merge.smorg-rb.name`.
134
+
135
+ For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`.
136
+
137
+ ## Appraisals
138
+
139
+ From time to time the [appraisal2][🚎appraisal2] gemfiles in `gemfiles/` will need to be updated.
140
+ Generated appraisal and CI workflow floors are controlled by `ruby.test_minimum`
141
+ in `.structuredmerge/kettle-jem.yml`; this project was templated with `ruby.test_minimum: {KJ|MIN_TEST_RUBY}`.
142
+ That value describes the lowest Ruby version expected to run the test/development
143
+ toolchain, and it may be higher than the gemspec runtime floor.
144
+
145
+ They are created and updated with the commands:
146
+
147
+ ```console
148
+ bin/rake appraisal:generate
149
+ ```
150
+
151
+ Use `bin/rake appraisal:update` when you intentionally need to resolve fresh
152
+ appraisal locks.
153
+
154
+ If you need to reset all gemfiles/*.gemfile.lock files:
155
+
156
+ ```console
157
+ bin/rake appraisal:reset
158
+ ```
159
+
160
+ When adding an appraisal to CI, check the [runner tool cache][🏃‍♂️runner-tool-cache] to see which runner to use.
161
+
162
+ ## Run Tests
163
+
164
+ Run tests via `kettle-test` (provided by `kettle-test`). It runs RSpec, writes the full log to
165
+ `tmp/kettle-test/rspec-TIMESTAMP.log`, and prints a compact highlight block with timing, seed,
166
+ pass/fail count, failing example list, and SimpleCov coverage percentages.
167
+
168
+ ```console
169
+ bundle exec kettle-test
170
+ ```
171
+
172
+ For targeted runs, disable the hard coverage threshold to avoid false failures:
173
+
174
+ ```console
175
+ K_SOUP_COV_MIN_HARD=false bundle exec kettle-test spec/path/to/spec.rb
176
+ ```
177
+
178
+ ### Spec organization (required)
179
+
180
+ - One spec file per class/module. For each class or module under `lib/`, keep all of its unit tests in a single spec file under `spec/` that mirrors the path and file name exactly: `lib/{KJ|GEM_NAME_PATH}/my_class.rb` -> `spec/{KJ|GEM_NAME_PATH}/my_class_spec.rb`.
181
+ - Exception: Integration specs that intentionally span multiple classes. Place these under `spec/integration/` (or a clearly named integration folder), and do not directly mirror a single class. Name them after the scenario, not a class.
182
+
183
+ ## Lint It
184
+
185
+ Run all the default tasks, which includes running the gradually autocorrecting linter, `rubocop-gradual`.
186
+
187
+ ```console
188
+ bundle exec rake
189
+ ```
190
+
191
+ Or just run the linter.
192
+
193
+ ```console
194
+ bundle exec rake rubocop_gradual:autocorrect
195
+ ```
196
+
197
+ For more detailed information about using RuboCop in this project, please see the [RUBOCOP.md](RUBOCOP.md) guide. This project uses `rubocop_gradual` instead of vanilla RuboCop, which requires specific commands for checking violations.
198
+
199
+ ### Important: Do not add inline RuboCop disables
200
+
201
+ Never add `# rubocop:disable ...` / `# rubocop:enable ...` comments to code or specs (except when following the few existing `rubocop:disable` patterns for a rule already being disabled elsewhere in the code). Instead:
202
+
203
+ - Prefer configuration-based exclusions when a rule should not apply to certain paths or files (e.g., via `.rubocop.yml`).
204
+ - When a violation is temporary, and you plan to fix it later, record it in `.rubocop_gradual.lock` using the gradual workflow:
205
+ - `bundle exec rake rubocop_gradual:autocorrect` (preferred)
206
+ - `bundle exec rake rubocop_gradual:force_update` (only when you cannot fix the violations immediately)
207
+
208
+ As a general rule, fix style issues rather than ignoring them. For example, our specs should follow RSpec conventions like using `described_class` for the class under test.
209
+
210
+ ## Contributors
211
+
212
+ Your picture could be here!
213
+
214
+ [![Contributors][🖐contributors-img]][🖐contributors]
215
+
216
+ Made with [contributors-img][🖐contrib-rocks].
217
+
218
+ Also see GitLab Contributors: [{KJ|README:GL_CONTRIBUTORS_URL}][🚎contributors-gl]
219
+
220
+ ## For Maintainers
221
+
222
+ ### One-time, Per-maintainer, Setup
223
+
224
+ **IMPORTANT**: To sign a build,
225
+ a public key for signing gems will need to be picked up by the line in the
226
+ `gemspec` defining the `spec.cert_chain` (check the relevant ENV variables there).
227
+ All releases are signed releases.
228
+ See: [RubyGems Security Guide][🔒️rubygems-security-guide]
229
+
230
+ NOTE: To build without signing the gem set `SKIP_GEM_SIGNING` to any value in the environment.
231
+
232
+ ### To release a new version:
233
+
234
+ #### Automated process
235
+
236
+ 1. Update version.rb to contain the correct version-to-be-released.
237
+ 2. Run `bundle exec kettle-changelog`.
238
+ 3. Run `bundle exec kettle-release`.
239
+ 4. Stay awake and monitor the release process for any errors, and answer any prompts.
240
+
241
+ #### Manual process
242
+
243
+ 1. Run `bin/setup && bin/rake` as a "test, coverage, & linting" sanity check
244
+ 2. Update the version number in `version.rb`, and ensure `CHANGELOG.md` reflects changes
245
+ 3. Run `bin/setup && bin/rake` again as a secondary check, and to update `Gemfile.lock`
246
+ 4. Run `bin/rake yard` to regenerate the docs site using the canonical docs task
247
+ 5. Run `git commit -am "🔖 Prepare release v<VERSION>"` to commit the changes
248
+ 6. Run `git push` to trigger the final CI pipeline before release, and merge PRs
249
+ - NOTE: Remember to [check the build][🧪build].
250
+ 7. Run `export GIT_TRUNK_BRANCH_NAME="$(git remote show origin | grep 'HEAD branch' | cut -d ' ' -f5)" && echo $GIT_TRUNK_BRANCH_NAME`
251
+ 8. Run `git checkout $GIT_TRUNK_BRANCH_NAME`
252
+ 9. Run `git pull origin $GIT_TRUNK_BRANCH_NAME` to ensure latest trunk code
253
+ 10. Optional for older Bundler (< 2.7.0): Set `SOURCE_DATE_EPOCH` so `rake build` and `rake release` use the same timestamp and generate the same checksums
254
+ - If your Bundler is >= 2.7.0, you can skip this; builds are reproducible by default.
255
+ - Run `export SOURCE_DATE_EPOCH=$EPOCHSECONDS && echo $SOURCE_DATE_EPOCH`
256
+ - If the echo above has no output, then it didn't work.
257
+ - Note: `zsh/datetime` module is needed, if running `zsh`.
258
+ - In older versions of `bash` you can use `date +%s` instead, i.e. `export SOURCE_DATE_EPOCH=$(date +%s) && echo $SOURCE_DATE_EPOCH`
259
+ 11. Run `bundle exec rake build`
260
+ 12. Run `bin/gem_checksums` (more context [1][🔒️rubygems-checksums-pr], [2][🔒️rubygems-guides-pr])
261
+ to create SHA-256 and SHA-512 checksums. This functionality is provided by the `stone_checksums`
262
+ [gem][💎stone_checksums].
263
+ - The script automatically commits but does not push the checksums
264
+ 13. Sanity check the SHA256, comparing with the output from the `bin/gem_checksums` command:
265
+ - `sha256sum pkg/<gem name>-<version>.gem`
266
+ 14. Run `bundle exec rake release` which will create a git tag for the version,
267
+ push git commits and tags, and push the `.gem` file to the gem host configured in the gemspec.
268
+
269
+ [📜src-gl]: {KJ|README:GL_PACKAGE_SOURCE_URL}
270
+ [📜src-cb]: {KJ|README:CB_PACKAGE_SOURCE_URL}
271
+ [📜src-gh]: {KJ|README:GH_PACKAGE_SOURCE_URL}
272
+ [🧪build]: {KJ|README:GH_ACTIONS_URL}
273
+ [🤝conduct]: {KJ|README:GH_CODE_OF_CONDUCT_URL}
274
+ [🖐contrib-rocks]: https://contrib.rocks
275
+ [🖐contributors]: {KJ|README:GH_CONTRIBUTORS_URL}
276
+ [🚎contributors-gl]: {KJ|README:GL_CONTRIBUTORS_URL}
277
+ [🖐contributors-img]: https://contrib.rocks/image?repo={KJ|README:CONTRIBUTORS_IMAGE_REPO}
278
+ [💎gem-coop]: https://gem.coop
279
+ [🔒️rubygems-security-guide]: https://guides.rubygems.org/security/#building-gems
280
+ [🔒️rubygems-checksums-pr]: https://github.com/rubygems/rubygems/pull/6022
281
+ [🔒️rubygems-guides-pr]: https://github.com/rubygems/guides/pull/325
282
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
283
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
284
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
285
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
286
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
287
+ [🚎appraisal2]: https://github.com/appraisal-rb/appraisal2
288
+ [🏃‍♂️runner-tool-cache]: https://github.com/ruby/ruby-builder/releases/tag/toolcache
289
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
290
+ [✉️discord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=flat&logo=discord
291
+ [✉️ruby-forum]: {KJ|RUBYFORUM:URL}
292
+ [✉️ruby-forum-img]: {KJ|RUBYFORUM:BADGE_IMG}
@@ -0,0 +1,74 @@
1
+ <!-- RELEASE-NOTES-FOOTER-START -->
2
+
3
+ Community support 👉️ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
4
+
5
+ Many paths lead to being a sponsor or a backer of this project. Are you on such a path?
6
+
7
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
8
+
9
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
10
+
11
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/{KJ|FUNDING:LIBERAPAY}.svg?logo=liberapay&color=a51611&style=flat
12
+ [⛳liberapay]: https://liberapay.com/{KJ|FUNDING:LIBERAPAY}/donate
13
+ [🖇osc-backers]: https://opencollective.com/{KJ|OPENCOLLECTIVE_ORG}#backer
14
+ [🖇osc-backers-i]: https://opencollective.com/{KJ|OPENCOLLECTIVE_ORG}/backers/badge.svg?style=flat
15
+ [🖇osc-sponsors]: https://opencollective.com/{KJ|OPENCOLLECTIVE_ORG}#sponsor
16
+ [🖇osc-sponsors-i]: https://opencollective.com/{KJ|OPENCOLLECTIVE_ORG}/sponsors/badge.svg?style=flat
17
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-{KJ|GH:USER}.svg?style=social&logo=github
18
+ [🖇sponsor]: https://github.com/sponsors/{KJ|GH:USER}
19
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
20
+ [🖇kofi]: https://ko-fi.com/{KJ|FUNDING:KOFI}
21
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
22
+ [🖇buyme]: https://www.buymeacoffee.com/{KJ|FUNDING:BUYMEACOFFEE}
23
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
24
+ [🖇paypal]: https://www.paypal.com/paypalme/{KJ|FUNDING:PAYPAL}
25
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
26
+ [✉️discord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=flat
27
+ [✉️ruby-forum]: {KJ|RUBYFORUM:URL}
28
+ [✉️ruby-forum-img]: {KJ|RUBYFORUM:BADGE_IMG}
29
+
30
+ <!-- RELEASE-NOTES-FOOTER-END -->
31
+
32
+ # 🤑 A request for help
33
+
34
+ Maintainers have teeth and need to pay their dentists.
35
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
36
+ I began spending most of my time building open source tools.
37
+ I'm hoping to be able to pay for my kids' health insurance this month,
38
+ so if you value the work I am doing, I need your support.
39
+ Please consider sponsoring me or the project.
40
+
41
+ To join the community or get help, use RubyForum or Discord.
42
+
43
+ [![Ruby Users Forum][✉️ruby-forum-img-ftb]][✉️ruby-forum]
44
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
45
+
46
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
47
+
48
+ [![Sponsor {KJ|OPENCOLLECTIVE_ORG}/{KJ|GEM_NAME} on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
49
+
50
+ # Another Way to Support Open Source Software
51
+
52
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
53
+
54
+ 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`.
55
+
56
+ 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.
57
+
58
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
59
+
60
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/{KJ|FUNDING:LIBERAPAY}.svg?style=for-the-badge&logo=liberapay&color=a51611
61
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/{KJ|OPENCOLLECTIVE_ORG}
62
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/{KJ|OPENCOLLECTIVE_ORG}
63
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/{KJ|OPENCOLLECTIVE_ORG}
64
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/{KJ|OPENCOLLECTIVE_ORG}?style=for-the-badge
65
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/{KJ|OPENCOLLECTIVE_ORG}?style=for-the-badge
66
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/{KJ|OPENCOLLECTIVE_ORG}?style=for-the-badge
67
+ [🖇osc]: https://opencollective.com/{KJ|OPENCOLLECTIVE_ORG}
68
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-{KJ|GH:USER}-blue?style=for-the-badge&logo=github
69
+ [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug={KJ|FUNDING:BUYMEACOFFEE}&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
70
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
71
+ [🖇floss-funding.dev]: https://floss-funding.dev
72
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
73
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
74
+ [✉️ruby-forum-img-ftb]: {KJ|RUBYFORUM:BADGE_IMG_FTB}
@@ -0,0 +1,63 @@
1
+ <!-- RELEASE-NOTES-FOOTER-START -->
2
+
3
+ Community support 👉️ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
4
+
5
+ Many paths lead to being a sponsor or a backer of this project. Are you on such a path?
6
+
7
+ [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
8
+
9
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
10
+
11
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/{KJ|FUNDING:LIBERAPAY}.svg?logo=liberapay&color=a51611&style=flat
12
+ [⛳liberapay]: https://liberapay.com/{KJ|FUNDING:LIBERAPAY}/donate
13
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-{KJ|GH:USER}.svg?style=social&logo=github
14
+ [🖇sponsor]: https://github.com/sponsors/{KJ|GH:USER}
15
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
16
+ [🖇kofi]: https://ko-fi.com/{KJ|FUNDING:KOFI}
17
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
18
+ [🖇buyme]: https://www.buymeacoffee.com/{KJ|FUNDING:BUYMEACOFFEE}
19
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
20
+ [🖇paypal]: https://www.paypal.com/paypalme/{KJ|FUNDING:PAYPAL}
21
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
22
+ [✉️discord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=flat
23
+ [✉️ruby-forum]: {KJ|RUBYFORUM:URL}
24
+ [✉️ruby-forum-img]: {KJ|RUBYFORUM:BADGE_IMG}
25
+
26
+ <!-- RELEASE-NOTES-FOOTER-END -->
27
+
28
+ # 🤑 A request for help
29
+
30
+ Maintainers have teeth and need to pay their dentists.
31
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
32
+ I began spending most of my time building open source tools.
33
+ I'm hoping to be able to pay for my kids' health insurance this month,
34
+ so if you value the work I am doing, I need your support.
35
+ Please consider sponsoring me or the project.
36
+
37
+ To join the community or get help, use RubyForum or Discord.
38
+
39
+ [![Ruby Users Forum][✉️ruby-forum-img-ftb]][✉️ruby-forum]
40
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
41
+
42
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
43
+
44
+ [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
45
+
46
+ # Another Way to Support Open Source Software
47
+
48
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
49
+
50
+ 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`.
51
+
52
+ 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.
53
+
54
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
55
+
56
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/{KJ|FUNDING:LIBERAPAY}.svg?style=for-the-badge&logo=liberapay&color=a51611
57
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-{KJ|GH:USER}-blue?style=for-the-badge&logo=github
58
+ [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug={KJ|FUNDING:BUYMEACOFFEE}&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
59
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
60
+ [🖇floss-funding.dev]: https://floss-funding.dev
61
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
62
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
63
+ [✉️ruby-forum-img-ftb]: {KJ|RUBYFORUM:BADGE_IMG_FTB}
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ # {KJ|FREEZE_TOKEN}:freeze
4
+ # To retain chunks of comments & code during kettle-jem templating:
5
+ # Wrap custom sections with freeze markers (e.g., as above and below this comment chunk).
6
+ # kettle-jem will then preserve content between those markers across template runs.
7
+ # {KJ|FREEZE_TOKEN}:unfreeze
8
+
9
+ source "https://gem.coop"
10
+
11
+ git_source(:codeberg) { |repo_name| "https://codeberg.org/#{repo_name}" }
12
+ git_source(:gitlab) { |repo_name| "https://gitlab.com/#{repo_name}" }
13
+
14
+ #### IMPORTANT #######################################################
15
+ # Gemfile is for local development ONLY; Gemfile is NOT loaded in CI #
16
+ ####################################################### IMPORTANT ####
17
+
18
+ # Include dependencies from {KJ|GEM_NAME}.gemspec
19
+ gemspec
20
+
21
+ {KJ|MAIN_GEMFILE_KETTLE_FAMILY_GEM}
22
+
23
+ {KJ|MAIN_GEMFILE_NOMONO_BOOTSTRAP}
24
+
25
+ {KJ|MAIN_GEMFILE_DIRECT_SIBLING_BLOCK}
26
+
27
+ # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
28
+ eval_gemfile "gemfiles/modular/templating.gemfile" if ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?
29
+
30
+ # Debugging
31
+ eval_gemfile "gemfiles/modular/debug.gemfile"
32
+
33
+ # Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths)
34
+ eval_gemfile "gemfiles/modular/coverage.gemfile"
35
+
36
+ # Linting
37
+ eval_gemfile "gemfiles/modular/style.gemfile"
38
+
39
+ # Documentation
40
+ eval_gemfile "gemfiles/modular/documentation.gemfile"
41
+
42
+ # Changelog release tooling (available on Ruby versions supported by kettle-changelog)
43
+ eval_gemfile "gemfiles/modular/changelog.gemfile"
44
+
45
+ # Optional
46
+ eval_gemfile "gemfiles/modular/optional.gemfile"
47
+
48
+ ### Std Lib Extracted Gems
49
+ eval_gemfile "gemfiles/modular/x_std_libs.gemfile"
50
+
51
+ # See unlocked_deps appraisal for more details on irb inclusion
52
+ gem "irb", "~> 1.17" # ruby >= 2.7
@@ -0,0 +1,34 @@
1
+ # Incident Response Plan
2
+
3
+ This plan describes how maintainers coordinate security and operational incidents for this project.
4
+
5
+ ## Scope
6
+
7
+ Use this plan for suspected vulnerabilities, compromised release credentials, malicious dependency activity, or other events that may affect users of this project.
8
+
9
+ ## Contacts
10
+
11
+ Report security issues using the process in [SECURITY.md](SECURITY.md). Maintainers should keep incident coordination private until disclosure is appropriate.
12
+
13
+ ## Triage
14
+
15
+ 1. Confirm whether the report affects a released artifact, source repository, CI system, package registry account, or maintainer credential.
16
+ 2. Assign one maintainer as incident lead.
17
+ 3. Record the affected versions, known exposure window, and current mitigation status.
18
+ 4. Decide whether package publishing, CI secrets, or repository automation should be temporarily disabled.
19
+
20
+ ## Containment
21
+
22
+ Rotate exposed credentials, revoke compromised tokens, disable affected automation, and remove malicious artifacts where possible. If a published package is affected, coordinate with the package registry before deleting or yanking releases.
23
+
24
+ ## Remediation
25
+
26
+ Prepare the minimal fix, add regression coverage when practical, and release patched versions. Prefer a clear advisory over silent fixes when users need to take action.
27
+
28
+ ## Disclosure
29
+
30
+ Publish an advisory that includes affected versions, fixed versions, impact, mitigation steps, and credits when appropriate. Link the advisory from the changelog or release notes.
31
+
32
+ ## Follow-up
33
+
34
+ After closure, review what failed, update this plan, and add preventive checks to CI or release automation where possible.
@@ -0,0 +1,3 @@
1
+ {KJ|LICENSE_MD_CONTENT}
2
+
3
+ {KJ|LICENSE_COPYRIGHT_NOTICE}
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ See [LICENSE.md](LICENSE.md) for the copyright notice.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.