appraisal2 3.0.2 โ†’ 3.0.4

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: '00238b4f449b722f44616a03423e66d0ac258b612305696715a0b174536cb811'
4
- data.tar.gz: 3b3ae4af7322b1af5cec9b2785570fc080bbd5f3a183b86130a6ce1f675a5f26
3
+ metadata.gz: 657fa1768676719d9a8441f09b221912257be8dccf42b3a118ec73ef6f875a58
4
+ data.tar.gz: 856abbb177d9eb34a844d7c73bc57e34a82724df7f2ff402637d2be9bd3600b1
5
5
  SHA512:
6
- metadata.gz: 117cf9b62c2493baa3f0f03f199a4730e21be9c441e07289e80749d3a229b3b7bba541f5691e21049a38c239e7be4ff8596f92aba65584893ed3281ae99e7175
7
- data.tar.gz: ea442654a6fef207430453eab13d29bf725cfd0befa694e984c2272f4c70ae84e11644beaaa0c919a5cdd6506f6aeefe7db95994a16bea74dc0288d6bb8724a0
6
+ metadata.gz: 221e7aa5366ab1fdce598217adf2d5f4ff3e71f3c600fce0f35c632ae2974bd81b6b9d7a726ddc64b0e5d787d72a879e9e40248d444f88fd3aa45b1fd96f85db
7
+ data.tar.gz: c39aa79557bb57fc08769f3b0fd67967ba3c173e68d8783e61554ee2203da5c88174c9f7c39020ab850bafa23986980019d9c1fb437d4f202038628e70a0ef41
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -19,6 +19,56 @@ Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
19
19
 
20
20
  ### Security
21
21
 
22
+ ## [3.0.4] - 2026-02-10
23
+
24
+ - TAG: [v3.0.4][3.0.4t]
25
+ - COVERAGE: 89.67% -- 703/784 lines in 27 files
26
+ - BRANCH COVERAGE: 83.45% -- 121/145 branches in 27 files
27
+ - 43.03% documented
28
+
29
+ ### Changed
30
+
31
+ - Documentation cleanup
32
+ - Fixed typos in docs
33
+
34
+ ## [3.0.3] - 2026-02-07
35
+
36
+ - TAG: [v3.0.3][3.0.3t]
37
+ - COVERAGE: 89.67% -- 703/784 lines in 27 files
38
+ - BRANCH COVERAGE: 83.45% -- 121/145 branches in 27 files
39
+ - 43.03% documented
40
+
41
+ ### Added
42
+
43
+ - New CLI specs for testing named appraisal commands with options
44
+ - Shared RSpec contexts for mocking gem managers (`BundlerAdapter` and `OreAdapter`) to facilitate faster unit testing
45
+
46
+ ### Changed
47
+
48
+ - Improved documentation for using `install` and `update` commands with named appraisals and options
49
+ - Added examples showing correct command order: `appraisal <NAME> install --gem-manager=ore`
50
+ - Enhanced "Using Ore with Appraisal2" section with named appraisal examples
51
+ - Refactored `OreAdapter` to use the `Appraisal::Command` abstraction, unifying command execution across gem managers
52
+ - Enhanced `Appraisal::Command` with a `:skip_bundle_exec` option to support standalone executables like `ore`. When this option is enabled, `Command` now also skips `Bundler.with_original_env` wrapping and `ensure_bundler_is_available` checks, avoiding unnecessary Bundler overhead.
53
+ - Significantly optimized unit tests in `cli_spec.rb` and `appraisal_spec.rb` by using gem manager mocks, reducing execution time from seconds to milliseconds
54
+
55
+ ### Fixed
56
+
57
+ - Removed `Dir.chdir` into `gemfiles/` directory before running `ore` commands.
58
+ - Improved robustness of acceptance tests in isolated environments, especially on Ruby HEAD.
59
+ - Updated `setup_gem_path_for_local_install` to correctly include `TMP_GEM_ROOT` and more reliably detect the parent project's `vendor/bundle` gem directory.
60
+ - Added a fallback to remote installation in `build_default_gemfile` if `bundle install --local` fails, preventing test failures when dependencies are missing from the local cache.
61
+ - Improved robustness against Bundler installation failures in CI, especially on Ruby HEAD.
62
+ - `Appraisal::Command` and acceptance tests now only attempt to install Bundler if no version is currently available, avoiding unnecessary and potentially failing version-specific installations.
63
+ - Removed aggressive Bundler version matching and "downgrading" logic that stripped prerelease suffixes.
64
+ - **BREAKING BUG FIX**: Fixed CLI to properly handle `install` and `update` commands when targeting a specific appraisal with options
65
+ - Previously `appraisal <NAME> install --gem-manager=ore` would incorrectly try to run the Unix `install` command
66
+ - Now correctly invokes the appraisal install/update methods with proper option parsing
67
+ - Fixes error: `/usr/bin/install: unrecognized option '--gem-manager=ore'`
68
+ - Fixed argument parsing in CLI where repeated values could be mis-parsed as gem names instead of option values (e.g., `appraisal <NAME> update ore -g ore`).
69
+ - Improved shell-escaping handling in `Appraisal::Command` and updated acceptance tests to match the more robust output
70
+ - Standardized on `clean_name` (underscores) for gemfile paths across the test suite for consistency
71
+
22
72
  ## [3.0.2] - 2026-02-06
23
73
 
24
74
  - TAG: [v3.0.2][3.0.2t]
@@ -105,7 +155,11 @@ Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
105
155
  - code coverage tracked with Coveralls, QLTY.sh, and the kettle-soup-cover gem
106
156
  - other minor fixes and improvements
107
157
 
108
- [Unreleased]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.2...HEAD
158
+ [Unreleased]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.4...HEAD
159
+ [3.0.4]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.3...v3.0.4
160
+ [3.0.4t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.0.4
161
+ [3.0.3]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.2...v3.0.3
162
+ [3.0.3t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.0.3
109
163
  [3.0.2]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.1...v3.0.2
110
164
  [3.0.2t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.0.2
111
165
  [3.0.1]: https://github.com/appraisal-rb/appraisal2/compare/v3.0.0...v3.0.1
data/LICENSE.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  The MIT License (MIT)
2
2
 
3
3
  Copyright (c) 2010 - 2013 Joe Ferris and thoughtbot, inc.
4
- Copyright (c) 2024 - 2025 Peter H. Boling (Galtzo.com)
4
+ Copyright (c) 2024 - 2026 Peter H. Boling (Galtzo.com)
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  - You, possibly
15
15
 
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]
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]
17
17
 
18
18
  ---
19
19
 
@@ -53,8 +53,8 @@ Appraisal2 adds:
53
53
 
54
54
  | Tokens to Remember | [![Gem name][โ›ณ๏ธname-img]][โ›ณ๏ธgem-name] [![Gem namespace][โ›ณ๏ธnamespace-img]][โ›ณ๏ธgem-namespace] |
55
55
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
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] |
57
- | Works with Truffle Ruby | [![Truffle Ruby 24.1 Compat][๐Ÿ’Žtruby-c-i]][๐ŸšŽ11-c-wf] |
56
+ | 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] |
57
+ | 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] |
58
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
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
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] |
@@ -158,21 +158,21 @@ to commit the \[main\] `Gemfile.lock` for **both** apps **and** gems. It does th
158
158
 
