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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7ca333b9d9a9cdd6246dd186c3665cd016859f1
4
- data.tar.gz: eb87e512cd89d733dcd4af3137050a1973137afa
3
+ metadata.gz: f4bf22d03d73abd1b9737b87bcd572787074b735
4
+ data.tar.gz: 5b82ac622da0097ffe017c94c79577b2bf2afadc
5
5
  SHA512:
6
- metadata.gz: bd81198e0248578d24a566d1861281bf8a2313094b4f7133bcf4e879c50687524fa85d26a53aebfa4e4a3eacb1418536003ffff3086c0a3138be4af838ebf13b
7
- data.tar.gz: 9fa44baa803d84359f7aeb55a64f8b0f1e7d7a9335657d0c792d50706e336de8047bba8d9bd35634d4467b3b6c56ce01f9ef9f052eb17230fa753d0a22a5b311
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.generate('example.csv') do |csv|
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 )
@@ -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 generate(path, options = {}, &block)
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
- with io, options, &block
13
- end
14
- end
15
-
16
- def with(io, options = {})
17
- generator = new(io, options)
12
+ generator = new(io, options)
13
+ yield generator
18
14
 
19
- yield generator if block_given?
20
- generator
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
@@ -1,3 +1,3 @@
1
1
  class CsvGenerator
2
- VERSION = '0.5.2'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -1,12 +1,12 @@
1
1
  require 'fakefs/spec_helpers'
2
2
 
3
3
  describe CsvGenerator do
4
- describe '.generate' do
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.generate('test.csv') do |csv|
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.generate('test.csv') do |csv|
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.generate('test.csv', mode: 'a') do |csv|
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.5.2
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-04 00:00:00.000000000 Z
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: '0'
130
+ version: 1.9.3
131
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
132
  requirements:
133
133
  - - ">="