csv 1.0.0 → 1.0.1

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
- SHA256:
3
- metadata.gz: e520c33af1acab822be6e93e034e176ecd24c73b89e68d4325871d5261da0050
4
- data.tar.gz: c97cfd5a50a41209c74f292e834f3b4d1b9bef3b89726e928d0c65006102342d
2
+ SHA1:
3
+ metadata.gz: 05b9101e168faf6acec7dd2c841e6a30084e3585
4
+ data.tar.gz: ad75132c6ed63c2cf95c16b6dbf948d76d83d69f
5
5
  SHA512:
6
- metadata.gz: f827cc12fd35947f6058e3026bac1820b36c71b8203567ee3be54930bc05884d05ed6ec1011f2170d5a19463e171a906d2567a2b19ccd62ba85886453114ef00
7
- data.tar.gz: fa880bb7f2bd71e1d29ce2efad98b549ea37851efaffa09880fab5a439a26b40f5a8d703fc86d58dbc6c169c2062ff9ce8419142e04e64c7506b0d91b7c27c5c
6
+ metadata.gz: 45c5498cf70618cd26ddf0acd17db083beec0b9a532adf7279cc5cb830f400a1ae0b291e6492f4191020b97a427c46c019aa97fbfb83aaded9fc66b920015c26
7
+ data.tar.gz: 5dd1c842d29df9e2c89da50b2ebbbed42e6386d05f3e5f76403b5d977e13a485b9978c815d418246798e4a4e72bf62995476ca4e9ea40095cc80f73319b30d7b
@@ -0,0 +1,22 @@
1
+ Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
@@ -0,0 +1,46 @@
1
+ # CSV
2
+
3
+ [![Build Status](https://travis-ci.org/ruby/csv.svg?branch=master)](https://travis-ci.org/ruby/csv)
4
+
5
+ This library provides a complete interface to CSV files and data. It offers tools to enable you to read and write to and from Strings or IO objects, as needed.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'csv'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install csv
22
+
23
+ ## Usage
24
+
25
+ ```ruby
26
+ require "csv"
27
+
28
+ CSV.foreach("path/to/file.csv") do |row|
29
+ # use row here...
30
+ end
31
+ ```
32
+
33
+ ## Development
34
+
35
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
36
+
37
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
38
+
39
+ ## Contributing
40
+
41
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/csv.
42
+
43
+
44
+ ## License
45
+
46
+ The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause).
@@ -0,0 +1,9 @@
1
+ class Array # :nodoc:
2
+ # Equivalent to CSV::generate_line(self, options)
3
+ #
4
+ # ["CSV", "data"].to_csv
5
+ # #=> "CSV,data\n"
6
+ def to_csv(**options)
7
+ CSV.generate_line(self, options)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class String # :nodoc:
2
+ # Equivalent to CSV::parse_line(self, options)
3
+ #
4
+ # "CSV,data".parse_csv
5
+ # #=> ["CSV", "data"]
6
+ def parse_csv(**options)
7
+ CSV.parse_line(self, options)
8
+ end
9
+ end
data/lib/csv.rb CHANGED
@@ -208,7 +208,7 @@ require "stringio"
208
208
  #
209
209
  class CSV
210
210
  # The version of the installed library.
211
- VERSION = "2.4.8"
211
+ VERSION = "1.0.1"
212
212
 
213
213
  #
214
214
  # A CSV::Row is part Array and part Hash. It retains an order for the fields
@@ -434,7 +434,7 @@ class CSV
434
434
  # If no block is given, an Enumerator is returned.
435
435
  #
436
436
  def delete_if(&block)
437
- block or return enum_for(__method__) { size }
437
+ return enum_for(__method__) { size } unless block_given?
438
438
 
439
439
  @row.delete_if(&block)
440
440
 
@@ -513,7 +513,7 @@ class CSV
513
513
  # Support for Enumerable.
514
514
  #
515
515
  def each(&block)
516
- block or return enum_for(__method__) { size }
516
+ return enum_for(__method__) { size } unless block_given?
517
517
 
518
518
  @row.each(&block)
519
519
 
@@ -547,6 +547,24 @@ class CSV
547
547
  end
548
548
  alias_method :to_s, :to_csv
549
549
 
550
+ #
551
+ # Extracts the nested value specified by the sequence of +index+ or +header+ objects by calling dig at each step,
552
+ # returning nil if any intermediate step is nil.
553
+ #
554
+ def dig(index_or_header, *indexes)
555
+ value = field(index_or_header)
556
+ if value.nil?
557
+ nil
558
+ elsif indexes.empty?
559
+ value
560
+ else
561
+ unless value.respond_to?(:dig)
562
+ raise TypeError, "#{value.class} does not have \#dig method"
563
+ end
564
+ value.dig(*indexes)
565
+ end
566
+ end
567
+
550
568
  # A summary of fields, by header, in an ASCII compatible String.
551
569
  def inspect
552
570
  str = ["#<", self.class.to_s]
@@ -808,16 +826,26 @@ class CSV
808
826
  end
809
827
 
810
828
  #
811
- # Removes and returns the indicated column or row. In the default mixed
829
+ # Removes and returns the indicated columns or rows. In the default mixed
812
830
  # mode indices refer to rows and everything else is assumed to be a column
813
- # header. Use by_col!() or by_row!() to force the lookup.
831
+ # headers. Use by_col!() or by_row!() to force the lookup.
814
832
  #
815
- def delete(index_or_header)
816
- if @mode == :row or # by index
817
- (@mode == :col_or_row and index_or_header.is_a? Integer)
818
- @table.delete_at(index_or_header)
819
- else # by header
820
- @table.map { |row| row.delete(index_or_header).last }
833
+ def delete(*indexes_or_headers)
834
+ if indexes_or_headers.empty?
835
+ raise ArgumentError, "wrong number of arguments (given 0, expected 1+)"
836
+ end
837
+ deleted_values = indexes_or_headers.map do |index_or_header|
838
+ if @mode == :row or # by index
839
+ (@mode == :col_or_row and index_or_header.is_a? Integer)
840
+ @table.delete_at(index_or_header)
841
+ else # by header
842
+ @table.map { |row| row.delete(index_or_header).last }
843
+ end
844
+ end
845
+ if indexes_or_headers.size == 1
846
+ deleted_values[0]
847
+ else
848
+ deleted_values
821
849
  end
822
850
  end
823
851
 
@@ -832,14 +860,14 @@ class CSV
832
860
  # If no block is given, an Enumerator is returned.
833
861
  #
834
862
  def delete_if(&block)
835
- block or return enum_for(__method__) { @mode == :row or @mode == :col_or_row ? size : headers.size }
863
+ return enum_for(__method__) { @mode == :row or @mode == :col_or_row ? size : headers.size } unless block_given?
836
864
 
837
865
  if @mode == :row or @mode == :col_or_row # by index
838
866
  @table.delete_if(&block)
839
867
  else # by header
840
868
  deleted = []
841
869
  headers.each do |header|
842
- deleted << delete(header) if block[[header, self[header]]]
870
+ deleted << delete(header) if yield([header, self[header]])
843
871
  end
844
872
  end
845
873
 
@@ -858,10 +886,10 @@ class CSV
858
886
  # If no block is given, an Enumerator is returned.
859
887
  #
860
888
  def each(&block)
861
- block or return enum_for(__method__) { @mode == :col ? headers.size : size }
889
+ return enum_for(__method__) { @mode == :col ? headers.size : size } unless block_given?
862
890
 
863
891
  if @mode == :col
864
- headers.each { |header| block[[header, self[header]]] }
892
+ headers.each { |header| yield([header, self[header]]) }
865
893
  else
866
894
  @table.each(&block)
867
895
  end
@@ -903,6 +931,24 @@ class CSV
903
931
  end
904
932
  alias_method :to_s, :to_csv
905
933
 
934
+ #
935
+ # Extracts the nested value specified by the sequence of +index+ or +header+ objects by calling dig at each step,
936
+ # returning nil if any intermediate step is nil.
937
+ #
938
+ def dig(index_or_header, *index_or_headers)
939
+ value = self[index_or_header]
940
+ if value.nil?
941
+ nil
942
+ elsif index_or_headers.empty?
943
+ value
944
+ else
945
+ unless value.respond_to?(:dig)
946
+ raise TypeError, "#{value.class} does not have \#dig method"
947
+ end
948
+ value.dig(*index_or_headers)
949
+ end
950
+ end
951
+
906
952
  # Shows the mode and size of this table in a US-ASCII String.
907
953
  def inspect
908
954
  "#<#{self.class} mode:#{@mode} row_count:#{to_a.size}>".encode("US-ASCII")
@@ -930,7 +976,11 @@ class CSV
930
976
  # A Regexp used to find and convert some common DateTime formats.
931
977
  DateTimeMatcher =
932
978
  / \A(?: (\w+,?\s+)?\w+\s+\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2},?\s+\d{2,4} |
933
- \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2} )\z /x
979
+ \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2} |
980
+ # ISO-8601
981
+ \d{4}-\d{2}-\d{2}
982
+ (?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)?
983
+ )\z /x
934
984
 
