From: James Edward Gray II Date: 2010-01-29T02:13:44+09:00 Subject: [ruby-core:27931] Re: [Bug:trunk] some behavior changes of lib/csv.rb between 1.8 and 1.9 On Jan 28, 2010, at 10:51 AM, Yusuke ENDOH wrote: > Hi jeg2, or anyone who knows the implementation of FasterCSV, Hello. > I'm now checking for ruby trunk to pass rubyspec. Are these behavior > changes of lib/csv.rb intended or bug? Yes, they are intentional changes. > 1) CSV.generate > > $ ruby18 -rcsv -e 'w = CSV.generate("foo18.csv"); w << [1, 2, 3]; w.close' > $ cat foo18.csv > 1,2,3 > > $ ruby19 -rcsv -e 'w = CSV.generate("foo19.csv"); w << [1, 2, 3]; w.close' > /home/mame/work/ruby19/local/lib/ruby/1.9.1/csv.rb:1231:in > `generate': no block given (yield) (LocalJumpError) > from -e:1:in `
' > > There is the comment of csv.rb: >> The old CSV's Reader and Writer classes have been dropped. >> CSV::generate() is different from the old method. > They mean this change, don't they? Yes, I believe generating to a file was even deprecated in CSV, if I remember correctly. In either case, FasterCSV doesn't support it. > 2) CSV.generate_line > > $ ruby18 -rcsv -e 'p CSV.generate_line([])' > "" > > $ ruby19 -rcsv -e 'p CSV.generate_line([])' > "\n" This is intentional. FasterCSV always generates a complete line, including the :row_sep. > 3) CSV.generate_line (2) > > $ ruby18 -rcsv -e 'p CSV::generate_line(["foo", "bar"], ?;)' > "foo;bar" > > $ ruby19 -rcsv -e 'p CSV::generate_line(["foo", "bar"], ?;)' > /home/mame/work/ruby19/local/lib/ruby/1.9.1/csv.rb:1249:in `merge': > can't convert String into Hash (TypeError) > from /home/mame/work/ruby19/local/lib/ruby/1.9.1/csv.rb:1249:in > `generate_line' > from -e:1:in `
' Yes, FasterCSV got rid of the positional arguments in favor of keyword arguments. So, it's now: CSV.generate_line(%w[foo bar], :row_sep => ?;) > 3) CSV.parse > > $ ruby18 -rcsv -ve 'p CSV.parse "\nfoo"' > [[nil], ["foo"]] > > $ ruby19 -rcsv -ve 'p CSV.parse "\nfoo"' > [[], ["foo"]] Yeah, the old CSV included some seemingly random nils in places. FasterCSV "corrects" this odd behavior. > 4) CSV.parse_line > > $ ruby18 -rcsv -ve 'p CSV.parse_line ""' > [nil] > > $ ruby19 -rcsv -ve 'p CSV.parse_line ""' > nil We could probably debate this one. It may be that FasterCSV should return a [] instead of nil. I'll make a not to look into that and maybe fix it. We won't be going back to the CSV response of [nil] though, since I don't understand it. (See my answer to #3.) > 5) CSV.parse_line (2) > > $ ruby18 -rcsv -ve 'p CSV.parse_line "\nfoo"' > [nil] > > $ ruby19 -rcsv -ve 'p CSV.parse_line "\nfoo"' > [] parse_line() only reads the first line, so this is the same as #3. James Edward Gray II