ruport 0.4.99 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +9 -14
- data/CHANGELOG +13 -1
- data/README +11 -60
- data/Rakefile +2 -1
- data/examples/fieldless_table.rb +3 -0
- data/examples/line_graph.rb +8 -22
- data/examples/line_plotter.rb +1 -0
- data/examples/new_plugin.rb +4 -1
- data/examples/text_processors.rb +0 -1
- data/lib/ruport.rb +1 -3
- data/lib/ruport/data/collection.rb +4 -2
- data/lib/ruport/data/set.rb +2 -2
- data/lib/ruport/data/table.rb +27 -17
- data/lib/ruport/format/engine.rb +4 -0
- data/lib/ruport/format/plugin.rb +48 -38
- data/lib/ruport/report.rb +2 -2
- data/test/test_collection.rb +39 -0
- data/test/test_graph.rb +77 -85
- data/test/test_plugin.rb +26 -1
- data/test/test_plugin.rb.rej +50 -0
- data/test/test_report.rb +16 -1
- data/test/test_table.rb +6 -0
- data/test/unit.log +128 -0
- metadata +24 -24
- data/examples/simple_graph.rb +0 -8
- data/lib/SVG/Graph/Bar.rb +0 -137
- data/lib/SVG/Graph/BarBase.rb +0 -140
- data/lib/SVG/Graph/BarHorizontal.rb +0 -136
- data/lib/SVG/Graph/Graph.rb +0 -977
- data/lib/SVG/Graph/Line.rb +0 -444
- data/lib/SVG/Graph/Pie.rb +0 -394
- data/lib/SVG/Graph/Plot.rb +0 -494
- data/lib/SVG/Graph/Schedule.rb +0 -373
- data/lib/SVG/Graph/TimeSeries.rb +0 -241
data/AUTHORS
CHANGED
@@ -2,9 +2,17 @@
|
|
2
2
|
|
3
3
|
- {Gregory Brown}[mailto:gregory.t.brown@gmail.com]
|
4
4
|
- {Dudley Flanders}[mailto:dudley@misnomer.us]
|
5
|
+
- {James Healy}[mailto:jimmy@deefa.com]
|
6
|
+
- Dinko Mehinovic
|
5
7
|
|
6
8
|
= Contributors / People we've (legally) stolen from:
|
7
9
|
|
10
|
+
Iain Broadfoot:
|
11
|
+
- RuportDay 2006 Participant
|
12
|
+
|
13
|
+
Eric Pugh:
|
14
|
+
- RuportDay 2006 Participant
|
15
|
+
|
8
16
|
James Edward Gray II:
|
9
17
|
- Original inspiration via query.rb
|
10
18
|
- system_extensions.rb
|
@@ -13,17 +21,4 @@ Francis Hwang:
|
|
13
21
|
- SQLSplit
|
14
22
|
|
15
23
|
Simon Claret:
|
16
|
-
- PDF table support
|
17
|
-
|
18
|
-
Dinko Mehinovic:
|
19
|
-
- util/release/raa.rb
|
20
|
-
- util/release/freshmeat.rb
|
21
|
-
|
22
|
-
James Healy:
|
23
|
-
- original inspiration for Invoice engine
|
24
|
-
- SVG::Graph integration
|
25
|
-
|
26
|
-
The SVG Graph support is made possible by SVG::Graph, which we have vendored
|
27
|
-
because a gem is not available.
|
28
|
-
See: http://www.germane-software.com/software/SVG/SVG::Graph/
|
29
|
-
|
24
|
+
- Initial PDF table support (now deprecated)
|
data/CHANGELOG
CHANGED
@@ -1,4 +1,16 @@
|
|
1
|
-
|
1
|
+
Tnghe current version of Ruby Reports is 0.5.0
|
2
|
+
|
3
|
+
changes since 0.4.99
|
4
|
+
|
5
|
+
- SVG::Graph has been dropped in favor of Scruffy for graphing support.
|
6
|
+
|
7
|
+
- You can now define helpers for specific engines.
|
8
|
+
|
9
|
+
- All known obsolete documentation has been removed
|
10
|
+
|
11
|
+
- Collection#as now takes a block (Making it work like DataSet#as used to)
|
12
|
+
|
13
|
+
- Some cleanup and fixes to examples/
|
2
14
|
|
3
15
|
changes since 0.4.23
|
4
16
|
|
data/README
CHANGED
@@ -42,6 +42,10 @@
|
|
42
42
|
# (available via rubygems)
|
43
43
|
#
|
44
44
|
# MailFactory: For email support.
|
45
|
+
# (available via rubygems)
|
46
|
+
#
|
47
|
+
# Scruffy: For Graph Support
|
48
|
+
# (available via rubygems)
|
45
49
|
#
|
46
50
|
# Note that by installing any of the dependencies, either via gems or manually,
|
47
51
|
# their functionality will automatically be enabled.
|
@@ -95,28 +99,6 @@
|
|
95
99
|
# For further reading and specific examples, please explore the examples/
|
96
100
|
# directory in the source tree and read the Ruport Cookbook.
|
97
101
|
#
|
98
|
-
# = Caveats
|
99
|
-
#
|
100
|
-
# Ruport is experimental software. It's not completely tested and the API is
|
101
|
-
# changing rapidly from version to version. Test suites are becoming
|
102
|
-
# increasingly robust, but have not identified all possible edge cases. If
|
103
|
-
# Ruport goes wild on you, it's because it hasn't been tamed yet.
|
104
|
-
#
|
105
|
-
# The functionality is also not complete yet. There is a lot left to be added
|
106
|
-
# and there is a lot to think about. If you find yourself wondering why
|
107
|
-
# feature foo is in Ruport, chances are it just hasn't been written yet.
|
108
|
-
#
|
109
|
-
# Documentation so far is something that is a struggle to keep up with. As of
|
110
|
-
# this release, there is at least partial documentation for the API. This
|
111
|
-
# will continue to get better as time goes on.
|
112
|
-
#
|
113
|
-
# Platform independence is a priority, but I don't absolutely always have
|
114
|
-
# access to every OS / DBMS combination, so if something breaks on your
|
115
|
-
# system, please feel free to yell loud at the mailing list.
|
116
|
-
#
|
117
|
-
# That having been said, I do use ruport in my daily work. That means that it
|
118
|
-
# will probably have at least something you will find useful. Or so I hope.
|
119
|
-
#
|
120
102
|
# = Resources
|
121
103
|
#
|
122
104
|
# The best way to get help and make suggestions is the Ruport mailing list.
|
@@ -140,7 +122,7 @@
|
|
140
122
|
# - The latest stable API documentation is available at:
|
141
123
|
# http://reporting.stonecode.org/docs
|
142
124
|
#
|
143
|
-
# There also will be some tutorials on
|
125
|
+
# There also will be some tutorials on reporting.stonecode.org
|
144
126
|
#
|
145
127
|
# If you are interested in developing Ruport, please *never* study code in
|
146
128
|
# official releases. As this software is in it's early stages, it's essential
|
@@ -152,47 +134,16 @@
|
|
152
134
|
#
|
153
135
|
# svn co svn://rubyforge.org//var/svn/ruport/trunk/
|
154
136
|
#
|
137
|
+
# - Or if you are interested in the latest updates to the stable branch
|
138
|
+
#
|
139
|
+
# svn co svn://rubyforge.org//var/svn/ruport/branches/stable
|
140
|
+
#
|
155
141
|
# Those who would like to become regular contributors will be given write
|
156
142
|
# access. Also, anyone interested in the internal design and project
|
157
143
|
# management aspects of Ruport can request to be added to our Trac
|
158
144
|
# account. This is primarily intended for people who are working on the
|
159
|
-
# project actively, though.
|
160
|
-
#
|
161
|
-
# = Background / Summary
|
162
|
-
#
|
163
|
-
# Ruport aims to help you fetch data from various sources, perform
|
164
|
-
# manipulations on them as needed, and then output them in a variety
|
165
|
-
# of formats easily. The powerful ERb templating engine is integrated
|
166
|
-
# to let you embed Ruport code into your formatted data. Also, Ruport
|
167
|
-
# provides a high level interface to databases, to make getting
|
168
|
-
# your data easy.
|
169
|
-
#
|
170
|
-
# The core of Ruport is it's datastructures. Data::Record, Data::Table, and
|
171
|
-
# Data::Set provide tools that help with manipulation and preperation of data
|
172
|
-
# for reporting.
|
173
|
-
#
|
174
|
-
# The rest of the code is organized into three main models, Report, Query,
|
175
|
-
# and Format. Each is meant to be a high level interface to Ruport.
|
176
|
-
# The inner classes can be used where a decent level of customization
|
177
|
-
# is needed.
|
178
|
-
#
|
179
|
-
# Report is in some sense the 'controller' of your application, and provides
|
180
|
-
# methods to help you write a Reporting application
|
181
|
-
#
|
182
|
-
# Format provides support for building filters and specialized formatting
|
183
|
-
# systems.
|
184
|
-
#
|
185
|
-
# Query currently provides a high level interface to DBI.
|
186
|
-
# If you would like to query a database or load a sql dump,
|
187
|
-
# this class can help you do that. It can generate Data::Table objects on
|
188
|
-
# the fly, or feed you DBI:Rows, depending on what you need.
|
189
145
|
#
|
190
|
-
# Finally, Please consult the API documentation and/or source code for more
|
191
|
-
# information. (http://reporting.stonecode.org/docs). Not all classes have been
|
192
|
-
# documented but the ones that have may be easier to understand when their docs
|
193
|
-
# have been read. Also, feel free to contribute documentation.
|
194
146
|
#
|
195
|
-
#
|
147
|
+
# Thanks for checking out Ruport!
|
196
148
|
#
|
197
|
-
#
|
198
|
-
# -Greg
|
149
|
+
# 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.
|
26
|
+
spec.version = "0.5.0"
|
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}/**/**/*") +
|
@@ -43,6 +43,7 @@ spec = Gem::Specification.new do |spec|
|
|
43
43
|
spec.add_dependency('RedCloth', '>= 3.0.0')
|
44
44
|
spec.add_dependency('pdf-writer', '>= 1.1.3')
|
45
45
|
spec.add_dependency("mailfactory", ">= 1.2.2")
|
46
|
+
spec.add_dependency("scruffy", ">= 0.2.2")
|
46
47
|
end
|
47
48
|
spec.author = "Gregory Brown"
|
48
49
|
spec.email = " gregory.t.brown@gmail.com"
|
data/examples/fieldless_table.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "ruport"
|
2
2
|
include Ruport
|
3
3
|
|
4
|
+
# this shows how you can create your own plugin with some default rendering
|
5
|
+
# options as a shortcut.
|
4
6
|
|
5
7
|
class Format::Plugin::FieldlessCSVPlugin < Format::Plugin::CSVPlugin
|
6
8
|
rendering_options :show_field_names => false
|
@@ -8,3 +10,4 @@ class Format::Plugin::FieldlessCSVPlugin < Format::Plugin::CSVPlugin
|
|
8
10
|
register_on :table_engine
|
9
11
|
end
|
10
12
|
|
13
|
+
puts [[1,2,3]].to_table(%w[a b c]).to_fieldless_csv
|
data/examples/line_graph.rb
CHANGED
@@ -4,32 +4,18 @@ require "ruport"
|
|
4
4
|
# Start with a Ruport::Table object. This could easily come from
|
5
5
|
# activerecord or any of the other ways to build a Table. See the ruport
|
6
6
|
# recipes book for some ideas
|
7
|
-
data = [[
|
7
|
+
data = [[5, 7, 9, 12, 14, 16, 18]].to_table(%w[jan feb mar apr may jun jul])
|
8
8
|
|
9
9
|
# initialize the graph with our table object
|
10
10
|
graph = Ruport::Format.graph_object :plugin => :svg, :data => data
|
11
11
|
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
:graph_title => "Global Average Temperature vs. Number of Pirates",
|
20
|
-
:show_graph_title => true,
|
21
|
-
:x_title => "Number of Pirates (approx.)",
|
22
|
-
:show_x_title => true,
|
23
|
-
:y_title => "Global Average Temperature (C)",
|
24
|
-
:show_y_title => true,
|
25
|
-
:key => false,
|
26
|
-
:min_scale_value => 13,
|
27
|
-
:scale_integers => true,
|
28
|
-
:no_css => true
|
29
|
-
}
|
30
|
-
|
31
|
-
# apply the options to the graph
|
32
|
-
graph.options = options
|
12
|
+
# there are currently only a handful of options for customising the
|
13
|
+
# appearance of the graph. The ones listed here are all of them at
|
14
|
+
# the current time.
|
15
|
+
graph.width = 700
|
16
|
+
graph.height = 500
|
17
|
+
graph.title = "A Simple Line Graph"
|
18
|
+
graph.style = :line # other options: bar, smiles, area, stacked
|
33
19
|
|
34
20
|
# render the graph and print it to stdout. To save the output to a file, try:
|
35
21
|
# ruby line_graph.rb > pirates.svg
|
data/examples/line_plotter.rb
CHANGED
data/examples/new_plugin.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "ruport"
|
3
3
|
|
4
|
+
# this shows how you can alter an existing plugin's rendering.
|
5
|
+
|
4
6
|
include Ruport
|
5
7
|
|
6
|
-
class
|
8
|
+
class Text < Ruport::Format::Plugin
|
7
9
|
renderer :table do
|
8
10
|
data.inject(rendered_field_names) { |s,r|
|
9
11
|
s << r.to_a.join("()") << "\n"
|
@@ -14,6 +16,7 @@ class Format::Plugin::Text < Ruport::Format::Plugin
|
|
14
16
|
data.column_names.join("---") << "\n"
|
15
17
|
end
|
16
18
|
|
19
|
+
plugin_name :text
|
17
20
|
register_on :table_engine
|
18
21
|
end
|
19
22
|
|
data/examples/text_processors.rb
CHANGED
data/lib/ruport.rb
CHANGED
@@ -22,7 +22,9 @@ module Ruport::Data
|
|
22
22
|
#
|
23
23
|
# my_collection.as(:csv) #=> "1,2,3\n4,5,6"
|
24
24
|
def as(type)
|
25
|
-
Ruport::Format.
|
25
|
+
eng = Ruport::Format.table_object :data => self, :plugin => type
|
26
|
+
yield(eng) if block_given?
|
27
|
+
eng.render
|
26
28
|
end
|
27
29
|
|
28
30
|
# Converts any Collection object to a Data::Set
|
@@ -43,7 +45,7 @@ module Ruport::Data
|
|
43
45
|
end
|
44
46
|
|
45
47
|
attr_reader :data
|
46
|
-
def_delegators :@data, :each, :length, :[], :empty?
|
48
|
+
def_delegators :@data, :each, :length, :size, :[], :empty?
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
data/lib/ruport/data/set.rb
CHANGED
@@ -12,8 +12,8 @@ module Ruport::Data
|
|
12
12
|
# of its source (a database, manual arrays, ActiveRecord, CSVs, etc.).
|
13
13
|
#
|
14
14
|
# Set is intended to be used as the data store for unstructured data -
|
15
|
-
# Ruport::Data::Table is an alternate
|
16
|
-
|
15
|
+
# Ruport::Data::Table is an alternate data store intended for structured,
|
16
|
+
# tabular data.
|
17
17
|
#
|
18
18
|
# Once your data is in a Ruport::Data::Set object, it can be manipulated
|
19
19
|
# to suit your needs, then used to build a report.
|
data/lib/ruport/data/table.rb
CHANGED
@@ -22,8 +22,8 @@ module Ruport::Data
|
|
22
22
|
# of its source (a database, manual arrays, ActiveRecord, CSVs, etc.).
|
23
23
|
#
|
24
24
|
# Table is intended to be used as the data store for structured, tabular
|
25
|
-
# data - Ruport::Data::Set is an alternate
|
26
|
-
|
25
|
+
# data - Ruport::Data::Set is an alternate data store intended for less
|
26
|
+
# structured data.
|
27
27
|
#
|
28
28
|
# Once your data is in a Ruport::Data::Table object, it can be manipulated
|
29
29
|
# to suit your needs, then used to build a report.
|
@@ -106,10 +106,12 @@ module Ruport::Data
|
|
106
106
|
# data.reorder!([1,0])
|
107
107
|
def reorder!(*indices)
|
108
108
|
indices = indices[0] if indices[0].kind_of? Array
|
109
|
-
@column_names
|
110
|
-
indices.
|
111
|
-
|
112
|
-
|
109
|
+
if @column_names
|
110
|
+
@column_names = if indices.all? { |i| i.kind_of? Integer }
|
111
|
+
indices.map { |i| @column_names[i] }
|
112
|
+
else
|
113
|
+
indices
|
114
|
+
end
|
113
115
|
end
|
114
116
|
@data.each { |r| r.reorder! *indices }; self
|
115
117
|
end
|
@@ -138,17 +140,25 @@ module Ruport::Data
|
|
138
140
|
end
|
139
141
|
end
|
140
142
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
143
|
+
# Removes a column from the table. Any values in the specified column are
|
144
|
+
# lost.
|
145
|
+
# data = Table.new({:data => [1,2], [3,4], :column_names => %w[a b]})
|
146
|
+
# data.append_column({:name => 'new_column', :fill => 1)
|
147
|
+
# data.remove_column({:name => 'new_column')
|
148
|
+
# data == Table.new({:data => [1,2], [3,4], :column_names => %w[a b]})
|
149
|
+
# #=> true
|
150
|
+
#
|
151
|
+
# data = [[1,2],[3,4]].to_table
|
152
|
+
# data.remove_column(1)
|
153
|
+
# data.eql? [[1],[3]].to_table %w[a] #=> true
|
154
|
+
def remove_column(options={})
|
155
|
+
if options.kind_of? Integer
|
156
|
+
reorder!((0...data[0].length).to_a - [options])
|
157
|
+
else
|
158
|
+
raise ArgumentError unless column_names.include? options[:name]
|
159
|
+
reorder! column_names - [options[:name]]
|
160
|
+
end
|
161
|
+
end
|
152
162
|
|
153
163
|
# Create a shallow copy of the table: the same data elements are referenced
|
154
164
|
# by both the old and new table.
|
data/lib/ruport/format/engine.rb
CHANGED
@@ -25,6 +25,7 @@ module Ruport
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def alias_engine(klass,name)
|
28
|
+
singleton_class.send(:define_method,:engine_name) { name }
|
28
29
|
Format::Engine.engine_classes ||= {}
|
29
30
|
Format::Engine.engine_classes[name] = klass
|
30
31
|
end
|
@@ -92,6 +93,7 @@ module Ruport
|
|
92
93
|
end
|
93
94
|
|
94
95
|
def method_missing(id,*args)
|
96
|
+
active_plugin.extend active_plugin.helpers[engine_name]
|
95
97
|
super unless active_plugin.respond_to?("#{id}_helper")
|
96
98
|
return active_plugin.send("#{id}_helper",self)
|
97
99
|
end
|
@@ -103,6 +105,8 @@ module Ruport
|
|
103
105
|
|
104
106
|
class Format::Engine::Graph < Ruport::Format::Engine
|
105
107
|
|
108
|
+
attributes [:width, :height, :style, :title]
|
109
|
+
|
106
110
|
renderer do
|
107
111
|
super
|
108
112
|
active_plugin.render_graph
|
data/lib/ruport/format/plugin.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
class InvalidGraphDataError < RuntimeError; end
|
2
|
+
class InvalidGraphOptionError < RuntimeError; end
|
3
|
+
|
1
4
|
require 'bigdecimal'
|
2
5
|
|
3
6
|
module Ruport
|
@@ -10,8 +13,21 @@ module Ruport
|
|
10
13
|
|
11
14
|
include MetaTools
|
12
15
|
|
13
|
-
def helper(name,&block)
|
14
|
-
|
16
|
+
def helper(name,options={},&block)
|
17
|
+
if options[:engines]
|
18
|
+
options[:engines].each { |e|
|
19
|
+
helpers[e].send(:define_method, "#{name}_helper", &block)
|
20
|
+
}
|
21
|
+
elsif options[:engine]
|
22
|
+
helpers[options[:engine]].send( :define_method,
|
23
|
+
"#{name}_helper", &block)
|
24
|
+
else
|
25
|
+
singleton_class.send( :define_method, "#{name}_helper", &block )
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def helpers
|
30
|
+
@helpers ||= Hash.new { |h,k| h[k] = Module.new }
|
15
31
|
end
|
16
32
|
|
17
33
|
private :singleton_class, :attribute, :attributes, :action
|
@@ -51,7 +67,7 @@ module Ruport
|
|
51
67
|
|
52
68
|
class CSVPlugin < Format::Plugin
|
53
69
|
|
54
|
-
helper(:init_plugin) { require "fastercsv" }
|
70
|
+
helper(:init_plugin) { |eng| require "fastercsv" }
|
55
71
|
|
56
72
|
format_field_names do
|
57
73
|
FasterCSV.generate { |csv| csv << data.column_names }
|
@@ -72,54 +88,48 @@ module Ruport
|
|
72
88
|
# check the supplied data can be used for graphing
|
73
89
|
data.each { |r|
|
74
90
|
if data.column_names.size != r.data.size
|
75
|
-
raise
|
91
|
+
raise InvalidGraphDataError, "Column names and data do not match"
|
76
92
|
end
|
77
93
|
r.data.each { |c|
|
78
94
|
begin
|
79
95
|
c = BigDecimal.new(c) unless c.kind_of?(Float) ||
|
80
96
|
c.kind_of?(Fixnum) || c.kind_of?(BigDecimal)
|
81
97
|
rescue
|
82
|
-
raise
|
98
|
+
raise InvalidGraphDataError, "Unable to convert #{c.to_s} into a number"
|
83
99
|
end
|
84
100
|
}
|
85
101
|
}
|
86
102
|
|
87
|
-
raise
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
require "SVG/Graph/BarHorizontal"
|
96
|
-
graphclass = SVG::Graph::BarHorizontal
|
97
|
-
when :line
|
98
|
-
require "SVG/Graph/Line"
|
99
|
-
graphclass = SVG::Graph::Line
|
100
|
-
when :pie
|
101
|
-
require "SVG/Graph/Pie"
|
102
|
-
graphclass = SVG::Graph::Pie
|
103
|
-
else
|
104
|
-
raise "Unsupported graph type requested"
|
103
|
+
raise InvalidGraphOptionError, 'You must provide a width before rendering a graph' if eng.width.nil?
|
104
|
+
raise InvalidGraphOptionError, 'You must provide a height before rendering a graph' if eng.height.nil?
|
105
|
+
raise InvalidGraphOptionError, 'You must provide a style before rendering a graph' if eng.style.nil?
|
106
|
+
if eng.style != :area && eng.style != :bar &&
|
107
|
+
eng.style != :line &&
|
108
|
+
eng.style != :smiles &&
|
109
|
+
eng.style != :stacked
|
110
|
+
raise InvalidGraphOptionError, 'Invalid graph style'
|
105
111
|
end
|
106
112
|
|
107
|
-
|
108
|
-
|
109
|
-
@graph =
|
113
|
+
require 'scruffy'
|
114
|
+
@graph = Scruffy::Graph.new
|
115
|
+
@graph.title = eng.title unless eng.title.nil?
|
116
|
+
@graph.theme = Scruffy::Themes::Mephisto.new
|
117
|
+
@graph.point_markers = @data.column_names
|
118
|
+
@graph_style = eng.style
|
119
|
+
@graph_width = eng.width
|
120
|
+
@graph_height = eng.height
|
110
121
|
}
|
111
122
|
|
112
123
|
renderer :graph do
|
113
124
|
|
114
125
|
data.each_with_index { |r,i|
|
115
|
-
@graph.
|
116
|
-
|
117
|
-
|
118
|
-
})
|
126
|
+
@graph.add(@graph_style,
|
127
|
+
r.tags[0] || 'series ' + (i+1).to_s,
|
128
|
+
r.data)
|
119
129
|
}
|
120
130
|
|
121
131
|
# return the rendered graph
|
122
|
-
@graph.
|
132
|
+
@graph.render(:size => [@graph_width, @graph_height])
|
123
133
|
end
|
124
134
|
|
125
135
|
plugin_name :svg
|
@@ -223,25 +233,25 @@ module Ruport
|
|
223
233
|
renderer(:invoice) { pdf.render }
|
224
234
|
|
225
235
|
# Company Information in top lefthand corner
|
226
|
-
helper(:build_company_header) { |eng|
|
236
|
+
helper(:build_company_header, :engine => :invoice_engine) { |eng|
|
227
237
|
@tod = pdf.y
|
228
238
|
text_box(eng.company_info)
|
229
239
|
}
|
230
240
|
|
231
|
-
helper(:build_headers) { |eng|
|
241
|
+
helper(:build_headers, :engine => :invoice_engine) { |eng|
|
232
242
|
build_company_header_helper(eng)
|
233
243
|
build_customer_header_helper(eng)
|
234
244
|
build_title_helper(eng)
|
235
245
|
build_order_header_helper(eng)
|
236
246
|
}
|
237
247
|
|
238
|
-
helper(:build_order_header) { |eng|
|
248
|
+
helper(:build_order_header, :engine => :invoice_engine) { |eng|
|
239
249
|
if eng.order_info
|
240
250
|
text_box(eng.order_info, :position => 350)
|
241
251
|
end
|
242
252
|
}
|
243
253
|
|
244
|
-
helper(:build_title) { |eng|
|
254
|
+
helper(:build_title, :engine => :invoice_engine) { |eng|
|
245
255
|
pdf.y = @tod
|
246
256
|
if eng.title
|
247
257
|
pdf.text eng.title, :left => 350, :font_size => 14
|
@@ -249,7 +259,7 @@ module Ruport
|
|
249
259
|
end
|
250
260
|
}
|
251
261
|
|
252
|
-
helper(:build_footer) { |eng|
|
262
|
+
helper(:build_footer, :engine => :invoice_engine) { |eng|
|
253
263
|
# footer
|
254
264
|
pdf.open_object do |footer|
|
255
265
|
pdf.save_state
|
@@ -270,7 +280,7 @@ module Ruport
|
|
270
280
|
pdf.stop_page_numbering(true, :current)
|
271
281
|
}
|
272
282
|
|
273
|
-
helper(:build_body) do
|
283
|
+
helper(:build_body, :engine => :invoice_engine) do
|
274
284
|
pdf.start_page_numbering(500, 20, 8, :right)
|
275
285
|
|
276
286
|
# order contents
|
@@ -288,7 +298,7 @@ module Ruport
|
|
288
298
|
end
|
289
299
|
|
290
300
|
# Order details
|
291
|
-
helper(:build_customer_header) { |eng|
|
301
|
+
helper(:build_customer_header, :engine => :invoice_engine) { |eng|
|
292
302
|
pdf.y -= 10
|
293
303
|
text_box(eng.customer_info)
|
294
304
|
}
|