version_gem 1.1.3 → 1.1.9

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,19 +1,25 @@
1
- # VersionGem
1
+ [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![version_gem Logo by Aboling0, CC BY-SA 4.0][🖼️version_gem-i]][🖼️version_gem]
2
2
 
3
- ## Alternatives
3
+ [🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
+ [🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
5
+ [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
6
+ [🖼️ruby-lang]: https://www.ruby-lang.org/
7
+ [🖼️version_gem-i]: https://logos.galtzo.com/assets/images/ruby-oauth/version_gem/avatar-192px.svg
8
+ [🖼️version_gem]: https://github.com/ruby-oauth/version_gem
4
9
 
5
- This gem has a very niche purpose, which is:
10
+ # 🔖 VersionGem
6
11
 
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.
12
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![CodeCov Test Coverage][🔑codecovi]][🔑codecov] [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls] [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov] [![QLTY Maintainability][🔑qlty-mnti]][🔑qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Legacy][🚎4-lg-wfi]][🚎4-lg-wf] [![CI Unsupported][🚎7-us-wfi]][🚎7-us-wf] [![CI Ancient][🚎1-an-wfi]][🚎1-an-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL]
9
13
 
10
- If this isn't **precisely** your use case you may be better off looking at
11
- _[versionaire](https://www.alchemists.io/projects/versionaire)_, a wonderful, performant, well-maintained,
12
- gem from the Alchemists, or _[version_sorter](https://rubygems.org/gems/version_sorter)_ from GitHub.
14
+ If ☝️ `ci_badges.map(&:color).detect { it != "green"}` [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
13
15
 
14
- For more discussion about this [see issue #2](https://gitlab.com/oauth-xx/version_gem/-/issues/2)
16
+ ---
17
+
18
+ OTOH, 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.
15
19
 
16
- ## Still here?
20
+ [![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 on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
21
+
22
+ ## 🌻 Synopsis
17
23
 
18
24
  Give your next library an introspectable `Version` module without breaking your Gemspec.
19
25
 
@@ -31,146 +37,138 @@ This library was extracted from the gem _[oauth2](https://gitlab.com/oauth-xx/oa
31
37
 
32
38
  This gem has no runtime dependencies.
33
39
 
34
- <!--
35
- Numbering rows and badges in each row as a visual "database" lookup,
36
- as the table is extremely dense, and it can be very difficult to find anything
37
- Putting one on each row here, to document the emoji that should be used, and for ease of copy/paste.
38
-
39
- row #s:
40
- 1️⃣
41
- 2️⃣
42
- 3️⃣
43
- 4️⃣
44
- 5️⃣
45
- 6️⃣
46
- 7️⃣
47
-
48
- badge #s:
49
- ⛳️
50
- 🖇
51
- 🏘
52
- 🚎
53
- 🖐
54
- 🧮
55
- 📗
56
-
57
- appended indicators:
58
- ♻️ - URL needs to be updated from SAAS integration. Find / Replace is insufficient.
59
- -->
60
-
61
- | | Project | bundle add version_gem |
62
- |:----|--------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
63
- | 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] |
64
- | 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] |
65
- | 3️⃣ | maintanence & 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] |
66
- | 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]--> |
67
- | 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] |
68
- | 6️⃣ | resources | [![Get help on Codementor][🖇codementor-img]][🖇codementor] [![Chat][🏘chat-img]][🏘chat] [![Blog][🚎blog-img]][🚎blog] [![Wiki][🖐wiki-img]][🖐wiki] |
69
- | 7️⃣ | spread 💖 | [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay] [![Sponsor Me][🖇sponsor-img]][🖇sponsor] [![Tweet @ Peter][🏘tweet-img]][🏘tweet] [🌏][aboutme] [👼][angelme] [💻][coderme] |
70
-
71
- <!--
72
- The link tokens in the following sections should be kept ordered by the row and badge numbering scheme
73
- -->
74
-
75
- <!-- 1️⃣ name, license, docs -->
76
- [⛳️gem]: https://rubygems.org/gems/version_gem
77
- [⛳️name-img]: https://img.shields.io/badge/name-version_gem-brightgreen.svg?style=flat
78
- [🖇src-license]: https://opensource.org/licenses/MIT
79
- [🖇src-license-img]: https://img.shields.io/badge/License-MIT-green.svg
80
- [🚎yard]: https://www.rubydoc.info/gems/version_gem
81
- [🚎yard-img]: https://img.shields.io/badge/documentation-rubydoc-brightgreen.svg?style=flat
82
- [🧮semver]: http://semver.org/
83
- [🧮semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat
84
- [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
85
- [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
86
-
87
- <!-- 2️⃣ version & activity -->
88
- [⛳️version-img]: http://img.shields.io/gem/v/version_gem.svg
89
- [🖇DL-total-img]: https://img.shields.io/gem/dt/version_gem.svg
90
- [🏘DL-rank-img]: https://img.shields.io/gem/rt/version_gem.svg
91
- [🚎src-main]: https://gitlab.com/oauth-xx/version_gem
92
- [🚎src-main-img]: https://img.shields.io/badge/source-gitlab-brightgreen.svg?style=flat
93
- [🖐prs-o]: https://gitlab.com/oauth-xx/version_gem/-/merge_requests
94
- [🖐prs-o-img]: https://img.shields.io/github/issues-pr/pboling/version_gem
95
- [🧮prs-c]: https://github.com/pboling/version_gem/pulls?q=is%3Apr+is%3Aclosed
96
- [🧮prs-c-img]: https://img.shields.io/github/issues-pr-closed/pboling/version_gem
97
-
98
- <!-- 3️⃣ maintanence & linting -->
99
- [⛳cclim-maint]: https://codeclimate.com/github/pboling/version_gem/maintainability
100
- [⛳cclim-maint-img♻️]: https://api.codeclimate.com/v1/badges/b504d61c4ed1d46aec02/maintainability
101
- [🖇triage-help]: https://www.codetriage.com/pboling/version_gem
102
- [🖇triage-help-img]: https://www.codetriage.com/pboling/version_gem/badges/users.svg
103
- [🏘depfu♻️]: https://depfu.com/github/pboling/version_gem?project_id=35803
104
- [🏘depfu-img♻️]: https://badges.depfu.com/badges/5d8943de6cfdf1ee048ad6d907f3e35b/count.svg
105
- [🚎contributors]: https://gitlab.com/oauth-xx/version_gem/-/graphs/main
106
- [🚎contributors-img]: https://img.shields.io/github/contributors-anon/pboling/version_gem
107
- [🖐style-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/style.yml
108
- [🖐style-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/style.yml/badge.svg
109
- [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
110
- [🧮kloc-img]: https://img.shields.io/tokei/lines/github.com/pboling/version_gem
111
-
112
- <!-- 4️⃣ testing -->
113
- [🏘sup-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/supported.yml
114
- [🏘sup-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/supported.yml/badge.svg
115
- [🚎heads-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/heads.yml
116
- [🚎heads-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/heads.yml/badge.svg
117
- [🖐uns-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/unsupported.yml
118
- [🖐uns-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/unsupported.yml/badge.svg
119
- [🧮mac-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/macos.yml
120
- [🧮mac-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/macos.yml/badge.svg
121
- [📗win-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/windows.yml
122
- [📗win-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/windows.yml/badge.svg
123
-
124
- <!-- 5️⃣ coverage & security -->
125
- [⛳cclim-cov]: https://codeclimate.com/github/pboling/version_gem/test_coverage
126
- [⛳cclim-cov-img♻️]: https://api.codeclimate.com/v1/badges/b504d61c4ed1d46aec02/test_coverage
127
- [🖇codecov-img♻️]: https://codecov.io/gh/pboling/version_gem/branch/main/graph/badge.svg?token=79c3X4vtfO
128
- [🖇codecov]: https://codecov.io/gh/pboling/version_gem
129
- [🏘coveralls]: https://coveralls.io/github/pboling/version_gem?branch=main
130
- [🏘coveralls-img]: https://coveralls.io/repos/github/pboling/version_gem/badge.svg?branch=main
131
- [🚎sec-pol]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/SECURITY.md
132
- [🚎sec-pol-img]: https://img.shields.io/badge/security-policy-brightgreen.svg?style=flat
133
- [🖐codeQL]: https://github.com/pboling/version_gem/security/code-scanning
134
- [🖐codeQL-img]: https://github.com/oauth-xx/version_gem/actions/workflows/codeql-analysis.yml/badge.svg
135
- [🧮cov-wf]: https://github.com/oauth-xx/version_gem/actions/workflows/coverage.yml
136
- [🧮cov-wf-img]: https://github.com/oauth-xx/version_gem/actions/workflows/coverage.yml/badge.svg
137
-
138
- <!-- 6️⃣ resources -->
139
- [🖇codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
140
- [🖇codementor-img]: https://cdn.codementor.io/badges/get_help_github.svg
141
- [🏘chat]: https://gitter.im/oauth-xx/version_gem
142
- [🏘chat-img]: https://img.shields.io/gitter/room/oauth-xx/version_gem.svg
143
- [🚎blog]: http://www.railsbling.com/tags/version_gem/
144
- [🚎blog-img]: https://img.shields.io/badge/blog-railsbling-brightgreen.svg?style=flat
145
- [🖐wiki]: https://gitlab.com/oauth-xx/version_gem/-/wikis/home
146
- [🖐wiki-img]: https://img.shields.io/badge/wiki-examples-brightgreen.svg?style=flat
147
-
148
- <!-- 7️⃣ spread 💖 -->
149
- [⛳liberapay-img]: https://img.shields.io/liberapay/patrons/pboling.svg?logo=liberapay
150
- [⛳liberapay]: https://liberapay.com/pboling/donate
151
- [🖇sponsor-img]: https://img.shields.io/badge/sponsor-pboling.svg?style=social&logo=github
152
- [🖇sponsor]: https://github.com/sponsors/pboling
153
- [🏘tweet-img]: https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow
154
- [🏘tweet]: http://twitter.com/galtzo
155
40
 
156
- <!-- Maintainer Contact Links -->
157
- [railsbling]: http://www.railsbling.com
158
- [peterboling]: http://www.peterboling.com
159
- [aboutme]: https://about.me/peter.boling
160
- [angelme]: https://angel.co/peter-boling
161
- [coderme]:http://coderwall.com/pboling
41
+ ### 🧐 Alternatives
42
+
43
+ This gem has a very niche purpose, which is:
44
+
45
+ 1. providing introspection of a `Version` module based on a `VERSION` constant string within it,
46
+ 2. while not interfering with `gemspec` parsing where the `VERSION` string is traditionally used,
47
+ 3. allowing 100% test coverage of Ruby code, including the `Version` module.
48
+
49
+ As proof in the pudding, this gem achieves 100% test coverage for lines and branches,
50
+ all 118 and 4 of them, respectively; coverage enabled in part by patterns from this library.
51
+ You can make it happen for your library too!
52
+
53
+ If this isn't **precisely** your use case you may be better off looking at
54
+ _[versionaire](https://www.alchemists.io/projects/versionaire)_, a wonderful, performant, well-maintained,
55
+ gem from the Alchemists, or _[version_sorter](https://rubygems.org/gems/version_sorter)_ from GitHub.
56
+
57
+ For more discussion about this [see issue #2](https://gitlab.com/oauth-xx/version_gem/-/issues/2)
58
+
59
+ ## 💡 Info you can shake a stick at
162
60
 
163
- ## Installation
61
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
62
+ |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
63
+ | Works with JRuby | ![JRuby 9.1 Compat][💎jruby-9.1i] ![JRuby 9.2 Compat][💎jruby-9.2i] ![JRuby 9.3 Compat][💎jruby-9.3i] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎10-j-wf] [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
64
+ | Works with Truffle Ruby | ![Truffle Ruby 22.3 Compat][💎truby-22.3i] ![Truffle Ruby 23.0 Compat][💎truby-23.0i] <br/> [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
65
+ | 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] |
66
+ | Works with MRI Ruby 2 | ![Ruby 2.2 Compat][💎ruby-2.2i] <br/> [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎1-an-wf] [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎1-an-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎1-an-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎7-us-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎7-us-wf] |
67
+ | 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] |
68
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![Wiki][📜wiki-img]][📜wiki] |
69
+ | Compliance | [![License: MIT][📄license-img]][📄license-ref] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
70
+ | 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] |
71
+ | Support | [![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] |
72
+ | 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] |
73
+ | `...` 💖 | [![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] |
74
+
75
+ ### Compatibility
76
+
77
+ Compatible with MRI Ruby 2.3+, and concordant releases of JRuby, and TruffleRuby.
78
+
79
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 |
80
+ |------------------------------------------------|-------------------------------------------------------------------------------------|
81
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
82
+
83
+ ### Federated DVCS
84
+
85
+ <details>
86
+ <summary>Find this repo on other forges</summary>
87
+
88
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
89
+ |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
90
+ | 🧪 [ruby-oauth/version_gem on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜wiki] | 🏀 Tiny Matrix | ➖ |
91
+ | 🧊 [ruby-oauth/version_gem on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
92
+ | 🐙 [ruby-oauth/version_gem on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | ➖ | 💯 Full Matrix | [💚][gh-discussions] |
93
+ | 🎮️ [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] |
94
+
95
+ </details>
96
+
97
+ [gh-discussions]: https://github.com/ruby-oauth/version_gem/discussions
98
+
99
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/version_gem)](https://tidelift.com/subscription/pkg/rubygems-version_gem?utm_source=rubygems-version_gem&utm_medium=referral&utm_campaign=readme)
100
+
101
+ Available as part of the Tidelift Subscription.
102
+
103
+ <details>
104
+ <summary>Need enterprise-level guarantees?</summary>
105
+
106
+ 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.
107
+
108
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
109
+
110
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
111
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
112
+ - 💡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
113
+
114
+ Alternatively:
115
+
116
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
117
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
118
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
119
+
120
+ </details>
121
+
122
+ ## ✨ Installation
164
123
 
165
124
  Install the gem and add to the application's Gemfile by executing:
166
125
 
167
- $ bundle add version_gem
126
+ ```console
127
+ bundle add version_gem
128
+ ```
168
129
 
169
130
  If bundler is not being used to manage dependencies, install the gem by executing:
170
131
 
171
- $ gem install version_gem
132
+ ```console
133
+ gem install version_gem
134
+ ```
135
+
136
+ ### 🔒 Secure Installation
137
+
138
+ <details>
139
+ <summary>For Medium or High Security Installations</summary>
172
140
 
173
- ## Usage
141
+ This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
142
+ [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
143
+ by following the instructions below.
144
+
145
+ Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
146
+
147
+ ```console
148
+ gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
149
+ ```
150
+
151
+ You only need to do that once. Then proceed to install with:
152
+
153
+ ```console
154
+ gem install version_gem -P HighSecurity
155
+ ```
156
+
157
+ The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
158
+
159
+ If you want to up your security game full-time:
160
+
161
+ ```console
162
+ bundle config set --global trust-policy MediumSecurity
163
+ ```
164
+
165
+ `MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
166
+
167
+ NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
168
+
169
+ </details>
170
+
171
+ ## ⚙️ Configuration
174
172
 
175
173
  In the standard `bundle gem my_lib` code you get the following in `lib/my_lib/version.rb`:
176
174
 
@@ -205,7 +203,9 @@ MyLib::Version.class_eval do
205
203
  end
206
204
  ```
207
205
 
208
- And now you have some version introspection methods available:
206
+ ## 🔧 Basic Usage
207
+
208
+ Now you have some version introspection methods available:
209
209
 
210
210
  ```ruby
211
211
  MyLib::Version.to_s # => "0.1.0"
@@ -217,14 +217,122 @@ MyLib::Version.to_a # => [0, 1, 0]
217
217
  MyLib::Version.to_h # => { major: 0, minor: 1, patch: 0, pre: "" }
218
218
  ```
219
219
 
220
- ### Side benefit
220
+ ### Side benefit #1
221
+
222
+ You can reference the version from your gemspec, keeping the version string DRY,
223
+ *and* still get accurate code coverage!
224
+
225
+ ```ruby
226
+ # Get the GEMFILE_VERSION without *require* "my_gem/version", for code coverage accuracy
227
+ # See: https://github.com/simplecov-ruby/simplecov/issues/557#issuecomment-2630782358
228
+ # Kernel.load because load is overloaded in RubyGems during gemspec evaluation
229
+ Kernel.load("lib/my_gem/version.rb")
230
+ gem_version = MyGem::Version::VERSION
231
+ MyGem::Version.send(:remove_const, :VERSION)
232
+
233
+ Gem::Specification.new do |spec|
234
+ # ...
235
+ spec.version = gem_version
236
+ end
237
+ ```
238
+
239
+ ### Side benefit #2
221
240
 
222
241
  Your `version.rb` file now abides the Ruby convention of directory / path matching the namespace / class!
223
242
 
224
- ### Zietwerk
243
+ ### Epoch Usage (Epoch Semantic Versioning, as of version 1.1.7)
244
+
245
+ In the standard `bundle gem my_lib` code you get the following in `lib/my_lib/version.rb`:
246
+
247
+ ```ruby
248
+ module MyLib
249
+ VERSION = "0.1.0"
250
+ end
251
+ ```
252
+
253
+ Change it to a nested `Version` namespace (the one implied by the path => namespace convention):
254
+
255
+ ```ruby
256
+ module MyLib
257
+ module Version
258
+ VERSION = "0.1.0"
259
+ end
260
+ end
261
+ ```
262
+
263
+ The Epoch and Major versions are derived from the formula:
264
+
265
+ ```
266
+ {EPOCH * 1000 + MAJOR}.MINOR.PATCH
267
+ ```
268
+
269
+ This will start your library with the following version segments:
270
+
271
+ * `epoch = 0`
272
+ * `major = 0`
273
+ * `minor = 1`
274
+ * `patch = 0`
275
+ * `pre = nil`
276
+
277
+ And the segments are defined as:
278
+
279
+ ```
280
+ EPOCH: Increment when you make significant or groundbreaking changes.
281
+ MAJOR: Increment when you make minor incompatible API changes.
282
+ MINOR: Increment when you add functionality in a backwards-compatible manner.
283
+ PATCH: Increment when you make backwards-compatible bug fixes.
284
+ ```
285
+
286
+ Therefore, if you set your version number to:
287
+
288
+ ```ruby
289
+ VERSION = "27016.42.86-pre.7"
290
+ ```
291
+
292
+ You will get the following version segments:
293
+
294
+ ```
295
+ {
296
+ epoch: 27,
297
+ major: 16,
298
+ minor: 42,
299
+ patch: 86,
300
+ pre: "pre-7",
301
+ }
302
+ ```
303
+
304
+ Now add the following near the top of the file the manages requiring external libraries.
305
+ Using the same example of `bundle gem my_lib`, this would be `lib/my_lib.rb`.
306
+
307
+ ```ruby
308
+ require "version_gem"
309
+ ```
310
+
311
+ Then, add the following wherever you want in the same file (recommend the bottom).
312
+
313
+ ```ruby
314
+ MyLib::Version.class_eval do
315
+ extend VersionGem::Epoch
316
+ end
317
+ ```
318
+
319
+ And now you have some version introspection methods available:
320
+
321
+ ```ruby
322
+ MyLib::Version.to_s # => "1024.3.8"
323
+ MyLib::Version.epoch # => 1
324
+ MyLib::Version.major # => 24
325
+ MyLib::Version.minor # => 3
326
+ MyLib::Version.patch # => 8
327
+ MyLib::Version.pre # => ""
328
+ MyLib::Version.to_a # => [1, 24, 3, 8]
329
+ MyLib::Version.to_h # => { epoch: 1, major: 24, minor: 3, patch: 8, pre: "" }
330
+ ```
331
+
332
+ ### Usage with Zeitwerk
225
333
 
226
334
  The pattern of `version.rb` breaking the ruby convention of directory / path matching the namespace / class
227
- is so entrenched that the `zeitwerk` library has a special carve-out for it.
335
+ is so entrenched that the `zeitwerk` library has a special carve-out for it. 🥺
228
336
  RubyGems using this "bad is actually good" pattern are encouraged to use `Zeitwerk.for_gem`.
229
337
 
230
338
  **Do not do that ^** if you use this gem.
@@ -263,8 +371,9 @@ end
263
371
 
264
372
  #### Complex Zeitwerk Example
265
373
 
374
+ Maybe you would like to contribute one?
266
375
 
267
- #### Query Ruby Version (as of version 1.2.0)
376
+ #### Query Ruby Version (as of version 1.1.2)
268
377
 
269
378
  In Continuous Integration environments for libraries that run against many versions of Ruby,
270
379
  I often need to configure things discretely per Ruby version, and doing so forced me to repeat
@@ -310,7 +419,7 @@ RSpec.describe(MyLib::Version) do
310
419
  it_behaves_like "a Version module", described_class
311
420
  end
312
421
 
313
- # Or, if you want to write your own, here is the a la carte menu:
422
+ # Or, if you want to write your own, here is the á la carte menu:
314
423
  RSpec.describe(MyLib::Version) do
315
424
  it "is a Version module" do
316
425
  expect(described_class).is_a?(Module)
@@ -318,52 +427,137 @@ RSpec.describe(MyLib::Version) do
318
427
  expect(described_class).to(have_version_as_string)
319
428
  expect(described_class.to_s).to(be_a(String))
320
429
  expect(described_class).to(have_major_as_integer)
430
+ expect(described_class).to(have_epoch_as_integer)
321
431
  expect(described_class).to(have_minor_as_integer)
322
432
  expect(described_class).to(have_patch_as_integer)
323
433
  expect(described_class).to(have_pre_as_nil_or_string)
434
+ # This would be %i[epoch major minor patch pre] for epoch version schemes
324
435
  expect(described_class.to_h.keys).to(match_array(%i[major minor patch pre]))
325
436
  expect(described_class.to_a).to(be_a(Array))
326
437
  end
327
438
  end
328
439
  ```
440
+ ## 🦷 FLOSS Funding
329
441
 
330
- ## Development
442
+ While ruby-oauth tools are free software and will always be, the project would benefit immensely from some funding.
443
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
331
444
 
332
- 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.
445
+ We welcome both individual and corporate sponsors! We also offer a
446
+ wide array of funding channels to account for your preferences
447
+ (although currently [Open Collective][🖇osc] is our preferred funding platform).
333
448
 
334
- 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).
449
+ **If you're working in a company that's making significant use of ruby-oauth tools we'd
450
+ appreciate it if you suggest to your company to become a ruby-oauth sponsor.**
335
451
 
336
- ## Contributing
452
+ You can support the development of ruby-oauth tools via
453
+ [GitHub Sponsors][🖇sponsor],
454
+ [Liberapay][⛳liberapay],
455
+ [PayPal][🖇paypal],
456
+ [Open Collective][🖇osc]
457
+ and [Tidelift][🏙️entsup-tidelift].
337
458
 
338
- See [CONTRIBUTING.md][contributing]
459
+ | 📍 NOTE |
460
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
461
+ | 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. |
339
462
 
340
- ## Contributors
463
+ ### Open Collective for Individuals
341
464
 
342
- [![Contributors](https://contrib.rocks/image?repo=pboling/version_gem)]("https://gitlab.com/oauth-xx/version_gem/-/graphs/main")
465
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
466
+ No backers yet. Be the first!
467
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
343
468
 
344
- Made with [contributors-img](https://contrib.rocks).
469
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/ruby-oauth#backer)]
345
470
 
346
- ## License
471
+ ### Open Collective for Organizations
347
472
 
348
- The gem is available as open source under the terms of
349
- the [MIT License][license] [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)][license-ref].
350
- See [LICENSE][license] for the official [Copyright Notice][copyright-notice-explainer].
473
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
474
+ No sponsors yet. Be the first!
475
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
476
+
477
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/ruby-oauth#sponsor)]
478
+
479
+ ### Another way to support open-source
480
+
481
+ > How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
482
+ >—Anne Frank
483
+
484
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions — totaling 79 hours of FLOSS coding over just the past seven days, a pretty regular week for me. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
485
+
486
+ 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`.
487
+
488
+ 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.
489
+
490
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
351
491
 
352
- * Copyright (c) 2022 - 2023 [Peter H. Boling][peterboling] of [Rails Bling][railsbling]
492
+ [![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 on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
353
493
 
354
- ## Code of Conduct
494
+ ## 🔐 Security
355
495
 
356
- 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).
496
+ See [SECURITY.md][🔐security].
357
497
 
358
- ## Versioning
498
+ ## 🤝 Contributing
359
499
 
360
- This library aims to adhere to [Semantic Versioning 2.0.0][🧮semver]. Violations of this scheme should be reported as
361
- bugs. Specifically, if a minor or patch version is released that breaks backward compatibility, a new version should be
362
- immediately released that restores compatibility. Breaking changes to the public API will only be introduced with new
363
- major versions.
500
+ If you need some ideas of where to help, you could work on adding more code coverage,
501
+ or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
502
+ or use the gem and think about how it could be better.
364
503
 
365
- As a result of this policy, you can (and should) specify a dependency on this gem using
366
- the [Pessimistic Version Constraint][pvc] with two digits of precision.
504
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
505
+
506
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
507
+
508
+ ### 🚀 Release Instructions
509
+
510
+ See [CONTRIBUTING.md][🤝contributing].
511
+
512
+ ### Code Coverage
513
+
514
+ [![Coverage Graph][🔑codecov-g]][🔑codecov]
515
+
516
+ [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
517
+
518
+ [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov]
519
+
520
+ ### 🪇 Code of Conduct
521
+
522
+ Everyone interacting with this project's codebases, issue trackers,
523
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
524
+
525
+ ## 🌈 Contributors
526
+
527
+ [![Contributors][🖐contributors-img]][🖐contributors]
528
+
529
+ Made with [contributors-img][🖐contrib-rocks].
530
+
531
+ Also see GitLab Contributors: [https://gitlab.com/ruby-oauth/version_gem/-/graphs/main][🚎contributors-gl]
532
+
533
+ <details>
534
+ <summary>⭐️ Star History</summary>
535
+
536
+ <a href="https://star-history.com/#ruby-oauth/version_gem&Date">
537
+ <picture>
538
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/version_gem&type=Date&theme=dark" />
539
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/version_gem&type=Date" />
540
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=ruby-oauth/version_gem&type=Date" />
541
+ </picture>
542
+ </a>
543
+
544
+ </details>
545
+
546
+ ## 📌 Versioning
547
+
548
+ This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
549
+ Violations of this scheme should be reported as bugs.
550
+ Specifically, if a minor or patch version is released that breaks backward compatibility,
551
+ a new version should be immediately released that restores compatibility.
552
+ Breaking changes to the public API will only be introduced with new major versions.
553
+
554
+ > dropping support for a platform is both obviously and objectively a breaking change <br/>
555
+ >—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
556
+
557
+ I understand that policy doesn't work universally ("exceptions to every rule!"),
558
+ but it is the policy here.
559
+ As such, in many cases it is good to specify a dependency on this library using
560
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
367
561
 
368
562
  For example:
369
563
 
@@ -371,36 +565,253 @@ For example:
371
565
  spec.add_dependency("version_gem", "~> 1.1")
372
566
  ```
373
567
 
374
- ## Security
375
-
376
- See [SECURITY.md](https://gitlab.com/oauth-xx/version_gem/-/blob/main/SECURITY.md).
377
-
378
- [aboutme]: https://about.me/peter.boling
379
- [actions]: https://github.com/oauth-xx/version_gem/actions
380
- [angelme]: https://angel.co/peter-boling
381
- [blogpage]: http://www.railsbling.com/tags/version_gem/
382
- [codecov_coverage]: https://codecov.io/gh/oauth-xx/version_gem
383
- [code_triage]: https://www.codetriage.com/oauth-xx/version_gem
384
- [chat]: https://gitter.im/oauth-xx/version_gem?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
385
- [climate_coverage]: https://codeclimate.com/github/oauth-xx/version_gem/test_coverage
386
- [climate_maintainability]: https://codeclimate.com/github/oauth-xx/version_gem/maintainability
387
- [copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
388
- [conduct]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/CODE_OF_CONDUCT.md
389
- [contributing]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/CONTRIBUTING.md
390
- [devto]: https://dev.to/galtzo
391
- [documentation]: https://rubydoc.info/github/oauth-xx/version_gem/main
392
- [followme]: https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow
393
- [gh_sponsors]: https://github.com/sponsors/pboling
394
- [issues]: https://github.com/oauth-xx/version_gem/issues
395
- [liberapay_donate]: https://liberapay.com/pboling/donate
396
- [license]: LICENSE.txt
397
- [license-ref]: https://opensource.org/licenses/MIT
398
- [license-img]: https://img.shields.io/badge/License-MIT-green.svg
399
- [peterboling]: http://www.peterboling.com
400
- [pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
401
- [railsbling]: http://www.railsbling.com
402
- [rubygems]: https://rubygems.org/gems/version_gem
403
- [security]: https://gitlab.com/oauth-xx/version_gem/-/blob/main/SECURITY.md
404
- [semver]: http://semver.org/
405
- [source]: https://gitlab.com/oauth-xx/version_gem
406
- [tweetme]: http://twitter.com/galtzo
568
+ <details>
569
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
570
+
571
+ SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
572
+ is a *breaking change* to an API.
573
+ It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
574
+
575
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
576
+ read this article from the creator of SemVer:
577
+
578
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
579
+
580
+ </details>
581
+
582
+ See [CHANGELOG.md][📌changelog] for a list of releases.
583
+
584
+ ## 📄 License
585
+
586
+ The gem is available as open source under the terms of
587
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
588
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
589
+
590
+ ### © Copyright
591
+
592
+ <ul>
593
+ <li>
594
+ Copyright (c) 2022-2025 Peter H. Boling, of
595
+ <a href="https://discord.gg/3qme4XHNKN">
596
+ Galtzo.com
597
+ <picture>
598
+ <img src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px-blank.svg" alt="Galtzo.com Logo (Wordless) by Aboling0, CC BY-SA 4.0" width="24">
599
+ </picture>
600
+ </a>, and version_gem contributors.
601
+ </li>
602
+ </ul>
603
+
604
+ ## 🤑 A request for help
605
+
606
+ Maintainers have teeth and need to pay their dentists.
607
+ After getting laid off in an RIF in March and filled with many dozens of rejections,
608
+ I'm now spending ~60+ hours a week building open source tools.
609
+ I'm hoping to be able to pay for my kids' health insurance this month,
610
+ so if you value the work I am doing, I need your support.
611
+ Please consider sponsoring me or the project.
612
+
613
+ To join the community or get help 👇️ Join the Discord.
614
+
615
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
616
+
617
+ To say "thanks for maintaining such a great tool" ☝️ Join the Discord or 👇️ send money.
618
+
619
+ [![Sponsor ruby-oauth/version_gem on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
620
+
621
+ ### Please give the project a star ⭐ ♥.
622
+
623
+ Thanks for RTFM. ☺️
624
+
625
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
626
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
627
+ [⛳liberapay]: https://liberapay.com/pboling/donate
628
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth
629
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth
630
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth
631
+ [🖇osc-backers]: https://opencollective.com/ruby-oauth#backer
632
+ [🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat
633
+ [🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor
634
+ [🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat
635
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge
636
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge
637
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge
638
+ [🖇osc]: https://opencollective.com/ruby-oauth
639
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
640
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
641
+ [🖇sponsor]: https://github.com/sponsors/pboling
642
+ [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
643
+ [🖇polar]: https://polar.sh/pboling
644
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-✓-a51611.svg?style=flat
645
+ [🖇kofi]: https://ko-fi.com/O5O86SNP4
646
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
647
+ [🖇patreon]: https://patreon.com/galtzo
648
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-✓-a51611.svg?style=flat
649
+ [🖇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
650
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
651
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
652
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
653
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
654
+ [🖇floss-funding.dev]: https://floss-funding.dev
655
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
656
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
657
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
658
+
659
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
660
+ [⛳️gem-namespace]: https://github.com/ruby-oauth/version_gem
661
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-VersionGem-3C2D2D.svg?style=square&logo=ruby&logoColor=white
662
+ [⛳️gem-name]: https://rubygems.org/gems/version_gem
663
+ [⛳️name-img]: https://img.shields.io/badge/name-version__gem-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
664
+ [⛳️tag-img]: https://img.shields.io/github/tag/ruby-oauth/version_gem.svg
665
+ [⛳️tag]: http://github.com/ruby-oauth/version_gem/releases
666
+ [🚂maint-blog]: http://www.railsbling.com/tags/version_gem
667
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
668
+ [🚂maint-contact]: http://www.railsbling.com/contact
669
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
670
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
671
+ [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
672
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
673
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
674
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
675
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
676
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
677
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=flat&logo=mastodon&label=Ruby%20%40galtzo
678
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
679
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
680
+ [💖🌳linktree]: https://linktr.ee/galtzo
681
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
682
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
683
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
684
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
685
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
686
+ [💖🧊berg]: https://codeberg.org/pboling
687
+ [💖🐙hub]: https://github.org/pboling
688
+ [💖🛖hut]: https://sr.ht/~galtzo/
689
+ [💖🧪lab]: https://gitlab.com/pboling
690
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
691
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
692
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
693
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
694
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-version_gem?utm_source=rubygems-version_gem&utm_medium=referral&utm_campaign=readme
695
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
696
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
697
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
698
+ [🚂railsbling]: http://www.railsbling.com
699
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
700
+ [📜src-gl]: https://gitlab.com/ruby-oauth/version_gem/
701
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
702
+ [📜src-cb]: https://codeberg.org/ruby-oauth/version_gem
703
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
704
+ [📜src-gh]: https://github.com/ruby-oauth/version_gem
705
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
706
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
707
+ [📜wiki]: https://gitlab.com/ruby-oauth/version_gem/-/wikis/home
708
+ [📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=Wiki&logoColor=white
709
+ [👽dl-rank]: https://rubygems.org/gems/version_gem
710
+ [👽dl-ranki]: https://img.shields.io/gem/rd/version_gem.svg
711
+ [👽oss-help]: https://www.codetriage.com/ruby-oauth/version_gem
712
+ [👽oss-helpi]: https://www.codetriage.com/ruby-oauth/version_gem/badges/users.svg
713
+ [👽version]: https://rubygems.org/gems/version_gem
714
+ [👽versioni]: https://img.shields.io/gem/v/version_gem.svg
715
+ [🔑qlty-mnt]: https://qlty.sh/gh/ruby-oauth/projects/version_gem
716
+ [🔑qlty-mnti]: https://qlty.sh/gh/ruby-oauth/projects/version_gem/maintainability.svg
717
+ [🔑qlty-cov]: https://qlty.sh/gh/ruby-oauth/projects/version_gem/metrics/code?sort=coverageRating
718
+ [🔑qlty-covi]: https://qlty.sh/gh/ruby-oauth/projects/version_gem/coverage.svg
719
+ [🔑codecov]: https://codecov.io/gh/ruby-oauth/version_gem
720
+ [🔑codecovi]: https://codecov.io/gh/ruby-oauth/version_gem/graph/badge.svg
721
+ [🔑coveralls]: https://coveralls.io/github/ruby-oauth/version_gem?branch=main
722
+ [🔑coveralls-img]: https://coveralls.io/repos/github/ruby-oauth/version_gem/badge.svg?branch=main
723
+ [🖐codeQL]: https://github.com/ruby-oauth/version_gem/security/code-scanning
724
+ [🖐codeQL-img]: https://github.com/ruby-oauth/version_gem/actions/workflows/codeql-analysis.yml/badge.svg
725
+ [🚎1-an-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/ancient.yml
726
+ [🚎1-an-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/ancient.yml/badge.svg
727
+ [🚎2-cov-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/coverage.yml
728
+ [🚎2-cov-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/coverage.yml/badge.svg
729
+ [🚎3-hd-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/heads.yml
730
+ [🚎3-hd-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/heads.yml/badge.svg
731
+ [🚎4-lg-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/legacy.yml
732
+ [🚎4-lg-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/legacy.yml/badge.svg
733
+ [🚎5-st-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/style.yml
734
+ [🚎5-st-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/style.yml/badge.svg
735
+ [🚎6-s-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/supported.yml
736
+ [🚎6-s-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/supported.yml/badge.svg
737
+ [🚎7-us-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/unsupported.yml
738
+ [🚎7-us-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/unsupported.yml/badge.svg
739
+ [🚎8-ho-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/hoary.yml
740
+ [🚎8-ho-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/hoary.yml/badge.svg
741
+ [🚎9-t-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/truffle.yml
742
+ [🚎9-t-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/truffle.yml/badge.svg
743
+ [🚎10-j-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/jruby.yml
744
+ [🚎10-j-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/jruby.yml/badge.svg
745
+ [🚎11-c-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/current.yml
746
+ [🚎11-c-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/current.yml/badge.svg
747
+ [🚎13-🔒️-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/locked_deps.yml
748
+ [🚎13-🔒️-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/locked_deps.yml/badge.svg
749
+ [🚎14-🔓️-wf]: https://github.com/ruby-oauth/version_gem/actions/workflows/unlocked_deps.yml
750
+ [🚎14-🔓️-wfi]: https://github.com/ruby-oauth/version_gem/actions/workflows/unlocked_deps.yml/badge.svg
751
+ [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
752
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
753
+ [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
754
+ [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
755
+ [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
756
+ [💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
757
+ [💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
758
+ [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
759
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
760
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
761
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
762
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
763
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
764
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
765
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
766
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
767
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
768
+ [💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
769
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
770
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
771
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
772
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
773
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
774
+ [🤝gh-issues]: https://github.com/ruby-oauth/version_gem/issues
775
+ [🤝gh-pulls]: https://github.com/ruby-oauth/version_gem/pulls
776
+ [🤝gl-issues]: https://gitlab.com/ruby-oauth/version_gem/-/issues
777
+ [🤝gl-pulls]: https://gitlab.com/ruby-oauth/version_gem/-/merge_requests
778
+ [🤝cb-issues]: https://codeberg.org/ruby-oauth/version_gem/issues
779
+ [🤝cb-pulls]: https://codeberg.org/ruby-oauth/version_gem/pulls
780
+ [🤝cb-donate]: https://donate.codeberg.org/
781
+ [🤝contributing]: CONTRIBUTING.md
782
+ [🔑codecov-g]: https://codecov.io/gh/ruby-oauth/version_gem/graphs/tree.svg
783
+ [🖐contrib-rocks]: https://contrib.rocks
784
+ [🖐contributors]: https://github.com/ruby-oauth/version_gem/graphs/contributors
785
+ [🖐contributors-img]: https://contrib.rocks/image?repo=ruby-oauth/version_gem
786
+ [🚎contributors-gl]: https://gitlab.com/ruby-oauth/version_gem/-/graphs/main
787
+ [🪇conduct]: CODE_OF_CONDUCT.md
788
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
789
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
790
+ [📌semver]: https://semver.org/spec/v2.0.0.html
791
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
792
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
793
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
794
+ [📌changelog]: CHANGELOG.md
795
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
796
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
797
+ [📌gitmoji]:https://gitmoji.dev
798
+ [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20😜%20😍-34495e.svg?style=flat-square
799
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
800
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.118-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
801
+ [🔐security]: SECURITY.md
802
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
803
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
804
+ [📄license]: LICENSE.txt
805
+ [📄license-ref]: https://opensource.org/licenses/MIT
806
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
807
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
808
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
809
+ [🚎yard-current]: http://rubydoc.info/gems/version_gem
810
+ [🚎yard-head]: https://version-gem.galtzo.com
811
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
812
+ [💎SHA_checksums]: https://gitlab.com/ruby-oauth/version_gem/-/tree/main/checksums
813
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
814
+ [💎rlts-img]: https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
815
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
816
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
817
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/