fastercsv 1.1.0 → 1.1.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.
- data/CHANGELOG +4 -0
- data/lib/faster_csv.rb +28 -15
- data/test/tc_csv_writing.rb +6 -0
- metadata +4 -3
data/CHANGELOG
CHANGED
data/lib/faster_csv.rb
CHANGED
@@ -75,7 +75,7 @@ require "stringio"
|
|
75
75
|
#
|
76
76
|
class FasterCSV
|
77
77
|
# The version of the installed library.
|
78
|
-
VERSION = "1.1.
|
78
|
+
VERSION = "1.1.1".freeze
|
79
79
|
|
80
80
|
#
|
81
81
|
# A FasterCSV::Row is part Array and part Hash. It retains an order for the
|
@@ -774,6 +774,7 @@ class FasterCSV
|
|
774
774
|
# <b><tt>:return_headers</tt></b>:: +false+
|
775
775
|
# <b><tt>:header_converters</tt></b>:: +nil+
|
776
776
|
# <b><tt>:skip_blanks</tt></b>:: +false+
|
777
|
+
# <b><tt>:force_quotes</tt></b>:: +false+
|
777
778
|
#
|
778
779
|
DEFAULT_OPTIONS = { :col_sep => ",",
|
779
780
|
:row_sep => :auto,
|
@@ -782,7 +783,8 @@ class FasterCSV
|
|
782
783
|
:headers => false,
|
783
784
|
:return_headers => false,
|
784
785
|
:header_converters => nil,
|
785
|
-
:skip_blanks => false
|
786
|
+
:skip_blanks => false,
|
787
|
+
:force_quotes => false }.freeze
|
786
788
|
|
787
789
|
#
|
788
790
|
# This method will build a drop-in replacement for many of the standard CSV
|
@@ -1292,6 +1294,8 @@ class FasterCSV
|
|
1292
1294
|
# <b><tt>:skip_blanks</tt></b>:: When set to a +true+ value, FasterCSV
|
1293
1295
|
# will skip over any rows with no
|
1294
1296
|
# content.
|
1297
|
+
# <b><tt>:force_quotes</tt></b>:: When set to a +true+ value, FasterCSV
|
1298
|
+
# will quote all CSV fields it creates.
|
1295
1299
|
#
|
1296
1300
|
# See FasterCSV::DEFAULT_OPTIONS for the default settings.
|
1297
1301
|
#
|
@@ -1354,19 +1358,7 @@ class FasterCSV
|
|
1354
1358
|
# handle FasterCSV::Row objects
|
1355
1359
|
row = row.fields if row.is_a? self.class::Row
|
1356
1360
|
|
1357
|
-
@io << row.map
|
1358
|
-
if field.nil? # represent +nil+ fields as empty unquoted fields
|
1359
|
-
""
|
1360
|
-
else
|
1361
|
-
field = String(field) # Stringify fields
|
1362
|
-
# represent empty fields as empty quoted fields
|
1363
|
-
if field.empty? or field.count(%Q{\r\n#{@col_sep}"}).nonzero?
|
1364
|
-
%Q{"#{field.gsub('"', '""')}"} # escape quoted fields
|
1365
|
-
else
|
1366
|
-
field # unquoted field
|
1367
|
-
end
|
1368
|
-
end
|
1369
|
-
end.join(@col_sep) + @row_sep # add separators
|
1361
|
+
@io << row.map(&@quote).join(@col_sep) + @row_sep # quote and separate
|
1370
1362
|
|
1371
1363
|
self # for chaining
|
1372
1364
|
end
|
@@ -1573,6 +1565,8 @@ class FasterCSV
|
|
1573
1565
|
# +STDERR+ and any stream open for output only with a default
|
1574
1566
|
# <tt>@row_sep</tt> of <tt>$INPUT_RECORD_SEPARATOR</tt> (<tt>$/</tt>).
|
1575
1567
|
#
|
1568
|
+
# This method also establishes the quoting rules used for CSV output.
|
1569
|
+
#
|
1576
1570
|
def init_separators(options)
|
1577
1571
|
# store the selected separators
|
1578
1572
|
@col_sep = options.delete(:col_sep)
|
@@ -1611,6 +1605,25 @@ class FasterCSV
|
|
1611
1605
|
end
|
1612
1606
|
end
|
1613
1607
|
end
|
1608
|
+
|
1609
|
+
# establish quoting rules
|
1610
|
+
@quote = if options.delete(:force_quotes)
|
1611
|
+
lambda { |field| %Q{"#{String(field).gsub('"', '""')}"} }
|
1612
|
+
else
|
1613
|
+
lambda do |field|
|
1614
|
+
if field.nil? # represent +nil+ fields as empty unquoted fields
|
1615
|
+
""
|
1616
|
+
else
|
1617
|
+
field = String(field) # Stringify fields
|
1618
|
+
# represent empty fields as empty quoted fields
|
1619
|
+
if field.empty? or field.count(%Q{\r\n#{@col_sep}"}).nonzero?
|
1620
|
+
%Q{"#{field.gsub('"', '""')}"} # escape quoted fields
|
1621
|
+
else
|
1622
|
+
field # unquoted field
|
1623
|
+
end
|
1624
|
+
end
|
1625
|
+
end
|
1626
|
+
end
|
1614
1627
|
end
|
1615
1628
|
|
1616
1629
|
# Pre-compiles parsers and stores them by name for access during reads.
|
data/test/tc_csv_writing.rb
CHANGED
@@ -87,4 +87,10 @@ class TestFasterCSVWriting < Test::Unit::TestCase
|
|
87
87
|
assert_equal( "a,b,,c\r\n", FasterCSV.generate_line( ["a", "b", nil, "c"],
|
88
88
|
:row_sep => "\r\n" ) )
|
89
89
|
end
|
90
|
+
|
91
|
+
def test_force_quotes
|
92
|
+
assert_equal( %Q{"1","b","","already ""quoted"""\n},
|
93
|
+
FasterCSV.generate_line( [1, "b", nil, %Q{already "quoted"}],
|
94
|
+
:force_quotes => true ) )
|
95
|
+
end
|
90
96
|
end
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.1
|
3
3
|
specification_version: 1
|
4
4
|
name: fastercsv
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.1.
|
7
|
-
date:
|
6
|
+
version: 1.1.1
|
7
|
+
date: 2007-01-31 00:00:00 -06:00
|
8
8
|
summary: FasterCSV is CSV, but faster, smaller, and cleaner.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,6 +25,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- James Edward Gray II
|
30
31
|
files:
|