* lib/csv.rb (CSV.foreach): 'rb' mode is defaulted in open.
* lib/csv.rb (CSV#init_separators): cannonicalize encoding options as Encoding objects. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
9ff4e23741
commit
08d99ac9e3
@ -1,3 +1,10 @@
|
||||
Sat Dec 25 18:04:30 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* lib/csv.rb (CSV.foreach): 'rb' mode is defaulted in open.
|
||||
|
||||
* lib/csv.rb (CSV#init_separators): cannonicalize encoding options
|
||||
as Encoding objects.
|
||||
|
||||
Sat Dec 25 18:30:34 2010 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||
|
||||
* thread.c (rb_thread_atfork): Add small comment why we need
|
||||
|
19
lib/csv.rb
19
lib/csv.rb
@ -1203,7 +1203,7 @@ class CSV
|
||||
# but transcode it to UTF-8 before CSV parses it.
|
||||
#
|
||||
def self.foreach(path, options = Hash.new, &block)
|
||||
open(path, 'rb', options) do |csv|
|
||||
open(path, options) do |csv|
|
||||
csv.each(&block)
|
||||
end
|
||||
end
|
||||
@ -1561,13 +1561,18 @@ class CSV
|
||||
# create the IO object we will read from
|
||||
@io = data.is_a?(String) ? StringIO.new(data) : data
|
||||
# honor the IO encoding if we can, otherwise default to ASCII-8BIT
|
||||
@encoding = options.delete(:internal_encoding) ||
|
||||
@encoding = raw_encoding(nil) ||
|
||||
(if encoding = options.delete(:internal_encoding)
|
||||
case encoding
|
||||
when Encoding; encoding
|
||||
else Encoding.find(encoding)
|
||||
end
|
||||
end) ||
|
||||
(case encoding = options.delete(:encoding)
|
||||
when Encoding; encoding
|
||||
when /\A[^:]+/; $1
|
||||
when /\A[^:]+/; Encoding.find($&)
|
||||
end) ||
|
||||
raw_encoding || Encoding.default_internal ||
|
||||
Encoding.default_external
|
||||
Encoding.default_internal || Encoding.default_external
|
||||
#
|
||||
# prepare for building safe regular expressions in the target encoding,
|
||||
# if we can transcode the needed characters
|
||||
@ -2283,7 +2288,7 @@ class CSV
|
||||
|
||||
private
|
||||
|
||||
def raw_encoding
|
||||
def raw_encoding(default = Encoding::ASCII_8BIT)
|
||||
if @io.respond_to? :internal_encoding
|
||||
@io.internal_encoding || @io.external_encoding
|
||||
elsif @io.is_a? StringIO
|
||||
@ -2291,7 +2296,7 @@ class CSV
|
||||
elsif @io.respond_to? :encoding
|
||||
@io.encoding
|
||||
else
|
||||
Encoding::ASCII_8BIT
|
||||
default
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -260,6 +260,23 @@ class TestCSV::Encodings < TestCSV
|
||||
end unless encoding == __ENCODING__
|
||||
rescue Encoding::ConverterNotFoundError
|
||||
end
|
||||
options[:encoding] = encoding.name
|
||||
CSV.open(@temp_csv_path, options) do |csv|
|
||||
csv.each_with_index do |row, i|
|
||||
assert_equal(fields[i], row)
|
||||
end
|
||||
end
|
||||
options.delete(:encoding)
|
||||
options[:external_encoding] = encoding.name
|
||||
options[:internal_encoding] = __ENCODING__.name
|
||||
begin
|
||||
CSV.open(@temp_csv_path, options) do |csv|
|
||||
csv.each_with_index do |row, i|
|
||||
assert_equal(orig_fields[i], row)
|
||||
end
|
||||
end unless encoding == __ENCODING__
|
||||
rescue Encoding::ConverterNotFoundError
|
||||
end
|
||||
end
|
||||
|
||||
def encode_ary(ary, encoding)
|
||||
|
Loading…
x
Reference in New Issue
Block a user