* 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>
|
Sat Dec 25 18:30:34 2010 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
* thread.c (rb_thread_atfork): Add small comment why we need
|
* 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.
|
# but transcode it to UTF-8 before CSV parses it.
|
||||||
#
|
#
|
||||||
def self.foreach(path, options = Hash.new, &block)
|
def self.foreach(path, options = Hash.new, &block)
|
||||||
open(path, 'rb', options) do |csv|
|
open(path, options) do |csv|
|
||||||
csv.each(&block)
|
csv.each(&block)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1561,13 +1561,18 @@ class CSV
|
|||||||
# create the IO object we will read from
|
# create the IO object we will read from
|
||||||
@io = data.is_a?(String) ? StringIO.new(data) : data
|
@io = data.is_a?(String) ? StringIO.new(data) : data
|
||||||
# honor the IO encoding if we can, otherwise default to ASCII-8BIT
|
# 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)
|
(case encoding = options.delete(:encoding)
|
||||||
when Encoding; encoding
|
when Encoding; encoding
|
||||||
when /\A[^:]+/; $1
|
when /\A[^:]+/; Encoding.find($&)
|
||||||
end) ||
|
end) ||
|
||||||
raw_encoding || Encoding.default_internal ||
|
Encoding.default_internal || Encoding.default_external
|
||||||
Encoding.default_external
|
|
||||||
#
|
#
|
||||||
# prepare for building safe regular expressions in the target encoding,
|
# prepare for building safe regular expressions in the target encoding,
|
||||||
# if we can transcode the needed characters
|
# if we can transcode the needed characters
|
||||||
@ -2283,7 +2288,7 @@ class CSV
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def raw_encoding
|
def raw_encoding(default = Encoding::ASCII_8BIT)
|
||||||
if @io.respond_to? :internal_encoding
|
if @io.respond_to? :internal_encoding
|
||||||
@io.internal_encoding || @io.external_encoding
|
@io.internal_encoding || @io.external_encoding
|
||||||
elsif @io.is_a? StringIO
|
elsif @io.is_a? StringIO
|
||||||
@ -2291,7 +2296,7 @@ class CSV
|
|||||||
elsif @io.respond_to? :encoding
|
elsif @io.respond_to? :encoding
|
||||||
@io.encoding
|
@io.encoding
|
||||||
else
|
else
|
||||||
Encoding::ASCII_8BIT
|
default
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -260,6 +260,23 @@ class TestCSV::Encodings < TestCSV
|
|||||||
end unless encoding == __ENCODING__
|
end unless encoding == __ENCODING__
|
||||||
rescue Encoding::ConverterNotFoundError
|
rescue Encoding::ConverterNotFoundError
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
def encode_ary(ary, encoding)
|
def encode_ary(ary, encoding)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user