ruport 0.7.0 → 0.7.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/README +17 -20
- data/Rakefile +1 -1
- data/examples/invoice.rb +132 -0
- data/examples/invoice_report.rb +29 -0
- data/examples/line_plotter.rb +63 -0
- data/lib/ruport.rb +1 -1
- data/lib/ruport/format/csv.rb +1 -1
- data/test/unit.log +18 -0
- metadata +22 -21
- data/examples/line_graph_report.rb.rej +0 -15
- data/examples/line_graph_report.rb~ +0 -23
data/README
CHANGED
@@ -52,7 +52,7 @@
|
|
52
52
|
#
|
53
53
|
# To install ruport via rubygems with all it's dependencies (except DBI):
|
54
54
|
#
|
55
|
-
# sudo gem install ruport
|
55
|
+
# sudo gem install ruport -y
|
56
56
|
#
|
57
57
|
# To install ruport manually via setup.rb:
|
58
58
|
#
|
@@ -75,29 +75,32 @@
|
|
75
75
|
#
|
76
76
|
# == Data Collection and Manipulation
|
77
77
|
#
|
78
|
-
# To begin, your data must be read from its source and stored in
|
79
|
-
# standard data structures. Ruport::Data::
|
80
|
-
#
|
78
|
+
# To begin, your data must be read from its source and stored in Ruport's
|
79
|
+
# standard data structures. Ruport::Data::Table and Ruport::Data::Record
|
80
|
+
# have further information on how to work with with
|
81
81
|
# and store data in ruport.
|
82
82
|
#
|
83
83
|
# If you wish to retrieve your data using Ruby on Rails and ActiveRecord,
|
84
|
-
#
|
85
|
-
# from a database, Ruport::Query will be useful, and to build it manually
|
86
|
-
# Array has been extended with a convenience function or two.
|
84
|
+
# please see the acts_as_reportable plugin.
|
87
85
|
#
|
88
86
|
# == Report Generation
|
89
87
|
#
|
90
88
|
# Once the data is ready, it can be rendered using a combination of
|
91
|
-
# Ruport::
|
92
|
-
# The
|
89
|
+
# Ruport::Renderer and Ruport::Format::Plugin.
|
90
|
+
# The renderer defines the report type (tablular, graph, etc), and
|
93
91
|
# the plugin renders the engine into a final format (PDF, CSV, HTML, SVG).
|
94
|
-
#
|
92
|
+
# Renderers will often interact with more than one plugin, to allow the same
|
95
93
|
# report to be rendered in multiple ways ie. as HTML and a PDF.
|
96
94
|
#
|
97
95
|
# To tie these together, a basic DSL is provided by Ruport::Report
|
98
96
|
#
|
99
97
|
# For further reading and specific examples, please explore the examples/
|
100
|
-
# directory in the source tree
|
98
|
+
# directory in the source tree.
|
99
|
+
#
|
100
|
+
# = Bug Reports / Feature Requests
|
101
|
+
#
|
102
|
+
# Our Trac is at: http://stonecode.svnrepository.com
|
103
|
+
# You may use the username ruport and password blinky to file tickets
|
101
104
|
#
|
102
105
|
# = Resources
|
103
106
|
#
|
@@ -106,14 +109,14 @@
|
|
106
109
|
# up to date information.
|
107
110
|
#
|
108
111
|
# - You can sign up and/or view the archives here:
|
109
|
-
# http://
|
112
|
+
# http://stonecode.svnrepository.com/ruport/trac.cgi/browser/trunk/test/test_table.rb
|
110
113
|
#
|
111
114
|
# Please do not hesitate to use this list! I am happily accepting patches and
|
112
115
|
# documentation, as well as encouraging design discussions and also am quite
|
113
116
|
# curious about what people use or want to use ruport for.
|
114
117
|
#
|
115
118
|
# I will announce Ruport releases on RubyTalk, on the Ruport mailing list, on
|
116
|
-
# Freshmeat,
|
119
|
+
# Freshmeat, and RAAt. If you would like to
|
117
120
|
# keep an eye out for releases, please monitor one of those places.
|
118
121
|
#
|
119
122
|
# - You may download Ruport's source from the project page:
|
@@ -122,7 +125,7 @@
|
|
122
125
|
# - The latest stable API documentation is available at:
|
123
126
|
# http://reporting.stonecode.org/docs
|
124
127
|
#
|
125
|
-
# There also will be some tutorials on
|
128
|
+
# There also will be some tutorials on rubyreports.org
|
126
129
|
#
|
127
130
|
# If you are interested in developing Ruport, please *never* study code in
|
128
131
|
# official releases. As this software is in it's early stages, it's essential
|
@@ -138,12 +141,6 @@
|
|
138
141
|
#
|
139
142
|
# svn co svn://rubyforge.org//var/svn/ruport/branches/stable
|
140
143
|
#
|
141
|
-
# Those who would like to become regular contributors will be given write
|
142
|
-
# access. Also, anyone interested in the internal design and project
|
143
|
-
# management aspects of Ruport can request to be added to our Trac
|
144
|
-
# account. This is primarily intended for people who are working on the
|
145
|
-
#
|
146
|
-
#
|
147
144
|
# Thanks for checking out Ruport!
|
148
145
|
#
|
149
146
|
# If you have any questions or concerns, hop on the mailing list and fire away!
|
data/Rakefile
CHANGED
@@ -23,7 +23,7 @@ end
|
|
23
23
|
|
24
24
|
spec = Gem::Specification.new do |spec|
|
25
25
|
spec.name = LEAN ? "lean-ruport" : "ruport"
|
26
|
-
spec.version = "0.7.
|
26
|
+
spec.version = "0.7.1"
|
27
27
|
spec.platform = Gem::Platform::RUBY
|
28
28
|
spec.summary = "A generalized Ruby report generation and templating engine."
|
29
29
|
spec.files = Dir.glob("{examples,lib,test,bin}/**/**/*") +
|
data/examples/invoice.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
module Ruport
|
2
|
+
module Extensions
|
3
|
+
class Invoice < Ruport::Renderer
|
4
|
+
|
5
|
+
include Renderer::Helpers
|
6
|
+
|
7
|
+
def init_options
|
8
|
+
options do |o|
|
9
|
+
o.customer_info ||= ""
|
10
|
+
o.company_info ||= ""
|
11
|
+
o.comments ||= ""
|
12
|
+
o.order_info ||= ""
|
13
|
+
o.title ||= ""
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
init_options
|
19
|
+
build [:headers,:body,:footer], :invoice
|
20
|
+
finalize :invoice
|
21
|
+
end
|
22
|
+
|
23
|
+
module InvoiceHelpers
|
24
|
+
def build_company_header
|
25
|
+
@tod = pdf_writer.y
|
26
|
+
text_box(options.company_info)
|
27
|
+
end
|
28
|
+
|
29
|
+
def build_customer_header
|
30
|
+
pdf_writer.y -= 10
|
31
|
+
text_box(options.customer_info)
|
32
|
+
end
|
33
|
+
|
34
|
+
def build_title
|
35
|
+
pdf_writer.y = @tod
|
36
|
+
if options.title
|
37
|
+
pdf_writer.text options.title, :left => 350,
|
38
|
+
:font_size => layout.title_font_size || 14
|
39
|
+
pdf_writer.y -= 10
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_order_header
|
44
|
+
if options.order_info
|
45
|
+
text_box(options.order_info,
|
46
|
+
:position => layout.order_info_position || 350)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def text_box(content,opts={})
|
51
|
+
::PDF::SimpleTable.new do |table|
|
52
|
+
table.data = content.to_a.inject([]) do |s,line|
|
53
|
+
s << { "value" => line, }
|
54
|
+
end
|
55
|
+
|
56
|
+
table.column_order = "value"
|
57
|
+
table.show_headings = false
|
58
|
+
table.show_lines = :outer
|
59
|
+
table.shade_rows = :none
|
60
|
+
table.width = opts[:width] || 200
|
61
|
+
table.orientation = opts[:orientation] || :right
|
62
|
+
table.position = opts[:position] || :left
|
63
|
+
table.font_size = opts[:font_size] || 10
|
64
|
+
table.render_on(pdf_writer)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class PDF < Ruport::Format::PDF
|
70
|
+
|
71
|
+
include InvoiceHelpers
|
72
|
+
Invoice.add_format self, :pdf
|
73
|
+
|
74
|
+
def build_invoice_headers
|
75
|
+
build_company_header
|
76
|
+
build_customer_header
|
77
|
+
build_title
|
78
|
+
build_order_header
|
79
|
+
end
|
80
|
+
|
81
|
+
def build_invoice_body
|
82
|
+
|
83
|
+
pdf_writer.start_page_numbering(500,20,8,:right)
|
84
|
+
pdf_writer.y = 620
|
85
|
+
|
86
|
+
Ruport::Renderer::Table.render_pdf { |r|
|
87
|
+
r.data = data
|
88
|
+
r.plugin.pdf_writer = pdf_writer
|
89
|
+
r.layout.table_width = layout.body_width || 450
|
90
|
+
}
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
def build_invoice_footer
|
95
|
+
# footer
|
96
|
+
pdf_writer.open_object do |footer|
|
97
|
+
pdf_writer.save_state
|
98
|
+
pdf_writer.stroke_color! Color::RGB::Black
|
99
|
+
pdf_writer.stroke_style! ::PDF::Writer::StrokeStyle::DEFAULT
|
100
|
+
if options.comments
|
101
|
+
pdf_writer.y -= 20
|
102
|
+
text_box options.comments,
|
103
|
+
:position => layout.comments_position || 110,
|
104
|
+
:width => layout.comments_width || 400,
|
105
|
+
:font_size => layout.comments_font_size || 14,
|
106
|
+
:orientation => layout.comments_orientation
|
107
|
+
end
|
108
|
+
pdf_writer.add_text_wrap( 50, 20, 200, "Generated at " +
|
109
|
+
Time.now.strftime(options.date_format || "%H:%M %Y-%m-%d"), 8)
|
110
|
+
|
111
|
+
pdf_writer.restore_state
|
112
|
+
pdf_writer.close_object
|
113
|
+
pdf_writer.add_object(footer, :all_pages)
|
114
|
+
end
|
115
|
+
pdf_writer.stop_page_numbering(true, :current)
|
116
|
+
end
|
117
|
+
|
118
|
+
def finalize_invoice
|
119
|
+
output << pdf_writer.render
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
module Ruport::Report::Invoice
|
128
|
+
def render_invoice(&block)
|
129
|
+
Ruport::Extensions::Invoice.render_pdf(&block)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "ruport"
|
3
|
+
require "invoice"
|
4
|
+
|
5
|
+
class SampleReport < Ruport::Report
|
6
|
+
include Invoice
|
7
|
+
|
8
|
+
def generate
|
9
|
+
render_invoice do |i|
|
10
|
+
i.data = [[1,2,3],[4,5,6]].to_table(%w[a b c])
|
11
|
+
|
12
|
+
i.options do |o|
|
13
|
+
o.company_info = "Stone Code Productions\n43 Neagle Street"
|
14
|
+
o.customer_info = "Gregory Brown\n200 Foo Ave."
|
15
|
+
o.comments = "J. Random Comment"
|
16
|
+
o.order_info = "Some info\nabout your order"
|
17
|
+
o.title = "Hey There"
|
18
|
+
end
|
19
|
+
|
20
|
+
i.layout do |lay|
|
21
|
+
lay.body_width = 480
|
22
|
+
lay.comments_font_size = 12
|
23
|
+
lay.title_font_size = 10
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
SampleReport.run { |r| r.write "out.pdf" }
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "ruport"
|
2
|
+
|
3
|
+
class LinePlotter < Ruport::Renderer
|
4
|
+
|
5
|
+
layout do |l|
|
6
|
+
l.line_color = "green"
|
7
|
+
l.line_width = 2
|
8
|
+
l.width = "100%"
|
9
|
+
l.height = "100%"
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
plugin do |p|
|
14
|
+
p.data = get_lines
|
15
|
+
p.render_plot
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Line = Struct.new(:x1,:y1,:x2,:y2)
|
20
|
+
|
21
|
+
def get_lines
|
22
|
+
data.map { |r| Line.new( r[0][0],r[0][1],r[1][0],r[1][1] ) }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class SVG < Ruport::Format::Plugin
|
28
|
+
|
29
|
+
def initialize
|
30
|
+
require "builder"
|
31
|
+
@builder = Builder::XmlMarkup.new(:indent => 2)
|
32
|
+
end
|
33
|
+
|
34
|
+
def render_plot
|
35
|
+
|
36
|
+
opts = { :width => layout.width, :height => layout.height,
|
37
|
+
:xmlns => "http://www.w3.org/2000/svg" }
|
38
|
+
|
39
|
+
output << @builder.svg(opts) do |builder|
|
40
|
+
builder.g( :stroke => layout.line_color,
|
41
|
+
"stroke-width" => layout.line_width ) do |g|
|
42
|
+
data.each { |r| render_line(r,g) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
def render_line(line,xml_obj)
|
49
|
+
opts = { :x1 => line.x1, :x2 => line.x2,
|
50
|
+
:y1 => line.y1, :y2 => line.y2 }
|
51
|
+
xml_obj.line(opts)
|
52
|
+
end
|
53
|
+
|
54
|
+
LinePlotter.add_format self, :svg
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
puts LinePlotter.render_svg { |r|
|
59
|
+
r.data = [ [ [0,0], [0,100] ],
|
60
|
+
[ [0,100], [100,100] ],
|
61
|
+
[ [100,100], [100,0] ],
|
62
|
+
[ [100,0], [0,0] ] ]
|
63
|
+
}
|
data/lib/ruport.rb
CHANGED
data/lib/ruport/format/csv.rb
CHANGED
data/test/unit.log
CHANGED
@@ -257,3 +257,21 @@ F, [2006-12-25T12:16:59.960464 #2969] FATAL -- : no block given!
|
|
257
257
|
W, [2006-12-25T12:17:00.167594 #2969] WARN -- : Error on attempt # 1: ; retrying
|
258
258
|
W, [2006-12-25T12:17:01.164421 #2969] WARN -- : Error on attempt # 2: ; retrying
|
259
259
|
W, [2006-12-25T12:17:02.572305 #2969] WARN -- : Error on attempt # 1: ; retrying
|
260
|
+
F, [2006-12-25T13:08:12.541594 #3379] FATAL -- : Missing host for mailer bar
|
261
|
+
F, [2006-12-25T13:08:12.542918 #3379] FATAL -- : Missing DSN for source foo!
|
262
|
+
F, [2006-12-25T13:08:12.946874 #3379] FATAL -- : no block given!
|
263
|
+
W, [2006-12-25T13:08:13.152682 #3379] WARN -- : Error on attempt # 1: ; retrying
|
264
|
+
W, [2006-12-25T13:08:14.152472 #3379] WARN -- : Error on attempt # 2: ; retrying
|
265
|
+
W, [2006-12-25T13:08:16.157324 #3379] WARN -- : Error on attempt # 1: execution expired; retrying
|
266
|
+
F, [2007-01-18T01:47:24.338302 #2551] FATAL -- : Missing host for mailer bar
|
267
|
+
F, [2007-01-18T01:47:24.361525 #2551] FATAL -- : Missing DSN for source foo!
|
268
|
+
F, [2007-01-18T01:47:25.244275 #2551] FATAL -- : no block given!
|
269
|
+
W, [2007-01-18T01:47:25.851688 #2551] WARN -- : Error on attempt # 1: ; retrying
|
270
|
+
W, [2007-01-18T01:47:26.849615 #2551] WARN -- : Error on attempt # 2: ; retrying
|
271
|
+
W, [2007-01-18T01:47:28.854434 #2551] WARN -- : Error on attempt # 1: execution expired; retrying
|
272
|
+
F, [2007-01-18T12:45:33.550978 #3525] FATAL -- : Missing host for mailer bar
|
273
|
+
F, [2007-01-18T12:45:33.552282 #3525] FATAL -- : Missing DSN for source foo!
|
274
|
+
F, [2007-01-18T12:45:33.921435 #3525] FATAL -- : no block given!
|
275
|
+
W, [2007-01-18T12:45:34.086657 #3525] WARN -- : Error on attempt # 1: ; retrying
|
276
|
+
W, [2007-01-18T12:45:35.085521 #3525] WARN -- : Error on attempt # 2: ; retrying
|
277
|
+
W, [2007-01-18T12:45:37.090298 #3525] WARN -- : Error on attempt # 1: execution expired; retrying
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruport
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.
|
7
|
-
date:
|
6
|
+
version: 0.7.1
|
7
|
+
date: 2007-01-18 00:00:00 -05:00
|
8
8
|
summary: A generalized Ruby report generation and templating engine.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -30,46 +30,47 @@ authors:
|
|
30
30
|
- Gregory Brown
|
31
31
|
files:
|
32
32
|
- examples/pdf_complex_report.rb
|
33
|
-
- examples/
|
34
|
-
- examples/
|
33
|
+
- examples/line_plotter.rb
|
34
|
+
- examples/invoice.rb
|
35
|
+
- examples/invoice_report.rb
|
35
36
|
- lib/ruport
|
36
|
-
- lib/uport.rb
|
37
37
|
- lib/ruport.rb
|
38
|
+
- lib/uport.rb
|
38
39
|
- lib/ruport.rb~
|
39
40
|
- lib/ruport/query
|
40
41
|
- lib/ruport/format
|
41
42
|
- lib/ruport/data
|
42
43
|
- lib/ruport/report
|
44
|
+
- lib/ruport/renderer
|
45
|
+
- lib/ruport/data.rb
|
43
46
|
- lib/ruport/system_extensions.rb
|
44
47
|
- lib/ruport/config.rb
|
45
48
|
- lib/ruport/query.rb
|
46
49
|
- lib/ruport/layout.rb
|
47
|
-
- lib/ruport/
|
48
|
-
- lib/ruport/data.rb
|
50
|
+
- lib/ruport/layout
|
49
51
|
- lib/ruport/mailer.rb
|
50
52
|
- lib/ruport/report.rb
|
51
53
|
- lib/ruport/attempt.rb
|
52
54
|
- lib/ruport/data.rb~
|
53
55
|
- lib/ruport/data.rb.rej
|
54
56
|
- lib/ruport/generator.rb
|
55
|
-
- lib/ruport/layout
|
56
57
|
- lib/ruport/format.rb
|
57
58
|
- lib/ruport/renderer.rb
|
58
59
|
- lib/ruport/query/sql_split.rb
|
59
|
-
- lib/ruport/format/latex.rb
|
60
60
|
- lib/ruport/format/plugin.rb
|
61
|
+
- lib/ruport/format/latex.rb
|
61
62
|
- lib/ruport/format/svg.rb
|
62
63
|
- lib/ruport/format/xml.rb
|
63
64
|
- lib/ruport/format/html.rb
|
64
65
|
- lib/ruport/format/text.rb
|
65
66
|
- lib/ruport/format/pdf.rb
|
66
67
|
- lib/ruport/format/csv.rb
|
68
|
+
- lib/ruport/data/collection.rb
|
67
69
|
- lib/ruport/data/record.rb
|
68
70
|
- lib/ruport/data/taggable.rb
|
69
71
|
- lib/ruport/data/table.rb
|
70
|
-
- lib/ruport/data/collection.rb
|
71
|
-
- lib/ruport/data/set.rb
|
72
72
|
- lib/ruport/data/groupable.rb
|
73
|
+
- lib/ruport/data/set.rb
|
73
74
|
- lib/ruport/data/table.rb~
|
74
75
|
- lib/ruport/data/table.rb.rej
|
75
76
|
- lib/ruport/data/record.rb~
|
@@ -78,32 +79,32 @@ files:
|
|
78
79
|
- lib/ruport/renderer/table.rb
|
79
80
|
- lib/ruport/layout/component.rb
|
80
81
|
- test/samples
|
82
|
+
- test/test_collection.rb
|
81
83
|
- test/test_record.rb
|
82
84
|
- test/test_table.rb
|
83
85
|
- test/test_renderer.rb
|
84
86
|
- test/test_ruport.rb
|
85
|
-
- test/
|
87
|
+
- test/test_query.rb
|
86
88
|
- test/test_set.rb
|
87
|
-
- test/test_groupable.rb
|
88
89
|
- test/test_graph_renderer.rb
|
90
|
+
- test/test_groupable.rb
|
91
|
+
- test/test_table_renderer.rb
|
89
92
|
- test/_test_database.rb
|
90
|
-
- test/test_query.rb
|
91
93
|
- test/test_config.rb
|
92
94
|
- test/test_text_table.rb
|
93
95
|
- test/test_taggable.rb
|
94
96
|
- test/test_mailer.rb
|
95
97
|
- test/test_sql_split.rb
|
96
98
|
- test/test_report.rb
|
97
|
-
- test/test_table_renderer.rb
|
98
99
|
- test/unit.log
|
99
100
|
- test/test_record.rb.rej
|
100
101
|
- test/test_table.rb~
|
101
102
|
- test/test_query.rb~
|
102
103
|
- test/test_query.rb.rej
|
103
|
-
- test/samples/test.yaml
|
104
104
|
- test/samples/query_test.sql
|
105
|
-
- test/samples/
|
105
|
+
- test/samples/test.yaml
|
106
106
|
- test/samples/erb_test.sql
|
107
|
+
- test/samples/data.csv
|
107
108
|
- test/samples/stonecodeblog.sql
|
108
109
|
- test/samples/ruport_test.sql
|
109
110
|
- test/samples/addressbook.csv
|
@@ -120,22 +121,22 @@ files:
|
|
120
121
|
- TODO
|
121
122
|
- AUTHORS
|
122
123
|
test_files:
|
124
|
+
- test/test_collection.rb
|
123
125
|
- test/test_record.rb
|
124
126
|
- test/test_table.rb
|
125
127
|
- test/test_renderer.rb
|
126
128
|
- test/test_ruport.rb
|
127
|
-
- test/
|
129
|
+
- test/test_query.rb
|
128
130
|
- test/test_set.rb
|
129
|
-
- test/test_groupable.rb
|
130
131
|
- test/test_graph_renderer.rb
|
131
|
-
- test/
|
132
|
+
- test/test_groupable.rb
|
133
|
+
- test/test_table_renderer.rb
|
132
134
|
- test/test_config.rb
|
133
135
|
- test/test_text_table.rb
|
134
136
|
- test/test_taggable.rb
|
135
137
|
- test/test_mailer.rb
|
136
138
|
- test/test_sql_split.rb
|
137
139
|
- test/test_report.rb
|
138
|
-
- test/test_table_renderer.rb
|
139
140
|
rdoc_options:
|
140
141
|
- --title
|
141
142
|
- Ruport Documentation
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require "ruport"
|
2
|
-
class GraphSample < Ruport::Report
|
3
|
-
|
4
|
-
include Graph
|
5
|
-
|
6
|
-
prepare do
|
7
|
-
@data = [[5,7,9,12,14,16,18]].to_table(%w[jan feb mar apr may jun jul])
|
8
|
-
end
|
9
|
-
|
10
|
-
generate do
|
11
|
-
render_graph do |g|
|
12
|
-
g.data = @data
|
13
|
-
g.width = 700
|
14
|
-
g.height = 500
|
15
|
-
g.title = "A Simple Line Graph"
|
16
|
-
g.style = :line
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
GraphSample.run { |r| puts r.results }
|
22
|
-
|
23
|
-
|