[ruby/csv] Ensuring StringIO's encoding in CSV.generate (#111)

https://github.com/ruby/csv/commit/dbf55ef008
This commit is contained in:
Seiei Miyagi 2019-11-25 10:06:59 +09:00 коммит произвёл Nobuyoshi Nakada
Родитель d57bc03ba9
Коммит 3c5b67e0db
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 7CD2805BFA3770C6
4 изменённых файлов: 38 добавлений и 25 удалений

Просмотреть файл

@ -531,12 +531,13 @@ class CSV
# plan to output non-ASCII compatible data.
#
def generate(str=nil, **options)
encoding = options[:encoding]
# add a default empty String, if none was given
if str
str = StringIO.new(str)
str.seek(0, IO::SEEK_END)
str.set_encoding(encoding) if encoding
else
encoding = options[:encoding]
str = +""
str.force_encoding(encoding) if encoding
end

Просмотреть файл

@ -15,4 +15,28 @@ module Helper
ENV["CSV_PARSER_SCANNER_TEST_CHUNK_SIZE"] = chunk_size_keep
end
end
def with_verbose(verbose)
original = $VERBOSE
begin
$VERBOSE = verbose
yield
ensure
$VERBOSE = original
end
end
def with_default_internal(encoding)
original = Encoding.default_internal
begin
with_verbose(false) do
Encoding.default_internal = encoding
end
yield
ensure
with_verbose(false) do
Encoding.default_internal = original
end
end
end
end

Просмотреть файл

@ -5,6 +5,7 @@ require_relative "helper"
class TestCSVEncodings < Test::Unit::TestCase
extend DifferentOFS
include Helper
def setup
super
@ -249,6 +250,15 @@ class TestCSVEncodings < Test::Unit::TestCase
assert_equal(["foo,\u3042\n".encode(Encoding::Windows_31J), Encoding::Windows_31J], [s, s.encoding], bug9766)
end
def test_encoding_with_default_internal
with_default_internal(Encoding::UTF_8) do
s = CSV.generate(String.new(encoding: Encoding::Big5), encoding: Encoding::Big5) do |csv|
csv << ["漢字"]
end
assert_equal(["漢字\n".encode(Encoding::Big5), Encoding::Big5], [s, s.encoding])
end
end
def test_row_separator_detection_with_invalid_encoding
csv = CSV.new("invalid,\xF8\r\nvalid,x\r\n".force_encoding("UTF-8"),
encoding: "UTF-8")

Просмотреть файл

@ -4,6 +4,8 @@
require_relative "../helper"
module TestCSVWriteGeneral
include Helper
def test_tab
assert_equal("\t#{$INPUT_RECORD_SEPARATOR}",
generate_line(["\t"]))
@ -221,30 +223,6 @@ module TestCSVWriteGeneral
generate_line(row))
end
end
def with_verbose(verbose)
original = $VERBOSE
begin
$VERBOSE = verbose
yield
ensure
$VERBOSE = original
end
end
def with_default_internal(encoding)
original = Encoding.default_internal
begin
with_verbose(false) do
Encoding.default_internal = encoding
end
yield
ensure
with_verbose(false) do
Encoding.default_internal = original
end
end
end
end
class TestCSVWriteGeneralGenerateLine < Test::Unit::TestCase