From 9a1bbb21a23537f3cf7718d18e4d0b6423c7469d Mon Sep 17 00:00:00 2001 From: "Daniel (dB.) Doubrovkine" Date: Tue, 30 Dec 2025 11:25:11 -0500 Subject: [PATCH 1/4] Update Danger workflow to use reusable workflow. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrate from inline Danger workflow steps to numbata/danger-pr-comment reusable workflow for better maintainability and consistency. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .github/workflows/danger-comment.yml | 10 ++++++++++ .github/workflows/danger.yml | 20 ++++---------------- Dangerfile | 2 ++ Gemfile | 5 +++-- 4 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/danger-comment.yml diff --git a/.github/workflows/danger-comment.yml b/.github/workflows/danger-comment.yml new file mode 100644 index 0000000..fe62a0e --- /dev/null +++ b/.github/workflows/danger-comment.yml @@ -0,0 +1,10 @@ +name: danger comment +on: + workflow_run: + workflows: [Danger] + types: [completed] + +jobs: + comment: + uses: numbata/danger-pr-comment/.github/workflows/danger-comment.yml@main + secrets: inherit diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml index c643c4b..73d97c7 100644 --- a/.github/workflows/danger.yml +++ b/.github/workflows/danger.yml @@ -1,22 +1,10 @@ ---- name: danger + on: pull_request: types: [opened, reopened, edited, synchronize] + jobs: danger: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.7 - bundler-cache: true - - name: Run Danger - run: | - # the personal token is public, this is ok, base64 encode to avoid tripping Github - TOKEN=$(echo -n Z2hwX0xNQ3VmanBFeTBvYkZVTWh6NVNqVFFBOEUxU25abzBqRUVuaAo= | base64 --decode) - DANGER_GITHUB_API_TOKEN=$TOKEN bundle exec danger --verbose + uses: numbata/danger-pr-comment/.github/workflows/danger-run.yml@main + secrets: inherit diff --git a/Dangerfile b/Dangerfile index a0a4a57..b4bc366 100644 --- a/Dangerfile +++ b/Dangerfile @@ -1,4 +1,6 @@ # frozen_string_literal: true +danger.import_dangerfile(gem: 'danger-pr-comment') + changelog.check! toc.check! diff --git a/Gemfile b/Gemfile index dc4319a..13b4c0c 100644 --- a/Gemfile +++ b/Gemfile @@ -8,8 +8,9 @@ gem 'rake' group :development, :test do gem 'danger' - gem 'danger-changelog', '0.6.1' - gem 'danger-toc', '0.2.0' + gem 'danger-changelog' + gem 'danger-toc' + gem 'danger-pr-comment' gem 'rspec', '~> 3.0' gem 'rubocop', '~> 1.0' gem 'rubocop-rake' From a9108a6583b3f916c28d9bf8a91941286c8ad614 Mon Sep 17 00:00:00 2001 From: "Daniel (dB.) Doubrovkine" Date: Tue, 30 Dec 2025 11:46:46 -0500 Subject: [PATCH 2/4] Upgraded RuboCop to 1.82.1. --- .rubocop.yml | 34 ++++++++++++--- .rubocop_todo.yml | 67 +---------------------------- Gemfile | 6 +-- lib/ruby-enum/errors/base.rb | 4 +- spec/ruby-enum/enum/case_spec.rb | 69 +++++++++++++++--------------- spec/ruby-enum/enum_spec.rb | 72 ++++++++++++++------------------ spec_i18n/spec/i18n_spec.rb | 16 +++---- 7 files changed, 111 insertions(+), 157 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 1f7eac4..a71c181 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,7 +1,3 @@ -require: - - rubocop-rake - - rubocop-rspec - AllCops: TargetRubyVersion: 2.7 NewCops: enable @@ -15,7 +11,7 @@ Metrics/BlockLength: RSpec/SpecFilePathFormat: Enabled: false -RSpec/FilePath: +Style/LineLength: Enabled: false Style/HashEachMethods: @@ -27,4 +23,32 @@ Style/HashTransformKeys: Style/HashTransformValues: Enabled: true +Naming/FileName: + Enabled: false + +Style/Documentation: + Enabled: false + +Naming/MethodParameterName: + Enabled: false + +RSpec/NestedGroups: + Enabled: false + +RSpec/ExampleLength: + Enabled: false + +RSpec/MultipleExpectations: + Enabled: false + +Lint/ConstantDefinitionInBlock: + Enabled: false + +RSpec/LeakyConstantDeclaration: + Enabled: false + inherit_from: .rubocop_todo.yml + +plugins: + - rubocop-rake + - rubocop-rspec diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 9039cdc..00ce58d 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,72 +1,7 @@ # This configuration was generated by # `rubocop --auto-gen-config` -# on 2023-02-14 01:34:25 UTC using RuboCop version 1.45.1. +# on 2025-12-30 16:44:41 UTC using RuboCop version 1.82.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. - -# Offense count: 4 -# Configuration parameters: AllowedMethods. -# AllowedMethods: enums -Lint/ConstantDefinitionInBlock: - Exclude: - - 'spec/ruby-enum/enum_spec.rb' - -# Offense count: 1 -# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms. -# CheckDefinitionPathHierarchyRoots: lib, spec, test, src -# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS -Naming/FileName: - Exclude: - - 'lib/ruby-enum.rb' - -# Offense count: 6 -# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames. -# AllowedNames: as, at, by, cc, db, id, if, in, io, ip, of, on, os, pp, to -Naming/MethodParameterName: - Exclude: - - 'lib/ruby-enum/enum.rb' - -# Offense count: 3 -# Configuration parameters: CountAsOne. -RSpec/ExampleLength: - Max: 11 - -# Offense count: 4 -RSpec/LeakyConstantDeclaration: - Exclude: - - 'spec/ruby-enum/enum_spec.rb' - -# Offense count: 6 -RSpec/MultipleExpectations: - Max: 11 - -# Offense count: 18 -# Configuration parameters: EnforcedStyle, IgnoreSharedExamples. -# SupportedStyles: always, named_only -RSpec/NamedSubject: - Exclude: - - 'spec/ruby-enum/enum_spec.rb' - -# Offense count: 1 -# Configuration parameters: AllowedGroups. -RSpec/NestedGroups: - Max: 4 - -# Offense count: 4 -# Configuration parameters: AllowedConstants. -Style/Documentation: - Exclude: - - 'spec/**/*' - - 'test/**/*' - - 'lib/ruby-enum/enum.rb' - - 'lib/ruby-enum/errors/base.rb' - - 'lib/ruby-enum/errors/uninitialized_constant_error.rb' - -# Offense count: 1 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns. -# URISchemes: http, https -Layout/LineLength: - Max: 148 diff --git a/Gemfile b/Gemfile index 13b4c0c..a2a9cd5 100644 --- a/Gemfile +++ b/Gemfile @@ -9,10 +9,10 @@ gem 'rake' group :development, :test do gem 'danger' gem 'danger-changelog' - gem 'danger-toc' gem 'danger-pr-comment' - gem 'rspec', '~> 3.0' - gem 'rubocop', '~> 1.0' + gem 'danger-toc' + gem 'rspec' + gem 'rubocop', '1.82.1' gem 'rubocop-rake' gem 'rubocop-rspec' end diff --git a/lib/ruby-enum/errors/base.rb b/lib/ruby-enum/errors/base.rb index 5ab2ee1..5e2dfdb 100644 --- a/lib/ruby-enum/errors/base.rb +++ b/lib/ruby-enum/errors/base.rb @@ -26,10 +26,10 @@ def compose_message(key, attributes = {}) "\nSummary:\n #{@summary}" + "\nResolution:\n #{@resolution}" end - private - BASE_KEY = 'ruby.enum.errors.messages' # :nodoc: + private + # Given the key of the specific error and the options hash, translate the # message. # diff --git a/spec/ruby-enum/enum/case_spec.rb b/spec/ruby-enum/enum/case_spec.rb index 8e7c588..f3b6395 100644 --- a/spec/ruby-enum/enum/case_spec.rb +++ b/spec/ruby-enum/enum/case_spec.rb @@ -2,55 +2,56 @@ require 'spec_helper' -RSpec.describe Ruby::Enum::Case do - test_enum = - Class.new do - include Ruby::Enum - include Ruby::Enum::Case - - define :RED, :red - define :GREEN, :green - define :BLUE, :blue - end +module Case + class Colors + include Ruby::Enum + include Ruby::Enum::Case + + define :RED, :red + define :GREEN, :green + define :BLUE, :blue + end +end +RSpec.describe Ruby::Enum::Case do describe '.case' do context 'when all cases are defined' do - subject { test_enum.case(test_enum::RED, cases) } + subject { Case::Colors.case(Case::Colors::RED, cases) } let(:cases) do { - [test_enum::RED, test_enum::GREEN] => -> { 'red or green' }, - test_enum::BLUE => -> { 'blue' } + [Case::Colors::RED, Case::Colors::GREEN] => -> { 'red or green' }, + Case::Colors::BLUE => -> { 'blue' } } end it { is_expected.to eq('red or green') } context 'when the value is nil' do - subject { test_enum.case(nil, cases) } + subject { Case::Colors.case(nil, cases) } it { is_expected.to be_nil } end context 'when the value is empty' do - subject { test_enum.case('', cases) } + subject { Case::Colors.case('', cases) } it { is_expected.to be_nil } end context 'when the value is the value of the enum' do - subject { test_enum.case(:red, cases) } + subject { Case::Colors.case(:red, cases) } it { is_expected.to eq('red or green') } end context 'when the value is used inside the lambda' do - subject { test_enum.case(test_enum::RED, cases) } + subject { Case::Colors.case(Case::Colors::RED, cases) } let(:cases) do { - [test_enum::RED, test_enum::GREEN] => ->(color) { "is #{color}" }, - test_enum::BLUE => -> { 'blue' } + [Case::Colors::RED, Case::Colors::GREEN] => ->(color) { "is #{color}" }, + Case::Colors::BLUE => -> { 'blue' } } end @@ -60,12 +61,12 @@ context 'when there are mutliple matches' do subject do - test_enum.case( - test_enum::RED, + Case::Colors.case( + Case::Colors::RED, { - [test_enum::RED, test_enum::GREEN] => -> { 'red or green' }, - test_enum::RED => -> { 'red' }, - test_enum::BLUE => -> { 'blue' } + [Case::Colors::RED, Case::Colors::GREEN] => -> { 'red or green' }, + Case::Colors::RED => -> { 'red' }, + Case::Colors::BLUE => -> { 'blue' } } ) end @@ -76,9 +77,9 @@ context 'when not all cases are defined' do it 'raises an error' do expect do - test_enum.case( - test_enum::RED, - { [test_enum::RED, test_enum::GREEN] => -> { 'red or green' } } + Case::Colors.case( + Case::Colors::RED, + { [Case::Colors::RED, Case::Colors::GREEN] => -> { 'red or green' } } ) end.to raise_error(Ruby::Enum::Case::ClassMethods::NotAllCasesHandledError) end @@ -87,10 +88,10 @@ context 'when not all cases are defined but :else is specified (default case)' do it 'does not raise an error' do expect do - result = test_enum.case( - test_enum::BLUE, + result = Case::Colors.case( + Case::Colors::BLUE, { - [test_enum::RED, test_enum::GREEN] => -> { 'red or green' }, + [Case::Colors::RED, Case::Colors::GREEN] => -> { 'red or green' }, else: -> { 'blue' } } ) @@ -103,11 +104,11 @@ context 'when a superfluous case is defined' do it 'raises an error' do expect do - test_enum.case( - test_enum::RED, + Case::Colors.case( + Case::Colors::RED, { - [test_enum::RED, test_enum::GREEN] => -> { 'red or green' }, - test_enum::BLUE => -> { 'blue' }, + [Case::Colors::RED, Case::Colors::GREEN] => -> { 'red or green' }, + Case::Colors::BLUE => -> { 'blue' }, :something => -> { 'green' } } ) diff --git a/spec/ruby-enum/enum_spec.rb b/spec/ruby-enum/enum_spec.rb index bd0f1c9..adff941 100644 --- a/spec/ruby-enum/enum_spec.rb +++ b/spec/ruby-enum/enum_spec.rb @@ -2,22 +2,21 @@ require 'spec_helper' -class Colors - include Ruby::Enum - - define :RED, 'red' - define :GREEN, 'green' -end +describe Ruby::Enum do + class Colors + include Ruby::Enum -class FirstSubclass < Colors - define :ORANGE, 'orange' -end + define :RED, 'red' + define :GREEN, 'green' + end -class SecondSubclass < FirstSubclass - define :PINK, 'pink' -end + class FirstSubclass < Colors + define :ORANGE, 'orange' + end -describe Ruby::Enum do + class SecondSubclass < FirstSubclass + define :PINK, 'pink' + end it 'returns an enum value' do expect(Colors::RED).to eq 'red' expect(Colors::GREEN).to eq 'green' @@ -250,29 +249,23 @@ class EmptyEnums end context 'when defining a 2 level depth subclass' do - subject { SecondSubclass } - it 'contains its own enums and all the enums defined in the parent classes' do - expect(subject::RED).to eq 'red' - expect(subject::GREEN).to eq 'green' - expect(subject::ORANGE).to eq 'orange' - expect(subject::PINK).to eq 'pink' + expect(SecondSubclass::RED).to eq 'red' + expect(SecondSubclass::GREEN).to eq 'green' + expect(SecondSubclass::ORANGE).to eq 'orange' + expect(SecondSubclass::PINK).to eq 'pink' end describe '#values' do - subject { SecondSubclass.values } - it 'contains the values from all of the parent classes' do - expect(subject).to eq(%w[red green orange pink]) + expect(SecondSubclass.values).to eq(%w[red green orange pink]) end end end describe '#values' do - subject { FirstSubclass.values } - it 'contains the values from the parent class' do - expect(subject).to eq(%w[red green orange]) + expect(FirstSubclass.values).to eq(%w[red green orange]) end end end @@ -280,41 +273,40 @@ class EmptyEnums describe 'default value' do class Default include Ruby::Enum + define :KEY end - subject { Default::KEY } - it 'equals the key' do - expect(subject).to eq(:KEY) + expect(Default::KEY).to eq(:KEY) end end describe 'non constant definitions' do class States include Ruby::Enum + define :created, 'Created' define :published, 'Published' define :undefined end - subject { States } it 'behaves like an enum' do - expect(subject.created).to eq 'Created' - expect(subject.published).to eq 'Published' - expect(subject.undefined).to eq :undefined + expect(States.created).to eq 'Created' + expect(States.published).to eq 'Published' + expect(States.undefined).to eq :undefined - expect(subject.key?(:created)).to be true - expect(subject.key('Created')).to eq :created + expect(States.key?(:created)).to be true + expect(States.key('Created')).to eq :created - expect(subject.value?('Created')).to be true - expect(subject.value(:created)).to eq 'Created' + expect(States.value?('Created')).to be true + expect(States.value(:created)).to eq 'Created' - expect(subject.key?(:undefined)).to be true - expect(subject.key(:undefined)).to eq :undefined + expect(States.key?(:undefined)).to be true + expect(States.key(:undefined)).to eq :undefined - expect(subject.value?(:undefined)).to be true - expect(subject.value(:undefined)).to eq :undefined + expect(States.value?(:undefined)).to be true + expect(States.value(:undefined)).to eq :undefined end end end diff --git a/spec_i18n/spec/i18n_spec.rb b/spec_i18n/spec/i18n_spec.rb index 653b9ed..4de14ec 100644 --- a/spec_i18n/spec/i18n_spec.rb +++ b/spec_i18n/spec/i18n_spec.rb @@ -2,18 +2,20 @@ require 'spec_helper' -test_class = Class.new do - include Ruby::Enum +module I18n + class Colors + include Ruby::Enum - define :RED, 'red' - define :GREEN, 'green' + define :RED, 'red' + define :GREEN, 'green' + end end describe Ruby::Enum do context 'when the i18n gem is not loaded' do it 'raises UninitializedConstantError on an invalid constant' do expect do - test_class::ANYTHING + I18n::Colors::ANYTHING end.to raise_error Ruby::Enum::Errors::UninitializedConstantError, /ruby.enum.errors.messages.uninitialized_constant.summary/ end @@ -24,7 +26,7 @@ it 'raises DuplicateKeyError' do expect do - test_class.class_eval do + I18n::Colors.class_eval do define :RED, 'some' end end.to raise_error Ruby::Enum::Errors::DuplicateKeyError, /ruby.enum.errors.messages.duplicate_key.message/ @@ -38,7 +40,7 @@ it 'raises a DuplicateValueError' do expect do - test_class.class_eval do + I18n::Colors.class_eval do define :Other, 'red' end end.to raise_error Ruby::Enum::Errors::DuplicateValueError, /ruby.enum.errors.messages.duplicate_value.summary/ From 2a4920efe3d960f0fc21bacd9a3e8e9226e220f0 Mon Sep 17 00:00:00 2001 From: "Daniel (dB.) Doubrovkine" Date: Tue, 30 Dec 2025 11:48:30 -0500 Subject: [PATCH 3/4] Remove deprecated --path flag from bundle install. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The --path flag has been removed in newer Bundler versions. The ruby/setup-ruby action handles bundler caching automatically. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cdbde68..d908c7a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.entry.ruby }} - - run: bundle install --jobs=3 --retry=3 --path=vendor/bundle + - run: bundle install --jobs=3 --retry=3 - run: bundle exec rake spec continue-on-error: ${{ matrix.entry.allowed-failure }} - name: Specs for when the i18n gem is not available From ac5980e20e55386b8b12b25e63a10daabb75fa93 Mon Sep 17 00:00:00 2001 From: "Daniel (dB.) Doubrovkine" Date: Tue, 30 Dec 2025 11:55:19 -0500 Subject: [PATCH 4/4] Configure Ruby version and bundler cache for Danger workflow. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .github/workflows/danger.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml index 73d97c7..bb0f070 100644 --- a/.github/workflows/danger.yml +++ b/.github/workflows/danger.yml @@ -8,3 +8,6 @@ jobs: danger: uses: numbata/danger-pr-comment/.github/workflows/danger-run.yml@main secrets: inherit + with: + ruby-version: '3.1' + bundler-cache: true