spreadsheet_architect 1.0.3 → 1.0.4

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: 155a653969b09467dd11207dee1a4b4a208b316b
4
- data.tar.gz: d7c94501ad36264f26e9285d21ebef0546e89067
3
+ metadata.gz: 64aee8164ace0ace168a8468abd18bee0fa75ab4
4
+ data.tar.gz: 340b7cb21f836d507c11a16b870b2774fa209fd7
5
5
  SHA512:
6
- metadata.gz: c801aa14de7c5f8c10b7c20aaecb59cb50fbf956ef7a59cccd8e04c3d9cc69ad1773254b296e90c96c786a1c8e387eb49586106a681416a9e7fa7b1941c7978f
7
- data.tar.gz: 0732d0406412a5aec37a37c2558a3bce488fa66c5118d08893bdac9d5dac242d9142a7bb8f5112f16e071115702f05c818f96fedbaaa1deb37026477420daf38
6
+ metadata.gz: 545b1ebbd6c0cf59a1841a4e60b3a61c5de90d6fdc8a8b8fa8f370833b1e52abf0e0610e001b888b2a61743540d948b1ec68c2aedfb421121e694ca78f0082ab
7
+ data.tar.gz: 5adc741b06b52e70e6c3c73c192a36920631ffeca5c13791cf8d8eec9adf34a6097cfa1dad74f62c56d71e6afda03a9020f9125bff1260bb266073c4d6d5dd89
data/README.md CHANGED
@@ -47,39 +47,57 @@ end
47
47
 
48
48
  # Usage
49
49
 
50
- ### Method 1: Controller for a Rails Model
50
+ ### Method 1: Controller (for Rails)
51
51
  ```ruby
52
+
52
53
  class PostsController < ActionController::Base
54
+ respond_to :html, :xlsx, :ods, :csv
55
+
56
+ # Using respond_with
53
57
  def index
54
58
  @posts = Post.order(published_at: :asc)
55
-
59
+
60
+ respond_with @posts
61
+ end
62
+
63
+ # Using respond_with with custom options
64
+ def index
65
+ @posts = Post.order(published_at: :asc)
66
+
67
+ if ['xlsx','ods','csv'].include?(request.format)
68
+ respond_with @posts.to_xlsx(row_style: {bold: true}), filename: 'Posts'
69
+ else
70
+ respond_with @posts
71
+ end
72
+ end
73
+
74
+ # Using responders
75
+ def index
76
+ @posts = Post.order(published_at: :asc)
77
+
56
78
  respond_to do |format|
57
79
  format.html
58
- format.xlsx { render xlsx: @posts.to_xlsx, filename: "posts.xlsx" }
59
- format.ods { render ods: @posts.to_ods, filename: "posts.ods" }
60
- format.csv { render csv: @posts.to_csv, filename: "posts.csv" }
80
+ format.xlsx { render xlsx: @posts }
81
+ format.ods { render ods: @posts }
82
+ format.csv{ render csv: @posts }
61
83
  end
62
84
  end
63
- end
64
- ```
65
85
 
66
- ### Method 2: Controller for a Plain Ruby Model
67
- ```ruby
68
- class PostsController < ActionController::Base
86
+ # Using responders with custom options
69
87
  def index
70
- posts_array = [Post.new, Post.new, Post.new]
88
+ @posts = Post.order(published_at: :asc)
71
89
 
72
90
  respond_to do |format|
73
91
  format.html
74
- format.xlsx { render xlsx: Post.to_xlsx(data: posts_array), filename: "posts.xlsx" }
75
- format.ods { render ods: Post.to_ods(data: posts_array), filename: "posts.ods" }
76
- format.csv { render csv: Post.to_csv(data: posts_array), filename: "posts.csv" }
92
+ format.xlsx { render xlsx: @posts.to_xlsx(headers: false) }
93
+ format.ods { render ods: Post.to_odf(data: @posts) }
94
+ format.csv{ render csv: @posts.to_csv(headers: false), file_name: 'articles' }
77
95
  end
78
96
  end
79
97
  end
80
98
  ```
81
99
 
82
- ### Method 3: Save to a file manually
100
+ ### Method 2: Save to a file manually
83
101
  ```ruby
84
102
  File.open('path/to/file.xlsx') do |f|
85
103
  f.write{ Post.order(published_at: :asc).to_xlsx }
@@ -90,6 +108,11 @@ end
90
108
  File.open('path/to/file.csv') do |f|
91
109
  f.write{ Post.order(published_at: :asc).to_csv }
92
110
  end
111
+
112
+ # Ex. with plain ruby class
113
+ File.open('path/to/file.xlsx') do |f|
114
+ f.write{ Post.to_xlsx(data: posts_array) }
115
+ end
93
116
  ```
94
117
 
95
118
 
@@ -10,8 +10,8 @@ module SpreadsheetArchitect
10
10
  base.send :extend, ClassMethods
11
11
  end
12
12
 
13
- module ClassMethods
14
- def sa_str_humanize(str, capitalize = true)
13
+ module Helpers
14
+ def self.str_humanize(str, capitalize = true)
15
15
  str = str.sub(/\A_+/, '').gsub(/[_\.]/,' ').sub(' rescue nil','')
16
16
  if capitalize
17
17
  str = str.gsub(/(\A|\ )\w/){|x| x.upcase}
@@ -19,22 +19,22 @@ module SpreadsheetArchitect
19
19
  str
20
20
  end
21
21
 
