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.

    -

    Unreleased

    +

    Unreleased

    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

    + +
      +
    • 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

    @@ -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 @@ 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 -Join Me on Daily.dev's RubyFriends Live Chat on Discord Get help from me on Upwork Get help from me on Codementor +Join Me on Daily.dev's RubyFriends Get help from RubyForum Live Chat on Discord Get help from me on Upwork Get help from me on Codementor Source -Source on GitLab.com Source on CodeBerg.org Source on Github.com The best SHA: dQw4w9WgXcQ! +Source on GitLab.com Source on CodeBerg.org Source on GitHub.com The best SHA: dQw4w9WgXcQ! @@ -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:

    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:

      -
    1. Prevent new violations while gradually fixing existing ones
    2. +
    3. Prevent new violations while existing issues are handled deliberately
    4. Track progress on code style improvements
    5. -
    6. Ensure CI builds don’t fail due to pre-existing violations
    7. +
    8. Distinguish temporary work items from intentional project style exceptions

    Common Commands

    @@ -126,29 +128,30 @@

    Workflow

    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. -
    3. If there are new violations, either: +
    4. 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
    5. 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.

    - +

    Prefer this order:

    + +
      +
    1. Fix the code so it follows the configured styleguide.
    2. +
    3. For intentional project conventions, add the narrowest useful override in .rubocop.yml or .rubocop_rspec.yml.
    4. +
    5. For local intentional deviations, add a tightly scoped inline rubocop:disable / rubocop:enable around the exact line or block.
    6. +
    7. Keep an entry in .rubocop_gradual.lock only as temporary work to be resolved later.
    8. +
    + +

    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

    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