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 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
  - - ">="