appraisal2 3.1.4 → 3.2.1

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: bbe46d02bf329c467f1a1174498ac52b428836db70f3b481d9895ab72eae831f
4
- data.tar.gz: 478f076b882e497da7a709180c9a27bf70c9c90a0e34d3dad12a4281b49cd520
3
+ metadata.gz: fc5fd8b8ee5e56506c39047160e4a1e4abb4a23062b155a422f65edbc4f2a50e
4
+ data.tar.gz: 05aaff18c45cf9d18712c61c78fd75b28d56690194a41a9a3846991853e789e7
5
5
  SHA512:
6
- metadata.gz: bad0a5d468f7d046063b315d70f74f43e751c21a4b2316d599d6904f1e3f77b783f2bafd7d4cef9946fcb3e5757a359b1b6af431b9e99681042064d82d13d8c0
7
- data.tar.gz: 2ee5da066917eaf2862328952292e79b76483befd7fcad754945dec312fa988e77813dd93e2ad7812a27489239e95da13be1159f7e068468c0c699c560398550
6
+ metadata.gz: cb587e92052e1f539d372e5555abd4be2ae3033c2915df60e4eb02937d89504e28a8fb06574ccf90f23c030620f7bb7f570862b17d4e706c8b28b1f221fda73d
7
+ data.tar.gz: c0abff7c89b9c3eb14b6ea851de15151a72737dd005742568afd70f00fbcefbd76994e4ebbc7cd4a5f46e714e76b97e3b1eb0c4db22ee7ff43ca6c398e486ce5
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,149 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.2.1] - 2026-08-06
34
+
35
+ - TAG: [v3.2.1][3.2.1t]
36
+ - COVERAGE: 90.86% -- 915/1007 lines in 29 files
37
+ - BRANCH COVERAGE: 77.73% -- 185/238 branches in 29 files
38
+ - 43.78% documented
39
+
40
+ ### Added
41
+
42
+ - kettle-jem-template-20260720-005 - README Support & Community links now
43
+ include RubyForum.
44
+ - kettle-jem-template-20260726-001 - Projects now include YARD lint
45
+ configuration and documentation dependencies so documentation issues fail
46
+ before generated docs are refreshed.
47
+ - kettle-jem-template-20260727-001 - Spec harness documentation now lists the
48
+ RSpec helpers provided by `kettle-test`.
49
+ - kettle-jem-template-20260729-005 - Gemspec metadata now publishes this
50
+ project's RubyForum tag as `mailing_list_uri`, and support docs link to the
51
+ tagged RubyForum community alongside Discord.
52
+
53
+ ### Changed
54
+
55
+ - The `appraisal` executable now supports `-v` / `--version` and prints a
56
+ standard startup header on normal runs.
57
+
58
+ - kettle-jem-template-20260720-002 - Development Gemfiles now use the released
59
+ `tree_sitter_language_pack` gem 1.13.3 or newer by default.
60
+ - kettle-jem-template-20260725-002 - Version specs now use `anonymous_loader` to
61
+ cover `version.rb` without redefining constants, or are removed when version
62
+ specs are not managed for the project.
63
+ - kettle-jem-template-20260728-001 - Generated Ruby workflows now use clearer
64
+ setup-ruby-flash planning and can prepare appraisal-only jobs without
65
+ installing the main Gemfile bundle.
66
+ - kettle-jem-template-20260801-001 - Generated README gem dashboard links now
67
+ use ClickGems instead of BestGems.
68
+
69
+ ### Fixed
70
+
71
+ - kettle-jem-template-20260720-003 - StructuredMerge Git diff driver config now
72
+ uses the installed `smorg-rb` driver command.
73
+ - kettle-jem-template-20260725-001 - Release pull request branches beginning
74
+ with `feature/release` now run JRuby and TruffleRuby workflows.
75
+ - kettle-jem-template-20260726-002 - Generated version files now document their
76
+ version namespace and constants, reducing warning-only YARD lint output.
77
+ - kettle-jem-template-20260726-003 - Coverage upload steps now treat Coveralls,
78
+ QLTY, and Codecov as optional, so provider outages do not fail CI when local
79
+ coverage thresholds still pass.
80
+ - kettle-jem-template-20260728-002 - Generated RuboCop configs now ignore the
81
+ same `gemfiles/vendor/bundle` tree as `.gitignore`, so vendored dependency
82
+ installs are not reported as project lint debt.
83
+ - kettle-jem-template-20260728-003 - Generated dep-heads workflows now run
84
+ TruffleRuby jobs with current RubyGems and Bundler, avoiding setup failures
85
+ before the test suite starts.
86
+ - kettle-jem-template-20260728-004 - Generated dep-heads workflows now use the
87
+ setup-ruby Bundler install path for direct appraisal Gemfiles, avoiding rv
88
+ lockfile parser failures on Git and path dependencies.
89
+ - kettle-jem-template-20260728-005 - VersionGem bootstrap now creates the
90
+ missing canonical version spec when a project only has shim namespace version
91
+ specs.
92
+ - kettle-jem-template-20260729-001 - Generated JRuby 9.4 workflows now use the
93
+ legacy manual bundle install path, avoiding setup-time Bundler full-index
94
+ failures against `gem.coop`.
95
+ - kettle-jem-template-20260729-003 - Old-Ruby gems below the VersionGem runtime
96
+ floor now get managed minimal `version.rb` files and anonymous-loader version
97
+ specs without adding `version_gem`.
98
+ - kettle-jem-template-20260730-001 - Gemspec package file enumeration now runs
99
+ relative to the gemspec directory, so release package contents stay correct
100
+ even when the gemspec is loaded from another working directory.
101
+
102
+ - Restore the package version loader to the implementation namespace after incorrect template-generated version artifacts.
103
+
104
+ - kettle-jem-template-20260801-002 - Generated RSpec helpers now normalize
105
+ managed configuration block bindings structurally, preventing mixed block
106
+ parameter names from producing invalid configuration after a merge.
107
+ - kettle-jem-template-20260801-003 - Generated project metadata and
108
+ documentation now normalize configured underscore hostnames to valid
109
+ hyphenated hostnames.
110
+ - kettle-jem-template-20260801-004 - Generated organization README logos now
111
+ use GitHub's stable organization avatar endpoint instead of assuming a
112
+ matching Galtzo-hosted asset exists.
113
+
114
+ - kettle-jem-template-20260802-001 - Devcontainer JSON files now merge as JSONC,
115
+ preserving comments and trailing commas during template updates.
116
+
117
+ - Ruby compatibility workflows now pin the setup-ruby-flash revision that supports the configured compatibility bundle input.
118
+
119
+ - Pin Appraisal subprocess Bundler commands to the version recorded in each appraisal lockfile.
120
+
121
+ - Clear Bundler load paths before switching appraisal subprocesses to a locked Bundler version.
122
+
123
+ - Skip unsupported-engine bundler setup before acceptance-test fixtures are created.
124
+
125
+ - Acceptance fixture Bundler commands now invoke the selected Bundler executable on alternate Ruby engines.
126
+
127
+ - Acceptance fixture Bundler command rewriting now supports Ruby 2.4.
128
+
129
+ - Acceptance test fixture setup now preserves RubyGems default Gem.dir in GEM_PATH for Bundler resolution.
130
+
131
+ ## [3.2.0] - 2026-07-18
132
+
133
+ - TAG: [v3.2.0][3.2.0t]
134
+ - COVERAGE: 91.00% -- 910/1000 lines in 29 files
135
+ - BRANCH COVERAGE: 77.54% -- 183/236 branches in 29 files
136
+ - 42.33% documented
137
+
138
+ ### Added
139
+
140
+ - `appraisal generate`, `install`, `update`, `generate-install`, and
141
+ `generate-update` can now process appraisals in parallel with
142
+ `--appraisal-jobs` / `-n`, or `APPRAISAL_JOBS`. Appraisal-level
143
+ parallelism defaults to 2 workers; use `-n 1` to run serially. Bundler older
144
+ than 2.1 falls back to serial processing.
145
+
146
+ ### Changed
147
+
148
+ - Full dependency updates now run `bundle update --all` to avoid Bundler's
149
+ deprecated implicit full-update form.
150
+ - Acceptance specs now opt into expensive dummy-gem and bundle fixture setup
151
+ through metadata, and reuse a per-worker cached default fixture stage.
152
+ - Generated CI workflows now cache `.rspec_status` and pass it to
153
+ `kettle-test` so `turbo_tests2` can balance workers with historical example
154
+ timings.
155
+ - `generate-install` and `generate-update` now reuse the parsed Appraisals set
156
+ for their generate and install/update phases.
157
+
158
+ - kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
159
+ repository-only files by default to reduce downstream distro packaging churn.
160
+
161
+ ### Fixed
162
+
163
+ - Appraisal command execution now checks whether the `bundle` executable can
164
+ boot before falling back to RubyGems spec probing and Bundler installation,
165
+ preserving TruffleRuby's engine-shipped Bundler in isolated subprocesses.
166
+ - Acceptance fixture Bundler selection now detects TruffleRuby's shipped
167
+ Bundler without reusing a newer Bundler activated by the appraised suite.
168
+ - Acceptance fixture binstubs now pin the selected Bundler version before
169
+ loading generated `bin/bundle` handoff code.
170
+ - Bundler-backed appraisal installs now set `BUNDLE_JOBS` explicitly so the
171
+ configured Appraisal job count also controls Bundler's installer worker
172
+ count in subprocesses.
173
+ - JRuby and TruffleRuby workflows now correctly skip ordinary pull request
174
+ branches unless the branch targets `jruby/`, `truffleruby/`, or `engines/`.
175
+
33
176
  ## [3.1.4] - 2026-07-01
