csv_generator 0.5.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://semaphoreapp.com/api/v1/projects/ad79168d-d8c1-45c5-9a25-6e8354304f83/300861/badge.png)](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
|
- - ">="
|