csv 3.2.5 → 3.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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