ruport 0.7.2 → 0.8.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/AUTHORS +7 -3
- data/Rakefile +8 -9
- data/TODO +16 -0
- data/examples/RWEmerson.jpg +0 -0
- data/examples/centered_pdf_text_box.rb +66 -0
- data/examples/invoice.rb +35 -25
- data/examples/invoice_report.rb +1 -1
- data/examples/line_plotter.rb +1 -1
- data/examples/pdf_table_with_title.rb +42 -0
- data/lib/ruport.rb +5 -7
- data/lib/ruport.rb.rej +41 -0
- data/lib/ruport.rb~ +85 -0
- data/lib/ruport/attempt.rb +59 -59
- data/lib/ruport/config.rb +15 -4
- data/lib/ruport/data.rb +0 -2
- data/lib/ruport/data/groupable.rb +25 -16
- data/lib/ruport/data/record.rb +128 -102
- data/lib/ruport/data/table.rb +352 -199
- data/lib/ruport/data/taggable.rb +18 -7
- data/lib/ruport/format/html.rb +3 -1
- data/lib/ruport/format/latex.rb +1 -1
- data/lib/ruport/format/latex.rb.rej +26 -0
- data/lib/ruport/format/latex.rb~ +47 -0
- data/lib/ruport/format/pdf.rb +111 -28
- data/lib/ruport/format/pdf.rb.rej +168 -0
- data/lib/ruport/format/pdf.rb~ +189 -0
- data/lib/ruport/format/plugin.rb +0 -5
- data/lib/ruport/format/svg.rb +4 -4
- data/lib/ruport/format/xml.rb +3 -3
- data/lib/ruport/generator.rb +66 -27
- data/lib/ruport/mailer.rb +4 -1
- data/lib/ruport/query.rb +13 -1
- data/lib/ruport/renderer.rb +89 -17
- data/lib/ruport/renderer/graph.rb +5 -5
- data/lib/ruport/renderer/table.rb +8 -9
- data/lib/ruport/report.rb +2 -6
- data/test/test_config.rb +88 -76
- data/test/{test_text_table.rb → test_format_text.rb} +4 -2
- data/test/test_groupable.rb +15 -13
- data/test/test_query.rb +6 -3
- data/test/test_record.rb +57 -33
- data/test/test_renderer.rb +77 -0
- data/test/test_report.rb +188 -181
- data/test/test_ruport.rb +5 -6
- data/test/test_table.rb +290 -190
- data/test/test_table_renderer.rb +56 -8
- data/test/test_taggable.rb +7 -8
- data/test/unit.log +259 -7
- metadata +22 -19
- data/lib/ruport/data/collection.rb +0 -65
- data/lib/ruport/data/set.rb +0 -148
- data/test/test_collection.rb +0 -30
- data/test/test_set.rb +0 -118
data/AUTHORS
CHANGED
@@ -40,6 +40,10 @@ Marshall T. Vandegrift:
|
|
40
40
|
Stefan Mahlitz:
|
41
41
|
- Table#sort_rows_by
|
42
42
|
|
43
|
-
|
44
|
-
-
|
45
|
-
-
|
43
|
+
Michael Milner
|
44
|
+
- Refactoring for Table#column_names= (r436)
|
45
|
+
- Mock object for Mailer
|
46
|
+
- Mock object for Report (#130)
|
47
|
+
|
48
|
+
Chris Carter
|
49
|
+
- Table#remove_columns (r440)
|
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.8.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}/**/**/*") +
|
@@ -39,10 +39,10 @@ spec = Gem::Specification.new do |spec|
|
|
39
39
|
spec.rdoc_options << '--title' << 'Ruport Documentation' <<
|
40
40
|
'--main' << 'README' << '-q'
|
41
41
|
unless LEAN
|
42
|
-
spec.add_dependency('fastercsv', '>=
|
43
|
-
spec.add_dependency('RedCloth', '>= 3.0.
|
42
|
+
spec.add_dependency('fastercsv', '>= 1.1.0')
|
43
|
+
spec.add_dependency('RedCloth', '>= 3.0.4')
|
44
44
|
spec.add_dependency('pdf-writer', '>= 1.1.3')
|
45
|
-
spec.add_dependency("mailfactory", ">= 1.2.
|
45
|
+
spec.add_dependency("mailfactory", ">= 1.2.3")
|
46
46
|
spec.add_dependency('scruffy', '>= 0.2.2')
|
47
47
|
end
|
48
48
|
spec.author = "Gregory Brown"
|
@@ -50,16 +50,15 @@ spec = Gem::Specification.new do |spec|
|
|
50
50
|
spec.rubyforge_project = "ruport"
|
51
51
|
spec.homepage = "http://reporting.stonecode.org"
|
52
52
|
spec.description = <<END_DESC
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
quickly and cleanly.
|
53
|
+
Ruby Reports is a software library that aims to make the task of reporting
|
54
|
+
less tedious and painful. It provides tools for data acquisition,
|
55
|
+
database interaction, formatting, and parsing/munging.
|
57
56
|
END_DESC
|
58
57
|
end
|
59
58
|
|
60
59
|
Rake::RDocTask.new do |rdoc|
|
61
60
|
rdoc.rdoc_files.include( "README",
|
62
|
-
"TODO", "CHANGELOG",
|
61
|
+
"TODO", #"CHANGELOG",
|
63
62
|
"AUTHORS", "COPYING",
|
64
63
|
"LICENSE", "lib/" )
|
65
64
|
rdoc.main = "README"
|
data/TODO
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
= TODO
|
2
2
|
|
3
|
+
--
|
4
|
+
|
5
|
+
* fix whitespace
|
6
|
+
|
7
|
+
* table should have record_class constructor
|
8
|
+
|
9
|
+
* logging in util/build.rb?
|
10
|
+
|
11
|
+
* Table#add_row ?
|
12
|
+
|
13
|
+
* Table#col_merge
|
14
|
+
|
15
|
+
* Table#join
|
16
|
+
|
17
|
+
--
|
18
|
+
|
3
19
|
- Any future plans are available on Ruport's Trac website
|
4
20
|
|
5
21
|
http://stonecode.svnrepository.com/ruport/trac.cgi
|
Binary file
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "ruport"
|
2
|
+
|
3
|
+
class Document < Ruport::Renderer
|
4
|
+
|
5
|
+
include Ruport::Renderer::Helpers
|
6
|
+
|
7
|
+
required_option :text
|
8
|
+
required_option :author
|
9
|
+
option :heading
|
10
|
+
|
11
|
+
stage :document_body
|
12
|
+
finalize :document
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
class CenteredPDFTextBox < Ruport::Format::PDF
|
17
|
+
|
18
|
+
Document.add_format self, :pdf
|
19
|
+
|
20
|
+
def build_document_body
|
21
|
+
|
22
|
+
add_text "-- " << options.author << " --",
|
23
|
+
:justification => :center, :font_size => 20
|
24
|
+
|
25
|
+
|
26
|
+
c = pdf_writer.absolute_x_middle - 239/2
|
27
|
+
|
28
|
+
#img,x,y,width,height
|
29
|
+
center_image_in_box("RWEmerson.jpg",c,325,239,359)
|
30
|
+
|
31
|
+
rounded_text_box(options.text) do |o|
|
32
|
+
o.radius = 5
|
33
|
+
o.width = layout.width || 400
|
34
|
+
o.height = layout.height || 130
|
35
|
+
o.font_size = layout.font_size || 12
|
36
|
+
o.heading = options.heading
|
37
|
+
|
38
|
+
o.x = pdf_writer.absolute_x_middle - o.width/2
|
39
|
+
o.y = 300
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
def finalize_document
|
45
|
+
output << pdf_writer.render
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
a = Document.render_pdf { |r|
|
50
|
+
r.heading = "a good quote"
|
51
|
+
r.author = "Ralph Waldo Emerson"
|
52
|
+
r.text = <<EOS
|
53
|
+
A foolish consistency is the hobgoblin of little minds, adored by little
|
54
|
+
statesmen and philosophers and divines. With consistency a great soul has simply
|
55
|
+
nothing to do. He may as well concern himself with his shadow on the wall. Speak
|
56
|
+
what you think now in hard words and to-morrow speak what to-morrow thinks in
|
57
|
+
hard words again, though it contradict every thing you said to-day.--"Ah, so you
|
58
|
+
shall be sure to be misunderstood."--Is it so bad then to be misunderstood?
|
59
|
+
Pythagoras was misunderstood, and Socrates, and Jesus, and Luther, and
|
60
|
+
Copernicus, and Galileo, and Newton, and every pure and wise spirit that ever
|
61
|
+
took flesh. To be great is to be misunderstood. . . .
|
62
|
+
EOS
|
63
|
+
|
64
|
+
}
|
65
|
+
|
66
|
+
puts a
|
data/examples/invoice.rb
CHANGED
@@ -3,22 +3,18 @@ module Ruport
|
|
3
3
|
class Invoice < Ruport::Renderer
|
4
4
|
|
5
5
|
include Renderer::Helpers
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
o.order_info ||= ""
|
13
|
-
o.title ||= ""
|
14
|
-
end
|
15
|
-
end
|
6
|
+
|
7
|
+
required_option :customer_info
|
8
|
+
required_option :company_info
|
9
|
+
required_option :order_info
|
10
|
+
option :title
|
11
|
+
required_option :comments
|
16
12
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
13
|
+
stage :invoice_headers
|
14
|
+
stage :invoice_body
|
15
|
+
stage :invoice_footer
|
16
|
+
|
17
|
+
finalize :invoice
|
22
18
|
|
23
19
|
module InvoiceHelpers
|
24
20
|
def build_company_header
|
@@ -27,23 +23,37 @@ module Ruport
|
|
27
23
|
end
|
28
24
|
|
29
25
|
def build_customer_header
|
30
|
-
|
26
|
+
move_cursor -10
|
31
27
|
text_box(options.customer_info)
|
32
28
|
end
|
33
29
|
|
34
30
|
def build_title
|
35
|
-
|
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
|
31
|
+
add_title(options.title) if options.title
|
41
32
|
end
|
33
|
+
|
34
|
+
def add_title( title )
|
35
|
+
rounded_text_box("<b>#{title}</b>") do |o|
|
36
|
+
o.fill_color = Color::RGB::Gray80
|
37
|
+
o.radius = 5
|
38
|
+
o.width = layout.header_width || 200
|
39
|
+
o.height = layout.header_height || 20
|
40
|
+
o.font_size = layout.header_font_size || 11
|
41
|
+
o.x = pdf_writer.absolute_right_margin - o.width
|
42
|
+
o.y = pdf_writer.absolute_top_margin
|
43
|
+
end
|
44
|
+
end
|
42
45
|
|
43
46
|
def build_order_header
|
44
47
|
if options.order_info
|
45
|
-
|
46
|
-
|
48
|
+
rounded_text_box("<b>#{options.order_info}</b>") do |o|
|
49
|
+
o.radius = 5
|
50
|
+
o.heading = "Billing Information"
|
51
|
+
o.width = layout.header_width || 200
|
52
|
+
o.height = layout.header_height || 80
|
53
|
+
o.font_size = layout.header_font_size || 10
|
54
|
+
o.x = pdf_writer.absolute_right_margin - o.width
|
55
|
+
o.y = pdf_writer.absolute_top_margin - 25
|
56
|
+
end
|
47
57
|
end
|
48
58
|
end
|
49
59
|
|
@@ -81,7 +91,7 @@ module Ruport
|
|
81
91
|
def build_invoice_body
|
82
92
|
|
83
93
|
pdf_writer.start_page_numbering(500,20,8,:right)
|
84
|
-
pdf_writer.y =
|
94
|
+
pdf_writer.y = 550
|
85
95
|
|
86
96
|
Ruport::Renderer::Table.render_pdf { |r|
|
87
97
|
r.data = data
|
data/examples/invoice_report.rb
CHANGED
@@ -14,7 +14,7 @@ class SampleReport < Ruport::Report
|
|
14
14
|
o.customer_info = "Gregory Brown\n200 Foo Ave."
|
15
15
|
o.comments = "J. Random Comment"
|
16
16
|
o.order_info = "Some info\nabout your order"
|
17
|
-
o.title = "
|
17
|
+
o.title = "Invoice for 12.15.2006 - 12.31.2006"
|
18
18
|
end
|
19
19
|
|
20
20
|
i.layout do |lay|
|
data/examples/line_plotter.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require "ruport"
|
2
|
+
|
3
|
+
class TitledPDFTable < Ruport::Format::PDF
|
4
|
+
|
5
|
+
Ruport::Renderer::Table.add_format self, :titled_pdf
|
6
|
+
|
7
|
+
def add_title( title )
|
8
|
+
rounded_text_box("<b>#{title}</b>") do |o|
|
9
|
+
o.fill_color = Color::RGB::Gray80
|
10
|
+
o.radius = 5
|
11
|
+
o.width = layout.header_width || 200
|
12
|
+
o.height = layout.header_height || 20
|
13
|
+
o.font_size = layout.header_font_size || 12
|
14
|
+
o.x = pdf_writer.absolute_right_margin - o.width
|
15
|
+
o.y = pdf_writer.absolute_top_margin
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def prepare_table
|
20
|
+
layout.header_margin ||= 50
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_table_header
|
24
|
+
add_title options.title
|
25
|
+
move_cursor -layout.header_margin
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
a = Ruport::Renderer::Table.render_titled_pdf { |r|
|
32
|
+
r.options.title = "This is a sample header"
|
33
|
+
r.data = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
|
34
|
+
# NOTE: uncomment some options to play with layout
|
35
|
+
r.layout do |la|
|
36
|
+
# la.header_margin = 25
|
37
|
+
# la.header_width = 250
|
38
|
+
# la.header_height = 50
|
39
|
+
end
|
40
|
+
}
|
41
|
+
|
42
|
+
puts a
|
data/lib/ruport.rb
CHANGED
@@ -9,9 +9,10 @@
|
|
9
9
|
#
|
10
10
|
# See LICENSE and COPYING for details
|
11
11
|
#
|
12
|
+
|
12
13
|
module Ruport
|
13
14
|
|
14
|
-
VERSION = "0.
|
15
|
+
VERSION = "0.8.0"
|
15
16
|
|
16
17
|
# This method is Ruport's logging and error interface. It can generate
|
17
18
|
# warnings or raise fatal errors, logging +message+ to the file defined by
|
@@ -45,13 +46,10 @@ module Ruport
|
|
45
46
|
options[:level].eql?(:log_only) and not Ruport::Config.debug_mode?
|
46
47
|
Ruport::Config::logger.send(options[:status],message) if Config.logger
|
47
48
|
if options[:status].eql? :fatal
|
48
|
-
raise(options[:
|
49
|
+
raise(options[:raises] || RuntimeError, message)
|
49
50
|
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# Alias for <tt>Ruport.log</tt>.
|
53
|
-
def self.complain(*args); Ruport.log(*args) end
|
54
|
-
|
51
|
+
end
|
52
|
+
|
55
53
|
# This method yields a <tt>Ruport::Config</tt> object, allowing you to
|
56
54
|
# set the configuration options for your application.
|
57
55
|
#
|
data/lib/ruport.rb.rej
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
***************
|
2
|
+
*** 9,20 ****
|
3
|
+
#
|
4
|
+
# See LICENSE and COPYING for details
|
5
|
+
#
|
6
|
+
-
|
7
|
+
module Ruport
|
8
|
+
|
9
|
+
VERSION = "0.7.2"
|
10
|
+
|
11
|
+
- #
|
12
|
+
# This method is Ruport's logging and error interface. It can generate
|
13
|
+
# warnings or raise fatal errors, logging +message+ to the file defined by
|
14
|
+
# <tt>Config::log_file</tt>.
|
15
|
+
--- 9,18 ----
|
16
|
+
#
|
17
|
+
# See LICENSE and COPYING for details
|
18
|
+
#
|
19
|
+
module Ruport
|
20
|
+
|
21
|
+
VERSION = "0.7.2"
|
22
|
+
|
23
|
+
# This method is Ruport's logging and error interface. It can generate
|
24
|
+
# warnings or raise fatal errors, logging +message+ to the file defined by
|
25
|
+
# <tt>Config::log_file</tt>.
|
26
|
+
***************
|
27
|
+
*** 54,60 ****
|
28
|
+
# Alias for <tt>Ruport.log</tt>.
|
29
|
+
def self.complain(*args); Ruport.log(*args) end
|
30
|
+
|
31
|
+
- #
|
32
|
+
# This method yields a <tt>Ruport::Config</tt> object, allowing you to
|
33
|
+
# set the configuration options for your application.
|
34
|
+
#
|
35
|
+
--- 52,57 ----
|
36
|
+
# Alias for <tt>Ruport.log</tt>.
|
37
|
+
def self.complain(*args); Ruport.log(*args) end
|
38
|
+
|
39
|
+
# This method yields a <tt>Ruport::Config</tt> object, allowing you to
|
40
|
+
# set the configuration options for your application.
|
41
|
+
#
|
data/lib/ruport.rb~
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# ruport.rb : Ruby Reports top level module
|
2
|
+
#
|
3
|
+
# Author: Gregory T. Brown (gregory.t.brown at gmail dot com)
|
4
|
+
#
|
5
|
+
# Copyright (c) 2006, All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. You may modify and redistribute this freely under
|
8
|
+
# your choice of the GNU General Public License or the Ruby License.
|
9
|
+
#
|
10
|
+
# See LICENSE and COPYING for details
|
11
|
+
#
|
12
|
+
|
13
|
+
module Ruport
|
14
|
+
|
15
|
+
VERSION = "0.7.99"
|
16
|
+
|
17
|
+
#
|
18
|
+
# This method is Ruport's logging and error interface. It can generate
|
19
|
+
# warnings or raise fatal errors, logging +message+ to the file defined by
|
20
|
+
# <tt>Config::log_file</tt>.
|
21
|
+
#
|
22
|
+
# You can configure the logging preferences with the +options+ hash.
|
23
|
+
# Available options are:
|
24
|
+
#
|
25
|
+
# <b><tt>:status</tt></b>:: Sets the severity level. This defaults to
|
26
|
+
# <tt>:warn</tt>, which will invoke
|
27
|
+
# <tt>Logger#warn</tt>. A status of
|
28
|
+
# <tt>:fatal</tt> will invoke
|
29
|
+
# <tt>Logger#fatal</tt> and raise an exception.
|
30
|
+
# <b><tt>:output</tt></b>:: Optional 2nd output. By default, <tt>log()</tt>
|
31
|
+
# will print warnings to <tt>$stderr</tt> in
|
32
|
+
# addition to <tt>Config::log_file</tt>. You
|
33
|
+
# can redirect this to any I/O object with this
|
34
|
+
# option.
|
35
|
+
# <b><tt>:level</tt></b>:: Set this to <tt>:log_only</tt> to disable
|
36
|
+
# secondary output. If you want to globally
|
37
|
+
# override this setting for all calls to
|
38
|
+
# <tt>log()</tt> (which can be useful for
|
39
|
+
# debugging), you can set
|
40
|
+
# <tt>Config.debug_mode</tt>.
|
41
|
+
# <b><tt>:exception</tt></b>:: The +Exception+ to throw on failure. This
|
42
|
+
# defaults to +RunTimeError+.
|
43
|
+
#
|
44
|
+
def self.log(message, options={})
|
45
|
+
options = {:status => :warn, :output => $stderr}.merge(options)
|
46
|
+
options[:output].puts "[!!] #{message}" unless
|
47
|
+
options[:level].eql?(:log_only) and not Ruport::Config.debug_mode?
|
48
|
+
Ruport::Config::logger.send(options[:status],message) if Config.logger
|
49
|
+
if options[:status].eql? :fatal
|
50
|
+
raise(options[:raises] || RuntimeError, message)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
#
|
54
|
+
# This method yields a <tt>Ruport::Config</tt> object, allowing you to
|
55
|
+
# set the configuration options for your application.
|
56
|
+
#
|
57
|
+
# Example:
|
58
|
+
#
|
59
|
+
# Ruport.configure do |c|
|
60
|
+
#
|
61
|
+
# c.source :default,
|
62
|
+
# :dsn => "dbi:mysql:foo",
|
63
|
+
# :user => "clyde",
|
64
|
+
# :password => "pman"
|
65
|
+
#
|
66
|
+
# c.mailer :default,
|
67
|
+
# :host => "mail.example.com",
|
68
|
+
# :address => "inky@example.com"
|
69
|
+
#
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
def self.configure(&block)
|
73
|
+
block.call(Ruport::Config)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
require "ruport/attempt"
|
78
|
+
require "ruport/config"
|
79
|
+
require "ruport/data"
|
80
|
+
require "ruport/report"
|
81
|
+
require "ruport/format"
|
82
|
+
require "ruport/query"
|
83
|
+
require "ruport/mailer"
|
84
|
+
require "ruport/layout"
|
85
|
+
require "ruport/renderer"
|