as_csv 2.0.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +19 -0
  3. data/README.md +2 -25
  4. data/lib/as_csv/active_model/serialization/csv.rb +17 -0
  5. data/lib/as_csv/core_ext/enumerable.rb +10 -0
  6. data/lib/as_csv/csv_builder.rb +1 -1
  7. data/lib/as_csv/railtie.rb +2 -10
  8. data/lib/as_csv/version.rb +1 -1
  9. data/lib/as_csv.rb +1 -0
  10. metadata +21 -130
  11. data/.gitignore +0 -22
  12. data/.rspec +0 -1
  13. data/.travis.yml +0 -6
  14. data/Gemfile +0 -6
  15. data/Rakefile +0 -1
  16. data/as_csv.gemspec +0 -26
  17. data/script/rspec +0 -16
  18. data/spec/controllers/render_widgets_controller_spec.rb +0 -5
  19. data/spec/controllers/respond_with_widgets_controller_spec.rb +0 -5
  20. data/spec/core_ext/array_spec.rb +0 -35
  21. data/spec/dummy/README.rdoc +0 -261
  22. data/spec/dummy/Rakefile +0 -7
  23. data/spec/dummy/app/assets/images/rails.png +0 -0
  24. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  25. data/spec/dummy/app/assets/stylesheets/application.css +0 -13
  26. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  27. data/spec/dummy/app/controllers/render_widgets_controller.rb +0 -15
  28. data/spec/dummy/app/controllers/respond_with_widgets_controller.rb +0 -12
  29. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  30. data/spec/dummy/app/models/widget.rb +0 -2
  31. data/spec/dummy/app/models/widget_with_options.rb +0 -12
  32. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  33. data/spec/dummy/config/application.rb +0 -49
  34. data/spec/dummy/config/boot.rb +0 -10
  35. data/spec/dummy/config/database.yml +0 -7
  36. data/spec/dummy/config/environment.rb +0 -8
  37. data/spec/dummy/config/environments/test.rb +0 -36
  38. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  39. data/spec/dummy/config/initializers/inflections.rb +0 -15
  40. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  41. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  42. data/spec/dummy/config/initializers/session_store.rb +0 -8
  43. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  44. data/spec/dummy/config/locales/en.yml +0 -5
  45. data/spec/dummy/config/routes.rb +0 -4
  46. data/spec/dummy/config.ru +0 -4
  47. data/spec/dummy/db/schema.rb +0 -22
  48. data/spec/dummy/db/seeds.rb +0 -7
  49. data/spec/dummy/public/404.html +0 -26
  50. data/spec/dummy/public/422.html +0 -26
  51. data/spec/dummy/public/500.html +0 -25
  52. data/spec/dummy/public/favicon.ico +0 -0
  53. data/spec/dummy/public/index.html +0 -241
  54. data/spec/dummy/public/robots.txt +0 -5
  55. data/spec/dummy/script/rails +0 -6
  56. data/spec/lib/csv_builder_spec.rb +0 -78
  57. data/spec/models/active_model_spec.rb +0 -16
  58. data/spec/models/widget_spec.rb +0 -61
  59. data/spec/models/widget_with_options_spec.rb +0 -29
  60. data/spec/rails_helper.rb +0 -25
  61. data/spec/spec_helper.rb +0 -10
  62. data/spec/support/widgets_controller_mixin.rb +0 -39
