comma 4.2.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +10 -1
- data/.rubocop_todo.yml +3 -364
- data/.travis.yml +36 -55
- data/Appraisals +14 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +19 -16
- data/README.md +2 -2
- data/Rakefile +2 -0
- data/comma.gemspec +13 -11
- data/gemfiles/{active4.1.16.gemfile → active4.2.11.1.gemfile} +2 -2
- data/gemfiles/{active4.2.8.gemfile.lock → active4.2.11.1.gemfile.lock} +43 -38
- data/gemfiles/{active4.0.13.gemfile → active5.0.7.2.gemfile} +2 -2
- data/gemfiles/{active5.0.1.gemfile.lock → active5.0.7.2.gemfile.lock} +44 -40
- data/gemfiles/{active5.1.0.gemfile → active5.1.7.gemfile} +2 -2
- data/gemfiles/{active5.1.0.gemfile.lock → active5.1.7.gemfile.lock} +44 -40
- data/gemfiles/{active4.2.8.gemfile → active5.2.3.gemfile} +2 -2
- data/gemfiles/active5.2.3.gemfile.lock +108 -0
- data/gemfiles/{active5.0.1.gemfile → active6.0.0.gemfile} +2 -2
- data/gemfiles/{active5.2.0.gemfile.lock → active6.0.0.gemfile.lock} +31 -29
- data/gemfiles/{rails4.1.16.gemfile → rails4.2.11.1.gemfile} +1 -1
- data/gemfiles/{rails4.2.8.gemfile.lock → rails4.2.11.1.gemfile.lock} +84 -80
- data/gemfiles/{rails4.0.13.gemfile → rails5.0.7.2.gemfile} +1 -1
- data/gemfiles/rails5.0.7.2.gemfile.lock +198 -0
- data/gemfiles/{rails5.1.0.gemfile → rails5.1.7.gemfile} +1 -1
- data/gemfiles/rails5.1.7.gemfile.lock +198 -0
- data/gemfiles/{rails5.2.0.gemfile → rails5.2.3.gemfile} +1 -1
- data/gemfiles/{rails5.2.0.gemfile.lock → rails5.2.3.gemfile.lock} +82 -80
- data/gemfiles/{rails4.2.8.gemfile → rails6.0.0.gemfile} +1 -1
- data/gemfiles/rails6.0.0.gemfile.lock +237 -0
- data/init.rb +2 -0
- data/lib/comma.rb +23 -33
- data/lib/comma/array.rb +2 -0
- data/lib/comma/data_extractor.rb +5 -5
- data/lib/comma/data_mapper_collection.rb +9 -3
- data/lib/comma/extractor.rb +3 -5
- data/lib/comma/generator.rb +11 -11
- data/lib/comma/header_extractor.rb +18 -14
- data/lib/comma/mongoid.rb +10 -7
- data/lib/comma/object.rb +5 -1
- data/lib/comma/relation.rb +16 -10
- data/lib/comma/version.rb +3 -1
- data/spec/comma/comma_spec.rb +68 -47
- data/spec/comma/data_extractor_spec.rb +6 -10
- data/spec/comma/header_extractor_spec.rb +2 -8
- data/spec/comma/rails/active_record_spec.rb +28 -26
- data/spec/comma/rails/data_mapper_collection_spec.rb +4 -3
- data/spec/comma/rails/mongoid_spec.rb +8 -7
- data/spec/controllers/users_controller_spec.rb +48 -47
- data/spec/non_rails_app/ruby_classes.rb +13 -6
- data/spec/rails_app/active_record/config.rb +3 -1
- data/spec/rails_app/active_record/models.rb +4 -2
- data/spec/rails_app/data_mapper/config.rb +2 -0
- data/spec/rails_app/mongoid/config.rb +4 -2
- data/spec/rails_app/rails_app.rb +12 -11
- data/spec/rails_app/tmp/.gitkeep +0 -0
- data/spec/spec_helper.rb +7 -3
- metadata +27 -30
- data/gemfiles/active4.0.13.gemfile.lock +0 -107
- data/gemfiles/active4.1.16.gemfile.lock +0 -106
- data/gemfiles/active5.2.0.gemfile +0 -10
- data/gemfiles/rails4.0.13.gemfile.lock +0 -158
- data/gemfiles/rails4.1.16.gemfile.lock +0 -162
- data/gemfiles/rails5.0.1.gemfile +0 -11
- data/gemfiles/rails5.0.1.gemfile.lock +0 -194
- data/gemfiles/rails5.1.0.gemfile.lock +0 -194
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
# comma do
|
@@ -8,7 +10,6 @@ require 'spec_helper'
|
|
8
10
|
# end
|
9
11
|
|
10
12
|
describe Comma::HeaderExtractor do # rubocop:disable Metrics/BlockLength
|
11
|
-
|
12
13
|
before do
|
13
14
|
@isbn = Isbn.new('123123123', '321321321')
|
14
15
|
@book = Book.new('Smalltalk-80', 'Language and Implementation', @isbn)
|
@@ -17,37 +18,30 @@ describe Comma::HeaderExtractor do # rubocop:disable Metrics/BlockLength
|
|
17
18
|
end
|
18
19
|
|
19
20
|
describe 'when no parameters are provided' do
|
20
|
-
|
21
21
|
it 'should use the method name as the header name, humanized' do
|
22
22
|
@headers.should include('Description')
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
describe 'when given a string description as a parameter' do
|
27
|
-
|
28
27
|
it 'should use the string value, unmodified' do
|
29
28
|
@headers.should include('Title')
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
33
32
|
describe 'when an hash is passed as a parameter' do
|
34
|
-
|
35
33
|
describe 'with a string value' do
|
36
|
-
|
37
34
|
it 'should use the string value, unmodified' do
|
38
35
|
@headers.should include('ISBN-10')
|
39
36
|
end
|
40
37
|
end
|
41
38
|
|
42
39
|
describe 'with a non-string value' do
|
43
|
-
|
44
40
|
it 'should use the non string value converted to a string, humanized' do
|
45
41
|
@headers.should include('Issuer')
|
46
42
|
end
|
47
43
|
end
|
48
|
-
|
49
44
|
end
|
50
|
-
|
51
45
|
end
|
52
46
|
|
53
47
|
describe Comma::HeaderExtractor, 'with static column method' do
|
@@ -1,19 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
if defined? ActiveRecord
|
4
6
|
|
5
7
|
describe Comma, 'generating CSV from an ActiveRecord object' do # rubocop:disable Metrics/BlockLength
|
6
|
-
|
7
8
|
class Picture < ActiveRecord::Base
|
8
|
-
belongs_to :imageable, :
|
9
|
+
belongs_to :imageable, polymorphic: true
|
9
10
|
|
10
11
|
comma :pr_83 do
|
11
|
-
imageable :
|
12
|
+
imageable name: 'Picture'
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
16
|
class Person < ActiveRecord::Base
|
16
|
-
scope(:teenagers,
|
17
|
+
scope(:teenagers, -> { where(age: 13..19) })
|
17
18
|
|
18
19
|
comma do
|
19
20
|
name
|
@@ -26,18 +27,18 @@ if defined? ActiveRecord
|
|
26
27
|
job :title
|
27
28
|
end
|
28
29
|
|
29
|
-
has_many :pictures, :
|
30
|
+
has_many :pictures, as: :imageable
|
30
31
|
end
|
31
32
|
|
32
33
|
class Job < ActiveRecord::Base
|
33
34
|
belongs_to :person
|
34
35
|
|
35
36
|
comma do
|
36
|
-
person_formatter :
|
37
|
+
person_formatter name: 'Name'
|
37
38
|
end
|
38
39
|
|
39
40
|
def person_formatter
|
40
|
-
@person_formatter ||= PersonFormatter.new(
|
41
|
+
@person_formatter ||= PersonFormatter.new(person)
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
@@ -52,33 +53,33 @@ if defined? ActiveRecord
|
|
52
53
|
end
|
53
54
|
|
54
55
|
before(:all) do
|
55
|
-
#Setup AR model in memory
|
56
|
-
ActiveRecord::Base.connection.create_table :pictures, :
|
56
|
+
# Setup AR model in memory
|
57
|
+
ActiveRecord::Base.connection.create_table :pictures, force: true do |table|
|
57
58
|
table.column :name, :string
|
58
59
|
table.column :imageable_id, :integer
|
59
60
|
table.column :imageable_type, :string
|
60
61
|
end
|
61
62
|
|
62
|
-
ActiveRecord::Base.connection.create_table :people, :
|
63
|
+
ActiveRecord::Base.connection.create_table :people, force: true do |table|
|
63
64
|
table.column :name, :string
|
64
65
|
table.column :age, :integer
|
65
66
|
end
|
66
67
|
Person.reset_column_information
|
67
68
|
|
68
|
-
ActiveRecord::Base.connection.create_table :jobs, :
|
69
|
+
ActiveRecord::Base.connection.create_table :jobs, force: true do |table|
|
69
70
|
table.column :person_id, :integer
|
70
71
|
table.column :title, :string
|
71
72
|
end
|
72
73
|
Job.reset_column_information
|
73
74
|
|
74
|
-
@person = Person.new(:
|
75
|
-
@person.build_job(:
|
75
|
+
@person = Person.new(age: 18, name: 'Junior')
|
76
|
+
@person.build_job(title: 'Nice job')
|
76
77
|
@person.save!
|
77
|
-
Picture.create(:
|
78
|
+
Picture.create(name: 'photo.jpg', imageable_id: @person.id, imageable_type: 'Person')
|
78
79
|
end
|
79
80
|
|
80
|
-
describe
|
81
|
-
it 'should extend ActiveRecord::NamedScope::Scope to add a #to_comma method which will return CSV content for objects within the scope' do
|
81
|
+
describe '#to_comma on scopes' do
|
82
|
+
it 'should extend ActiveRecord::NamedScope::Scope to add a #to_comma method which will return CSV content for objects within the scope' do # rubocop:disable Style/LineLength
|
82
83
|
Person.teenagers.to_comma.should == "Name,Age\nJunior,18\n"
|
83
84
|
end
|
84
85
|
|
@@ -112,7 +113,7 @@ if defined? ActiveRecord
|
|
112
113
|
end
|
113
114
|
end
|
114
115
|
|
115
|
-
I18n.config.backend.store_translations(:ja,
|
116
|
+
I18n.config.backend.store_translations(:ja, activerecord: { attributes: { person: { age: '年齢', name: '名前' } } })
|
116
117
|
@original_locale = I18n.locale
|
117
118
|
I18n.locale = :ja
|
118
119
|
end
|
@@ -131,7 +132,7 @@ if defined? ActiveRecord
|
|
131
132
|
|
132
133
|
describe 'github issue 75' do
|
133
134
|
it 'should find association' do
|
134
|
-
|
135
|
+
-> { Person.all.to_comma(:issue_75) }.should_not raise_error
|
135
136
|
end
|
136
137
|
end
|
137
138
|
|
@@ -143,12 +144,13 @@ if defined? ActiveRecord
|
|
143
144
|
|
144
145
|
describe 'github pull-request 83' do
|
145
146
|
it 'should not raise NameError' do
|
146
|
-
|
147
|
+
expect { Picture.all.to_comma(:pr_83) }
|
148
|
+
.not_to raise_exception(NameError)
|
147
149
|
end
|
148
150
|
end
|
149
151
|
end
|
150
152
|
|
151
|
-
describe Comma, 'generating CSV from an ActiveRecord object using Single Table Inheritance' do # rubocop:disable
|
153
|
+
describe Comma, 'generating CSV from an ActiveRecord object using Single Table Inheritance' do # rubocop:disable Metric/BlockLength
|
152
154
|
class Animal < ActiveRecord::Base
|
153
155
|
comma do
|
154
156
|
name 'Name' do |name|
|
@@ -174,15 +176,15 @@ if defined? ActiveRecord
|
|
174
176
|
end
|
175
177
|
|
176
178
|
before(:all) do
|
177
|
-
#Setup AR model in memory
|
178
|
-
ActiveRecord::Base.connection.create_table :animals, :
|
179
|
+
# Setup AR model in memory
|
180
|
+
ActiveRecord::Base.connection.create_table :animals, force: true do |table|
|
179
181
|
table.column :name, :string
|
180
182
|
table.column :type, :string
|
181
183
|
end
|
182
184
|
|
183
|
-
@dog = Dog.new(:
|
185
|
+
@dog = Dog.new(name: 'Rex')
|
184
186
|
@dog.save!
|
185
|
-
@cat = Cat.new(:
|
187
|
+
@cat = Cat.new(name: 'Kitty')
|
186
188
|
@cat.save!
|
187
189
|
end
|
188
190
|
|
@@ -190,13 +192,13 @@ if defined? ActiveRecord
|
|
190
192
|
@dog.to_comma.should == %w[Dog-Rex]
|
191
193
|
end
|
192
194
|
|
193
|
-
#FIXME: this one is failing - the comma block from Dog is executed instead of the one from the super class
|
195
|
+
# FIXME: this one is failing - the comma block from Dog is executed instead of the one from the super class
|
194
196
|
it 'should return and array of data content, as defined in comma block in super class, if not present in child' do
|
195
197
|
@cat.to_comma.should == %w[Super-Kitty]
|
196
198
|
end
|
197
199
|
|
198
200
|
it 'should call definion in parent class' do
|
199
|
-
|
201
|
+
-> { @dog.to_comma(:with_type) }.should_not raise_error
|
200
202
|
end
|
201
203
|
end
|
202
204
|
end
|
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
if defined? DataMapper
|
4
6
|
|
5
7
|
describe Comma, 'generating CSV from an DataMapper object' do # rubocop:disable Metrics/BlockLength
|
6
|
-
|
7
8
|
class Person
|
8
9
|
include DataMapper::Resource
|
9
10
|
|
@@ -30,9 +31,9 @@ if defined? DataMapper
|
|
30
31
|
after(:all) do
|
31
32
|
end
|
32
33
|
|
33
|
-
describe
|
34
|
+
describe 'case' do
|
34
35
|
before do
|
35
|
-
@person = Person.new(:
|
36
|
+
@person = Person.new(age: 18, name: 'Junior')
|
36
37
|
@person.save
|
37
38
|
end
|
38
39
|
|
@@ -1,16 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
if defined? Mongoid
|
4
6
|
|
5
7
|
describe Comma, 'generating CSV from an Mongoid object' do
|
6
|
-
|
7
8
|
class Person
|
8
9
|
include Mongoid::Document
|
9
10
|
|
10
|
-
field :name, :
|
11
|
-
field :age, :
|
11
|
+
field :name, type: String
|
12
|
+
field :age, type: Integer
|
12
13
|
|
13
|
-
scope :teenagers, between(:
|
14
|
+
scope :teenagers, between(age: 13..19)
|
14
15
|
|
15
16
|
comma do
|
16
17
|
name
|
@@ -22,13 +23,13 @@ if defined? Mongoid
|
|
22
23
|
Mongoid.purge!
|
23
24
|
end
|
24
25
|
|
25
|
-
describe
|
26
|
+
describe 'case' do
|
26
27
|
before do
|
27
|
-
@person = Person.new(:
|
28
|
+
@person = Person.new(age: 18, name: 'Junior')
|
28
29
|
@person.save
|
29
30
|
end
|
30
31
|
|
31
|
-
it 'should extend ActiveRecord::NamedScope::Scope to add a #to_comma method which will return CSV content for objects within the scope' do
|
32
|
+
it 'should extend ActiveRecord::NamedScope::Scope to add a #to_comma method which will return CSV content for objects within the scope' do # rubocop:disable Metrics/LineLength
|
32
33
|
Person.teenagers.to_comma.should == "Name,Age\nJunior,18\n"
|
33
34
|
end
|
34
35
|
|
@@ -1,26 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
if defined?(Rails)
|
4
6
|
|
5
7
|
RSpec.describe UsersController, type: :controller do # rubocop:disable Metrics/BlockLength
|
6
|
-
|
7
|
-
describe "rails setup" do
|
8
|
-
|
8
|
+
describe 'rails setup' do
|
9
9
|
it 'should capture the CSV renderer provided by Rails' do
|
10
10
|
mock_users = [mock_model(User), mock_model(User)]
|
11
11
|
allow(User).to receive(:all).and_return(mock_users)
|
12
12
|
|
13
13
|
mock_users.should_receive(:to_comma).once
|
14
14
|
|
15
|
-
get :index, :
|
15
|
+
get :index, format: :csv
|
16
16
|
end
|
17
|
-
|
18
17
|
end
|
19
18
|
|
20
|
-
describe
|
19
|
+
describe 'controller' do # rubocop:disable Metrics/BlockLength
|
21
20
|
before(:all) do
|
22
|
-
@user_1 = User.create!(:
|
23
|
-
@user_2 = User.create!(:
|
21
|
+
@user_1 = User.create!(first_name: 'Fred', last_name: 'Flintstone')
|
22
|
+
@user_2 = User.create!(first_name: 'Wilma', last_name: 'Flintstone')
|
24
23
|
end
|
25
24
|
|
26
25
|
it 'should not affect html requested' do
|
@@ -28,42 +27,40 @@ if defined?(Rails)
|
|
28
27
|
|
29
28
|
response.status.should eq 200
|
30
29
|
response.content_type.should eq 'text/html'
|
31
|
-
response.body.should
|
30
|
+
response.body.should == 'Users!'
|
32
31
|
end
|
33
32
|
|
34
|
-
it
|
35
|
-
get :index, :
|
33
|
+
it 'should return a csv when requested' do
|
34
|
+
get :index, format: :csv
|
36
35
|
|
37
36
|
response.status.should eq 200
|
38
37
|
response.content_type.should eq 'text/csv'
|
39
|
-
response.header[
|
38
|
+
response.header['Content-Disposition'].should include('filename="data.csv"')
|
40
39
|
|
41
|
-
expected_content
|
40
|
+
expected_content = <<-CSV.gsub(/^\s+/, '')
|
42
41
|
First name,Last name,Name
|
43
42
|
Fred,Flintstone,Fred Flintstone
|
44
43
|
Wilma,Flintstone,Wilma Flintstone
|
45
44
|
CSV
|
46
45
|
|
47
|
-
response.body.should
|
46
|
+
response.body.should == expected_content
|
48
47
|
end
|
49
48
|
|
50
49
|
describe 'with comma options' do
|
51
|
-
|
52
50
|
it 'should allow the style to be chosen from the renderer' do
|
53
|
-
#Must be passed in same format (string/symbol) eg:
|
51
|
+
# Must be passed in same format (string/symbol) eg:
|
54
52
|
# format.csv { render User.all, :style => :shortened }
|
55
53
|
|
56
|
-
get :with_custom_style, :
|
54
|
+
get :with_custom_style, format: :csv
|
57
55
|
|
58
|
-
expected_content
|
56
|
+
expected_content = <<-CSV.gsub(/^\s+/, '')
|
59
57
|
First name,Last name
|
60
58
|
Fred,Flintstone
|
61
59
|
Wilma,Flintstone
|
62
60
|
CSV
|
63
61
|
|
64
|
-
response.body.should
|
62
|
+
response.body.should == expected_content
|
65
63
|
end
|
66
|
-
|
67
64
|
end
|
68
65
|
|
69
66
|
describe 'with custom options' do # rubocop:disable Metrics/BlockLength
|
@@ -80,105 +77,109 @@ if defined?(Rails)
|
|
80
77
|
end
|
81
78
|
|
82
79
|
it 'should allow a filename to be set' do
|
83
|
-
get_ :with_custom_options, :
|
80
|
+
get_ :with_custom_options, format: :csv, params: { custom_options: { filename: 'my_custom_name' } }
|
84
81
|
|
85
82
|
response.status.should eq 200
|
86
83
|
response.content_type.should eq 'text/csv'
|
87
|
-
response.header[
|
84
|
+
response.header['Content-Disposition'].should include('filename="my_custom_name.csv"')
|
88
85
|
end
|
89
86
|
|
90
|
-
it
|
87
|
+
it 'should allow a custom filename with spaces' do
|
91
88
|
require 'shellwords'
|
92
|
-
|
89
|
+
params = { custom_options: { filename: 'filename with a lot of spaces' } }
|
90
|
+
get_ :with_custom_options, format: :csv, params: params
|
93
91
|
|
94
92
|
response.status.should eq 200
|
95
93
|
response.content_type.should eq 'text/csv'
|
96
|
-
response.header[
|
94
|
+
response.header['Content-Disposition'].should include('filename="filename with a lot of spaces.csv"')
|
97
95
|
|
98
|
-
filename_string = response.header[
|
96
|
+
filename_string = response.header['Content-Disposition'].split('=').last
|
99
97
|
# shellsplit honors quoted strings
|
100
98
|
filename_string.shellsplit.length.should == 1
|
101
99
|
end
|
102
100
|
|
103
101
|
it 'should allow a file extension to be set' do
|
104
|
-
get_ :with_custom_options, :
|
102
|
+
get_ :with_custom_options, format: :csv, params: { custom_options: { extension: :txt } }
|
105
103
|
|
106
104
|
response.status.should eq 200
|
107
105
|
response.content_type.should eq 'text/csv'
|
108
|
-
response.header[
|
106
|
+
response.header['Content-Disposition'].should include('filename="data.txt"')
|
109
107
|
end
|
110
108
|
|
111
109
|
it 'should allow mime type to be set' do
|
112
|
-
get_ :with_custom_options, :
|
110
|
+
get_ :with_custom_options, format: :csv, params: { custom_options: { mime_type: 'text/plain' } }
|
113
111
|
response.status.should eq 200
|
114
|
-
response.content_type.should
|
112
|
+
response.content_type.should == 'text/plain'
|
115
113
|
end
|
116
114
|
|
117
115
|
describe 'headers' do
|
118
|
-
|
119
116
|
it 'should allow toggling on' do
|
120
|
-
get_ :with_custom_options, :
|
117
|
+
get_ :with_custom_options, format: :csv, params: { custom_options: { write_headers: 'true' } }
|
121
118
|
|
122
119
|
response.status.should eq 200
|
123
120
|
response.content_type.should eq 'text/csv'
|
124
121
|
|
125
|
-
expected_content
|
122
|
+
expected_content = <<-CSV.gsub(/^\s+/, '')
|
126
123
|
First name,Last name,Name
|
127
124
|
Fred,Flintstone,Fred Flintstone
|
128
125
|
Wilma,Flintstone,Wilma Flintstone
|
129
126
|
CSV
|
130
127
|
|
131
|
-
response.body.should
|
128
|
+
response.body.should == expected_content
|
132
129
|
end
|
133
130
|
|
134
131
|
it 'should allow toggling off' do
|
135
|
-
get_ :with_custom_options, :
|
132
|
+
get_ :with_custom_options, format: :csv, params: { custom_options: { write_headers: false } }
|
136
133
|
|
137
134
|
response.status.should eq 200
|
138
135
|
response.content_type.should eq 'text/csv'
|
139
136
|
|
140
|
-
expected_content
|
137
|
+
expected_content = <<-CSV.gsub(/^\s+/, '')
|
141
138
|
Fred,Flintstone,Fred Flintstone
|
142
139
|
Wilma,Flintstone,Wilma Flintstone
|
143
140
|
CSV
|
144
141
|
|
145
|
-
response.body.should
|
142
|
+
response.body.should == expected_content
|
146
143
|
end
|
147
|
-
|
148
144
|
end
|
149
145
|
|
150
146
|
it 'should allow forcing of quotes' do
|
151
|
-
get_ :with_custom_options, :
|
147
|
+
get_ :with_custom_options, format: :csv, params: { custom_options: { force_quotes: true } }
|
152
148
|
|
153
149
|
response.status.should eq 200
|
154
150
|
response.content_type.should eq 'text/csv'
|
155
151
|
|
156
|
-
expected_content
|
152
|
+
expected_content = <<-CSV.gsub(/^\s+/, '')
|
157
153
|
"First name","Last name","Name"
|
158
154
|
"Fred","Flintstone","Fred Flintstone"
|
159
155
|
"Wilma","Flintstone","Wilma Flintstone"
|
160
156
|
CSV
|
161
157
|
|
162
|
-
response.body.should
|
158
|
+
response.body.should == expected_content
|
163
159
|
end
|
164
160
|
|
165
161
|
it 'should allow combinations of options' do
|
166
|
-
|
162
|
+
params = {
|
163
|
+
custom_options: {
|
164
|
+
write_headers: false,
|
165
|
+
force_quotes: true,
|
166
|
+
col_sep: '||',
|
167
|
+
row_sep: "ENDOFLINE\n"
|
168
|
+
}
|
169
|
+
}
|
170
|
+
get_ :with_custom_options, format: :csv, params: params
|
167
171
|
|
168
172
|
response.status.should eq 200
|
169
173
|
response.content_type.should eq 'text/csv'
|
170
174
|
|
171
|
-
expected_content
|
175
|
+
expected_content = <<-CSV.gsub(/^\s+/, '')
|
172
176
|
"Fred"||"Flintstone"||"Fred Flintstone"ENDOFLINE
|
173
177
|
"Wilma"||"Flintstone"||"Wilma Flintstone"ENDOFLINE
|
174
178
|
CSV
|
175
179
|
|
176
|
-
response.body.should
|
180
|
+
response.body.should == expected_content
|
177
181
|
end
|
178
|
-
|
179
182
|
end
|
180
|
-
|
181
183
|
end
|
182
|
-
|
183
184
|
end
|
184
185
|
end
|