159
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
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-๐Ÿ—ฃ๏ธ] | โŒ |
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โš™๏ธ] | [![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๏ธ] |
167
167
 
168
168
  [1-gh]: https://github.com/omniauth/omniauth-identity
169
169
  [1-๐Ÿงฐ]: https://www.ruby-toolbox.com/projects/omniauth-identity
170
170
  [1-โญ๏ธi]: https://img.shields.io/github/stars/omniauth/omniauth-identity
171
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
172
+ [1-๐Ÿ”’๏ธ]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/locked_deps.yml
173
+ [1-๐Ÿ”’๏ธi]: https://github.com/omniauth/omniauth-identity/actions/workflows/locked_deps.yml/badge.svg
174
+ [1-un๐Ÿ”’๏ธ]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/unlocked_deps.yml
175
+ [1-un๐Ÿ”’๏ธi]: https://github.com/omniauth/omniauth-identity/actions/workflows/unlocked_deps.yml/badge.svg
176
176
  [1-asโš™๏ธ]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/style.yml
177
177
  [1-asโš™๏ธi]: https://github.com/omniauth/omniauth-identity/actions/workflows/style.yml/badge.svg
178
178
  [1-acโš™๏ธ]: https://github.com/omniauth/omniauth-identity/blob/main/.github/workflows/coverage.yml
@@ -244,10 +244,10 @@ Having so many different use cases means it can be helpful to others to see how
244
244
  [3-๐Ÿงฐ]: https://www.ruby-toolbox.com/projects/silent_stream
245
245
  [3-โญ๏ธi]: https://img.shields.io/github/stars/pboling/silent_stream
246
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
247
+ [3-๐Ÿ”’๏ธ]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/locked_deps.yml
248
+ [3-๐Ÿ”’๏ธi]: https://github.com/pboling/silent_stream/actions/workflows/locked_deps.yml/badge.svg
249
+ [3-un๐Ÿ”’๏ธ]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/unlocked_deps.yml
250
+ [3-un๐Ÿ”’๏ธi]: https://github.com/pboling/silent_stream/actions/workflows/unlocked_deps.yml/badge.svg
251
251
  [3-asโš™๏ธ]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/style.yml
252
252
  [3-asโš™๏ธi]: https://github.com/pboling/silent_stream/actions/workflows/style.yml/badge.svg
253
253
  [3-acโš™๏ธ]: https://github.com/pboling/silent_stream/blob/master/.github/workflows/coverage.yml
@@ -273,34 +273,20 @@ Having so many different use cases means it can be helpful to others to see how
273
273
  [4-๐Ÿงฐ]: https://www.ruby-toolbox.com/projects/oauth2
274
274
  [4-โญ๏ธi]: https://img.shields.io/github/stars/ruby-oauth/oauth2
275
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
276
+ [4-๐Ÿ”’๏ธ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/locked_deps.yml
277
+ [4-๐Ÿ”’๏ธi]: https://github.com/ruby-oauth/oauth2/actions/workflows/locked_deps.yml/badge.svg
278
+ [4-un๐Ÿ”’๏ธ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/unlocked_deps.yml
279
+ [4-un๐Ÿ”’๏ธi]: https://github.com/ruby-oauth/oauth2/actions/workflows/unlocked_deps.yml/badge.svg
280
280
  [4-asโš™๏ธ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/style.yml
281
281
  [4-asโš™๏ธi]: https://github.com/ruby-oauth/oauth2/actions/workflows/style.yml/badge.svg
282
282
  [4-acโš™๏ธ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/coverage.yml
283
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
284
  [4-โฐ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/current.yml
299
285
  [4-โฐi]: https://github.com/ruby-oauth/oauth2/actions/workflows/current.yml/badge.svg
300
286
  [4-j]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby.yml
301
287
  [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
288
+ [4-๐Ÿ‘Ÿ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/dep-heads.yml
289
+ [4-๐Ÿ‘Ÿi]: https://github.com/ruby-oauth/oauth2/actions/workflows/dep-heads.yml/badge.svg
304
290
  [4-๐Ÿ‘ด]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/supported.yml
305
291
  [4-๐Ÿ‘ดi]: https://github.com/ruby-oauth/oauth2/actions/workflows/supported.yml/badge.svg
306
292
  [4-u๐Ÿ‘ด]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/unsupported.yml
@@ -309,10 +295,12 @@ Having so many different use cases means it can be helpful to others to see how
309
295
  [4-l๐Ÿ‘ดi]: https://github.com/ruby-oauth/oauth2/actions/workflows/legacy.yml/badge.svg
310
296
  [4-a๐Ÿ‘ด]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ancient.yml
311
297
  [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
298
  [4-๐Ÿ—ฃ๏ธ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/heads.yml
315
299
  [4-๐Ÿ—ฃ๏ธi]: https://github.com/ruby-oauth/oauth2/actions/workflows/heads.yml/badge.svg
300
+ [5-win๏ธ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/windows.yml
301
+ [5-win๏ธi]: https://github.com/ruby-oauth/oauth2/actions/workflows/windows.yml/badge.svg
302
+ [5-mac๏ธ]: https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/macos.yml
303
+ [5-mac๏ธi]: https://github.com/ruby-oauth/oauth2/actions/workflows/macos.yml/badge.svg
316
304
 
317
305
  ## โš’๏ธ Basic Usage
318
306
 
@@ -366,7 +354,10 @@ appraisal version # Display the version and exit
366
354
 
367
355
  ### Command Options
368
356
 
369
- The `install` and `update` commands support several options:
357
+ The `install` and `update` **built-in commands** support several options:
358
+
359
+ **Important:** These options apply **only** to Appraisal's `install` and `update` commands.
360
+ They do **not** apply when running external commands like `bundle install` or `bundle update`.
370
361
 
371
362
  | Option | Description |
372
363
  |--------|-------------|
@@ -377,6 +368,63 @@ The `install` and `update` commands support several options:
377
368
  | `--full-index` | Run bundle install with the full-index argument |
378
369
  | `--path` | Install gems in the specified directory |
379
370
 
371
+ ### Using Commands with Named Appraisals
372
+
373
+ #### Using Appraisal's built-in commands with named appraisals
374
+
375
+ When using Appraisal's `install` or `update` commands with a specific appraisal name,
376
+ place the appraisal name first, then the command, then any options:
377
+
378
+ ```bash
379
+ # โœ… Correct order: appraisal <NAME> <COMMAND> [OPTIONS]
380
+ bundle exec appraisal rails-7 install --gem-manager=ore
381
+ bundle exec appraisal rails-7 update rails --gem-manager=ore
382
+ bundle exec appraisal rails-7 install --jobs=4
383
+
384
+ # โŒ Wrong order (won't work)
385
+ bundle exec appraisal install rails-7 --gem-manager=ore # Wrong order
386
+ ```
387
+
388
+ More examples with Appraisal's built-in commands:
389
+
390
+ ```bash
391
+ # Install dependencies for a specific appraisal
392
+ bundle exec appraisal rails-7 install
393
+
394
+ # Install with options
395
+ bundle exec appraisal rails-7 install --gem-manager=ore --jobs=4
396
+
397
+ # Update all gems in a specific appraisal
398
+ bundle exec appraisal rails-7 update
399
+
400
+ # Update specific gems in a specific appraisal
401
+ bundle exec appraisal rails-7 update rails rack
402
+ bundle exec appraisal rails-7 update rails rack --gem-manager=ore
403
+ ```
404
+
405
+ #### Running external commands with named appraisals
406
+
407
+ For running external commands (like `rake test`, `rspec`, etc.) with a specific appraisal,
408
+ the structure is the same: appraisal name first, then the command:
409
+
410
+ ```bash
411
+ # Run any external command with a specific appraisal's dependencies
412
+ bundle exec appraisal <APPRAISAL_NAME> <COMMAND>
413
+
414
+ # Examples:
415
+ bundle exec appraisal rails-7 rake test
416
+ bundle exec appraisal rails-7 rspec
417
+ bundle exec appraisal rails-7 rubocop
418
+
419
+ # Note: External commands do NOT support appraisal options like --gem-manager
420
+ # This doesn't work and will fail:
421
+ bundle exec appraisal rails-7 bundle install --gem-manager=ore # โŒ Wrong
422
+ ```
423
+
424
+ **Key difference:**
425
+ - `bundle exec appraisal rails-7 install --gem-manager=ore` โœ… โ†’ Uses **Appraisal's** install command with ORE
426
+ - `bundle exec appraisal rails-7 bundle install --gem-manager=ore` โŒ โ†’ Tries to run external **bundle** command (which doesn't recognize `--gem-manager`)
427
+
380
428
  ## ๐Ÿฆ€ Using Ore (Alternative Gem Manager)
381
429
 
382
430
  Appraisal2 supports [ORE](https://github.com/contriboss/ore-light) as an alternative to Bundler
@@ -398,22 +446,50 @@ curl -fsSL https://raw.githubusercontent.com/contriboss/ore-light/master/scripts
398
446
 
399
447
  ### Using Ore with Appraisal2
400
448
 
401
- To use ORE instead of bundler, pass the `--gem-manager=ore` option:
449
+ The `--gem-manager=ore` option works **only** with Appraisal's built-in `install` and `update` commands.
450
+ It does **NOT** work with external commands like `bundle install`.
451
+
452
+ #### โœ… Using --gem-manager with Appraisal's install/update commands
453
+
454
+ To use ORE instead of bundler for dependency installation, pass the `--gem-manager=ore` option:
402
455
 
403
456
  ```bash
404
- # Install dependencies using ORE
457
+ # Install dependencies for ALL appraisals using ORE
405
458
  bundle exec appraisal install --gem-manager=ore
406
459
 
407
- # Update dependencies using ORE
460
+ # Update dependencies for ALL appraisals using ORE
408
461
  bundle exec appraisal update --gem-manager=ore
462
+
463
+ # Install dependencies for a SPECIFIC appraisal using ORE
464
+ bundle exec appraisal <APPRAISAL_NAME> install --gem-manager=ore
465
+
466
+ # Update dependencies for a SPECIFIC appraisal using ORE
467
+ bundle exec appraisal <APPRAISAL_NAME> update <GEMS> --gem-manager=ore
409
468
  ```
410
469
 
411
470
  You can also use the short form:
412
471
 
413
472
  ```bash
414
473
  bundle exec appraisal install -g ore
474
+ bundle exec appraisal <APPRAISAL_NAME> install -g ore
475
+ ```
476
+
477
+ #### โŒ Do NOT use --gem-manager with external commands
478
+
479
+ The `--gem-manager` option **cannot** be used when running external commands like `bundle install`:
480
+
481
+ ```bash
482
+ # โŒ WRONG - Don't try to pass --gem-manager to external commands
483
+ bundle exec appraisal coverage bundle install --gem-manager=ore
484
+
485
+ # โœ… RIGHT - Use appraisal's install command instead
486
+ bundle exec appraisal coverage install --gem-manager=ore
415
487
  ```
416
488
 
489
+ The difference:
490
+ - `bundle exec appraisal coverage install --gem-manager=ore` โ†’ Uses Appraisal's install command with ORE
491
+ - `bundle exec appraisal coverage bundle install --gem-manager=ore` โ†’ Tries to run external `bundle install` (which doesn't recognize `--gem-manager`)
492
+
417
493
  ### Ore-Specific Options
418
494
 
419
495
  When using ORE, some options are translated to ORE's equivalents:
@@ -432,16 +508,29 @@ When using ORE, some options are translated to ORE's equivalents:
432
508
  # Generate appraisal gemfiles
433
509
  bundle exec appraisal generate
434
510
 
435
- # Install dependencies using ORE (faster than bundler)
511
+ # Install dependencies for ALL appraisals using ORE (faster than bundler)
436
512
  bundle exec appraisal install --gem-manager=ore --jobs=4
437
513
 
438
- # Run tests against all appraisals
514
+ # Install dependencies for a SPECIFIC appraisal using ORE
515
+ bundle exec appraisal rails-7 install --gem-manager=ore --jobs=4
516
+
517
+ # Run tests against all appraisals (uses dependencies from appraisal gemfiles)
439
518
  bundle exec appraisal rspec
440
519
 
441
- # Update a specific gem using ORE
520
+ # Run tests against a specific appraisal (uses that appraisal's dependencies)
521
+ bundle exec appraisal rails-7 rspec
522
+
523
+ # Update a specific gem in ALL appraisals using ORE
442
524
  bundle exec appraisal update rack --gem-manager=ore
525
+
526
+ # Update a specific gem in ONE appraisal using ORE
527
+ bundle exec appraisal rails-7 update rack --gem-manager=ore
443
528
  ```
444
529
 
530
+ **Note:** When running tests or other external commands, the dependencies are already
531
+ installed from the appraisal's gemfile. You don't need to (and can't) pass `--gem-manager`
532
+ to external commandsโ€”it only works with Appraisal's built-in `install` and `update` commands.
533
+
445
534
  ### When to Use Ore
446
535
 
447
536
  Ore can be particularly beneficial when:
@@ -453,6 +542,40 @@ Ore can be particularly beneficial when:
453
542
  Note that ORE must be installed separately and available in your PATH.
454
543
  If you specify ORE and it is not available, appraisal2 will raise an error.
455
544
 
545
+ ### Troubleshooting ORE/Gem Manager Issues
546
+
547
+ #### Error: "Unknown switches --gem-manager=ore"
548
+
549
+ If you see an error like:
550
+ ```
551
+ Unknown switches("--gem-manager=ore")
552
+ ```
553
+
554
+ This usually means you're trying to pass `--gem-manager` to an external command instead of
555
+ Appraisal's built-in command.
556
+
557
+ โŒ **Wrong:**
558
+ ```bash
559
+ bundle exec appraisal coverage bundle install --gem-manager=ore
560
+ # Error: "Unknown switches --gem-manager=ore"
561
+ # The --gem-manager flag is being passed to the external 'bundle install' command,
562
+ # which doesn't recognize it.
563
+ ```
564
+
565
+ โœ… **Correct:**
566
+ ```bash
567
+ bundle exec appraisal coverage install --gem-manager=ore
568
+ # Correct: Uses Appraisal's install command with ORE gem manager
569
+ ```
570
+
571
+ **Key point:** The `--gem-manager` option **only works** with Appraisal's built-in
572
+ `install` and `update` commands. It cannot be used with external commands like
573
+ `bundle install`, `bundle update`, or `bundle exec rake/rspec`.
574
+
575
+ If you need to install dependencies using ORE:
576
+ 1. Run `bundle exec appraisal <NAME> install --gem-manager=ore`
577
+ 2. Then run your tests: `bundle exec appraisal <NAME> rspec`
578
+
456
579
  Under the hood
457
580
  --------------
458
581
 
@@ -668,6 +791,63 @@ test:
668
791
  Notice that we are running an rspec suite. You can customize your testing
669
792
  command in the `override` section and use your favourite one.
670
793
 
794
+ ## ๐Ÿฆท FLOSS Funding
795
+
796
+ While appraisal-rb tools are free (libre) software, the project would benefit immensely from some funding.
797
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
798
+
799
+ We welcome both individual and corporate sponsors\! We also offer a
800
+ wide array of funding channels to account for your preferences
801
+ (although currently [Open Collective][๐Ÿ–‡osc] is our preferred funding platform).
802
+
803
+ **If you're working in a company that's making significant use of appraisal-rb tools we'd
804
+ appreciate it if you suggest to your company to become a appraisal-rb sponsor.**
805
+
806
+ You can support the development of appraisal-rb tools via
807
+ [GitHub Sponsors][๐Ÿ–‡sponsor],
808
+ [Liberapay][โ›ณliberapay],
809
+ [PayPal][๐Ÿ–‡paypal],
810
+ [Open Collective][๐Ÿ–‡osc]
811
+ and [Tidelift][๐Ÿ™๏ธentsup-tidelift].
812
+
813
+ | ๐Ÿ“ NOTE |
814
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
815
+ | 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. |
816
+
817
+ ### Open Collective for Individuals
818
+
819
+ Support us with a monthly donation and help us continue our activities. \[[Become a backer][๐Ÿ–‡osc-backers]\]
820
+
821
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
822
+
823
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
824
+ No backers yet. Be the first!
825
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
826
+
827
+ ### Open Collective for Organizations
828
+
829
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor][๐Ÿ–‡osc-sponsors]\]
830
+
831
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
832
+
833
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
834
+ No sponsors yet. Be the first!
835
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
836
+
837
+ [kettle-readme-backers]: https://github.com/appraisal-rb/appraisal2/blob/main/exe/kettle-readme-backers
838
+
839
+ ### Another way to support open-source
840
+
841
+ Iโ€™m driven by a passion to foster a thriving open-source community โ€“ a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. Iโ€™m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 ๐Ÿ” chickens, 2 ๐Ÿถ dogs, 3 ๐Ÿฐ rabbits, 8 ๐Ÿˆโ€ cats).
842
+
843
+ 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`.
844
+
845
+ 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.
846
+
847
+ **[Floss-Funding.dev][๐Ÿ–‡floss-funding.dev]: ๐Ÿ‘‰๏ธ No network calls. ๐Ÿ‘‰๏ธ No tracking. ๐Ÿ‘‰๏ธ No oversight. ๐Ÿ‘‰๏ธ Minimal crypto hashing. ๐Ÿ’ก Easily disabled nags**
848
+
849
+ [![OpenCollective Backers][๐Ÿ–‡osc-backers-i]][๐Ÿ–‡osc-backers] [![OpenCollective Sponsors][๐Ÿ–‡osc-sponsors-i]][๐Ÿ–‡osc-sponsors] [![Sponsor Me on Github][๐Ÿ–‡sponsor-img]][๐Ÿ–‡sponsor] [![Liberapay Goal Progress][โ›ณliberapay-img]][โ›ณliberapay] [![Donate on PayPal][๐Ÿ–‡paypal-img]][๐Ÿ–‡paypal] [![Buy me a coffee][๐Ÿ–‡buyme-small-img]][๐Ÿ–‡buyme] [![Donate on Polar][๐Ÿ–‡polar-img]][๐Ÿ–‡polar] [![Donate to my FLOSS efforts at ko-fi.com][๐Ÿ–‡kofi-img]][๐Ÿ–‡kofi] [![Donate to my FLOSS efforts using Patreon][๐Ÿ–‡patreon-img]][๐Ÿ–‡patreon]
850
+
671
851
  ## ๐Ÿ” Security
672
852
 
673
853
  See [SECURITY.md][๐Ÿ”security].
@@ -688,6 +868,8 @@ See [CONTRIBUTING.md][๐Ÿคcontributing].
688
868
 
689
869
  ### Code Coverage
690
870
 
871
+ [![Coverage Graph][๐Ÿ”‘codecov-gโ™ป๏ธ]][๐Ÿ”‘codecov]
872
+
691
873
  [![Coveralls Test Coverage][๐Ÿ”‘coveralls-img]][๐Ÿ”‘coveralls]
692
874
 
693
875
  [![QLTY Test Coverage][๐Ÿ”‘qlty-covi]][๐Ÿ”‘qlty-cov]
@@ -703,7 +885,10 @@ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][
703
885
 
704
886
  Made with [contributors-img][๐Ÿ–contrib-rocks].
705
887
 
706
- ## โญ๏ธ Star History
888
+ Also see GitLab Contributors: <https://gitlab.com/appraisal-rb/appraisal2/-/graphs/main>
889
+
890
+ <details>
891
+ <summary>โญ๏ธ Star History</summary>
707
892
 
708
893
  <a href="https://star-history.com/#appraisal-rb/appraisal2&Date">
709
894
  <picture>
@@ -713,6 +898,8 @@ Made with [contributors-img][๐Ÿ–contrib-rocks].
713
898
  </picture>
714
899
  </a>
715
900
 
901
+ </details>
902
+
716
903
  ## ๐Ÿ“Œ Versioning
717
904
 
718
905
  This Library adheres to [![Semantic Versioning 2.0.0][๐Ÿ“Œsemver-img]][๐Ÿ“Œsemver].
@@ -721,32 +908,32 @@ Specifically, if a minor or patch version is released that breaks backward compa
721
908
  a new version should be immediately released that restores compatibility.
722
909
  Breaking changes to the public API will only be introduced with new major versions.
723
910
 
724
- ### ๐Ÿ“Œ Is "Platform Support" part of the public API?
911
+ > dropping support for a platform is both obviously and objectively a breaking change <br/>
912
+ > โ€”Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][๐Ÿ“Œsemver-breaking]
913
+
914
+ I understand that policy doesn't work universally ("exceptions to every rule\!"),
915
+ but it is the policy here.
916
+ As such, in many cases it is good to specify a dependency on this library using
917
+ the [Pessimistic Version Constraint][๐Ÿ“Œpvc] with two digits of precision.
725
918
 
726
- Yes. But I'm obligated to include notes...
919
+ For example:
727
920
 
728
- SemVer should, but doesn't explicitly, say that dropping support for specific Platforms
729
- is a *breaking change* to an API.
730
- It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
921
+ ```ruby
922
+ spec.add_dependency("appraisal2", "~> 3.0")
923
+ ```
731
924
 
732
- > dropping support for a platform is both obviously and objectively a breaking change
925
+ <details markdown="1">
926
+ <summary>๐Ÿ“Œ Is "Platform Support" part of the public API? More details inside.</summary>
733
927
 
734
- - Jordan Harband (@ljharb, maintainer of SemVer) [in SemVer issue 716][๐Ÿ“Œsemver-breaking]
928
+ SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
929
+ is a *breaking change* to an API, and for that reason the bike shedding is endless.
735
930
 
736
931
  To get a better understanding of how SemVer is intended to work over a project's lifetime,
737
932
  read this article from the creator of SemVer:
738
933
 
739
934
  - ["Major Version Numbers are Not Sacred"][๐Ÿ“Œmajor-versions-not-sacred]
740
935
 
741
- As a result of this policy, and the interpretive lens used by the maintainer,
742
- you can (and should) specify a dependency on these libraries using
743
- the [Pessimistic Version Constraint][๐Ÿ“Œpvc] with two digits of precision.
744
-
745
- For example:
746
-
747
- ```ruby
748
- spec.add_dependency("appraisal2", "~> 3.0")
749
- ```
936
+ </details>
750
937
 
751
938
  See [CHANGELOG.md][๐Ÿ“Œchangelog] for a list of releases.
752
939
 
@@ -760,7 +947,7 @@ See [LICENSE.txt][๐Ÿ“„license] for the official [Copyright Notice][๐Ÿ“„copyright
760
947
 
761
948
  <ul>
762
949
  <li>
763
- Copyright (c) 2024-2025 Peter H.ย Boling, of
950
+ Copyright (c) 2024 - 2026 Peter H.ย Boling, of
764
951
  <a href="https://discord.gg/3qme4XHNKN">
765
952
  Galtzo.com
766
953
  <picture>
@@ -768,41 +955,65 @@ See [LICENSE.txt][๐Ÿ“„license] for the official [Copyright Notice][๐Ÿ“„copyright
768
955
  </picture>
769
956
  </a>, and Appraisal2 contributors
770
957
  </li>
771
- <li>Copyright (c) 2010-2013 Joe Ferris and thoughtbot, inc.</li>
958
+ <li>Copyright (c) 2010 - 2013 Joe Ferris and thoughtbot, inc.</li>
772
959
  </ul>
773
960
 
774
- ## ๐Ÿค‘ One more thing
961
+ ## ๐Ÿค‘ A request for help
962
+
963
+ Maintainers have teeth and need to pay their dentists.
964
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
965
+ I began spending most of my time building open source tools.
966
+ I'm hoping to be able to pay for my kids' health insurance this month,
967
+ so if you value the work I am doing, I need your support.
968
+ Please consider sponsoring me or the project.
775
969
 
776
- Having arrived at the bottom of the page, please endure a final supplication.
777
- The primary maintainer of this gem, Peter Boling, wants
778
- Ruby to be a great place for people to solve problems, big and small.
779
- Please consider supporting his efforts via the giant yellow link below,
780
- or one of the smaller ones, depending on button size preference.
970
+ To join the community or get help ๐Ÿ‘‡๏ธ Join the Discord.
781
971
 
782
- [![Buy me a latte][๐Ÿ–‡buyme-img]][๐Ÿ–‡buyme]
972
+ [![Live Chat on Discord][โœ‰๏ธdiscord-invite-img-ftb]][๐Ÿ–ผ๏ธgaltzo-discord]
783
973
 
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]
974
+ To say "thanks!" โ˜๏ธ Join the Discord or ๐Ÿ‘‡๏ธ send money.
785
975
 
786
- P.S. If you need help๏ธ or want to say thanks, ๐Ÿ‘‡ Join the Discord.
976
+ [![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]
787
977
 
788
- [![Live Chat on Discord][โœ‰๏ธdiscord-invite-img]][โœ‰๏ธdiscord-invite]
978
+ ### Please give the project a star โญ โ™ฅ.
789
979
 
790
- [โ›ณliberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay
980
+ Thanks for RTFM. โ˜บ๏ธ
981
+
982
+ [โ›ณliberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
983
+ [โ›ณliberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
791
984
  [โ›ณliberapay]: https://liberapay.com/pboling/donate
985
+ [๐Ÿ–‡osc-all-img]: https://img.shields.io/opencollective/all/appraisal-rb
986
+ [๐Ÿ–‡osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/appraisal-rb
987
+ [๐Ÿ–‡osc-backers-img]: https://img.shields.io/opencollective/backers/appraisal-rb
988
+ [๐Ÿ–‡osc-backers]: https://opencollective.com/appraisal-rb#backer
989
+ [๐Ÿ–‡osc-backers-i]: https://opencollective.com/appraisal-rb/backers/badge.svg?style=flat
990
+ [๐Ÿ–‡osc-sponsors]: https://opencollective.com/appraisal-rb#sponsor
991
+ [๐Ÿ–‡osc-sponsors-i]: https://opencollective.com/appraisal-rb/sponsors/badge.svg?style=flat
992
+ [๐Ÿ–‡osc-all-bottom-img]: https://img.shields.io/opencollective/all/appraisal-rb?style=for-the-badge
993
+ [๐Ÿ–‡osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/appraisal-rb?style=for-the-badge
994
+ [๐Ÿ–‡osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/appraisal-rb?style=for-the-badge
995
+ [๐Ÿ–‡osc]: https://opencollective.com/appraisal-rb
792
996
  [๐Ÿ–‡sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
997
+ [๐Ÿ–‡sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
793
998
  [๐Ÿ–‡sponsor]: https://github.com/sponsors/pboling
794
- [๐Ÿ–‡polar-img]: https://img.shields.io/badge/polar-donate-yellow.svg
999
+ [๐Ÿ–‡polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
795
1000
  [๐Ÿ–‡polar]: https://polar.sh/pboling
796
- [๐Ÿ–‡kofi-img]: https://img.shields.io/badge/a_more_different_coffee-โœ“-yellow.svg
1001
+ [๐Ÿ–‡kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
797
1002
  [๐Ÿ–‡kofi]: https://ko-fi.com/O5O86SNP4
798
- [๐Ÿ–‡patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg
1003
+ [๐Ÿ–‡patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
799
1004
  [๐Ÿ–‡patreon]: https://patreon.com/galtzo
800
- [๐Ÿ–‡buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-โœ“-yellow.svg?style=flat
1005
+ [๐Ÿ–‡buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
801
1006
  [๐Ÿ–‡buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
802
1007
  [๐Ÿ–‡buyme]: https://www.buymeacoffee.com/pboling
1008
+ [๐Ÿ–‡paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
1009
+ [๐Ÿ–‡paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
1010
+ [๐Ÿ–‡paypal]: https://www.paypal.com/paypalme/peterboling
1011
+ [๐Ÿ–‡floss-funding.dev]: https://floss-funding.dev
1012
+ [๐Ÿ–‡floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
803
1013
  [โœ‰๏ธdiscord-invite]: https://discord.gg/3qme4XHNKN
804
- [โœ‰๏ธdiscord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
805
-
1014
+ [โœ‰๏ธdiscord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
1015
+ [โœ‰๏ธ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
1016
+ [โœ‰๏ธruby-friends]: https://app.daily.dev/squads/rubyfriends
806
1017
  [โœ‡bundle-group-pattern]: https://gist.github.com/pboling/4564780
807
1018
  [โ›ณ๏ธgem-namespace]: https://github.com/appraisal-rb/appraisal2
808
1019
  [โ›ณ๏ธnamespace-img]: https://img.shields.io/badge/namespace-Appraisal-brightgreen.svg?style=flat&logo=ruby&logoColor=white
@@ -865,8 +1076,6 @@ P.S. If you need help๏ธ or want to say thanks, ๐Ÿ‘‡ Join the Discord.
865
1076
  [๐Ÿ”‘codecoviโ™ป๏ธ]: https://codecov.io/gh/appraisal-rb/appraisal2/branch/main/graph/badge.svg?token=0X5VEW9USD
866
1077
  [๐Ÿ”‘coveralls]: https://coveralls.io/github/appraisal-rb/appraisal2?branch=main
867
1078
  [๐Ÿ”‘coveralls-img]: https://coveralls.io/repos/github/appraisal-rb/appraisal2/badge.svg?branch=main
868
- [๐Ÿ”‘depfu]: https://depfu.com/github/appraisal-rb/appraisal2?project_id=67033
869
- [๐Ÿ”‘depfuiโ™ป๏ธ]: https://badges.depfu.com/badges/b5344eec8b60c9e72bd9145ff53cd07b/count.svg
870
1079
  [๐Ÿ–codeQL]: https://github.com/appraisal-rb/appraisal2/security/code-scanning
871
1080
  [๐Ÿ–codeQL-img]: https://github.com/appraisal-rb/appraisal2/actions/workflows/codeql-analysis.yml/badge.svg
872
1081
  [๐ŸšŽ1-r2.3-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-3.yml
@@ -883,6 +1092,16 @@ P.S. If you need help๏ธ or want to say thanks, ๐Ÿ‘‡ Join the Discord.
883
1092
  [๐ŸšŽ2-cov-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/coverage.yml/badge.svg
884
1093
  [๐ŸšŽ3-hd-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/heads.yml
885
1094
  [๐ŸšŽ3-hd-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/heads.yml/badge.svg
1095
+ [๐ŸšŽ4-r2.3-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-3.yml
1096
+ [๐ŸšŽ4-r2.3-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-3.yml/badge.svg
1097
+ [๐ŸšŽ4-r2.4-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-4.yml
1098
+ [๐ŸšŽ4-r2.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-4.yml/badge.svg
1099
+ [๐ŸšŽ4-r2.5-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-5.yml
1100
+ [๐ŸšŽ4-r2.5-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-5.yml/badge.svg
1101
+ [๐ŸšŽ4-r2.6-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-6.yml
1102
+ [๐ŸšŽ4-r2.6-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-6.yml/badge.svg
1103
+ [๐ŸšŽ4-r2.7-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-7.yml
1104
+ [๐ŸšŽ4-r2.7-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-2-7.yml/badge.svg
886
1105
  [๐ŸšŽ4-r3.0-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-0.yml
887
1106
  [๐ŸšŽ4-r3.0-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-0.yml/badge.svg
888
1107
  [๐ŸšŽ4-r3.1-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-1.yml
@@ -895,8 +1114,10 @@ P.S. If you need help๏ธ or want to say thanks, ๐Ÿ‘‡ Join the Discord.
895
1114
  [๐ŸšŽ4-r3.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/ruby-3-4.yml/badge.svg
896
1115
  [๐ŸšŽ5-st-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/style.yml
897
1116
  [๐ŸšŽ5-st-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/style.yml/badge.svg
898
- [๐ŸšŽ10-j9.4-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby-9-4.yml
899
- [๐ŸšŽ10-j9.4-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby-9-4.yml/badge.svg
1117
+ [๐ŸšŽ9-t-wf]: https://github.com/galtzo-floss/simple_column-scopes/actions/workflows/truffle.yml
1118
+ [๐ŸšŽ9-t-wfi]: https://github.com/galtzo-floss/simple_column-scopes/actions/workflows/truffle.yml/badge.svg
1119
+ [๐ŸšŽ10-j-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby.yml
1120
+ [๐ŸšŽ10-j-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/jruby.yml/badge.svg
900
1121
  [๐ŸšŽ11-c-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current.yml
901
1122
  [๐ŸšŽ11-c-wfi]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current.yml/badge.svg
902
1123
  [๐ŸšŽ12-crh-wf]: https://github.com/appraisal-rb/appraisal2/actions/workflows/current-runtime-heads.yml
@@ -919,8 +1140,13 @@ P.S. If you need help๏ธ or want to say thanks, ๐Ÿ‘‡ Join the Discord.
919
1140
  [๐Ÿ’Žruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
920
1141
  [๐Ÿ’Žruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
921
1142
  [๐Ÿ’Žruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
1143
+ [๐Ÿ’Žruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
922
1144
  [๐Ÿ’Žruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
923
1145
  [๐Ÿ’Žruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
1146
+ [๐Ÿ’Ž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
1147
+ [๐Ÿ’Ž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
1148
+ [๐Ÿ’Žtruby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
1149
+ [๐Ÿ’Žtruby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
924
1150
  [๐Ÿ’Žtruby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
925
1151
  [๐Ÿ’Žtruby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
926
1152
  [๐Ÿ’Žjruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
@@ -952,7 +1178,7 @@ P.S. If you need help๏ธ or want to say thanks, ๐Ÿ‘‡ Join the Discord.
952
1178
  [๐Ÿ“Œgitmoji]:https://gitmoji.dev
953
1179
  [๐Ÿ“Œgitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20๐Ÿ˜œ%20๐Ÿ˜-34495e.svg?style=flat-square
954
1180
  [๐Ÿงฎkloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
955
- [๐Ÿงฎkloc-img]: https://img.shields.io/badge/KLOC-0.782-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1181
+ [๐Ÿงฎkloc-img]: https://img.shields.io/badge/KLOC-0.784-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
956
1182
  [๐Ÿ”security]: SECURITY.md
957
1183
  [๐Ÿ”security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
958
1184
  [๐Ÿ“„copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -968,17 +1194,3 @@ P.S. If you need help๏ธ or want to say thanks, ๐Ÿ‘‡ Join the Discord.
968
1194
  [๐Ÿ’Žrlts]: https://github.com/rubocop-lts/rubocop-lts
969
1195
  [๐Ÿ’Žrlts-img]: https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
970
1196
  [๐Ÿ’Žd-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
971
-
972
- <details>
973
- <summary>
974
- Disabled Badges
975
- </summary>
976
-
977
- Badges for failing services.
978
- Bug reports filed.
979
- Once fixed, these should look much nicer.
980
-
981
- [![CodeCov Test Coverage][๐Ÿ”‘codecoviโ™ป๏ธ]][๐Ÿ”‘codecov]
982
- [![Coverage Graph][๐Ÿ”‘codecov-gโ™ป๏ธ]][๐Ÿ”‘codecov]
983
-
984
- </details>
@@ -84,7 +84,9 @@ module Appraisal
84
84
  manager.install(options)
85
85
  end
86
86
 
87
- def update(gems = [], gem_manager: nil)
87
+ def update(gems = [], options = {})
88
+ gem_manager = options[:gem_manager] || options["gem_manager"] ||
89
+ options[:"gem-manager"] || options["gem-manager"]
88
90
  manager = GemManager::Factory.create(gemfile_path, project_root, :manager => gem_manager)
89
91
  manager.update(gems)
90
92
  end
data/lib/appraisal/cli.rb CHANGED
@@ -104,8 +104,9 @@ module Appraisal
104
104
  invoke(:generate, [], {})
105
105
 
106
106
  gem_manager = options["gem-manager"] || options[:gem_manager]
107
+ update_options = gem_manager ? {:gem_manager => gem_manager} : {}
107
108
  AppraisalFile.each do |appraisal|
108
- appraisal.update(gems, :gem_manager => gem_manager)
109
+ appraisal.update(gems, update_options)
109
110
  end
110
111
  end
111
112
 
@@ -127,7 +128,40 @@ module Appraisal
127
128
  end
128
129
 
129
130
  if matching_appraisal
130
- Command.new(args, :gemfile => matching_appraisal.gemfile_path).run
131
+ # If no arguments were passed to method_missing, check ARGV
132
+ # This handles cases where Thor doesn't pass arguments
133
+ actual_args = (args.empty? && ARGV.any?) ? ARGV.dup : args
134
+
135
+ # Check if the first argument is a Thor command (install or update)
136
+ if actual_args.first == "install"
137
+ # Extract Thor options from the remaining arguments
138
+ # Filter out the command name and pass options to install
139
+ filtered_args = actual_args[1..-1] || []
140
+ # Parse the options ourselves since Thor isn't parsing them here
141
+ parsed_options = parse_external_options(filtered_args)
142
+
143
+ # Also include the class-level gem_manager option if provided
144
+ # Thor consumes class_option before calling method_missing, so check both places
145
+ gem_manager = options["gem-manager"] || options[:gem_manager]
146
+ parsed_options[:gem_manager] = gem_manager if gem_manager && !parsed_options.key?(:gem_manager)
147
+
148
+ matching_appraisal.write_gemfile
149
+ matching_appraisal.install(parsed_options)
150
+ matching_appraisal.relativize
151
+ elsif actual_args.first == "update"
152
+ # Extract gems and options
153
+ filtered_args = actual_args[1..-1] || []
154
+ gems, parsed_options = extract_gems_and_options(filtered_args)
155
+
156
+ # Also include the class-level gem_manager option if provided
157
+ gem_manager = options["gem-manager"] || options[:gem_manager]
158
+ parsed_options[:gem_manager] = gem_manager if gem_manager && !parsed_options.key?(:gem_manager)
159
+
160
+ matching_appraisal.update(gems, parsed_options)
161
+ else
162
+ # Run as an external command
163
+ Command.new(actual_args, :gemfile => matching_appraisal.gemfile_path).run
164
+ end
131
165
  else
132
166
  AppraisalFile.each do |appraisal|
133
167
  Command.new(ARGV, :gemfile => appraisal.gemfile_path).run
@@ -135,6 +169,72 @@ module Appraisal
135
169
  end
136
170
  end
137
171
 
172
+ def parse_external_options(args)
173
+ options = {}
174
+ skip_next = false
175
+
176
+ args.each_with_index do |arg, index|
177
+ if skip_next
178
+ skip_next = false
179
+ next
180
+ end
181
+
182
+ case arg
183
+ when /^--gem-manager=(.+)$/
184
+ options[:gem_manager] = Regexp.last_match(1)
185
+ when /^-g$/
186
+ # Next arg should be the value
187
+ options[:gem_manager] = args[index + 1]
188
+ skip_next = true
189
+ when /^--jobs=(\d+)$/
190
+ options[:jobs] = Regexp.last_match(1).to_i
191
+ when /^-j(\d+)$/
192
+ options[:jobs] = Regexp.last_match(1).to_i
193
+ when /^--retry=(\d+)$/
194
+ options[:retry] = Regexp.last_match(1).to_i
195
+ when /^--without=(.+)$/
196
+ options[:without] = Regexp.last_match(1)
197
+ when /^--path=(.+)$/
198
+ options[:path] = Regexp.last_match(1)
199
+ when /^--full-index$/
200
+ options[:full_index] = true
201
+ end
202
+ end
203
+ options
204
+ end
205
+
206
+ def extract_gems_and_options(args)
207
+ gems = []
208
+ options = {}
209
+ skip_next = false
210
+
211
+ args.each_with_index do |arg, index|
212
+ if skip_next
213
+ skip_next = false
214
+ next
215
+ end
216
+
217
+ case arg
218
+ when /^--gem-manager=(.+)$/
219
+ options[:gem_manager] = Regexp.last_match(1)
220
+ when /^-g$/
221
+ # Next arg should be the value
222
+ options[:gem_manager] = args[index + 1]
223
+ skip_next = true
224
+ when /^-/
225
+ # Other options are not gems, but we don't handle them all here
226
+ # For now, just skip them to be safe if they start with -
227
+ # Actually, the original code only handled -g specifically.
228
+ # If we see another option we don't know, it's probably not a gem name.
229
+ # But Thor usually handles them. Here we are in method_missing.
230
+ else
231
+ gems << arg
232
+ end
233
+ end
234
+
235
+ [gems, options]
236
+ end
237
+
138
238
  def respond_to_missing?(name, include_private = false)
139
239
  appraisals = AppraisalFile.new.appraisals
140
240
  appraisals.any? { |appraisal| appraisal.name == name.to_s } || super
@@ -10,41 +10,50 @@ module Appraisal
10
10
  def initialize(command, options = {})
11
11
  @gemfile = options[:gemfile]
12
12
  @env = options.fetch(:env, {})
13
- @command = command_starting_with_bundle(command)
13
+ @skip_bundle_exec = options.fetch(:skip_bundle_exec, false)
14
+ @command = @skip_bundle_exec ? command : command_starting_with_bundle(command)
14
15
  end
15
16
 
16
17
  def run
17
18
  run_env = test_environment.merge(env)
18
19
 
19
- Bundler.with_original_env do
20
- ensure_bundler_is_available
21
- announce
22
-
23
- ENV["BUNDLE_GEMFILE"] = gemfile
24
- ENV["APPRAISAL_INITIALIZED"] = "1"
25
- run_env.each_pair do |key, value|
26
- ENV[key] = value
20
+ if @skip_bundle_exec
21
+ execute(run_env)
22
+ else
23
+ Bundler.with_original_env do
24
+ ensure_bundler_is_available
25
+ execute(run_env)
27
26
  end
28
-
29
- exit(1) unless Kernel.system(command_as_string)
30
27
  end
31
28
  end
32
29
 
33
30
  private
34
31
 
35
- def ensure_bundler_is_available
36
- version = Utils.bundler_version
37
- return if system(%(gem list --silent -i bundler -v #{version}))
32
+ def execute(run_env)
33
+ announce
38
34
 
39
- puts ">> Reinstall Bundler into #{ENV["GEM_HOME"]}"
35
+ ENV["BUNDLE_GEMFILE"] = gemfile
36
+ ENV["APPRAISAL_INITIALIZED"] = "1"
37
+ run_env.each_pair do |key, value|
38
+ ENV[key] = value
39
+ end
40
40
 
41
- return if system("gem install bundler --version #{version}")
41
+ exit(1) unless Kernel.system(command_as_string)
42
+ end
43
+
44
+ def ensure_bundler_is_available
45
+ # Check if any version of bundler is available
46
+ return if system(%(gem list --silent -i bundler))
47
+
48
+ puts ">> Bundler not found, attempting to install..."
49
+ # If that fails, try to install the latest stable version
50
+ return if system("gem install bundler")
42
51
 
43
52
  puts
44
53
  puts <<-ERROR.rstrip
45
54
  Bundler installation failed.
46
55
  Please try running:
47
- `GEM_HOME="#{ENV["GEM_HOME"]}" gem install bundler --version #{version}`
56
+ `gem install bundler`
48
57
  manually.
49
58
  ERROR
50
59
  exit(1)
@@ -69,8 +78,10 @@ manually.
69
78
  def command_starting_with_bundle(original_command)
70
79
  if command_starts_with_bundle?(original_command)
71
80
  original_command
72
- else
81
+ elsif original_command.is_a?(Array)
73
82
  %w[bundle exec] + original_command
83
+ else
84
+ "bundle exec #{original_command}"
74
85
  end
75
86
  end
76
87
 
@@ -84,20 +84,7 @@ module Appraisal
84
84
  end
85
85
 
86
86
  def run_ore_command(command)
87
- puts ">> BUNDLE_GEMFILE=#{gemfile_path} #{command.join(" ")}"
88
-
89
- # Ore resolves path dependencies relative to the current working directory,
90
- # not relative to the gemfile location. We need to cd to the gemfile's
91
- # directory so that relative paths like "../appraisal2" resolve correctly.
92
- gemfile_dir = File.dirname(gemfile_path)
93
-
94
- Bundler.with_original_env do
95
- ENV["BUNDLE_GEMFILE"] = gemfile_path
96
- ENV["APPRAISAL_INITIALIZED"] = "1"
97
- Dir.chdir(gemfile_dir) do
98
- exit(1) unless Kernel.system(*command)
99
- end
100
- end
87
+ Command.new(command, :gemfile => gemfile_path, :skip_bundle_exec => true).run
101
88
  end
102
89
  end
103
90
  end
@@ -64,7 +64,10 @@ module Appraisal
64
64
  end
65
65
 
66
66
  def bundler_version
67
- Gem::Specification.detect { |spec| spec.name == "bundler" }.version.to_s
67
+ spec = Gem::Specification.detect { |s| s.name == "bundler" }
68
+ return "2.4.22" unless spec # Fallback for very old systems
69
+
70
+ spec.version.to_s
68
71
  end
69
72
  end
70
73
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Appraisal
4
4
  module Version
5
- VERSION = "3.0.2"
5
+ VERSION = "3.0.4"
6
6
  end
7
7
  VERSION = Version::VERSION # Traditional constant location
8
8
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appraisal2
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
@@ -172,7 +172,7 @@ dependencies:
172
172
  version: '1.0'
173
173
  - - ">="
174
174
  - !ruby/object:Gem::Version
175
- version: 1.0.9
175
+ version: 1.0.10
176
176
  type: :development
177
177
  prerelease: false
178
178
  version_requirements: !ruby/object:Gem::Requirement
@@ -182,7 +182,7 @@ dependencies:
182
182
  version: '1.0'
183
183
  - - ">="
184
184
  - !ruby/object:Gem::Version
185
- version: 1.0.9
185
+ version: 1.0.10
186
186
  - !ruby/object:Gem::Dependency
187
187
  name: rspec
188
188
  requirement: !ruby/object:Gem::Requirement
@@ -240,7 +240,7 @@ dependencies:
240
240
  version: '0.1'
241
241
  - - ">="
242
242
  - !ruby/object:Gem::Version
243
- version: 0.1.19
243
+ version: 0.1.20
244
244
  type: :development
245
245
  prerelease: false
246
246
  version_requirements: !ruby/object:Gem::Requirement
@@ -250,7 +250,7 @@ dependencies:
250
250
  version: '0.1'
251
251
  - - ">="
252
252
  - !ruby/object:Gem::Version
253
- version: 0.1.19
253
+ version: 0.1.20
254
254
  - !ruby/object:Gem::Dependency
255
255
  name: rspec-stubbed_env
256
256
  requirement: !ruby/object:Gem::Requirement
@@ -400,10 +400,10 @@ licenses:
400
400
  - MIT
401
401
  metadata:
402
402
  homepage_uri: https://appraisal2.galtzo.com/
403
- source_code_uri: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.0.2
404
- changelog_uri: https://gitlab.com/appraisal-rb/appraisal2/-/blob/v3.0.2/CHANGELOG.md
403
+ source_code_uri: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.0.4
404
+ changelog_uri: https://gitlab.com/appraisal-rb/appraisal2/-/blob/v3.0.4/CHANGELOG.md
405
405
  bug_tracker_uri: https://gitlab.com/appraisal-rb/appraisal2/-/issues
406
- documentation_uri: https://www.rubydoc.info/gems/appraisal2/3.0.2
406
+ documentation_uri: https://www.rubydoc.info/gems/appraisal2/3.0.4
407
407
  wiki_uri: https://gitlab.com/appraisal-rb/appraisal2/-/wiki
408
408
  funding_uri: https://github.com/sponsors/pboling
409
409
  news_uri: https://www.railsbling.com/tags/appraisal2
metadata.gz.sig CHANGED
Binary file