cloudxls-rails 0.3.0 → 0.3.1

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.
@@ -13,7 +13,7 @@ ActionController::Renderers.add :csv do |scope, options|
13
13
  filename = options.fetch(:filename, 'data.csv')
14
14
  columns = options[:columns]
15
15
 
16
- if options.fetch(:stream, false) == true
16
+ if options.fetch(:stream, false)
17
17
  # streaming response
18
18
  headers["Content-Type"] = "text/csv"
19
19
  headers["Content-disposition"] = "attachment; filename=\"#{filename}\""
@@ -35,18 +35,39 @@ end
35
35
  ActionController::Renderers.add :xls do |scope, options|
36
36
  columns = options.fetch(:columns, nil)
37
37
 
38
- data = CloudXLS::CSVWriter.text(scope, {:columns => columns})
39
- response = CloudXLS.xpipe(data: { text: data })
38
+ xdata = options[:data] || {}
39
+ unless (xdata.has_key?(:text) ||
40
+ xdata.has_key?(:url ) ||
41
+ xdata.has_key?(:file) )
40
42
 
43
+ xdata[:text] = CloudXLS::CSVWriter.text(scope, {:columns => columns})
44
+ end
45
+
46
+ xopts = {:data => xdata}
47
+ xopts[:sheet] = options[:sheet] if options[:sheet]
48
+ xopts[:doc] = options[:doc] if options[:doc]
49
+
50
+ response = CloudXLS.xpipe(xopts)
41
51
  redirect_to response.url
42
52
  end
43
53
 
44
54
  ActionController::Renderers.add :xlsx do |scope, options|
45
55
  columns = options.fetch(:columns, nil)
46
56
 
47
- data = CloudXLS::CSVWriter.text(scope, {:columns => columns})
48
- response = CloudXLS.xpipe(:data => {:text => data }, doc: {:format => "xlsx"})
57
+ xdata = options[:data] || {}
58
+ unless (xdata.has_key?(:text) ||
59
+ xdata.has_key?(:url ) ||
60
+ xdata.has_key?(:file) )
61
+
62
+ xdata[:text] = CloudXLS::CSVWriter.text(scope, {:columns => columns})
63
+ end
64
+
65
+ xopts = {:data => xdata}
66
+ xopts[:sheet] = options[:sheet] if options[:sheet]
67
+ xopts[:doc] = options[:doc] || {}
68
+ xopts[:doc][:format] = 'xlsx'
49
69
 
70
+ response = CloudXLS.xpipe(xopts)
50
71
  redirect_to response.url
51
72
  end
52
73
 
@@ -57,10 +78,18 @@ class ActionController::Responder
57
78
  end
58
79
 
59
80
  def to_xls
60
- controller.render({:xls => resources.last, :stream => false }.merge(options))
81
+ if options[:stream] == true
82
+ options[:data] ||= {}
83
+ options[:data][:url] ||= controller.request.url.gsub(/xls\Z/, "csv")
84
+ end
85
+ controller.render({:xls => resources.last }.merge(options))
61
86
  end
62
87
 
63
88
  def to_xlsx
64
- controller.render({:xlsx => resources.last, :stream => false}.merge(options))
89
+ if options[:stream] == true
90
+ options[:data] ||= {}
91
+ options[:data][:url] ||= controller.request.url.gsub(/xlsx\Z/, "csv")
92
+ end
93
+ controller.render({:xlsx => resources.last }.merge(options))
65
94
  end
66
95
  end
@@ -50,7 +50,12 @@ module CloudXLS
50
50
 
51
51
  Enumerator.new do |row|
52
52
  if options[:skip_headers] != true
53
- row << ::CSV.generate_line(csv_titles(columns, :titleize))
53
+ if scope.respond_to?(:column_names)
54
+ columns ||= scope.column_names
55
+ end
56
+ if columns
57
+ row << csv_titles(columns, :titleize).to_csv
58
+ end
54
59
  end
55
60
 
56
61
  enum = scope_enumerator(scope)
@@ -1,5 +1,5 @@
1
1
  module CloudXLS
2
2
  module Rails
3
- VERSION = '0.3.0'
3
+ VERSION = '0.3.1'
4
4
  end
5
5
  end
@@ -27,8 +27,43 @@ describe 'Request', :type => :request do
27
27
  ].join("\n")
