appraisal2 3.0.6 → 3.0.7

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,32 +1,25 @@
1
- [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![Appraisal2 Logo by Aboling0, CC BY-SA 4.0][🖼️appraisal2-i]][🖼️appraisal2] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang]
2
-
3
- [🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
- [🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
5
- [🖼️appraisal2-i]: https://logos.galtzo.com/assets/images/appraisal-rb/appraisal2/avatar-192px.svg
6
- [🖼️appraisal2]: https://github.com/appraisal-rb/appraisal2
7
- [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
8
- [🖼️ruby-lang]: https://github.com/ruby-lang
1
+ <a href="https://github.com/pboling"><img alt="pboling Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/pboling/avatar-128px.svg" width="14%" align="right"/></a>
9
2
 
10
3
  # 🔍️ Appraisal2
11
4
 
12
- > Find out what my gems are worth!
13
-
14
- - You, possibly
5
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
15
6
 
16
- [![Version][👽versioni]][👽version] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![CodeCov Test Coverage][🔑codecovi♻️]][🔑codecov] [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls] [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov] [![QLTY Maintainability][🔑qlty-mnti]][🔑qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Legacy][🚎4-r3.4-wfi]][🚎4-r3.4-wf] [![CI Legacy][🚎4-r3.3-wfi]][🚎4-r3.3-wf] [![CI Legacy][🚎4-r3.2-wfi]][🚎4-r3.2-wf] [![CI Legacy][🚎4-r3.1-wfi]][🚎4-r3.1-wf] [![CI Legacy][🚎4-r3.0-wfi]][🚎4-r3.0-wf] [![CI Legacy][🚎4-r2.7-wfi]][🚎4-r2.7-wf] [![CI Legacy][🚎4-r2.6-wfi]][🚎4-r2.6-wf] [![CI Legacy][🚎4-r2.5-wfi]][🚎4-r2.5-wf] [![CI Legacy][🚎4-r2.4-wfi]][🚎4-r2.4-wf] [![CI Legacy][🚎4-r2.3-wfi]][🚎4-r2.3-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf]
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
17
8
 
18
9
  ---
19
10
 
20
- [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
11
+ `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
12
+
13
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
21
14
 
22
15
  <details>
23
- <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
16
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
24
17
 
25
18
  I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
26
19
 
27
20
  </details>
28
21
 
29
- ## 🌻 Synopsis
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
30
23
 
31
24
  Appraisal2 integrates with bundler and rake to test your library against
32
25
  different versions of dependencies in repeatable scenarios called "appraisals."
@@ -54,258 +47,90 @@ Appraisal2 adds:
54
47
 
55
48
  ## 💡 Info you can shake a stick at
56
49
 
57
- | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
58
- |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
59
- | Works with JRuby | [![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] |
60
- | Works with Truffle Ruby | ![Truffle Ruby 22.3 Compat][💎truby-22.3i] ![Truffle Ruby 23.1 Compat][💎truby-23.1i] <br/> [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎9-t-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎9-t-wf] [![Truffle Ruby 33.0 Compat][💎truby-c-i]][🚎11-c-wf] |
61
- | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
62
- | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎4-r3.0-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎4-r3.1-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎4-r3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎4-r3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎4-r3.4-wf] |
63
- | Works with MRI Ruby 2 | ![Ruby 2.0 Compat][💎ruby-2.0i] ![Ruby 2.1 Compat][💎ruby-2.1i] ![Ruby 2.2 Compat][💎ruby-2.2i] <br> [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎1-r2.3-wf] [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎1-r2.4-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎1-r2.5-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎1-r2.6-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎1-r2.7-wf] |
64
- | Works with MRI Ruby 1 | ![Ruby 1.8 Compat][💎ruby-1.8i] ![Ruby 1.9 Compat][💎ruby-1.9i] |
65
- | 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] |
66
- | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![BDFL Blog][🚂bdfl-blog-img]][🚂bdfl-blog] [![Wiki][📜wiki-img]][📜wiki] |
67
- | 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] |
68
- | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] |
69
- | Support | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
70
- | 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! |
71
- | 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] |
72
- | `...` 💖 | [![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] |
50
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
51
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
52
+ | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎jruby-9.2-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎jruby-9.3-wf] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎jruby-9.4-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
53
+ | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎truby-22.3-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎truby-23.0-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎truby-23.1-wf] <br/> [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf]|
54
+ | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-4.0i]][🚎11-c-wf] [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
55
+ | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎ruby-3.0-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎ruby-3.1-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
56
+ | Works with MRI Ruby 2 | ![Ruby 2.0 Compat][💎ruby-2.0i] ![Ruby 2.1 Compat][💎ruby-2.1i] ![Ruby 2.2 Compat][💎ruby-2.2i] <br/> [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎ruby-2.4-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎ruby-2.5-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎ruby-2.6-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎ruby-2.7-wf]|
57
+ | Works with MRI Ruby 1 | ![Ruby 1.9 Compat][💎ruby-1.9i]|
58
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![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] |
59
+ | 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] |
60
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
61
+ | Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
62
+ | 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] |
63
+ | 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] |
64
+ | `...` 💖 | [![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] |
65
+
66
+ ### Compatibility
67
+
68
+ Compatible with MRI Ruby 1.8.7+, and concordant releases of JRuby, and TruffleRuby.
69
+ CI workflows and Appraisals are generated for MRI Ruby 2.4+.
70
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
71
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
72
+ not practical for the current toolchain.
73
+
74
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
75
+ |------------------------------------------------|--------------------------------------------------------|
76
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
77
+
78
+ ### Federated DVCS
73
79
 
74
- ## ✨ Installation
80
+ <details markdown="1">
81
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
75
82
 
76
- Install the gem and add to the application's Gemfile by executing:
83
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
84
+ |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
85
+ | 🧪 [pboling/appraisal2 on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
86
+ | 🧊 [pboling/appraisal2 on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
87
+ | 🐙 [pboling/appraisal2 on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
88
+ | 🎮️ [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] |
77
89
 
78
- $ bundle add appraisal2
90
+ </details>
79
91
 
80
- If bundler is not being used to manage dependencies, install the gem by executing:
92
+ [gh-discussions]: https://github.com/pboling/appraisal2/discussions
81
93
 
82
- $ gem install appraisal2
94
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/appraisal2)](https://tidelift.com/subscription/pkg/rubygems-appraisal2?utm_source=rubygems-appraisal2&utm_medium=referral&utm_campaign=readme)
83
95
 
84
- ### In a RubyGem library
96
+ Available as part of the Tidelift Subscription.
85
97
 
86
- In your package's `.gemspec`:
98
+ <details markdown="1">
99
+ <summary>Need enterprise-level guarantees?</summary>
87
100
 
88
- spec.add_development_dependency "appraisal2"
101
+ 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.
89
102
 
90
- Note that gems must be bundled in the global namespace. Bundling gems to a
91
- local location or vendoring plugins is not fully supported. If you do not want to
92
- pollute the global namespace, one alternative is
93
- [RVM's Gemsets](http://rvm.io/gemsets).
103
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
94
104
 
95
- ### 🔒 Secure Installation
105
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
106
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
107
+ - 💡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
96
108
 
97
- <details>
98
- <summary>For Medium or High Security Installations</summary>
109
+ Alternatively:
99
110
 
100
- `appraisal2` is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
101
- [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
102
- by following the instructions below.
111
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
112
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
113
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
103
114
 
104
- Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
115
+ </details>
105
116
 
106
- ```console
107
- gem cert --add <(curl -Ls https://raw.github.com/appraisal-rb/appraisal2/main/certs/pboling.pem)
108
- ```
117
+ ## ✨ Installation
109
118
 
110
- You only need to do that once. Then proceed to install with:
119
+ Install the gem and add to the application's Gemfile by executing:
111
120
 
112
121
  ```console
113
- gem install appraisal2 -P MediumSecurity
122
+ bundle add appraisal2
114
123
  ```
115
124
 
116
- The `MediumSecurity` trust profile will verify signed gems, but allow the installation of unsigned dependencies.
117
-
118
- This is necessary because not all of `appraisal2`’s dependencies are signed, so we cannot use `HighSecurity`.
119
-
120
- If you want to up your security game full-time:
125
+ If bundler is not being used to manage dependencies, install the gem by executing:
121
126
 
122
127
  ```console
123
- bundle config set --global trust-policy MediumSecurity
128
+ gem install appraisal2
124
129
  ```
125
130
 
126
- NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
127
-
128
- </details>
129
-
130
- ## 🔧 Basic Setup
131
+ ## ⚙️ Configuration
131
132
 
132
- Setting up appraisal2 requires an `Appraisals` file (similar to a `Gemfile`) in
133
- your project root, named "Appraisals" (note the case), and some slight changes
134
- to your project's `Rakefile`.
135
-
136
- An `Appraisals` file consists of several appraisal definitions. An appraisal
137
- definition is simply a list of gem dependencies. For example, to test with a
138
- few versions of Rails:
139
-
140
- appraise "rails-3" do
141
- gem "rails", "3.2.14"
142
- end
143
-
144
- appraise "rails-4" do
145
- gem "rails", "4.0.0"
146
- end
147
-
148
- The dependencies in your `Appraisals` file are combined with dependencies in
149
- your `Gemfile`, so you don't need to repeat anything that's the same for each
150
- appraisal. If something is specified in both the Gemfile and an appraisal, the
151
- version from the appraisal takes precedence.
152
-
153
- ### Examples of usage in the wild
154
-
155
- Appraisal2 can be setup to achieve many different things, from testing against
156
- different versions of services, like MySQL, Redis, or Memcached, and their drivers,
157
- different versions of gems, different platforms, and running different types of validations
158
- which each require a distinct set of gems.
159
- It can also help developers to follow the [official recommendation](https://github.com/rubygems/bundler-site/pull/501) (since 2017) of the bundler team,
160
- to commit the \[main\] `Gemfile.lock` for **both** apps **and** gems. It does this by giving you alternate gemfiles that won't have their `gemfiles/*.gemfile.lock` committed, so you can simply commit the main one without breaking CI.
161
-
162
- Having so many different use cases means it can be helpful to others to see how you have done your implementation. If you are willing to spend the time documenting, please send a PR to update this table with another Appraisal2-using project, linking to the specific workflows people can check to see how it is done!
163
-
164
- | # | gem | locked / unlocked deps | analysis / services | SemVer / HEAD deps | Rubies | os |
165
- |---|-------------------------------------------------------------------------------|----------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------|
166
- | 1 | [omniauth-identity][1-gh]<br>[![Star][1-⭐️i]][1-gh]<br>[![Rank][1-🔢i]][1-🧰] | [![🔒️][1-🔒️i]][1-🔒️]<br>[![un🔒️][1-un🔒️i]][1-un🔒️] | [![Style][1-as⚙️i]][1-as⚙️]<br>[![Coverage][1-ac⚙️i]][1-ac⚙️]<br>[![Svcs][1-sc⚙️i]][1-sc⚙️]<br>[![L-Svcs][1-sl⚙️i]][1-sl⚙️]<br>[![S-Svcs][1-ss⚙️i]][1-ss⚙️]<br>[![U-Svcs][1-su⚙️i]][1-su⚙️]<br>[![A-Svcs][1-sa⚙️i]][1-sa⚙️]<br>[![J-Svcs][1-sj⚙️i]][1-sj⚙️]<br>[![AJ-Svcs][1-saj⚙️i]][1-saj⚙️] | [![Current][1-⏰i]][1-⏰]<br>[![Deps@HEAD][1-👟i]][1-👟] | [![Supported][1-👴i]][1-👴]<br>[![Unsupported][1-u👴i]][1-u👴]<br>[![Legacy][1-l👴i]][1-l👴]<br>[![Ancient][1-a👴i]][1-a👴]<br>[![JRuby][1-ji]][1-j]<br>[![JRuby Ancient][1-ja👴i]][1-ja👴]<br>[![Head][1-🗣️i]][1-🗣️] | ❌ |
167
- | 2 | [rspec-stubbed_env][2-gh]<br>[![Star][2-⭐️i]][2-gh]<br>[![Rank][2-🔢i]][2-🧰] | [![🔒️][2-🔒️i]][2-🔒️]<br>[![un🔒️][2-un🔒️i]][2-un🔒️] | [![Style][2-as⚙️i]][2-as⚙️]<br>[![Coverage][2-ac⚙️i]][2-ac⚙️] | [![Current][2-⏰i]][2-⏰] | [![Supported][2-👴i]][2-👴]<br>[![Unsupported][2-u👴i]][2-u👴]<br>[![Legacy][2-l👴i]][2-l👴]<br>[![Ancient][2-a👴i]][2-a👴]<br>[![JRuby][2-ji]][2-j]<br>[![Truffle][2-ti]][2-t]<br>[![Head][2-🗣️i]][2-🗣️] | ❌ |
168
- | 3 | [silent_stream][3-gh]<br>[![Star][3-⭐️i]][3-gh]<br>[![Rank][3-🔢i]][3-🧰] | [![🔒️][3-🔒️i]][3-🔒️]<br>[![un🔒️][3-un🔒️i]][3-un🔒️] | [![Style][3-as⚙️i]][3-as⚙️]<br>[![Coverage][3-ac⚙️i]][3-ac⚙️] | [![Current][3-⏰i]][3-⏰] | [![Supported][3-👴i]][3-👴]<br>[![Unsupported][3-u👴i]][3-u👴]<br>[![Legacy][3-l👴i]][3-l👴]<br>[![Ancient][3-a👴i]][3-a👴]<br>[![JRuby][3-ji]][3-j]<br>[![Truffle][3-ti]][3-t]<br>[![Head][3-🗣️i]][3-🗣️] | ❌ |
169
- | 4 | [oauth2][4-gh]<br>[![Star][4-⭐️i]][4-gh]<br>[![Rank][4-🔢i]][4-🧰] | [![🔒️][4-🔒️i]][4-🔒️]<br>[![un🔒️][4-un🔒️i]][4-un🔒️] | [![Style][4-as⚙️i]][4-as⚙️]<br>[![Coverage][4-ac⚙️i]][4-ac⚙️] | [![Current][4-⏰i]][4-⏰]<br>[![Deps@HEAD][4-👟i]][4-👟] | [![Supported][4-👴i]][4-👴]<br>[![Unsupported][4-u👴i]][4-u👴]<br>[![Legacy][4-l👴i]][4-l👴]<br>[![Ancient][4-a👴i]][4-a👴]<br>[![JRuby][4-ji]][4-j]<br>[![Head][4-🗣️i]][4-🗣️] | [![Windows][5-win️i]][5-win️]<br>[![MacOS][5-mac️i]][5-mac️] |
170
-
171
- [1-gh]: https://github.com/omniauth/omniauth-identity
172
- [1-🧰]: https://www.ruby-toolbox.com/projects/omniauth-identity
173
- [1-⭐️i]: https://img.shields.io/github/stars/omniauth/omniauth-identity
174
- [1-🔢i]: https://img.shields.io/gem/rd/omniauth-identity.svg
175
- [1-🔒️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/locked_deps.yml
176
- [1-🔒️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/locked_deps.yml/badge.svg
177
- [1-un🔒️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/unlocked_deps.yml
178
- [1-un🔒️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/unlocked_deps.yml/badge.svg
179
- [1-as⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/style.yml
180
- [1-as⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/style.yml/badge.svg
181
- [1-ac⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/coverage.yml
182
- [1-ac⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/coverage.yml/badge.svg
183
- [1-sc⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/current-svc-adapters.yml
184
- [1-sc⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/current-svc-adapters.yml/badge.svg
185
- [1-sl⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/legacy-svc-adapters.yml
186
- [1-sl⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/legacy-svc-adapters.yml/badge.svg
187
- [1-ss⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/supported-svc-adapters.yml
188
- [1-ss⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/supported-svc-adapters.yml/badge.svg
189
- [1-su⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/unsupported-svc-adapters.yml
190
- [1-su⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/unsupported-svc-adapters.yml/badge.svg
191
- [1-sa⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/ancient-svc-adapters.yml
192
- [1-sa⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/ancient-svc-adapters.yml/badge.svg
193
- [1-sj⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby-svc-adapters.yml
194
- [1-sj⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby-svc-adapters.yml/badge.svg
195
- [1-saj⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby-ancient-svc-adapters.yml
196
- [1-saj⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby-ancient-svc-adapters.yml/badge.svg
197
- [1-⏰]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/current.yml
198
- [1-⏰i]: https://github.com/omniauth/omniauth-identity/actions/workflows/current.yml/badge.svg
199
- [1-j]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby.yml
200
- [1-ji]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby.yml/badge.svg
201
- [1-👟]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/current-runtime-heads.yml
202
- [1-👟i]: https://github.com/omniauth/omniauth-identity/actions/workflows/current-runtime-heads.yml/badge.svg
203
- [1-👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/supported.yml
204
- [1-👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/supported.yml/badge.svg
205
- [1-u👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/unsupported.yml
206
- [1-u👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/unsupported.yml/badge.svg
207
- [1-l👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/legacy.yml
208
- [1-l👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/legacy.yml/badge.svg
209
- [1-a👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/ancient.yml
210
- [1-a👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/ancient.yml/badge.svg
211
- [1-ja👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby-ancient.yml
212
- [1-ja👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby-ancient.yml/badge.svg
213
- [1-🗣️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/heads.yml
214
- [1-🗣️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/heads.yml/badge.svg
215
- [1-gh]: https://github.com/omniauth/omniauth-identity
216
-
217
- [2-gh]: https://github.com/pboling/rspec-stubbed_env
218
- [2-🧰]: https://www.ruby-toolbox.com/projects/rspec-stubbed_env
219
- [2-⭐️i]: https://img.shields.io/github/stars/pboling/rspec-stubbed_env
220
- [2-🔢i]: https://img.shields.io/gem/rd/rspec-stubbed_env.svg
221
- [2-🔒️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/deps_locked.yml
222
- [2-🔒️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/deps_locked.yml/badge.svg
223
- [2-un🔒️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/deps_unlocked.yml
224
- [2-un🔒️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/deps_unlocked.yml/badge.svg
225
- [2-as⚙️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/style.yml
226
- [2-as⚙️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/style.yml/badge.svg
227
- [2-ac⚙️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/coverage.yml
228
- [2-ac⚙️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/coverage.yml/badge.svg
229
- [2-⏰]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/current.yml
230
- [2-⏰i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/current.yml/badge.svg
231
- [2-j]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/jruby.yml
232
- [2-ji]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/jruby.yml/badge.svg
233
- [2-t]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/truffle.yml
234
- [2-ti]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/truffle.yml/badge.svg
235
- [2-👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/supported.yml
236
- [2-👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/supported.yml/badge.svg
237
- [2-u👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/unsupported.yml
238
- [2-u👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/unsupported.yml/badge.svg
239
- [2-l👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/legacy.yml
240
- [2-l👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/legacy.yml/badge.svg
241
- [2-a👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/ancient.yml
242
- [2-a👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/ancient.yml/badge.svg
243
- [2-🗣️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/heads.yml
244
- [2-🗣️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/heads.yml/badge.svg
245
-
246
- [3-gh]: https://github.com/pboling/silent_stream
247
- [3-🧰]: https://www.ruby-toolbox.com/projects/silent_stream
248
- [3-⭐️i]: https://img.shields.io/github/stars/pboling/silent_stream
249
- [3-🔢i]: https://img.shields.io/gem/rd/silent_stream.svg
250
- [3-🔒️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/locked_deps.yml
251
- [3-🔒️i]: https://github.com/pboling/silent_stream/actions/workflows/locked_deps.yml/badge.svg
252
- [3-un🔒️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/unlocked_deps.yml
253
- [3-un🔒️i]: https://github.com/pboling/silent_stream/actions/workflows/unlocked_deps.yml/badge.svg
254
- [3-as⚙️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/style.yml
255
- [3-as⚙️i]: https://github.com/pboling/silent_stream/actions/workflows/style.yml/badge.svg
256
- [3-ac⚙️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/coverage.yml
257
- [3-ac⚙️i]: https://github.com/pboling/silent_stream/actions/workflows/coverage.yml/badge.svg
258
- [3-⏰]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/current.yml
259
- [3-⏰i]: https://github.com/pboling/silent_stream/actions/workflows/current.yml/badge.svg
260
- [3-j]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/jruby.yml
261
- [3-ji]: https://github.com/pboling/silent_stream/actions/workflows/jruby.yml/badge.svg
262
- [3-t]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/truffle.yml
263
- [3-ti]: https://github.com/pboling/silent_stream/actions/workflows/truffle.yml/badge.svg
264
- [3-👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/supported.yml
265
- [3-👴i]: https://github.com/pboling/silent_stream/actions/workflows/supported.yml/badge.svg
266
- [3-u👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/unsupported.yml
267
- [3-u👴i]: https://github.com/pboling/silent_stream/actions/workflows/unsupported.yml/badge.svg
268
- [3-l👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/legacy.yml
269
- [3-l👴i]: https://github.com/pboling/silent_stream/actions/workflows/legacy.yml/badge.svg
270
- [3-a👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/ancient.yml
271
- [3-a👴i]: https://github.com/pboling/silent_stream/actions/workflows/ancient.yml/badge.svg
272
- [3-🗣️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/heads.yml
273
- [3-🗣️i]: https://github.com/pboling/silent_stream/actions/workflows/heads.yml/badge.svg
274
-
275
- [4-gh]: https://github.com/ruby-oauth/oauth2
276
- [4-🧰]: https://www.ruby-toolbox.com/projects/oauth2
277
- [4-⭐️i]: https://img.shields.io/github/stars/ruby-oauth/oauth2
278
- [4-🔢i]: https://img.shields.io/gem/rd/oauth2.svg
279
- [4-🔒️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/locked_deps.yml
280
- [4-🔒️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/locked_deps.yml/badge.svg
281
- [4-un🔒️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/unlocked_deps.yml
282
- [4-un🔒️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/unlocked_deps.yml/badge.svg
283
- [4-as⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/style.yml
284
- [4-as⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/style.yml/badge.svg
285
- [4-ac⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/coverage.yml
286
- [4-ac⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/coverage.yml/badge.svg
287
- [4-⏰]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/current.yml
288
- [4-⏰i]: https://github.com/ruby-oauth/oauth2/actions/workflows/current.yml/badge.svg
289
- [4-j]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby.yml
290
- [4-ji]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby.yml/badge.svg
291
- [4-👟]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/dep-heads.yml
292
- [4-👟i]: https://github.com/ruby-oauth/oauth2/actions/workflows/dep-heads.yml/badge.svg
293
- [4-👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/supported.yml
294
- [4-👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/supported.yml/badge.svg
295
- [4-u👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/unsupported.yml
296
- [4-u👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/unsupported.yml/badge.svg
297
- [4-l👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/legacy.yml
298
- [4-l👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/legacy.yml/badge.svg
299
- [4-a👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ancient.yml
300
- [4-a👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/ancient.yml/badge.svg
301
- [4-🗣️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/heads.yml
302
- [4-🗣️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/heads.yml/badge.svg
303
- [5-win️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/windows.yml
304
- [5-win️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/windows.yml/badge.svg
305
- [5-mac️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/macos.yml
306
- [5-mac️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/macos.yml/badge.svg
307
-
308
- ## ⚒️ Basic Usage
133
+ ## 🔧 Basic Usage
309
134
 
310
135
  Once you've configured the appraisals you want to use, you need to install the
311
136
  dependencies for each appraisal:
@@ -428,398 +253,32 @@ bundle exec appraisal rails-7 bundle install --gem-manager=ore # ❌ Wrong
428
253
  - `bundle exec appraisal rails-7 install --gem-manager=ore` ✅ → Uses **Appraisal's** install command with ORE
429
254
  - `bundle exec appraisal rails-7 bundle install --gem-manager=ore` ❌ → Tries to run external **bundle** command (which doesn't recognize `--gem-manager`)
430
255
 
431
- ## 🦀 Using Ore (Alternative Gem Manager)
432
-
433
- Appraisal2 supports [ORE](https://github.com/contriboss/ore-light) as an alternative to Bundler
434
- for dependency resolution and installation. Ore is a fast gem manager written in Go that aims
435
- to be a drop-in replacement for Bundler.
436
-
437
- ### Installing Ore
438
-
439
- You can install ORE via:
440
-
441
- ```bash
442
- # Install ORE Light (no Ruby required for download)
443
- # Installs to ~/.local/bin by default (no sudo needed)
444
- curl -fsSL https://raw.githubusercontent.com/contriboss/ore-light/master/scripts/install.sh | bash
445
-
446
- # For system-wide installation to /usr/local/bin
447
- curl -fsSL https://raw.githubusercontent.com/contriboss/ore-light/master/scripts/install.sh | bash -s -- --system
448
- ```
449
-
450
- ### Using Ore with Appraisal2
451
-
452
- The `--gem-manager=ore` option works **only** with Appraisal's built-in `install` and `update` commands.
453
- It does **NOT** work with external commands like `bundle install`.
454
-
455
- #### ✅ Using --gem-manager with Appraisal's install/update commands
456
-
457
- To use ORE instead of bundler for dependency installation, pass the `--gem-manager=ore` option:
458
-
459
- ```bash
460
- # Install dependencies for ALL appraisals using ORE
461
- bundle exec appraisal install --gem-manager=ore
462
-
463
- # Update dependencies for ALL appraisals using ORE
464
- bundle exec appraisal update --gem-manager=ore
465
-
466
- # Install dependencies for a SPECIFIC appraisal using ORE
467
- bundle exec appraisal <APPRAISAL_NAME> install --gem-manager=ore
468
-
469
- # Update dependencies for a SPECIFIC appraisal using ORE
470
- bundle exec appraisal <APPRAISAL_NAME> update <GEMS> --gem-manager=ore
471
- ```
472
-
473
- You can also use the short form:
474
-
475
- ```bash
476
- bundle exec appraisal install -g ore
477
- bundle exec appraisal <APPRAISAL_NAME> install -g ore
478
- ```
479
-
480
- #### ❌ Do NOT use --gem-manager with external commands
481
-
482
- The `--gem-manager` option **cannot** be used when running external commands like `bundle install`:
483
-
484
- ```bash
485
- # ❌ WRONG - Don't try to pass --gem-manager to external commands
486
- bundle exec appraisal coverage bundle install --gem-manager=ore
487
-
488
- # ✅ RIGHT - Use appraisal's install command instead
489
- bundle exec appraisal coverage install --gem-manager=ore
490
- ```
491
-
492
- The difference:
493
- - `bundle exec appraisal coverage install --gem-manager=ore` → Uses Appraisal's install command with ORE
494
- - `bundle exec appraisal coverage bundle install --gem-manager=ore` → Tries to run external `bundle install` (which doesn't recognize `--gem-manager`)
495
-
496
- ### Ore-Specific Options
497
-
498
- When using ORE, some options are translated to ORE's equivalents:
499
-
500
- | Appraisal Option | Ore Equivalent | Notes |
501
- |------------------|----------------|-------------------------------------|
502
- | `--jobs=N` | `-workers=N` | Only used when N > 1 |
503
- | `--path=DIR` | `-vendor=DIR` | Sets the gem installation directory |
504
- | `--without=GROUPS` | `-without=GROUP1,GROUP2` | Groups are comma-separated in ORE |
505
- | `--retry` | *(ignored)* | ORE handles retries internally |
506
- | `--full-index` | *(ignored)* | Not applicable to ORE |
507
-
508
- ### Example Workflow with ORE
509
-
510
- ```bash
511
- # Generate appraisal gemfiles
512
- bundle exec appraisal generate
513
-
514
- # Install dependencies for ALL appraisals using ORE (faster than bundler)
515
- bundle exec appraisal install --gem-manager=ore --jobs=4
516
-
517
- # Install dependencies for a SPECIFIC appraisal using ORE
518
- bundle exec appraisal rails-7 install --gem-manager=ore --jobs=4
519
-
520
- # Run tests against all appraisals (uses dependencies from appraisal gemfiles)
521
- bundle exec appraisal rspec
522
-
523
- # Run tests against a specific appraisal (uses that appraisal's dependencies)
524
- bundle exec appraisal rails-7 rspec
525
-
526
- # Update a specific gem in ALL appraisals using ORE
527
- bundle exec appraisal update rack --gem-manager=ore
528
-
529
- # Update a specific gem in ONE appraisal using ORE
530
- bundle exec appraisal rails-7 update rack --gem-manager=ore
531
- ```
532
-
533
- **Note:** When running tests or other external commands, the dependencies are already
534
- installed from the appraisal's gemfile. You don't need to (and can't) pass `--gem-manager`
535
- to external commands—it only works with Appraisal's built-in `install` and `update` commands.
536
-
537
- ### When to Use Ore
538
-
539
- Ore can be particularly beneficial when:
540
-
541
- - You have many appraisals and want faster installation
542
- - You're in a CI environment where installation speed matters
543
- - You want to take advantage of ORE's parallel resolution capabilities
544
-
545
- Note that ORE must be installed separately and available in your PATH.
546
- If you specify ORE and it is not available, appraisal2 will raise an error.
547
-
548
- ### Troubleshooting ORE/Gem Manager Issues
549
-
550
- #### Error: "Unknown switches --gem-manager=ore"
551
-
552
- If you see an error like:
553
- ```
554
- Unknown switches("--gem-manager=ore")
555
- ```
556
-
557
- This usually means you're trying to pass `--gem-manager` to an external command instead of
558
- Appraisal's built-in command.
559
-
560
- ❌ **Wrong:**
561
- ```bash
562
- bundle exec appraisal coverage bundle install --gem-manager=ore
563
- # Error: "Unknown switches --gem-manager=ore"
564
- # The --gem-manager flag is being passed to the external 'bundle install' command,
565
- # which doesn't recognize it.
566
- ```
567
-
568
- ✅ **Correct:**
569
- ```bash
570
- bundle exec appraisal coverage install --gem-manager=ore
571
- # Correct: Uses Appraisal's install command with ORE gem manager
572
- ```
573
-
574
- **Key point:** The `--gem-manager` option **only works** with Appraisal's built-in
575
- `install` and `update` commands. It cannot be used with external commands like
576
- `bundle install`, `bundle update`, or `bundle exec rake/rspec`.
577
-
578
- If you need to install dependencies using ORE:
579
- 1. Run `bundle exec appraisal <NAME> install --gem-manager=ore`
580
- 2. Then run your tests: `bundle exec appraisal <NAME> rspec`
581
-
582
- Under the hood
583
- --------------
584
-
585
- Running `appraisal install` generates a Gemfile for each appraisal by combining
586
- your root Gemfile with the specific requirements for each appraisal. These are
587
- stored in the `gemfiles` directory, and should be added to version control to
588
- ensure that versions within constraints of the Gemfile are always used.
589
-
590
- When you prefix a command with `appraisal`, the command is run with the
591
- appropriate Gemfile for that appraisal, ensuring the correct dependencies
592
- are used.
593
-
594
- Sharing Modular Gemfiles between Appraisals
595
- -------
596
-
597
- _New in appraisal2_ (not possible in thoughtbot's appraisal)
598
-
599
- It is common for Appraisals to duplicate sets of gems, and sometimes it
600
- makes sense to DRY this up into a shared, modular, gemfile.
601
- In a scenario where you do not load your main Gemfile in your Appraisals,
602
- but you want to declare your various gem sets for e.g.
603
- `%w(coverage test documentation audit)` once each, you can re-use the same
604
- modular gemfiles for local development by referencing them from the main
605
- Gemfile.
606
-
607
- To do this, use the `eval_gemfile` declaration within the necessary
608
- `appraise` block in your `Appraisals` file, which will behave the same as
609
- `eval_gemfile` does in a normal Gemfile.
610
-
611
- ### Example Usage
612
-
613
- You could put your modular gemfiles in the `gemfiles` directory, or nest
614
- them in `gemfiles/modular/*`, which will be used for this example.
615
-
616
- **Gemfile**
617
- ```ruby
618
- eval_gemfile "gemfiles/modular/audit.gemfile"
619
- ```
620
-
621
- **gemfiles/modular/audit.gemfile**
622
- ```ruby
623
- # Many gems are dropping support for Ruby < 3.1,
624
- # so we only want to run our security audit in CI on Ruby 3.1+
625
- gem "bundler-audit", "~> 0.9.2"
626
- # And other security audit gems...
627
- ```
628
-
629
- **Appraisals**
630
- ```ruby
631
- appraise "ruby-2-7" do
632
- gem "dummy"
633
- end
634
-
635
- appraise "ruby-3-0" do
636
- gem "dummy"
637
- end
638
-
639
- appraise "ruby-3-1" do
640
- gem "dummy"
641
- eval_gemfile "modular/audit.gemfile"
642
- end
643
-
644
- appraise "ruby-3-2" do
645
- gem "dummy"
646
- eval_gemfile "modular/audit.gemfile"
647
- end
648
-
649
- appraise "ruby-3-3" do
650
- gem "dummy"
651
- eval_gemfile "modular/audit.gemfile"
652
- end
653
-
654
- appraise "ruby-3-4" do
655
- gem "dummy"
656
- eval_gemfile "modular/audit.gemfile"
657
- end
658
- ```
659
-
660
- **Appraisal2.root.gemfile**
661
- ```ruby
662
- source "https://gem.coop"
663
-
664
- # Appraisal2 Root Gemfile is for running appraisal to generate the Appraisal2 Gemfiles
665
- # We do not load the standard Gemfile, as it is tailored for local development,
666
- # while appraisals are tailored for CI.
667
-
668
- gemspec
669
-
670
- gem "appraisal2"
671
- ```
672
-
673
- Now when you need to update your appraisals:
674
- ```shell
675
- BUNDLE_GEMFILE=Appraisal2.root.gemfile bundle exec appraisal update
676
- ```
677
-
678
- ### Removing Gems using Appraisal2
679
-
680
- It is common while managing multiple Gemfiles for dependencies to become deprecated and no
681
- longer necessary, meaning they need to be removed from the Gemfile for a specific `appraisal`.
682
- To do this, use the `remove_gem` declaration within the necessary `appraise` block in your
683
- `Appraisals` file.
684
-
685
- #### Example Usage
686
-
687
- **Gemfile**
688
- ```ruby
689
- gem "rails", "~> 4.2"
690
-
691
- group :test do
692
- gem "rspec", "~> 4.0"
693
- gem "test_after_commit"
694
- end
695
- ```
696
-
697
- **Appraisals**
698
- ```ruby
699
- appraise "rails-5" do
700
- gem "rails", "~> 5.2"
701
-
702
- group :test do
703
- remove_gem "test_after_commit"
704
- end
705
- end
706
- ```
707
-
708
- Using the `Appraisals` file defined above, this is what the resulting `Gemfile` will look like:
709
- ```ruby
710
- gem "rails", "~> 5.2"
711
-
712
- group :test do
713
- gem "rspec", "~> 4.0"
714
- end
715
- ```
716
-
717
- ### Customization
718
-
719
- It is possible to customize the generated Gemfiles by adding a `customize_gemfiles` block to
720
- your `Appraisals` file. The block must contain a hash of key/value pairs. Currently supported
721
- customizations include:
722
- - heading: a string that by default adds "# This file was generated by Appraisal2" to the top of each Gemfile, (the string will be commented for you)
723
- - single_quotes: a boolean that controls if strings are single quoted in each Gemfile, defaults to false
724
-
725
- You can also provide variables for substitution in the heading, based on each appraisal. Currently supported variables:
726
- - `%{appraisal}`: Becomes the name of each appraisal, e.g. `rails-3`
727
- - `%{gemfile}`: Becomes the filename of each gemfile, e.g. `rails-3.gemfile`
728
- - `%{gemfile_path}`: Becomes the full path of each gemfile, e.g. `/path/to/project/gemfiles/rails-3.gemfile`
729
- - `%{lockfile}`: Becomes the filename of each lockfile, e.g. `rails-3.gemfile.lock`
730
- - `%{lockfile_path}`: Becomes the full path of each lockfile, e.g. `/path/to/project/gemfiles/rails-3.gemfile.lock`
731
- - `%{relative_gemfile_path}`: Becomes the relative path of each gemfile, e.g. `gemfiles/rails-3.gemfile`
732
- - `%{relative_lockfile_path}`: Becomes the relative path of each lockfile, e.g. `gemfiles/rails-3.gemfile.lock`
733
-
734
- #### Example Usage
735
-
736
- **Appraisals**
737
- ```ruby
738
- customize_gemfiles do
739
- {
740
- :single_quotes => true,
741
- :heading => <<-HEADING,
742
- frozen_string_literal: true
743
-
744
- `%{gemfile}` has been generated by Appraisal2, do NOT modify it or `%{lockfile}` directly!
745
- Make the changes to the "%{appraisal}" block in `Appraisals` instead. See the conventions at https://example.com/
746
- HEADING
747
- }
748
- end
749
-
750
- appraise "rails-3" do
751
- gem "rails", "3.2.14"
752
- end
753
- ```
754
-
755
- Using the `Appraisals` file defined above, this is what the resulting `Gemfile` will look like:
756
- ```ruby
757
- # frozen_string_literal: true
758
-
759
- # `rails-3.gemfile` has been generated by Appraisal2, do NOT modify it or `rails-3.gemfile.lock` directly!
760
- # Make the changes to the "rails-3" block in `Appraisals` instead. See the conventions at https://example.com/
761
-
762
- gem "rails", "3.2.14"
763
- ```
764
-
765
- ### Version Control
766
-
767
- When using Appraisal2, we recommend you check in the Gemfiles that Appraisal2
768
- generates within the gemfiles directory, but exclude the lockfiles there
769
- (`*.gemfile.lock`). The Gemfiles are useful when running your tests against a
770
- continuous integration server.
771
-
772
- Additionally, the Bundler team [officially recommends](https://github.com/rubygems/bundler-site/pull/501)
773
- committing the main `Gemfile.lock` for **both** gems **and** libraries.
774
-
775
- ### Circle CI Integration
776
-
777
- In Circle CI you can override the default testing behavior.
778
- You can configure Appraisal2 to execute your tests.
779
-
780
- In order to this you can put the following configuration in your circle.yml file:
781
-
782
- ```yml
783
- dependencies:
784
- post:
785
- - bundle exec appraisal install
786
- test:
787
- pre:
788
- - bundle exec appraisal rake db:create
789
- - bundle exec appraisal rake db:migrate
790
- override:
791
- - bundle exec appraisal rspec
792
- ```
793
-
794
- Notice that we are running an rspec suite. You can customize your testing
795
- command in the `override` section and use your favourite one.
796
-
797
256
  ## 🦷 FLOSS Funding
798
257
 
799
- While appraisal-rb tools are free (libre) software, the project would benefit immensely from some funding.
258
+ While pboling tools are free software and will always be, the project would benefit immensely from some funding.
800
259
  Raising a monthly budget of... "dollars" would make the project more sustainable.
801
260
 
802
- We welcome both individual and corporate sponsors\! We also offer a
803
- wide array of funding channels to account for your preferences
804
- (although currently [Open Collective][🖇osc] is our preferred funding platform).
261
+ We welcome both individual and corporate sponsors! We also offer a
262
+ wide array of funding channels to account for your preferences.
263
+ Currently, [Open Collective][🖇osc] is our preferred funding platform.
805
264
 
806
- **If you're working in a company that's making significant use of appraisal-rb tools we'd
807
- appreciate it if you suggest to your company to become a appraisal-rb sponsor.**
265
+ **If you're working in a company that's making significant use of pboling tools we'd
266
+ appreciate it if you suggest to your company to become a pboling sponsor.**
808
267
 
809
- You can support the development of appraisal-rb tools via
268
+ You can support the development of pboling tools via
810
269
  [GitHub Sponsors][🖇sponsor],
811
270
  [Liberapay][⛳liberapay],
812
271
  [PayPal][🖇paypal],
813
272
  [Open Collective][🖇osc]
814
273
  and [Tidelift][🏙️entsup-tidelift].
815
274
 
816
- | 📍 NOTE |
275
+ | 📍 NOTE |
817
276
  |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
818
277
  | 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. |
819
278
 
820
279
  ### Open Collective for Individuals
821
280
 
822
- Support us with a monthly donation and help us continue our activities. \[[Become a backer][🖇osc-backers]\]
281
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/pboling#backer)]
823
282
 
824
283
  NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
825
284
 
@@ -829,7 +288,7 @@ No backers yet. Be the first!
829
288
 
830
289
  ### Open Collective for Organizations
831
290
 
832
- Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor][🖇osc-sponsors]\]
291
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/pboling#sponsor)]
833
292
 
834
293
  NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
835
294
 
@@ -837,7 +296,7 @@ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day
837
296
  No sponsors yet. Be the first!
838
297
  <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
839
298
 
840
- [kettle-readme-backers]: https://github.com/appraisal-rb/appraisal2/blob/main/exe/kettle-readme-backers
299
+ [kettle-readme-backers]: https://github.com/pboling/appraisal2/blob/main/exe/kettle-readme-backers
841
300
 
842
301
  ### Another way to support open-source
843
302
 
@@ -845,7 +304,7 @@ I’m driven by a passion to foster a thriving open-source community – a space
845
304
 
846
305
  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`.
847
306
 
848
- 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.
307
+ 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.
849
308
 
850
309
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
851
310
 
@@ -858,7 +317,7 @@ See [SECURITY.md][🔐security].
858
317
  ## 🤝 Contributing
859
318
 
860
319
  If you need some ideas of where to help, you could work on adding more code coverage,
861
- or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
320
+ or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
862
321
  or use the gem and think about how it could be better.
863
322
 
864
323
  We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
@@ -871,11 +330,16 @@ See [CONTRIBUTING.md][🤝contributing].
871
330
 
872
331
  ### Code Coverage
873
332
 
874
- [![Coverage Graph][🔑codecov-g♻️]][🔑codecov]
333
+ <details markdown="1">
334
+ <summary>Coverage service badges</summary>
335
+
336
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
875
337
 
876
- [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
338
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
877
339
 
878
- [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov]
340
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
341
+
342
+ </details>
879
343
 
880
344
  ### 🪇 Code of Conduct
881
345
 
@@ -888,16 +352,16 @@ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][
888
352
 
889
353
  Made with [contributors-img][🖐contrib-rocks].
890
354
 
891
- Also see GitLab Contributors: <https://gitlab.com/appraisal-rb/appraisal2/-/graphs/main>
355
+ Also see GitLab Contributors: [https://gitlab.com/pboling/appraisal2/-/graphs/main][🚎contributors-gl]
892
356
 
893
357
  <details>
894
- <summary>⭐️ Star History</summary>
358
+ <summary>⭐️ Star History</summary>
895
359
 
896
- <a href="https://star-history.com/#appraisal-rb/appraisal2&Date">
360
+ <a href="https://star-history.com/pboling/appraisal2&Date">
897
361
  <picture>
898
- <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=appraisal-rb/appraisal2&type=Date&theme=dark" />
899
- <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=appraisal-rb/appraisal2&type=Date" />
900
- <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=appraisal-rb/appraisal2&type=Date" />
362
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=pboling/appraisal2&type=Date&theme=dark" />
363
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=pboling/appraisal2&type=Date" />
364
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=pboling/appraisal2&type=Date" />
901
365
  </picture>
902
366
  </a>
903
367
 
@@ -905,19 +369,8 @@ Also see GitLab Contributors: <https://gitlab.com/appraisal-rb/appraisal2/-/grap
905
369
 
906
370
  ## 📌 Versioning
907
371
 
908
- This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
909
- Violations of this scheme should be reported as bugs.
910
- Specifically, if a minor or patch version is released that breaks backward compatibility,
911
- a new version should be immediately released that restores compatibility.
912
- Breaking changes to the public API will only be introduced with new major versions.
913
-
914
- > dropping support for a platform is both obviously and objectively a breaking change <br/>
915
- > —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
916
-
917
- I understand that policy doesn't work universally ("exceptions to every rule\!"),
918
- but it is the policy here.
919
- As such, in many cases it is good to specify a dependency on this library using
920
- the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
372
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
373
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
921
374
 
922
375
  For example:
923
376
 
@@ -928,8 +381,8 @@ spec.add_dependency("appraisal2", "~> 3.0")
928
381
  <details markdown="1">
929
382
  <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
930
383
 
931
- SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
932
- is a *breaking change* to an API, and for that reason the bike shedding is endless.
384
+ Dropping support for a platform can be a breaking change for affected users.
385
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
933
386
 
934
387
  To get a better understanding of how SemVer is intended to work over a project's lifetime,
935
388
  read this article from the creator of SemVer:
@@ -943,23 +396,57 @@ See [CHANGELOG.md][📌changelog] for a list of releases.
943
396
  ## 📄 License
944
397
 
945
398
  The gem is available as open source under the terms of
946
- the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
947
- See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
399
+ the [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].
948
400
 
949
401
  ### © Copyright
950
402
 
951
- <ul>
952
- <li>
953
- Copyright (c) 2024 - 2026 Peter H. Boling, of
954
- <a href="https://discord.gg/3qme4XHNKN">
955
- Galtzo.com
956
- <picture>
957
- <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">
958
- </picture>
959
- </a>, and Appraisal2 contributors
960
- </li>
961
- <li>Copyright (c) 2010 - 2013 Joe Ferris and thoughtbot, inc.</li>
962
- </ul>
403
+ See [LICENSE.md][📄license] for the official copyright notice.
404
+
405
+ <details markdown="1">
406
+ <summary>Copyright holders</summary>
407
+
408
+ - Copyright (c) 2010 Joe Ferris
409
+ - Copyright (c) 2011 Dan Croak
410
+ - Copyright (c) 2011-2012 Gabe Berke-Williams
411
+ - Copyright (c) 2011 Joe Ferris
412
+ - Copyright (c) 2011 Joseph Anthony Pasquale Holsten
413
+ - Copyright (c) 2011 Nick Quaranto
414
+ - Copyright (c) 2011 Prem Sichanugrist
415
+ - Copyright (c) 2012 Gregory Ostermayr
416
+ - Copyright (c) 2012 osheroff
417
+ - Copyright (c) 2013 Jason Waldrip
418
+ - Copyright (c) 2013 Marc Ignacio
419
+ - Copyright (c) 2013 Phill Baker
420
+ - Copyright (c) 2013-2016 Prem Sichanugrist
421
+ - Copyright (c) 2013 sanemat
422
+ - Copyright (c) 2014 Juan González
423
+ - Copyright (c) 2014-2015 Prem Sichanugrist
424
+ - Copyright (c) 2015 akihiro17
425
+ - Copyright (c) 2015 Elliot Winkler
426
+ - Copyright (c) 2015 M.Shibuya
427
+ - Copyright (c) 2015 Vlad Bokov
428
+ - Copyright (c) 2016 Geoff Massanek
429
+ - Copyright (c) 2016 Ian Fosbery
430
+ - Copyright (c) 2016 Teo Ljungberg
431
+ - Copyright (c) 2017 Brad Gessler
432
+ - Copyright (c) 2017 Oli Peate
433
+ - Copyright (c) 2017, 2025-2026 Peter H. Boling
434
+ - Copyright (c) 2018 Antonis Berkakis
435
+ - Copyright (c) 2018 Jared Beck
436
+ - Copyright (c) 2018, 2020, 2023-2024 Nick Charlton
437
+ - Copyright (c) 2020 Brian Hawley
438
+ - Copyright (c) 2020 David Rodríguez
439
+ - Copyright (c) 2020 James Ebentier
440
+ - Copyright (c) 2021, 2024 Nicolas Rodriguez
441
+ - Copyright (c) 2022 André Arko
442
+ - Copyright (c) 2022 Joe Sharp
443
+ - Copyright (c) 2023 aymeric-ledorze
444
+ - Copyright (c) 2023 Kyle Fazzari
445
+ - Copyright (c) 2024 Joe Sharp
446
+ - Copyright (c) 2024 Sebastian Cohnen
447
+ - Copyright (c) 2024 Yevhenii Ponomarenko
448
+
449
+ </details>
963
450
 
964
451
  ## 🤑 A request for help
965
452
 
@@ -972,37 +459,39 @@ Please consider sponsoring me or the project.
972
459
 
973
460
  To join the community or get help 👇️ Join the Discord.
974
461
 
975
- [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
462
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
976
463
 
977
464
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
978
465
 
979
- [![Sponsor appraisal-rb/appraisal2 on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
466
+ [![Sponsor pboling/appraisal2 on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
980
467
 
981
468
  ### Please give the project a star ⭐ ♥.
982
469
 
470
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
471
+
983
472
  Thanks for RTFM. ☺️
984
473
 
985
474
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
986
475
  [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
987
476
  [⛳liberapay]: https://liberapay.com/pboling/donate
988
- [🖇osc-all-img]: https://img.shields.io/opencollective/all/appraisal-rb
989
- [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/appraisal-rb
990
- [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/appraisal-rb
991
- [🖇osc-backers]: https://opencollective.com/appraisal-rb#backer
992
- [🖇osc-backers-i]: https://opencollective.com/appraisal-rb/backers/badge.svg?style=flat
993
- [🖇osc-sponsors]: https://opencollective.com/appraisal-rb#sponsor
994
- [🖇osc-sponsors-i]: https://opencollective.com/appraisal-rb/sponsors/badge.svg?style=flat
995
- [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/appraisal-rb?style=for-the-badge
996
- [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/appraisal-rb?style=for-the-badge
997
- [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/appraisal-rb?style=for-the-badge
998
- [🖇osc]: https://opencollective.com/appraisal-rb
477
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/pboling
478
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/pboling
479
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/pboling
480
+ [🖇osc-backers]: https://opencollective.com/pboling#backer
481
+ [🖇osc-backers-i]: https://opencollective.com/pboling/backers/badge.svg?style=flat
482
+ [🖇osc-sponsors]: https://opencollective.com/pboling#sponsor
483
+ [🖇osc-sponsors-i]: https://opencollective.com/pboling/sponsors/badge.svg?style=flat
484
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/pboling?style=for-the-badge
485
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/pboling?style=for-the-badge
486
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/pboling?style=for-the-badge
487
+ [🖇osc]: https://opencollective.com/pboling
999
488
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
1000
489
  [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
1001
490
  [🖇sponsor]: https://github.com/sponsors/pboling
1002
491
  [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
1003
492
  [🖇polar]: https://polar.sh/pboling
1004
493
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
1005
- [🖇kofi]: https://ko-fi.com/O5O86SNP4
494
+ [🖇kofi]: https://ko-fi.com/pboling
1006
495
  [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
1007
496
  [🖇patreon]: https://patreon.com/galtzo
1008
497
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
@@ -1017,23 +506,26 @@ Thanks for RTFM. ☺️
1017
506
  [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
1018
507
  [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
1019
508
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
509
+
1020
510
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
1021
- [⛳️gem-namespace]: https://github.com/appraisal-rb/appraisal2
1022
- [⛳️namespace-img]: https://img.shields.io/badge/namespace-Appraisal-brightgreen.svg?style=flat&logo=ruby&logoColor=white
1023
- [⛳️gem-name]: https://rubygems.org/gems/appraisal2
1024
- [⛳️name-img]: https://img.shields.io/badge/name-appraisal2-brightgreen.svg?style=flat&logo=rubygems&logoColor=red
1025
- [🚂bdfl-blog]: http://www.railsbling.com/tags/appraisal2
1026
- [🚂bdfl-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
1027
- [🚂bdfl-contact]: http://www.railsbling.com/contact
1028
- [🚂bdfl-contact-img]: https://img.shields.io/badge/Contact-BDFL-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
511
+ [⛳️gem-namespace]: https://github.com/pboling/appraisal2
512
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Appraisal2-3C2D2D.svg?style=square&logo=ruby&logoColor=white
513
+ [⛳️gem-name]: https://bestgems.org/gems/appraisal2
514
+ [⛳️name-img]: https://img.shields.io/badge/name-appraisal2-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
515
+ [⛳️tag-img]: https://img.shields.io/github/tag/pboling/appraisal2.svg
516
+ [⛳️tag]: https://github.com/pboling/appraisal2/releases
517
+ [🚂maint-blog]: http://www.railsbling.com/tags/appraisal2
518
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
519
+ [🚂maint-contact]: http://www.railsbling.com/contact
520
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
1029
521
  [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
1030
- [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
1031
- [💖✌️wellfound]: https://angel.co/u/peter-boling
522
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
523
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
1032
524
  [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
1033
525
  [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
1034
526
  [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
1035
527
  [💖🐘ruby-mast]: https://ruby.social/@galtzo
1036
- [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=flat&logo=mastodon&label=Ruby%20%40galtzo
528
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
1037
529
  [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
1038
530
  [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
1039
531
  [💖🌳linktree]: https://linktr.ee/galtzo
@@ -1050,91 +542,76 @@ Thanks for RTFM. ☺️
1050
542
  [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
1051
543
  [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
1052
544
  [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
1053
- [🏙️entsup-tidelift]: https://tidelift.com/subscription
545
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-appraisal2?utm_source=rubygems-appraisal2&utm_medium=referral&utm_campaign=readme
1054
546
  [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
1055
547
  [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
1056
548
  [💁🏼‍♂️peterboling]: http://www.peterboling.com
1057
549
  [🚂railsbling]: http://www.railsbling.com
1058
550
  [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
1059
- [📜src-gl]: https://gitlab.com/appraisal-rb/appraisal2/
551
+ [📜src-gl]: https://gitlab.com/pboling/appraisal2
1060
552
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
1061
- [📜src-cb]: https://codeberg.org/appraisal-rb/appraisal2
553
+ [📜src-cb]: https://codeberg.org/pboling/appraisal2
1062
554
  [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
1063
- [📜src-gh]: https://github.com/appraisal-rb/appraisal2
555
+ [📜src-gh]: https://github.com/pboling/appraisal2
1064
556
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
1065
557
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
1066
- [📜wiki]: https://gitlab.com/appraisal-rb/appraisal2/-/wikis/home
1067
- [📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=Wiki&logoColor=white
1068
- [👽dl-rank]: https://rubygems.org/gems/appraisal2
558
+ [📜gl-wiki]: https://gitlab.com/pboling/appraisal2/-/wikis/home
559
+ [📜gh-wiki]: https://github.com/pboling/appraisal2/wiki
560
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
561
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
562
+ [👽dl-rank]: https://bestgems.org/gems/appraisal2
1069
563
  [👽dl-ranki]: https://img.shields.io/gem/rd/appraisal2.svg
1070
- [👽oss-help]: https://www.codetriage.com/appraisal-rb/appraisal2
1071
- [👽oss-helpi]: https://www.codetriage.com/appraisal-rb/appraisal2/badges/users.svg
1072
- [👽version]: https://rubygems.org/gems/appraisal2
564
+ [👽version]: https://bestgems.org/gems/appraisal2
1073
565
  [👽versioni]: https://img.shields.io/gem/v/appraisal2.svg
1074
- [🔑qlty-mnt]: https://qlty.sh/gh/appraisal-rb/projects/appraisal2
1075
- [🔑qlty-mnti]: https://qlty.sh/gh/appraisal-rb/projects/appraisal2/maintainability.svg
1076
- [🔑qlty-cov]: https://qlty.sh/gh/appraisal-rb/projects/appraisal2/metrics/code?sort=coverageRating
1077
- [🔑qlty-covi]: https://qlty.sh/gh/appraisal-rb/projects/appraisal2/coverage.svg
1078
- [🔑codecov]: https://codecov.io/gh/appraisal-rb/appraisal2
1079
- [🔑codecovi♻️]: https://codecov.io/gh/appraisal-rb/appraisal2/branch/main/graph/badge.svg?token=0X5VEW9USD
1080
- [🔑coveralls]: https://coveralls.io/github/appraisal-rb/appraisal2?branch=main
1081
- [🔑coveralls-img]: https://coveralls.io/repos/github/appraisal-rb/appraisal2/badge.svg?branch=main
1082
- [🖐codeQL]: https://github.com/appraisal-rb/appraisal2/security/code-scanning
1083
- [🖐codeQL-img]: https://github.com/appraisal-rb/appraisal2/actions/workflows/codeql-analysis.yml/badge.svg
1084
- [🚎1-r2.3-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-3.yml
1085
- [🚎1-r2.3-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-3.yml/badge.svg
1086
- [🚎1-r2.4-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-4.yml
1087
- [🚎1-r2.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-4.yml/badge.svg
1088
- [🚎1-r2.5-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-5.yml
1089
- [🚎1-r2.5-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-5.yml/badge.svg
1090
- [🚎1-r2.6-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-6.yml
1091
- [🚎1-r2.6-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-6.yml/badge.svg
1092
- [🚎1-r2.7-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-7.yml
1093
- [🚎1-r2.7-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-7.yml/badge.svg
1094
- [🚎2-cov-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/coverage.yml
1095
- [🚎2-cov-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/coverage.yml/badge.svg
1096
- [🚎3-hd-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/heads.yml
1097
- [🚎3-hd-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/heads.yml/badge.svg
1098
- [🚎4-r2.3-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-3.yml
1099
- [🚎4-r2.3-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-3.yml/badge.svg
1100
- [🚎4-r2.4-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-4.yml
1101
- [🚎4-r2.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-4.yml/badge.svg
1102
- [🚎4-r2.5-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-5.yml
1103
- [🚎4-r2.5-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-5.yml/badge.svg
1104
- [🚎4-r2.6-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-6.yml
1105
- [🚎4-r2.6-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-6.yml/badge.svg
1106
- [🚎4-r2.7-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-7.yml
1107
- [🚎4-r2.7-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-7.yml/badge.svg
1108
- [🚎4-r3.0-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-0.yml
1109
- [🚎4-r3.0-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-0.yml/badge.svg
1110
- [🚎4-r3.1-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-1.yml
1111
- [🚎4-r3.1-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-1.yml/badge.svg
1112
- [🚎4-r3.2-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-2.yml
1113
- [🚎4-r3.2-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-2.yml/badge.svg
1114
- [🚎4-r3.3-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-3.yml
1115
- [🚎4-r3.3-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-3.yml/badge.svg
1116
- [🚎4-r3.4-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-4.yml
1117
- [🚎4-r3.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-4.yml/badge.svg
1118
- [🚎5-st-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/style.yml
1119
- [🚎5-st-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/style.yml/badge.svg
1120
- [🚎9-t-wf]: https://github.com/galtzo-floss/simple_column-scopes/actions/workflows/truffle.yml
1121
- [🚎9-t-wfi]: https://github.com/galtzo-floss/simple_column-scopes/actions/workflows/truffle.yml/badge.svg
1122
- [🚎10-j-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby.yml
1123
- [🚎10-j-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby.yml/badge.svg
1124
- [🚎11-c-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current.yml
1125
- [🚎11-c-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current.yml/badge.svg
1126
- [🚎12-crh-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current-runtime-heads.yml
1127
- [🚎12-crh-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current-runtime-heads.yml/badge.svg
1128
- [🚎13-🔒️-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/locked_deps.yml
1129
- [🚎13-🔒️-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/locked_deps.yml/badge.svg
1130
- [🚎14-🔓️-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/unlocked_deps.yml
1131
- [🚎14-🔓️-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/unlocked_deps.yml/badge.svg
1132
- [💎ruby-1.8i]: https://img.shields.io/badge/Ruby-1.8_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
566
+ [🏀qlty-mnt]: https://qlty.sh/gh/pboling/projects/appraisal2
567
+ [🏀qlty-mnti]: https://qlty.sh/gh/pboling/projects/appraisal2/maintainability.svg
568
+ [🏀qlty-cov]: https://qlty.sh/gh/pboling/projects/appraisal2/metrics/code?sort=coverageRating
569
+ [🏀qlty-covi]: https://qlty.sh/gh/pboling/projects/appraisal2/coverage.svg
570
+ [🏀codecov]: https://codecov.io/gh/pboling/appraisal2
571
+ [🏀codecovi]: https://codecov.io/gh/pboling/appraisal2/graph/badge.svg
572
+ [🏀coveralls]: https://coveralls.io/github/pboling/appraisal2?branch=main
573
+ [🏀coveralls-img]: https://coveralls.io/repos/github/pboling/appraisal2/badge.svg?branch=main
574
+ [🚎ruby-2.4-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-2.4.yml
575
+ [🚎ruby-2.5-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-2.5.yml
576
+ [🚎ruby-2.6-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-2.6.yml
577
+ [🚎ruby-2.7-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-2.7.yml
578
+ [🚎ruby-3.0-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-3.0.yml
579
+ [🚎ruby-3.1-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-3.1.yml
580
+ [🚎ruby-3.2-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-3.2.yml
581
+ [🚎ruby-3.3-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-3.3.yml
582
+ [🚎ruby-3.4-wf]: https://github.com/pboling/appraisal2/actions/workflows/ruby-3.4.yml
583
+ [🚎jruby-9.2-wf]: https://github.com/pboling/appraisal2/actions/workflows/jruby-9.2.yml
584
+ [🚎jruby-9.3-wf]: https://github.com/pboling/appraisal2/actions/workflows/jruby-9.3.yml
585
+ [🚎jruby-9.4-wf]: https://github.com/pboling/appraisal2/actions/workflows/jruby-9.4.yml
586
+ [🚎truby-22.3-wf]: https://github.com/pboling/appraisal2/actions/workflows/truffleruby-22.3.yml
587
+ [🚎truby-23.0-wf]: https://github.com/pboling/appraisal2/actions/workflows/truffleruby-23.0.yml
588
+ [🚎truby-23.1-wf]: https://github.com/pboling/appraisal2/actions/workflows/truffleruby-23.1.yml
589
+ [🚎truby-24.2-wf]: https://github.com/pboling/appraisal2/actions/workflows/truffleruby-24.2.yml
590
+ [🚎truby-25.0-wf]: https://github.com/pboling/appraisal2/actions/workflows/truffleruby-25.0.yml
591
+ [🚎2-cov-wf]: https://github.com/pboling/appraisal2/actions/workflows/coverage.yml
592
+ [🚎2-cov-wfi]: https://github.com/pboling/appraisal2/actions/workflows/coverage.yml/badge.svg
593
+ [🚎3-hd-wf]: https://github.com/pboling/appraisal2/actions/workflows/heads.yml
594
+ [🚎3-hd-wfi]: https://github.com/pboling/appraisal2/actions/workflows/heads.yml/badge.svg
595
+ [🚎5-st-wf]: https://github.com/pboling/appraisal2/actions/workflows/style.yml
596
+ [🚎5-st-wfi]: https://github.com/pboling/appraisal2/actions/workflows/style.yml/badge.svg
597
+ [🚎9-t-wf]: https://github.com/pboling/appraisal2/actions/workflows/truffle.yml
598
+ [🚎9-t-wfi]: https://github.com/pboling/appraisal2/actions/workflows/truffle.yml/badge.svg
599
+ [🚎10-j-wf]: https://github.com/pboling/appraisal2/actions/workflows/jruby.yml
600
+ [🚎10-j-wfi]: https://github.com/pboling/appraisal2/actions/workflows/jruby.yml/badge.svg
601
+ [🚎11-c-wf]: https://github.com/pboling/appraisal2/actions/workflows/current.yml
602
+ [🚎11-c-wfi]: https://github.com/pboling/appraisal2/actions/workflows/current.yml/badge.svg
603
+ [🚎12-crh-wf]: https://github.com/pboling/appraisal2/actions/workflows/dep-heads.yml
604
+ [🚎12-crh-wfi]: https://github.com/pboling/appraisal2/actions/workflows/dep-heads.yml/badge.svg
605
+ [🚎13-🔒️-wf]: https://github.com/pboling/appraisal2/actions/workflows/locked_deps.yml
606
+ [🚎13-🔒️-wfi]: https://github.com/pboling/appraisal2/actions/workflows/locked_deps.yml/badge.svg
607
+ [🚎14-🔓️-wf]: https://github.com/pboling/appraisal2/actions/workflows/unlocked_deps.yml
608
+ [🚎14-🔓️-wfi]: https://github.com/pboling/appraisal2/actions/workflows/unlocked_deps.yml/badge.svg
609
+ [🚎15-🪪-wf]: https://github.com/pboling/appraisal2/actions/workflows/license-eye.yml
610
+ [🚎15-🪪-wfi]: https://github.com/pboling/appraisal2/actions/workflows/license-eye.yml/badge.svg
1133
611
  [💎ruby-1.9i]: https://img.shields.io/badge/Ruby-1.9_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
1134
612
  [💎ruby-2.0i]: https://img.shields.io/badge/Ruby-2.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
1135
613
  [💎ruby-2.1i]: https://img.shields.io/badge/Ruby-2.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
1136
614
  [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
1137
- [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
1138
615
  [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
1139
616
  [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
1140
617
  [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
@@ -1144,56 +621,75 @@ Thanks for RTFM. ☺️
1144
621
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
1145
622
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
1146
623
  [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
624
+ [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
1147
625
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
1148
626
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
1149
- [💎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
1150
- [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
627
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
628
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
629
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
1151
630
  [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
1152
631
  [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
1153
632
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
1154
- [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
633
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
634
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
1155
635
  [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
1156
636
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
1157
637
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
1158
- [🤝gh-issues]: https://github.com/appraisal-rb/appraisal2/issues
1159
- [🤝gh-pulls]: https://github.com/appraisal-rb/appraisal2/pulls
1160
- [🤝gl-issues]: https://gitlab.com/appraisal-rb/appraisal2/-/issues
1161
- [🤝gl-pulls]: https://gitlab.com/appraisal-rb/appraisal2/-/merge_requests
1162
- [🤝cb-issues]: https://codeberg.org/appraisal-rb/appraisal2/issues
1163
- [🤝cb-pulls]: https://codeberg.org/appraisal-rb/appraisal2/pulls
638
+ [🤝gh-issues]: https://github.com/pboling/appraisal2/issues
639
+ [🤝gh-pulls]: https://github.com/pboling/appraisal2/pulls
640
+ [🤝gl-issues]: https://gitlab.com/pboling/appraisal2/-/issues
641
+ [🤝gl-pulls]: https://gitlab.com/pboling/appraisal2/-/merge_requests
642
+ [🤝cb-issues]: https://codeberg.org/pboling/appraisal2/issues
643
+ [🤝cb-pulls]: https://codeberg.org/pboling/appraisal2/pulls
1164
644
  [🤝cb-donate]: https://donate.codeberg.org/
1165
- [🤝contributing]: CONTRIBUTING.md
1166
- [🔑codecov-g♻️]: https://codecov.io/gh/appraisal-rb/appraisal2/graphs/tree.svg?token=0X5VEW9USD
645
+ [🤝contributing]: https://github.com/pboling/appraisal2/blob/main/CONTRIBUTING.md
646
+ [🏀codecov-g]: https://codecov.io/gh/pboling/appraisal2/graph/badge.svg
1167
647
  [🖐contrib-rocks]: https://contrib.rocks
1168
- [🖐contributors]: https://github.com/appraisal-rb/appraisal2/graphs/contributors
1169
- [🖐contributors-img]: https://contrib.rocks/image?repo=appraisal-rb/appraisal2
1170
- [🚎contributors-gl]: https://gitlab.com/appraisal-rb/appraisal2/-/graphs/main
1171
- [🪇conduct]: CODE_OF_CONDUCT.md
648
+ [🖐contributors]: https://github.com/pboling/appraisal2/graphs/contributors
649
+ [🖐contributors-img]: https://contrib.rocks/image?repo=pboling/appraisal2
650
+ [🚎contributors-gl]: https://gitlab.com/pboling/appraisal2/-/graphs/main
651
+ [🪇conduct]: https://github.com/pboling/appraisal2/blob/main/CODE_OF_CONDUCT.md
1172
652
  [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
1173
653
  [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
1174
654
  [📌semver]: https://semver.org/spec/v2.0.0.html
1175
655
  [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
1176
656
  [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
1177
657
  [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
1178
- [📌changelog]: CHANGELOG.md
658
+ [📌changelog]: https://github.com/pboling/appraisal2/blob/main/CHANGELOG.md
1179
659
  [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
1180
660
  [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
1181
- [📌gitmoji]:https://gitmoji.dev
1182
- [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20😜%20😍-34495e.svg?style=flat-square
661
+ [📌gitmoji]: https://gitmoji.dev
662
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1183
663
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1184
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.823-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1185
- [🔐security]: SECURITY.md
664
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.834-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
665
+ [🔐security]: https://github.com/pboling/appraisal2/blob/main/SECURITY.md
1186
666
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1187
667
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
1188
- [📄license]: LICENSE.txt
1189
- [📄license-ref]: https://opensource.org/licenses/MIT
668
+ [📄license]: LICENSE.md
669
+ [📄license-ref]: MIT.md
1190
670
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
671
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
672
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-✓-259D6C.svg?style=flat&logo=Apache
673
+
1191
674
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
1192
675
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
1193
676
  [🚎yard-current]: http://rubydoc.info/gems/appraisal2
1194
677
  [🚎yard-head]: https://appraisal2.galtzo.com
1195
- [💎stone_checksums]: https://github.com/pboling/stone_checksums
1196
- [💎SHA_checksums]: https://gitlab.com/appraisal-rb/appraisal2/-/tree/main/checksums
678
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
679
+ [💎SHA_checksums]: https://gitlab.com/pboling/appraisal2/-/tree/main/checksums
1197
680
  [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
1198
- [💎rlts-img]: https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
681
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
682
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
683
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
1199
684
  [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
685
+
686
+ <!-- kettle-jem:metadata:start -->
687
+ | Field | Value |
688
+ |---|---|
689
+ | Package | appraisal2 |
690
+ | Description | 🔍️ Appraisal2 integrates with bundler and rake to test your library against different versions of dependencies in repeatable scenarios called "appraisals." |
691
+ | Homepage | https://github.com/pboling/appraisal2 |
692
+ | Source | https://github.com/pboling/appraisal2/tree/v3.0.7 |
693
+ | License | `MIT` |
694
+ | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/appraisal-rb, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/appraisal2, https://www.buymeacoffee.com/pboling |
695
+ <!-- kettle-jem:metadata:end -->