Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/csv.rb
Original file line number Diff line number Diff line change
Expand Up @@ -531,12 +531,13 @@ def foreach(path, mode="r", **options, &block)
# 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
Expand Down
24 changes: 24 additions & 0 deletions test/csv/helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,28 @@ def with_chunk_size(chunk_size)
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
10 changes: 10 additions & 0 deletions test/csv/test_encodings.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

class TestCSVEncodings < Test::Unit::TestCase
extend DifferentOFS
include Helper

def setup
super
Expand Down Expand Up @@ -249,6 +250,15 @@ def test_explicit_encoding
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")
Expand Down
26 changes: 2 additions & 24 deletions test/csv/write/test_general.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
require_relative "../helper"

module TestCSVWriteGeneral
include Helper

def test_tab
assert_equal("\t#{$INPUT_RECORD_SEPARATOR}",
generate_line(["\t"]))
Expand Down Expand Up @@ -221,30 +223,6 @@ def test_with_default_internal
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
Expand Down