version_gem 1.1.4 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,11 +1,45 @@
1
- # VersionGem
1
+ # 🔖 VersionGem
2
+
3
+ [![Version][👽versioni]][👽version]
4
+ [![License: MIT][📄license-img]][📄license-ref]
5
+ [![Downloads Rank][👽dl-ranki]][👽dl-rank]
6
+ [![Open Source Helpers][👽oss-helpi]][👽oss-help]
7
+ [![Depfu][🔑depfui♻️]][🔑depfu]
8
+ [![CodeCov Test Coverage][🔑codecovi♻️]][🔑codecov]
9
+ [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
10
+ [![CodeClimate Test Coverage][🔑cc-covi♻️]][🔑cc-cov]
11
+ [![Maintainability][🔑cc-mnti♻️]][🔑cc-mnt]
12
+ [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf]
13
+ [![CI Current][🚎11-c-wfi]][🚎11-c-wf]
14
+ [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf]
15
+ [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf]
16
+ [![CI Supported][🚎6-s-wfi]][🚎6-s-wf]
17
+ [![CI Legacy][🚎4-lg-wfi]][🚎4-lg-wf]
18
+ [![CI Unsupported][🚎7-us-wfi]][🚎7-us-wf]
19
+ [![CI Ancient][🚎1-an-wfi]][🚎1-an-wf]
20
+ [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf]
21
+ [![CI Style][🚎5-st-wfi]][🚎5-st-wf]
22
+
23
+ ---
2
24
 
3
- ## Alternatives
25
+ [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay]
26
+ [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor]
27
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme]
28
+ [![Donate on Polar][🖇polar-img]][🖇polar]
29
+ [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
30
+ [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
31
+
32
+ ## 🧐 Alternatives
4
33
 
5
34
  This gem has a very niche purpose, which is:
6
35
 
7
- 1. providing introspection of a `Version` module based on a `Version::VERSION` constant string,
8
- 2. while not interfering with `gemspec` parsing where the `VERSION` string is traditionally used.
36
+ 1. providing introspection of a `Version` module based on a `VERSION` constant string within it,
37
+ 2. while not interfering with `gemspec` parsing where the `VERSION` string is traditionally used,
38
+ 3. allowing 100% test coverage of Ruby code, including the `Version` module.
39
+
40
+ As proof in the pudding, this gem achieves 100% test coverage for lines and branches,
41
+ all 117 and 4 of them, respectively; coverage enabled in part by patterns from this library.
42
+ You can make it happen for your library too!
9
43
 
10
44
  If this isn't **precisely** your use case you may be better off looking at
11
45
  _[versionaire](https://www.alchemists.io/projects/versionaire)_, a wonderful, performant, well-maintained,
@@ -13,27 +47,7 @@ gem from the Alchemists, or _[version_sorter](https://rubygems.org/gems/version_
13
47
 
14
48
  For more discussion about this [see issue #2](https://gitlab.com/oauth-xx/version_gem/-/issues/2)
15
49
 
16
- -----
17
-
18
- <div id="badges">
19
-
20
- [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay]
21
- [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor]
22
- <span class="badge-buymeacoffee">
23
- <a href="https://ko-fi.com/O5O86SNP4" target='_blank' title="Donate to my FLOSS or refugee efforts at ko-fi.com"><img src="https://img.shields.io/badge/buy%20me%20coffee-donate-yellow.svg" alt="Buy me coffee donation button" /></a>
24
- </span>
25
- <span class="badge-patreon">
26
- <a href="https://patreon.com/galtzo" title="Donate to my FLOSS or refugee efforts using Patreon"><img src="https://img.shields.io/badge/patreon-donate-yellow.svg" alt="Patreon donate button" /></a>
27
- </span>
28
-
29
- </div>
30
-
31
- [⛳liberapay-img]: https://img.shields.io/liberapay/patrons/pboling.svg?logo=liberapay
32
- [⛳liberapay]: https://liberapay.com/pboling/donate
33
- [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
34
- [🖇sponsor]: https://github.com/sponsors/pboling
35
-
36
- ## Still here?
50
+ ## 🚀 Still here?
37
51
 
38
52
  Give your next library an introspectable `Version` module without breaking your Gemspec.
39
53
 
@@ -51,136 +65,23 @@ This library was extracted from the gem _[oauth2](https://gitlab.com/oauth-xx/oa
51
65
 
52
66
  This gem has no runtime dependencies.
53
67
 
54
- <!--
55
- Numbering rows and badges in each row as a visual "database" lookup,
56
- as the table is extremely dense, and it can be very difficult to find anything
57
- Putting one on each row here, to document the emoji that should be used, and for ease of copy/paste.
58
-
59
- row #s:
60
- 1️⃣
61
- 2️⃣
62
- 3️⃣
63
- 4️⃣
64
- 5️⃣
65
- 6️⃣
66
- 7️⃣
67
-
68
- badge #s:
69
- ⛳️
70
- 🖇
71
- 🏘
72
- 🚎
73
- 🖐
74
- 🧮
75
- 📗
76
-
77
- appended indicators:
78
- ♻️ - URL needs to be updated from SAAS integration. Find / Replace is insufficient.
79
- -->
80
-
81
- | | Project | bundle add version_gem |
82
- |:----|--------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
83
- | 1️⃣ | name, license, docs, standards | [![RubyGems.org][⛳️name-img]][⛳️gem] [![License: MIT][🖇src-license-img]][🖇src-license] [![RubyDoc.info][🚎yard-img]][🚎yard] [![SemVer 2.0.0][🧮semver-img]][🧮semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] |
84
- | 2️⃣ | version & activity | [![Gem Version][⛳️version-img]][⛳️gem] [![Total Downloads][🖇DL-total-img]][⛳️gem] [![Download Rank][🏘DL-rank-img]][⛳️gem] [![Source Code][🚎src-main-img]][🚎src-main] [![Open PRs][🖐prs-o-img]][🖐prs-o] [![Closed PRs][🧮prs-c-img]][🧮prs-c] |
85
- | 3️⃣ | maintenance & linting | [![Maintainability][⛳cclim-maint-img♻️]][⛳cclim-maint] [![Helpers][🖇triage-help-img]][🖇triage-help] [![Depfu][🏘depfu-img♻️]][🏘depfu♻️] [![Contributors][🚎contributors-img]][🚎contributors] [![Style][🖐style-wf-img]][🖐style-wf] [![Kloc Roll][🧮kloc-img]][🧮kloc] |
86
- | 4️⃣ | testing | [![Supported][🏘sup-wf-img]][🏘sup-wf] [![Heads][🚎heads-wf-img]][🚎heads-wf] [![Unofficial Support][🖐uns-wf-img]][🖐uns-wf] <!--[![MacOS][🧮mac-wf-img]][🧮mac-wf] [![Windows][📗win-wf-img]][📗win-wf]--> |
87
- | 5️⃣ | coverage & security | [![CodeClimate][⛳cclim-cov-img♻️]][⛳cclim-cov] [![CodeCov][🖇codecov-img♻️]][🖇codecov] [![Coveralls][🏘coveralls-img]][🏘coveralls] [![Security Policy][🚎sec-pol-img]][🚎sec-pol] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Code Coverage][🧮cov-wf-img]][🧮cov-wf] |
88
- | 6️⃣ | resources | [![Get help on Codementor][🖇codementor-img]][🖇codementor] [![Chat][🏘chat-img]][🏘chat] [![Blog][🚎blog-img]][🚎blog] [![Wiki][🖐wiki-img]][🖐wiki] |
89
- | 7️⃣ | spread 💖 | [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay] [![Sponsor Me][🖇sponsor-img]][🖇sponsor] [![Tweet @ Peter][🏘tweet-img]][🏘tweet] [🌏][aboutme] [👼][angelme] [💻][coderme] |
90
-
91
- <!--
92
- The link tokens in the following sections should be kept ordered by the row and badge numbering scheme
93
- -->
94
-
95
- <!-- 1️⃣ name, license, docs -->
96
- [⛳️gem]: https://rubygems.org/gems/version_gem
97
- [⛳️name-img]: https://img.shields.io/badge/name-version_gem-brightgreen.svg?style=flat
98
- [🖇src-license]: https://opensource.org/licenses/MIT
99
- [🖇src-license-img]: https://img.shields.io/badge/License-MIT-green.svg
100
- [🚎yard]: https://www.rubydoc.info/gems/version_gem
101
- [🚎yard-img]: https://img.shields.io/badge/documentation-rubydoc-brightgreen.svg?style=flat
102
- [🧮semver]: http://semver.org/
103
- [🧮semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat
104
- [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
105
- [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
106
-
107
- <!-- 2️⃣ version & activity -->
108
- [⛳️version-img]: http://img.shields.io/gem/v/version_gem.svg
109
- [🖇DL-total-img]: https://img.shields.io/gem/dt/version_gem.svg
110
- [🏘DL-rank-img]: https://img.shields.io/gem/rt/version_gem.svg
111
- [🚎src-main]: https://gitlab.com/oauth-xx/version_gem
112
- [🚎src-main-img]: https://img.shields.io/badge/source-gitlab-brightgreen.svg?style=flat
113
- [🖐prs-o]: https://gitlab.com/oauth-xx/version_gem/-/merge_requests
114
- [🖐prs-o-img]: https://img.shields.io/github/issues-pr/pboling/version_gem
115
- [🧮prs-c]: https://github.com/pboling/version_gem/pulls?q=is%3Apr+is%3Aclosed
116
- [🧮prs-c-img]: https://img.shields.io/github/issues-pr-closed/pboling/version_gem
117
-
118
- <!-- 3️⃣ maintenance & linting -->
119
- [⛳cclim-maint]: https://codeclimate.com/github/pboling/version_gem/maintainability
120
- [⛳cclim-maint-img♻️]: https://api.codeclimate.com/v1/badges/b504d61c4ed1d46aec02/maintainability
121
- [🖇triage-help]: https://www.codetriage.com/pboling/version_gem
122
- [🖇triage-help-img]: https://www.codetriage.com/pboling/version_gem/badges/users.svg
123
- [🏘depfu♻️]: https://depfu.com/github/pboling/version_gem?project_id=35803
124
- [🏘depfu-img♻️]: https://badges.depfu.com/badges/5d8943de6cfdf1ee048ad6d907f3e35b/count.svg
125
- [🚎contributors]: https://gitlab.com/oauth-xx/version_gem/-/graphs/main
126
- [🚎contributors-img]: https://img.shields.io/github/contributors-anon/pboling/version_gem
127
- [🖐style-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/style.yml
128
- [🖐style-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/style.yml/badge.svg
129
- [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
130
- [🧮kloc-img]: https://img.shields.io/tokei/lines/github.com/pboling/version_gem
131
-
132
- <!-- 4️⃣ testing -->
133
- [🏘sup-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/supported.yml
134
- [🏘sup-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/supported.yml/badge.svg
135
- [🚎heads-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/heads.yml
136
- [🚎heads-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/heads.yml/badge.svg
137
- [🖐uns-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/unsupported.yml
138
- [🖐uns-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/unsupported.yml/badge.svg
139
- [🧮mac-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/macos.yml
140
- [🧮mac-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/macos.yml/badge.svg
141
- [📗win-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/windows.yml
142
- [📗win-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/windows.yml/badge.svg
143
-
144
- <!-- 5️⃣ coverage & security -->
145
- [⛳cclim-cov]: https://codeclimate.com/github/pboling/version_gem/test_coverage
146
- [⛳cclim-cov-img♻️]: https://api.codeclimate.com/v1/badges/b504d61c4ed1d46aec02/test_coverage
147
- [🖇codecov-img♻️]: https://codecov.io/gh/pboling/version_gem/branch/main/graph/badge.svg?token=79c3X4vtfO
148
- [🖇codecov]: https://codecov.io/gh/pboling/version_gem
149
- [🏘coveralls]: https://coveralls.io/github/pboling/version_gem?branch=main
150
- [🏘coveralls-img]: https://coveralls.io/repos/github/pboling/version_gem/badge.svg?branch=main
151
- [🚎sec-pol]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/SECURITY.md
152
- [🚎sec-pol-img]: https://img.shields.io/badge/security-policy-brightgreen.svg?style=flat
153
- [🖐codeQL]: https://github.com/pboling/version_gem/security/code-scanning
154
- [🖐codeQL-img]: https://github.com/oauth-xx/version_gem/actions/workflows/codeql-analysis.yml/badge.svg
155
- [🧮cov-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/coverage.yml
156
- [🧮cov-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/coverage.yml/badge.svg
68
+ ## 💡 Info you can shake a stick at
157
69
 
158
- <!-- 6️⃣ resources -->
159
- [🖇codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
160
- [🖇codementor-img]: https://cdn.codementor.io/badges/get_help_github.svg
161
- [🏘chat]: https://gitter.im/oauth-xx/version_gem
162
- [🏘chat-img]: https://img.shields.io/gitter/room/oauth-xx/version_gem.svg
163
- [🚎blog]: http://www.railsbling.com/tags/version_gem/
164
- [🚎blog-img]: https://img.shields.io/badge/blog-railsbling-brightgreen.svg?style=flat
165
- [🖐wiki]: https://gitlab.com/oauth-xx/version_gem/-/wikis/home
166
- [🖐wiki-img]: https://img.shields.io/badge/wiki-examples-brightgreen.svg?style=flat
70
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
71
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
72
+ | Works with JRuby | [![JRuby 9.1 Compat][💎jruby-9.1i]][🚎10-j-wf] [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎10-j-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎10-j-wf] [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎10-j-wf] [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
73
+ | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎9-t-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎9-t-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf] |
74
+ | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎4-lg-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎6-s-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
75
+ | Works with MRI Ruby 2 | [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎1-an-wf] [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎1-an-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎1-an-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎7-us-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎7-us-wf] |
76
+ | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
77
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![HEAD on RubyDoc.info][📜docs-head-rd-img]][🚎yard-head] [![BDFL Blog][🚂bdfl-blog-img]][🚂bdfl-blog] [![Wiki][📜wiki-img]][📜wiki] |
78
+ | Compliance | [![License: MIT][📄license-img]][📄license-ref] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] |
79
+ | Expert 1:1 Support | [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] `or` [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
80
+ | Enterprise Support | [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]<br/>💡Subscribe for support guarantees covering _all_ FLOSS dependencies!<br/>💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]!<br/>💡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! |
81
+ | Comrade BDFL 🎖️ | [![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 BDFL][🚂bdfl-contact-img]][🚂bdfl-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
82
+ | `...` 💖 | [![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] |
167
83
 
168
- <!-- 7️⃣ spread 💖 -->
169
- [⛳liberapay-img]: https://img.shields.io/liberapay/patrons/pboling.svg?logo=liberapay
170
- [⛳liberapay]: https://liberapay.com/pboling/donate
171
- [🖇sponsor-img]: https://img.shields.io/badge/sponsor-pboling.svg?style=social&logo=github
172
- [🖇sponsor]: https://github.com/sponsors/pboling
173
- [🏘tweet-img]: https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow
174
- [🏘tweet]: http://twitter.com/galtzo
175
-
176
- <!-- Maintainer Contact Links -->
177
- [railsbling]: http://www.railsbling.com
178
- [peterboling]: http://www.peterboling.com
179
- [aboutme]: https://about.me/peter.boling
180
- [angelme]: https://angel.co/peter-boling
181
- [coderme]:http://coderwall.com/pboling
182
-
183
- ## Installation
84
+ ## Installation
184
85
 
185
86
  Install the gem and add to the application's Gemfile by executing:
186
87
 
@@ -190,7 +91,37 @@ If bundler is not being used to manage dependencies, install the gem by executin
190
91
 
191
92
  $ gem install version_gem
192
93
 
193
- ## Usage
94
+ ### 🔒 Secure Installation
95
+
96
+ `version_gem` is cryptographically signed, and with verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
97
+ [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
98
+ by following the instructions below.
99
+
100
+ Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
101
+
102
+ ```shell
103
+ gem cert --add <(curl -Ls https://raw.github.com/oauth-xx/version_gem/main/certs/pboling.pem)
104
+ ```
105
+
106
+ You only need to do that once. Then proceed to install with:
107
+
108
+ ```shell
109
+ gem install version_gem -P HighSecurity
110
+ ```
111
+
112
+ The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
113
+
114
+ If you want to up your security game full-time:
115
+
116
+ ```shell
117
+ bundle config set --global trust-policy MediumSecurity
118
+ ```
119
+
120
+ `MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
121
+
122
+ NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
123
+
124
+ ## 🔧 Basic Usage
194
125
 
195
126
  In the standard `bundle gem my_lib` code you get the following in `lib/my_lib/version.rb`:
196
127
 
@@ -237,14 +168,122 @@ MyLib::Version.to_a # => [0, 1, 0]
237
168
  MyLib::Version.to_h # => { major: 0, minor: 1, patch: 0, pre: "" }
238
169
  ```
239
170
 
240
- ### Side benefit
171
+ ### Side benefit #1
172
+
173
+ You can reference the version from your gemspec, keeping the version string DRY,
174
+ *and* still get accurate code coverage!
175
+
176
+ ```ruby
177
+ # Get the GEMFILE_VERSION without *require* "my_gem/version", for code coverage accuracy
178
+ # See: https://github.com/simplecov-ruby/simplecov/issues/557#issuecomment-2630782358
179
+ # Kernel.load because load is overloaded in RubyGems during gemspec evaluation
180
+ Kernel.load("lib/my_gem/version.rb")
181
+ gem_version = MyGem::Version::VERSION
182
+ MyGem::Version.send(:remove_const, :VERSION)
183
+
184
+ Gem::Specification.new do |spec|
185
+ # ...
186
+ spec.version = gem_version
187
+ end
188
+ ```
189
+
190
+ ### Side benefit #2
241
191
 
242
192
  Your `version.rb` file now abides the Ruby convention of directory / path matching the namespace / class!
243
193
 
244
- ### Zietwerk
194
+ ## Epoch Usage (Epoch Semantic Versioning, as of version 1.1.7)
195
+
196
+ In the standard `bundle gem my_lib` code you get the following in `lib/my_lib/version.rb`:
197
+
198
+ ```ruby
199
+ module MyLib
200
+ VERSION = "0.1.0"
201
+ end
202
+ ```
203
+
204
+ Change it to a nested `Version` namespace (the one implied by the path => namespace convention):
205
+
206
+ ```ruby
207
+ module MyLib
208
+ module Version
209
+ VERSION = "0.1.0"
210
+ end
211
+ end
212
+ ```
213
+
214
+ The Epoch and Major versions are derived from the formula:
215
+
216
+ ```
217
+ {EPOCH * 1000 + MAJOR}.MINOR.PATCH
218
+ ```
219
+
220
+ This will start your library with the following version segments:
221
+
222
+ * `epoch = 0`
223
+ * `major = 0`
224
+ * `minor = 1`
225
+ * `patch = 0`
226
+ * `pre = nil`
227
+
228
+ And the segments are defined as:
229
+
230
+ ```
231
+ EPOCH: Increment when you make significant or groundbreaking changes.
232
+ MAJOR: Increment when you make minor incompatible API changes.
233
+ MINOR: Increment when you add functionality in a backwards-compatible manner.
234
+ PATCH: Increment when you make backwards-compatible bug fixes.
235
+ ```
236
+
237
+ Therefore, if you set your version number to:
238
+
239
+ ```ruby
240
+ VERSION = "27016.42.86-pre.7"
241
+ ```
242
+
243
+ You will get the following version segments:
244
+
245
+ ```
246
+ {
247
+ epoch: 27,
248
+ major: 16,
249
+ minor: 42,
250
+ patch: 86,
251
+ pre: "pre-7",
252
+ }
253
+ ```
254
+
255
+ Now add the following near the top of the file the manages requiring external libraries.
256
+ Using the same example of `bundle gem my_lib`, this would be `lib/my_lib.rb`.
257
+
258
+ ```ruby
259
+ require "version_gem"
260
+ ```
261
+
262
+ Then, add the following wherever you want in the same file (recommend the bottom).
263
+
264
+ ```ruby
265
+ MyLib::Version.class_eval do
266
+ extend VersionGem::Epoch
267
+ end
268
+ ```
269
+
270
+ And now you have some version introspection methods available:
271
+
272
+ ```ruby
273
+ MyLib::Version.to_s # => "1024.3.8"
274
+ MyLib::Version.epoch # => 1
275
+ MyLib::Version.major # => 24
276
+ MyLib::Version.minor # => 3
277
+ MyLib::Version.patch # => 8
278
+ MyLib::Version.pre # => ""
279
+ MyLib::Version.to_a # => [1, 24, 3, 8]
280
+ MyLib::Version.to_h # => { epoch: 1, major: 24, minor: 3, patch: 8, pre: "" }
281
+ ```
282
+
283
+ ### Usage with Zeitwerk
245
284
 
246
285
  The pattern of `version.rb` breaking the ruby convention of directory / path matching the namespace / class
247
- is so entrenched that the `zeitwerk` library has a special carve-out for it.
286
+ is so entrenched that the `zeitwerk` library has a special carve-out for it. 🥺
248
287
  RubyGems using this "bad is actually good" pattern are encouraged to use `Zeitwerk.for_gem`.
249
288
 
250
289
  **Do not do that ^** if you use this gem.
@@ -283,8 +322,9 @@ end
283
322
 
284
323
  #### Complex Zeitwerk Example
285
324
 
325
+ Maybe you would like to contribute one?
286
326
 
287
- #### Query Ruby Version (as of version 1.2.0)
327
+ #### Query Ruby Version (as of version 1.1.2)
288
328
 
289
329
  In Continuous Integration environments for libraries that run against many versions of Ruby,
290
330
  I often need to configure things discretely per Ruby version, and doing so forced me to repeat
@@ -330,7 +370,7 @@ RSpec.describe(MyLib::Version) do
330
370
  it_behaves_like "a Version module", described_class
331
371
  end
332
372
 
333
- # Or, if you want to write your own, here is the a la carte menu:
373
+ # Or, if you want to write your own, here is the á la carte menu:
334
374
  RSpec.describe(MyLib::Version) do
335
375
  it "is a Version module" do
336
376
  expect(described_class).is_a?(Module)
@@ -338,52 +378,88 @@ RSpec.describe(MyLib::Version) do
338
378
  expect(described_class).to(have_version_as_string)
339
379
  expect(described_class.to_s).to(be_a(String))
340
380
  expect(described_class).to(have_major_as_integer)
381
+ expect(described_class).to(have_epoch_as_integer)
341
382
  expect(described_class).to(have_minor_as_integer)
342
383
  expect(described_class).to(have_patch_as_integer)
343
384
  expect(described_class).to(have_pre_as_nil_or_string)
385
+ # This would be %i[epoch major minor patch pre] for epoch version schemes
344
386
  expect(described_class.to_h.keys).to(match_array(%i[major minor patch pre]))
345
387
  expect(described_class.to_a).to(be_a(Array))
346
388
  end
347
389
  end
348
390
  ```
349
391
 
350
- ## Development
392
+ ## 🔐 Security
351
393
 
352
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
394
+ See [SECURITY.md][🔐security].
353
395
 
354
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
396
+ ## 🤝 Contributing
355
397
 
356
- ## Contributing
398
+ If you need some ideas of where to help, you could work on adding more code coverage,
399
+ or if it is already 💯 (see [below](#code-coverage)) then check [issues][🤝issues], or [PRs][🤝pulls],
400
+ or use the gem and think about how it could be better.
357
401
 
358
- See [CONTRIBUTING.md][contributing]
402
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
359
403
 
360
- ## Contributors
404
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
361
405
 
362
- [![Contributors](https://contrib.rocks/image?repo=pboling/version_gem)]("https://gitlab.com/oauth-xx/version_gem/-/graphs/main")
406
+ ### Code Coverage
363
407
 
364
- Made with [contributors-img](https://contrib.rocks).
408
+ [![Coverage Graph][🔑codecov-g♻️]][🔑codecov]
365
409
 
366
- ## License
410
+ ### 🪇 Code of Conduct
367
411
 
368
- The gem is available as open source under the terms of
369
- the [MIT License][license] [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)][license-ref].
370
- See [LICENSE][license] for the official [Copyright Notice][copyright-notice-explainer].
412
+ Everyone interacting in this project's codebases, issue trackers,
413
+ chat rooms and mailing lists is expected to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
414
+
415
+ ## 🌈 Contributors
416
+
417
+ [![Contributors][🖐contributors-img]][🖐contributors]
418
+
419
+ Made with [contributors-img][🖐contrib-rocks].
420
+
421
+ Also see GitLab Contributors: [https://gitlab.com/oauth-xx/version_gem/-/graphs/main][🚎contributors-gl]
371
422
 
372
- * Copyright (c) 2022 - 2023 [Peter H. Boling][peterboling] of [Rails Bling][railsbling]
423
+ ## ⭐️ Star History
373
424
 
374
- ## Code of Conduct
425
+ <a href="https://star-history.com/#oauth-xx/version_gem&Date">
426
+ <picture>
427
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=oauth-xx/version_gem&type=Date&theme=dark" />
428
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=oauth-xx/version_gem&type=Date" />
429
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=oauth-xx/version_gem&type=Date" />
430
+ </picture>
431
+ </a>
375
432
 
376
- Everyone interacting in the VersionGem project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://gitlab.com/oauth-xx/version_gem/-/blob/main/CODE_OF_CONDUCT.md).
433
+ ## 📌 Versioning
377
434
 
378
- ## Versioning
435
+ This Library adheres to [![Epoch Semantic Versioning][📌semver-img]][📌semver].
436
+ Violations of this scheme should be reported as bugs.
437
+ Specifically, if a minor or patch version is released that breaks backward compatibility,
438
+ a new version should be immediately released that restores compatibility.
439
+ Breaking changes to the public API, including dropping a supported platform (i.e. minor version of Ruby),
440
+ will only be introduced with new major versions.
441
+ Epoch will only be bumped if there are dramatic changes, and that is not expected to happen ever.
379
442
 
380
- This library aims to adhere to [Semantic Versioning 2.0.0][🧮semver]. Violations of this scheme should be reported as
381
- bugs. Specifically, if a minor or patch version is released that breaks backward compatibility, a new version should be
382
- immediately released that restores compatibility. Breaking changes to the public API will only be introduced with new
383
- major versions.
443
+ ### 📌 Is "Platform Support" part of the public API?
384
444
 
385
- As a result of this policy, you can (and should) specify a dependency on this gem using
386
- the [Pessimistic Version Constraint][pvc] with two digits of precision.
445
+ Yes. But I'm obligated to include notes...
446
+
447
+ SemVer should, but doesn't explicitly, say that dropping support for specific Platforms
448
+ is a *breaking change* to an API.
449
+ It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
450
+
451
+ > dropping support for a platform is both obviously and objectively a breaking change
452
+
453
+ - Jordan Harband (@ljharb, maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
454
+
455
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
456
+ read this article from the creator of SemVer:
457
+
458
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
459
+
460
+ As a result of this policy, and the interpretive lens used by the maintainer,
461
+ you can (and should) specify a dependency on these libraries using
462
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
387
463
 
388
464
  For example:
389
465
 
@@ -391,36 +467,189 @@ For example:
391
467
  spec.add_dependency("version_gem", "~> 1.1")
392
468
  ```
393
469
 
394
- ## Security
395
-
396
- See [SECURITY.md](https://gitlab.com/oauth-xx/version_gem/-/blob/main/SECURITY.md).
397
-
398
- [aboutme]: https://about.me/peter.boling
399
- [actions]: https://github.com/oauth-xx/version_gem/actions
400
- [angelme]: https://angel.co/peter-boling
401
- [blogpage]: http://www.railsbling.com/tags/version_gem/
402
- [codecov_coverage]: https://codecov.io/gh/oauth-xx/version_gem
403
- [code_triage]: https://www.codetriage.com/oauth-xx/version_gem
404
- [chat]: https://gitter.im/oauth-xx/version_gem?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
405
- [climate_coverage]: https://codeclimate.com/github/oauth-xx/version_gem/test_coverage
406
- [climate_maintainability]: https://codeclimate.com/github/oauth-xx/version_gem/maintainability
407
- [copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
408
- [conduct]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/CODE_OF_CONDUCT.md
409
- [contributing]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/CONTRIBUTING.md
410
- [devto]: https://dev.to/galtzo
411
- [documentation]: https://rubydoc.info/github/oauth-xx/version_gem/main
412
- [followme]: https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow
413
- [gh_sponsors]: https://github.com/sponsors/pboling
414
- [issues]: https://github.com/oauth-xx/version_gem/issues
415
- [liberapay_donate]: https://liberapay.com/pboling/donate
416
- [license]: LICENSE.txt
417
- [license-ref]: https://opensource.org/licenses/MIT
418
- [license-img]: https://img.shields.io/badge/License-MIT-green.svg
419
- [peterboling]: http://www.peterboling.com
420
- [pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
421
- [railsbling]: http://www.railsbling.com
422
- [rubygems]: https://rubygems.org/gems/version_gem
423
- [security]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/SECURITY.md
424
- [semver]: http://semver.org/
425
- [source]: https://gitlab.com/oauth-xx/version_gem
426
- [tweetme]: http://twitter.com/galtzo
470
+ See [CHANGELOG.md][📌changelog] for list of releases.
471
+
472
+ ## 📄 License
473
+
474
+ The gem is available as open source under the terms of
475
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
476
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
477
+
478
+ ### © Copyright
479
+
480
+ <p>
481
+ Copyright (c) 2022 - 2025 Peter H. Boling,
482
+ <a href="https://railsbling.com">
483
+ RailsBling.com
484
+ <picture>
485
+ <img alt="Rails Bling" height="20" src="https://railsbling.com/images/logos/RailsBling-TrainLogo.svg" />
486
+ </picture>
487
+ </a>
488
+ </p>
489
+
490
+ ## 🤑 One more thing
491
+
492
+ You made it to the bottom of the page,
493
+ so perhaps you'll indulge me for another 20 seconds.
494
+ I maintain many dozens of gems, including this one,
495
+ because I want Ruby to be a great place for people to solve problems, big and small.
496
+ Please consider supporting my efforts via the giant yellow link below,
497
+ or one of the others at the head of this README.
498
+
499
+ [![Buy me a latte][🖇buyme-img]][🖇buyme]
500
+
501
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
502
+ [🏘chat]: https://gitter.im/oauth-xx/version_gem
503
+ [🏘chat-img]: https://img.shields.io/gitter/room/oauth-xx/version_gem.svg
504
+ [⛳️gem-namespace]: https://github.com/oauth-xx/version_gem/blob/main/lib/version_gem.rb
505
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-VersionGem-brightgreen.svg?style=flat&logo=ruby&logoColor=white
506
+ [⛳️gem-name]: https://rubygems.org/gems/version_gem
507
+ [⛳️name-img]: https://img.shields.io/badge/name-version__gem-brightgreen.svg?style=flat&logo=rubygems&logoColor=red
508
+ [🚂bdfl-blog]: http://www.railsbling.com/tags/version_gem
509
+ [🚂bdfl-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
510
+ [🚂bdfl-contact]: http://www.railsbling.com/contact
511
+ [🚂bdfl-contact-img]: https://img.shields.io/badge/Contact-BDFL-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
512
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
513
+ [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
514
+ [💖✌️wellfound]: https://angel.co/u/peter-boling
515
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
516
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
517
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
518
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
519
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=flat&logo=mastodon&label=Ruby%20%40galtzo
520
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
521
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
522
+ [💖🌳linktree]: https://linktr.ee/galtzo
523
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
524
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
525
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
526
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
527
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
528
+ [💖🧊berg]: https://codeberg.org/pboling
529
+ [💖🐙hub]: https://github.org/pboling
530
+ [💖🛖hut]: https://sr.ht/~galtzo/
531
+ [💖🧪lab]: https://gitlab.com/pboling
532
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
533
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
534
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
535
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
536
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription
537
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
538
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
539
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
540
+ [🚂railsbling]: http://www.railsbling.com
541
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
542
+ [📜src-gl]: https://gitlab.com/oauth-xx/version_gem/
543
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
544
+ [📜src-gh]: https://github.com/oauth-xx/version_gem
545
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
546
+ [📜docs-head-rd-img]: https://img.shields.io/badge/RubyDoc-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
547
+ [📜wiki]: https://gitlab.com/oauth-xx/version_gem/-/wikis/home
548
+ [📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=Wiki&logoColor=white
549
+ [👽dl-rank]: https://rubygems.org/gems/version_gem
550
+ [👽dl-ranki]: https://img.shields.io/gem/rd/version_gem.svg
551
+ [👽oss-help]: https://www.codetriage.com/oauth-xx/version_gem
552
+ [👽oss-helpi]: https://www.codetriage.com/oauth-xx/version_gem/badges/users.svg
553
+ [👽version]: https://rubygems.org/gems/version_gem
554
+ [👽versioni]: https://img.shields.io/gem/v/version_gem.svg
555
+ [🔑cc-mnt]: https://qlty.sh/gh/oauth-xx/projects/version_gem
556
+ [🔑cc-mnti♻️]: https://qlty.sh/badges/19404e90-9168-451a-8dac-882382cb768d/maintainability.svg
557
+ [🔑cc-cov]: https://qlty.sh/gh/oauth-xx/projects/version_gem
558
+ [🔑cc-covi♻️]: https://qlty.sh/badges/19404e90-9168-451a-8dac-882382cb768d/test_coverage.svg
559
+ [🔑codecov]: https://codecov.io/gh/oauth-xx/version_gem
560
+ [🔑codecovi♻️]: https://codecov.io/gh/oauth-xx/version_gem/branch/main/graph/badge.svg?token=cc6UdZCpAL
561
+ [🔑coveralls]: https://coveralls.io/github/oauth-xx/version_gem?branch=main
562
+ [🔑coveralls-img]: https://coveralls.io/repos/github/oauth-xx/version_gem/badge.svg?branch=main
563
+ [🔑depfu]: https://depfu.com/github/oauth-xx/version_gem
564
+ [🔑depfui♻️]: https://badges.depfu.com/badges/6c9b45362951b872127f9e46d39bed76/count.svg
565
+ [🖐codeQL]: https://github.com/oauth-xx/version_gem/security/code-scanning
566
+ [🖐codeQL-img]: https://github.com/oauth-xx/version_gem/actions/workflows/codeql-analysis.yml/badge.svg
567
+ [🚎1-an-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/ancient.yml
568
+ [🚎1-an-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/ancient.yml/badge.svg
569
+ [🚎2-cov-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/coverage.yml
570
+ [🚎2-cov-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/coverage.yml/badge.svg
571
+ [🚎3-hd-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/heads.yml
572
+ [🚎3-hd-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/heads.yml/badge.svg
573
+ [🚎4-lg-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/legacy.yml
574
+ [🚎4-lg-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/legacy.yml/badge.svg
575
+ [🚎5-st-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/style.yml
576
+ [🚎5-st-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/style.yml/badge.svg
577
+ [🚎6-s-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/supported.yml
578
+ [🚎6-s-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/supported.yml/badge.svg
579
+ [🚎7-us-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/unsupported.yml
580
+ [🚎7-us-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/unsupported.yml/badge.svg
581
+ [🚎9-t-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/truffle.yml
582
+ [🚎9-t-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/truffle.yml/badge.svg
583
+ [🚎10-j-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/jruby.yml
584
+ [🚎10-j-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/jruby.yml/badge.svg
585
+ [🚎11-c-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/current.yml
586
+ [🚎11-c-wfi]: https://github.com/oauth-xx/version_gem/actions/workflows/current.yml/badge.svg
587
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay
588
+ [⛳liberapay]: https://liberapay.com/pboling/donate
589
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
590
+ [🖇sponsor]: https://github.com/sponsors/pboling
591
+ [🖇polar-img]: https://img.shields.io/badge/polar-donate-yellow.svg
592
+ [🖇polar]: https://polar.sh/pboling
593
+ [🖇kofi-img]: https://img.shields.io/badge/a_more_different_coffee-✓-yellow.svg
594
+ [🖇kofi]: https://ko-fi.com/O5O86SNP4
595
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg
596
+ [🖇patreon]: https://patreon.com/galtzo
597
+ [🖇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
598
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
599
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-✓-yellow.svg?style=flat
600
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
601
+ [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
602
+ [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
603
+ [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
604
+ [💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
605
+ [💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
606
+ [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
607
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
608
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
609
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
610
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
611
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
612
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
613
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
614
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
615
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
616
+ [💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1-FBE742?style=for-the-badge&logo=ruby&logoColor=red
617
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
618
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
619
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
620
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
621
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
622
+ [🤝issues]: https://github.com/oauth-xx/version_gem/issues
623
+ [🤝pulls]: https://github.com/oauth-xx/version_gem/pulls
624
+ [🤝contributing]: CONTRIBUTING.md
625
+ [🔑codecov-g♻️]: https://codecov.io/gh/oauth-xx/version_gem/graphs/tree.svg?token=cc6UdZCpAL
626
+ [🖐contrib-rocks]: https://contrib.rocks
627
+ [🖐contributors]: https://github.com/oauth-xx/version_gem/graphs/contributors
628
+ [🖐contributors-img]: https://contrib.rocks/image?repo=oauth-xx/version_gem
629
+ [🚎contributors-gl]: https://gitlab.com/oauth-xx/version_gem/-/graphs/main
630
+ [🪇conduct]: CODE_OF_CONDUCT.md
631
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-4baaaa.svg
632
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
633
+ [📌semver]: https://antfu.me/posts/epoch-semver
634
+ [📌semver-img]: https://img.shields.io/badge/epoch-semver-FFDD67.svg?style=flat
635
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
636
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
637
+ [📌changelog]: CHANGELOG.md
638
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
639
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
640
+ [📌gitmoji]:https://gitmoji.dev
641
+ [📌gitmoji-img]:https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67.svg?style=flat-square
642
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
643
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.117-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
644
+ [🔐security]: SECURITY.md
645
+ [🔐security-img]: https://img.shields.io/badge/security-policy-brightgreen.svg?style=flat
646
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
647
+ [📄license]: LICENSE.txt
648
+ [📄license-ref]: https://opensource.org/licenses/MIT
649
+ [📄license-img]: https://img.shields.io/badge/License-MIT-green.svg
650
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
651
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-brightgreen.svg?style=flat
652
+ [🚎yard-current]: http://rubydoc.info/gems/version_gem
653
+ [🚎yard-head]: https://rubydoc.info/github/oauth-xx/version_gem/main
654
+ [💎stone_checksums]: https://github.com/pboling/stone_checksums
655
+ [💎SHA_checksums]: https://gitlab.com/oauth-xx/version_gem/-/tree/main/checksums