935
985
  # The encoding used by all converters.
936
986
  ConverterEncoding = Encoding.find("UTF-8")
@@ -1137,7 +1187,7 @@ class CSV
1137
1187
  # but transcode it to UTF-8 before CSV parses it.
1138
1188
  #
1139
1189
  def self.foreach(path, **options, &block)
1140
- return to_enum(__method__, path, options) unless block
1190
+ return to_enum(__method__, path, options) unless block_given?
1141
1191
  open(path, options) do |csv|
1142
1192
  csv.each(&block)
1143
1193
  end
@@ -1164,8 +1214,8 @@ class CSV
1164
1214
  def self.generate(str=nil, **options)
1165
1215
  # add a default empty String, if none was given
1166
1216
  if str
1167
- io = StringIO.new(str)
1168
- io.seek(0, IO::SEEK_END)
1217
+ str = StringIO.new(str)
1218
+ str.seek(0, IO::SEEK_END)
1169
1219
  else
1170
1220
  encoding = options[:encoding]
1171
1221
  str = String.new
@@ -1309,14 +1359,14 @@ class CSV
1309
1359
  #
1310
1360
  def self.parse(*args, &block)
1311
1361
  csv = new(*args)
1312
- if block.nil? # slurp contents, if no block is given
1313
- begin
1314
- csv.read
1315
- ensure
1316
- csv.close
1317
- end
1318
- else # or pass each row to a provided block
1319
- csv.each(&block)
1362
+
1363
+ return csv.each(&block) if block_given?
1364
+
1365
+ # slurp contents, if no block is given
1366
+ begin
1367
+ csv.read
1368
+ ensure
1369
+ csv.close
1320
1370
  end
