csv 3.2.5 → 3.2.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1abbfa01e0e5085077c3a58da0042477dfc0863cfb613f523a1cd0f6d577e0d9
4
- data.tar.gz: a80f49679422de5da4543cc5359dc0105ce49be86f76333bc50a2ea75345a1b0
3
+ metadata.gz: 6cc7b1ce29466412d00abcdb6afe594aa953f4b88367086398a3376484ca3344
4
+ data.tar.gz: b8112d963f92496cc775996c4e65d5b585601210fc03a4bc86eb4bf3c20e5f7d
5
5
  SHA512:
6
- metadata.gz: f71291c830c9ac8d77ec16d0acf036e633867c91370032e3f4e26aa5f4f4bfd7e2c726c9bc320c2295de34485bef14abde70de44e052e4e954466ceeeae6e9dd
7
- data.tar.gz: 2f619e6608556aaeaabdbf3b3116201d9a4f43eb20b313023d153e9ae03e34a17e10919d373afdd64f39f9edaeb813871e43e4fbb3a46e2dc3fc80d47214307c
6
+ metadata.gz: 3c29b38c150c691b52d0be24ab3dcdf32c430f2870de3ae4b26e704368caead83b27a581324a73515a85df8dc9571ab9f5fef1e8aa16a78f2ebfe3981a036063
7
+ data.tar.gz: 40cc68cb5a5eae059c3924e21e4fb53ae19e3c129f4b57e2bdcab35798742616daee93cf4bf9998de5333e03b01cc7b08a11da9700f04913a45f80741542d8f5
data/NEWS.md CHANGED
@@ -1,5 +1,82 @@
1
1
  # News
2
2
 