22
- def sa_get_options(options={})
23
- if self.ancestors.include?(ActiveRecord::Base) && !self.respond_to?(:spreadsheet_columns) && !options[:spreadsheet_columns]
24
- the_column_names = (self.column_names - ["id","created_at","updated_at","deleted_at"])
25
- headers = the_column_names.map{|x| sa_str_humanize(x)}
22
+ def self.get_options(options={}, klass)
23
+ if klass.ancestors.include?(ActiveRecord::Base) && !klass.respond_to?(:spreadsheet_columns) && !options[:spreadsheet_columns]
24
+ the_column_names = (klass.column_names - ["id","created_at","updated_at","deleted_at"])
25
+ headers = the_column_names.map{|x| str_humanize(x)}
26
26
  columns = the_column_names.map{|x| x.to_s}
27
- elsif options[:spreadsheet_columns] || self.respond_to?(:spreadsheet_columns)
27
+ elsif options[:spreadsheet_columns] || klass.respond_to?(:spreadsheet_columns)
28
28
  headers = []
29
29
  columns = []
30
30
 
31
- array = options[:spreadsheet_columns] || self.spreadsheet_columns || []
31
+ array = options[:spreadsheet_columns] || klass.spreadsheet_columns || []
32
32
  array.each do |x|
33
33
  if x.is_a?(Array)
34
34
  headers.push x[0].to_s
35
35
  columns.push x[1].to_s
36
36
  else
37
- headers.push sa_str_humanize(x.to_s)
37
+ headers.push str_humanize(x.to_s)
38
38
  columns.push x.to_s
39
39
  end
40
40
  end
@@ -58,51 +58,38 @@ module SpreadsheetArchitect
58
58
  row_style.merge!(options[:row_style])
59
59
  end
60
60
 
61
- sheet_name = options[:sheet_name] || self.name
61
+ sheet_name = options[:sheet_name] || klass.name
62
62
 
63
63
  if options[:data]
64
64
  data = options[:data].to_a
65
- elsif self.ancestors.include?(ActiveRecord::Base)
66
- data = where(options[:where]).order(options[:order]).to_a
65
+ elsif klass.ancestors.include?(ActiveRecord::Base)
66
+ data = klass.where(options[:where]).order(options[:order]).to_a
67
67
  else
68
68
  # object must have a to_a method
69
- data = self.to_a
69
+ data = klass.to_a
70
70
  end
71
71
 
72
72
  types = (options[:types] || []).flatten
73
73
 
74
74
  return {headers: headers, columns: columns, header_style: header_style, row_style: row_style, types: types, sheet_name: sheet_name, data: data}
75
75
  end
76
+ end
76
77
 
77
- def sa_get_row_data(the_columns=[], instance)
78
- row_data = []
79
- the_columns.each do |col|
80
- col.split('.').each_with_index do |x,i|
81
- if i == 0
82
- col = instance.instance_eval(x)
83
- else
84
- col = col.instance_eval(x)
85
- end
86
- end
87
- row_data.push col.to_s
88
- end
89
- return row_data
90
- end
91
-
78
+ module ClassMethods
92
79
  def to_csv(opts={})
93
- options = sa_get_options(opts)
80
+ options = SpreadsheetArchitect::Helpers.get_options(opts, self)
94
81
 
95
82
  CSV.generate do |csv|
96
83
  csv << options[:headers] if options[:headers]
97
84
 
98
- options[:data].each do |x|
99
- csv << sa_get_row_data(options[:columns], x)
85
+ options[:data].each do |instance|
86
+ csv << options[:columns].map{|col| instance.instance_eval(col)}
100
87
  end
101
88
  end
102
89
  end
103
90
 
104
91
  def to_ods(opts={})
105
- options = sa_get_options(opts)
92
+ options = SpreadsheetArchitect::Helpers.get_options(opts, self)
106
93
 
107
94
  spreadsheet = ODF::Spreadsheet.new
108
95
 
@@ -139,7 +126,6 @@ module SpreadsheetArchitect
139
126
  end
140
127
  end
141
128
 
142
- this_class = self
143
129
  spreadsheet.table options[:sheet_name] do
144
130
  if options[:headers]
145
131
  row do
@@ -148,9 +134,9 @@ module SpreadsheetArchitect
148
134
  end
149
135
  end
150
136
  end
151
- options[:data].each do |x|
137
+ options[:data].each do |instance|
152
138
  row do
153
- this_class.sa_get_row_data(options[:columns], x).each do |y|
139
+ options[:columns].map{|col| instance.instance_eval(col)}.each do |y|
154
140
  cell y, style: :row_style
155
141
  end
156
142
  end
@@ -161,7 +147,7 @@ module SpreadsheetArchitect
161
147
  end
162
148
 
163
149
  def to_xlsx(opts={})
164
- options = sa_get_options(opts)
150
+ options = SpreadsheetArchitect::Helpers.get_options(opts, self)
165
151
 
166
152
  header_style = {}
167
153
  header_style[:fg_color] = options[:header_style].delete(:color)
@@ -198,8 +184,8 @@ module SpreadsheetArchitect
198
184
  sheet.add_row options[:headers], style: package.workbook.styles.add_style(header_style)
199
185
  end
200
186
 
201
- options[:data].each do |x|
202
- sheet.add_row sa_get_row_data(options[:columns], x), style: package.workbook.styles.add_style(row_style), types: options[:types]
187
+ options[:data].each do |instance|
188
+ sheet.add_row options[:columns].map{|col| instance.instance_eval(col)}, style: package.workbook.styles.add_style(row_style), types: options[:types]
203
189
  end
204
190
  end
205
191
 
@@ -1,3 +1,3 @@
1
1
  module SpreadsheetArchitect
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spreadsheet_architect
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Weston Ganger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-27 00:00:00.000000000 Z
11
+ date: 2016-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: axlsx