kettle-gha-pins 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8b8c85ccd81571bf3a9bb1108fbe1edfbaaf1c777beec567590ae8bd04374f16
4
+ data.tar.gz: 901a2f1cee2404a9a711cb20bbfb5b5aafcf1246671c35f51612d202d887d130
5
+ SHA512:
6
+ metadata.gz: 853b5e757f54963d7c75edccd20529ed7196745636685f50980e855de27dc03be0262ef84918b3ec48b40c5dab3fae4a28236695a237ea75f96f7fcf23569b37
7
+ data.tar.gz: bb434ac6c8219892ea94fd09a2352954fa2c71ff658a32ff77a0d2a6292cecc30853e581f56802c539697b36abc0ec318e4fc1566d68c56823ec645f4728a4ca
checksums.yaml.gz.sig ADDED
Binary file
data/CHANGELOG.md ADDED
@@ -0,0 +1,66 @@
1
+ # Changelog
2
+
3
+ [![SemVer 2.0.0][📌semver-img]][📌semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog]
4
+
5
+ All notable changes to this project will be documented in this file.
6
+
7
+ The format is based on [Keep a Changelog][📗keep-changelog],
8
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
9
+ and [yes][📌major-versions-not-sacred], platform and engine support are part of the [public API][📌semver-breaking].
10
+ Please file a bug if you notice a violation of semantic versioning.
11
+
12
+ [📌semver]: https://semver.org/spec/v2.0.0.html
13
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat
14
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
15
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
16
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
17
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
18
+
19
+ ## [Unreleased]
20
+
21
+ ### Added
22
+
23
+ ### Changed
24
+
25
+ ### Deprecated
26
+
27
+ ### Removed
28
+
29
+ ### Fixed
30
+
31
+ ### Security
32
+
33
+ ## [0.1.0] - 2026-07-22
34
+
35
+ - TAG: [v0.1.0][0.1.0t]
36
+ - COVERAGE: 97.65% -- 83/85 lines in 3 files
37
+ - BRANCH COVERAGE: 88.89% -- 24/27 branches in 3 files
38
+ - 20.83% documented
39
+ - Initial release
40
+
41
+ ### Added
42
+
43
+ - Added `Kettle::Gha::Pins::VersionRubric` as the shared version parsing,
44
+ canonicalization, and upgrade-target selection API for GitHub Actions pin
45
+ maintenance.
46
+
47
+ ### Changed
48
+
49
+ - kettle-jem-template-20260716-001 - Shim gemspec manifests now include
50
+ `LICENSE.md` instead of nonexistent `LICENSE.txt`.
51
+ - kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
52
+ repository-only files by default to reduce downstream distro packaging churn.
53
+ - kettle-jem-template-20260720-001 - Generated READMEs can now render
54
+ template-managed corporate sponsor logos from project or family config.
55
+ - kettle-jem-template-20260720-002 - Generated development Gemfiles now use the
56
+ released `tree_sitter_language_pack` gem 1.13.3 or newer by default.
57
+ - kettle-jem-template-20260720-003 - Generated StructuredMerge Git diff driver
58
+ config now uses the installed `smorg-rb` Ruby driver name.
59
+ - kettle-jem-template-20260720-004 - Generated multi-engine workflow files now
60
+ omit JRuby and TruffleRuby jobs when project config declares MRI-only engines.
61
+ - kettle-jem-template-20260720-005 - Generated README Support & Community rows
62
+ now include a RubyForum help badge.
63
+
64
+ [Unreleased]: https://github.com/kettle-dev/kettle-gha-pins/compare/v0.1.0...HEAD
65
+ [0.1.0]: https://github.com/kettle-dev/kettle-gha-pins/compare/c633526495c7db0a8721a94a71c3def0f3cc71bb...v0.1.0
66
+ [0.1.0t]: https://github.com/kettle-dev/kettle-gha-pins/releases/tag/v0.1.0
data/LICENSE.md ADDED
@@ -0,0 +1,10 @@
1
+ # License
2
+
3
+ This project is made available under the following license.
4
+ Choose the option that best fits your use case:
5
+
6
+ - [MIT](https://github.com/kettle-dev/kettle-gha-pins/blob/main/MIT.md)
7
+
8
+ ## Copyright Notice
9
+
10
+ - Copyright (c) 2026 Peter H. Boling
data/README.md ADDED
@@ -0,0 +1,548 @@
1
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
2
+
3
+ # 📌 Kettle::Gha::Pins
4
+
5
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
6
+
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
8
+
9
+ ---
10
+
11
+ `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
12
+
13
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
14
+
15
+ <details markdown="1">
16
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
17
+
18
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
19
+
20
+ </details>
21
+
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
23
+
24
+ `kettle-gha-pins` is the shared version-rubric library for kettle-dev GitHub
25
+ Actions pin maintenance. It owns the deterministic rules for parsing action
26
+ release tags, ordering equivalent release spellings, and selecting patch,
27
+ minor, or major upgrade targets.
28
+
29
+ The gem is intentionally small and API-focused. Command-line tools such as
30
+ `kettle-gha-sha-pins` and template maintenance scripts can depend on this gem
31
+ instead of each carrying their own subtly different version comparison logic.
32
+
33
+ ## 💡 Info you can shake a stick at
34
+
35
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
36
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
37
+ | Works with JRuby | [![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
38
+ | Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|
39
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
40
+ | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
41
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
42
+ | 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] |
43
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
44
+ | Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
45
+ | 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] |
46
+ | 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] |
47
+ | `...` 💖 | [![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] |
48
+
49
+ ### Compatibility
50
+
51
+ Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRuby.
52
+ CI workflows and Appraisals are generated for MRI Ruby 3.2.0+.
53
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
54
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
55
+ not practical for the current toolchain.
56
+
57
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
58
+
59
+ The _amazing_ test matrix is powered by the kettle-dev stack.
60
+
61
+ <details markdown="1">
62
+ <summary>How kettle-dev manages complexity in tests</summary>
63
+
64
+ | Gem | Source | Role | Daily download rank |
65
+ |-----|--------|------|---------------------|
66
+ | [appraisal2](https://bestgems.org/gems/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Daily download rank for appraisal2](https://img.shields.io/gem/rd/appraisal2.svg?style=flat-square)](https://bestgems.org/gems/appraisal2) |
67
+ | [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) |
68
+ | [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) |
69
+ | [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) |
70
+ | [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) |
71
+ | [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) |
72
+ | [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) |
73
+ | [turbo_tests2](https://bestgems.org/gems/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Daily download rank for turbo_tests2](https://img.shields.io/gem/rd/turbo_tests2.svg?style=flat-square)](https://bestgems.org/gems/turbo_tests2) |
74
+
75
+ </details>
76
+
77
+ ### Federated DVCS
78
+
79
+ <details markdown="1">
80
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
81
+
82
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
83
+ |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
84
+ | 🧪 [kettle-dev/kettle-gha-pins on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
85
+ | 🧊 [kettle-dev/kettle-gha-pins on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
86
+ | 🐙 [kettle-dev/kettle-gha-pins on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
87
+ | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
88
+
89
+ </details>
90
+
91
+ [gh-discussions]: https://github.com/kettle-dev/kettle-gha-pins/discussions
92
+
93
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/kettle-gha-pins)](https://tidelift.com/subscription/pkg/rubygems-kettle-gha-pins?utm_source=rubygems-kettle-gha-pins&utm_medium=referral&utm_campaign=readme)
94
+
95
+ Available as part of the Tidelift Subscription.
96
+
97
+ <details markdown="1">
98
+ <summary>Need enterprise-level guarantees?</summary>
99
+
100
+ The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
101
+
102
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
103
+
104
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
105
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
106
+ - 💡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
107
+
108
+ Alternatively:
109
+
110
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
111
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
112
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
113
+
114
+ </details>
115
+
116
+ ## ✨ Installation
117
+
118
+ Install the gem and add to the application's Gemfile by executing:
119
+
120
+ ```console
121
+ bundle add kettle-gha-pins
122
+ ```
123
+
124
+ If bundler is not being used to manage dependencies, install the gem by executing:
125
+
126
+ ```console
127
+ gem install kettle-gha-pins
128
+ ```
129
+
130
+ ## ⚙️ Configuration
131
+
132
+ There is no global configuration for the library API. Callers pass release-tag
133
+ data directly to `Kettle::Gha::Pins::VersionRubric`.
134
+
135
+ The shared upgrade policies are:
136
+
137
+ - `patch` - upgrade within the same major/minor line.
138
+ - `minor` - upgrade within the same major line.
139
+ - `major` - upgrade to the latest higher release, including major-line tags such
140
+ as `v2` to `v3`.
141
+
142
+ Invalid upgrade levels normalize to `patch`, matching the historical
143
+ `kettle-gha-sha-pins` default.
144
+
145
+ ## 🔧 Basic Usage
146
+
147
+ ```ruby
148
+ require "kettle/gha/pins"
149
+
150
+ versions = Kettle::Gha::Pins::VersionRubric.build_release_versions(
151
+ release_tags: ["v7.0.0"],
152
+ tag_shas: {
153
+ "v7" => "abc123...",
154
+ "v7.0.0" => "abc123..."
155
+ }
156
+ )
157
+
158
+ target = Kettle::Gha::Pins::VersionRubric.choose_upgrade_target(
159
+ "v6.5.0",
160
+ versions,
161
+ "major"
162
+ )
163
+
164
+ target[:tag]
165
+ # => "v7.0.0"
166
+ ```
167
+
168
+ When two version-equivalent tags point at the same SHA, the rubric keeps the
169
+ more explicit release spelling. For example, `v7` and `v7.0.0` pointing at the
170
+ same commit canonicalize to `v7.0.0`; if they point at different SHAs, both
171
+ entries remain available so callers can report the moving major-line tag
172
+ honestly.
173
+
174
+ ## 🦷 FLOSS Funding
175
+
176
+ While kettle-dev tools are free software and will always be, the project would benefit immensely from some funding.
177
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
178
+
179
+ We welcome both individual and corporate sponsors! We also offer a
180
+ wide array of funding channels to account for your preferences.
181
+ Currently, [Open Collective][🖇osc] is our preferred funding platform.
182
+
183
+ **If you're working in a company that's making significant use of kettle-dev tools we'd
184
+ appreciate it if you suggest to your company to become a kettle-dev sponsor.**
185
+
186
+ You can support the development of kettle-dev tools via
187
+ [GitHub Sponsors][🖇sponsor],
188
+ [Liberapay][⛳liberapay],
189
+ [PayPal][🖇paypal],
190
+ [Open Collective][🖇osc]
191
+ and [Tidelift][🏙️entsup-tidelift].
192
+
193
+ | 📍 NOTE |
194
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
195
+ | 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. |
196
+
197
+ ### Open Collective for Individuals
198
+
199
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/kettle-dev#backer)]
200
+
201
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
202
+
203
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
204
+ No backers yet. Be the first!
205
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
206
+
207
+ ### Open Collective for Organizations
208
+
209
+ 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-dev#sponsor)]
210
+
211
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
212
+
213
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
214
+ No sponsors yet. Be the first!
215
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
216
+
217
+ [kettle-readme-backers]: https://github.com/kettle-dev/kettle-gha-pins/blob/main/bin/kettle-readme-backers
218
+
219
+ ### Another way to support open-source
220
+
221
+ 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).
222
+
223
+ 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`.
224
+
225
+ 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.
226
+
227
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
228
+
229
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
230
+
231
+ ## 🔐 Security
232
+
233
+ See [SECURITY.md][🔐security].
234
+
235
+ ## 🤝 Contributing
236
+
237
+ If you need some ideas of where to help, you could work on adding more code coverage,
238
+ or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
239
+ or use the gem and think about how it could be better.
240
+
241
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
242
+
243
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
244
+
245
+ ### 🚀 Release Instructions
246
+
247
+ See [CONTRIBUTING.md][🤝contributing].
248
+
249
+ ### Code Coverage
250
+
251
+ <details markdown="1">
252
+ <summary>Coverage service badges</summary>
253
+
254
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
255
+
256
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
257
+
258
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
259
+
260
+ </details>
261
+
262
+ ### 🪇 Code of Conduct
263
+
264
+ Everyone interacting with this project's codebases, issue trackers,
265
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
266
+
267
+ ## 🌈 Contributors
268
+
269
+ [![Contributors][🖐contributors-img]][🖐contributors]
270
+
271
+ Made with [contributors-img][🖐contrib-rocks].
272
+
273
+ Also see GitLab Contributors: [https://gitlab.com/kettle-dev/kettle-gha-pins/-/graphs/main][🚎contributors-gl]
274
+
275
+ <details markdown="1">
276
+ <summary>⭐️ Star History</summary>
277
+
278
+ <a href="https://star-history.com/kettle-dev/kettle-gha-pins&Date">
279
+ <picture>
280
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kettle-dev/kettle-gha-pins&type=Date&theme=dark" />
281
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kettle-dev/kettle-gha-pins&type=Date" />
282
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kettle-dev/kettle-gha-pins&type=Date" />
283
+ </picture>
284
+ </a>
285
+
286
+ </details>
287
+
288
+ ## 📌 Versioning
289
+
290
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
291
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
292
+
293
+ For example:
294
+
295
+ ```ruby
296
+ spec.add_dependency("kettle-gha-pins", "~> 0.0")
297
+ ```
298
+
299
+ <details markdown="1">
300
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
301
+
302
+ Dropping support for a platform can be a breaking change for affected users.
303
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
304
+
305
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
306
+ read this article from the creator of SemVer:
307
+
308
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
309
+
310
+ </details>
311
+
312
+ See [CHANGELOG.md][📌changelog] for a list of releases.
313
+
314
+ ## 📄 License
315
+
316
+ The gem is available as open source under the terms of
317
+ the [MIT](https://github.com/kettle-dev/kettle-gha-pins/blob/main/MIT.md) [![License: MIT][📄license-img]][📄license-ref].
318
+
319
+ ### © Copyright
320
+
321
+ See [LICENSE.md][📄license] for the official copyright notice.
322
+
323
+ <details markdown="1">
324
+ <summary>Copyright holders</summary>
325
+
326
+ - Copyright (c) 2026 Peter H. Boling
327
+
328
+ </details>
329
+
330
+ ## 🤑 A request for help
331
+
332
+ Maintainers have teeth and need to pay their dentists.
333
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
334
+ I began spending most of my time building open source tools.
335
+ I'm hoping to be able to pay for my kids' health insurance this month,
336
+ so if you value the work I am doing, I need your support.
337
+ Please consider sponsoring me or the project.
338
+
339
+ To join the community or get help 👇️ Join the Discord.
340
+
341
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
342
+
343
+ To say "thanks!" ☝️ Join the Discord or 👇️ send money.
344
+
345
+ [![Sponsor kettle-dev/kettle-gha-pins 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]
346
+
347
+ ### Please give the project a star ⭐ ♥.
348
+
349
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
350
+
351
+ Thanks for RTFM. ☺️
352
+
353
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
354
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
355
+ [⛳liberapay]: https://liberapay.com/pboling/donate
356
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/kettle-dev
357
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/kettle-dev
358
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/kettle-dev
359
+ [🖇osc-backers]: https://opencollective.com/kettle-dev#backer
360
+ [🖇osc-backers-i]: https://opencollective.com/kettle-dev/backers/badge.svg?style=flat
361
+ [🖇osc-sponsors]: https://opencollective.com/kettle-dev#sponsor
362
+ [🖇osc-sponsors-i]: https://opencollective.com/kettle-dev/sponsors/badge.svg?style=flat
363
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/kettle-dev?style=for-the-badge
364
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/kettle-dev?style=for-the-badge
365
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/kettle-dev?style=for-the-badge
366
+ [🖇osc]: https://opencollective.com/kettle-dev
367
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
368
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
369
+ [🖇sponsor]: https://github.com/sponsors/pboling
370
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
371
+ [🖇kofi]: https://ko-fi.com/pboling
372
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
373
+ [🖇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
374
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
375
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
376
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
377
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
378
+ [🖇floss-funding.dev]: https://floss-funding.dev
379
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
380
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
381
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
382
+ [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
383
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
384
+ [✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white
385
+ [✉️ruby-forum]: https://www.rubyforum.org/c/help/8
386
+
387
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
388
+ [⛳️gem-namespace]: https://github.com/kettle-dev/kettle-gha-pins
389
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Kettle::Gha::Pins-3C2D2D.svg?style=square&logo=ruby&logoColor=white
390
+ [⛳️gem-name]: https://bestgems.org/gems/kettle-gha-pins
391
+ [⛳️name-img]: https://img.shields.io/badge/name-kettle--gha--pins-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
392
+ [⛳️tag-img]: https://img.shields.io/github/tag/kettle-dev/kettle-gha-pins.svg
393
+ [⛳️tag]: https://github.com/kettle-dev/kettle-gha-pins/releases
394
+ [🚂maint-blog]: http://www.railsbling.com/tags/kettle-gha-pins
395
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
396
+ [🚂maint-contact]: http://www.railsbling.com/contact
397
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
398
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
399
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
400
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
401
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
402
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
403
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
404
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
405
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
406
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
407
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
408
+ [💖🌳linktree]: https://linktr.ee/galtzo
409
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
410
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
411
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
412
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
413
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
414
+ [💖🧊berg]: https://codeberg.org/pboling
415
+ [💖🐙hub]: https://github.org/pboling
416
+ [💖🛖hut]: https://sr.ht/~galtzo/
417
+ [💖🧪lab]: https://gitlab.com/pboling
418
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
419
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
420
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
421
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
422
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-kettle-gha-pins?utm_source=rubygems-kettle-gha-pins&utm_medium=referral&utm_campaign=readme
423
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
424
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
425
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
426
+ [🚂railsbling]: http://www.railsbling.com
427
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
428
+ [📜src-gl]: https://gitlab.com/kettle-dev/kettle-gha-pins
429
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
430
+ [📜src-cb]: https://codeberg.org/kettle-dev/kettle-gha-pins
431
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
432
+ [📜src-gh]: https://github.com/kettle-dev/kettle-gha-pins
433
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
434
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
435
+ [📜gl-wiki]: https://gitlab.com/kettle-dev/kettle-gha-pins/-/wikis/home
436
+ [📜gh-wiki]: https://github.com/kettle-dev/kettle-gha-pins/wiki
437
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
438
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
439
+ [👽dl-rank]: https://bestgems.org/gems/kettle-gha-pins
440
+ [👽dl-ranki]: https://img.shields.io/gem/rd/kettle-gha-pins.svg
441
+ [👽version]: https://bestgems.org/gems/kettle-gha-pins
442
+ [👽versioni]: https://img.shields.io/gem/v/kettle-gha-pins.svg
443
+ [🏀qlty-mnt]: https://qlty.sh/gh/kettle-dev/projects/kettle-gha-pins
444
+ [🏀qlty-mnti]: https://qlty.sh/gh/kettle-dev/projects/kettle-gha-pins/maintainability.svg
445
+ [🏀qlty-cov]: https://qlty.sh/gh/kettle-dev/projects/kettle-gha-pins/metrics/code?sort=coverageRating
446
+ [🏀qlty-covi]: https://qlty.sh/gh/kettle-dev/projects/kettle-gha-pins/coverage.svg
447
+ [🏀codecov]: https://codecov.io/gh/kettle-dev/kettle-gha-pins
448
+ [🏀codecovi]: https://codecov.io/gh/kettle-dev/kettle-gha-pins/graph/badge.svg
449
+ [🏀coveralls]: https://coveralls.io/github/kettle-dev/kettle-gha-pins?branch=main
450
+ [🏀coveralls-img]: https://coveralls.io/repos/github/kettle-dev/kettle-gha-pins/badge.svg?branch=main
451
+ [🚎ruby-3.2-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/ruby-3.2.yml
452
+ [🚎ruby-3.3-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/ruby-3.3.yml
453
+ [🚎ruby-3.4-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/ruby-3.4.yml
454
+ [🚎jruby-10.0-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/jruby-10.0.yml
455
+ [🚎truby-24.2-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/truffleruby-24.2.yml
456
+ [🚎truby-25.0-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/truffleruby-25.0.yml
457
+ [🚎truby-33.0-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/truffleruby-33.0.yml
458
+ [🚎2-cov-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/coverage.yml
459
+ [🚎2-cov-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/coverage.yml/badge.svg
460
+ [🚎3-hd-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/heads.yml
461
+ [🚎3-hd-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/heads.yml/badge.svg
462
+ [🚎5-st-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/style.yml
463
+ [🚎5-st-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/style.yml/badge.svg
464
+ [🚎9-t-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/truffle.yml
465
+ [🚎9-t-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/truffle.yml/badge.svg
466
+ [🚎10-j-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/jruby.yml
467
+ [🚎10-j-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/jruby.yml/badge.svg
468
+ [🚎11-c-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/current.yml
469
+ [🚎11-c-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/current.yml/badge.svg
470
+ [🚎12-crh-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/dep-heads.yml
471
+ [🚎12-crh-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/dep-heads.yml/badge.svg
472
+ [🚎13-🔒️-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/locked_deps.yml
473
+ [🚎13-🔒️-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/locked_deps.yml/badge.svg
474
+ [🚎14-🔓️-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/unlocked_deps.yml
475
+ [🚎14-🔓️-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/unlocked_deps.yml/badge.svg
476
+ [🚎15-🪪-wf]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/license-eye.yml
477
+ [🚎15-🪪-wfi]: https://github.com/kettle-dev/kettle-gha-pins/actions/workflows/license-eye.yml/badge.svg
478
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
479
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
480
+ [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
481
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
482
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
483
+ [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
484
+ [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
485
+ [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
486
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
487
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
488
+ [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
489
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
490
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
491
+ [🤝gh-issues]: https://github.com/kettle-dev/kettle-gha-pins/issues
492
+ [🤝gh-pulls]: https://github.com/kettle-dev/kettle-gha-pins/pulls
493
+ [🤝gl-issues]: https://gitlab.com/kettle-dev/kettle-gha-pins/-/issues
494
+ [🤝gl-pulls]: https://gitlab.com/kettle-dev/kettle-gha-pins/-/merge_requests
495
+ [🤝cb-issues]: https://codeberg.org/kettle-dev/kettle-gha-pins/issues
496
+ [🤝cb-pulls]: https://codeberg.org/kettle-dev/kettle-gha-pins/pulls
497
+ [🤝cb-donate]: https://donate.codeberg.org/
498
+ [🤝contributing]: https://github.com/kettle-dev/kettle-gha-pins/blob/main/CONTRIBUTING.md
499
+ [🏀codecov-g]: https://codecov.io/gh/kettle-dev/kettle-gha-pins/graph/badge.svg
500
+ [🖐contrib-rocks]: https://contrib.rocks
501
+ [🖐contributors]: https://github.com/kettle-dev/kettle-gha-pins/graphs/contributors
502
+ [🖐contributors-img]: https://contrib.rocks/image?repo=kettle-dev/kettle-gha-pins
503
+ [🚎contributors-gl]: https://gitlab.com/kettle-dev/kettle-gha-pins/-/graphs/main
504
+ [🪇conduct]: https://github.com/kettle-dev/kettle-gha-pins/blob/main/CODE_OF_CONDUCT.md
505
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
506
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
507
+ [📌semver]: https://semver.org/spec/v2.0.0.html
508
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
509
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
510
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
511
+ [📌changelog]: https://github.com/kettle-dev/kettle-gha-pins/blob/main/CHANGELOG.md
512
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
513
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
514
+ [📌gitmoji]: https://gitmoji.dev
515
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
516
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
517
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.085-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
518
+ [🔐security]: https://github.com/kettle-dev/kettle-gha-pins/blob/main/SECURITY.md
519
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
520
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
521
+ [📄license]: LICENSE.md
522
+ [📄license-ref]: https://github.com/kettle-dev/kettle-gha-pins/blob/main/MIT.md
523
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
524
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
525
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
526
+
527
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
528
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
529
+ [🚎yard-current]: http://rubydoc.info/gems/kettle-gha-pins
530
+ [🚎yard-head]: https://kettle-gha-pins.galtzo.com
531
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
532
+ [💎SHA_checksums]: https://gitlab.com/kettle-dev/kettle-gha-pins/-/tree/main/checksums
533
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
534
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
535
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
536
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
537
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
538
+
539
+ <!-- kettle-jem:metadata:start -->
540
+ | Field | Value |
541
+ |---|---|
542
+ | Package | kettle-gha-pins |
543
+ | Description | 📌 Shared, deterministic GitHub Actions release-tag parsing, canonicalization, and upgrade selection logic for kettle-dev and kettle-jem workflow pin maintenance. |
544
+ | Homepage | https://github.com/kettle-dev/kettle-gha-pins |
545
+ | Source | https://github.com/kettle-dev/kettle-gha-pins |
546
+ | License | `MIT` |
547
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/kettle-dev, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-gha-pins, https://www.buymeacoffee.com/pboling |
548
+ <!-- kettle-jem:metadata:end -->
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kettle
4
+ module Gha
5
+ module Pins
6
+ module Version
7
+ VERSION = "0.1.0"
8
+ end
9
+ VERSION = Version::VERSION # Traditional Constant Location
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kettle
4
+ module Gha
5
+ module Pins
6
+ # Shared version ordering and upgrade selection rules for GitHub Action pins.
7
+ module VersionRubric
8
+ VALID_UPGRADE_LEVELS = %w[major minor patch].freeze
9
+ DEFAULT_UPGRADE_LEVEL = "patch"
10
+ RELEASE_TAG_RE = /\A(?:\d+|\d+\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?)\z/
11
+
12
+ module_function
13
+
14
+ def parse(value)
15
+ normalized = value.to_s.sub(/\A[vV]/, "")
16
+ return nil unless normalized.match?(RELEASE_TAG_RE)
17
+
18
+ Gem::Version.new(normalized)
19
+ rescue ArgumentError
20
+ nil
21
+ end
22
+
23
+ def major_line?(value)
24
+ value.to_s.match?(/\A\d+\z/)
25
+ end
26
+
27
+ def entry(tag:, sha: nil)
28
+ version_obj = parse(tag)
29
+ return nil unless version_obj
30
+
31
+ {
32
+ tag: tag.to_s,
33
+ version_obj: version_obj,
34
+ version: version_obj.to_s,
35
+ sha: sha
36
+ }
37
+ end
38
+
39
+ def build_release_versions(release_tags:, tag_shas:)
40
+ released_tags = release_tags.each_with_object({}) { |tag, memo| memo[tag.to_s] = true }
41
+ releases = release_tags.filter_map { |tag| entry(tag: tag, sha: tag_shas[tag.to_s]) }
42
+ tag_versions = tag_shas.filter_map do |tag, sha|
43
+ next if released_tags[tag.to_s]
44
+
45
+ entry(tag: tag, sha: sha)
46
+ end
47
+
48
+ sort_versions(canonicalize_equivalent_release_versions(releases + tag_versions)).reverse
49
+ end
50
+
51
+ def canonicalize_equivalent_release_versions(releases)
52
+ releases.each_with_object([]) do |release, groups|
53
+ group = groups.find { |entries| equivalent_release_tag?(entries.first, release) }
54
+ group ? group << release : groups << [release]
55
+ end.map { |entries| entries.max_by { |entry| sort_key(entry) } }
56
+ end
57
+
58
+ def sort_versions(versions)
59
+ versions.sort_by { |entry| sort_key(entry) }
60
+ end
61
+
62
+ def sort_key(entry)
63
+ [entry.fetch(:version_obj), *specificity(entry)]
64
+ end
65
+
66
+ def specificity(entry)
67
+ text = entry.fetch(:tag).to_s.sub(/\A[vV]/, "")
68
+ release_text, suffix = text.split(/[-.](?=[A-Za-z])/, 2)
69
+ numeric_segments = release_text.to_s.split(".").take_while { |part| part.match?(/\A\d+\z/) }
70
+
71
+ [
72
+ numeric_segments.length,
73
+ suffix ? 0 : 1,
74
+ text.length,
75
+ entry.fetch(:tag).to_s
76
+ ]
77
+ end
78
+
79
+ def choose_upgrade_target(current_version, versions, level)
80
+ normalized_level = normalize_upgrade_level(level)
81
+ current = parse(current_version)
82
+ return nil if current.nil?
83
+ return nil if normalized_level != "major" && major_line?(current_version)
84
+
85
+ versions.select do |entry|
86
+ entry.fetch(:version_obj, nil).is_a?(Gem::Version) &&
87
+ entry.fetch(:version_obj) > current &&
88
+ (!entry.fetch(:version_obj).prerelease? || current.prerelease?) &&
89
+ allowed_by_level?(current_version, current, entry, normalized_level)
90
+ end.max_by { |entry| sort_key(entry) }
91
+ end
92
+
93
+ def latest_outdated_target(current_version, versions)
94
+ current = parse(current_version)
95
+ return nil if current.nil?
96
+
97
+ versions.select do |entry|
98
+ entry.fetch(:version_obj, nil).is_a?(Gem::Version) &&
99
+ entry.fetch(:version_obj) > current &&
100
+ (!entry.fetch(:version_obj).prerelease? || current.prerelease?)
101
+ end.max_by { |entry| sort_key(entry) }
102
+ end
103
+
104
+ def normalize_upgrade_level(level)
105
+ normalized = level.to_s.downcase
106
+ VALID_UPGRADE_LEVELS.include?(normalized) ? normalized : DEFAULT_UPGRADE_LEVEL
107
+ end
108
+
109
+ def equivalent_release_tag?(left, right)
110
+ left[:version_obj] == right[:version_obj] &&
111
+ left[:sha] &&
112
+ right[:sha] &&
113
+ left[:sha] == right[:sha]
114
+ end
115
+
116
+ def allowed_by_level?(current_version, current, entry, level)
117
+ return true if level == "major"
118
+ return false if major_line?(entry.fetch(:version))
119
+ return false if major_line?(current_version)
120
+
121
+ case level
122
+ when "patch"
123
+ entry.fetch(:version_obj).segments[0, 2] == current.segments[0, 2]
124
+ when "minor"
125
+ entry.fetch(:version_obj).segments[0] == current.segments[0]
126
+ else
127
+ true
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "version_gem"
4
+
5
+ require_relative "pins/version_rubric"
6
+ require_relative "pins/version"
7
+
8
+ module Kettle
9
+ module Gha
10
+ module Pins
11
+ class Error < StandardError; end
12
+ end
13
+ end
14
+ end
15
+
16
+ Kettle::Gha::Pins::Version.class_eval do
17
+ extend VersionGem::Basic
18
+ end
@@ -0,0 +1,11 @@
1
+ module Kettle
2
+ module Gha
3
+ module Pins
4
+ VERSION: String
5
+ module Version
6
+ VERSION: String
7
+ end
8
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
9
+ end
10
+ end
11
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,299 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kettle-gha-pins
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter H. Boling
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
13
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
14
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
15
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
16
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
17
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
18
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
19
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
20
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
21
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
22
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
23
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
24
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
25
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
26
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
27
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
28
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
29
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
30
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
31
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
32
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
33
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
34
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
35
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
36
+ L9nRqA==
37
+ -----END CERTIFICATE-----
38
+ date: 1980-01-02 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: version_gem
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.1'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.1.14
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.1'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 1.1.14
60
+ - !ruby/object:Gem::Dependency
61
+ name: kettle-dev
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2.3'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 2.3.7
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '2.3'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 2.3.7
80
+ - !ruby/object:Gem::Dependency
81
+ name: bundler-audit
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: 0.9.3
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: 0.9.3
94
+ - !ruby/object:Gem::Dependency
95
+ name: rake
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '13.0'
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '13.0'
108
+ - !ruby/object:Gem::Dependency
109
+ name: require_bench
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '1.0'
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.4
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.0'
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: 1.0.4
128
+ - !ruby/object:Gem::Dependency
129
+ name: appraisal2
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '3.2'
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 3.2.0
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.2'
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: 3.2.0
148
+ - !ruby/object:Gem::Dependency
149
+ name: kettle-test
150
+ requirement: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '2.0'
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: 2.0.12
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '2.0'
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: 2.0.12
168
+ - !ruby/object:Gem::Dependency
169
+ name: turbo_tests2
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '3.2'
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: 3.2.0
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - "~>"
183
+ - !ruby/object:Gem::Version
184
+ version: '3.2'
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: 3.2.0
188
+ - !ruby/object:Gem::Dependency
189
+ name: ruby-progressbar
190
+ requirement: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.13'
195
+ type: :development
196
+ prerelease: false
197
+ version_requirements: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.13'
202
+ - !ruby/object:Gem::Dependency
203
+ name: stone_checksums
204
+ requirement: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.0'
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: 1.0.6
212
+ type: :development
213
+ prerelease: false
214
+ version_requirements: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - "~>"
217
+ - !ruby/object:Gem::Version
218
+ version: '1.0'
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: 1.0.6
222
+ - !ruby/object:Gem::Dependency
223
+ name: gitmoji-regex
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '2.0'
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: 2.0.4
232
+ type: :development
233
+ prerelease: false
234
+ version_requirements: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - "~>"
237
+ - !ruby/object:Gem::Version
238
+ version: '2.0'
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: 2.0.4
242
+ description: "\U0001F4CC Shared, deterministic GitHub Actions release-tag parsing,
243
+ canonicalization, and upgrade selection logic for kettle-dev and kettle-jem workflow
244
+ pin maintenance."
245
+ email:
246
+ - floss@galtzo.com
247
+ executables: []
248
+ extensions: []
249
+ extra_rdoc_files: []
250
+ files:
251
+ - CHANGELOG.md
252
+ - LICENSE.md
253
+ - README.md
254
+ - lib/kettle/gha/pins.rb
255
+ - lib/kettle/gha/pins/version.rb
256
+ - lib/kettle/gha/pins/version_rubric.rb
257
+ - sig/kettle/gha/pins.rbs
258
+ homepage: https://github.com/kettle-dev/kettle-gha-pins
259
+ licenses:
260
+ - MIT
261
+ metadata:
262
+ homepage_uri: https://github.com/kettle-dev/kettle-gha-pins
263
+ source_code_uri: https://github.com/kettle-dev/kettle-gha-pins/tree/v0.1.0
264
+ changelog_uri: https://github.com/kettle-dev/kettle-gha-pins/blob/v0.1.0/CHANGELOG.md
265
+ bug_tracker_uri: https://github.com/kettle-dev/kettle-gha-pins/issues
266
+ documentation_uri: https://www.rubydoc.info/gems/kettle-gha-pins/0.1.0
267
+ funding_uri: https://github.com/sponsors/pboling
268
+ wiki_uri: https://github.com/kettle-dev/kettle-gha-pins/wiki
269
+ news_uri: https://www.railsbling.com/tags/kettle-gha-pins
270
+ discord_uri: https://discord.gg/3qme4XHNKN
271
+ rubygems_mfa_required: 'true'
272
+ rdoc_options:
273
+ - "--title"
274
+ - "kettle-gha-pins - \U0001F4CC Shared GitHub Actions pin version rules for kettle-dev
275
+ tooling."
276
+ - "--main"
277
+ - README.md
278
+ - "--exclude"
279
+ - "^sig/"
280
+ - "--line-numbers"
281
+ - "--inline-source"
282
+ - "--quiet"
283
+ require_paths:
284
+ - lib
285
+ required_ruby_version: !ruby/object:Gem::Requirement
286
+ requirements:
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ version: 3.2.0
290
+ required_rubygems_version: !ruby/object:Gem::Requirement
291
+ requirements:
292
+ - - ">="
293
+ - !ruby/object:Gem::Version
294
+ version: '0'
295
+ requirements: []
296
+ rubygems_version: 4.0.17
297
+ specification_version: 4
298
+ summary: "\U0001F4CC Shared GitHub Actions pin version rules for kettle-dev tooling."
299
+ test_files: []
metadata.gz.sig ADDED
Binary file