28
28
  end
29
29
 
30
- it "/posts.xls has a working csv export" do
31
- CloudXLS.should_receive(:xpipe).and_return(OpenStruct.new(:url => "/successful_redirect"))
32
- visit '/posts.xls'
30
+ it "/posts/stream.csv streams csv" do
31
+ visit '/posts/stream.csv'
32
+ page.should have_content [
33
+ "Title,Visits,Conversion Rate,Published On,Published,Expired At",
34
+ "hello world,12032,0.24,2013-12-24,false,2013-12-25T12:30:30.000+0000"
35
+ ].join("\n")
36
+ end
37
+
38
+
39
+ describe "posts/stream" do
40
+ it "/posts/stream.csv should xpipe with csv url" do
41
+ visit '/posts/stream.csv'
42
+ page.should have_content [
43
+ "Title,Visits,Conversion Rate,Published On,Published,Expired At",
44
+ "hello world,12032,0.24,2013-12-24,false,2013-12-25T12:30:30.000+0000"
45
+ ].join("\n")
46
+ end
47
+
48
+ it "/posts/stream.xlsx has a working csv export" do
49
+ CloudXLS.should_receive(:xpipe) { |options|
50
+ !options[:data][:url].ends_with?("posts/stream.csv") &&
51
+ options[:doc][:format] == "xlsx" &&
52
+ options.keys.length == 2
53
+ }.and_return(OpenStruct.new(:url => "/successful_redirect"))
54
+
55
+ visit '/posts/stream.xlsx'
56
+ page.should have_content("OK")
57
+ end
58
+
59
+ it "/posts/stream.xls has a working csv export" do
60
+ CloudXLS.should_receive(:xpipe) { |options|
61
+ !options[:data][:url].end_with?("posts/stream.csv") &&
62
+ options.keys.length == 1
63
+ }.and_return(OpenStruct.new(:url => "/successful_redirect"))
64
+
65
+ visit '/posts/stream.xls'
66
+ page.should have_content("OK")
67
+ end
33
68
  end
34
69
  end
@@ -2,11 +2,23 @@ class PostsController < ApplicationController
2
2
  respond_to :csv, :xls, :xlsx, :html
3
3
 
4
4
  def index
5
- respond_with(Post.all, :columns => %w[title visits conversion_rate published_on published expired_at])
5
+ respond_with(Post.all, :columns => export_attributes)
6
+ end
7
+
8
+ def stream
9
+ respond_with(Post.all, :stream => true, :columns => export_attributes)
6
10
  end
7
11
 
8
12
  # Used for stub/mocking a redirect request
9
13
  def successful_redirect
10
- render :text => "xls"
14
+ # make rails 3.1 happy with a template
15
+ # /views/posts/successful_redirect.html.erb
16
+ render :text => "OK"
11
17
  end
18
+
19
+ protected
20
+ def export_attributes
21
+ %w[title visits conversion_rate published_on published expired_at]
22
+ end
23
+
12
24
  end
@@ -1,5 +1,9 @@
1
1
  TestApp::Application.routes.draw do
2
- resources :posts
2
+ resources :posts do
3
+ collection do
4
+ get "stream"
5
+ end
6
+ end
3
7
  get "successful_redirect" => "posts#successful_redirect"
4
8
  root to: "posts#index"
5
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudxls-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -143,6 +143,7 @@ files:
143
143
  - spec/test_app/app/models/post.rb
144
144
  - spec/test_app/app/views/layouts/application.html.erb
145
145
  - spec/test_app/app/views/posts/index.html.erb
146
+ - spec/test_app/app/views/posts/successful_redirect.html.erb
146
147
  - spec/test_app/config.ru
147
148
  - spec/test_app/config/application.rb
148
149
  - spec/test_app/config/boot.rb
@@ -215,6 +216,7 @@ test_files:
215
216
  - spec/test_app/app/models/post.rb
216
217
  - spec/test_app/app/views/layouts/application.html.erb
217
218
  - spec/test_app/app/views/posts/index.html.erb
219
+ - spec/test_app/app/views/posts/successful_redirect.html.erb
218
220
  - spec/test_app/config.ru
219
221
  - spec/test_app/config/application.rb
220
222
  - spec/test_app/config/boot.rb