@@ -1,25 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>We're sorry, but something went wrong (500)</title>
5
- <style type="text/css">
6
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
- div.dialog {
8
- width: 25em;
9
- padding: 0 4em;
10
- margin: 4em auto 0 auto;
11
- border: 1px solid #ccc;
12
- border-right-color: #999;
13
- border-bottom-color: #999;
14
- }
15
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <!-- This file lives in public/500.html -->
21
- <div class="dialog">
22
- <h1>We're sorry, but something went wrong.</h1>
23
- </div>
24
- </body>
25
- </html>
File without changes
@@ -1,241 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Ruby on Rails: Welcome aboard</title>
5
- <style type="text/css" media="screen">
6
- body {
7
- margin: 0;
8
- margin-bottom: 25px;
9
- padding: 0;
10
- background-color: #f0f0f0;
11
- font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana";
12
- font-size: 13px;
13
- color: #333;
14
- }
15
-
16
- h1 {
17
- font-size: 28px;
18
- color: #000;
19
- }
20
-
21
- a {color: #03c}
22
- a:hover {
23
- background-color: #03c;
24
- color: white;
25
- text-decoration: none;
26
- }
27
-
28
-
29
- #page {
30
- background-color: #f0f0f0;
31
- width: 750px;
32
- margin: 0;
33
- margin-left: auto;
34
- margin-right: auto;
35
- }
36
-
37
- #content {
38
- float: left;
39
- background-color: white;
40
- border: 3px solid #aaa;
41
- border-top: none;
42
- padding: 25px;
43
- width: 500px;
44
- }
45
-
46
- #sidebar {
47
- float: right;
48
- width: 175px;
49
- }
50
-
51
- #footer {
52
- clear: both;
53
- }
54
-
55
- #header, #about, #getting-started {
56
- padding-left: 75px;
57
- padding-right: 30px;
58
- }
59
-
60
-
61
- #header {
62
- background-image: url("assets/rails.png");
63
- background-repeat: no-repeat;
64
- background-position: top left;
65
- height: 64px;
66
- }
67
- #header h1, #header h2 {margin: 0}
68
- #header h2 {
69
- color: #888;
70
- font-weight: normal;
71
- font-size: 16px;
72
- }
73
-
74
-
75
- #about h3 {
76
- margin: 0;
77
- margin-bottom: 10px;
78
- font-size: 14px;
79
- }
80
-
81
- #about-content {
82
- background-color: #ffd;
83
- border: 1px solid #fc0;
84
- margin-left: -55px;
85
- margin-right: -10px;
86
- }
87
- #about-content table {
88
- margin-top: 10px;
89
- margin-bottom: 10px;
90
- font-size: 11px;
91
- border-collapse: collapse;
92
- }
93
- #about-content td {
94
- padding: 10px;
95
- padding-top: 3px;
96
- padding-bottom: 3px;
97
- }
98
- #about-content td.name {color: #555}
99
- #about-content td.value {color: #000}
100
-
101
- #about-content ul {
102
- padding: 0;
103
- list-style-type: none;
104
- }
105
-
106
- #about-content.failure {
107
- background-color: #fcc;
108
- border: 1px solid #f00;
109
- }
110
- #about-content.failure p {
111
- margin: 0;
112
- padding: 10px;
113
- }
114
-
115
-
116
- #getting-started {
117
- border-top: 1px solid #ccc;
118
- margin-top: 25px;
119
- padding-top: 15px;
120
- }
121
- #getting-started h1 {
122
- margin: 0;
123
- font-size: 20px;
124
- }
125
- #getting-started h2 {
126
- margin: 0;
127
- font-size: 14px;
128
- font-weight: normal;
129
- color: #333;
130
- margin-bottom: 25px;
131
- }
132
- #getting-started ol {
133
- margin-left: 0;
134
- padding-left: 0;
135
- }
136
- #getting-started li {
137
- font-size: 18px;
138
- color: #888;
139
- margin-bottom: 25px;
140
- }
141
- #getting-started li h2 {
142
- margin: 0;
143
- font-weight: normal;
144
- font-size: 18px;
145
- color: #333;
146
- }
147
- #getting-started li p {
148
- color: #555;
149
- font-size: 13px;
150
- }
151
-
152
-
153
- #sidebar ul {
154
- margin-left: 0;
155
- padding-left: 0;
156
- }
157
- #sidebar ul h3 {
158
- margin-top: 25px;
159
- font-size: 16px;
160
- padding-bottom: 10px;
161
- border-bottom: 1px solid #ccc;
162
- }
163
- #sidebar li {
164
- list-style-type: none;
165
- }
166
- #sidebar ul.links li {
167
- margin-bottom: 5px;
168
- }
169
-
170
- .filename {
171
- font-style: italic;
172
- }
173
- </style>
174
- <script type="text/javascript">
175
- function about() {
176
- info = document.getElementById('about-content');
177
- if (window.XMLHttpRequest)
178
- { xhr = new XMLHttpRequest(); }
179
- else
180
- { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
181
- xhr.open("GET","rails/info/properties",false);
182
- xhr.send("");
183
- info.innerHTML = xhr.responseText;
184
- info.style.display = 'block'
185
- }
186
- </script>
187
- </head>
188
- <body>
189
- <div id="page">
190
- <div id="sidebar">
191
- <ul id="sidebar-items">
192
- <li>
193
- <h3>Browse the documentation</h3>
194
- <ul class="links">
195
- <li><a href="http://guides.rubyonrails.org/">Rails Guides</a></li>
196
- <li><a href="http://api.rubyonrails.org/">Rails API</a></li>
197
- <li><a href="http://www.ruby-doc.org/core/">Ruby core</a></li>
198
- <li><a href="http://www.ruby-doc.org/stdlib/">Ruby standard library</a></li>
199
- </ul>
200
- </li>
201
- </ul>
202
- </div>
203
-
204
- <div id="content">
205
- <div id="header">
206
- <h1>Welcome aboard</h1>
207
- <h2>You&rsquo;re riding Ruby on Rails!</h2>
208
- </div>
209
-
210
- <div id="about">
211
- <h3><a href="rails/info/properties" onclick="about(); return false">About your application&rsquo;s environment</a></h3>
212
- <div id="about-content" style="display: none"></div>
213
- </div>
214
-
215
- <div id="getting-started">
216
- <h1>Getting started</h1>
217
- <h2>Here&rsquo;s how to get rolling:</h2>
218
-
219
- <ol>
220
- <li>
221
- <h2>Use <code>rails generate</code> to create your models and controllers</h2>
222
- <p>To see all available options, run it without parameters.</p>
223
- </li>
224
-
225
- <li>
226
- <h2>Set up a default route and remove <span class="filename">public/index.html</span></h2>
227
- <p>Routes are set up in <span class="filename">config/routes.rb</span>.</p>
228
- </li>
229
-
230
- <li>
231
- <h2>Create your database</h2>
232
- <p>Run <code>rake db:create</code> to create your database. If you're not using SQLite (the default), edit <span class="filename">config/database.yml</span> with your username and password.</p>
233
- </li>
234
- </ol>
235
- </div>
236
- </div>
237
-
238
- <div id="footer">&nbsp;</div>
239
- </div>
240
- </body>
241
- </html>
@@ -1,5 +0,0 @@
1
- # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
- #
3
- # To ban all spiders from the entire site uncomment the next two lines:
4
- # User-Agent: *
5
- # Disallow: /
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
-
4
- APP_PATH = File.expand_path('../../config/application', __FILE__)
5
- require File.expand_path('../../config/boot', __FILE__)
6
- require 'rails/commands'
@@ -1,78 +0,0 @@
1
- require 'spec_helper'
2
- require 'as_csv/csv_builder'
3
-
4
- describe AsCSV::CSVBuilder do
5
- subject(:builder) { described_class.new records, options }
6
- let(:records) { nil }
7
- let(:options) { Hash.new }
8
-
9
- describe '#to_csv' do
10
- subject { builder.to_csv }
11
-
12
- context 'with single record' do
13
- let(:records) do
14
- double(:foo, :as_csv => {
15
- :first => '1',
16
- :second => '2',
17
- :third => '3'
18
- })
19
- end
20
-
21
- it 'should render correctly' do
22
- should eq "first,second,third\n1,2,3\n"
23
- end
24
- end
25
-
26
- context 'with homogenous records' do
27
- let(:records) do
28
- 2.times.map do |i|
29
- double(:foo, :as_csv => {
30
- :first => "1#{i}",
31
- :second => "2#{i}",
32
- :third => "3#{i}"
33
- })
34
- end
35
- end
36
-
37
- it 'should render correctly' do
38
- should == "first,second,third\n10,20,30\n11,21,31\n"
39
- end
40
- end
41
-
42
- context 'with hetreogenous records' do
43
- let(:records) do
44
- 2.times.map do |i|
45
- double(:foo, :as_csv => {
46
- "first#{i}" => "1#{i}",
47
- "second#{i}" => "2#{i}",
48
- "third#{i}" => "3#{i}"
49
- })
50
- end
51
- end
52
-
53
- it 'should merge headers' do
54
- should == "first0,second0,third0,first1,second1,third1
55
- 10,20,30,,,
56
- ,,,11,21,31
57
- "
58
- end
59
- end
60
-
61
- context 'with record not respond_to? `as_csv`' do
62
- let(:records) { double(:foo) }
63
-
64
- it 'should raise an error' do
65
- expect { builder.to_csv }.to raise_error TypeError
66
- end
67
- end
68
-
69
- context 'with record `as_csv` != Hash' do
70
- let(:records) { double(:foo, :as_csv => 'test') }
71
-
72
- it 'should raise an error' do
73
- expect { builder.to_csv }.to raise_error TypeError
74
- end
75
- end
76
- end
77
-
78
- end
@@ -1,16 +0,0 @@
1
- require 'rails_helper'
2
-
3
- class Serializable
4
- include ActiveModel::Serialization
5
- end
6
-
7
- class NonSerializable; end
8
-
9
- describe Serializable do
10
- it { should respond_to :as_csv }
11
- end
12
-
13
- describe NonSerializable do
14
- it { should_not respond_to :as_csv }
15
- end
16
-
@@ -1,61 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Widget do
4
- it { should respond_to :to_csv }
5
- it { should respond_to :as_csv }
6
-
7
- describe 'dummy' do
8
- subject(:dummy_widget) { Widget.new :name => "widget-name", :description => 'widget-description', :code => 1234 }
9
-
10
- describe :to_csv do
11
- subject { dummy_widget.to_csv }
12
- it do
13
- should == <<-CSV.strip_heredoc
14
- id,name,description,code
15
- ,widget-name,widget-description,1234
16
- CSV
17
- end
18
- end
19
- end
20
-
21
- describe 'dummy with csv options' do
22
- subject(:dummy_widget) { Widget.new :name => "widget-name", :description => 'widget-description', :code => 1234 }
23
-
24
- describe :to_csv do
25
- subject { dummy_widget.to_csv(csv_options: {col_sep:'|'})}
26
- it do
27
- should == <<-CSV.strip_heredoc
28
- id|name|description|code
29
- |widget-name|widget-description|1234
30
- CSV
31
- end
32
- end
33
- end
34
-
35
- describe 'collection' do
36
- before do
37
- Widget.create! [
38
- { :name => "widget-1", :description => 'widget-description-1', :code => 1001 },
39
- { :name => "widget-2", :description => 'widget-description-2', :code => 1002 },
40
- { :name => "widget-3", :description => 'widget-description-3', :code => 1003 },
41
- { :name => "widget-4", :description => 'widget-description-4', :code => 1004 },
42
- ]
43
- end
44
-
45
- subject(:widgets) { Widget.order(:id) }
46
-
47
- describe :to_csv do
48
- subject { widgets.to_csv }
49
- it do
50
- should == <<-CSV.strip_heredoc
51
- id,name,description,code
52
- 1,widget-1,widget-description-1,1001
53
- 2,widget-2,widget-description-2,1002
54
- 3,widget-3,widget-description-3,1003
55
- 4,widget-4,widget-description-4,1004
56
- CSV
57
- end
58
- end
59
- end
60
-
61
- end
@@ -1,29 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe WidgetWithOptions do
4
- subject(:widget) { WidgetWithOptions.new :name => 'widget-name', :code => 1234 }
5
-
6
- describe :to_csv do
7
- subject { widget.to_csv(options) }
8
-
9
- context 'with style = :full' do
10
- let(:options) { {:style => :full} }
11
- it do
12
- should == <<-CSV.strip_heredoc
13
- name,code,full
14
- widget-name,1234,true
15
- CSV
16
- end
17
- end
18
-
19
- context 'with style = :short' do
20
- let(:options) { {:style => :short} }
21
- it do
22
- should == <<-CSV.strip_heredoc
23
- name,code
24
- widget-name,1234
25
- CSV
26
- end
27
- end
28
- end
29
- end
data/spec/rails_helper.rb DELETED
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # Configure Rails Environment
4
- ENV["RAILS_ENV"] = "test"
5
-
6
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
7
- require 'rspec/rails'
8
-
9
- Rails.backtrace_cleaner.remove_silencers!
10
-
11
- RSpec.configure do |config|
12
- # If you're not using ActiveRecord, or you'd prefer not to run each of your
13
- # examples within a transaction, remove the following line or assign false
14
- # instead of true.
15
- config.use_transactional_fixtures = true
16
-
17
- # If true, the base class of anonymous controllers will be inferred
18
- # automatically. This will be the default behavior in future versions of
19
- # rspec-rails.
20
- config.infer_base_class_for_anonymous_controllers = false
21
-
22
- config.infer_spec_type_from_file_location!
23
-
24
- config.extend WidgetsControllerMixin, :widgets_controllers
25
- end
data/spec/spec_helper.rb DELETED
@@ -1,10 +0,0 @@
1
- require 'simplecov'
2
- SimpleCov.start
3
-
4
- # Requires supporting ruby files with custom matchers and macros, etc,
5
- # in spec/support/ and its subdirectories.
6
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
7
-
8
- RSpec.configure do |config|
9
- config.order = "random"
10
- end
@@ -1,39 +0,0 @@
1
- module WidgetsControllerMixin
2
- def exercise_controller
3
- before do
4
- Widget.create! [
5
- { :name => "widget-1", :description => 'widget-description-1', :code => 1001 },
6
- { :name => "widget-2", :description => 'widget-description-2', :code => 1002 },
7
- { :name => "widget-3", :description => 'widget-description-3', :code => 1003 },
8
- { :name => "widget-4", :description => 'widget-description-4', :code => 1004 },
9
- ]
10
- end
11
-
12
- describe 'GET show/1.csv' do
13
- before { get :show, :id => 1, :format => :csv }
14
- it 'should respond with the CSV' do
15
- expect(response.code).to eq "200"
16
- expect(response.content_type).to eq "text/csv"
17
- expect(response.body).to eq <<-CSV.strip_heredoc
18
- id,name,description,code
19
- 1,widget-1,widget-description-1,1001
20
- CSV
21
- end
22
- end
23
-
24
- context 'GET index.csv' do
25
- before { get :index, :format => :csv }
26
- it 'should respond with the CSV' do
27
- expect(response.code).to eq "200"
28
- expect(response.content_type).to eq "text/csv"
29
- expect(response.body).to eq <<-CSV.strip_heredoc
30
- name,code,full
31
- widget-1,1001,true
32
- widget-2,1002,true
33
- widget-3,1003,true
34
- widget-4,1004,true
35
- CSV
36
- end
37
- end
38
- end
39
- end