34
177
 
35
178
  - TAG: [v3.1.4][3.1.4t]
@@ -429,7 +572,11 @@ Please file a bug if you notice a violation of semantic versioning.
429
572
  - code coverage tracked with Coveralls, QLTY.sh, and the kettle-soup-cover gem
430
573
  - other minor fixes and improvements
431
574
 
432
- [Unreleased]: https://github.com/appraisal-rb/appraisal2/compare/v3.1.4...HEAD
575
+ [Unreleased]: https://github.com/appraisal-rb/appraisal2/compare/v3.2.1...HEAD
576
+ [3.2.1]: https://github.com/appraisal-rb/appraisal2/compare/v3.2.0...v3.2.1
577
+ [3.2.1t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.2.1
578
+ [3.2.0]: https://github.com/appraisal-rb/appraisal2/compare/v3.1.4...v3.2.0
579
+ [3.2.0t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.2.0
433
580
  [3.1.4]: https://github.com/appraisal-rb/appraisal2/compare/v3.1.3...v3.1.4
434
581
  [3.1.4t]: https://github.com/appraisal-rb/appraisal2/releases/tag/v3.1.4
435
582
  [3.1.3]: https://github.com/appraisal-rb/appraisal2/compare/v3.1.2...v3.1.3
data/LICENSE.md CHANGED
@@ -3,7 +3,7 @@
3
3
  This project is made available under the following license.
4
4
  Choose the option that best fits your use case:
5
5
 
6
- - [MIT](MIT.md)
6
+ - [MIT](https://github.com/appraisal-rb/appraisal2/blob/main/MIT.md)
7
7
 
8
8
  ## Copyright Notice
9
9
 
@@ -47,4 +47,5 @@ Choose the option that best fits your use case:
47
47
  - Copyright (c) 2024 Joe Sharp
48
48
  - Copyright (c) 2024 Sebastian Cohnen
49
49
  - Copyright (c) 2024 Yevhenii Ponomarenko
50
+ - Copyright (c) 2026 Bob McKinven
50
51
  - Copyright (c) 2026 Richard Kramer
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- <a href="https://github.com/appraisal-rb"><img alt="appraisal-rb Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/appraisal-rb/avatar-128px.svg" width="14%" align="right"/></a>
1
+ <a href="https://github.com/appraisal-rb"><img alt="appraisal-rb Logo by GitHub" src="https://github.com/appraisal-rb.png?size=192" width="14%" align="right"/></a>
2
2
 
3
- # 🔍️ Appraisal2
3
+ # 🔍️ appraisal2 / Appraisal
4
4
 
5
- [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
5
+ [![Version][👽versioni]][👽version] [![Ruby Users Forum][✉️ruby-forum-top-img]][✉️ruby-forum] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Total downloads][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
6
6
 
7
- `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know on Discord][✉️discord-invite] or [RubyForum][✉️ruby-forum], as I may have missed the notification.
8
8
 
9
9
  ---
10
10
 
@@ -53,8 +53,8 @@ Appraisal2 adds:
53
53
  | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎ruby-3.0-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎ruby-3.1-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
54
54
  | 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] ![Ruby 2.3 Compat][💎ruby-2.3i] <br/> [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎ruby-2.4-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎ruby-2.5-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎ruby-2.6-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎ruby-2.7-wf]|
55
55
  | Works with MRI Ruby 1 | ![Ruby 1.8 Compat][💎ruby-1.8i] ![Ruby 1.9 Compat][💎ruby-1.9i]|
56
- | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
57
- | 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] |
56
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
57
+ | 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] |
58
58
  | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
59
59
  | Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
60
60
  | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
@@ -76,15 +76,15 @@ The _amazing_ test matrix is powered by the kettle-dev stack.
76
76
  <details markdown="1">
77
77
  <summary>How kettle-dev manages complexity in tests</summary>
78
78
 
79
- | Gem | Source | Role | Daily download rank |
79
+ | Gem | Source | Role | Total downloads |
80
80
  |-----|--------|------|---------------------|
81
- | [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) |
82
- | [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) |
83
- | [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) |
84
- | [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) |
85
- | [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) |
86
- | [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) |
87
- | [turbo_tests2](https://bestgems.org/gems/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Daily download rank for turbo_tests2](https://img.shields.io/gem/rd/turbo_tests2.svg?style=flat-square)](https://bestgems.org/gems/turbo_tests2) |
81
+ | [appraisal2-rubocop](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Total downloads for appraisal2-rubocop](https://img.shields.io/gem/dt/appraisal2-rubocop.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) |
82
+ | [kettle-dev](https://clickgems.clickhouse.com/dashboard/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Total downloads for kettle-dev](https://img.shields.io/gem/dt/kettle-dev.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-dev) |
83
+ | [kettle-jem](https://clickgems.clickhouse.com/dashboard/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Total downloads for kettle-jem](https://img.shields.io/gem/dt/kettle-jem.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-jem) |
84
+ | [kettle-soup-cover](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Total downloads for kettle-soup-cover](https://img.shields.io/gem/dt/kettle-soup-cover.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) |
85
+ | [kettle-test](https://clickgems.clickhouse.com/dashboard/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Total downloads for kettle-test](https://img.shields.io/gem/dt/kettle-test.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-test) |
86
+ | [rubocop-lts](https://clickgems.clickhouse.com/dashboard/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Total downloads for rubocop-lts](https://img.shields.io/gem/dt/rubocop-lts.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/rubocop-lts) |
87
+ | [turbo_tests2](https://clickgems.clickhouse.com/dashboard/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Total downloads for turbo_tests2](https://img.shields.io/gem/dt/turbo_tests2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/turbo_tests2) |
88
88
 
89
89
  </details>
90
90
 
@@ -93,17 +93,14 @@ The _amazing_ test matrix is powered by the kettle-dev stack.
93
93
  <details markdown="1">
94
94
  <summary>Find this repo on federated forges (Coming soon!)</summary>
95
95
 
96
- | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
97
- |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
98
- | 🧪 [appraisal-rb/appraisal2 on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
99
- | 🧊 [appraisal-rb/appraisal2 on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
100
- | 🐙 [appraisal-rb/appraisal2 on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
101
- | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
96
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI |
97
+ |-------------------------------------------------|-------------------------------------------|-------------------|------------------|-----------------|----------------|
98
+ | 🧪 [appraisal-rb/appraisal2 on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix |
99
+ | 🧊 [appraisal-rb/appraisal2 on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix |
100
+ | 🐙 [appraisal-rb/appraisal2 on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix |
102
101
 
103
102
  </details>
104
103
 
105
- [gh-discussions]: https://github.com/appraisal-rb/appraisal2/discussions
106
-
107
104
  ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/appraisal2)](https://tidelift.com/subscription/pkg/rubygems-appraisal2?utm_source=rubygems-appraisal2&utm_medium=referral&utm_campaign=readme)
108
105
 
109
106
  Available as part of the Tidelift Subscription.
@@ -121,6 +118,7 @@ The maintainers of this and thousands of other packages are working with Tidelif
121
118
 
122
119
  Alternatively:
123
120
 
121
+ - [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
124
122
  - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
125
123
  - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
126
124
  - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
@@ -233,6 +231,16 @@ In the case that you want to run all the appraisals by default when you run `rak
233
231
 
234
232
  Note that this may conflict with your CI setup if you decide to split the test into multiple processes by Appraisal2 and you are using `rake` to run tests by default.
235
233
 
234
+ #### Using Multiple Appraisals Files
235
+ It's possible to have multiple Appraisals files, each with their own 'gemfiles' folder. Selecting which 'Appraisals' file to use with `ENV["APPRAISALS_FILE"]` and the 'gemfiles' folder with `ENV["APPRAISAL_GEMFILES_ROOT"]`.
236
+
237
+ For example, if you have a different Appraisals set for each version of ruby you test with:
238
+ ```ruby
239
+ APPRAISALS_FILE=appraisals_4_0 APPRAISAL_GEMFILES_ROOT=gemfiles_4_0 bundle exec appraisal rake test
240
+ APPRAISALS_FILE=appraisals_3_4 APPRAISAL_GEMFILES_ROOT=gemfiles_3_4 bundle exec appraisal rake test
241
+ APPRAISALS_FILE=appraisals_3_3 APPRAISAL_GEMFILES_ROOT=gemfiles_3_3 bundle exec appraisal rake test
242
+ ```
243
+
236
244
  ### Commands
237
245
 
238
246
  ```bash
@@ -259,6 +267,21 @@ Use the command that matches the lifecycle you want:
259
267
  | `generate-install` | Yes | Yes, via install | First setup, or after intentional Appraisals changes |
260
268
  | `generate-update` | Yes | Yes, via update | Regenerate gemfiles, then update dependency locks |
261
269
 
270
+ Appraisal2 can process appraisals in parallel with `--appraisal-jobs` / `-n`,
271
+ or with `APPRAISAL_JOBS` when no CLI value is provided. `generate`,
272
+ `generate-install`, and `generate-update` use this for generation. `install`,
273
+ `update`, `generate-install`, and `generate-update` use it to fan out dependency
274
+ resolution across appraisals. External commands run across all appraisals, such
275
+ as `bundle exec appraisal rake test`, use `APPRAISAL_JOBS`. Appraisal-level
276
+ parallelism defaults to 2 workers; use `-n 1` to run serially. When Appraisal2
277
+ is running under Bundler older than 2.1, Appraisal2 falls back to serial
278
+ processing because those Bundler versions do not provide the modern environment
279
+ helpers used to isolate parallel Bundler subprocesses.
280
+
281
+ Install commands keep `--jobs` / `-j` for the selected gem manager. With
282
+ Bundler, `-j` controls `bundle install --jobs`, while `-n` controls how many
283
+ appraisal gemfiles Appraisal2 processes at the same time.
284
+
262
285
  The deprecated rake task `rake appraisal:install` now delegates to `appraisal generate-install`, preserving its historical generate-and-install behavior while the CLI commands remain explicit.
263
286
 
264
287
  ### Command Options
@@ -270,12 +293,27 @@ Built-in dependency commands support the following options:
270
293
  | Option | Description |
271
294
  |--------|-------------|
272
295
  | `--gem-manager`, `-g` | Gem manager to use: `bundler` (default) or `ore`; applies to `install`, `update`, `generate-install`, and `generate-update` |
273
- | `--jobs`, `-j` | Install gems in parallel using the given number of workers; applies to `install` and `generate-install` |
296
+ | `--appraisal-jobs`, `-n` | Process appraisals in parallel for `generate`, `install`, `update`, `generate-install`, and `generate-update` (default: 2; use `-n 1` for serial execution; Bundler < 2.1 falls back to serial processing) |
297
+ | `--jobs`, `-j` | Pass a parallel job count to the selected gem manager; applies to `install` and `generate-install` |
274
298
  | `--retry` | Retry network and git requests that have failed; applies to `install` and `generate-install` (default: 1) |
275
299
  | `--without` | A space-separated list of groups to skip during installation; applies to `install` and `generate-install` |
276
300
  | `--full-index` | Run bundle install with the full-index argument; applies to `install` and `generate-install` |
277
301
  | `--path` | Install gems in the specified directory; applies to `install` and `generate-install` |
278
302
 
303
+ ```bash
304
+ # Process two appraisals at a time, using the default Appraisal worker count
305
+ bundle exec appraisal generate-install
306
+
307
+ # Process four appraisals at a time
308
+ bundle exec appraisal generate-install -n 4
309
+
310
+ # Process two appraisals at a time, and give each Bundler install four jobs
311
+ bundle exec appraisal generate-install -n 2 -j 4
312
+
313
+ # Run Appraisal serially when parallel appraisal processing is not desired
314
+ bundle exec appraisal generate-install -n 1
315
+ ```
316
+
279
317
  ### Using Commands with Named Appraisals
280
318
 
281
319
  #### Using Appraisal's built-in commands with named appraisals
@@ -484,7 +522,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases.
484
522
  ## 📄 License
485
523
 
486
524
  The gem is available as open source under the terms of
487
- the [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].
525
+ the [MIT](https://github.com/appraisal-rb/appraisal2/blob/main/MIT.md) [![License: MIT][📄license-img]][📄license-ref].
488
526
 
489
527
  ### © Copyright
490
528
 
@@ -533,6 +571,7 @@ See [LICENSE.md][📄license] for the official copyright notice.
533
571
  - Copyright (c) 2024 Joe Sharp
534
572
  - Copyright (c) 2024 Sebastian Cohnen
535
573
  - Copyright (c) 2024 Yevhenii Ponomarenko
574
+ - Copyright (c) 2026 Bob McKinven
536
575
  - Copyright (c) 2026 Richard Kramer
537
576
 
538
577
  </details>
@@ -546,11 +585,12 @@ I'm hoping to be able to pay for my kids' health insurance this month,
546
585
  so if you value the work I am doing, I need your support.
547
586
  Please consider sponsoring me or the project.
548
587
 
549
- To join the community or get help 👇️ Join the Discord.
588
+ To join the community or get help, use the RubyForum or Discord.
550
589
 
590
+ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
551
591
  [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
552
592
 
553
- To say "thanks!" ☝️ Join the Discord or 👇️ send money.
593
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
554
594
 
555
595
  [![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]
556
596
 
@@ -591,11 +631,14 @@ Thanks for RTFM. ☺️
591
631
  [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
592
632
  [✉️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
593
633
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
634
+ [✉️ruby-forum-top-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=flat&logo=discourse&label=Ruby%20Users%20Forum
635
+ [✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=for-the-badge&logo=discourse&label=Ruby%20Users%20Forum
636
+ [✉️ruby-forum]: https://www.rubyforum.org/tag/appraisal2
594
637
 
595
638
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
596
639
  [⛳️gem-namespace]: https://github.com/appraisal-rb/appraisal2
597
- [⛳️namespace-img]: https://img.shields.io/badge/namespace-Appraisal2-3C2D2D.svg?style=square&logo=ruby&logoColor=white
598
- [⛳️gem-name]: https://bestgems.org/gems/appraisal2
640
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Appraisal-3C2D2D.svg?style=square&logo=ruby&logoColor=white
641
+ [⛳️gem-name]: https://clickgems.clickhouse.com/dashboard/appraisal2
599
642
  [⛳️name-img]: https://img.shields.io/badge/name-appraisal2-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
600
643
  [⛳️tag-img]: https://img.shields.io/github/tag/appraisal-rb/appraisal2.svg
601
644
  [⛳️tag]: https://github.com/appraisal-rb/appraisal2/releases
@@ -636,7 +679,7 @@ Thanks for RTFM. ☺️
636
679
  [📜src-gl]: https://gitlab.com/appraisal-rb/appraisal2
637
680
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
638
681
  [📜src-cb]: https://codeberg.org/appraisal-rb/appraisal2
639
- [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
682
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
640
683
  [📜src-gh]: https://github.com/appraisal-rb/appraisal2
641
684
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
642
685
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
@@ -644,9 +687,9 @@ Thanks for RTFM. ☺️
644
687
  [📜gh-wiki]: https://github.com/appraisal-rb/appraisal2/wiki
645
688
  [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
646
689
  [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
647
- [👽dl-rank]: https://bestgems.org/gems/appraisal2
648
- [👽dl-ranki]: https://img.shields.io/gem/rd/appraisal2.svg
649
- [👽version]: https://bestgems.org/gems/appraisal2
690
+ [👽dl-rank]: https://clickgems.clickhouse.com/dashboard/appraisal2
691
+ [👽dl-ranki]: https://img.shields.io/gem/dt/appraisal2.svg
692
+ [👽version]: https://clickgems.clickhouse.com/dashboard/appraisal2
650
693
  [👽versioni]: https://img.shields.io/gem/v/appraisal2.svg
651
694
  [🏀qlty-mnt]: https://qlty.sh/gh/appraisal-rb/projects/appraisal2
652
695
  [🏀qlty-mnti]: https://qlty.sh/gh/appraisal-rb/projects/appraisal2/maintainability.svg
@@ -752,12 +795,12 @@ Thanks for RTFM. ☺️
752
795
  [📌gitmoji]: https://gitmoji.dev
753
796
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
754
797
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
755
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.916-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
798
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.007-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
756
799
  [🔐security]: https://github.com/appraisal-rb/appraisal2/blob/main/SECURITY.md
757
800
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
758
801
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
759
802
  [📄license]: LICENSE.md
760
- [📄license-ref]: MIT.md
803
+ [📄license-ref]: https://github.com/appraisal-rb/appraisal2/blob/main/MIT.md
761
804
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
762
805
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
763
806
  [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
@@ -94,7 +94,7 @@ module Appraisal
94
94
  end
95
95
 
96
96
  def gemfile_path
97
- gemfile_root.mkdir unless gemfile_root.exist?
97
+ FileUtils.mkdir_p(gemfile_root)
98
98
 
99
99
  gemfile_root.join(gemfile_name).to_s
100
100
  end
@@ -119,7 +119,8 @@ module Appraisal
119
119
  private
120
120
 
121
121
  def gemfile_root
122
- project_root + "gemfiles"
122
+ gemfiles_root = ENV["APPRAISAL_GEMFILES_ROOT"] || "gemfiles"
123
+ project_root + gemfiles_root
123
124
  end
124
125
 
125
126
  def project_root
@@ -58,7 +58,7 @@ module Appraisal
58
58
  end
59
59
 
60
60
  def path
61
- "Appraisals"
61
+ ENV["APPRAISAL_FILE"] || "Appraisals"
62
62
  end
63
63
  end
64
64
  end