to_spreadsheet 1.0.0 → 1.0.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.
- data/lib/to_spreadsheet.rb +2 -4
- data/lib/to_spreadsheet/context.rb +18 -2
- data/lib/to_spreadsheet/{action_pack_renderers.rb → rails/action_pack_renderers.rb} +24 -32
- data/lib/to_spreadsheet/{mime_types.rb → rails/mime_types.rb} +2 -2
- data/lib/to_spreadsheet/rails/view_helpers.rb +11 -0
- data/lib/to_spreadsheet/railtie.rb +11 -0
- data/lib/to_spreadsheet/renderer.rb +13 -17
- data/lib/to_spreadsheet/rule/format.rb +7 -14
- data/lib/to_spreadsheet/version.rb +3 -3
- data/spec/format_spec.rb +5 -2
- metadata +116 -101
- data/lib/to_spreadsheet/helpers.rb +0 -19
data/lib/to_spreadsheet.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
require 'to_spreadsheet/action_pack_renderers'
|
3
|
-
require 'to_spreadsheet/mime_types'
|
4
1
|
require 'to_spreadsheet/version'
|
5
|
-
require 'to_spreadsheet/helpers'
|
6
2
|
require 'to_spreadsheet/context'
|
3
|
+
require 'to_spreadsheet/renderer'
|
4
|
+
require 'to_spreadsheet/railtie' if defined?(Rails)
|
7
5
|
|
8
6
|
module ToSpreadsheet
|
9
7
|
class << self
|
@@ -17,10 +17,26 @@ module ToSpreadsheet
|
|
17
17
|
def global
|
18
18
|
@global ||= new
|
19
19
|
end
|
20
|
+
|
21
|
+
def current
|
22
|
+
Thread.current[:_to_spreadsheet_ctx]
|
23
|
+
end
|
24
|
+
|
25
|
+
def current=(ctx)
|
26
|
+
Thread.current[:_to_spreadsheet_ctx] = ctx
|
27
|
+
end
|
28
|
+
|
29
|
+
def with_context(ctx, &block)
|
30
|
+
old = current
|
31
|
+
self.current = ctx
|
32
|
+
r = block.call(ctx)
|
33
|
+
self.current = old
|
34
|
+
r
|
35
|
+
end
|
20
36
|
end
|
21
37
|
|
22
38
|
def initialize(wb_options = nil)
|
23
|
-
@rules
|
39
|
+
@rules = []
|
24
40
|
workbook wb_options if wb_options
|
25
41
|
end
|
26
42
|
|
@@ -83,7 +99,7 @@ module ToSpreadsheet
|
|
83
99
|
|
84
100
|
# A new context
|
85
101
|
def merge(other_context)
|
86
|
-
ctx
|
102
|
+
ctx = Context.new()
|
87
103
|
ctx.rules = rules + other_context.rules
|
88
104
|
ctx
|
89
105
|
end
|
@@ -1,32 +1,24 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
require 'action_controller/metal/renderers'
|
3
|
-
require 'action_controller/metal/responder'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
# This sets up a default render call for when you do
|
26
|
-
# respond_to do |format|
|
27
|
-
# format.xlsx
|
28
|
-
# end
|
29
|
-
def to_xlsx
|
30
|
-
controller.render xlsx: controller.action_name
|
31
|
-
end
|
32
|
-
end
|
1
|
+
require 'active_support'
|
2
|
+
require 'action_controller/metal/renderers'
|
3
|
+
require 'action_controller/metal/responder'
|
4
|
+
|
5
|
+
# This will let us do thing like `render :xlsx => 'index'`
|
6
|
+
# This is similar to how Rails internally implements its :json and :xml renderers
|
7
|
+
ActionController::Renderers.add :xlsx do |template, options|
|
8
|
+
filename = options[:filename] || options[:template] || 'data'
|
9
|
+
data = ToSpreadsheet::Context.with_context ToSpreadsheet::Context.global.merge(ToSpreadsheet::Context.new) do |context|
|
10
|
+
html = render_to_string(template, options.merge(template: template, formats: ['html']))
|
11
|
+
ToSpreadsheet::Renderer.to_data(html, context)
|
12
|
+
end
|
13
|
+
send_data data, type: :xlsx, disposition: %(attachment; filename="#{filename}.xlsx")
|
14
|
+
end
|
15
|
+
|
16
|
+
class ActionController::Responder
|
17
|
+
# This sets up a default render call for when you do
|
18
|
+
# respond_to do |format|
|
19
|
+
# format.xlsx
|
20
|
+
# end
|
21
|
+
def to_xlsx
|
22
|
+
controller.render xlsx: controller.action_name
|
23
|
+
end
|
24
|
+
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
require 'action_dispatch/http/mime_type'
|
2
|
-
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx unless Mime::Type.lookup_by_extension(:xlsx)
|
1
|
+
require 'action_dispatch/http/mime_type'
|
2
|
+
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx unless Mime::Type.lookup_by_extension(:xlsx)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
require 'to_spreadsheet/rails/mime_types'
|
3
|
+
require 'to_spreadsheet/rails/action_pack_renderers'
|
4
|
+
require 'to_spreadsheet/rails/view_helpers'
|
5
|
+
module ToSpreadsheet
|
6
|
+
class Railtie < ::Rails::Railtie
|
7
|
+
initializer "to_spreadsheet.view_helpers" do
|
8
|
+
ActionView::Base.send :include, ToSpreadsheet::Rails::ViewHelpers
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,34 +1,30 @@
|
|
1
1
|
require 'axlsx'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
2
4
|
module ToSpreadsheet
|
3
5
|
module Renderer
|
4
6
|
extend self
|
5
7
|
|
6
|
-
def to_stream(html,
|
7
|
-
to_package(html,
|
8
|
+
def to_stream(html, context = nil)
|
9
|
+
to_package(html, context).to_stream
|
8
10
|
end
|
9
11
|
|
10
|
-
def to_data(html,
|
11
|
-
to_package(html,
|
12
|
+
def to_data(html, context = nil)
|
13
|
+
to_package(html, context).to_stream.read
|
12
14
|
end
|
13
15
|
|
14
|
-
def to_package(html,
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
package
|
16
|
+
def to_package(html, context = nil)
|
17
|
+
context ||= ToSpreadsheet::Context.global.merge(Context.new)
|
18
|
+
package = build_package(html, context)
|
19
|
+
context.rules.each do |rule|
|
20
|
+
#Rails.logger.debug "Applying #{rule}"
|
21
|
+
rule.apply(context, package)
|
22
22
|
end
|
23
|
+
package
|
23
24
|
end
|
24
25
|
|
25
26
|
private
|
26
27
|
|
27
|
-
def init_context(local_context)
|
28
|
-
local_context ||= ToSpreadsheet::Context.new
|
29
|
-
ToSpreadsheet::Context.global.merge local_context
|
30
|
-
end
|
31
|
-
|
32
28
|
def build_package(html, context)
|
33
29
|
package = ::Axlsx::Package.new
|
34
30
|
spreadsheet = package.workbook
|
@@ -5,10 +5,11 @@ module ToSpreadsheet
|
|
5
5
|
class Format < Base
|
6
6
|
include ::ToSpreadsheet::TypeFromValue
|
7
7
|
def apply(context, sheet)
|
8
|
+
wb = sheet.workbook
|
8
9
|
case selector_type
|
9
10
|
when :css
|
10
11
|
css_match selector_query, context.to_xml_node(sheet) do |xml_node|
|
11
|
-
|
12
|
+
add_and_apply_style wb, context, context.to_xls_entity(xml_node)
|
12
13
|
end
|
13
14
|
when :row
|
14
15
|
sheet.row_style selector_query, options if options.present?
|
@@ -17,7 +18,7 @@ module ToSpreadsheet
|
|
17
18
|
sheet.col_style selector_query, inline_styles if inline_styles.present?
|
18
19
|
apply_col_info sheet.column_info[selector_query]
|
19
20
|
when :range
|
20
|
-
|
21
|
+
add_and_apply_style wb, range_match(selector_type, sheet), context
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
@@ -32,7 +33,7 @@ module ToSpreadsheet
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
+
def add_and_apply_style(wb, context, xls_ent)
|
36
37
|
# Custom format rule
|
37
38
|
# format 'td.sel', lambda { |node| ...}
|
38
39
|
if self.options.is_a?(Proc)
|
@@ -47,17 +48,9 @@ module ToSpreadsheet
|
|
47
48
|
options[k] = context.instance_exec(xls_ent, &v) if v.is_a?(Proc)
|
48
49
|
end
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
setter = :"#{k}="
|
54
|
-
xls_ent.send setter, v if xls_ent.respond_to?(setter)
|
55
|
-
if xls_ent.respond_to?(:cells)
|
56
|
-
xls_ent.cells.each do |cell|
|
57
|
-
cell.send setter, v if cell.respond_to?(setter)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
51
|
+
style = wb.styles.add_style options
|
52
|
+
cells = xls_ent.respond_to?(:cells) ? xls_ent.cells : [xls_ent]
|
53
|
+
cells.each { |cell| cell.style = style }
|
61
54
|
end
|
62
55
|
end
|
63
56
|
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
module ToSpreadsheet
|
2
|
-
VERSION = '1.0.
|
3
|
-
end
|
1
|
+
module ToSpreadsheet
|
2
|
+
VERSION = '1.0.1'
|
3
|
+
end
|
data/spec/format_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe ToSpreadsheet::Rule::Format do
|
|
6
6
|
:ruby
|
7
7
|
format_xls do
|
8
8
|
format column: 0, width: 25
|
9
|
-
format 'tr',
|
9
|
+
format 'tr', fg_color: lambda { |row| 'cccccc' if row.index.odd? }
|
10
10
|
end
|
11
11
|
%table
|
12
12
|
%tr
|
@@ -23,7 +23,10 @@ describe ToSpreadsheet::Rule::Format do
|
|
23
23
|
sheet.column_info[0].width.should == 25
|
24
24
|
end
|
25
25
|
it 'runs lambdas' do
|
26
|
-
sheet.rows[1].cells[0]
|
26
|
+
cell = sheet.rows[1].cells[0]
|
27
|
+
styles = sheet.workbook.styles
|
28
|
+
font_id = styles.cellXfs[cell.style].fontId
|
29
|
+
styles.fonts[font_id].color.rgb.should == Axlsx::Color.new(rgb: 'cccccc').rgb
|
27
30
|
end
|
28
31
|
end
|
29
32
|
end
|
metadata
CHANGED
@@ -1,111 +1,128 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: to_spreadsheet
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
version: 1.0.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 1.0.1
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Gleb Mazovetskiy
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
date: 2012-12-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
none: false
|
21
21
|
name: rails
|
22
|
-
prerelease: false
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 0
|
29
|
-
version: "0"
|
30
22
|
type: :runtime
|
31
|
-
version_requirements: *id001
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
name: nokogiri
|
34
23
|
prerelease: false
|
35
|
-
requirement:
|
36
|
-
requirements:
|
37
|
-
- -
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
|
40
|
-
|
41
|
-
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ! '>='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '0'
|
29
|
+
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
version_requirements: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
none: false
|
37
|
+
name: nokogiri
|
42
38
|
type: :runtime
|
43
|
-
version_requirements: *id002
|
44
|
-
- !ruby/object:Gem::Dependency
|
45
|
-
name: axlsx
|
46
39
|
prerelease: false
|
47
|
-
requirement:
|
48
|
-
requirements:
|
49
|
-
- -
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
|
52
|
-
|
53
|
-
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
none: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
none: false
|
53
|
+
name: axlsx
|
54
54
|
type: :runtime
|
55
|
-
version_requirements: *id003
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: chronic
|
58
55
|
prerelease: false
|
59
|
-
requirement:
|
60
|
-
requirements:
|
61
|
-
- -
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
|
64
|
-
|
65
|
-
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
none: false
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
none: false
|
69
|
+
name: chronic
|
66
70
|
type: :runtime
|
67
|
-
version_requirements: *id004
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
name: mocha
|
70
71
|
prerelease: false
|
71
|
-
requirement:
|
72
|
-
requirements:
|
73
|
-
- -
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
|
76
|
-
|
77
|
-
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
none: false
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
none: false
|
85
|
+
name: mocha
|
78
86
|
type: :development
|
79
|
-
version_requirements: *id005
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: sqlite3-ruby
|
82
87
|
prerelease: false
|
83
|
-
requirement:
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
88
|
-
|
89
|
-
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
none: false
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
none: false
|
101
|
+
name: sqlite3-ruby
|
90
102
|
type: :development
|
91
|
-
|
103
|
+
prerelease: false
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
none: false
|
92
110
|
description: Rendering spreadsheets from Rails made easy
|
93
111
|
email: glex.spb@gmail.com
|
94
112
|
executables: []
|
95
|
-
|
96
113
|
extensions: []
|
97
|
-
|
98
|
-
extra_rdoc_files:
|
114
|
+
extra_rdoc_files:
|
99
115
|
- README.textile
|
100
|
-
files:
|
116
|
+
files:
|
101
117
|
- README.textile
|
102
118
|
- LICENSE
|
103
119
|
- Rakefile
|
104
|
-
- lib/to_spreadsheet/action_pack_renderers.rb
|
105
120
|
- lib/to_spreadsheet/context/pairing.rb
|
106
121
|
- lib/to_spreadsheet/context.rb
|
107
|
-
- lib/to_spreadsheet/
|
108
|
-
- lib/to_spreadsheet/mime_types.rb
|
122
|
+
- lib/to_spreadsheet/rails/action_pack_renderers.rb
|
123
|
+
- lib/to_spreadsheet/rails/mime_types.rb
|
124
|
+
- lib/to_spreadsheet/rails/view_helpers.rb
|
125
|
+
- lib/to_spreadsheet/railtie.rb
|
109
126
|
- lib/to_spreadsheet/renderer.rb
|
110
127
|
- lib/to_spreadsheet/rule/base.rb
|
111
128
|
- lib/to_spreadsheet/rule/container.rb
|
@@ -119,37 +136,35 @@ files:
|
|
119
136
|
- lib/to_spreadsheet/type_from_value.rb
|
120
137
|
- lib/to_spreadsheet/version.rb
|
121
138
|
- lib/to_spreadsheet.rb
|
122
|
-
|
139
|
+
- spec/defaults_spec.rb
|
140
|
+
- spec/format_spec.rb
|
141
|
+
- spec/types_spec.rb
|
142
|
+
- spec/worksheets_spec.rb
|
123
143
|
homepage: https://github.com/glebm/to_spreadsheet
|
124
144
|
licenses: []
|
125
|
-
|
126
145
|
post_install_message:
|
127
146
|
rdoc_options: []
|
128
|
-
|
129
|
-
require_paths:
|
147
|
+
require_paths:
|
130
148
|
- lib
|
131
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
-
requirements:
|
133
|
-
- -
|
134
|
-
- !ruby/object:Gem::Version
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
- 0
|
144
|
-
version: "0"
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ! '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
none: false
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
none: false
|
145
161
|
requirements: []
|
146
|
-
|
147
162
|
rubyforge_project:
|
148
|
-
rubygems_version: 1.
|
163
|
+
rubygems_version: 1.8.24
|
149
164
|
signing_key:
|
150
165
|
specification_version: 3
|
151
166
|
summary: Render existing views as Excel documents with style!
|
152
|
-
test_files:
|
167
|
+
test_files:
|
153
168
|
- spec/defaults_spec.rb
|
154
169
|
- spec/format_spec.rb
|
155
170
|
- spec/types_spec.rb
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module ToSpreadsheet
|
2
|
-
module Helpers
|
3
|
-
def format_xls(selector = nil, &block)
|
4
|
-
context.format_xls selector, &block
|
5
|
-
end
|
6
|
-
|
7
|
-
def context
|
8
|
-
@context || ToSpreadsheet::Context.global
|
9
|
-
end
|
10
|
-
|
11
|
-
def with_context(context, &block)
|
12
|
-
context_was = self.context
|
13
|
-
@context = context
|
14
|
-
result = block.call
|
15
|
-
@context = context_was
|
16
|
-
result
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|