From 63398c8c20097309e42ee786e00b633b9dd87bdf Mon Sep 17 00:00:00 2001 From: Benoit Tigeot Date: Fri, 19 Oct 2018 13:00:18 +0200 Subject: [PATCH 1/3] [core] Handle RSpec description with japanese char in CP932 encoded files When the user create a test with CP932 encoding and japanese chars RSpec fail to properly display characters or crash with the error: > Encoding::CompatibilityError: incompatible character encodings: Windows-31J and UTF-8 Fix: - https://github.com/rspec/rspec-core/issues/2570 - https://github.com/rspec/rspec-core/issues/2543 For Ruby 1.8.7 We are following the same behavior as for rspec-support https://github.com/rspec/rspec-support/blob/9940a8656071655b807f772f36101b4d27f1b67d/lib/rspec/support/spec/string_matcher.rb#L8 --- This commit was imported from https://github.com/rspec/rspec-core/commit/05611c58d19ce5d9090bd8a20006ec52abdd424b. --- .../core/formatters/exception_presenter.rb | 12 +++++++++++- .../core/formatters/exception_presenter_spec.rb | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/rspec-core/lib/rspec/core/formatters/exception_presenter.rb b/rspec-core/lib/rspec/core/formatters/exception_presenter.rb index 155c99702..05348082a 100644 --- a/rspec-core/lib/rspec/core/formatters/exception_presenter.rb +++ b/rspec-core/lib/rspec/core/formatters/exception_presenter.rb @@ -81,7 +81,7 @@ def fully_formatted(failure_number, colorizer=::RSpec::Core::Formatters::Console def fully_formatted_lines(failure_number, colorizer) lines = [ - description, + encoded_description(description), detail_formatter.call(example, colorizer), formatted_message_and_backtrace(colorizer), extra_detail_formatter.call(failure_number, colorizer), @@ -244,6 +244,16 @@ def formatted_message_and_backtrace(colorizer) end end + def encoded_description(description) + return if description.nil? + + if String.method_defined?(:encoding) + encoded_string(description) + else # for 1.8.7 + description + end + end + def exception_backtrace exception.backtrace || [] end diff --git a/rspec-core/spec/rspec/core/formatters/exception_presenter_spec.rb b/rspec-core/spec/rspec/core/formatters/exception_presenter_spec.rb index 602abffb7..788d27def 100644 --- a/rspec-core/spec/rspec/core/formatters/exception_presenter_spec.rb +++ b/rspec-core/spec/rspec/core/formatters/exception_presenter_spec.rb @@ -94,6 +94,23 @@ module RSpec::Core EOS end + if String.method_defined?(:encoding) + it 'allows the caller to add encoded description' do + the_presenter = Formatters::ExceptionPresenter.new(exception, example, + :description => "ジ".encode("CP932")) + + expect(the_presenter.fully_formatted(1)).to eq(<<-EOS.gsub(/^ +\|/, '')) + | + | 1) ジ + | Failure/Error: # The failure happened here!#{ encoding_check } + | + | Boom + | Bam + | # ./spec/rspec/core/formatters/exception_presenter_spec.rb:#{line_num} + EOS + end + end + it 'allows the caller to omit the description' do the_presenter = Formatters::ExceptionPresenter.new(exception, example, :detail_formatter => Proc.new { "Detail!" }, From cc285cb9192a9317e349c971c52f731143dcc90d Mon Sep 17 00:00:00 2001 From: Benoit Tigeot Date: Fri, 16 Nov 2018 21:42:47 +0100 Subject: [PATCH 2/3] [core] Enforce UTF-8 locale when running tests in appveyor chcp 65001 mean Code Page Number and 65001 is UTF-8. So by doing this change we modify the code page to UTF-8 for the commande that follows. See documentation: https://ss64.com/nt/chcp.html See related issue: https://github.com/appveyor/ci/issues/2107 --- This commit was imported from https://github.com/rspec/rspec-core/commit/0c9f05f858979c209fabb763fe689cc1c1213a1d. --- rspec-core/appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rspec-core/appveyor.yml b/rspec-core/appveyor.yml index dd655bb27..8417442a9 100644 --- a/rspec-core/appveyor.yml +++ b/rspec-core/appveyor.yml @@ -29,7 +29,7 @@ before_test: - bundle --version test_script: - - bundle exec rspec --backtrace + - chcp 65001 && bundle exec rspec --backtrace environment: matrix: From e15b6eb9793df2d53f87041c66260b67f8996155 Mon Sep 17 00:00:00 2001 From: Benoit Tigeot Date: Sat, 17 Nov 2018 09:23:47 +0100 Subject: [PATCH 3/3] [core] choose encoded_description method content code earlier Instead of runtime see https://github.com/rspec/rspec-core/pull/2575/files#r227002134 --- This commit was imported from https://github.com/rspec/rspec-core/commit/8372e5c63aac1d1cbbb1cc34dec61df2dba81e41. --- .../lib/rspec/core/formatters/exception_presenter.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rspec-core/lib/rspec/core/formatters/exception_presenter.rb b/rspec-core/lib/rspec/core/formatters/exception_presenter.rb index 05348082a..9ad6503e1 100644 --- a/rspec-core/lib/rspec/core/formatters/exception_presenter.rb +++ b/rspec-core/lib/rspec/core/formatters/exception_presenter.rb @@ -244,12 +244,13 @@ def formatted_message_and_backtrace(colorizer) end end - def encoded_description(description) - return if description.nil? - - if String.method_defined?(:encoding) + if String.method_defined?(:encoding) + def encoded_description(description) + return if description.nil? encoded_string(description) - else # for 1.8.7 + end + else # for 1.8.7 + def encoded_description(description) description end end