diff --git a/.gitattributes b/.gitattributes
index 30ee8ef..49157ab 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,3 +1,3 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
# <>
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index eb0b5cb..da8a428 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -35,7 +35,7 @@ concurrency:
jobs:
coverage:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Code Coverage on ${{ matrix.ruby }}@current
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -54,12 +54,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: "${{ matrix.ruby }}"
rubygems: "${{ matrix.rubygems }}"
@@ -79,6 +79,16 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-coverage-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-coverage-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-coverage-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }}@current via ${{ matrix.exec_cmd }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/current.yml b/.github/workflows/current.yml
index 90fa554..9e5ea86 100644
--- a/.github/workflows/current.yml
+++ b/.github/workflows/current.yml
@@ -28,7 +28,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
@@ -45,12 +45,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -70,5 +70,15 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-current-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-current-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-current-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/dep-heads.yml b/.github/workflows/dep-heads.yml
index 9e5c637..e562781 100644
--- a/.github/workflows/dep-heads.yml
+++ b/.github/workflows/dep-heads.yml
@@ -1,5 +1,4 @@
-# Targets the evergreen latest release of ruby, truffleruby, and jruby
-# and tests against the HEAD of runtime dependencies
+# Targets enabled evergreen Ruby engines and tests against the HEAD of runtime dependencies
name: Runtime Deps @ HEAD
permissions:
@@ -28,13 +27,13 @@ concurrency:
cancel-in-progress: true
jobs:
- test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ ruby:
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
- BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
+ BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.bundle_gemfile || 'Appraisal.root.gemfile' }}
strategy:
fail-fast: true
matrix:
@@ -43,54 +42,151 @@ jobs:
- ruby: "ruby"
appraisal: "dep-heads"
exec_cmd: "kettle-test"
+ # Run directly from the generated appraisal Gemfile so setup-ruby
+ # does not bootstrap Appraisal.root.gemfile against dependency
+ # sources before this dep-heads appraisal is selected.
+ # This makes gemfiles/dep_heads.gemfile required checked-in output
+ # for repositories using this generated workflow.
+ bundle_gemfile: "gemfiles/dep_heads.gemfile"
+ direct_bundle: true
rubygems: latest
bundler: latest
- # truffleruby-24.1 (targets Ruby 3.3 compatibility)
+ steps:
+ - name: Checkout
+ if: ${{ !env.ACT }}
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+
+ - name: Setup Ruby & RubyGems
+ if: ${{ !env.ACT }}
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
+ with:
+ ruby-version: ${{ matrix.ruby }}
+ rubygems: ${{ matrix.rubygems }}
+ bundler: ${{ matrix.bundler }}
+ bundler-cache: true
+
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-
+
+ - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
+ if: ${{ !env.ACT }}
+ run: bundle exec ${{ matrix.exec_cmd }}
+
+ truffleruby:
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/'))"
+ name: Specs truffleruby@dep-heads
+ runs-on: ubuntu-latest
+ continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
+ env:
+ BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.bundle_gemfile || 'Appraisal.root.gemfile' }}
+ strategy:
+ fail-fast: true
+ matrix:
+ include:
- ruby: "truffleruby"
appraisal: "dep-heads"
exec_cmd: "kettle-test"
+ # Run directly from the generated appraisal Gemfile so setup-ruby
+ # does not bootstrap Appraisal.root.gemfile against dependency
+ # sources before this dep-heads appraisal is selected.
+ # This makes gemfiles/dep_heads.gemfile required checked-in output
+ # for repositories using this generated workflow.
+ bundle_gemfile: "gemfiles/dep_heads.gemfile"
+ direct_bundle: true
rubygems: default
bundler: default
- # jruby-10.0 (targets Ruby 3.4 compatibility)
+ steps:
+ - name: Checkout
+ if: ${{ !env.ACT }}
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+
+ - name: Setup Ruby & RubyGems
+ if: ${{ !env.ACT }}
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
+ with:
+ ruby-version: ${{ matrix.ruby }}
+ rubygems: ${{ matrix.rubygems }}
+ bundler: ${{ matrix.bundler }}
+ bundler-cache: true
+
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-
+
+ - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
+ if: ${{ !env.ACT }}
+ run: bundle exec ${{ matrix.exec_cmd }}
+
+ jruby:
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/'))"
+ name: Specs jruby@dep-heads
+ runs-on: ubuntu-latest
+ continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
+ env:
+ BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.bundle_gemfile || 'Appraisal.root.gemfile' }}
+ strategy:
+ fail-fast: true
+ matrix:
+ include:
- ruby: "jruby"
appraisal: "dep-heads"
exec_cmd: "kettle-test"
+ # Run directly from the generated appraisal Gemfile so setup-ruby
+ # does not bootstrap Appraisal.root.gemfile against dependency
+ # sources before this dep-heads appraisal is selected.
+ # This makes gemfiles/dep_heads.gemfile required checked-in output
+ # for repositories using this generated workflow.
+ bundle_gemfile: "gemfiles/dep_heads.gemfile"
+ direct_bundle: true
rubygems: default
bundler: default
experimental: true
steps:
- name: Checkout
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ if: ${{ !env.ACT }}
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ if: ${{ !env.ACT }}
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
bundler: ${{ matrix.bundler }}
bundler-cache: true
- - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
- id: bundleAppraisalAttempt1
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
- run: bundle exec appraisal ${{ matrix.appraisal }} install
- # Continue to the next step on failure
- continue-on-error: true
-
- # Effectively an automatic retry of the previous step.
- - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
- id: bundleAppraisalAttempt2
- # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
- if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && (!env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby'))) }}
- run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
- run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
+ if: ${{ !env.ACT }}
+ run: bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
index ee085b6..0316e06 100644
--- a/.github/workflows/dependency-review.yml
+++ b/.github/workflows/dependency-review.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: 'Checkout Repository'
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: 'Dependency Review'
diff --git a/.github/workflows/heads.yml b/.github/workflows/heads.yml
index 1ceb014..a7b2084 100644
--- a/.github/workflows/heads.yml
+++ b/.github/workflows/heads.yml
@@ -26,8 +26,8 @@ concurrency:
cancel-in-progress: true
jobs:
- test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ ruby:
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -45,14 +45,119 @@ jobs:
rubygems: default
bundler: default
- # truffleruby-head
+ steps:
+ - name: Checkout
+ if: ${{ !env.ACT }}
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+
+ - name: Setup Ruby & RubyGems
+ if: ${{ !env.ACT }}
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
+ with:
+ ruby-version: ${{ matrix.ruby }}
+ rubygems: ${{ matrix.rubygems }}
+ bundler: ${{ matrix.bundler }}
+ bundler-cache: true
+
+ - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
+ id: bundleAppraisalAttempt1
+ if: ${{ !env.ACT }}
+ run: bundle exec appraisal ${{ matrix.appraisal }} install
+ # Continue to the next step on failure
+ continue-on-error: true
+
+ # Effectively an automatic retry of the previous step.
+ - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
+ id: bundleAppraisalAttempt2
+ # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
+ if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }}
+ run: bundle exec appraisal ${{ matrix.appraisal }} install
+
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-
+
+ - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
+ if: ${{ !env.ACT }}
+ run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
+
+ truffleruby:
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/'))"
+ name: Specs truffleruby-head@head
+ runs-on: ubuntu-latest
+ continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
+ env:
+ BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
+ strategy:
+ fail-fast: true
+ matrix:
+ include:
- ruby: "truffleruby-head"
appraisal: "head"
exec_cmd: "kettle-test"
rubygems: default
bundler: default
- # jruby-head
+ steps:
+ - name: Checkout
+ if: ${{ !env.ACT }}
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+
+ - name: Setup Ruby & RubyGems
+ if: ${{ !env.ACT }}
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
+ with:
+ ruby-version: ${{ matrix.ruby }}
+ rubygems: ${{ matrix.rubygems }}
+ bundler: ${{ matrix.bundler }}
+ bundler-cache: true
+
+ - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
+ id: bundleAppraisalAttempt1
+ if: ${{ !env.ACT }}
+ run: bundle exec appraisal ${{ matrix.appraisal }} install
+ continue-on-error: true
+
+ - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
+ id: bundleAppraisalAttempt2
+ if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }}
+ run: bundle exec appraisal ${{ matrix.appraisal }} install
+
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-
+
+ - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
+ if: ${{ !env.ACT }}
+ run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
+
+ jruby:
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/'))"
+ name: Specs jruby-head@head
+ runs-on: ubuntu-latest
+ continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
+ env:
+ BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
+ strategy:
+ fail-fast: true
+ matrix:
+ include:
- ruby: "jruby-head"
appraisal: "head"
exec_cmd: "kettle-test"
@@ -61,14 +166,14 @@ jobs:
steps:
- name: Checkout
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ if: ${{ !env.ACT }}
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ if: ${{ !env.ACT }}
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -77,18 +182,25 @@ jobs:
- name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
id: bundleAppraisalAttempt1
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
+ if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
- # Continue to the next step on failure
continue-on-error: true
- # Effectively an automatic retry of the previous step.
- name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
id: bundleAppraisalAttempt2
- # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
- if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && (!env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby'))) }}
+ if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
- if: ${{ !env.ACT || (! startsWith(matrix.ruby, 'jruby') && !startsWith(matrix.ruby, 'truffleruby')) }}
+ if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/jruby-10.0.yml b/.github/workflows/jruby-10.0.yml
index 8fbf6d5..a3f642e 100644
--- a/.github/workflows/jruby-10.0.yml
+++ b/.github/workflows/jruby-10.0.yml
@@ -27,7 +27,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -47,13 +47,13 @@ jobs:
steps:
- name: Checkout
if: ${{ !env.ACT }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
if: ${{ !env.ACT }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -74,6 +74,16 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-jruby-10.0-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-jruby-10.0-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-jruby-10.0-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/jruby.yml b/.github/workflows/jruby.yml
index 86663c4..9369097 100644
--- a/.github/workflows/jruby.yml
+++ b/.github/workflows/jruby.yml
@@ -27,7 +27,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -47,13 +47,13 @@ jobs:
steps:
- name: Checkout
if: ${{ !env.ACT }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
if: ${{ !env.ACT }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -74,6 +74,16 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-jruby-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-jruby-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-jruby-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/locked_deps.yml b/.github/workflows/locked_deps.yml
index d7a55d7..6ab8826 100644
--- a/.github/workflows/locked_deps.yml
+++ b/.github/workflows/locked_deps.yml
@@ -54,7 +54,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Default rake task w/ main Gemfile.lock ${{ matrix.name_extra || '' }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
@@ -71,12 +71,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
diff --git a/.github/workflows/opencollective.yml b/.github/workflows/opencollective.yml
index 5da1899..5b5c364 100644
--- a/.github/workflows/opencollective.yml
+++ b/.github/workflows/opencollective.yml
@@ -16,11 +16,11 @@ jobs:
README_UPDATER_TOKEN: ${{ secrets.README_UPDATER_TOKEN }}
REPO: ${{ github.repository }}
steps:
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ruby
rubygems: default
diff --git a/.github/workflows/ruby-3.2.yml b/.github/workflows/ruby-3.2.yml
index 133b3e3..82a3711 100644
--- a/.github/workflows/ruby-3.2.yml
+++ b/.github/workflows/ruby-3.2.yml
@@ -24,7 +24,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -42,12 +42,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -64,5 +64,15 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-ruby-3.2-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-ruby-3.2-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-ruby-3.2-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} ${{ matrix.appraisal }} via ${{ matrix.exec_cmd }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/ruby-3.3.yml b/.github/workflows/ruby-3.3.yml
index 1d3ee8b..7ca4fe9 100644
--- a/.github/workflows/ruby-3.3.yml
+++ b/.github/workflows/ruby-3.3.yml
@@ -24,7 +24,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -42,12 +42,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -64,5 +64,15 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-ruby-3.3-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-ruby-3.3-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-ruby-3.3-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} ${{ matrix.appraisal }} via ${{ matrix.exec_cmd }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/ruby-3.4.yml b/.github/workflows/ruby-3.4.yml
index 27539f9..174067f 100644
--- a/.github/workflows/ruby-3.4.yml
+++ b/.github/workflows/ruby-3.4.yml
@@ -24,7 +24,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -42,12 +42,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -64,5 +64,15 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-ruby-3.4-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-ruby-3.4-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-ruby-3.4-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} ${{ matrix.appraisal }} via ${{ matrix.exec_cmd }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml
index de7dd30..ec079a1 100644
--- a/.github/workflows/style.yml
+++ b/.github/workflows/style.yml
@@ -24,7 +24,7 @@ concurrency:
jobs:
rubocop:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Style on ${{ matrix.ruby }}@current
runs-on: ubuntu-latest
env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
@@ -42,12 +42,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
diff --git a/.github/workflows/templating.yml b/.github/workflows/templating.yml
index 137be89..56f319a 100644
--- a/.github/workflows/templating.yml
+++ b/.github/workflows/templating.yml
@@ -28,7 +28,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -46,12 +46,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
diff --git a/.github/workflows/truffle.yml b/.github/workflows/truffle.yml
index a469902..334651f 100644
--- a/.github/workflows/truffle.yml
+++ b/.github/workflows/truffle.yml
@@ -27,7 +27,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -47,13 +47,13 @@ jobs:
steps:
- name: Checkout
if: ${{ !env.ACT }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
if: ${{ !env.ACT }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -74,6 +74,16 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-truffle-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-truffle-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-truffle-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/truffleruby-24.2.yml b/.github/workflows/truffleruby-24.2.yml
index 24b437c..9d7f3bc 100644
--- a/.github/workflows/truffleruby-24.2.yml
+++ b/.github/workflows/truffleruby-24.2.yml
@@ -27,7 +27,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-22.04
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -47,13 +47,13 @@ jobs:
steps:
- name: Checkout
if: ${{ !env.ACT }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
if: ${{ !env.ACT }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -74,6 +74,16 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-truffleruby-24.2-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-truffleruby-24.2-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-truffleruby-24.2-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/truffleruby-25.0.yml b/.github/workflows/truffleruby-25.0.yml
index c2d5f88..4094bae 100644
--- a/.github/workflows/truffleruby-25.0.yml
+++ b/.github/workflows/truffleruby-25.0.yml
@@ -27,7 +27,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-22.04
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -47,13 +47,13 @@ jobs:
steps:
- name: Checkout
if: ${{ !env.ACT }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
if: ${{ !env.ACT }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -80,6 +80,16 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-truffleruby-25.0-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-truffleruby-25.0-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-truffleruby-25.0-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/truffleruby-33.0.yml b/.github/workflows/truffleruby-33.0.yml
index 9f66ebd..f6ef7f5 100644
--- a/.github/workflows/truffleruby-33.0.yml
+++ b/.github/workflows/truffleruby-33.0.yml
@@ -27,7 +27,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/'))"
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
runs-on: ubuntu-22.04
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -47,13 +47,13 @@ jobs:
steps:
- name: Checkout
if: ${{ !env.ACT }}
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
if: ${{ !env.ACT }}
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
@@ -74,6 +74,16 @@ jobs:
if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} install
+ - name: Restore RSpec status log
+ if: "${{!env.ACT}}"
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
+ with:
+ path: .rspec_status
+ key: rspec-status-truffleruby-33.0-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
+ restore-keys: |
+ rspec-status-truffleruby-33.0-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
+ rspec-status-truffleruby-33.0-${{matrix.ruby}}-${{matrix.appraisal}}-
+
- name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
if: ${{ !env.ACT }}
run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
diff --git a/.github/workflows/unlocked_deps.yml b/.github/workflows/unlocked_deps.yml
index 3baf2a9..5cb3b4b 100644
--- a/.github/workflows/unlocked_deps.yml
+++ b/.github/workflows/unlocked_deps.yml
@@ -44,7 +44,7 @@ concurrency:
jobs:
test:
- if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
+ if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
name: Default rake task w/ unlocked deps ${{ matrix.name_extra || '' }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -62,12 +62,12 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Setup Ruby & RubyGems
- uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
+ uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0
with:
ruby-version: ${{ matrix.ruby }}
rubygems: ${{ matrix.rubygems }}
diff --git a/.kettle-drift.lock b/.kettle-drift.lock
index 9e479a6..260e5e7 100644
--- a/.kettle-drift.lock
+++ b/.kettle-drift.lock
@@ -21,8 +21,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 500,
- 671
+ 502,
+ 673
]
}
],
@@ -30,8 +30,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 499,
- 670
+ 501,
+ 672
]
}
],
@@ -39,8 +39,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 495,
- 666
+ 497,
+ 668
]
}
],
@@ -75,8 +75,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 498,
- 669
+ 500,
+ 671
]
}
],
@@ -84,8 +84,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 488,
- 659
+ 490,
+ 661
]
}
],
@@ -93,8 +93,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 491,
- 662
+ 493,
+ 664
]
}
],
@@ -102,8 +102,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 494,
- 665
+ 496,
+ 667
]
}
],
@@ -228,8 +228,8 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 487,
- 658
+ 489,
+ 660
]
}
],
@@ -291,9 +291,9 @@
{
"file": ".github/workflows/dep-heads.yml",
"lines": [
- 44,
- 51,
- 58
+ 43,
+ 97,
+ 151
]
}
],
@@ -302,8 +302,8 @@
"file": ".github/workflows/heads.yml",
"lines": [
43,
- 50,
- 57
+ 104,
+ 162
]
}
],
@@ -311,25 +311,28 @@
{
"file": "gemfiles/modular/style_local.gemfile",
"lines": [
- 42,
- 51
+ 28,
+ 37
]
}
],
- "exec_cmd: \"kettle-test\"\nrubygems: default": [
+ "exec_cmd: \"kettle-test\"\n# Run directly from the generated appraisal Gemfile so setup-ruby": [
{
"file": ".github/workflows/dep-heads.yml",
"lines": [
- 52,
- 59
+ 44,
+ 98,
+ 152
]
- },
+ }
+ ],
+ "exec_cmd: \"kettle-test\"\nrubygems: default": [
{
"file": ".github/workflows/heads.yml",
"lines": [
44,
- 51,
- 58
+ 105,
+ 163
]
}
],
@@ -337,8 +340,8 @@
{
"file": "gemfiles/modular/style_local.gemfile",
"lines": [
- 39,
- 48
+ 25,
+ 34
]
}
],
@@ -346,8 +349,8 @@
{
"file": "gemfiles/modular/style_local.gemfile",
"lines": [
- 38,
- 47
+ 24,
+ 33
]
}
],
@@ -355,9 +358,9 @@
{
"file": ".structuredmerge/kettle-jem.yml",
"lines": [
- 476,
- 479,
- 482
+ 478,
+ 481,
+ 484
]
}
],
@@ -365,8 +368,8 @@
{
"file": "gemfiles/modular/style_local.gemfile",
"lines": [
- 41,
- 50
+ 27,
+ 36
]
}
]
diff --git a/.structuredmerge/git-drivers.toml b/.structuredmerge/git-drivers.toml
index e0dec6b..07ef3a4 100644
--- a/.structuredmerge/git-drivers.toml
+++ b/.structuredmerge/git-drivers.toml
@@ -13,12 +13,12 @@ description = "Use StructuredMerge external diff drivers for local CLI diffs."
[[profiles.semantic-diff.attributes]]
pattern = "*.rb"
-diff = "smorg-ruby"
+diff = "smorg-rb"
[[profiles.semantic-diff.git_config]]
scope = "global"
-key = "diff.smorg-ruby.command"
-value = "smorg-ruby diff-driver"
+key = "diff.smorg-rb.command"
+value = "smorg-rb diff-driver"
[profiles.textconv-normalized]
description = "Use one-way normalized text projections for package/config review."
diff --git a/.structuredmerge/kettle-jem.yml b/.structuredmerge/kettle-jem.yml
index 30d713d..de60bca 100644
--- a/.structuredmerge/kettle-jem.yml
+++ b/.structuredmerge/kettle-jem.yml
@@ -465,6 +465,8 @@ files:
strategy: accept_template
Rakefile:
strategy: accept_template
+ preference: destination
+ add_template_only_nodes: true
.github:
copilot_instructions.md:
strategy: accept_template
@@ -506,7 +508,7 @@ files:
# add_template_only_nodes: false
kettle-jem:
- version: "7.0.0"
+ version: "7.1.0"
checksums:
".aiignore.example": "48a5dfdd93afd1a15fdce39cc28ca9920263f00018b0968ab031fa744521e5ce"
".config/mise/env.sh": "aeea5a2ab489ba6e5467ae8de6e386ec8c8fe4ff31a044e69d0cd6a092dd6654"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 502bce1..341c725 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,9 +20,6 @@ Please file a bug if you notice a violation of semantic versioning.
### Added
-- Added opt-in path alias normalization so local sibling paths can be rewritten
- to a configured canonical spelling before Bundler writes them to lockfiles.
-
### Changed
### Deprecated
@@ -31,8 +28,51 @@ Please file a bug if you notice a violation of semantic versioning.
### Fixed
+- Local modular Gemfiles now load `nomono/bundler` with the normal Bundler
+ require path so RuboCop Gradual style checks pass under appraisal bundles.
+
### Security
+## [1.1.0] - 2026-07-21
+
+- TAG: [v1.1.0][1.1.0t]
+- COVERAGE: 97.56% -- 120/123 lines in 7 files
+- BRANCH COVERAGE: 86.67% -- 39/45 branches in 7 files
+- 12.50% documented
+
+### Added
+
+- Added opt-in path alias normalization so local sibling paths can be rewritten
+ to a configured canonical spelling before Bundler writes them to lockfiles.
+
+### Changed
+
+- kettle-jem-template-20260716-001 - Shim gemspec manifests now include
+ `LICENSE.md` instead of nonexistent `LICENSE.txt`.
+- kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
+ repository-only files by default to reduce downstream distro packaging churn.
+
+- kettle-jem-template-20260720-001 - Generated READMEs can now render
+ template-managed corporate sponsor logos from project or family config.
+- kettle-jem-template-20260720-002 - Generated development Gemfiles now use the
+ released `tree_sitter_language_pack` gem 1.13.3 or newer by default.
+- kettle-jem-template-20260720-003 - Generated StructuredMerge Git diff driver
+ config now uses the installed `smorg-rb` Ruby driver name.
+- kettle-jem-template-20260720-004 - Generated multi-engine workflow files now
+ omit JRuby and TruffleRuby jobs when project config declares MRI-only engines.
+- kettle-jem-template-20260720-005 - Generated README Support & Community rows
+ now include a RubyForum help badge.
+
+### Fixed
+
+- Documented why `nomono` uses an explicit Gemfile loader instead of the
+ Bundler plugin DSL or RubyGems plugin autoload hooks, and simplified
+ `nomono`'s own local Gemfiles to load the local Bundler integration directly.
+
+- Addressed review feedback by keeping split license detail links pointed at
+ the source repository, keeping `tree_sitter_language_pack` in the templating
+ dependency path only, and regenerating YARD documentation.
+
## [1.0.8] - 2026-07-13
- TAG: [v1.0.8][1.0.8t]
@@ -181,7 +221,11 @@ Please file a bug if you notice a violation of semantic versioning.
- TAG: [v1.0.0][1.0.0t]
- 12.50% documented
-[Unreleased]: https://github.com/kettle-dev/nomono/compare/v1.0.8...HEAD
+[Unreleased]: https://github.com/kettle-dev/nomono/compare/v1.1.0...HEAD
+[1.1.0]: https://github.com/kettle-dev/nomono/compare/v1.0.9...v1.1.0
+[1.1.0t]: https://github.com/kettle-dev/nomono/releases/tag/v1.1.0
+[1.0.9]: https://github.com/kettle-dev/nomono/compare/v1.0.8...v1.0.9
+[1.0.9t]: https://github.com/kettle-dev/nomono/releases/tag/v1.0.9
[1.0.8]: https://github.com/kettle-dev/nomono/compare/v1.0.7...v1.0.8
[1.0.8t]: https://github.com/kettle-dev/nomono/releases/tag/v1.0.8
[1.0.7]: https://github.com/kettle-dev/nomono/compare/v1.0.6...v1.0.7
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c15732e..b3737c9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -30,6 +30,20 @@ Follow these instructions:
8. Create new Pull Request.
9. Announce it in the channel for this org in the [Discord][✉️discord-invite]!
+## Ruby engine CI branches
+
+Pull requests run MRI workflows by default. JRuby and TruffleRuby workflows are
+available by branch naming convention so ordinary PRs do not spend CI time on
+alternate Ruby engines.
+
+- Use a branch named `jruby/*` to run JRuby workflows for a pull request.
+- Use a branch named `truffleruby/*` to run TruffleRuby workflows for a pull
+ request.
+- Use a branch named `engines/*` to run both JRuby and TruffleRuby workflows for
+ a pull request.
+
+Pushes to the default branch continue to run the configured engine workflows.
+
## Executables vs Rake tasks
Executables shipped by dependencies, such as kettle-dev, and stone_checksums, are available
@@ -116,7 +130,7 @@ Troubleshooting Git diffs
- Use `git diff --no-ext-diff` to compare against Git's built-in diff output.
- Use `git diff --no-textconv` when a textconv projection obscures the raw file bytes you need to inspect.
- If Git reports a missing `smorg-*` executable, rerun `bundle install` and the setup command above, then check `git config --local --get-regexp '^diff\.smorg-'`.
-- To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-ruby.command`.
+- To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-rb.command`, `git config --global --unset-all merge.smorg-rb.driver`, and `git config --global --unset-all merge.smorg-rb.name`.
For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`.
diff --git a/Gemfile b/Gemfile
index c4e485d..3410ee1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -18,9 +18,7 @@ git_source(:gitlab) { |repo_name| "https://gitlab.com/#{repo_name}" }
# Include dependencies from nomono.gemspec
gemspec
-# Local workspace dependency wiring for *_local.gemfile overrides
-
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile "gemfiles/modular/templating.gemfile" if ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?
# Debugging
diff --git a/Gemfile.lock b/Gemfile.lock
index f2dd52a..74f6957 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,14 +1,7 @@
-GIT
- remote: https://github.com/kettle-dev/simplecov.git
- revision: bc14cb6ef921e264332fd7b750bf6fb8916488c1
- branch: fix-final-parallel-worker-formatting
- specs:
- simplecov (1.0.0.rc3)
-
PATH
remote: .
specs:
- nomono (1.0.8)
+ nomono (1.1.0)
GEM
remote: https://gem.coop/
@@ -16,14 +9,14 @@ GEM
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
- appraisal2-rubocop (0.2.3)
+ appraisal2-rubocop (1.0.0)
appraisal2 (>= 3.1.4)
rubocop (>= 1.0)
- version_gem (~> 1.1, >= 1.1.13)
+ version_gem (~> 1.1, >= 1.1.14)
ast (2.4.3)
backports (3.25.3)
benchmark (0.5.0)
@@ -33,7 +26,7 @@ GEM
thor (~> 1.0)
cgi (0.5.2)
cmdparse (3.0.7)
- concurrent-ruby (1.3.7)
+ concurrent-ruby (1.3.8)
date (3.5.1)
debug (1.11.1)
irb (~> 1.10)
@@ -71,7 +64,7 @@ GEM
dry-logic (~> 1.4)
zeitwerk (~> 2.6)
emoji_regex (15.0.0)
- erb (6.0.4)
+ erb (6.0.6)
gem_bench (2.0.5)
bundler (>= 1.14)
version_gem (~> 1.1, >= 1.1.4)
@@ -90,32 +83,32 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.1)
+ kettle-dev (2.3.9)
emoji_regex (>= 15.0)
- kettle-rb (~> 0.1, >= 0.1.1)
+ kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
- version_gem (~> 1.1, >= 1.1.13)
- kettle-rb (0.1.1)
- kettle-soup-cover (3.0.0.rc6)
- simplecov (>= 1.0.pre)
- simplecov-cobertura (>= 4.0.pre)
+ kettle-rb (0.1.5)
+ kettle-soup-cover (3.0.4)
+ kettle-wash (~> 0.1, >= 0.1.0)
+ simplecov (>= 1.0)
+ simplecov-cobertura (>= 4.0)
simplecov-console (~> 0.9, >= 0.9.5)
simplecov-rcov (~> 0.3, >= 0.3.7)
simplecov_lcov_formatter (~> 0.9, >= 0.9.0)
- version_gem (~> 1.1, >= 1.1.13)
- kettle-test (2.0.10)
+ kettle-test (2.0.12)
appraisal2 (~> 3.0, >= 3.0.6)
backports (~> 3.0)
rspec (~> 3.0)
rspec-block_is_expected (~> 1.0, >= 1.0.6)
rspec-pending_for (~> 0.1, >= 0.1.20)
- rspec-stubbed_env (~> 1.0, >= 1.0.5)
+ rspec-stubbed_env (~> 1.0, >= 1.0.6)
rspec_junit_formatter (~> 0.6)
silent_stream (~> 1.0, >= 1.0.12)
timecop-rspec (~> 1.0, >= 1.0.3)
- turbo_tests2 (~> 3.1, >= 3.1.4)
- version_gem (~> 1.1, >= 1.1.13)
+ turbo_tests2 (~> 3.1, >= 3.1.12)
+ kettle-wash (0.1.1)
+ version_gem (~> 1.1, >= 1.1.14)
kramdown (2.5.2)
rexml (>= 3.4.4)
kramdown-parser-gfm (1.1.0)
@@ -139,7 +132,7 @@ GEM
parallel (1.28.0)
parallel_tests (5.7.0)
parallel
- parser (3.3.11.1)
+ parser (3.3.12.0)
ast (~> 2.4.1)
racc
pp (0.6.4)
@@ -194,7 +187,7 @@ GEM
rspec-support (3.13.7)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
- rubocop (1.87.0)
+ rubocop (1.88.2)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
@@ -239,7 +232,7 @@ GEM
rubocop-md (2.0.4)
lint_roller (~> 1.1)
rubocop (>= 1.72.1)
- rubocop-minitest (0.39.1)
+ rubocop-minitest (0.40.0)
lint_roller (~> 1.1)
rubocop (>= 1.75.0, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
@@ -286,9 +279,10 @@ GEM
silent_stream (1.0.12)
logger (~> 1.2)
version_gem (>= 1.1.8, < 3)
- simplecov-cobertura (4.0.0.rc1)
+ simplecov (1.0.2)
+ simplecov-cobertura (4.0.0)
rexml
- simplecov (>= 1.0.0.rc2, < 2.0)
+ simplecov (~> 1.0)
simplecov-console (0.9.5)
ansi
simplecov
@@ -297,10 +291,10 @@ GEM
simplecov (>= 0.4.1)
simplecov_lcov_formatter (0.9.0)
simplecov (>= 0.18)
- standard (1.55.0)
+ standard (1.56.0)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.0)
- rubocop (~> 1.87.0)
+ rubocop (~> 1.88.0)
standard-custom (~> 1.0.0)
standard-performance (~> 1.8)
standard-custom (1.0.2)
@@ -333,21 +327,21 @@ GEM
rspec (~> 3.0)
timecop (>= 0.7, < 1)
tsort (0.2.0)
- turbo_tests2 (3.1.7)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
- version_gem (~> 1.1, >= 1.1.13)
+ version_gem (~> 1.1, >= 1.1.14)
unicode-display_width (3.2.0)
unicode-emoji (~> 4.1)
unicode-emoji (4.2.0)
- version_gem (1.1.13)
+ version_gem (1.1.14)
webrick (1.9.2)
yaml-converter (0.2.3)
hexapdf (>= 1.8, < 2)
kramdown (>= 2.4, < 3)
kramdown-parser-gfm (~> 1.1)
version_gem (~> 1.1, >= 1.1.13)
- yard (0.9.44)
+ yard (0.9.45)
yard-fence (0.9.6)
rdoc (>= 6.11, < 8)
version_gem (~> 1.1, >= 1.1.13)
@@ -359,7 +353,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -369,12 +363,8 @@ GEM
PLATFORMS
aarch64-linux
- aarch64-linux
- aarch64-linux-gnu
aarch64-linux-gnu
aarch64-linux-musl
- aarch64-linux-musl
- arm64-darwin
arm64-darwin
x86_64-linux
x86_64-linux-gnu
@@ -382,20 +372,20 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
- appraisal2 (~> 3.1, >= 3.1.4)
- appraisal2-rubocop (~> 0.2, >= 0.2.3)
+ appraisal2 (~> 3.2, >= 3.2.0)
+ appraisal2-rubocop (~> 1.0, >= 1.0.0)
benchmark (~> 0.5, >= 0.5.0)
bundler-audit (~> 0.9.3)
cgi (~> 0.5)
debug (>= 1.1)
- erb (~> 6.0, >= 6.0.4)
+ erb (~> 6.0, >= 6.0.6)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.4)
irb (~> 1.17)
- kettle-dev (~> 2.3, >= 2.3.1)
- kettle-soup-cover (~> 3.0.a, >= 3.0.0.rc5)
- kettle-test (~> 2.0, >= 2.0.10)
- kramdown (~> 2.5, >= 2.5.1)
+ kettle-dev (~> 2.3, >= 2.3.7)
+ kettle-soup-cover (~> 3.0, >= 3.0.3)
+ kettle-test (~> 2.0, >= 2.0.12)
+ kramdown (~> 2.5, >= 2.5.2)
kramdown-parser-gfm (~> 1.1)
mutex_m (~> 0.2)
nomono!
@@ -406,40 +396,38 @@ DEPENDENCIES
require_bench (~> 1.0, >= 1.0.4)
rubocop-gradual (~> 0.4, >= 0.4.0)
rubocop-lts (~> 24.2, >= 24.2.1)
- rubocop-lts-rspec (~> 1.0, >= 1.0.4)
- rubocop-minitest (~> 0.38, >= 0.38.1)
+ rubocop-lts-rspec (~> 1.0, >= 1.0.5)
+ rubocop-minitest (~> 0.40, >= 0.40.0)
rubocop-on-rbs (~> 2.0, >= 2.0.0)
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-ruby3_2 (~> 3.0, >= 3.0.6)
ruby-progressbar (~> 1.13)
- simplecov!
- standard (~> 1.54, >= 1.54.0)
+ standard (~> 1.56, >= 1.56.0)
stone_checksums (~> 1.0, >= 1.0.6)
stringio (>= 3.0)
- turbo_tests2 (~> 3.1, >= 3.1.7)
+ turbo_tests2 (~> 3.2, >= 3.2.0)
webrick (~> 1.9)
yaml-converter (~> 0.2, >= 0.2.3)
- yard (~> 0.9, >= 0.9.44)
+ yard (~> 0.9, >= 0.9.45)
yard-fence (~> 0.9, >= 0.9.6)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
- yard-timekeeper (~> 0.2, >= 0.2.3)
+ yard-timekeeper (~> 0.2, >= 0.2.4)
yard-yaml (~> 0.2, >= 0.2.3)
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
- appraisal2-rubocop (0.2.3) sha256=06fd36e7d4e88742193e38d48c196b8d96cff37168bf789405c08a7d771abc2c
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
+ appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
- bundler (4.0.15) sha256=a4ceb882fe94a0e0ac63cd0813932bbfd631a14e5ac0b7975189b19a4d28d9e7
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
- concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
+ concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4
@@ -453,7 +441,7 @@ CHECKSUMS
dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727
dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178
emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829
- erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9
+ erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
@@ -461,10 +449,11 @@ CHECKSUMS
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.1) sha256=559eab0591b9d49468d4a56a1f35ac5f770cb0e566271da52f635478ab322d3c
- kettle-rb (0.1.1) sha256=2e793d817f5150339770c547a2c72ed0c1a23b5e5a3ef46f462500dcb10dec4d
- kettle-soup-cover (3.0.0.rc6) sha256=13af4d6c3d090a8e2eed3ff02d0eb688771c7e55b80398cf8143791378812f62
- kettle-test (2.0.10) sha256=1708800fe093e724b8d1f0673a92da2a05dfe6314aee6d49dfeecd4985321ac8
+ kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc
+ kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f
+ kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86
+ kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52
+ kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
@@ -476,12 +465,12 @@ CHECKSUMS
nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527
nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
- nomono (1.0.8)
+ nomono (1.1.0)
openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2
ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
- parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
+ parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
@@ -506,7 +495,7 @@ CHECKSUMS
rspec-stubbed_env (1.0.6) sha256=6467a6eb0f72146d443ffb0c5a2a549d8812e59c04fbc81e03cd914ebf1f28dc
rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15
- rubocop (1.87.0) sha256=b9d9ddf55116a513f8ef2c7ae660662d8b49301f118d3f0df61865b33a5c188d
+ rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf
rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db
rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357
rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718
@@ -515,7 +504,7 @@ CHECKSUMS
rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174
rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4
rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93
- rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed
+ rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d
rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be
rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7
rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
@@ -529,12 +518,12 @@ CHECKSUMS
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
- simplecov (1.0.0.rc3)
- simplecov-cobertura (4.0.0.rc1) sha256=1de000b112889f5c2d4d4627d00fb27fa0c77de5b2a7a46d9c230c2408de2c11
+ simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244
+ simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea
simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed
- standard (1.55.0) sha256=8a8f2c3e681a4db3aafde1b301561b0f3d7c5f06c160167cb744a4d7baf0426e
+ standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973
@@ -547,20 +536,20 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.7) sha256=1f0a476efb5c2949561dd5caa59e829c9a3af77a07163fdf6ea9207cd511b765
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
- version_gem (1.1.13) sha256=77f3035ac45877cd14610648fec2d23bd8c10fa13dfcf63a588825aa98587260
+ version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
- yard (0.9.44) sha256=eb087e9b631ccd887b049f303d489963945452d5e2a7eb49a5a74a7cf6887f28
+ yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
- 4.0.15
+ 4.0.16
diff --git a/LICENSE.md b/LICENSE.md
index ec51035..3729046 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -3,7 +3,7 @@
This project is made available under the following license.
Choose the option that best fits your use case:
-- [AGPL-3.0-only](AGPL-3.0-only.md)
+- [AGPL-3.0-only](https://github.com/kettle-dev/nomono/blob/main/AGPL-3.0-only.md)
If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
diff --git a/README.md b/README.md
index 2f0b751..dfdcdaf 100644
--- a/README.md
+++ b/README.md
@@ -40,8 +40,8 @@ Use `require "nomono/bundler"` from Gemfiles or modular Gemfiles; this is the ex
| Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|
| Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
| Works with MRI Ruby 3 | [![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]|
-| 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] |
-| 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] |
+| 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] |
+| 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] |
| 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] |
| Compliance | [![License: AGPL-3.0-only][📄license-img]][📄license] [![Apache license compatibility: Category X][📄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] |
| 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] |
@@ -176,7 +176,7 @@ source "https://gem.coop"
if ENV.fetch("KETTLE_DEV_DEV", "false").casecmp("false").zero?
gem "kettle-dev", "~> 2.2", ">= 2.2.15"
gem "kettle-test", "~> 2.0", ">= 2.0.6"
- gem "kettle-soup-cover", "~> 3.0.a", ">= 3.0.0.rc4"
+ gem "kettle-soup-cover", "~> 3.0", ">= 3.0.1"
else
eval_gemfile "gemfiles/modular/local.gemfile"
end
@@ -205,6 +205,19 @@ and nomono owns the path normalization for sibling repositories. When
`KETTLE_DEV_DEV=false` or is unset, the modular local override is skipped and
Bundler resolves released gems normally.
+`nomono` uses an explicit `require "nomono/bundler"` loader instead of the
+Bundler plugin DSL. Bundler plugins are installed extensions for Bundler
+commands, source handlers, and lifecycle hooks; `nomono` only needs to install
+Gemfile macros while Bundler is evaluating a Gemfile. The root Gemfile should
+declare the compatible `nomono` version, and modular local Gemfiles should fail
+normally if that loader is unavailable or incompatible.
+
+`nomono` also avoids RubyGems plugin autoload hooks for this path. Those hooks
+are appropriate for gems that must globally patch RubyGems or Bundler before
+dependency resolution can work. Local sibling overrides do not need cold-boot
+global patches: the root Gemfile installs `nomono`, and the ENV-gated modular
+Gemfile explicitly loads the macros only when it needs them.
+
## 🔐 Security
See [SECURITY.md][🔐security].
@@ -290,7 +303,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases.
## 📄 License
-The gem is available under the following license: [AGPL-3.0-only](AGPL-3.0-only.md).
+The gem is available under the following license: [AGPL-3.0-only](https://github.com/kettle-dev/nomono/blob/main/AGPL-3.0-only.md).
See [LICENSE.md][📄license] for details.
If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
@@ -360,6 +373,8 @@ Thanks for RTFM. ☺️
[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
[✉️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
[✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
+[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white
+[✉️ruby-forum]: https://www.rubyforum.org/c/help/8
[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
[⛳️gem-namespace]: https://github.com/kettle-dev/nomono
@@ -405,7 +420,7 @@ Thanks for RTFM. ☺️
[📜src-gl]: https://gitlab.com/kettle-dev/nomono
[📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
[📜src-cb]: https://codeberg.org/kettle-dev/nomono
-[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
+[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
[📜src-gh]: https://github.com/kettle-dev/nomono
[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
[📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
@@ -489,12 +504,12 @@ Thanks for RTFM. ☺️
[📌gitmoji]: https://gitmoji.dev
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
-[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.089-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
+[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.123-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
[🔐security]: https://github.com/kettle-dev/nomono/blob/main/SECURITY.md
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
[📄license]: LICENSE.md
-[📄license-ref]: AGPL-3.0-only.md
+[📄license-ref]: https://github.com/kettle-dev/nomono/blob/main/AGPL-3.0-only.md
[📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only-259D6C.svg
[📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
[📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
diff --git a/RUBOCOP.md b/RUBOCOP.md
index f15b980..a143117 100644
--- a/RUBOCOP.md
+++ b/RUBOCOP.md
@@ -27,11 +27,13 @@ bundle exec rake rubocop_gradual:check
## Understanding the Lock File
-The `.rubocop_gradual.lock` file tracks all current RuboCop violations in the project. This allows the team to:
+The `.rubocop_gradual.lock` file is a work list, not a permanent baseline. Every entry represents a style issue that should be resolved by either fixing the code or making an intentional exception explicit.
-1. Prevent new violations while gradually fixing existing ones
+This allows the team to:
+
+1. Prevent new violations while existing issues are handled deliberately
2. Track progress on code style improvements
-3. Ensure CI builds don't fail due to pre-existing violations
+3. Distinguish temporary work items from intentional project style exceptions
## Common Commands
@@ -47,25 +49,30 @@ The `.rubocop_gradual.lock` file tracks all current RuboCop violations in the pr
1. Before submitting a PR, run `bundle exec rake rubocop_gradual:autocorrect`
a. or just the default `bundle exec rake`, as autocorrection is a pre-requisite of the default task.
-2. If there are new violations, either:
+2. If there are violations, either:
- Fix them in your code
- - Run `bundle exec rake rubocop_gradual:force_update` to update the lock file (only for violations you can't fix immediately)
+ - Normalize intentional deviations with an explicit config or inline exception
+ - Run `bundle exec rake rubocop_gradual:force_update` only for temporary work items you cannot fix immediately
3. Commit the updated `.rubocop_gradual.lock` file along with your changes
-## Never add inline RuboCop disables
+## Explicit Style Exceptions
+
+Do not treat `.rubocop_gradual.lock` as a baseline. Treat it as a list of work that must be fixed or normalized into the styleguide.
+
+Prefer this order:
-Do not add inline `rubocop:disable` / `rubocop:enable` comments anywhere in the codebase (including specs, except when following the few existing `rubocop:disable` patterns for a rule already being disabled elsewhere in the code). We handle exceptions in two supported ways:
+1. Fix the code so it follows the configured styleguide.
+2. For intentional project conventions, add the narrowest useful override in `.rubocop.yml` or `.rubocop_rspec.yml`.
+3. For local intentional deviations, add a tightly scoped inline `rubocop:disable` / `rubocop:enable` around the exact line or block.
+4. Keep an entry in `.rubocop_gradual.lock` only as temporary work to be resolved later.
-- Permanent/structural exceptions: prefer adjusting the RuboCop configuration (e.g., in `.rubocop.yml`) to exclude a rule for a path or file pattern when it makes sense project-wide.
-- Temporary exceptions while improving code: record the current violations in `.rubocop_gradual.lock` via the gradual workflow:
- - `bundle exec rake rubocop_gradual:autocorrect` (preferred; will autocorrect what it can and update the lock only if no new violations were introduced)
- - If needed, `bundle exec rake rubocop_gradual:force_update` (as a last resort when you cannot fix the newly reported violations immediately)
+Use configuration overrides when a deviation is structural, generated, path-specific, or applies consistently to a small set of files. Use inline disables when the exception is local and the reason is clearer at the code site than in global config.
In general, treat the rules as guidance to follow; fix violations rather than ignore them. For example, RSpec conventions in this project expect `described_class` to be used in specs that target a specific class under test.
## Benefits of rubocop_gradual
- Allows incremental adoption of code style rules
-- Prevents CI failures due to pre-existing violations
-- Provides a clear record of code style debt
+- Prevents CI failures due to temporary pre-existing violations
+- Provides a clear work list of code style debt
- Enables focused efforts on improving code quality over time
diff --git a/Rakefile b/Rakefile
index e29261c..a806bc3 100644
--- a/Rakefile
+++ b/Rakefile
@@ -6,7 +6,7 @@
# kettle-jem will then preserve content between those markers across template runs.
# kettle-jem:unfreeze
-# nomono Rakefile v7.0.0 - 2026-07-13
+# nomono Rakefile v7.1.0 - 2026-07-21
# Ruby 2.3 (Safe Navigation) or higher required
#
# See LICENSE.md for license information.
diff --git a/SECURITY.md b/SECURITY.md
index 6064c3f..9543c1a 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -4,7 +4,7 @@
| Version | Supported |
|----------|-----------|
-| 1.0.latest | ✅ |
+| 1.1.latest | ✅ |
## Security contact information
diff --git a/docs/Nomono.html b/docs/Nomono.html
index 5448353..23e4121 100644
--- a/docs/Nomono.html
+++ b/docs/Nomono.html
@@ -6,7 +6,7 @@
Module: Nomono
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -270,9 +270,9 @@
diff --git a/docs/Nomono/Error.html b/docs/Nomono/Error.html
index c616fde..7d35d01 100644
--- a/docs/Nomono/Error.html
+++ b/docs/Nomono/Error.html
@@ -6,7 +6,7 @@
Exception: Nomono::Error
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -117,9 +117,9 @@
diff --git a/docs/Nomono/GemfileDsl.html b/docs/Nomono/GemfileDsl.html
index 8a3fc19..854f32a 100644
--- a/docs/Nomono/GemfileDsl.html
+++ b/docs/Nomono/GemfileDsl.html
@@ -6,7 +6,7 @@
Module: Nomono::GemfileDsl
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -226,9 +226,9 @@
diff --git a/docs/Nomono/Resolver.html b/docs/Nomono/Resolver.html
index e41174b..7d95dd9 100644
--- a/docs/Nomono/Resolver.html
+++ b/docs/Nomono/Resolver.html
@@ -6,7 +6,7 @@
Class: Nomono::Resolver
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -146,7 +146,7 @@
- #gems(gems:, prefix: "NOMONO_GEMS", allowlist: gems, path_env: nil, vendored_gems_env: nil, vendor_gem_dir_env: nil, debug_env: nil, root: ["src", "my"], strict: true) ⇒ Object
+ #gems(gems:, prefix: "NOMONO_GEMS", allowlist: gems, path_env: nil, vendored_gems_env: nil, vendor_gem_dir_env: nil, debug_env: nil, path_aliases: nil, path_aliases_env: nil, root: ["src", "my"], strict: true, **_options) ⇒ Object
@@ -250,7 +250,7 @@ Instance Method Details
- #gems(gems:, prefix: "NOMONO_GEMS", allowlist: gems, path_env: nil, vendored_gems_env: nil, vendor_gem_dir_env: nil, debug_env: nil, root: ["src", "my"], strict: true) ⇒ Object
+ #gems(gems:, prefix: "NOMONO_GEMS", allowlist: gems, path_env: nil, vendored_gems_env: nil, vendor_gem_dir_env: nil, debug_env: nil, path_aliases: nil, path_aliases_env: nil, root: ["src", "my"], strict: true, **_options) ⇒ Object
@@ -288,13 +288,16 @@
37
38
39
-40
+40
+41
+42
+43
# File 'lib/nomono/resolver.rb', line 14
def gems(gems:, prefix: "NOMONO_GEMS", allowlist: gems, path_env: nil, vendored_gems_env: nil, vendor_gem_dir_env: nil,
- debug_env: nil, root: ["src", "my"], strict: true)
+ debug_env: nil, path_aliases: nil, path_aliases_env: nil, root: ["src", "my"], strict: true, **_options)
requested = normalize_gems(gems)
allowed = normalize_gems(allowlist)
requested.each { |gem_name| validate_gem_name!(gem_name, allowed, strict: strict) }
@@ -307,10 +310,13 @@
vendored = parse_vendored(fetch_with_fallback(vendored_gems_env || "#{prefix}_VENDORED_GEMS", "", "VENDORED_GEMS"), allowed)
vendor_dir_value = fetch_with_fallback(vendor_gem_dir_env || "#{prefix}_VENDOR_GEM_DIR", File.join(dev_root, "vendor"), "VENDOR_GEM_DIR")
vendor_dir = absolutize(vendor_dir_value)
+ aliases = normalize_path_aliases(
+ path_aliases || fetch_with_fallback(path_aliases_env || "#{prefix}_PATH_ALIASES", "", "NOMONO_PATH_ALIASES")
+ )
gem_paths = requested.each_with_object({}) do |gem_name, memo|
base = vendored.include?(gem_name) ? vendor_dir : dev_root
- memo[gem_name] = File.join(base, gem_name)
+ memo[gem_name] = normalize_path_alias(File.join(base, gem_name), aliases)
end
debug_key = debug_env || "#{prefix}_DEBUG"
@@ -330,9 +336,9 @@
diff --git a/docs/Nomono/Version.html b/docs/Nomono/Version.html
index ed941b6..bcb01f1 100644
--- a/docs/Nomono/Version.html
+++ b/docs/Nomono/Version.html
@@ -6,7 +6,7 @@
Module: Nomono::Version
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -98,7 +98,7 @@
VERSION =
- "1.0.8"
+ "1.1.0"
@@ -114,9 +114,9 @@
diff --git a/docs/_index.html b/docs/_index.html
index ead611a..d7a25a5 100644
--- a/docs/_index.html
+++ b/docs/_index.html
@@ -4,7 +4,7 @@
- Documentation by YARD 0.9.44
+ Documentation by YARD 0.9.45
@@ -54,7 +54,7 @@
- Documentation by YARD 0.9.44
+ Documentation by YARD 0.9.45
Alphabetic Index
@@ -189,9 +189,9 @@ Namespace Listing A-Z
diff --git a/docs/file.AGENTS.html b/docs/file.AGENTS.html
index 33a432c..ddb5a59 100644
--- a/docs/file.AGENTS.html
+++ b/docs/file.AGENTS.html
@@ -6,7 +6,7 @@
File: AGENTS
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -410,9 +410,9 @@ 🚫 Common Pitfalls
diff --git a/docs/file.AGPL-3.0-only.html b/docs/file.AGPL-3.0-only.html
index 672a8cb..3ab78b7 100644
--- a/docs/file.AGPL-3.0-only.html
+++ b/docs/file.AGPL-3.0-only.html
@@ -6,7 +6,7 @@
File: AGPL-3.0-only
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -342,9 +342,9 @@
diff --git a/docs/file.CHANGELOG.html b/docs/file.CHANGELOG.html
index 445a003..4abc5ec 100644
--- a/docs/file.CHANGELOG.html
+++ b/docs/file.CHANGELOG.html
@@ -6,7 +6,7 @@
File: CHANGELOG
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -70,7 +70,7 @@
and yes, platform and engine support are part of the public API.
Please file a bug if you notice a violation of semantic versioning.
-
+
Added
@@ -84,6 +84,60 @@ Fixed
Security
+
+1.1.0 - 2026-07-21
+
+
+ - TAG: v1.1.0
+
+ - COVERAGE: 97.56% – 120/123 lines in 7 files
+ - BRANCH COVERAGE: 86.67% – 39/45 branches in 7 files
+ - 12.50% documented
+
+
+Added
+
+
+ - Added opt-in path alias normalization so local sibling paths can be rewritten
+to a configured canonical spelling before Bundler writes them to lockfiles.
+
+
+Changed
+
+
+
+Fixed
+
+
+ -
+
Documented why nomono uses an explicit Gemfile loader instead of the
+Bundler plugin DSL or RubyGems plugin autoload hooks, and simplified
+nomono’s own local Gemfiles to load the local Bundler integration directly.
+
+ -
+
Addressed review feedback by keeping split license detail links pointed at
+the source repository, keeping tree_sitter_language_pack in the templating
+dependency path only, and regenerating YARD documentation.
+
+
+
1.0.8 - 2026-07-13
@@ -106,7 +160,7 @@
12.50% documented
-Fixed
+Fixed
- Package configured license files in gem release file lists.
@@ -123,7 +177,7 @@
- 8.70% documented
-Fixed
+Fixed
- Removed
version_gem from nomono’s default load path, allowing Gemfiles
@@ -145,23 +199,23 @@
- 12.50% documented
-Added
+Added
- Added support for JRuby 10.1 and TruffleRuby 34.0.
-Changed
+Changed
- Retemplated project metadata and CI/development automation with
kettle-jem v7.0.0.
-Fixed
+Fixed
- Corrected OpenCollective funding metadata to use the
kettle-dev collective.
- - Updated the default local workspace root from
$HOME/src/kettle-rb to
+ - Updated the default local workspace root from
$HOME/src/kettle-dev to
$HOME/src/my.
@@ -176,14 +230,14 @@
12.50% documented
-Changed
+Changed
- Retemplated with the current kettle-jem template set, refreshing generated
README metadata, the templating dependency floor, and the development lockfile.
-Fixed
+Fixed
- Removed a duplicate RBS
Nomono::VERSION declaration and strengthened the
@@ -201,14 +255,14 @@
- 12.50% documented
-Changed
+Changed
- Development tooling now resolves
kettle-dev 2.2.3, kettle-test 2.0.5,
kettle-soup-cover 2.0.2, and yard-fence 0.9.3 or newer.
-Fixed
+Fixed
-
@@ -231,14 +285,14 @@
- 12.50% documented
-Added
+Added
- Added StructuredMerge git diff driver configuration and the incident response
plan from the current kettle-jem template.
-Changed
+Changed
- Retemplated with the current kettle-jem template set, including the
@@ -247,7 +301,7 @@ Changed
kettle-dev 2.0.6 development dependency floor.
-Fixed
+Fixed
- Fixed generated documentation URLs that incorrectly pointed at a monorepo
@@ -267,19 +321,19 @@
- 12.50% documented
-Added
+Added
- Improved documentation of ENV variables and overrides in README.md
-Changed
+Changed
- Retemplated with the current kettle-jem template set.
-Fixed
+Fixed
- (dev) Updated the development dependency floor to
kettle-dev 2.0.1 so the
@@ -304,9 +358,9 @@
diff --git a/docs/file.CODE_OF_CONDUCT.html b/docs/file.CODE_OF_CONDUCT.html
index 323b6de..80d09d4 100644
--- a/docs/file.CODE_OF_CONDUCT.html
+++ b/docs/file.CODE_OF_CONDUCT.html
@@ -6,7 +6,7 @@
File: CODE_OF_CONDUCT
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -193,9 +193,9 @@ Attribution
diff --git a/docs/file.CONTRIBUTING.html b/docs/file.CONTRIBUTING.html
index 15456e4..d1f9aa0 100644
--- a/docs/file.CONTRIBUTING.html
+++ b/docs/file.CONTRIBUTING.html
@@ -6,7 +6,7 @@
File: CONTRIBUTING
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -94,6 +94,22 @@ Help out!
- Announce it in the channel for this org in the Discord!
+Ruby engine CI branches
+
+Pull requests run MRI workflows by default. JRuby and TruffleRuby workflows are
+available by branch naming convention so ordinary PRs do not spend CI time on
+alternate Ruby engines.
+
+
+ - Use a branch named
jruby/* to run JRuby workflows for a pull request.
+ - Use a branch named
truffleruby/* to run TruffleRuby workflows for a pull
+request.
+ - Use a branch named
engines/* to run both JRuby and TruffleRuby workflows for
+a pull request.
+
+
+Pushes to the default branch continue to run the configured engine workflows.
+
Executables vs Rake tasks
Executables shipped by dependencies, such as kettle-dev, and stone_checksums, are available
@@ -195,7 +211,7 @@ Environment Variables for L
- Use
git diff --no-ext-diff to compare against Git’s built-in diff output.
- Use
git diff --no-textconv when a textconv projection obscures the raw file bytes you need to inspect.
- If Git reports a missing
smorg-* executable, rerun bundle install and the setup command above, then check git config --local --get-regexp '^diff\.smorg-'.
- - To remove managed local entries, run
K_JEM_TEMPLATING=true kettle-jem install --undo; remove global command registrations with git config --global --unset-all diff.smorg-ruby.command.
+ - To remove managed local entries, run
K_JEM_TEMPLATING=true kettle-jem install --undo; remove global command registrations with git config --global --unset-all diff.smorg-rb.command, git config --global --unset-all merge.smorg-rb.driver, and git config --global --unset-all merge.smorg-rb.name.
For a quick starting point, this repository’s mise.toml defines the shared defaults, and .env.local can override them locally. Copy .env.local.example to .env.local, use KEY=value lines, and either activate mise in your shell or run commands through mise exec -C /path/to/project -- ....
@@ -360,9 +376,9 @@ Manual process
diff --git a/docs/file.FUNDING.html b/docs/file.FUNDING.html
index 1bc9f91..d80c1ba 100644
--- a/docs/file.FUNDING.html
+++ b/docs/file.FUNDING.html
@@ -6,7 +6,7 @@
File: FUNDING
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -101,9 +101,9 @@ Another Way to Support Open
diff --git a/docs/file.IRP.html b/docs/file.IRP.html
index a323fc1..a2fc672 100644
--- a/docs/file.IRP.html
+++ b/docs/file.IRP.html
@@ -6,7 +6,7 @@
File: IRP
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -98,9 +98,9 @@ Follow-up
diff --git a/docs/file.LICENSE.html b/docs/file.LICENSE.html
index be78b5b..cdbbd60 100644
--- a/docs/file.LICENSE.html
+++ b/docs/file.LICENSE.html
@@ -6,7 +6,7 @@
File: LICENSE
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -65,7 +65,7 @@
Choose the option that best fits your use case:
If none of the above licenses fit your use case, please contact us to discuss a custom commercial license.
@@ -78,9 +78,9 @@ Copyright Notice
diff --git a/docs/file.README.html b/docs/file.README.html
index c97f364..9255932 100644
--- a/docs/file.README.html
+++ b/docs/file.README.html
@@ -6,7 +6,7 @@
File: README
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -139,13 +139,13 @@ 💡 Info you can shake a stick at
|
| Support & Community |
-
+
|
| Source |
-
+
|
@@ -385,21 +385,23 @@ ⚙️ Configuration
NOMONO_GEMS_VENDOR_GEM_DIR (or legacy VENDOR_GEM_DIR) is the base path of the vendor directory used for gems listed in NOMONO_GEMS_VENDORED_GEMS. Defaults to $workspace_root/vendor. This is not an alternative form of the workspace root — it only affects vendored gems.
+NOMONO_GEMS_PATH_ALIASES (or global fallback NOMONO_PATH_ALIASES) is a comma-delimited list of source=canonical absolute path aliases. Each pair must resolve to the same real directory. Matching local gem paths are rewritten to the canonical spelling before Bundler receives them, preventing Gemfile.lock churn from equivalent paths such as /var/home/... and /home/....
+
NOMONO_GEMS_DEBUG enables debug output from nomono.
Examples
-For example, in the kettle-dev family of gems, which nomono is a part of, the parameters used are prefix: "KETTLE_RB", path_env: "KETTLE_RB_DEV".
+
For example, in the kettle-dev family of gems, which nomono is a part of, the parameters used are prefix: "KETTLE_DEV", path_env: "KETTLE_DEV_DEV".
This means that the following is true:
-
-
KETTLE_RB_DEV=false (or unset) — released gems from configured gem server (CI / single-gem development default)
+KETTLE_DEV_DEV=false (or unset) — released gems from configured gem server (CI / single-gem development default)
-
-
KETTLE_RB_DEV=true — local sibling gems from $HOME/src/kettle-dev/<gem> (recommended for full-workspace development)
+KETTLE_DEV_DEV=true — local sibling gems from $HOME/src/kettle-dev/<gem> (recommended for full-workspace development)
-
-
KETTLE_RB_DEV=/custom/path — local sibling gems from /custom/path/<gem> (non-standard workspace layout only)
+KETTLE_DEV_DEV=/custom/path — local sibling gems from /custom/path/<gem> (non-standard workspace layout only)
You can override the env variable names via options. Here is an example for use with rubocop-lts gems:
@@ -422,10 +424,10 @@ 🔧 Basic Usage
source "https://gem.coop"
-if ENV.fetch("KETTLE_RB_DEV", "false").casecmp("false").zero?
+if ENV.fetch("KETTLE_DEV_DEV", "false").casecmp("false").zero?
gem "kettle-dev", "~> 2.2", ">= 2.2.15"
gem "kettle-test", "~> 2.0", ">= 2.0.6"
- gem "kettle-soup-cover", "~> 3.0.a", ">= 3.0.0.rc4"
+ gem "kettle-soup-cover", "~> 3.0", ">= 3.0.1"
else
eval_gemfile "gemfiles/modular/local.gemfile"
end
@@ -437,8 +439,11 @@ 🔧 Basic Usage
eval_nomono_gems(
gems: %w[kettle-dev kettle-test kettle-soup-cover],
- prefix: "KETTLE_RB",
- path_env: "KETTLE_RB_DEV",
+ prefix: "KETTLE_DEV",
+ path_env: "KETTLE_DEV_DEV",
+ path_aliases: {
+ "/var/home/pboling" => "/home/pboling"
+ },
vendored_gems_env: "VENDORED_GEMS",
vendor_gem_dir_env: "VENDOR_GEM_DIR",
debug_env: "KETTLE_DEV_DEBUG"
@@ -447,9 +452,22 @@ 🔧 Basic Usage
This is the pattern generated by kettle-jem: the Gemfile remains readable,
and nomono owns the path normalization for sibling repositories. When
-KETTLE_RB_DEV=false or is unset, the modular local override is skipped and
+KETTLE_DEV_DEV=false or is unset, the modular local override is skipped and
Bundler resolves released gems normally.
+nomono uses an explicit require "nomono/bundler" loader instead of the
+Bundler plugin DSL. Bundler plugins are installed extensions for Bundler
+commands, source handlers, and lifecycle hooks; nomono only needs to install
+Gemfile macros while Bundler is evaluating a Gemfile. The root Gemfile should
+declare the compatible nomono version, and modular local Gemfiles should fail
+normally if that loader is unavailable or incompatible.
+
+nomono also avoids RubyGems plugin autoload hooks for this path. Those hooks
+are appropriate for gems that must globally patch RubyGems or Bundler before
+dependency resolution can work. Local sibling overrides do not need cold-boot
+global patches: the root Gemfile installs nomono, and the ENV-gated modular
+Gemfile explicitly loads the macros only when it needs them.
+
🔐 Security
See SECURITY.md.
@@ -536,7 +554,7 @@ 📌 Versioning
📄 License
-The gem is available under the following license: AGPL-3.0-only.
+
The gem is available under the following license: AGPL-3.0-only.
See LICENSE.md for details.
If none of the available licenses suit your use case, please contact us to discuss a custom commercial license.
@@ -590,9 +608,9 @@ Please give the project a star ⭐ ♥
diff --git a/docs/file.RUBOCOP.html b/docs/file.RUBOCOP.html
index 6b0ac26..bd82bbc 100644
--- a/docs/file.RUBOCOP.html
+++ b/docs/file.RUBOCOP.html
@@ -6,7 +6,7 @@
File: RUBOCOP
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -89,12 +89,14 @@ Checking RuboCop Violations
Understanding the Lock File
-
The .rubocop_gradual.lock file tracks all current RuboCop violations in the project. This allows the team to:
+The .rubocop_gradual.lock file is a work list, not a permanent baseline. Every entry represents a style issue that should be resolved by either fixing the code or making an intentional exception explicit.
+
+This allows the team to:
- - Prevent new violations while gradually fixing existing ones
+ - Prevent new violations while existing issues are handled deliberately
- Track progress on code style improvements
- - Ensure CI builds don’t fail due to pre-existing violations
+ - Distinguish temporary work items from intentional project style exceptions
Common Commands
@@ -126,29 +128,30 @@ Workflow
- Before submitting a PR, run
bundle exec rake rubocop_gradual:autocorrect
a. or just the default bundle exec rake, as autocorrection is a pre-requisite of the default task.
- - If there are new violations, either:
+
- If there are violations, either:
- Fix them in your code
- - Run
bundle exec rake rubocop_gradual:force_update to update the lock file (only for violations you can’t fix immediately)
+ - Normalize intentional deviations with an explicit config or inline exception
+ - Run
bundle exec rake rubocop_gradual:force_update only for temporary work items you cannot fix immediately
- Commit the updated
.rubocop_gradual.lock file along with your changes
-Never add inline RuboCop disables
+Explicit Style Exceptions
-Do not add inline rubocop:disable / rubocop:enable comments anywhere in the codebase (including specs, except when following the few existing rubocop:disable patterns for a rule already being disabled elsewhere in the code). We handle exceptions in two supported ways:
+Do not treat .rubocop_gradual.lock as a baseline. Treat it as a list of work that must be fixed or normalized into the styleguide.
-
- - Permanent/structural exceptions: prefer adjusting the RuboCop configuration (e.g., in
.rubocop.yml) to exclude a rule for a path or file pattern when it makes sense project-wide.
- - Temporary exceptions while improving code: record the current violations in
.rubocop_gradual.lock via the gradual workflow:
-
- -
-
bundle exec rake rubocop_gradual:autocorrect (preferred; will autocorrect what it can and update the lock only if no new violations were introduced)
- - If needed,
bundle exec rake rubocop_gradual:force_update (as a last resort when you cannot fix the newly reported violations immediately)
-
-
-
+Prefer this order:
+
+
+ - Fix the code so it follows the configured styleguide.
+ - For intentional project conventions, add the narrowest useful override in
.rubocop.yml or .rubocop_rspec.yml.
+ - For local intentional deviations, add a tightly scoped inline
rubocop:disable / rubocop:enable around the exact line or block.
+ - Keep an entry in
.rubocop_gradual.lock only as temporary work to be resolved later.
+
+
+Use configuration overrides when a deviation is structural, generated, path-specific, or applies consistently to a small set of files. Use inline disables when the exception is local and the reason is clearer at the code site than in global config.
In general, treat the rules as guidance to follow; fix violations rather than ignore them. For example, RSpec conventions in this project expect described_class to be used in specs that target a specific class under test.
@@ -156,16 +159,16 @@ Benefits of rubocop_gradual
- Allows incremental adoption of code style rules
- - Prevents CI failures due to pre-existing violations
- - Provides a clear record of code style debt
+ - Prevents CI failures due to temporary pre-existing violations
+ - Provides a clear work list of code style debt
- Enables focused efforts on improving code quality over time
diff --git a/docs/file.SECURITY.html b/docs/file.SECURITY.html
index 829aaff..33b8e6c 100644
--- a/docs/file.SECURITY.html
+++ b/docs/file.SECURITY.html
@@ -6,7 +6,7 @@
File: SECURITY
- — Documentation by YARD 0.9.44
+ — Documentation by YARD 0.9.45
@@ -72,7 +72,7 @@ Supported Versions
- | 1.0.latest |
+ 1.1.latest |
✅ |
@@ -93,9 +93,9 @@ Additional Support
diff --git a/docs/frames.html b/docs/frames.html
index 3223ddd..4a6186c 100644
--- a/docs/frames.html
+++ b/docs/frames.html
@@ -2,7 +2,7 @@
- Documentation by YARD 0.9.44
+ Documentation by YARD 0.9.45