ruport 1.4.0 → 1.6.0

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/Rakefile CHANGED
@@ -2,7 +2,7 @@ require "rake/rdoctask"
2
2
  require "rake/testtask"
3
3
  require "rake/gempackagetask"
4
4
 
5
- RUPORT_VERSION = "1.4.0"
5
+ RUPORT_VERSION = "1.6.0"
6
6
 
7
7
  begin
8
8
  require "rubygems"
@@ -32,8 +32,8 @@ spec = Gem::Specification.new do |spec|
32
32
  spec.extra_rdoc_files = %w{README LICENSE AUTHORS}
33
33
  spec.rdoc_options << '--title' << 'Ruport Documentation' <<
34
34
  '--main' << 'README' << '-q'
35
- spec.add_dependency('fastercsv', '>= 1.1.0')
36
- spec.add_dependency('pdf-writer', '= 1.1.7')
35
+ spec.add_dependency('fastercsv', '= 1.2.3')
36
+ spec.add_dependency('pdf-writer','= 1.1.8')
37
37
  spec.author = "Gregory Brown"
38
38
  spec.email = " gregory.t.brown@gmail.com"
39
39
  spec.rubyforge_project = "ruport"
@@ -0,0 +1,43 @@
1
+ # Demonstrates building a parent controller which provides additional 'built in'
2
+ # formats, allowing anonymous formatter support to use the simple interface
3
+ # rather than the :format => FormatterClass approach.
4
+
5
+ require "ruport"
6
+ module FooCorp
7
+ class Controller < Ruport::Controller
8
+ def self.built_in_formats
9
+ super.merge(:xml => FooCorp::Formatter::XML)
10
+ end
11
+ end
12
+
13
+ class Formatter
14
+ class XML < Ruport::Formatter
15
+
16
+ def xmlify(stuff)
17
+ output << "Wouldn't you like to see #{stuff} in XML?"
18
+ end
19
+ end
20
+ end
21
+
22
+ class MyController < FooCorp::Controller
23
+ stage :foo
24
+
25
+ formatter :xml do
26
+ build :foo do
27
+ xmlify "Red Snapper"
28
+ end
29
+ end
30
+
31
+ formatter :text do
32
+ build :foo do
33
+ output << "Red Snapper"
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ puts "XML:"
40
+ puts FooCorp::MyController.render_xml
41
+
42
+ puts "Text:"
43
+ puts FooCorp::MyController.render_text
@@ -10,7 +10,7 @@
10
10
  # of CSV dumps to see what has been removed or altered (we don't care
11
11
  # about new records )
12
12
  #
13
- # It's a camping app, but the core of it is a renderer/formatter combo.
13
+ # It's a camping app, but the core of it is a controller/formatter combo.
14
14
  # (Marked by %%%%%%%%%%% below)
15
15
  #
16
16
  # You'll need the camping omnibus and the F() ruport plugin to run this app.
@@ -51,13 +51,13 @@ module Commaleon::Helpers
51
51
 
52
52
  # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53
53
  # This is the bulk of the Ruport code in this app
54
- # (CSVDiffRenderer and CSVDiffFormatter)
54
+ # (CSVDiffController and CSVDiffFormatter)
55
55
  # The rest is just camping. The interesting thing here is that
56
56
  # you could easily define these in another file and just require
57
57
  # them here, and use them standalone outside of your web app.
58
58
  # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59
59
 
60
- class CSVDiffRenderer < Ruport::Renderer
60
+ class CSVDiffController < Ruport::Controller
61
61
  stage :diff_report
62
62
  option :key, :mcsv, :ccsv
63
63
 
@@ -65,7 +65,7 @@ module Commaleon::Helpers
65
65
  # manipulations on the data and options before handing off the
66
66
  # rendering task to the formatters.
67
67
  #
68
- # We're using grouping mainly for the renderer support,
68
+ # We're using grouping mainly for the controller support,
69
69
  # and rather than reducing a table, we're building up the
70
70
  # group objects via the helper methods missing_from_compare
71
71
  # and different_from_compare
@@ -133,7 +133,7 @@ module Commaleon::Helpers
133
133
  #
134
134
  # http://stonecode.svnrepository.com/ruport/trac.cgi/wiki/F
135
135
  #
