csv_generator 0.5.2 → 1.0.0
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 +4 -4
- data/README.md +107 -2
- data/csv_generator.gemspec +2 -0
- data/lib/csv_generator.rb +15 -9
- data/lib/csv_generator/version.rb +1 -1
- data/spec/csv_generator_spec.rb +30 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4bf22d03d73abd1b9737b87bcd572787074b735
|
4
|
+
data.tar.gz: 5b82ac622da0097ffe017c94c79577b2bf2afadc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf79ca4aa156080e265d18b8b5c5d62a76655257cac4758a14fded720b59c6cce8c8f854328628ac8befe6040d19e2999e432836e02ab7b63725cd55e5a7c1ea
|
7
|
+
data.tar.gz: ad1a06305ca8dd6493a9ecf3f73cbb93b44c4016a5496d6cc6aa880457478165fafdb1d250fd1cca6a6e3250d0883b0ee6359386b03aa61bb57fade426906e8e
|
data/README.md
CHANGED
@@ -2,9 +2,46 @@
|
|
2
2
|
|
3
3
|
[](https://semaphoreapp.com/cesare/csv_generator)
|
4
4
|
|
5
|
-
Just a CSV generator :)
|
5
|
+
Just a CSV generator :)
|
6
6
|
It ensures string fields quoted.
|
7
7
|
|
8
|
+
## What is the difference from standard CSV library?
|
9
|
+
|
10
|
+
Standard CSV also can quote values with `force_quotes` option, like this:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
CSV.open(filename, 'w', force_quotes: true) do |csv|
|
14
|
+
csv << ['0123', 987]
|
15
|
+
end
|
16
|
+
```
|
17
|
+
|
18
|
+
This example above quotes ALL values (including the numeric value 987).
|
19
|
+
It generates
|
20
|
+
|
21
|
+
```
|
22
|
+
"0123","987"
|
23
|
+
```
|
24
|
+
|
25
|
+
Note that the numeric value 987 is also quoted.
|
26
|
+
In most cases, this behavior is sufficient.
|
27
|
+
|
28
|
+
However, sometimes it would be useful if you can distinguish string values and numeric values with quotation, in following manner:
|
29
|
+
|
30
|
+
* if a value is quoted, it is a string
|
31
|
+
* if not, it is a number
|
32
|
+
|
33
|
+
CsvGenerator follows these rules.
|
34
|
+
You can generate:
|
35
|
+
|
36
|
+
```
|
37
|
+
"0123",987
|
38
|
+
```
|
39
|
+
|
40
|
+
As you see, numeric value 987 is not quoted.
|
41
|
+
|
42
|
+
Some CSV-readable application might interpret "0123" as a string, 987 as a number.
|
43
|
+
Is such a case, CsvGenerator will be useful.
|
44
|
+
|
8
45
|
## Installation
|
9
46
|
|
10
47
|
Add this line to your application's Gemfile:
|
@@ -23,14 +60,82 @@ Or install it yourself as:
|
|
23
60
|
|
24
61
|
## Usage
|
25
62
|
|
63
|
+
Basic usage is something like this:
|
64
|
+
|
26
65
|
```ruby
|
27
|
-
CsvGenerator.
|
66
|
+
CsvGenerator.open('example.csv') do |csv|
|
28
67
|
csv << ['0123', 456, 'this is a string']
|
29
68
|
end
|
30
69
|
# writes to example.csv:
|
31
70
|
# "0123",456,"this is a string"
|
32
71
|
```
|
33
72
|
|
73
|
+
If you have multiple rows,
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
rows = [
|
77
|
+
['0123', 456, 'this is a string'],
|
78
|
+
['1234', 987, 'this is the second row']
|
79
|
+
]
|
80
|
+
|
81
|
+
CsvGenerator.open('example.csv') do |csv|
|
82
|
+
rows.each do |row|
|
83
|
+
csv << row
|
84
|
+
end
|
85
|
+
end
|
86
|
+
# writes to example.csv:
|
87
|
+
# "0123",456,"this is a string"
|
88
|
+
# "1234",987,"this is the second row"
|
89
|
+
```
|
90
|
+
|
91
|
+
Or using `CsvGenerator#generate`,
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
rows = [
|
95
|
+
['0123', 456, 'this is a string'],
|
96
|
+
['1234', 987, 'this is the second row']
|
97
|
+
]
|
98
|
+
|
99
|
+
CsvGenerator.open('example.csv').generate(rows)
|
100
|
+
# writes to example.csv:
|
101
|
+
# "0123",456,"this is a string"
|
102
|
+
# "1234",987,"this is the second row"
|
103
|
+
```
|
104
|
+
|
105
|
+
Data source of a row does not have to be an array.
|
106
|
+
If you have objects (such as ActiveRecord instances),
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
class User
|
110
|
+
attr_reader :name, :score
|
111
|
+
end
|
112
|
+
|
113
|
+
users = [
|
114
|
+
User.new(name: 'test1', score: 123),
|
115
|
+
User.new(name: 'test2', socre: 987)
|
116
|
+
]
|
117
|
+
|
118
|
+
CsvGenerator.open('example.csv') do |csv|
|
119
|
+
csv.generate(users) do |user|
|
120
|
+
[user.name, user.score]
|
121
|
+
end
|
122
|
+
end
|
123
|
+
# writes to example.csv:
|
124
|
+
# "test1",123
|
125
|
+
# "test2",987
|
126
|
+
```
|
127
|
+
|
128
|
+
If you need a string instead of a file, use StringIO like this:
|
129
|
+
|
130
|
+
```ruby
|
131
|
+
io = StringIO.new
|
132
|
+
CsvGenerator.new(io) do |csv|
|
133
|
+
csv << ['test', 123]
|
134
|
+
end
|
135
|
+
|
136
|
+
io.string # => "test",123
|
137
|
+
```
|
138
|
+
|
34
139
|
## Contributing
|
35
140
|
|
36
141
|
1. Fork it ( https://github.com/cesare/csv_generator/fork )
|
data/csv_generator.gemspec
CHANGED
@@ -13,6 +13,8 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.homepage = 'https://github.com/cesare/csv_generator'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
|
+
spec.required_ruby_version = '>= 1.9.3'
|
17
|
+
|
16
18
|
spec.files = `git ls-files -z`.split("\x0")
|
17
19
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
data/lib/csv_generator.rb
CHANGED
@@ -4,20 +4,16 @@ class CsvGenerator
|
|
4
4
|
attr_reader :io
|
5
5
|
|
6
6
|
class << self
|
7
|
-
def
|
7
|
+
def open(path, options = {})
|
8
8
|
mode = options[:mode] || 'w'
|
9
9
|
permission = options[:permission] || 0644
|
10
10
|
|
11
11
|
File.open(path, mode, permission) do |io|
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
def with(io, options = {})
|
17
|
-
generator = new(io, options)
|
12
|
+
generator = new(io, options)
|
13
|
+
yield generator
|
18
14
|
|
19
|
-
|
20
|
-
|
15
|
+
generator
|
16
|
+
end
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
@@ -26,6 +22,16 @@ class CsvGenerator
|
|
26
22
|
@options = options
|
27
23
|
end
|
28
24
|
|
25
|
+
def generate(enumerable)
|
26
|
+
enumerable.each do |row_instance|
|
27
|
+
if block_given?
|
28
|
+
self << (yield row_instance)
|
29
|
+
else
|
30
|
+
self << row_instance
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
29
35
|
def <<(row_values)
|
30
36
|
io.write row_generator.generate(row_values)
|
31
37
|
end
|
data/spec/csv_generator_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'fakefs/spec_helpers'
|
2
2
|
|
3
3
|
describe CsvGenerator do
|
4
|
-
describe '.
|
4
|
+
describe '.open' do
|
5
5
|
context 'given only a file name' do
|
6
6
|
include FakeFS::SpecHelpers
|
7
7
|
|
8
8
|
specify do
|
9
|
-
CsvGenerator.
|
9
|
+
CsvGenerator.open('test.csv') do |csv|
|
10
10
|
csv << ['test', 123]
|
11
11
|
end
|
12
12
|
|
@@ -22,7 +22,7 @@ describe CsvGenerator do
|
|
22
22
|
file.write(%("existing line",987\r\n))
|
23
23
|
end
|
24
24
|
|
25
|
-
CsvGenerator.
|
25
|
+
CsvGenerator.open('test.csv') do |csv|
|
26
26
|
csv << ['test', 123]
|
27
27
|
end
|
28
28
|
|
@@ -38,7 +38,7 @@ describe CsvGenerator do
|
|
38
38
|
file.write(%("existing line",987\r\n))
|
39
39
|
end
|
40
40
|
|
41
|
-
CsvGenerator.
|
41
|
+
CsvGenerator.open('test.csv', mode: 'a') do |csv|
|
42
42
|
csv << ['test', 123]
|
43
43
|
end
|
44
44
|
|
@@ -47,6 +47,32 @@ describe CsvGenerator do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
describe '#generate' do
|
51
|
+
let(:io) { StringIO.new }
|
52
|
+
let(:csv) { CsvGenerator.new(io) }
|
53
|
+
|
54
|
+
context 'without block' do
|
55
|
+
specify do
|
56
|
+
csv.generate([['test1', 123], ['test2', 987]])
|
57
|
+
|
58
|
+
expect(io.string).to eq %("test1",123\r\n"test2",987\r\n)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'with block' do
|
63
|
+
let(:struct) { Struct.new(:name, :score) }
|
64
|
+
let(:rows) { [struct.new('test1', 123), struct.new('test2', 987)] }
|
65
|
+
|
66
|
+
specify do
|
67
|
+
csv.generate(rows) do |s|
|
68
|
+
[s.name, s.score]
|
69
|
+
end
|
70
|
+
|
71
|
+
expect(io.string).to eq %("test1",123\r\n"test2",987\r\n)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
50
76
|
describe '#<<' do
|
51
77
|
let(:io) { StringIO.new }
|
52
78
|
let(:csv) { CsvGenerator.new(io) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv_generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SAWADA Tadashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -127,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
127
|
requirements:
|
128
128
|
- - ">="
|
129
129
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
130
|
+
version: 1.9.3
|
131
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
132
|
requirements:
|
133
133
|
- - ">="
|