3
+ ## 3.2.7 - 2023-06-26
4
+
5
+ ### Improvements
6
+
7
+ * Removed an unused internal variable.
8
+ [GH-273](https://github.com/ruby/csv/issues/273)
9
+ [Patch by Mau Magnaguagno]
10
+
11
+ * Changed to use `https://` instead of `http://` in documents.
12
+ [GH-274](https://github.com/ruby/csv/issues/274)
13
+ [Patch by Vivek Bharath Akupatni]
14
+
15
+ * Added prefix to a helper module in test.
16
+ [GH-278](https://github.com/ruby/csv/issues/278)
17
+ [Patch by Luke Gruber]
18
+
19
+ * Added a documentation for `liberal_parsing: {backslash_quotes: true}`.
20
+ [GH-280](https://github.com/ruby/csv/issues/280)
21
+ [Patch by Mark Schneider]
22
+
23
+ ### Fixes
24
+
25
+ * Fixed a wrong execution result in documents.
26
+ [GH-276](https://github.com/ruby/csv/issues/276)
27
+ [Patch by Yuki Tsujimoto]
28
+
29
+ * Fixed a bug that the same line is used multiple times.
30
+ [GH-279](https://github.com/ruby/csv/issues/279)
31
+ [Reported by Gabriel Nagy]
32
+
33
+ ### Thanks
34
+
35
+ * Mau Magnaguagno
36
+
37
+ * Vivek Bharath Akupatni
38
+
39
+ * Yuki Tsujimoto
40
+
41
+ * Luke Gruber
42
+
43
+ * Mark Schneider
44
+
45
+ * Gabriel Nagy
46
+
47
+ ## 3.2.6 - 2022-12-08
48
+
49
+ ### Improvements
50
+
51
+ * `CSV#read` consumes the same lines with other methods like
52
+ `CSV#shift`.
53
+ [[GitHub#258](https://github.com/ruby/csv/issues/258)]
54
+ [Reported by Lhoussaine Ghallou]
55
+
56
+ * All `Enumerable` based methods consume the same lines with other
57
+ methods. This may have a performance penalty.
58
+ [[GitHub#260](https://github.com/ruby/csv/issues/260)]
59
+ [Reported by Lhoussaine Ghallou]
60
+
61
+ * Simplify some implementations.
62
+ [[GitHub#262](https://github.com/ruby/csv/pull/262)]
63
+ [[GitHub#263](https://github.com/ruby/csv/pull/263)]
64
+ [Patch by Mau Magnaguagno]
65
+
66
+ ### Fixes
67
+
68
+ * Fixed `CSV.generate_lines` document.
69
+ [[GitHub#257](https://github.com/ruby/csv/pull/257)]
70
+ [Patch by Sampat Badhe]
71
+
72
+ ### Thanks
73
+
74
+ * Sampat Badhe
75
+
76
+ * Lhoussaine Ghallou
77
+
78
+ * Mau Magnaguagno
79
+
3
80
  ## 3.2.5 - 2022-08-26
4
81
 
5
82
  ### Improvements
@@ -1,13 +1,13 @@
1
1
  ====== Option +liberal_parsing+
2
2
 
3
- Specifies the boolean value that determines whether
3
+ Specifies the boolean or hash value that determines whether
4
4
  CSV will attempt to parse input not conformant with RFC 4180,
5
5
  such as double quotes in unquoted fields.
6
6
 
7
7
  Default value:
8
8
  CSV::DEFAULT_OPTIONS.fetch(:liberal_parsing) # => false
9
9
 
10
- For examples in this section:
10
+ For the next two examples:
11
11
  str = 'is,this "three, or four",fields'
12
12
 
13
13
  Without +liberal_parsing+:
@@ -17,3 +17,22 @@ Without +liberal_parsing+:
17
17
  With +liberal_parsing+:
18
18
  ary = CSV.parse_line(str, liberal_parsing: true)
19
19
  ary # => ["is", "this \"three", " or four\"", "fields"]
20
+
21
+ Use the +backslash_quote+ sub-option to parse values that use
22
+ a backslash to escape a double-quote character. This
23
+ causes the parser to treat <code>\"</code> as if it were
24
+ <code>""</code>.
25
+
26
+ For the next two examples:
27
+ str = 'Show,"Harry \"Handcuff\" Houdini, the one and only","Tampa Theater"'
28
+
29
+ With +liberal_parsing+, but without the +backslash_quote+ sub-option:
30
+ # Incorrect interpretation of backslash; incorrectly interprets the quoted comma as a field separator.
31
+ ary = CSV.parse_line(str, liberal_parsing: true)
32
+ ary # => ["Show", "\"Harry \\\"Handcuff\\\" Houdini", " the one and only\"", "Tampa Theater"]
33
+ puts ary[1] # => "Harry \"Handcuff\" Houdini
34
+
35
+ With +liberal_parsing+ and its +backslash_quote+ sub-option:
36
+ ary = CSV.parse_line(str, liberal_parsing: { backslash_quote: true })
37
+ ary # => ["Show", "Harry \"Handcuff\" Houdini, the one and only", "Tampa Theater"]
38
+ puts ary[1] # => Harry "Handcuff" Houdini, the one and only
@@ -520,7 +520,7 @@ Apply multiple header converters by defining and registering a custom header con
520
520
  To capture unconverted field values, use option +:unconverted_fields+:
521
521
  source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
522
522
  parsed = CSV.parse(source, converters: :integer, unconverted_fields: true)
523
- parsed # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
523
+ parsed # => [["Name", "Value"], ["foo", 0], ["bar", 1], ["baz", 2]]
524
524
  parsed.each {|row| p row.unconverted_fields }
525
525
  Output:
526
526
  ["Name", "Value"]
data/lib/csv/parser.rb CHANGED
@@ -101,7 +101,7 @@ class CSV
101
101
  position = @scanner.pos
102
102
  offset = 0
103
103
  n_row_separator_chars = row_separator.size
104
- # trace(__method__, :start, line, input)
104
+ # trace(__method__, :start, input)
105
105
  while true
106
106
  input.each_line(row_separator) do |line|
107
107
  @scanner.pos += line.bytesize
@@ -157,6 +157,7 @@ class CSV
157
157
  # trace(__method__, pattern, :done, :last, value) if @last_scanner
158
158
  return value if @last_scanner
159
159
 
160
+ # trace(__method__, pattern, :done, :nil) if value.nil?
160
161
  return nil if value.nil?
161
162
  while @scanner.eos? and read_chunk and (sub_value = @scanner.scan(pattern))
162
163
  # trace(__method__, pattern, :sub, sub_value)
@@ -200,7 +201,8 @@ class CSV
200
201
  # trace(__method__, :rescan, start, buffer)
201
202
  string = @scanner.string
202
203
  if scanner == @scanner
203
- keep = string.byteslice(start, string.bytesize - start)
204
+ keep = string.byteslice(start,
205
+ string.bytesize - @scanner.pos - start)
204
206
  else
205
207
  keep = string
206
208
  end
@@ -485,7 +487,6 @@ class CSV
485
487
  message = ":quote_char has to be nil or a single character String"
486
488
  raise ArgumentError, message
487
489
  end
488
- @double_quote_character = @quote_character * 2
489
490
  @escaped_quote_character = Regexp.escape(@quote_character)
490
491
  @escaped_quote = Regexp.new(@escaped_quote_character)
491
492
  end
data/lib/csv/row.rb CHANGED
@@ -703,7 +703,7 @@ class CSV
703
703
  # by +index_or_header+ and +specifiers+.
704
704
  #
705
705
  # The nested objects may be instances of various classes.
706
- # See {Dig Methods}[https://docs.ruby-lang.org/en/master/dig_methods_rdoc.html].
706
+ # See {Dig Methods}[rdoc-ref:dig_methods.rdoc].
707
707
  #
708
708
  # Examples:
709
709
  # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
data/lib/csv/table.rb CHANGED
@@ -890,9 +890,8 @@ class CSV
890
890
  if @mode == :row or @mode == :col_or_row # by index
891
891
  @table.delete_if(&block)
892
892
  else # by header
893
- deleted = []
894
893
  headers.each do |header|
895
- deleted << delete(header) if yield([header, self[header]])
894
+ delete(header) if yield([header, self[header]])
896
895
  end
897
896
  end
898
897
 
data/lib/csv/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  class CSV
4
4
  # The version of the installed library.
5
- VERSION = "3.2.5"
5
+ VERSION = "3.2.7"
6
6
  end
data/lib/csv.rb CHANGED
@@ -70,7 +70,7 @@
70
70
  # == What is CSV, really?
71
71
  #
72
72
  # CSV maintains a pretty strict definition of CSV taken directly from
73
- # {the RFC}[http://www.ietf.org/rfc/rfc4180.txt]. I relax the rules in only one
73
+ # {the RFC}[https://www.ietf.org/rfc/rfc4180.txt]. I relax the rules in only one
74
74
  # place and that is to make using this library easier. CSV will parse all valid
75
75
  # CSV.
76
76
  #
@@ -1005,7 +1005,7 @@ class CSV
1005
1005
  def instance(data = $stdout, **options)
1006
1006
  # create a _signature_ for this method call, data object and options
1007
1007
  sig = [data.object_id] +
1008
- options.values_at(*DEFAULT_OPTIONS.keys.sort_by { |sym| sym.to_s })
1008
+ options.values_at(*DEFAULT_OPTIONS.keys)
1009
1009
 
1010
1010
  # fetch or create the instance for this signature
1011
1011
  @@instances ||= Hash.new
@@ -1144,7 +1144,7 @@ class CSV
1144
1144
  # File.read('t.csv') # => "Name,Value\nFOO,0\nBAR,-1\nBAZ,-2\n"
1145
1145
  #
1146
1146
  # When neither +in_string_or_io+ nor +out_string_or_io+ given,
1147
- # parses from {ARGF}[https://docs.ruby-lang.org/en/master/ARGF.html]
1147
+ # parses from {ARGF}[rdoc-ref:ARGF]
1148
1148
  # and generates to STDOUT.
1149
1149
  #
1150
1150
  # Without headers:
@@ -1202,7 +1202,7 @@ class CSV
1202
1202
  # parse options for input, output, or both
1203
1203
  in_options, out_options = Hash.new, {row_sep: InputRecordSeparator.value}
1204
1204
  options.each do |key, value|
1205
- case key.to_s
1205
+ case key
1206
1206
  when /\Ain(?:put)?_(.+)\Z/
1207
1207
  in_options[$1.to_sym] = value
1208
1208
  when /\Aout(?:put)?_(.+)\Z/
@@ -1489,12 +1489,12 @@ class CSV
1489
1489
  # ---
1490
1490
  #
1491
1491
  # Returns the \String generated from an
1492
- # CSV.generate_lines(['foo', '0'], ['bar', '1'], ['baz', '2']) # => "foo,0\nbar,1\nbaz.2\n"
1492
+ # CSV.generate_lines([['foo', '0'], ['bar', '1'], ['baz', '2']]) # => "foo,0\nbar,1\nbaz,2\n"
1493
1493
  #
1494
1494
  # ---
1495
1495
  #
1496
1496
  # Raises an exception
1497
- # # Raises NoMethodError (undefined method `find' for :foo:Symbol)
1497
+ # # Raises NoMethodError (undefined method `each' for :foo:Symbol)
1498
1498
  # CSV.generate_lines(:foo)
1499
1499
  #
1500
1500
  def generate_lines(rows, **options)
@@ -2551,7 +2551,13 @@ class CSV
2551
2551
  # p row
2552
2552
  # end
2553
2553
  def each(&block)
2554
- parser_enumerator.each(&block)
2554
+ return to_enum(__method__) unless block_given?
2555
+ begin
2556
+ while true
2557
+ yield(parser_enumerator.next)
2558
+ end
2559
+ rescue StopIteration
2560
+ end
2555
2561
  end
2556
2562
 
2557
2563
  # :call-seq:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.5
4
+ version: 3.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Edward Gray II
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-08-26 00:00:00.000000000 Z
12
+ date: 2023-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -145,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  requirements: []
148
- rubygems_version: 3.4.0.dev
148
+ rubygems_version: 3.5.0.dev
149
149
  signing_key:
150
150
  specification_version: 4
151
151
  summary: CSV Reading and Writing