136
- class CSVDiffFormatter < F([:html,:text,:csv,:pdf], :for => CSVDiffRenderer)
136
+ class CSVDiffFormatter < F([:html,:text,:csv,:pdf], :for => CSVDiffController)
137
137
  def build_diff_report
138
138
  # this is using the selective blocks for formatters that implement
139
139
  # more than one format. The block below will only be called when this
@@ -183,7 +183,7 @@ module Commaleon::Controllers
183
183
 
184
184
  def post
185
185
  @state.key = @input.csv_id
186
- @table = CSVDiffRenderer.render_html(:key => @state.key,
186
+ @table = CSVDiffController.render_html(:key => @state.key,
187
187
  :mcsv => @state.mfile,
188
188
  :ccsv => @state.cfile )
189
189
  render :html_diff
@@ -207,11 +207,11 @@ module Commaleon::Controllers
207
207
  set_headers(format)
208
208
  case(format)
209
209
  when "csv"
210
- text CSVDiffRenderer.render_csv(options)
210
+ text CSVDiffController.render_csv(options)
211
211
  when "pdf"
212
- text CSVDiffRenderer.render_pdf(options.merge(:style => :justified))
212
+ text CSVDiffController.render_pdf(options.merge(:style => :justified))
213
213
  when "txt"
214
- text CSVDiffRenderer.render_text(options)
214
+ text CSVDiffController.render_text(options)
215
215
  else
216
216
  text "no format!"
217
217
  end
@@ -1,21 +1,21 @@
1
1
  require "ruport"
2
2
 
3
- # Renderers can be though of as control classes or interface builders.
3
+ # Controllers can be though of as control classes or interface builders.
4
4
  # Essentially, they define the options that formatters should implement
5
5
  # and the stages of rendering they should handle. Ruport's formatting
6
- # system is very forgiving, and the renderers do not force their
6
+ # system is very forgiving, and the controllers do not force their
7
7
  # specs onto formatters that are attached to them.
8
8
  #
9
- class Document < Ruport::Renderer
9
+ class Document < Ruport::Controller
10
10
 
11
11
  # Will throw an error if these options are not set at rendering time
12
12
  required_option :text, :author
13
13
 
14
- # The renderer will look for a build_document_body() method on the formatter,
14
+ # The controller will look for a build_document_body() method on the formatter,
15
15
  # but silently skip this stage if it is missing
16
16
  stage :document_body
17
17
 
18
- # The renderer will look for a finalize_document() method on the formatter,
18
+ # The controller will look for a finalize_document() method on the formatter,
19
19
  # but silently skip this stage if it is missing
20
20
  finalize :document
21
21
  end
@@ -59,11 +59,11 @@ class CenteredPDFTextBox < Ruport::Formatter::PDF
59
59
  end
60
60
  end
61
61
 
62
- # All options passed to a renderer will be written onto the options object.
62
+ # All options passed to a controller will be written onto the options object.
63
63
  # In the block form, you may use explicit accessors
64
64
  # (i.e. r.text instead of r.options.text ) for only things that have
65
65
  # either been defined with option / required_option methods,
66
- # or have explicit accessors in the Renderer.
66
+ # or have explicit accessors in the Controller.
67
67
  #
68
68
  a = Document.render_pdf( :heading => "a good quote",
69
69
  :author => "Ralph Waldo Emerson") do |r|
@@ -1,6 +1,6 @@
1
1
  require "ruport"
2
2
 
3
- class LinePlotter < Ruport::Renderer
3
+ class LinePlotter < Ruport::Controller
4
4
 
5
5
  options do |o|
6
6
  o.line_color = "green"
@@ -8,14 +8,14 @@
8
8
 
9
9
  require "ruport"
10
10
 
11
- # only used for the titleize call in ClientRenderer#setup
11
+ # only used for the titleize call in ClientController#setup
12
12
  # tweak as needed if you don't want to install AS.
13
13
  require "active_support"
14
14
 
15
15
  # This looks a little more messy than usual, but it addresses the
16
16
  # concern of wanting to have a standard template for reports.
17
17
  #
18
- class ClientRenderer < Ruport::Renderer
18
+ class ClientController < Ruport::Controller
19
19
  prepare :standard_report
20
20
  stage :company_header, :client_header, :client_body, :client_footer
21
21
  finalize :standard_report
@@ -51,7 +51,7 @@ end
51
51
  # Notice the footer is not implemented and it doesn't complain.
52
52
  #
53
53
  class ClientPDF < CompanyPDFBase
54
- renders :pdf, :for => ClientRenderer
54
+ renders :pdf, :for => ClientController
55
55
 
56
56
  def build_client_header
57
57
  pad(10) do
@@ -68,5 +68,5 @@ end
68
68
  table = Table([:a,:b,:c]) << [1,2,3] << [4,5,6]
69
69
 
70
70
  File.open("example.pdf","w") do |f|
71
- f << ClientRenderer.render_pdf(:data => table,:example => "apple")
71
+ f << ClientController.render_pdf(:data => table,:example => "apple")
72
72
  end
@@ -1,14 +1,14 @@
1
1
  require "rubygems"
2
2
  require "ruport"
3
3
 
4
- class RoadmapRenderer < Ruport::Renderer
4
+ class RoadmapController < Ruport::Controller
5
5
  stage :roadmap_image, :roadmap_text_body
6
6
  finalize :roadmap
7
7
  end
8
8
 
9
9
  class HTMLRoadmap < Ruport::Formatter
10
10
 
11
- renders :html, :for => RoadmapRenderer
11
+ renders :html, :for => RoadmapController
12
12
 
13
13
  def layout
14
14
  output << "<html><body>\n"
@@ -28,7 +28,7 @@ end
28
28
 
29
29
  class PDFRoadmap < Ruport::Formatter::PDF
30
30
 
31
- renders :pdf, :for => RoadmapRenderer
31
+ renders :pdf, :for => RoadmapController
32
32
 
33
33
  def build_roadmap_image
34
34
  center_image_in_box options.image_file, :x => 0, :y => 200,
@@ -49,6 +49,6 @@ end
49
49
 
50
50
  formats = [:html, :pdf]
51
51
  formats.each do |format|
52
- RoadmapRenderer.render(format, :image_file => "roadmap.png",
52
+ RoadmapController.render(format, :image_file => "roadmap.png",
53
53
  :file => "roadmap.#{format}")
54
54
  end
@@ -1,12 +1,12 @@
1
1
  require "ruport"
2
2
 
3
- class CSV2Something < Ruport::Renderer
4
- required_option :file
3
+ class CSV2Something < Ruport::Controller
4
+ required_option :csv_file
5
5
  stage :table_body
6
6
 
7
7
  module Helpers
8
8
  def table_feeder
9
- Table(options.file,:has_names => false) { |t,r| yield(r) }
9
+ Table(options.csv_file,:has_names => false) { |t,r| yield(r) }
10
10
  end
11
11
  end
12
12
 
@@ -36,4 +36,4 @@ class Text < Ruport::Formatter::Text
36
36
 
37
37
  end
38
38
 
39
- CSV2Something.render_html(:file => "example.csv",:io => STDOUT)
39
+ CSV2Something.render_html(:csv_file => "example.csv",:io => STDOUT)
@@ -2,7 +2,7 @@ require "ruport"
2
2
 
3
3
  # draws pretty little lines all over the place on a PDF
4
4
 
5
- class SimpleLines < Ruport::Renderer
5
+ class SimpleLines < Ruport::Controller
6
6
  stage :horizontal_lines
7
7
  end
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  class TracSummaryReport
4
4
 
5
- include Ruport::Renderer::Hooks
5
+ include Ruport::Controller::Hooks
6
6
 
7
7
  renders_as_table
8
8
 
@@ -9,11 +9,23 @@
9
9
  #
10
10
  # See LICENSE and COPYING for details
11
11
  #
12
+
13
+
14
+ if RUBY_VERSION > "1.9"
15
+ require "csv"
16
+ unless defined? FCSV
17
+ class Object
18
+ FCSV = CSV
19
+ alias_method :FCSV, :CSV
20
+ end
21
+ end
22
+ end
23
+
12
24
 
13
25
  module Ruport #:nodoc:#
14
26
 
15
- VERSION = "1.4.0"
16
-
27
+ VERSION = "1.6.0"
28
+
17
29
  class FormatterError < RuntimeError #:nodoc:
18
30
  end
19
31
 
@@ -102,7 +114,7 @@ module Ruport #:nodoc:#
102
114
  end
103
115
 
104
116
  require "enumerator"
105
- require "ruport/renderer"
117
+ require "ruport/controller"
106
118
  require "ruport/data"
107
119
  require "ruport/formatter"
108
120
 
@@ -1,16 +1,16 @@
1
- # renderer.rb : General purpose formatted data renderer for Ruby Reports
1
+ # controller.rb : General purpose control of formatted data for Ruby Reports
2
2
  #
3
3
  # Copyright December 2006, Gregory Brown. All Rights Reserved.
4
4
  #
5
5
  # This is free software. Please see the LICENSE and COPYING files for details.
6
6
 
7
7
 
8
- # This class implements the core renderer for Ruport's formatting system. It is
9
- # designed to implement the low level tools necessary to build report renderers
10
- # for different kinds of tasks. See Renderer::Table for a tabular data
11
- # renderer.
8
+ # This class implements the core controller for Ruport's formatting system.
9
+ # It is designed to implement the low level tools necessary to build report
10
+ # controllers for different kinds of tasks. See Controller::Table for a
11
+ # tabular data controller.
12
12
  #
13
- class Ruport::Renderer
13
+ class Ruport::Controller
14
14
 
15
15
  class RequiredOptionNotSet < RuntimeError #:nodoc:
16
16
  end
@@ -18,16 +18,18 @@ class Ruport::Renderer
18
18
  end
19
19
  class StageAlreadyDefinedError < RuntimeError #:nodoc:
20
20
  end
21
- class RendererNotSetError < RuntimeError #:nodoc:
21
+ class ControllerNotSetError < RuntimeError #:nodoc:
22
22
  end
23
23
 
24
24
  require "ostruct"
25
25
 
26
- # Structure for holding renderer options.
26
+ # Structure for holding controller options.
27
27
  # Simplified version of HashWithIndifferentAccess
28
28
  class Options < OpenStruct
29
-
30
- private :id
29
+
30
+ if RUBY_VERSION < "1.9"
31
+ private :id
32
+ end
31
33
 
32
34
  # Returns a Hash object. Use this if you need methods other than []
33
35
  def to_hash
@@ -57,23 +59,23 @@ class Ruport::Renderer
57
59
  # structures, as well as the renders_with and renders_as_* helpers.
58
60
  #
59
61
  # You can actually use this with any data structure, it will look for a
60
- # renderable_data(format) method to pass to the <tt>renderer</tt> you
62
+ # renderable_data(format) method to pass to the <tt>controller</tt> you
61
63
  # specify, but if that is not defined, it will pass <tt>self</tt>.
62
64
  #
63
65
  # Examples:
64
66
  #
65
- # # Render Arrays with Ruport's Row Renderer
67
+ # # Render Arrays with Ruport's Row Controller
66
68
  # class Array
67
- # include Ruport::Renderer::Hooks
69
+ # include Ruport::Controller::Hooks
68
70
  # renders_as_row
69
71
  # end
70
72
  #
71
73
  # # >> [1,2,3].as(:csv)
72
74
  # # => "1,2,3\n"
73
75
  #
74
- # # Render Hashes with Ruport's Row Renderer
76
+ # # Render Hashes with Ruport's Row Controller
75
77
  # class Hash
76
- # include Ruport::Renderer::Hooks
78
+ # include Ruport::Controller::Hooks
77
79
  # renders_as_row
78
80
  # attr_accessor :column_order
79
81
  # def renderable_data(format)
@@ -88,24 +90,24 @@ class Ruport::Renderer
88
90
  module Hooks
89
91
  module ClassMethods
90
92
 
91
- # Tells the class which renderer as() will forward to.
93
+ # Tells the class which controller as() will forward to.
92
94
  #
93
95
  # Usage:
94
96
  #
95
97
  # class MyStructure
96
- # include Renderer::Hooks
97
- # renders_with CustomRenderer
98
+ # include Controller::Hooks
99
+ # renders_with CustomController
98
100
  # end
99
101
  #
100
102
  # You can also specify default rendering options, which will be used
101
103
  # if they are not overriden by the options passed to as().
102
104
  #
103
105
  # class MyStructure
104
- # include Renderer::Hooks
105
- # renders_with CustomRenderer, :font_size => 14
106
+ # include Controller::Hooks
107
+ # renders_with CustomController, :font_size => 14
106
108
  # end
107
- def renders_with(renderer,opts={})
108
- @renderer = renderer.name
109
+ def renders_with(controller,opts={})
110
+ @controller = controller
109
111
  @rendering_options=opts
110
112
  end
111
113
 
@@ -114,39 +116,38 @@ class Ruport::Renderer
114
116
  @rendering_options
115
117
  end
116
118
 
117
- # Shortcut for renders_with(Ruport::Renderer::Table), you
118
- # may wish to override this if you build a custom table renderer.
119
+ # Shortcut for renders_with(Ruport::Controller::Table), you
120
+ # may wish to override this if you build a custom table controller.
119
121
  def renders_as_table(options={})
120
- renders_with Ruport::Renderer::Table,options
122
+ renders_with Ruport::Controller::Table,options
121
123
  end
122
124
 
123
- # Shortcut for renders_with(Ruport::Renderer::Row), you
124
- # may wish to override this if you build a custom row renderer.
125
+ # Shortcut for renders_with(Ruport::Controller::Row), you
126
+ # may wish to override this if you build a custom row controller.
125
127
  def renders_as_row(options={})
126
- renders_with Ruport::Renderer::Row, options
128
+ renders_with Ruport::Controller::Row, options
127
129
  end
128
130
 
129
- # Shortcut for renders_with(Ruport::Renderer::Group), you
130
- # may wish to override this if you build a custom group renderer.
131
+ # Shortcut for renders_with(Ruport::Controller::Group), you
132
+ # may wish to override this if you build a custom group controller.
131
133
  def renders_as_group(options={})
132
- renders_with Ruport::Renderer::Group,options
134
+ renders_with Ruport::Controller::Group,options
133
135
  end
134
136
 
135
- # Shortcut for renders_with(Ruport::Renderer::Grouping), you
136
- # may wish to override this if you build a custom grouping renderer.
137
+ # Shortcut for renders_with(Ruport::Controller::Grouping), you
138
+ # may wish to override this if you build a custom grouping controller.
137
139
  def renders_as_grouping(options={})
138
- renders_with Ruport::Renderer::Grouping,options
140
+ renders_with Ruport::Controller::Grouping,options
139
141
  end
140
142
 
141
- # The class of the renderer object for the base class.
143
+ # The class of the controller object for the base class.
142
144
  #
143
145
  # Example:
144
146
  #
145
- # >> Ruport::Data::Table.renderer
146
- # => Ruport::Renderer::Table
147
- def renderer
148
- return unless @renderer
149
- @renderer.split("::").inject(Class) { |c,el| c.const_get(el) }
147
+ # >> Ruport::Data::Table.controller
148
+ # => Ruport::Controller::Table
149
+ def controller
150
+ @controller
150
151
  end
151
152
  end
152
153
 
@@ -154,22 +155,22 @@ class Ruport::Renderer
154
155
  base.extend(ClassMethods)
155
156
  end
156
157
 
157
- # Uses the Renderer specified by renders_with to generate formatted
158
+ # Uses the Controller specified by renders_with to generate formatted
158
159
  # output. Passes the return value of the <tt>renderable_data(format)</tt>
159
160
  # method if the method is defined, otherwise passes <tt>self</tt> as :data
160
161
  #
161
- # The remaining options are converted to a Renderer::Options object and
162
- # are accessible in both the renderer and formatter.
162
+ # The remaining options are converted to a Controller::Options object and
163
+ # are accessible in both the controller and formatter.
163
164
  #
164
165
  # Example:
165
166
  #
166
167
  # table.as(:csv, :show_table_headers => false)
167
168
  def as(format,options={})
168
- raise RendererNotSetError unless self.class.renderer
169
- unless self.class.renderer.formats.include?(format)
169
+ raise ControllerNotSetError unless self.class.controller
170
+ unless self.class.controller.formats.include?(format)
170
171
  raise UnknownFormatError
171
172
  end
172
- self.class.renderer.render(format,
173
+ self.class.controller.render(format,
173
174
  self.class.rendering_options.merge(options)) do |rend|
174
175
  rend.data =
175
176
  respond_to?(:renderable_data) ? renderable_data(format) : self
@@ -183,9 +184,105 @@ class Ruport::Renderer
183
184
  as(format.to_sym, options.merge(:file => file))
184
185
  end
185
186
  end
187
+
186
188
 
187
189
 
188
190
  class << self
191
+
192
+ # Returns a hash that maps format names to their formatter classes, for use
193
+ # with the formatter shortcut. Supported formats are :html, :csv, :pdf, and
194
+ # :text by default.
195
+ #
196
+ #
197
+ # Sample override:
198
+ #
199
+ # class MyController < Ruport::Controller
200
+ #
201
+ # def built_in_formats
202
+ # super.extend(:xml => MyXMLFormatter,
203
+ # :json => MyJSONFormatter)
204
+ # end
205
+ # end
206
+ #
207
+ # This would allow for:
208
+ #
209
+ # class ChildController < MyController
210
+ #
211
+ # formatter :xml do
212
+ # # ...
213
+ # end
214
+ #
215
+ # formatter :json do
216
+ # # ...
217
+ # end
218
+ # end
219
+ #
220
+ def built_in_formats
221
+ { :html => Ruport::Formatter::HTML,
222
+ :csv => Ruport::Formatter::CSV,
223
+ :pdf => Ruport::Formatter::PDF,
224
+ :text => Ruport::Formatter::Text }
225
+ end
226
+
227
+
228
+ # Generates an anonymous formatter class and ties it to the Controller.
229
+ # This method looks up the built in formats in the hash returned by
230
+ # built_in_formats, but also explicitly specify a custom Formatter class to
231
+ # subclass from.
232
+ #
233
+ # Sample usage:
234
+ #
235
+ # class ControllerWithAnonymousFormatters < Ruport::Controller
236
+ #
237
+ # stage :report
238
+ #
239
+ # formatter :html do
240
+ # build :report do
241
+ # output << textile("h1. Hi there")
242
+ # end
243
+ # end
244
+ #
245
+ # formatter :csv do
246
+ # build :report do
247
+ # build_row([1,2,3])
248
+ # end
249
+ # end
250
+ #
251
+ # formatter :pdf do
252
+ # build :report do
253
+ # add_text "hello world"
254
+ # end
255
+ # end
256
+ #
257
+ # formatter :text do
258
+ # build :report do
259
+ # output << "Hello world"
260
+ # end
261
+ # end
262
+ #
263
+ # formatter :custom => CustomFormatter do
264
+ #
265
+ # build :report do
266
+ # output << "This is "
267
+ # custom_helper
268
+ # end
269
+ #
270
+ # end
271
+ #
272
+ # end
273
+ #
274
+ def formatter(*a,&b)
275
+ case a[0]
276
+ when Symbol
277
+ klass = Class.new(built_in_formats[a[0]])
278
+ klass.renders a[0], :for => self
279
+ when Hash
280
+ k,v = a[0].to_a[0]
281
+ klass = Class.new(v)
282
+ klass.renders k, :for => self
283
+ end
284
+ klass.class_eval(&b)
285
+ end
189
286
 
190
287
  attr_accessor :first_stage,:final_stage,:required_options,:stages #:nodoc:
191
288
 
@@ -194,18 +291,18 @@ class Ruport::Renderer
194
291
  #
195
292
  # Usage:
196
293
  #
197
- # class MyRenderer < Ruport::Renderer
294
+ # class MyController < Ruport::Controller
198
295
  # # other details omitted...
199
296
  # finalize :apple
200
297
  # end
201
298
  #
202
299
  # class MyFormatter < Ruport::Formatter
203
- # renders :example, :for => MyRenderer
300
+ # renders :example, :for => MyController
204
301
  #
205
302
  # # other details omitted...
206
303
  #
207
304
  # def finalize_apple
208
- # # this method will be called when MyRenderer tries to render
305
+ # # this method will be called when MyController tries to render
209
306
  # # the :example format
210
307
  # end
211
308
  # end
@@ -223,16 +320,16 @@ class Ruport::Renderer
223
320
  #
224
321
  # Usage:
225
322
  #
226
- # class MyRenderer < Ruport::Renderer
323
+ # class MyController < Ruport::Controller
227
324
  # # other details omitted...
228
325
  # prepare :apple
229
326
  # end
230
327
  #
231
328
  # class MyFormatter < Ruport::Formatter
232
- # renders :example, :for => MyRenderer
329
+ # renders :example, :for => MyController
233
330
  #
234
331
  # def prepare_apple
235
- # # this method will be called when MyRenderer tries to render
332
+ # # this method will be called when MyController tries to render
236
333
  # # the :example format
237
334
  # end
238
335
  #
@@ -252,21 +349,21 @@ class Ruport::Renderer
252
349
  #
253
350
  # Usage:
254
351
  #
255
- # class MyRenderer < Ruport::Renderer
352
+ # class MyController < Ruport::Controller
256
353
  # # other details omitted...
257
354
  # stage :apple,:banana
258
355
  # end
259
356
  #
260
357
  # class MyFormatter < Ruport::Formatter
261
- # renders :example, :for => MyRenderer
358
+ # renders :example, :for => MyController
262
359
  #
263
360
  # def build_apple
264
- # # this method will be called when MyRenderer tries to render
361
+ # # this method will be called when MyController tries to render
265
362
  # # the :example format
266
363
  # end
267
364
  #
268
365
  # def build_banana
269
- # # this method will be called when MyRenderer tries to render
366
+ # # this method will be called when MyController tries to render
270
367
  # # the :example format
271
368
  # end
272
369
  #
@@ -281,13 +378,13 @@ class Ruport::Renderer
281
378
  }
282
379
  end
283
380
 
284
- # Defines attribute writers for the Renderer::Options object shared
285
- # between Renderer and Formatter. Will throw an error if the user does
381
+ # Defines attribute writers for the Controller::Options object shared
382
+ # between Controller and Formatter. Will throw an error if the user does
286
383
  # not provide values for these options upon rendering.
287
384
  #
288
385
  # usage:
289
386
  #
290
- # class MyRenderer < Ruport::Renderer
387
+ # class MyController < Ruport::Controller
291
388
  # required_option :employee_name, :address
292
389
  # # other details omitted
293
390
  # end
@@ -305,12 +402,12 @@ class Ruport::Renderer
305
402
  end
306
403
  end
307
404
 
308
- # Lists the formatters that are currently registered on a renderer,
405
+ # Lists the formatters that are currently registered on a controller,
309
406
  # as a hash keyed by format name.
310
407
  #
311
408
  # Example:
312
409
  #
313
- # >> Ruport::Renderer::Table.formats
410
+ # >> Ruport::Controller::Table.formats
314
411
  # => {:html=>Ruport::Formatter::HTML,
315
412
  # ?> :csv=>Ruport::Formatter::CSV,
316
413
  # ?> :text=>Ruport::Formatter::Text,
@@ -319,20 +416,20 @@ class Ruport::Renderer
319
416
  @formats ||= {}
320
417
  end
321
418
 
322
- # Builds up a renderer object, looks up the appropriate formatter,
419
+ # Builds up a controller object, looks up the appropriate formatter,
323
420
  # sets the data and options, and then does the following process:
324
421
  #
325
- # * If the renderer contains a module Helpers, mix it in to the instance.
326
- # * If a block is given, yield the Renderer instance.
327
- # * If a setup() method is defined on the Renderer, call it.
422
+ # * If the controller contains a module Helpers, mix it in to the instance.
423
+ # * If a block is given, yield the Controller instance.
424
+ # * If a setup() method is defined on the Controller, call it.
328
425
  # * Call the run() method.
329
426
  # * If the :file option is set to a file name, appends output to the file.
330
427
  # * Return the results of formatter.output
331
428
  #
332
- # Please see the examples/ directory for custom renderer examples, because
429
+ # Please see the examples/ directory for custom controller examples, because
333
430
  # this is not nearly as complicated as it sounds in most cases.
334
- def render(*args)
335
- rend = build(*args) { |r|
431
+ def render(format, add_options=nil)
432
+ rend = build(format, add_options) { |r|
336
433
  yield(r) if block_given?
337
434
  r.setup if r.respond_to? :setup
338
435
  }
@@ -348,7 +445,7 @@ class Ruport::Renderer
348
445
  # options { |o| o.style = :justified }
349
446
  #
350
447
  def options
351
- @options ||= Ruport::Renderer::Options.new
448
+ @options ||= Ruport::Controller::Options.new
352
449
  yield(@options) if block_given?
353
450
 
354
451
  return @options
@@ -356,37 +453,37 @@ class Ruport::Renderer
356
453
 
357
454
  private
358
455
 
359
- # Creates a new instance of the renderer and sets it to use the specified
360
- # formatter (by name). If a block is given, the renderer instance is
456
+ # Creates a new instance of the controller and sets it to use the specified
457
+ # formatter (by name). If a block is given, the controller instance is
361
458
  # yielded.
362
459
  #
363
- # Returns the renderer instance.
460
+ # Returns the controller instance.
364
461
  #
365
- def build(*args)
462
+ def build(format, add_options=nil)
366
463
  rend = self.new
367
464
 
368
- rend.send(:use_formatter,args[0])
465
+ rend.send(:use_formatter, format)
369
466
  rend.send(:options=, options.dup)
370
467
  if rend.class.const_defined? :Helpers
371
468
  rend.formatter.extend(rend.class.const_get(:Helpers))
372
469
  end
373
- if args[1].kind_of?(Hash)
374
- d = args[1].delete(:data)
470
+ if add_options.kind_of?(Hash)
471
+ d = add_options.delete(:data)
375
472
  rend.data = d if d
376
- args[1].each {|k,v| rend.options.send("#{k}=",v) }
473
+ add_options.each {|k,v| rend.options.send("#{k}=",v) }
377
474
  end
378
475
 
379
476
  yield(rend) if block_given?
380
477
  return rend
381
478
  end
382
479
 
383
- # Allows you to register a format with the renderer.
480
+ # Allows you to register a format with the controller.
384
481
  #
385
482
  # Example:
386
483
  #
387
484
  # class MyFormatter < Ruport::Formatter
388
485
  # # formatter code ...
389
- # SomeRenderer.add_format self, :my_formatter
486
+ # SomeController.add_format self, :my_formatter
390
487
  # end
391
488
  #
392
489
  def add_format(format,name=nil)
@@ -408,23 +505,23 @@ class Ruport::Renderer
408
505
 
409
506
  # Sets +data+ attribute on the active formatter.
410
507
  def data=(val)
411
- formatter.data = val.dup
508
+ formatter.data = val
412
509
  end
413
510
 
414
- # Renderer::Options object which is shared with the current formatter.
511
+ # Controller::Options object which is shared with the current formatter.
415
512
  def options
416
513
  yield(formatter.options) if block_given?
417
514
  formatter.options
418
515
  end
419
516
 
420
517
  # Call the _run_ method. You can override this method in your custom
421
- # renderer if you need to define other actions.
518
+ # controller if you need to define other actions.
422
519
  def run
423
520
  _run_
424
521
  end
425
522
 
426
523
  # If an IO object is given, Formatter#output will use it instead of
427
- # the default String. For Ruport's core renderers, we technically
524
+ # the default String. For Ruport's core controllers, we technically
428
525
  # can use any object that supports the << method, but it's meant
429
526
  # for IO objects such as File or STDOUT
430
527
  #
@@ -456,7 +553,6 @@ class Ruport::Renderer
456
553
  # Called automatically when the report is rendered. Uses the
457
554
  # data collected from the earlier methods.
458
555
  def _run_
459
- # ensure all the required options have been set
460
556
  unless self.class.required_options.nil?
461
557
  self.class.required_options.each do |opt|
462
558
  if options.__send__(opt).nil?
@@ -479,10 +575,10 @@ class Ruport::Renderer
479
575
  end
480
576
 
481
577
  finalize self.class.final_stage if self.class.final_stage
578
+ maybe :finalize
482
579
  end
483
580
 
484
581
  def execute_stages
485
- # call each stage to build the report
486
582
  unless self.class.stages.nil?
487
583
  self.class.stages.each do |stage|
488
584
  maybe("build_#{stage}")
@@ -516,5 +612,5 @@ class Ruport::Renderer
516
612
 
517
613
  end
518
614
 
519
- require "ruport/renderer/table"
520
- require "ruport/renderer/grouping"
615
+ require "ruport/controller/table"
616
+ require "ruport/controller/grouping"