ruport 1.0.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -0
- data/README +11 -5
- data/Rakefile +2 -2
- data/examples/btree/commaleon/commaleon.rb +1 -1
- data/examples/simple_templating_example.rb +34 -0
- data/examples/tattle_rubygems_version.rb +6 -5
- data/examples/trac_ticket_status.rb +2 -2
- data/lib/ruport.rb +5 -4
- data/lib/ruport/acts_as_reportable.rb +63 -37
- data/lib/ruport/data.rb +1 -0
- data/lib/ruport/data/feeder.rb +111 -0
- data/lib/ruport/data/grouping.rb +84 -22
- data/lib/ruport/data/record.rb +1 -1
- data/lib/ruport/data/table.rb +127 -87
- data/lib/ruport/formatter.rb +22 -9
- data/lib/ruport/formatter/csv.rb +27 -3
- data/lib/ruport/formatter/html.rb +26 -6
- data/lib/ruport/formatter/pdf.rb +169 -36
- data/lib/ruport/formatter/template.rb +167 -0
- data/lib/ruport/formatter/text.rb +47 -15
- data/lib/ruport/query.rb +1 -1
- data/lib/ruport/renderer.rb +46 -56
- data/test/acts_as_reportable_test.rb +20 -20
- data/test/csv_formatter_test.rb +26 -1
- data/test/data_feeder_test.rb +88 -0
- data/test/grouping_test.rb +90 -4
- data/test/html_formatter_test.rb +25 -2
- data/test/pdf_formatter_test.rb +69 -3
- data/test/query_test.rb +3 -2
- data/test/record_test.rb +2 -1
- data/test/renderer_test.rb +49 -3
- data/test/sql_split_test.rb +4 -2
- data/test/table_test.rb +159 -65
- data/test/template_test.rb +37 -0
- data/test/text_formatter_test.rb +33 -1
- metadata +9 -4
- data/lib/ruport/renderer.rb.orig +0 -542
- data/test/renderer_test.rb.orig +0 -512
@@ -0,0 +1,167 @@
|
|
1
|
+
# Ruport : Extensible Reporting System
|
2
|
+
#
|
3
|
+
# template.rb provides templating support for Ruby Reports.
|
4
|
+
#
|
5
|
+
# Copyright August 2007, Gregory Brown / Michael Milner. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
|
9
|
+
|
10
|
+
# This class provides templating functionality for Ruport.
|
11
|
+
# New templates are created using the Template.create method.
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
#
|
15
|
+
# Ruport::Formatter::Template.create(:simple) do |t|
|
16
|
+
# t.page_layout = :landscape
|
17
|
+
# t.grouping_style = :offset
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# You can then determine how the template should be used by defining
|
21
|
+
# an <tt>apply_template</tt> method in your formatter.
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
#
|
25
|
+
# class Ruport::Formatter::PDF
|
26
|
+
# def apply_template
|
27
|
+
# options.paper_orientation = template.page_layout
|
28
|
+
# options.style = template.grouping_style
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# When you're ready to render the output, you can set the :template as an
|
33
|
+
# option for the formatter. Using the template remains optional and you can
|
34
|
+
# still render the report without it.
|
35
|
+
#
|
36
|
+
# Example:
|
37
|
+
#
|
38
|
+
# puts g.to_pdf(:template => :simple) #=> uses the template
|
39
|
+
# puts g.to_pdf #=> doesn't use the template
|
40
|
+
#
|
41
|
+
# The built-in formatters all have <tt>apply_template</tt> methods defined that
|
42
|
+
# accept a standard set of options. Each option can be set by supplying a hash
|
43
|
+
# with the keys/values listed in the tables below.
|
44
|
+
#
|
45
|
+
# Example:
|
46
|
+
#
|
47
|
+
# Ruport::Formatter::Template.create(:simple) do |t|
|
48
|
+
# t.page_format = {
|
49
|
+
# :size => "LETTER",
|
50
|
+
# :layout => :landscape
|
51
|
+
# }
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# ==== PDF Formatter Options
|
55
|
+
#
|
56
|
+
# Option Key Value
|
57
|
+
#
|
58
|
+
# page_format :size Any size supported by the :paper
|
59
|
+
# option to PDF::Writer.new
|
60
|
+
#
|
61
|
+
# :layout :portrait, :landscape
|
62
|
+
#
|
63
|
+
# text_format Any available to Corresponding values
|
64
|
+
# PDF::Writer#text
|
65
|
+
#
|
66
|
+
# table_format All attributes of Corresponding values
|
67
|
+
# PDF::SimpleTable
|
68
|
+
#
|
69
|
+
# :column_options - All attributes of
|
70
|
+
# PDF::SimpleTable::Column
|
71
|
+
# except :heading
|
72
|
+
# - Hash keyed by a column name, whose
|
73
|
+
# value is a hash containing any of
|
74
|
+
# the other:column_options (sets values
|
75
|
+
# for specific columns)
|
76
|
+
# - :heading => { All attributes of
|
77
|
+
# PDF::SimpleTable::Column::Heading }
|
78
|
+
#
|
79
|
+
# column_format :alignment :left, :right, :center, :full
|
80
|
+
#
|
81
|
+
# :width column width
|
82
|
+
#
|
83
|
+
# heading_format :alignment :left, :right, :center, :full
|
84
|
+
#
|
85
|
+
# :bold true or false
|
86
|
+
#
|
87
|
+
# :title heading title (if not set,
|
88
|
+
# defaults to column name)
|
89
|
+
#
|
90
|
+
# grouping_format :style :inline, :justified, :separated, :offset
|
91
|
+
#
|
92
|
+
#
|
93
|
+
# ==== Text Formatter Options
|
94
|
+
#
|
95
|
+
# Option Key Value
|
96
|
+
#
|
97
|
+
# table_format :show_headings true or false
|
98
|
+
# :width Table width
|
99
|
+
# :ignore_width true or false
|
100
|
+
#
|
101
|
+
# column_format :alignment :center
|
102
|
+
# :maximum_width Max column width
|
103
|
+
#
|
104
|
+
# grouping_format :show_headings true or false
|
105
|
+
#
|
106
|
+
#
|
107
|
+
# ==== HTML Formatter Options
|
108
|
+
#
|
109
|
+
# Option Key Value
|
110
|
+
#
|
111
|
+
# table_format :show_headings true or false
|
112
|
+
#
|
113
|
+
# grouping_format :style :inline, :justified
|
114
|
+
# :show_headings true or false
|
115
|
+
#
|
116
|
+
#
|
117
|
+
# ==== CSV Formatter Options
|
118
|
+
#
|
119
|
+
# Option Key Value
|
120
|
+
#
|
121
|
+
# table_format :show_headings true or false
|
122
|
+
#
|
123
|
+
# grouping_format :style :inline, :justified, :raw
|
124
|
+
# :show_headings true or false
|
125
|
+
#
|
126
|
+
# format_options All options Corresponding values
|
127
|
+
# available to
|
128
|
+
# FasterCSV.new
|
129
|
+
#
|
130
|
+
class Ruport::Formatter::Template < Ruport::Renderer::Options
|
131
|
+
|
132
|
+
# Returns all existing templates in a hash keyed by the template names.
|
133
|
+
def self.templates
|
134
|
+
@templates ||= Hash.new
|
135
|
+
end
|
136
|
+
|
137
|
+
# Creates a new template with a name given by <tt>label</tt>.
|
138
|
+
#
|
139
|
+
# Example:
|
140
|
+
#
|
141
|
+
# Ruport::Formatter::Template.create(:simple) do |t|
|
142
|
+
# t.page_layout = :landscape
|
143
|
+
# t.grouping_style = :offset
|
144
|
+
# end
|
145
|
+
#
|
146
|
+
# You can inherit all the options set in a template by using the :base option
|
147
|
+
# and providing an existing template name to use as the base.
|
148
|
+
#
|
149
|
+
# Example:
|
150
|
+
#
|
151
|
+
# Ruport::Formatter::Template.create(:derived, :base => :simple)
|
152
|
+
#
|
153
|
+
def self.create(label,opts={})
|
154
|
+
if opts[:base]
|
155
|
+
obj = Marshal.load(Marshal.dump(self[opts[:base]]))
|
156
|
+
else
|
157
|
+
obj = new
|
158
|
+
end
|
159
|
+
yield(obj) if block_given?
|
160
|
+
templates[label] = obj
|
161
|
+
end
|
162
|
+
|
163
|
+
# Returns an existing template with the provided name (label).
|
164
|
+
def self.[](label)
|
165
|
+
templates[label]
|
166
|
+
end
|
167
|
+
end
|
@@ -10,9 +10,10 @@
|
|
10
10
|
#
|
11
11
|
# This is free software distributed under the same terms as Ruby 1.8
|
12
12
|
# See LICENSE and COPYING for details.
|
13
|
-
module Ruport
|
14
|
-
|
15
|
-
#
|
13
|
+
module Ruport
|
14
|
+
|
15
|
+
# This class provides text output for Ruport's Row, Table, Group, and
|
16
|
+
# Grouping renderers
|
16
17
|
#
|
17
18
|
# It handles things like automatically truncating tables that go off the
|
18
19
|
# edge of the screen in the console, proper column alignment, and pretty
|
@@ -24,24 +25,24 @@ module Ruport
|
|
24
25
|
# | yes | no | yes |
|
25
26
|
# | yes | yes | red snapper |
|
26
27
|
# | what | the | red snapper |
|
27
|
-
# +------------------------------+
|
28
|
+
# +------------------------------+
|
28
29
|
#
|
29
30
|
# === Supported Options
|
30
31
|
#
|
31
32
|
# <tt>:max_col_width:</tt> Ordinal array of column widths. Set automatically
|
32
|
-
# but can be overridden
|
33
|
+
# but can be overridden.
|
33
34
|
#
|
34
|
-
# <tt>:alignment:</tt> Defaults to left justify text and right justify
|
35
|
-
#
|
35
|
+
# <tt>:alignment:</tt> Defaults to left justify text and right justify
|
36
|
+
# numbers. Centers all fields when set to :center.
|
36
37
|
#
|
37
|
-
# <tt>:table_width:</tt> Will truncate rows at this limit.
|
38
|
+
# <tt>:table_width:</tt> Will truncate rows at this limit.
|
38
39
|
#
|
39
40
|
# <tt>:show_table_headers:</tt> Defaults to true
|
40
41
|
#
|
41
42
|
# <tt>:show_group_headers:</tt> Defaults to true
|
42
43
|
#
|
43
44
|
# <tt>:ignore_table_width:</tt> When set to true, outputs full table without
|
44
|
-
# truncating it. Useful for file output
|
45
|
+
# truncating it. Useful for file output.
|
45
46
|
class Formatter::Text < Formatter
|
46
47
|
|
47
48
|
renders :text, :for => [ Renderer::Row, Renderer::Table,
|
@@ -51,8 +52,16 @@ module Ruport
|
|
51
52
|
:show_table_headers, :show_group_headers,
|
52
53
|
:ignore_table_width
|
53
54
|
|
55
|
+
# Hook for setting available options using a template. See the template
|
56
|
+
# documentation for the available options and their format.
|
57
|
+
def apply_template
|
58
|
+
apply_table_format_template(template.table_format)
|
59
|
+
apply_column_format_template(template.column_format)
|
60
|
+
apply_grouping_format_template(template.grouping_format)
|
61
|
+
end
|
62
|
+
|
54
63
|
# Checks to ensure the table is not empty and then calls
|
55
|
-
# calculate_max_col_widths
|
64
|
+
# calculate_max_col_widths.
|
56
65
|
#
|
57
66
|
def prepare_table
|
58
67
|
raise Ruport::FormatterError, "Can't output table without " +
|
@@ -63,7 +72,7 @@ module Ruport
|
|
63
72
|
# Uses the column names from the given Data::Table to generate a table
|
64
73
|
# header.
|
65
74
|
#
|
66
|
-
# Calls fit_to_width to truncate table heading if necessary.
|
75
|
+
# Calls fit_to_width to truncate the table heading if necessary.
|
67
76
|
#
|
68
77
|
def build_table_header
|
69
78
|
return unless should_render_column_names?
|
@@ -81,7 +90,7 @@ module Ruport
|
|
81
90
|
# left justified. Can be changed to support centering of output by
|
82
91
|
# setting options.alignment to :center
|
83
92
|
#
|
84
|
-
# Uses fit_to_width to truncate table if necessary.
|
93
|
+
# Uses fit_to_width to truncate the table if necessary.
|
85
94
|
#
|
86
95
|
def build_table_body
|
87
96
|
output << fit_to_width(hr)
|
@@ -107,7 +116,7 @@ module Ruport
|
|
107
116
|
# left justified. Can be changed to support centering of output by
|
108
117
|
# setting options.alignment to :center
|
109
118
|
#
|
110
|
-
# Uses fit_to_width to truncate
|
119
|
+
# Uses fit_to_width to truncate the row if necessary.
|
111
120
|
#
|
112
121
|
def build_row
|
113
122
|
max_col_widths_for_row(data) unless max_col_width
|
@@ -179,7 +188,7 @@ module Ruport
|
|
179
188
|
}.join("\n") + "\n"
|
180
189
|
end
|
181
190
|
|
182
|
-
#
|
191
|
+
# Determines the text widths for each column.
|
183
192
|
def calculate_max_col_widths
|
184
193
|
# allow override
|
185
194
|
return if max_col_width
|
@@ -195,7 +204,7 @@ module Ruport
|
|
195
204
|
data.each { |r| max_col_widths_for_row(r) }
|
196
205
|
end
|
197
206
|
|
198
|
-
#
|
207
|
+
# Used to calculate the <tt>max_col_widths</tt> array.
|
199
208
|
# Override this to tweak the automatic column size adjustments.
|
200
209
|
def max_col_widths_for_row(row)
|
201
210
|
options.max_col_width ||= []
|
@@ -205,6 +214,29 @@ module Ruport
|
|
205
214
|
end
|
206
215
|
end
|
207
216
|
end
|
217
|
+
|
218
|
+
private
|
219
|
+
|
220
|
+
def apply_table_format_template(t)
|
221
|
+
t = t || {}
|
222
|
+
options.show_table_headers = t[:show_headings] unless
|
223
|
+
t[:show_headings].nil?
|
224
|
+
options.table_width = t[:width] if t[:width]
|
225
|
+
options.ignore_table_width = t[:ignore_width] unless
|
226
|
+
t[:ignore_width].nil?
|
227
|
+
end
|
228
|
+
|
229
|
+
def apply_column_format_template(t)
|
230
|
+
t = t || {}
|
231
|
+
options.max_col_width = t[:maximum_width] if t[:maximum_width]
|
232
|
+
options.alignment = t[:alignment] if t[:alignment]
|
233
|
+
end
|
234
|
+
|
235
|
+
def apply_grouping_format_template(t)
|
236
|
+
t = t || {}
|
237
|
+
options.show_group_headers = t[:show_headings] unless
|
238
|
+
t[:show_headings].nil?
|
239
|
+
end
|
208
240
|
|
209
241
|
end
|
210
242
|
end
|
data/lib/ruport/query.rb
CHANGED
data/lib/ruport/renderer.rb
CHANGED
@@ -26,11 +26,11 @@ class Ruport::Renderer
|
|
26
26
|
# Structure for holding renderer options.
|
27
27
|
# Simplified version of HashWithIndifferentAccess
|
28
28
|
class Options < OpenStruct
|
29
|
-
#
|
29
|
+
# Returns a Hash object. Use this if you need methods other than []
|
30
30
|
def to_hash
|
31
31
|
@table
|
32
32
|
end
|
33
|
-
#
|
33
|
+
# Indifferent lookup of an attribute, e.g.
|
34
34
|
#
|
35
35
|
# options[:foo] == options["foo"]
|
36
36
|
def [](key)
|
@@ -50,12 +50,12 @@ class Ruport::Renderer
|
|
50
50
|
end
|
51
51
|
|
52
52
|
# This module provides hooks into Ruport's formatting system.
|
53
|
-
# It is used to implement the as() method for all of Ruport's
|
54
|
-
# as well as the renders_with and renders_as_* helpers.
|
53
|
+
# It is used to implement the as() method for all of Ruport's data
|
54
|
+
# structures, as well as the renders_with and renders_as_* helpers.
|
55
55
|
#
|
56
56
|
# You can actually use this with any data structure, it will look for a
|
57
|
-
# renderable_data method to pass to the <tt>renderer</tt> you
|
58
|
-
# but if that is not defined, it will pass <tt>self</tt
|
57
|
+
# renderable_data(format) method to pass to the <tt>renderer</tt> you
|
58
|
+
# specify, but if that is not defined, it will pass <tt>self</tt>.
|
59
59
|
#
|
60
60
|
# Examples:
|
61
61
|
#
|
@@ -73,10 +73,10 @@ class Ruport::Renderer
|
|
73
73
|
# include Ruport::Renderer::Hooks
|
74
74
|
# renders_as_row
|
75
75
|
# attr_accessor :column_order
|
76
|
-
# def renderable_data
|
77
|
-
#
|
76
|
+
# def renderable_data(format)
|
77
|
+
# column_order.map { |c| self[c] }
|
78
78
|
# end
|
79
|
-
# end
|
79
|
+
# end
|
80
80
|
#
|
81
81
|
# # >> a = { :a => 1, :b => 2, :c => 3 }
|
82
82
|
# # >> a.column_order = [:b,:a,:c]
|
@@ -87,7 +87,7 @@ class Ruport::Renderer
|
|
87
87
|
|
88
88
|
# Tells the class which renderer as() will forward to.
|
89
89
|
#
|
90
|
-
#
|
90
|
+
# Usage:
|
91
91
|
#
|
92
92
|
# class MyStructure
|
93
93
|
# include Renderer::Hooks
|
@@ -95,11 +95,11 @@ class Ruport::Renderer
|
|
95
95
|
# end
|
96
96
|
#
|
97
97
|
# You can also specify default rendering options, which will be used
|
98
|
-
# if they are not overriden by the options passed to as()
|
98
|
+
# if they are not overriden by the options passed to as().
|
99
99
|
#
|
100
100
|
# class MyStructure
|
101
|
-
#
|
102
|
-
#
|
101
|
+
# include Renderer::Hooks
|
102
|
+
# renders_with CustomRenderer, :font_size => 14
|
103
103
|
# end
|
104
104
|
def renders_with(renderer,opts={})
|
105
105
|
@renderer = renderer.name
|
@@ -137,7 +137,7 @@ class Ruport::Renderer
|
|
137
137
|
|
138
138
|
# The class of the renderer object for the base class.
|
139
139
|
#
|
140
|
-
# Example
|
140
|
+
# Example:
|
141
141
|
#
|
142
142
|
# >> Ruport::Data::Table.renderer
|
143
143
|
# => Ruport::Renderer::Table
|
@@ -152,11 +152,11 @@ class Ruport::Renderer
|
|
152
152
|
end
|
153
153
|
|
154
154
|
# Uses the Renderer specified by renders_with to generate formatted
|
155
|
-
# output. Passes the return value of the <tt>renderable_data</tt>
|
156
|
-
# the method is defined, otherwise passes <tt>self</tt> as :data
|
155
|
+
# output. Passes the return value of the <tt>renderable_data(format)</tt>
|
156
|
+
# method if the method is defined, otherwise passes <tt>self</tt> as :data
|
157
157
|
#
|
158
158
|
# The remaining options are converted to a Renderer::Options object and
|
159
|
-
# accessible in both the renderer and formatter.
|
159
|
+
# are accessible in both the renderer and formatter.
|
160
160
|
#
|
161
161
|
# Example:
|
162
162
|
#
|
@@ -167,16 +167,17 @@ class Ruport::Renderer
|
|
167
167
|
raise UnknownFormatError
|
168
168
|
end
|
169
169
|
self.class.renderer.render(format,
|
170
|
-
|
171
|
-
|
172
|
-
|
170
|
+
self.class.rendering_options.merge(options)) do |rend|
|
171
|
+
rend.data =
|
172
|
+
respond_to?(:renderable_data) ? renderable_data(format) : self
|
173
|
+
yield(rend) if block_given?
|
173
174
|
end
|
174
175
|
end
|
175
176
|
end
|
176
|
-
|
177
|
-
|
177
|
+
|
178
|
+
|
178
179
|
module AutoRunner #:nodoc:
|
179
|
-
#
|
180
|
+
# Called automatically when the report is rendered. Uses the
|
180
181
|
# data collected from the earlier methods.
|
181
182
|
def _run_
|
182
183
|
|
@@ -189,6 +190,10 @@ class Ruport::Renderer
|
|
189
190
|
end
|
190
191
|
end
|
191
192
|
|
193
|
+
if formatter.respond_to?(:apply_template) && options.template
|
194
|
+
formatter.apply_template
|
195
|
+
end
|
196
|
+
|
192
197
|
prepare self.class.first_stage if self.class.first_stage
|
193
198
|
|
194
199
|
if formatter.respond_to?(:layout) && options.layout != false
|
@@ -198,14 +203,13 @@ class Ruport::Renderer
|
|
198
203
|
end
|
199
204
|
|
200
205
|
finalize self.class.final_stage if self.class.final_stage
|
201
|
-
|
202
206
|
end
|
203
207
|
|
204
208
|
def execute_stages
|
205
209
|
# call each stage to build the report
|
206
210
|
unless self.class.stages.nil?
|
207
211
|
self.class.stages.each do |stage|
|
208
|
-
|
212
|
+
maybe("build_#{stage}")
|
209
213
|
end
|
210
214
|
end
|
211
215
|
end
|
@@ -308,7 +312,7 @@ class Ruport::Renderer
|
|
308
312
|
end
|
309
313
|
|
310
314
|
# Defines attribute writers for the Renderer::Options object shared
|
311
|
-
# between Renderer and Formatter
|
315
|
+
# between Renderer and Formatter.
|
312
316
|
#
|
313
317
|
# usage:
|
314
318
|
#
|
@@ -366,12 +370,13 @@ class Ruport::Renderer
|
|
366
370
|
# sets the data and options, and then does the following process:
|
367
371
|
#
|
368
372
|
# * If the renderer contains a module Helpers, mix it in to the instance.
|
369
|
-
# * If a block is given, yield the Renderer instance
|
370
|
-
# * If a setup() method is defined on the Renderer, call it
|
371
|
-
# * If the renderer has defined a run() method, call it
|
372
|
-
# include Renderer::AutoRunner
|
373
|
-
# *
|
374
|
-
# *
|
373
|
+
# * If a block is given, yield the Renderer instance.
|
374
|
+
# * If a setup() method is defined on the Renderer, call it.
|
375
|
+
# * If the renderer has defined a run() method, call it. Otherwise,
|
376
|
+
# include Renderer::AutoRunner (you usually won't need a run() method).
|
377
|
+
# * Call _run_ if it exists (this is provided by default, by AutoRunner).
|
378
|
+
# * If the :file option is set to a file name, appends output to the file.
|
379
|
+
# * Return the results of formatter.output
|
375
380
|
#
|
376
381
|
# Note that the only time you will need a run() method is if you can't
|
377
382
|
# do what you need to via a helpers module or via setup()
|
@@ -389,10 +394,11 @@ class Ruport::Renderer
|
|
389
394
|
include AutoRunner
|
390
395
|
end
|
391
396
|
rend._run_ if rend.respond_to? :_run_
|
397
|
+
rend.formatter.save_output(rend.options.file) if rend.options.file
|
392
398
|
return rend.formatter.output
|
393
399
|
end
|
394
400
|
|
395
|
-
# Allows you to set
|
401
|
+
# Allows you to set class-wide default options.
|
396
402
|
#
|
397
403
|
# Example:
|
398
404
|
#
|
@@ -433,7 +439,7 @@ class Ruport::Renderer
|
|
433
439
|
|
434
440
|
# Allows you to register a format with the renderer.
|
435
441
|
#
|
436
|
-
#
|
442
|
+
# Example:
|
437
443
|
#
|
438
444
|
# class MyFormatter < Ruport::Formatter
|
439
445
|
# # formatter code ...
|
@@ -446,10 +452,10 @@ class Ruport::Renderer
|
|
446
452
|
|
447
453
|
end
|
448
454
|
|
449
|
-
# The name of format being used
|
455
|
+
# The name of format being used.
|
450
456
|
attr_accessor :format
|
451
457
|
|
452
|
-
# The formatter object being used
|
458
|
+
# The formatter object being used.
|
453
459
|
attr_writer :formatter
|
454
460
|
|
455
461
|
# The +data+ that has been passed to the active formatter.
|
@@ -477,22 +483,11 @@ class Ruport::Renderer
|
|
477
483
|
options.io=obj
|
478
484
|
end
|
479
485
|
|
480
|
-
#
|
481
|
-
#
|
482
|
-
# When a block is given with a block variable, sets the block variable to the
|
483
|
-
# formatter.
|
484
|
-
#
|
485
|
-
# When a block is given without block variables, instance_evals the block
|
486
|
-
# within the context of the formatter.
|
486
|
+
# Returns the active formatter.
|
487
487
|
#
|
488
|
+
# If a block is given, it is evaluated in the context of the formatter.
|
488
489
|
def formatter(&block)
|
489
|
-
if block
|
490
|
-
return @formatter
|
491
|
-
elsif block.arity > 0
|
492
|
-
yield(@formatter)
|
493
|
-
else
|
494
|
-
@formatter.instance_eval(&block)
|
495
|
-
end
|
490
|
+
@formatter.instance_eval(&block) if block
|
496
491
|
return @formatter
|
497
492
|
end
|
498
493
|
|
@@ -513,11 +508,6 @@ class Ruport::Renderer
|
|
513
508
|
maybe "prepare_#{name}"
|
514
509
|
end
|
515
510
|
|
516
|
-
def build(names,prefix=nil)
|
517
|
-
return maybe("build_#{names}") if prefix.nil?
|
518
|
-
names.each { |n| maybe "build_#{prefix}_#{n}" }
|
519
|
-
end
|
520
|
-
|
521
511
|
def finalize(name)
|
522
512
|
maybe "finalize_#{name}"
|
523
513
|
end
|
@@ -530,7 +520,7 @@ class Ruport::Renderer
|
|
530
520
|
formatter.options = o
|
531
521
|
end
|
532
522
|
|
533
|
-
#
|
523
|
+
# Selects a formatter for use by format name
|
534
524
|
def use_formatter(format)
|
535
525
|
self.formatter = self.class.formats[format].new
|
536
526
|
self.formatter.format = format
|