appraisal2 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48c10cc390c3e867c853049163f6aace2a3980439f6fae81dc6c689131b431a4
4
- data.tar.gz: 2db45bd980fc49813d3f4f70dd40dc604b492b6ff8e6954eb93f2b71a4aa9b52
3
+ metadata.gz: '00238b4f449b722f44616a03423e66d0ac258b612305696715a0b174536cb811'
4
+ data.tar.gz: 3b3ae4af7322b1af5cec9b2785570fc080bbd5f3a183b86130a6ce1f675a5f26
5
5
  SHA512:
6
- metadata.gz: d74930e7289feb1f3731044f42616a71fe8da8d6c899929dedff8e3381dfcf6bd7c5481413c4086d508bd5c10668e29540d86a30ef6f65b74a87887043b3af85
7
- data.tar.gz: 73a486be485a24ab59234bd0dd97bf93b3c388a1f5c46fcbc73a6809ff248571e81380d009560fe9937e16aa4654bc812b3e81fd1d6ece9caa5f2085d9201720
6
+ metadata.gz: 117cf9b62c2493baa3f0f03f199a4730e21be9c441e07289e80749d3a229b3b7bba541f5691e21049a38c239e7be4ff8596f92aba65584893ed3281ae99e7175
7
+ data.tar.gz: ea442654a6fef207430453eab13d29bf725cfd0befa694e984c2272f4c70ae84e11644beaaa0c919a5cdd6506f6aeefe7db95994a16bea74dc0288d6bb8724a0
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -6,23 +6,108 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ## [Unreleased]
9
+
9
10
  ### Added
11
+
10
12
  ### Changed
13
+
11
14
  ### Deprecated
15
+
12
16
  ### Removed
