ruport 0.8.14 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +42 -107
- data/Rakefile +29 -32
- data/examples/centered_pdf_text_box.rb +13 -19
- data/examples/example.csv +3 -0
- data/examples/line_plotter.rb +15 -15
- data/examples/pdf_complex_report.rb +10 -23
- data/examples/pdf_table_with_title.rb +12 -12
- data/examples/rope_examples/itunes/Rakefile +22 -1
- data/examples/rope_examples/itunes/config/environment.rb +4 -0
- data/examples/rope_examples/itunes/lib/init.rb +32 -2
- data/examples/rope_examples/itunes/util/build +50 -16
- data/examples/rope_examples/sales_report/README +1 -1
- data/examples/rope_examples/sales_report/Rakefile +22 -1
- data/examples/rope_examples/sales_report/config/environment.rb +4 -0
- data/examples/rope_examples/sales_report/lib/init.rb +32 -2
- data/examples/rope_examples/sales_report/lib/reports/sales.rb +10 -16
- data/examples/rope_examples/sales_report/util/build +50 -16
- data/examples/row_renderer.rb +39 -0
- data/examples/ruport_list/png_embed.rb +61 -0
- data/examples/ruport_list/roadmap.png +0 -0
- data/examples/sample.rb +16 -0
- data/examples/simple_pdf_lines.rb +24 -0
- data/lib/ruport.rb +143 -57
- data/lib/ruport/acts_as_reportable.rb +246 -0
- data/lib/ruport/data.rb +1 -2
- data/lib/ruport/data/grouping.rb +311 -0
- data/lib/ruport/data/record.rb +113 -84
- data/lib/ruport/data/table.rb +275 -174
- data/lib/ruport/formatter.rb +149 -0
- data/lib/ruport/formatter/csv.rb +87 -0
- data/lib/ruport/formatter/html.rb +89 -0
- data/lib/ruport/formatter/pdf.rb +357 -0
- data/lib/ruport/formatter/text.rb +151 -0
- data/lib/ruport/generator.rb +127 -30
- data/lib/ruport/query.rb +46 -99
- data/lib/ruport/renderer.rb +238 -194
- data/lib/ruport/renderer/grouping.rb +67 -0
- data/lib/ruport/renderer/table.rb +25 -98
- data/lib/ruport/report.rb +45 -96
- data/test/acts_as_reportable_test.rb +229 -0
- data/test/csv_formatter_test.rb +97 -0
- data/test/{_test_database.rb → database_test_.rb} +0 -0
- data/test/grouping_test.rb +305 -0
- data/test/html_formatter_test.rb +104 -0
- data/test/pdf_formatter_test.rb +25 -0
- data/test/{test_query.rb → query_test.rb} +32 -121
- data/test/{test_record.rb → record_test.rb} +40 -23
- data/test/renderer_test.rb +344 -0
- data/test/{test_report.rb → report_test.rb} +74 -44
- data/test/samples/ticket_count.csv +124 -0
- data/test/{test_sql_split.rb → sql_split_test.rb} +0 -0
- data/test/{test_table.rb → table_test.rb} +255 -44
- data/test/text_formatter_test.rb +144 -0
- data/util/bench/data/record/bench_as_vs_to.rb +17 -0
- data/util/bench/data/record/bench_constructor.rb +46 -0
- data/util/bench/data/record/bench_indexing.rb +65 -0
- data/util/bench/data/record/bench_reorder.rb +35 -0
- data/util/bench/data/record/bench_to_a.rb +19 -0
- data/util/bench/data/table/bench_column_manip.rb +103 -0
- data/util/bench/data/table/bench_dup.rb +24 -0
- data/util/bench/data/table/bench_init.rb +67 -0
- data/util/bench/data/table/bench_manip.rb +125 -0
- data/util/bench/formatter/bench_csv.rb +14 -0
- data/util/bench/formatter/bench_html.rb +14 -0
- data/util/bench/formatter/bench_pdf.rb +14 -0
- data/util/bench/formatter/bench_text.rb +14 -0
- data/util/bench/samples/tattle.csv +1237 -0
- metadata +121 -143
- data/TODO +0 -21
- data/examples/invoice.rb +0 -142
- data/examples/invoice_report.rb +0 -29
- data/examples/line_graph.rb +0 -38
- data/examples/rope_examples/itunes/config/ruport_config.rb +0 -8
- data/examples/rope_examples/sales_report/config/ruport_config.rb +0 -8
- data/lib/ruport/attempt.rb +0 -63
- data/lib/ruport/config.rb +0 -204
- data/lib/ruport/data/groupable.rb +0 -93
- data/lib/ruport/data/taggable.rb +0 -80
- data/lib/ruport/format.rb +0 -1
- data/lib/ruport/format/csv.rb +0 -29
- data/lib/ruport/format/html.rb +0 -42
- data/lib/ruport/format/latex.rb +0 -47
- data/lib/ruport/format/pdf.rb +0 -233
- data/lib/ruport/format/plugin.rb +0 -31
- data/lib/ruport/format/svg.rb +0 -60
- data/lib/ruport/format/text.rb +0 -103
- data/lib/ruport/format/xml.rb +0 -32
- data/lib/ruport/layout.rb +0 -1
- data/lib/ruport/layout/component.rb +0 -7
- data/lib/ruport/mailer.rb +0 -99
- data/lib/ruport/renderer/graph.rb +0 -46
- data/lib/ruport/report/graph.rb +0 -14
- data/lib/ruport/system_extensions.rb +0 -71
- data/test/test_config.rb +0 -88
- data/test/test_format_text.rb +0 -63
- data/test/test_graph_renderer.rb +0 -97
- data/test/test_groupable.rb +0 -56
- data/test/test_mailer.rb +0 -170
- data/test/test_renderer.rb +0 -151
- data/test/test_ruport.rb +0 -58
- data/test/test_table_renderer.rb +0 -141
- data/test/test_taggable.rb +0 -52
data/README
CHANGED
@@ -1,106 +1,64 @@
|
|
1
1
|
# ------------------------------------------------------------------------
|
2
|
-
# -------------------------------------------------------------------------
|
3
|
-
#
|
4
|
-
# NOTE:
|
5
|
-
#
|
6
|
-
# The most up to date information can be found at:
|
7
|
-
# http://reporting.stonecode.org
|
8
|
-
#
|
9
2
|
# Contents:
|
10
3
|
#
|
11
|
-
# - What Ruport Is
|
4
|
+
# - What Ruport Is
|
12
5
|
# - Installation
|
13
|
-
# - Getting Started
|
14
|
-
# - Caveats.
|
15
6
|
# - Resources
|
16
|
-
# -
|
17
|
-
#
|
18
|
-
# = What Ruport Is.
|
7
|
+
# - Hacking
|
19
8
|
#
|
20
|
-
#
|
21
|
-
# less tedious and painful. It provides tools for data acquisition, database
|
22
|
-
# interaction, formatting, and parsing/munging. Designed to be extensible,
|
23
|
-
# it is possible to use Ruport for quick specific tasks as well as to build
|
24
|
-
# robust reporting applications.
|
9
|
+
# = What Ruport Is
|
25
10
|
#
|
26
|
-
#
|
11
|
+
# Ruby Reports (Ruport) is an extensible reporting system.
|
12
|
+
#
|
13
|
+
# It aims to be as lightweight as possible while still providing core support
|
14
|
+
# for data aggregation and manipulation as well as multi-format rendering
|
15
|
+
# of reports.
|
27
16
|
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
# Ruport has a number of dependencies.
|
31
|
-
#
|
32
|
-
# Ruby/DBI and appropriate dbds: Makes Query useable
|
33
|
-
# (must be installed manually)
|
17
|
+
# Ruport provides tools for using a number of data sources, including CSV files,
|
18
|
+
# ActiveRecord models, and raw SQL connections via RubyDBI.
|
34
19
|
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# RedCloth: Enables textile/markdown filtering
|
39
|
-
# (available via rubygems)
|
40
|
-
#
|
41
|
-
# PDF::Writer: Enables printable documents
|
42
|
-
# (available via rubygems)
|
20
|
+
# Data manipulation is easy as there are standard structures that support
|
21
|
+
# record, table, and grouping operations. These all can be extended to
|
22
|
+
# implement custom behavior as needed.
|
43
23
|
#
|
44
|
-
#
|
45
|
-
#
|
24
|
+
# For common tasks, Ruport provides formatters for CSV, HTML, PDF, and text-
|
25
|
+
# based reports. However, the real power lies in building custom renderers and
|
26
|
+
# formatters. The base formatting libraries provide a number of helper
|
27
|
+
# functions that will let you build complex reports while maintaining a DRY and
|
28
|
+
# consistent interface.
|
46
29
|
#
|
47
|
-
#
|
48
|
-
#
|
30
|
+
# Since Ruport's core support is intentionally minimalistic, you may be looking
|
31
|
+
# for some higher level support for specific needs such as graphing, invoices,
|
32
|
+
# report mailing support, etc. For this, you may wish to take a look at the
|
33
|
+
# ruport-util package, which contains some generally useful tools and libraries
|
34
|
+
# to extend Ruport's capabilities.
|
49
35
|
#
|
50
|
-
#
|
51
|
-
# their functionality will automatically be enabled.
|
36
|
+
# = Installation
|
52
37
|
#
|
53
38
|
# To install ruport via rubygems with all it's dependencies (except DBI):
|
54
39
|
#
|
55
40
|
# sudo gem install ruport -y
|
56
41
|
#
|
57
|
-
# To install ruport manually via setup.rb:
|
58
|
-
#
|
59
|
-
# sudo ruby setup.rb
|
60
|
-
#
|
61
|
-
# To not install ruport at all:
|
62
|
-
#
|
63
|
-
# ruby -Ipath/to/ruport/lib my_script.rb
|
64
|
-
#
|
65
42
|
# Check to see if it installed properly:
|
66
43
|
#
|
67
44
|
# ruby -rubygems -e "require 'ruport'; puts Ruport::VERSION"
|
68
|
-
# (omit the -rubygems flag if installed manually)
|
69
45
|
#
|
70
46
|
# If you get an error, please consult the mailing list.
|
71
47
|
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
48
|
+
# Dependencies Details:
|
49
|
+
#
|
50
|
+
# -- formatting
|
75
51
|
#
|
76
|
-
#
|
77
|
-
#
|
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
|
-
# and store data in ruport.
|
52
|
+
# Ruport relies on PDF::Writer and FasterCSV for its formatting support.
|
53
|
+
# If you want to make use of textile helpers, you'll also need RedCloth
|
82
54
|
#
|
83
|
-
#
|
84
|
-
# please see the acts_as_reportable plugin.
|
85
|
-
#
|
86
|
-
# == Report Generation
|
87
|
-
#
|
88
|
-
# Once the data is ready, it can be rendered using a combination of
|
89
|
-
# Ruport::Renderer and Ruport::Format::Plugin.
|
90
|
-
# The renderer defines the report type (tablular, graph, etc), and
|
91
|
-
# the plugin renders the engine into a final format (PDF, CSV, HTML, SVG).
|
92
|
-
# Renderers will often interact with more than one plugin, to allow the same
|
93
|
-
# report to be rendered in multiple ways ie. as HTML and a PDF.
|
94
|
-
#
|
95
|
-
# To tie these together, a basic DSL is provided by Ruport::Report
|
55
|
+
# -- database interaction
|
96
56
|
#
|
97
|
-
#
|
98
|
-
#
|
57
|
+
# If you wish to use Ruport to report against a rails project,
|
58
|
+
# a camping project, or do standalone AAR reports, you'll need ActiveRecord.
|
99
59
|
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
# Our Trac is at: http://code.stonecode.org
|
103
|
-
# You may use the username ruport and password blinky to file tickets
|
60
|
+
# If you want to use Ruport::Query for raw SQL support, you'll need to
|
61
|
+
# install RubyDBI and whatever database drivers you might need.
|
104
62
|
#
|
105
63
|
# = Resources
|
106
64
|
#
|
@@ -108,40 +66,17 @@
|
|
108
66
|
# This software is on the move, so the list is the most reliable way of getting
|
109
67
|
# up to date information.
|
110
68
|
#
|
111
|
-
#
|
69
|
+
# - You can sign up and/or view the archives here:
|
112
70
|
# http://groups.google.com/group/ruby-reports
|
113
71
|
#
|
114
|
-
#
|
115
|
-
# documentation, as well as encouraging design discussions and also am quite
|
116
|
-
# curious about what people use or want to use ruport for.
|
117
|
-
#
|
118
|
-
# I will announce Ruport releases on RubyTalk, on the Ruport mailing list, on
|
119
|
-
# Freshmeat, and RAA. If you would like to
|
120
|
-
# keep an eye out for releases, please monitor one of those places.
|
121
|
-
#
|
122
|
-
# - You may download Ruport's source from the project page:
|
123
|
-
# http://rubyforge.org/projects/ruport
|
124
|
-
#
|
125
|
-
# - The latest stable API documentation is available at:
|
72
|
+
# - The latest stable API documentation is available at:
|
126
73
|
# http://api.rubyreports.org
|
127
74
|
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
131
|
-
# If you are interested in developing Ruport, please *never* study code in
|
132
|
-
# official releases. As this software is in it's early stages, it's essential
|
133
|
-
# to keep an eye on the subversion repository. If you let me know you are
|
134
|
-
# interested in working on something, I will let you know if I'm actively
|
135
|
-
# working on that section.
|
136
|
-
#
|
137
|
-
# - Grabbing the code from the svn trunk is simple:
|
138
|
-
#
|
139
|
-
# svn co svn://rubyforge.org//var/svn/ruport/trunk/ ruport
|
140
|
-
#
|
141
|
-
# - Or if you are interested in the latest updates to the stable branch
|
142
|
-
#
|
143
|
-
# svn co svn://rubyforge.org//var/svn/ruport/branches/stable ruport
|
75
|
+
# - Our Trac is at: http://code.stonecode.org
|
76
|
+
# You may use the username ruport and password blinky to file tickets
|
144
77
|
#
|
145
|
-
#
|
78
|
+
# = Hacking
|
146
79
|
#
|
147
|
-
# If you
|
80
|
+
# If you'd like to work on Ruport, please post on the list and let us know what
|
81
|
+
# you're interested in doing, or contact Gregory Brown or Michael Milner if you
|
82
|
+
# have questions.
|
data/Rakefile
CHANGED
@@ -2,53 +2,42 @@ require "rake/rdoctask"
|
|
2
2
|
require "rake/testtask"
|
3
3
|
require "rake/gempackagetask"
|
4
4
|
|
5
|
+
|
6
|
+
RUPORT_VERSION = "0.10.0"
|
7
|
+
|
5
8
|
begin
|
6
9
|
require "rubygems"
|
7
10
|
rescue LoadError
|
8
11
|
nil
|
9
12
|
end
|
10
13
|
|
11
|
-
RUPORT_VERSION = "0.8.14"
|
12
|
-
|
13
|
-
#Set to true to disable dependency resolution
|
14
|
-
LEAN=false
|
15
|
-
dir = File.dirname(__FILE__)
|
16
|
-
lib = File.join(dir, "lib", "ruport.rb")
|
17
|
-
version = File.read(lib)[/^\s*VERSION\s*=\s*(['"])(\d+\.\d+\.d+)['"]/,1]
|
18
14
|
task :default => [:test]
|
19
15
|
|
20
16
|
Rake::TestTask.new do |test|
|
21
17
|
test.libs << "test"
|
22
|
-
test.test_files = Dir[ "test
|
18
|
+
test.test_files = Dir[ "test/*_test.rb" ]
|
23
19
|
test.verbose = true
|
24
20
|
end
|
25
21
|
|
26
22
|
spec = Gem::Specification.new do |spec|
|
27
|
-
spec.name =
|
23
|
+
spec.name = "ruport"
|
28
24
|
spec.version = RUPORT_VERSION
|
29
25
|
spec.platform = Gem::Platform::RUBY
|
30
26
|
spec.summary = "A generalized Ruby report generation and templating engine."
|
31
|
-
spec.files = Dir.glob("{examples,lib,test,bin}/**/**/*") +
|
27
|
+
spec.files = Dir.glob("{examples,lib,test,bin,util/bench}/**/**/*") +
|
32
28
|
["Rakefile", "setup.rb"]
|
33
|
-
|
34
29
|
spec.require_path = "lib"
|
35
30
|
|
36
|
-
spec.test_files = Dir[ "test
|
31
|
+
spec.test_files = Dir[ "test/*_test.rb" ]
|
37
32
|
spec.bindir = "bin"
|
38
33
|
spec.executables = FileList["rope"]
|
39
34
|
spec.has_rdoc = true
|
40
|
-
spec.extra_rdoc_files = %w{README LICENSE
|
35
|
+
spec.extra_rdoc_files = %w{README LICENSE AUTHORS}
|
41
36
|
spec.rdoc_options << '--title' << 'Ruport Documentation' <<
|
42
37
|
'--main' << 'README' << '-q'
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
spec.add_dependency('pdf-writer', '>= 1.1.3')
|
47
|
-
spec.add_dependency("mailfactory", ">= 1.2.3")
|
48
|
-
spec.add_dependency('scruffy', '>= 0.2.2')
|
49
|
-
spec.add_dependency('gem_plugin', '>=0.2.2')
|
50
|
-
end
|
51
|
-
|
38
|
+
spec.add_dependency('transaction-simple', "=1.4.0")
|
39
|
+
spec.add_dependency('fastercsv', '>= 1.1.0')
|
40
|
+
spec.add_dependency('pdf-writer', '>= 1.1.3')
|
52
41
|
spec.author = "Gregory Brown"
|
53
42
|
spec.email = " gregory.t.brown@gmail.com"
|
54
43
|
spec.rubyforge_project = "ruport"
|
@@ -62,7 +51,7 @@ end
|
|
62
51
|
|
63
52
|
Rake::RDocTask.new do |rdoc|
|
64
53
|
rdoc.rdoc_files.include( "README",
|
65
|
-
|
54
|
+
#"CHANGELOG",
|
66
55
|
"AUTHORS", "COPYING",
|
67
56
|
"LICENSE", "lib/" )
|
68
57
|
rdoc.main = "README"
|
@@ -83,19 +72,27 @@ task :build_archives => [:package,:rcov,:rdoc] do
|
|
83
72
|
sh "tar cjvf ruport-#{RUPORT_VERSION}.tar.bz2 ruport-#{RUPORT_VERSION}"
|
84
73
|
end
|
85
74
|
|
75
|
+
task :run_benchmarks do
|
76
|
+
files = FileList["util/bench/**/**/*.rb"]
|
77
|
+
files.sort!
|
78
|
+
files.uniq!
|
79
|
+
names = files.map { |r| r.sub("util/bench","").split("/").map { |e| e.capitalize } }
|
80
|
+
names.map! { |e| e[1..-2].join("::") + " <BENCH: #{e[-1].sub('Bench_','').sub('.rb','')}>" }
|
81
|
+
start_time = Time.now
|
82
|
+
files.zip(names).each { |f,n|
|
83
|
+
puts "\n#{n}\n\n"
|
84
|
+
sh "ruby -Ilib #{f}"
|
85
|
+
puts "\n"
|
86
|
+
}
|
87
|
+
end_time = Time.now
|
88
|
+
puts "\n** Total Run Time: #{end_time-start_time}s **"
|
89
|
+
end
|
90
|
+
|
86
91
|
begin
|
87
92
|
require 'rcov/rcovtask'
|
88
93
|
Rcov::RcovTask.new do |t|
|
89
|
-
t.test_files = Dir[ "test
|
94
|
+
t.test_files = Dir[ "test/*_test.rb" ]
|
90
95
|
end
|
91
96
|
rescue LoadError
|
92
97
|
nil
|
93
98
|
end
|
94
|
-
|
95
|
-
desc "Generate Ruport Recipes. Assumes you have erb, redcloth, and htmldoc."
|
96
|
-
task :cookbook do
|
97
|
-
sh "erb doc/ruport_recipes.textile | redcloth >doc/temp.html"
|
98
|
-
sh "htmldoc --batch doc/ruport.book" rescue nil
|
99
|
-
rm "doc/temp.html"
|
100
|
-
mv "out.pdf", "doc/out.pdf"
|
101
|
-
end
|
@@ -2,8 +2,6 @@ require "ruport"
|
|
2
2
|
|
3
3
|
class Document < Ruport::Renderer
|
4
4
|
|
5
|
-
include Ruport::Renderer::Helpers
|
6
|
-
|
7
5
|
required_option :text
|
8
6
|
required_option :author
|
9
7
|
option :heading
|
@@ -13,43 +11,39 @@ class Document < Ruport::Renderer
|
|
13
11
|
end
|
14
12
|
|
15
13
|
|
16
|
-
class CenteredPDFTextBox < Ruport::
|
14
|
+
class CenteredPDFTextBox < Ruport::Formatter::PDF
|
17
15
|
|
18
|
-
|
16
|
+
renders :pdf, :for => Document
|
19
17
|
|
20
18
|
def build_document_body
|
21
|
-
|
22
19
|
add_text "-- " << options.author << " --",
|
23
|
-
:justification => :center, :font_size => 20
|
24
|
-
|
20
|
+
:justification => :center, :font_size => 20
|
25
21
|
|
26
22
|
c = pdf_writer.absolute_x_middle - 239/2
|
27
23
|
|
28
|
-
|
29
|
-
|
24
|
+
center_image_in_box("RWEmerson.jpg", :x => c, :y => 325,
|
25
|
+
:width => 239, :height => 359)
|
30
26
|
|
31
27
|
rounded_text_box(options.text) do |o|
|
32
28
|
o.radius = 5
|
33
|
-
o.width =
|
34
|
-
o.height =
|
35
|
-
o.font_size =
|
29
|
+
o.width = options.width || 400
|
30
|
+
o.height = options.height || 130
|
31
|
+
o.font_size = options.font_size || 12
|
36
32
|
o.heading = options.heading
|
37
33
|
|
38
34
|
o.x = pdf_writer.absolute_x_middle - o.width/2
|
39
35
|
o.y = 300
|
40
|
-
end
|
41
|
-
|
36
|
+
end
|
42
37
|
end
|
43
38
|
|
44
39
|
def finalize_document
|
45
|
-
|
40
|
+
render_pdf
|
46
41
|
end
|
47
42
|
end
|
48
43
|
|
49
|
-
a = Document.render_pdf
|
50
|
-
|
51
|
-
|
52
|
-
r.text = <<EOS
|
44
|
+
a = Document.render_pdf( :heading => "a good quote",
|
45
|
+
:author => "Ralph Waldo Emerson") { |r|
|
46
|
+
r.text = <<EOS
|
53
47
|
A foolish consistency is the hobgoblin of little minds, adored by little
|
54
48
|
statesmen and philosophers and divines. With consistency a great soul has simply
|
55
49
|
nothing to do. He may as well concern himself with his shadow on the wall. Speak
|
data/examples/line_plotter.rb
CHANGED
@@ -2,17 +2,17 @@ require "ruport"
|
|
2
2
|
|
3
3
|
class LinePlotter < Ruport::Renderer
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
options do |o|
|
6
|
+
o.line_color = "green"
|
7
|
+
o.line_width = 2
|
8
|
+
o.width = "100%"
|
9
|
+
o.height = "100%"
|
10
10
|
end
|
11
11
|
|
12
12
|
def run
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
formatter do |f|
|
14
|
+
f.data = get_lines
|
15
|
+
f.render_plot
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -24,7 +24,9 @@ class LinePlotter < Ruport::Renderer
|
|
24
24
|
|
25
25
|
end
|
26
26
|
|
27
|
-
class SVG < Ruport::
|
27
|
+
class SVG < Ruport::Formatter
|
28
|
+
|
29
|
+
renders :svg, :for => LinePlotter
|
28
30
|
|
29
31
|
def initialize
|
30
32
|
require "builder"
|
@@ -33,12 +35,12 @@ class SVG < Ruport::Format::Plugin
|
|
33
35
|
|
34
36
|
def render_plot
|
35
37
|
|
36
|
-
opts = { :width =>
|
38
|
+
opts = { :width => options.width, :height => options.height,
|
37
39
|
:xmlns => "http://www.w3.org/2000/svg" }
|
38
40
|
|
39
41
|
output << @builder.svg(opts) do |builder|
|
40
|
-
builder.g( :stroke =>
|
41
|
-
"stroke-width" =>
|
42
|
+
builder.g( :stroke => options.line_color,
|
43
|
+
"stroke-width" => options.line_width ) do |g|
|
42
44
|
data.each { |r| render_line(r,g) }
|
43
45
|
end
|
44
46
|
end
|
@@ -49,9 +51,7 @@ class SVG < Ruport::Format::Plugin
|
|
49
51
|
opts = { :x1 => line.x1, :x2 => line.x2,
|
50
52
|
:y1 => line.y1, :y2 => line.y2 }
|
51
53
|
xml_obj.line(opts)
|
52
|
-
|
53
|
-
|
54
|
-
LinePlotter.add_format self, :svg
|
54
|
+
end
|
55
55
|
|
56
56
|
end
|
57
57
|
|
@@ -1,38 +1,25 @@
|
|
1
|
+
require 'rubygems'
|
1
2
|
require "ruport"
|
2
3
|
|
3
4
|
module MyStuff
|
4
5
|
|
5
6
|
class DocumentRenderer < Ruport::Renderer
|
6
|
-
|
7
|
-
|
8
|
-
def run
|
9
|
-
build [:header,:body,:footer],:document
|
10
|
-
finalize :document
|
11
|
-
end
|
12
|
-
|
13
|
-
def table=(t)
|
14
|
-
options.table = t
|
15
|
-
end
|
16
|
-
|
17
|
-
def header_text=(t)
|
18
|
-
options.header_text=(t)
|
19
|
-
end
|
20
|
-
|
21
|
-
def footer_text=(t)
|
22
|
-
options.footer_text=(t)
|
23
|
-
end
|
7
|
+
required_option :header_text, :footer_text
|
24
8
|
|
9
|
+
stage :document_header, :document_body, :document_footer
|
10
|
+
|
11
|
+
finalize :document
|
25
12
|
end
|
26
13
|
|
27
|
-
class PDF < Ruport::
|
28
|
-
|
14
|
+
class PDF < Ruport::Formatter::PDF
|
15
|
+
renders :pdf, :for => DocumentRenderer
|
29
16
|
|
30
17
|
def build_document_header
|
31
18
|
add_text options.header_text, :justification => :center
|
32
19
|
end
|
33
20
|
|
34
21
|
def build_document_body
|
35
|
-
pad(10) { draw_table }
|
22
|
+
pad(10) { draw_table(data) }
|
36
23
|
end
|
37
24
|
|
38
25
|
def build_document_footer
|
@@ -40,10 +27,10 @@ module MyStuff
|
|
40
27
|
end
|
41
28
|
|
42
29
|
def finalize_document
|
43
|
-
|
30
|
+
render_pdf
|
44
31
|
end
|
45
|
-
|
46
32
|
end
|
33
|
+
|
47
34
|
end
|
48
35
|
|
49
36
|
puts MyStuff::DocumentRenderer.render_pdf { |e|
|