From 98eb6b8abac07dba4ad6768e076b20fad27ba99a Mon Sep 17 00:00:00 2001 From: Tyler Jang Date: Tue, 12 May 2026 21:12:29 +0000 Subject: [PATCH 1/2] repro and fix --- .github/actions/test_ruby_gem_uploads/Gemfile | 1 + .../test_ruby_gem_uploads/Gemfile.lock | 52 +++++++++++++++++++ .../test_ruby_gem_uploads/spec/test_spec.rb | 10 ++++ .../lib/trunk_spec_helper.rb | 20 ++++--- 4 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 .github/actions/test_ruby_gem_uploads/Gemfile.lock diff --git a/.github/actions/test_ruby_gem_uploads/Gemfile b/.github/actions/test_ruby_gem_uploads/Gemfile index 027aa6dc..16522d0e 100644 --- a/.github/actions/test_ruby_gem_uploads/Gemfile +++ b/.github/actions/test_ruby_gem_uploads/Gemfile @@ -3,6 +3,7 @@ source 'https://rubygems.org' gem 'rspec' +gem 'coderay' gem 'knapsack_pro' gem 'rake' gem 'rake-compiler' diff --git a/.github/actions/test_ruby_gem_uploads/Gemfile.lock b/.github/actions/test_ruby_gem_uploads/Gemfile.lock new file mode 100644 index 00000000..e33dc946 --- /dev/null +++ b/.github/actions/test_ruby_gem_uploads/Gemfile.lock @@ -0,0 +1,52 @@ +PATH + remote: ../../../rspec-trunk-flaky-tests + specs: + rspec_trunk_flaky_tests (0.0.0) + rb_sys (= 0.9.124) + rspec-core (> 3.3) + +GEM + remote: https://rubygems.org/ + specs: + coderay (1.1.3) + diff-lcs (1.6.2) + knapsack_pro (10.0.0) + rake + thor (~> 1.4) + logger (1.7.0) + rake (13.4.2) + rake-compiler (1.3.1) + rake + rake-compiler-dock (1.11.0) + rb_sys (0.9.124) + rake-compiler-dock (= 1.11.0) + rspec (3.13.2) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-core (3.13.6) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.5) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.8) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-support (3.13.7) + thor (1.5.0) + +PLATFORMS + ruby + x86_64-linux + +DEPENDENCIES + coderay + knapsack_pro + logger + rake + rake-compiler + rspec + rspec_trunk_flaky_tests! + +BUNDLED WITH + 2.5.23 diff --git a/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb b/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb index 529018e3..bf66ef19 100644 --- a/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb +++ b/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb @@ -4,7 +4,17 @@ def square(val) val * val end +ANSI_ESCAPE_PATTERN = /(?:\e[@-Z\\-_]|\e\[[0-?]*[ -\/]*[@-~])/.freeze + describe 'simple_test' do + around do |example| + original_color_mode = RSpec.configuration.color_mode + RSpec.configuration.color_mode = :on + example.run + ensure + RSpec.configuration.color_mode = original_color_mode + end + [1, 2, 3].each do |i| it do expect(square(i)).to eq(i * i) diff --git a/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb b/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb index 896ee845..5eade9d5 100644 --- a/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb +++ b/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb @@ -54,10 +54,16 @@ def yellow end end +ANSI_ESCAPE_PATTERN = /(?:\e[@-Z\\-_]|\e\[[0-?]*[ -\/]*[@-~])/.freeze + def escape(str) str.dump[1..-2] end +def strip_ansi_codes(text) + text.to_s.gsub(ANSI_ESCAPE_PATTERN, '') +end + # Knapsack example detector instantiates all test cases in order to determine how to shard them # These instantiations should not generate test bundles, so we # disable the gem when running under knapsack_pro:rspec_test_example_detector @@ -204,7 +210,7 @@ def format_exception_message(exception, example) return '' unless exception presenter = RSpec::Core::Formatters::ExceptionPresenter.new(exception, example) - presenter.fully_formatted(nil, PlainColorizer) + strip_ansi_codes(presenter.fully_formatted(nil, PlainColorizer)) rescue StandardError legacy_format_exception_message(exception) end @@ -230,7 +236,7 @@ def format_exception_backtrace(exception, example) # and after hooks, so we fall back to the legacy formatter return legacy_format_exception_backtrace(exception) if result.strip.empty? - result + strip_ansi_codes(result) rescue StandardError legacy_format_exception_backtrace(exception) end @@ -246,9 +252,9 @@ def legacy_format_exception_message(exception) case exception when RSpec::Core::MultipleExceptionError messages = exception.all_exceptions.map { |e| "#{e.class}: #{e.message}" } - "#{exception.class}: #{messages.join(' | ')}" + strip_ansi_codes("#{exception.class}: #{messages.join(' | ')}") else - exception.to_s + strip_ansi_codes(exception.to_s) end end @@ -256,15 +262,15 @@ def legacy_format_exception_message(exception) def legacy_format_exception_backtrace(exception) case exception when RSpec::Core::MultipleExceptionError - exception.all_exceptions.map do |e| + strip_ansi_codes(exception.all_exceptions.map do |e| if e.backtrace && !e.backtrace.empty? "#{e.class}: #{e.message}\n#{e.backtrace.join("\n")}" else "#{e.class}: #{e.message}" end - end.join("\n\n") + end.join("\n\n")) else - exception.backtrace&.join("\n") || '' + strip_ansi_codes(exception.backtrace&.join("\n") || '') end end From 35428e2a6ae1e0a1ab332a875b276e243a8f2d2c Mon Sep 17 00:00:00 2001 From: Tyler Jang Date: Tue, 12 May 2026 21:20:31 +0000 Subject: [PATCH 2/2] clenaup; --- .github/actions/test_ruby_gem_uploads/spec/test_spec.rb | 2 -- rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb b/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb index bf66ef19..020fe192 100644 --- a/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb +++ b/.github/actions/test_ruby_gem_uploads/spec/test_spec.rb @@ -4,8 +4,6 @@ def square(val) val * val end -ANSI_ESCAPE_PATTERN = /(?:\e[@-Z\\-_]|\e\[[0-?]*[ -\/]*[@-~])/.freeze - describe 'simple_test' do around do |example| original_color_mode = RSpec.configuration.color_mode diff --git a/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb b/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb index 5eade9d5..3f8d0573 100644 --- a/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb +++ b/rspec-trunk-flaky-tests/lib/trunk_spec_helper.rb @@ -54,7 +54,7 @@ def yellow end end -ANSI_ESCAPE_PATTERN = /(?:\e[@-Z\\-_]|\e\[[0-?]*[ -\/]*[@-~])/.freeze +ANSI_ESCAPE_PATTERN = %r{(?:\e[@-Z\\-_]|\e\[[0-?]*[ -/]*[@-~])} def escape(str) str.dump[1..-2] @@ -215,7 +215,7 @@ def format_exception_message(exception, example) legacy_format_exception_message(exception) end -# trunk-ignore(rubocop/Metrics/MethodLength) +# trunk-ignore(rubocop/Metrics/MethodLength,rubocop/Metrics/AbcSize) def format_exception_backtrace(exception, example) return '' unless exception @@ -258,7 +258,7 @@ def legacy_format_exception_message(exception) end end -# trunk-ignore(rubocop/Metrics/MethodLength) +# trunk-ignore(rubocop/Metrics/MethodLength,rubocop/Metrics/AbcSize) def legacy_format_exception_backtrace(exception) case exception when RSpec::Core::MultipleExceptionError