ruby-changes:62314
From: Burdette <ko1@a...>
Date: Mon, 20 Jul 2020 03:36:01 +0900 (JST)
Subject: [ruby-changes:62314] 7bf13c5183 (master): [ruby/csv] Improve RDoc for common options (#146)
https://git.ruby-lang.org/ruby.git/commit/?id=7bf13c5183 From 7bf13c51838a4a71fc55712079c5b243c517021c Mon Sep 17 00:00:00 2001 From: Burdette Lamar <BurdetteLamar@Y...> Date: Wed, 24 Jun 2020 22:38:36 -0500 Subject: [ruby/csv] Improve RDoc for common options (#146) https://github.com/ruby/csv/commit/223cbee35d diff --git a/doc/csv/options/common/col_sep.rdoc b/doc/csv/options/common/col_sep.rdoc index bb4d3ce..05769b5 100644 --- a/doc/csv/options/common/col_sep.rdoc +++ b/doc/csv/options/common/col_sep.rdoc @@ -7,39 +7,57 @@ The \String will be transcoded into the data's \Encoding before use. https://github.com/ruby/ruby/blob/trunk/doc/csv/options/common/col_sep.rdoc#L7 Default value: CSV::DEFAULT_OPTIONS.fetch(:col_sep) # => "," (comma) -For examples in this section: - ary = ['a', 'b', 'c'] - -Using the default: - str = CSV.generate_line(line) - str # => "a,b,c\n" - ary = CSV.parse_line(str) - ary # => ["a", "b", "c"] +Using the default (comma): + str = CSV.generate do |csv| + csv << [:foo, 0] + csv << [:bar, 1] + csv << [:baz, 2] + end + str # => "foo,0\nbar,1\nbaz,2\n" + ary = CSV.parse(str) + ary # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] Using +:+ (colon): col_sep = ':' - str = CSV.generate_line(ary, col_sep: col_sep) - str # => "a:b:c\n" - ary = CSV.parse_line(str, col_sep: col_sep) - ary # => [["a", "b", "c"]] + str = CSV.generate(col_sep: col_sep) do |csv| + csv << [:foo, 0] + csv << [:bar, 1] + csv << [:baz, 2] + end + str # => "foo:0\nbar:1\nbaz:2\n" + ary = CSV.parse(str, col_sep: col_sep) + ary # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] Using +::+ (two colons): col_sep = '::' - str = CSV.generate_line(ary, col_sep: col_sep) - str # => "a::b::c\n" - ary = CSV.parse_line(str, col_sep: col_sep) - ary # => [["a", "b", "c"]] + str = CSV.generate(col_sep: col_sep) do |csv| + csv << [:foo, 0] + csv << [:bar, 1] + csv << [:baz, 2] + end + str # => "foo::0\nbar::1\nbaz::2\n" + ary = CSV.parse(str, col_sep: col_sep) + ary # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + +Using <tt>''</tt> (empty string): + col_sep = '' + str = CSV.generate(col_sep: col_sep) do |csv| + csv << [:foo, 0] + csv << [:bar, 1] + csv << [:baz, 2] + end + str # => "foo0\nbar1\nbaz2\n" --- -Raises an exception if given the empty \String: +Raises an exception if parsing with the empty \String: col_sep = '' # Raises ArgumentError (:col_sep must be 1 or more characters: "") - CSV.parse_line("a:b:c\n", col_sep: col_sep) + CSV.parse("foo0\nbar1\nbaz2\n", col_sep: col_sep) Raises an exception if the given value is not String-convertible: col_sep = BasicObject.new # Raises NoMethodError (undefined method `to_s' for #<BasicObject:>) - CSV.generate_line(line, col_sep: col_sep) + CSV.generate(line, col_sep: col_sep) # Raises NoMethodError (undefined method `to_s' for #<BasicObject:>) CSV.parse(str, col_sep: col_sep) diff --git a/doc/csv/options/common/quote_char.rdoc b/doc/csv/options/common/quote_char.rdoc index eb2ad9c..67fd3af 100644 --- a/doc/csv/options/common/quote_char.rdoc +++ b/doc/csv/options/common/quote_char.rdoc @@ -5,28 +5,38 @@ in both parsing and generating. https://github.com/ruby/ruby/blob/trunk/doc/csv/options/common/quote_char.rdoc#L5 This String will be transcoded into the data's \Encoding before use. Default value: - CSV::DEFAULT_OPTIONS.fetch(:quote_char) # => "\"" (backslash) + CSV::DEFAULT_OPTIONS.fetch(:quote_char) # => "\"" (double quote) This is useful for an application that incorrectly uses <tt>'</tt> (single-quote) to quote fields, instead of the correct <tt>"</tt> (double-quote). -Using the default: - ary = ['a', 'b', '"c"', 'd'] - str = CSV.generate_line(ary) - str # => "a,b,\"\"\"c\"\"\",d\n" - ary = CSV.parse_line(str) - ary # => ["a", "b", "\"c\"", "d"] +Using the default (double quote): + str = CSV.generate do |csv| + csv << ['foo', 0] + csv << ["'bar'", 1] + csv << ['"baz"', 2] + end + str # => "foo,0\n'bar',1\n\"\"\"baz\"\"\",2\n" + ary = CSV.parse(str) + ary # => [["foo", "0"], ["'bar'", "1"], ["\"baz\"", "2"]] Using <tt>'</tt> (single-quote): quote_char = "'" - ary = ['a', 'b', '\'c\'', 'd'] - str = CSV.generate_line(ary, quote_char: quote_char) - str # => "a,b,'''c''',d\n" - ary = CSV.parse_line(str, quote_char: quote_char) - ary # => [["a", "b", "'c'", "d"]] + str = CSV.generate(quote_char: quote_char) do |csv| + csv << ['foo', 0] + csv << ["'bar'", 1] + csv << ['"baz"', 2] + end + str # => "foo,0\n'''bar''',1\n\"baz\",2\n" + ary = CSV.parse(str, quote_char: quote_char) + ary # => [["foo", "0"], ["'bar'", "1"], ["\"baz\"", "2"]] --- Raises an exception if the \String length is greater than 1: # Raises ArgumentError (:quote_char has to be nil or a single character String) CSV.new('', quote_char: 'xx') + +Raises an exception if the value is not a \String: + # Raises ArgumentError (:quote_char has to be nil or a single character String) + CSV.new('', quote_char: :foo) diff --git a/doc/csv/options/common/row_sep.rdoc b/doc/csv/options/common/row_sep.rdoc index a9e2c5b..872d9d1 100644 --- a/doc/csv/options/common/row_sep.rdoc +++ b/doc/csv/options/common/row_sep.rdoc @@ -12,7 +12,8 @@ When +row_sep+ is a \String, that \String becomes the row separator. https://github.com/ruby/ruby/blob/trunk/doc/csv/options/common/row_sep.rdoc#L12 The String will be transcoded into the data's Encoding before use. Using <tt>"\n"</tt>: - str = CSV.generate do |csv| + row_sep = "\n" + str = CSV.generate(row_sep: row_sep) do |csv| csv << [:foo, 0] csv << [:bar, 1] csv << [:baz, 2] @@ -57,20 +58,28 @@ Using <tt>''</tt> (empty string): https://github.com/ruby/ruby/blob/trunk/doc/csv/options/common/row_sep.rdoc#L58 --- When +row_sep+ is the \Symbol +:auto+ (the default), -invokes auto-discovery of the row separator. +generating uses <tt>"\n"</tt> as the row separator: + str = CSV.generate do |csv| + csv << [:foo, 0] + csv << [:bar, 1] + csv << [:baz, 2] + end + str # => "foo,0\nbar,1\nbaz,2\n" + +Parsing, on the other hand, invokes auto-discovery of the row separator. Auto-discovery reads ahead in the data looking for the next <tt>\r\n</tt>, +\n+, or +\r+ sequence. The sequence will be selected even if it occurs in a quoted field, assuming that you would have the same line endings there. - row_sep = :auto - str = CSV.generate(row_sep: row_sep) do |csv| +Example: + str = CSV.generate do |csv| csv << [:foo, 0] csv << [:bar, 1] csv << [:baz, 2] end str # => "foo,0\nbar,1\nbaz,2\n" - ary = CSV.parse(str, row_sep: row_sep) + ary = CSV.parse(str) ary # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] The default <tt>$INPUT_RECORD_SEPARATOR</tt> (<tt>$/</tt>) is used @@ -86,6 +95,6 @@ Obviously, discovery takes a little time. Set manually if speed is important. Al https://github.com/ruby/ruby/blob/trunk/doc/csv/options/common/row_sep.rdoc#L95 Raises an exception if the given value is not String-convertible: row_sep = BasicObject.new # Raises NoMethodError (undefined method `to_s' for #<BasicObject:>) - CSV.generate_line(ary, row_sep: row_sep) + CSV.generate(ary, row_sep: row_sep) # Raises NoMethodError (undefined method `to_s' for #<BasicObject:>) CSV.parse(str, row_sep: row_sep) -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/