17
+
18
+ ### Fixed
19
+
20
+ ### Security
21
+
22
+ ## [3.0.2] - 2026-02-06
23
+
24
+ - TAG: [v3.0.2][3.0.2t]
25
+ - COVERAGE: 77.11% -- 603/782 lines in 27 files
26
+ - BRANCH COVERAGE: 83.96% -- 89/106 branches in 27 files
27
+ - 43.03% documented
28
+
29
+ ### Added
30
+
31
+ - funding documentation
32
+ - Ruby version compatibility badges for v1.8 - v2.2, v3.4, v4.0
33
+ - Appraisal & CI workflow for ruby v3.4
34
+
35
+ ## [3.0.1] - 2026-02-06
36
+
37
+ - TAG: [v3.0.1][3.0.1t]
38
+ - COVERAGE: 77.11% -- 603/782 lines in 27 files
39
+ - BRANCH COVERAGE: 83.96% -- 89/106 branches in 27 files
40
+ - 43.03% documented
41
+
42
+ ### Added
43
+
44
+ - Support for [ore-light](https://github.com/contriboss/ore-light) as an alternative gem manager via `--gem-manager=ore` CLI option
45
+ - New `GemManager::OreAdapter` class implementing ore-light integration
46
+ - New `GemManager::BundlerAdapter` class (extracted from existing bundler logic)
47
+ - New `GemManager::Factory` class for creating gem manager adapters
48
+ - New `GemManager::Base` abstract base class defining the gem manager interface
49
+ - New `OreNotAvailableError` and `UnknownGemManagerError` error classes
50
+ - Acceptance tests for ore install and update commands (tagged with `:ore` metadata for conditional execution)
51
+ - Unit tests for all gem manager adapter classes
52
+ - README documentation for ore usage, including installation, CLI options, and example workflows
53
+ - New `-g` / `--gem-manager` CLI option to select gem manager (bundler or ore) for install/update commands
54
+ - New `Appraisal::Customize.reset!` class method to reset customization state (useful for testing)
55
+ - Improved test coverage from 66.7% to 76.4% line coverage, 61.5% to 77.4% branch coverage
56
+ - New unit tests for `BundlerDSL` class (including APPRAISAL_INDENTER variations)
57
+ - New unit tests for `Command` class
58
+ - New unit tests for `Conditional` class
59
+ - New unit tests for `Source` class
60
+ - New unit tests for `Git` class
61
+ - New unit tests for `Path` class
62
+ - New unit tests for `OrderedHash` class
63
+ - New unit tests for `Dependency` class
64
+ - New unit tests for `Group` class
65
+ - New unit tests for `Platform` class
66
+ - New unit tests for `GemManager::Factory` class
67
+ - New unit tests for error classes (`AppraisalsNotFound`, `OreNotAvailableError`, `UnknownGemManagerError`)
68
+ - Enhanced `DependencyList` tests with edge cases
69
+ - Enhanced `Gemfile` tests with load/run/dup edge cases
70
+ - Added documentation on hostile takeover of RubyGems
71
+ - https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo
72
+ - CLI configs for RuboCop, RubyGems, YARD, and JRuby (for local development only)
73
+
74
+ ### Changed
75
+
76
+ - Improved test isolation for acceptance tests to prevent modification of parent project's Gemfile.lock
77
+ - Added `BUNDLE_APP_CONFIG` isolation to prevent reading/writing parent's `.bundle/config`
78
+ - Added explicit `BUNDLE_GEMFILE` prefix to all bundle commands in tests
79
+ - Added `BUNDLE_LOCKFILE` environment variable to explicitly control where lockfiles are written
80
+ - Set `BUNDLE_IGNORE_FUNDING_REQUESTS` and `BUNDLE_DISABLE_SHARED_GEMS` for cleaner test output
81
+ - Added `BUNDLE_USER_CACHE` isolation to prevent polluting user's gem cache
82
+ - Fixed overly broad `File` stubs in unit tests that interfered with RSpec error formatting
83
+ - Changed `bundle_without_spec.rb` to use `skip_for` instead of `pending_for` to prevent test setup from running on unsupported Ruby versions (which was polluting the project Gemfile.lock with test gems)
84
+ - YARD CLI config switch from custom Kramdown support to yard-fence
85
+
13
86
  ### Fixed
87
+
88
+ - Fixed `BundlerAdapter#install` not passing `gemfile_path` to `Command.new`, which caused bundler to potentially write to the wrong Gemfile.lock when `Bundler.with_original_env` reset the environment
89
+ - Fixed ore-light adapter path resolution: ore now runs from the gemfile's directory so relative path dependencies resolve correctly (ore resolves paths relative to working directory, not gemfile location)
90
+ - Fixed Thor `invoke(:generate, [])` call in `update` command to pass empty options hash, preventing argument leakage
91
+
14
92
  ### Security
15
93
 
16
- ## [3.0.0] - 2025-07-27
17
- - Initial release as hard fork, from [appraisal v3.0.0.rc1](https://github.com/thoughtbot/appraisal/commit/602cdd9b5f8cb8f36992733422f69312b172f427), with many improvements - by @pboling
94
+ - Ore adapter now uses array-based command construction for `Kernel.system` calls instead of string interpolation, preventing potential shell injection vulnerabilities
95
+
96
+ ## [3.0.0] - 2025-07-28
97
+
98
+ - Initial release as a hard fork of [appraisal v3.0.0.rc1](https://github.com/thoughtbot/appraisal/commit/602cdd9b5f8cb8f36992733422f69312b172f427) with many improvements - by @pboling
18
99
  - support for `eval_gemfile`
19
100
  - support for Ruby 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 (all removed, or planned-to-be, in thoughtbot's `appraisal`)
20
- - NOTE: The [setup-ruby GH Action](https://github.com/ruby/setup-ruby) only ships support for Ruby 2.3+, so older Rubies are no longer tested in CI. Compatibility is assumed thanks to [![Enforced Code Style Linter][💎rlts-img]](https://github.com/rubocop-lts/rubocop-lts) enforcing the syntax for the oldest supported Ruby, which is Ruby v1.8. File a bug if you find something broken.
101
+ - NOTE: The [setup-ruby GH Action](https://github.com/ruby/setup-ruby) only ships support for Ruby 2.3+, so older Rubies are no longer tested in CI. Compatibility is assumed thanks to [![Enforced Code Style Linter](https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white)](https://github.com/rubocop-lts/rubocop-lts) enforcing the syntax for the oldest supported Ruby, which is Ruby v1.8. File a bug if you find something broken.
21
102
  - Support for JRuby 9.4+
22
103
  - updated and improved documentation
23
104
  - maintainability tracked with QLTY.sh and the reek gem
24
105
  - code coverage tracked with Coveralls, QLTY.sh, and the kettle-soup-cover gem
25
106
  - other minor fixes and improvements
26
107
 
27
- [Unreleased]: https://gitlab.com/appraisal-rb/appraisal2/-/compare/v3.0.0...HEAD
28
- [3.0.0]: https://gitlab.com/appraisal-rb/appraisal2/-/compare/602cdd9b5f8cb8f36992733422f69312b172f427...v3.0.0
108
+ [Unreleased]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.2...HEAD
109
+ [3.0.2]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.1...v3.0.2
110
+ [3.0.2t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.0.2
111
+ [3.0.1]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.0...v3.0.1
112
+ [3.0.1t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.0.1
113
+ [3.0.0]: https://github.com/appraisal-rb/appraisal2/compare/602cdd9b5f8cb8f36992733422f69312b172f427...v3.0.0
data/README.md CHANGED
@@ -1,14 +1,11 @@
1
- <p align="center">
2
- <a href="https://discord.gg/3qme4XHNKN" target="_blank" rel="noopener">
3
- <img width="120px" src="https://github.com/galtzo-floss/shields-badge/raw/main/docs/images/logo/galtzo-floss-logos-original.svg?raw=true" alt="Galtzo.com Logo by Aboling0, CC BY-SA 4.0">
4
- </a>
5
- <a href="https://appraisal2.galtzo.com" target="_blank" rel="noopener">
6
- <img width="120px" src="https://github.com/appraisal-rb/appraisal2/raw/main/docs/images/logo/LoupeAppraiser.svg?raw=true" alt="appraisal-rb Logo by Aboling0, CC BY-SA 4.0">
7
- </a>
8
- <a href="https://www.ruby-lang.org/" target="_blank" rel="noopener">
9
- <img width="120px" src="https://github.com/galtzo-floss/shields-badge/raw/main/docs/images/logo/ruby-logo-198px.svg?raw=true" alt="Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5">
10
- </a>
11
- </p>
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
12
9
 
13
10
  # 🔍️ Appraisal2
14
11
 
@@ -16,12 +13,19 @@
16
13
 
17
14
  - You, possibly
18
15
 
19
- [![Version][👽versioni]][👽version] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![Depfu][🔑depfui♻️]][🔑depfu] [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls] [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov] [![QLTY Maintainability][🔑qlty-mnti]][🔑qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf]
16
+ [![Version][👽versioni]][👽version] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![Depfu][🔑depfui♻️]][🔑depfu] [![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] [![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]
20
17
 
21
18
  ---
22
19
 
23
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]
24
21
 
22
+ <details>
23
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
24
+
25
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
26
+
27
+ </details>
28
+
25
29
  ## 🌻 Synopsis
26
30
 
27
31
  Appraisal2 integrates with bundler and rake to test your library against
@@ -37,6 +41,8 @@ and [Joe Ferris](https://github.com/jferris), the original author!
37
41
  Appraisal2 adds:
38
42
 
39
43
  - support for `eval_gemfile`
44
+ - support for [ORE](https://github.com/contriboss/ore-light) as an alternative gem manager (faster than bundler!)
45
+ - For easy setup in **Gitea** [Actions](https://docs.gitea.com/usage/actions/overview), **Forgejo** [Actions](https://forgejo.org/docs/next/admin/actions/), **Codeberg** [Actions](https://docs.codeberg.org/ci/actions/), or **GitHub** [Actions](https://github.com/marketplace/actions/setup-ruby-with-rv-and-ore) check out [appraisal-rb/setup-ruby-flash](https://github.com/appraisal-rb/setup-ruby-flash)
40
46
  - support for Ruby 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 (all removed, or planned-to-be, in thoughtbot's `appraisal`)
41
47
  - NOTE: The [setup-ruby GH Action](https://github.com/ruby/setup-ruby) only ships support for Ruby 2.3+, so older Rubies are no longer tested in CI. Compatibility is assumed thanks to [![Enforced Code Style Linter][💎rlts-img]][💎rlts] enforcing the syntax for the oldest supported Ruby, which is Ruby v1.8. File a bug if you find something broken.
42
48
  - Support for JRuby 9.4+
@@ -49,8 +55,10 @@ Appraisal2 adds:
49
55
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
50
56
  | Works with JRuby | [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎10-j9.4-wf] [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
51
57
  | Works with Truffle Ruby | [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
52
- | 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-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
53
- | Works with MRI Ruby 2 | [![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] |
58
+ | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
59
+ | 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] |
60
+ | 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] |
61
+ | Works with MRI Ruby 1 | ![Ruby 1.8 Compat][💎ruby-1.8i] ![Ruby 1.9 Compat][💎ruby-1.9i] |
54
62
  | 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] |
55
63
  | 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] |
56
64
  | 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] |
@@ -83,6 +91,9 @@ pollute the global namespace, one alternative is
83
91
 
84
92
  ### 🔒 Secure Installation
85
93
 
94
+ <details>
95
+ <summary>For Medium or High Security Installations</summary>
96
+
86
97
  `appraisal2` is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
87
98
  [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
88
99
  by following the instructions below.
@@ -111,6 +122,8 @@ bundle config set --global trust-policy MediumSecurity
111
122
 
112
123
  NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
113
124
 
125
+ </details>
126
+
114
127
  ## 🔧 Basic Setup
115
128
 
116
129
  Setting up appraisal2 requires an `Appraisals` file (similar to a `Gemfile`) in
@@ -134,6 +147,173 @@ your `Gemfile`, so you don't need to repeat anything that's the same for each
134
147
  appraisal. If something is specified in both the Gemfile and an appraisal, the
135
148
  version from the appraisal takes precedence.
136
149
 
150
+ ### Examples of usage in the wild
151
+
152
+ Appraisal2 can be setup to achieve many different things, from testing against
153
+ different versions of services, like MySQL, Redis, or Memcached, and their drivers,
154
+ different versions of gems, different platforms, and running different types of validations
155
+ which each require a distinct set of gems.
156
+ It can also help developers to follow the [official recommendation](https://github.com/rubygems/bundler-site/pull/501) (since 2017) of the bundler team,
157
+ 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.
158
+
159
+ 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!
160
+
161
+ | # | gem | locked / unlocked deps | analysis / services | SemVer / HEAD deps | Rubies | os |
162
+ |---|-------------------------------------------------------------------------------|----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----|
163
+ | 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-🗣️] | ❌ |
164
+ | 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-🗣️] | ❌ |
165
+ | 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-🗣️] | ❌ |
166
+ | 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⚙️]<br>[![Svcs][4-sc⚙️i]][4-sc⚙️]<br>[![L-Svcs][4-sl⚙️i]][4-sl⚙️]<br>[![S-Svcs][4-ss⚙️i]][4-ss⚙️]<br>[![U-Svcs][4-su⚙️i]][4-su⚙️]<br>[![A-Svcs][4-sa⚙️i]][4-sa⚙️]<br>[![J-Svcs][4-sj⚙️i]][4-sj⚙️]<br>[![AJ-Svcs][4-saj⚙️i]][4-saj⚙️] | [![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>[![JRuby Ancient][4-ja👴i]][4-ja👴]<br>[![Head][4-🗣️i]][4-🗣️] | ❌ |
167
+
168
+ [1-gh]: https://github.com/omniauth/omniauth-identity
169
+ [1-🧰]: https://www.ruby-toolbox.com/projects/omniauth-identity
170
+ [1-⭐️i]: https://img.shields.io/github/stars/omniauth/omniauth-identity
171
+ [1-🔢i]: https://img.shields.io/gem/rd/omniauth-identity.svg
172
+ [1-🔒️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/deps_locked.yml
173
+ [1-🔒️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/deps_locked.yml/badge.svg
174
+ [1-un🔒️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/deps_unlocked.yml
175
+ [1-un🔒️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/deps_unlocked.yml/badge.svg
176
+ [1-as⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/style.yml
177
+ [1-as⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/style.yml/badge.svg
178
+ [1-ac⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/coverage.yml
179
+ [1-ac⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/coverage.yml/badge.svg
180
+ [1-sc⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/current-svc-adapters.yml
181
+ [1-sc⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/current-svc-adapters.yml/badge.svg
182
+ [1-sl⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/legacy-svc-adapters.yml
183
+ [1-sl⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/legacy-svc-adapters.yml/badge.svg
184
+ [1-ss⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/supported-svc-adapters.yml
185
+ [1-ss⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/supported-svc-adapters.yml/badge.svg
186
+ [1-su⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/unsupported-svc-adapters.yml
187
+ [1-su⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/unsupported-svc-adapters.yml/badge.svg
188
+ [1-sa⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/ancient-svc-adapters.yml
189
+ [1-sa⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/ancient-svc-adapters.yml/badge.svg
190
+ [1-sj⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby-svc-adapters.yml
191
+ [1-sj⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby-svc-adapters.yml/badge.svg
192
+ [1-saj⚙️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby-ancient-svc-adapters.yml
193
+ [1-saj⚙️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby-ancient-svc-adapters.yml/badge.svg
194
+ [1-⏰]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/current.yml
195
+ [1-⏰i]: https://github.com/omniauth/omniauth-identity/actions/workflows/current.yml/badge.svg
196
+ [1-j]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby.yml
197
+ [1-ji]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby.yml/badge.svg
198
+ [1-👟]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/current-runtime-heads.yml
199
+ [1-👟i]: https://github.com/omniauth/omniauth-identity/actions/workflows/current-runtime-heads.yml/badge.svg
200
+ [1-👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/supported.yml
201
+ [1-👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/supported.yml/badge.svg
202
+ [1-u👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/unsupported.yml
203
+ [1-u👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/unsupported.yml/badge.svg
204
+ [1-l👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/legacy.yml
205
+ [1-l👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/legacy.yml/badge.svg
206
+ [1-a👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/ancient.yml
207
+ [1-a👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/ancient.yml/badge.svg
208
+ [1-ja👴]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/jruby-ancient.yml
209
+ [1-ja👴i]: https://github.com/omniauth/omniauth-identity/actions/workflows/jruby-ancient.yml/badge.svg
210
+ [1-🗣️]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/heads.yml
211
+ [1-🗣️i]: https://github.com/omniauth/omniauth-identity/actions/workflows/heads.yml/badge.svg
212
+ [1-gh]: https://github.com/omniauth/omniauth-identity
213
+
214
+ [2-gh]: https://github.com/pboling/rspec-stubbed_env
215
+ [2-🧰]: https://www.ruby-toolbox.com/projects/rspec-stubbed_env
216
+ [2-⭐️i]: https://img.shields.io/github/stars/pboling/rspec-stubbed_env
217
+ [2-🔢i]: https://img.shields.io/gem/rd/rspec-stubbed_env.svg
218
+ [2-🔒️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/deps_locked.yml
219
+ [2-🔒️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/deps_locked.yml/badge.svg
220
+ [2-un🔒️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/deps_unlocked.yml
221
+ [2-un🔒️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/deps_unlocked.yml/badge.svg
222
+ [2-as⚙️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/style.yml
223
+ [2-as⚙️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/style.yml/badge.svg
224
+ [2-ac⚙️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/coverage.yml
225
+ [2-ac⚙️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/coverage.yml/badge.svg
226
+ [2-⏰]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/current.yml
227
+ [2-⏰i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/current.yml/badge.svg
228
+ [2-j]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/jruby.yml
229
+ [2-ji]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/jruby.yml/badge.svg
230
+ [2-t]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/truffle.yml
231
+ [2-ti]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/truffle.yml/badge.svg
232
+ [2-👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/supported.yml
233
+ [2-👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/supported.yml/badge.svg
234
+ [2-u👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/unsupported.yml
235
+ [2-u👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/unsupported.yml/badge.svg
236
+ [2-l👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/legacy.yml
237
+ [2-l👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/legacy.yml/badge.svg
238
+ [2-a👴]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/ancient.yml
239
+ [2-a👴i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/ancient.yml/badge.svg
240
+ [2-🗣️]: https://github.com/pboling/rspec-stubbed_env/blob/main/.github/workflows/heads.yml
241
+ [2-🗣️i]: https://github.com/pboling/rspec-stubbed_env/actions/workflows/heads.yml/badge.svg
242
+
243
+ [3-gh]: https://github.com/pboling/silent_stream
244
+ [3-🧰]: https://www.ruby-toolbox.com/projects/silent_stream
245
+ [3-⭐️i]: https://img.shields.io/github/stars/pboling/silent_stream
246
+ [3-🔢i]: https://img.shields.io/gem/rd/silent_stream.svg
247
+ [3-🔒️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/deps_locked.yml
248
+ [3-🔒️i]: https://github.com/pboling/silent_stream/actions/workflows/deps_locked.yml/badge.svg
249
+ [3-un🔒️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/deps_unlocked.yml
250
+ [3-un🔒️i]: https://github.com/pboling/silent_stream/actions/workflows/deps_unlocked.yml/badge.svg
251
+ [3-as⚙️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/style.yml
252
+ [3-as⚙️i]: https://github.com/pboling/silent_stream/actions/workflows/style.yml/badge.svg
253
+ [3-ac⚙️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/coverage.yml
254
+ [3-ac⚙️i]: https://github.com/pboling/silent_stream/actions/workflows/coverage.yml/badge.svg
255
+ [3-⏰]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/current.yml
256
+ [3-⏰i]: https://github.com/pboling/silent_stream/actions/workflows/current.yml/badge.svg
257
+ [3-j]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/jruby.yml
258
+ [3-ji]: https://github.com/pboling/silent_stream/actions/workflows/jruby.yml/badge.svg
259
+ [3-t]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/truffle.yml
260
+ [3-ti]: https://github.com/pboling/silent_stream/actions/workflows/truffle.yml/badge.svg
261
+ [3-👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/supported.yml
262
+ [3-👴i]: https://github.com/pboling/silent_stream/actions/workflows/supported.yml/badge.svg
263
+ [3-u👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/unsupported.yml
264
+ [3-u👴i]: https://github.com/pboling/silent_stream/actions/workflows/unsupported.yml/badge.svg
265
+ [3-l👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/legacy.yml
266
+ [3-l👴i]: https://github.com/pboling/silent_stream/actions/workflows/legacy.yml/badge.svg
267
+ [3-a👴]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/ancient.yml
268
+ [3-a👴i]: https://github.com/pboling/silent_stream/actions/workflows/ancient.yml/badge.svg
269
+ [3-🗣️]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/heads.yml
270
+ [3-🗣️i]: https://github.com/pboling/silent_stream/actions/workflows/heads.yml/badge.svg
271
+
272
+ [4-gh]: https://github.com/ruby-oauth/oauth2
273
+ [4-🧰]: https://www.ruby-toolbox.com/projects/oauth2
274
+ [4-⭐️i]: https://img.shields.io/github/stars/ruby-oauth/oauth2
275
+ [4-🔢i]: https://img.shields.io/gem/rd/oauth2.svg
276
+ [4-🔒️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/deps_locked.yml
277
+ [4-🔒️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/deps_locked.yml/badge.svg
278
+ [4-un🔒️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/deps_unlocked.yml
279
+ [4-un🔒️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/deps_unlocked.yml/badge.svg
280
+ [4-as⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/style.yml
281
+ [4-as⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/style.yml/badge.svg
282
+ [4-ac⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/coverage.yml
283
+ [4-ac⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/coverage.yml/badge.svg
284
+ [4-sc⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/current-svc-adapters.yml
285
+ [4-sc⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/current-svc-adapters.yml/badge.svg
286
+ [4-sl⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/legacy-svc-adapters.yml
287
+ [4-sl⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/legacy-svc-adapters.yml/badge.svg
288
+ [4-ss⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/supported-svc-adapters.yml
289
+ [4-ss⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/supported-svc-adapters.yml/badge.svg
290
+ [4-su⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/unsupported-svc-adapters.yml
291
+ [4-su⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/unsupported-svc-adapters.yml/badge.svg
292
+ [4-sa⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ancient-svc-adapters.yml
293
+ [4-sa⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/ancient-svc-adapters.yml/badge.svg
294
+ [4-sj⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby-svc-adapters.yml
295
+ [4-sj⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby-svc-adapters.yml/badge.svg
296
+ [4-saj⚙️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby-ancient-svc-adapters.yml
297
+ [4-saj⚙️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby-ancient-svc-adapters.yml/badge.svg
298
+ [4-⏰]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/current.yml
299
+ [4-⏰i]: https://github.com/ruby-oauth/oauth2/actions/workflows/current.yml/badge.svg
300
+ [4-j]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby.yml
301
+ [4-ji]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby.yml/badge.svg
302
+ [4-👟]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/current-runtime-heads.yml
303
+ [4-👟i]: https://github.com/ruby-oauth/oauth2/actions/workflows/current-runtime-heads.yml/badge.svg
304
+ [4-👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/supported.yml
305
+ [4-👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/supported.yml/badge.svg
306
+ [4-u👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/unsupported.yml
307
+ [4-u👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/unsupported.yml/badge.svg
308
+ [4-l👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/legacy.yml
309
+ [4-l👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/legacy.yml/badge.svg
310
+ [4-a👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ancient.yml
311
+ [4-a👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/ancient.yml/badge.svg
312
+ [4-ja👴]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby-ancient.yml
313
+ [4-ja👴i]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby-ancient.yml/badge.svg
314
+ [4-🗣️]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/heads.yml
315
+ [4-🗣️i]: https://github.com/ruby-oauth/oauth2/actions/workflows/heads.yml/badge.svg
316
+
137
317
  ## ⚒️ Basic Usage
138
318
 
139
319
  Once you've configured the appraisals you want to use, you need to install the
@@ -158,7 +338,7 @@ your dependencies in quick test runs, but keep running the tests in older
158
338
  versions to check for regressions.
159
339
 
160
340
  In the case that you want to run all the appraisals by default when you run
161
- `rake`, you can override your default Rake task by put this into your Rakefile:
341
+ `rake`, you can override your default Rake task by putting this into your Rakefile:
162
342
 
163
343
  if !ENV["APPRAISAL_INITIALIZED"] && ENV.fetch("CI", "false").casecmp("false") == 0
164
344
  task :default => :appraisal
@@ -184,6 +364,95 @@ appraisal update [LIST_OF_GEMS] # Remove all generated gemfiles and lockfiles,
184
364
  appraisal version # Display the version and exit
185
365
  ```
186
366
 
367
+ ### Command Options
368
+
369
+ The `install` and `update` commands support several options:
370
+
371
+ | Option | Description |
372
+ |--------|-------------|
373
+ | `--gem-manager`, `-g` | Gem manager to use: `bundler` (default) or `ore` |
374
+ | `--jobs`, `-j` | Install gems in parallel using the given number of workers |
375
+ | `--retry` | Retry network and git requests that have failed (default: 1) |
376
+ | `--without` | A space-separated list of groups to skip during installation |
377
+ | `--full-index` | Run bundle install with the full-index argument |
378
+ | `--path` | Install gems in the specified directory |
379
+
380
+ ## 🦀 Using Ore (Alternative Gem Manager)
381
+
382
+ Appraisal2 supports [ORE](https://github.com/contriboss/ore-light) as an alternative to Bundler
383
+ for dependency resolution and installation. Ore is a fast gem manager written in Go that aims
384
+ to be a drop-in replacement for Bundler.
385
+
386
+ ### Installing Ore
387
+
388
+ You can install ORE via:
389
+
390
+ ```bash
391
+ # Install ORE Light (no Ruby required for download)
392
+ # Installs to ~/.local/bin by default (no sudo needed)
393
+ curl -fsSL https://raw.githubusercontent.com/contriboss/ore-light/master/scripts/install.sh | bash
394
+
395
+ # For system-wide installation to /usr/local/bin
396
+ curl -fsSL https://raw.githubusercontent.com/contriboss/ore-light/master/scripts/install.sh | bash -s -- --system
397
+ ```
398
+
399
+ ### Using Ore with Appraisal2
400
+
401
+ To use ORE instead of bundler, pass the `--gem-manager=ore` option:
402
+
403
+ ```bash
404
+ # Install dependencies using ORE
405
+ bundle exec appraisal install --gem-manager=ore
406
+
407
+ # Update dependencies using ORE
408
+ bundle exec appraisal update --gem-manager=ore
409
+ ```
410
+
411
+ You can also use the short form:
412
+
413
+ ```bash
414
+ bundle exec appraisal install -g ore
415
+ ```
416
+
417
+ ### Ore-Specific Options
418
+
419
+ When using ORE, some options are translated to ORE's equivalents:
420
+
421
+ | Appraisal Option | Ore Equivalent | Notes |
422
+ |------------------|----------------|-------------------------------------|
423
+ | `--jobs=N` | `-workers=N` | Only used when N > 1 |
424
+ | `--path=DIR` | `-vendor=DIR` | Sets the gem installation directory |
425
+ | `--without=GROUPS` | `-without=GROUP1,GROUP2` | Groups are comma-separated in ORE |
426
+ | `--retry` | *(ignored)* | ORE handles retries internally |
427
+ | `--full-index` | *(ignored)* | Not applicable to ORE |
428
+
429
+ ### Example Workflow with ORE
430
+
431
+ ```bash
432
+ # Generate appraisal gemfiles
433
+ bundle exec appraisal generate
434
+
435
+ # Install dependencies using ORE (faster than bundler)
436
+ bundle exec appraisal install --gem-manager=ore --jobs=4
437
+
438
+ # Run tests against all appraisals
439
+ bundle exec appraisal rspec
440
+
441
+ # Update a specific gem using ORE
442
+ bundle exec appraisal update rack --gem-manager=ore
443
+ ```
444
+
445
+ ### When to Use Ore
446
+
447
+ Ore can be particularly beneficial when:
448
+
449
+ - You have many appraisals and want faster installation
450
+ - You're in a CI environment where installation speed matters
451
+ - You want to take advantage of ORE's parallel resolution capabilities
452
+
453
+ Note that ORE must be installed separately and available in your PATH.
454
+ If you specify ORE and it is not available, appraisal2 will raise an error.
455
+
187
456
  Under the hood
188
457
  --------------
189
458
 
@@ -264,7 +533,7 @@ end
264
533
 
265
534
  **Appraisal2.root.gemfile**
266
535
  ```ruby
267
- source "https://rubygems.org"
536
+ source "https://gem.coop"
268
537
 
269
538
  # Appraisal2 Root Gemfile is for running appraisal to generate the Appraisal2 Gemfiles
270
539
  # We do not load the standard Gemfile, as it is tailored for local development,
@@ -421,6 +690,8 @@ See [CONTRIBUTING.md][🤝contributing].
421
690
 
422
691
  [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
423
692
 
693
+ [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov]
694
+
424
695
  ### 🪇 Code of Conduct
425
696
 
426
697
  Everyone interacting with this project's codebases, issue trackers,
@@ -493,7 +764,7 @@ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright
493
764
  <a href="https://discord.gg/3qme4XHNKN">
494
765
  Galtzo.com
495
766
  <picture>
496
- <img src="https://github.com/galtzo-floss/shields-badge/raw/main/docs/images/logo/galtzo-floss-logos-wordless.svg?raw=true" alt="Galtzo.com Logo by Aboling0, CC BY-SA 4.0" width="24">
767
+ <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">
497
768
  </picture>
498
769
  </a>, and Appraisal2 contributors
499
770
  </li>
@@ -506,13 +777,13 @@ Having arrived at the bottom of the page, please endure a final supplication.
506
777
  The primary maintainer of this gem, Peter Boling, wants
507
778
  Ruby to be a great place for people to solve problems, big and small.
508
779
  Please consider supporting his efforts via the giant yellow link below,
509
- or one of smaller ones, depending on button size preference.
780
+ or one of the smaller ones, depending on button size preference.
510
781
 
511
782
  [![Buy me a latte][🖇buyme-img]][🖇buyme]
512
783
 
513
784
  [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![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]
514
785
 
515
- P.S. If you need help️, or want to say thanks, 👇 Join the Discord.
786
+ P.S. If you need help or want to say thanks, 👇 Join the Discord.
516
787
 
517
788
  [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
518
789
 
@@ -620,12 +891,25 @@ P.S. If you need help️, or want to say thanks, 👇 Join the Discord.
620
891
  [🚎4-r3.2-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-2.yml/badge.svg
621
892
  [🚎4-r3.3-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-3.yml
622
893
  [🚎4-r3.3-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-3.yml/badge.svg
894
+ [🚎4-r3.4-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-4.yml
895
+ [🚎4-r3.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-4.yml/badge.svg
623
896
  [🚎5-st-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/style.yml
624
897
  [🚎5-st-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/style.yml/badge.svg
625
898
  [🚎10-j9.4-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby-9-4.yml
626
899
  [🚎10-j9.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby-9-4.yml/badge.svg
627
900
  [🚎11-c-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current.yml
628
901
  [🚎11-c-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current.yml/badge.svg
902
+ [🚎12-crh-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current-runtime-heads.yml
903
+ [🚎12-crh-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current-runtime-heads.yml/badge.svg
904
+ [🚎13-🔒️-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/locked_deps.yml
905
+ [🚎13-🔒️-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/locked_deps.yml/badge.svg
906
+ [🚎14-🔓️-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/unlocked_deps.yml
907
+ [🚎14-🔓️-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/unlocked_deps.yml/badge.svg
908
+ [💎ruby-1.8i]: https://img.shields.io/badge/Ruby-1.8_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
909
+ [💎ruby-1.9i]: https://img.shields.io/badge/Ruby-1.9_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
910
+ [💎ruby-2.0i]: https://img.shields.io/badge/Ruby-2.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
911
+ [💎ruby-2.1i]: https://img.shields.io/badge/Ruby-2.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
912
+ [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
629
913
  [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
630
914
  [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
631
915
  [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
@@ -668,7 +952,7 @@ P.S. If you need help️, or want to say thanks, 👇 Join the Discord.
668
952
  [📌gitmoji]:https://gitmoji.dev
669
953
  [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20😜%20😍-34495e.svg?style=flat-square
670
954
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
671
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.186-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
955
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.782-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
672
956
  [🔐security]: SECURITY.md
673
957
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
674
958
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -697,4 +981,4 @@ Once fixed, these should look much nicer.
697
981
  [![CodeCov Test Coverage][🔑codecovi♻️]][🔑codecov]
698
982
  [![Coverage Graph][🔑codecov-g♻️]][🔑codecov]
699
983
 
700
- </details>
984
+ </details>