1321
1371
  end
1322
1372
 
@@ -2334,22 +2384,5 @@ def CSV(*args, &block)
2334
2384
  CSV.instance(*args, &block)
2335
2385
  end
2336
2386
 
2337
- class Array # :nodoc:
2338
- # Equivalent to CSV::generate_line(self, options)
2339
- #
2340
- # ["CSV", "data"].to_csv
2341
- # #=> "CSV,data\n"
2342
- def to_csv(**options)
2343
- CSV.generate_line(self, options)
2344
- end
2345
- end
2346
-
2347
- class String # :nodoc:
2348
- # Equivalent to CSV::parse_line(self, options)
2349
- #
2350
- # "CSV,data".parse_csv
2351
- # #=> ["CSV", "data"]
2352
- def parse_csv(**options)
2353
- CSV.parse_line(self, options)
2354
- end
2355
- end
2387
+ require_relative "core_ext/array"
2388
+ require_relative "core_ext/string"
data/news.md ADDED
@@ -0,0 +1,49 @@
1
+ # News
2
+
3
+ ## 1.0.1 - 2018-02-09
4
+
5
+ ### Improvements
6
+
7
+ * `CSV::Table#delete`: Added bulk delete support. You can delete
8
+ multiple rows and columns at once.
9
+ [GitHub#4][Patch by Vladislav]
10
+
11
+ * Updated Gem description.
12
+ [GitHub#11][Patch by Marcus Stollsteimer]
13
+
14
+ * Code cleanup.
15
+ [GitHub#12][Patch by Marcus Stollsteimer]
16
+ [GitHub#14][Patch by Steven Daniels]
17
+ [GitHub#18][Patch by takkanm]
18
+
19
+ * `CSV::Table#dig`: Added.
20
+ [GitHub#15][Patch by Tomohiro Ogoke]
21
+
22
+ * `CSV::Row#dig`: Added.
23
+ [GitHub#15][Patch by Tomohiro Ogoke]
24
+
25
+ * Added ISO 8601 support to date time converter.
26
+ [GitHub#16]
27
+
28
+ ### Fixes
29
+
30
+ * Fixed wrong `CSV::VERSION`.
31
+ [GitHub#10][Reported by Marcus Stollsteimer]
32
+
33
+ * `CSV.generate`: Fixed a regression bug that `String` argument is
34
+ ignored.
35
+ [GitHub#13][Patch by pavel]
36
+
37
+ ### Thanks
38
+
39
+ * Vladislav
40
+
41
+ * Marcus Stollsteimer
42
+
43
+ * Steven Daniels
44
+
45
+ * takkanm
46
+
47
+ * Tomohiro Ogoke
48
+
49
+ * pavel
metadata CHANGED
@@ -1,51 +1,60 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Edward Gray II
8
+ - Kouhei Sutou
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-12-13 00:00:00.000000000 Z
12
+ date: 2018-02-08 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - "~>"
18
+ - - ">="
18
19
  - !ruby/object:Gem::Version
19
- version: '1.14'
20
+ version: '0'
20
21
  type: :development
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - "~>"
25
+ - - ">="
25
26
  - !ruby/object:Gem::Version
26
- version: '1.14'
27
+ version: '0'
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: rake
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - "~>"
32
+ - - ">="
32
33
  - !ruby/object:Gem::Version
33
- version: '12'
34
+ version: '0'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - "~>"
39
+ - - ">="
39
40
  - !ruby/object:Gem::Version
40
- version: '12'
41
- description: the CSV library began its life as FasterCSV.
41
+ version: '0'
42
+ description: The CSV library provides a complete interface to CSV files and data.
43
+ It offers tools to enable you to read and write to and from Strings or IO objects,
44
+ as needed.
42
45
  email:
43
46
  -
47
+ - kou@cozmixng.org
44
48
  executables: []
45
49
  extensions: []
46
50
  extra_rdoc_files: []
47
51
  files:
52
+ - LICENSE.txt
53
+ - README.md
54
+ - lib/core_ext/array.rb
55
+ - lib/core_ext/string.rb
48
56
  - lib/csv.rb
57
+ - news.md
49
58
  homepage: https://github.com/ruby/csv
50
59
  licenses:
51
60
  - BSD-2-Clause
@@ -66,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
66
75
  version: '0'
67
76
  requirements: []
68
77
  rubyforge_project:
69
- rubygems_version: 2.7.3
78
+ rubygems_version: 2.5.2.2
70
79
  signing_key:
71
80
  specification_version: 4
72
81
  summary: CSV Reading and Writing