reportbuilder 1.4.0 → 1.4.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.tar.gz.sig +0 -0
- data/History.txt +7 -0
- data/README.txt +7 -2
- data/Rakefile +0 -2
- data/lib/reportbuilder.rb +14 -6
- data/lib/reportbuilder/builder.rb +4 -4
- data/lib/reportbuilder/builder/pdf.rb +10 -2
- data/lib/reportbuilder/section.rb +1 -1
- data/lib/reportbuilder/table/pdfbuilder.rb +13 -7
- data/test/helper_test.rb +1 -1
- data/test/test_graph.rb +1 -1
- data/test/test_graph_html_flot.rb +1 -1
- data/test/test_graph_html_jqplot.rb +1 -1
- data/test/test_html.rb +1 -2
- data/test/test_image.rb +1 -1
- data/test/test_reportbuilder.rb +6 -3
- data/test/test_section.rb +1 -1
- data/test/test_table.rb +1 -2
- metadata +10 -35
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
=== 1.4.1 / 2011-02-03
|
2
|
+
* Add generic ReportBuilder#save method, to save according to extension
|
3
|
+
* Better titles layout on PDF.
|
4
|
+
* Pages could be numbered on PDF
|
5
|
+
* Small fixed on docs
|
6
|
+
* Test works on Ruby 1.9.3
|
7
|
+
|
1
8
|
=== 1.4.0 / 2010-11-26
|
2
9
|
* Basic support for pdf creation, using Prawn. SVG insertion could be realized using Prawn-svg (as vectors) or Rmagick (as bitmap)
|
3
10
|
* Added SimpleCov support
|
data/README.txt
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
Report Abstract Interface. Creates text, html and rtf output, based on a common framework.
|
7
|
+
Report Abstract Interface. Creates text, html, pdf and rtf output, based on a common framework.
|
8
8
|
|
9
9
|
== FEATURES
|
10
10
|
|
@@ -62,8 +62,13 @@ http://github.com/clbustos/reportbuilder
|
|
62
62
|
* RMagick, only to generate text output of images (see examples/image.rb)
|
63
63
|
|
64
64
|
== INSTALL:
|
65
|
+
With RVM
|
65
66
|
|
66
|
-
|
67
|
+
$ gem install reportbuilder
|
68
|
+
|
69
|
+
without RVM
|
70
|
+
|
71
|
+
$ sudo gem install reportbuilder
|
67
72
|
|
68
73
|
== LICENSE:
|
69
74
|
|
data/Rakefile
CHANGED
data/lib/reportbuilder.rb
CHANGED
@@ -5,7 +5,7 @@ require 'reportbuilder/image'
|
|
5
5
|
require 'reportbuilder/graph'
|
6
6
|
|
7
7
|
# = Report Abstract Interface.
|
8
|
-
# Creates text, html and rtf output, based on a common framework.
|
8
|
+
# Creates text, html,pdf and rtf output, based on a common framework.
|
9
9
|
#
|
10
10
|
# == Use
|
11
11
|
#
|
@@ -52,7 +52,7 @@ class ReportBuilder
|
|
52
52
|
# Doesn't print a title if set to true
|
53
53
|
attr_accessor :no_title
|
54
54
|
# ReportBuilder version
|
55
|
-
VERSION = '1.4.
|
55
|
+
VERSION = '1.4.1'
|
56
56
|
DATA_DIR=File.dirname(__FILE__)+"/../data"
|
57
57
|
FormatNotFound=Class.new(Exception)
|
58
58
|
# Available formats
|
@@ -76,11 +76,9 @@ class ReportBuilder
|
|
76
76
|
# * &block: block executed inside builder
|
77
77
|
def self.generate(options=Hash.new, &block)
|
78
78
|
options[:filename]||=nil
|
79
|
+
options[:format]||=self.get_format_from_filename(options[:filename]) if options[:filename]
|
79
80
|
options[:format]||="text"
|
80
81
|
|
81
|
-
if options[:filename] and options[:filename]=~/\.(\w+?)$/
|
82
|
-
options[:format]=$1
|
83
|
-
end
|
84
82
|
file=options.delete(:filename)
|
85
83
|
format=options.delete(:format)
|
86
84
|
rb=ReportBuilder.new(options)
|
@@ -88,7 +86,7 @@ class ReportBuilder
|
|
88
86
|
begin
|
89
87
|
builder=builder_for(format).new(rb, options)
|
90
88
|
rescue NameError => e
|
91
|
-
raise FormatNotFound.new(e)
|
89
|
+
raise ReportBuilder::FormatNotFound.new(e)
|
92
90
|
end
|
93
91
|
builder.parse
|
94
92
|
out=builder.out
|
@@ -100,11 +98,17 @@ class ReportBuilder
|
|
100
98
|
out
|
101
99
|
end
|
102
100
|
end
|
101
|
+
def self.get_format_from_filename(filename)
|
102
|
+
filename=~/\.(\w+?)$/
|
103
|
+
$1
|
104
|
+
end
|
103
105
|
# Create a new Report
|
104
106
|
def initialize(options=Hash.new, &block)
|
105
107
|
options[:name]||="Report "+Time.new.to_s
|
108
|
+
|
106
109
|
@no_title=options.delete :no_title
|
107
110
|
@name=options.delete :name
|
111
|
+
@name=@name.to_s
|
108
112
|
@options=options
|
109
113
|
@elements=Array.new
|
110
114
|
add(block) if block
|
@@ -134,6 +138,10 @@ class ReportBuilder
|
|
134
138
|
gen.parse
|
135
139
|
gen.out
|
136
140
|
end
|
141
|
+
def save(filename)
|
142
|
+
format=(self.class).get_format_from_filename(filename)
|
143
|
+
send("save_#{format}", filename)
|
144
|
+
end
|
137
145
|
# Save a rtf file
|
138
146
|
def save_rtf(filename)
|
139
147
|
gen = Builder::Rtf.new(self,@options)
|
@@ -59,15 +59,16 @@ class ReportBuilder
|
|
59
59
|
end
|
60
60
|
|
61
61
|
# Parse one object, using this workflow
|
62
|
-
# * If is a block, evaluate it
|
63
|
-
# * Use #report_building_CODE, where CODE is one of the codes defined by
|
62
|
+
# * If is a block, evaluate it in the context of the builder
|
63
|
+
# * Use method #report_building_CODE, where CODE is one of the codes defined by
|
64
|
+
# ReportBuilder::Builder.code
|
64
65
|
# * Use #report_building
|
65
66
|
# * Use #to_s
|
66
67
|
def parse_element(element)
|
67
68
|
methods=self.class.code.map {|m| ("report_building_"+m).intern}
|
68
69
|
|
69
70
|
if element.is_a? Proc
|
70
|
-
element.arity<1 ? instance_eval(&element) : element.call(self)
|
71
|
+
element.arity < 1 ? instance_eval(&element) : element.call(self)
|
71
72
|
elsif method=methods.find {|m| element.respond_to? m}
|
72
73
|
element.send(method, self)
|
73
74
|
elsif element.respond_to? :report_building
|
@@ -127,7 +128,6 @@ class ReportBuilder
|
|
127
128
|
@toc.push([anchor, name, parse_level])
|
128
129
|
anchor
|
129
130
|
end
|
130
|
-
|
131
131
|
# Add an entry for table index.
|
132
132
|
# Returns the name of the anchor
|
133
133
|
def table_entry(name)
|
@@ -17,6 +17,7 @@ class ReportBuilder
|
|
17
17
|
super
|
18
18
|
@pdf=Prawn::Document.new(options)
|
19
19
|
@pdf.font_size=@options[:font_size]
|
20
|
+
|
20
21
|
end
|
21
22
|
|
22
23
|
def self.code
|
@@ -36,13 +37,14 @@ class ReportBuilder
|
|
36
37
|
end
|
37
38
|
# Add a paragraph of text.
|
38
39
|
def text(t)
|
39
|
-
|
40
40
|
@pdf.text(t)
|
41
41
|
end
|
42
42
|
# Add a header of level <tt>level</tt> with text <tt>t</tt>
|
43
43
|
# Level works similar to h
|
44
44
|
def header(level, t)
|
45
|
-
@pdf.
|
45
|
+
@pdf.pad 5 do
|
46
|
+
@pdf.text t, {:size=>15-level*1.5,:align=>:center}
|
47
|
+
end
|
46
48
|
end
|
47
49
|
# Add preformatted text.
|
48
50
|
def preformatted(t)
|
@@ -50,12 +52,18 @@ class ReportBuilder
|
|
50
52
|
@pdf.text t
|
51
53
|
end
|
52
54
|
end
|
55
|
+
def at_end
|
56
|
+
@pdf.number_pages(@options[:number_pages], [@pdf.bounds.right - 50, 0] ) if @options[:numerate_pages]
|
57
|
+
|
58
|
+
end
|
53
59
|
# Returns pdf code for report
|
54
60
|
def out
|
61
|
+
at_end
|
55
62
|
@pdf.render
|
56
63
|
end
|
57
64
|
# Save pdf file
|
58
65
|
def save(filename)
|
66
|
+
at_end
|
59
67
|
@pdf.render_file(filename)
|
60
68
|
end
|
61
69
|
# Do nothing on this builder
|
@@ -11,16 +11,22 @@ class ReportBuilder
|
|
11
11
|
t=@element
|
12
12
|
@pdf=@builder.pdf
|
13
13
|
@rowspans=[]
|
14
|
-
|
14
|
+
if !t.nil? and t.name!=""
|
15
|
+
@pdf.pad_top 10 do
|
16
|
+
@pdf.text t.name, {:size=>12, :align=>:center}
|
17
|
+
end
|
18
|
+
end
|
15
19
|
return if t.header.size+t.rows.size==0
|
16
20
|
has_header=t.header.size>0
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
row(
|
21
|
+
@pdf.pad(10) do
|
22
|
+
if has_header
|
23
|
+
t_options=t.options.merge({:headers=>t.header, :align_headers=>:center})
|
24
|
+
@pdf.table(t.rows.map{|row| parse_row(row)}, t_options) do
|
25
|
+
row(0).style(:font_style => :bold, :background_color => 'cccccc')
|
26
|
+
end
|
27
|
+
else
|
28
|
+
@pdf.table(t.rows.map{|row| parse_row(row)}, t.options)
|
21
29
|
end
|
22
|
-
else
|
23
|
-
@pdf.table(t.rows.map{|row| parse_row(row)}, t.options)
|
24
30
|
end
|
25
31
|
end
|
26
32
|
# Parse a row
|
data/test/helper_test.rb
CHANGED
data/test/test_graph.rb
CHANGED
data/test/test_html.rb
CHANGED
data/test/test_image.rb
CHANGED
data/test/test_reportbuilder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require(File.dirname(__FILE__)+"/helper_test.rb")
|
1
|
+
require(File.expand_path(File.dirname(__FILE__)+"/helper_test.rb"))
|
2
2
|
class TestReportbuilder < MiniTest::Unit::TestCase
|
3
3
|
def setup
|
4
4
|
@datadir=File.dirname(__FILE__)+"/../data"
|
@@ -89,24 +89,27 @@ class TestReportbuilder < MiniTest::Unit::TestCase
|
|
89
89
|
|
90
90
|
def test_generate
|
91
91
|
txt_file=Tempfile.new("test.txt")
|
92
|
+
|
92
93
|
ReportBuilder.generate(:name=>"Test", :filename=>txt_file.path) do
|
93
94
|
text("hola")
|
94
95
|
end
|
95
96
|
|
96
|
-
text=ReportBuilder.generate(:format=>:text
|
97
|
+
text=ReportBuilder.generate(:format=>:text, :name=>"Test") do
|
97
98
|
text("hola")
|
98
99
|
end
|
100
|
+
|
99
101
|
assert_match(/^Test\nhola$/,text)
|
100
102
|
assert_equal(text, File.read(txt_file.path))
|
103
|
+
|
101
104
|
html_file=Tempfile.new("test.html")
|
102
105
|
html=ReportBuilder.generate(:name=>"Test", :format=>:html) do
|
103
106
|
text("hola")
|
104
107
|
end
|
108
|
+
|
105
109
|
ReportBuilder.generate(:name=>"Test", :filename=>html_file.path,:format=>:html) do
|
106
110
|
text("hola")
|
107
111
|
end
|
108
112
|
|
109
113
|
assert_equal(html,File.read(html_file.path))
|
110
|
-
|
111
114
|
end
|
112
115
|
end
|
data/test/test_section.rb
CHANGED
data/test/test_table.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reportbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 7
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 1
|
8
7
|
- 4
|
9
|
-
-
|
10
|
-
version: 1.4.
|
8
|
+
- 1
|
9
|
+
version: 1.4.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Claudio Bustos
|
@@ -36,7 +35,7 @@ cert_chain:
|
|
36
35
|
rpP0jjs0
|
37
36
|
-----END CERTIFICATE-----
|
38
37
|
|
39
|
-
date:
|
38
|
+
date: 2011-02-03 00:00:00 -03:00
|
40
39
|
default_executable:
|
41
40
|
dependencies:
|
42
41
|
- !ruby/object:Gem::Dependency
|
@@ -47,7 +46,6 @@ dependencies:
|
|
47
46
|
requirements:
|
48
47
|
- - ~>
|
49
48
|
- !ruby/object:Gem::Version
|
50
|
-
hash: 15
|
51
49
|
segments:
|
52
50
|
- 0
|
53
51
|
- 4
|
@@ -63,7 +61,6 @@ dependencies:
|
|
63
61
|
requirements:
|
64
62
|
- - ~>
|
65
63
|
- !ruby/object:Gem::Version
|
66
|
-
hash: 11
|
67
64
|
segments:
|
68
65
|
- 1
|
69
66
|
- 2
|
@@ -78,7 +75,6 @@ dependencies:
|
|
78
75
|
requirements:
|
79
76
|
- - ~>
|
80
77
|
- !ruby/object:Gem::Version
|
81
|
-
hash: 55
|
82
78
|
segments:
|
83
79
|
- 0
|
84
80
|
- 8
|
@@ -94,7 +90,6 @@ dependencies:
|
|
94
90
|
requirements:
|
95
91
|
- - ~>
|
96
92
|
- !ruby/object:Gem::Version
|
97
|
-
hash: 57
|
98
93
|
segments:
|
99
94
|
- 0
|
100
95
|
- 9
|
@@ -102,54 +97,36 @@ dependencies:
|
|
102
97
|
version: 0.9.1
|
103
98
|
type: :runtime
|
104
99
|
version_requirements: *id004
|
105
|
-
- !ruby/object:Gem::Dependency
|
106
|
-
name: rubyforge
|
107
|
-
prerelease: false
|
108
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
109
|
-
none: false
|
110
|
-
requirements:
|
111
|
-
- - ">="
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
hash: 7
|
114
|
-
segments:
|
115
|
-
- 2
|
116
|
-
- 0
|
117
|
-
- 4
|
118
|
-
version: 2.0.4
|
119
|
-
type: :development
|
120
|
-
version_requirements: *id005
|
121
100
|
- !ruby/object:Gem::Dependency
|
122
101
|
name: nokogiri
|
123
102
|
prerelease: false
|
124
|
-
requirement: &
|
103
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
125
104
|
none: false
|
126
105
|
requirements:
|
127
106
|
- - ~>
|
128
107
|
- !ruby/object:Gem::Version
|
129
|
-
hash: 7
|
130
108
|
segments:
|
131
109
|
- 1
|
132
110
|
- 4
|
133
111
|
version: "1.4"
|
134
112
|
type: :development
|
135
|
-
version_requirements: *
|
113
|
+
version_requirements: *id005
|
136
114
|
- !ruby/object:Gem::Dependency
|
137
115
|
name: hoe
|
138
116
|
prerelease: false
|
139
|
-
requirement: &
|
117
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
140
118
|
none: false
|
141
119
|
requirements:
|
142
120
|
- - ">="
|
143
121
|
- !ruby/object:Gem::Version
|
144
|
-
hash: 19
|
145
122
|
segments:
|
146
123
|
- 2
|
147
|
-
-
|
124
|
+
- 8
|
148
125
|
- 0
|
149
|
-
version: 2.
|
126
|
+
version: 2.8.0
|
150
127
|
type: :development
|
151
|
-
version_requirements: *
|
152
|
-
description: Report Abstract Interface. Creates text, html and rtf output, based on a common framework.
|
128
|
+
version_requirements: *id006
|
129
|
+
description: Report Abstract Interface. Creates text, html, pdf and rtf output, based on a common framework.
|
153
130
|
email:
|
154
131
|
- clbustos_at_gmail.com
|
155
132
|
executables:
|
@@ -585,7 +562,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
585
562
|
requirements:
|
586
563
|
- - ">="
|
587
564
|
- !ruby/object:Gem::Version
|
588
|
-
hash: 3
|
589
565
|
segments:
|
590
566
|
- 0
|
591
567
|
version: "0"
|
@@ -594,7 +570,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
594
570
|
requirements:
|
595
571
|
- - ">="
|
596
572
|
- !ruby/object:Gem::Version
|
597
|
-
hash: 3
|
598
573
|
segments:
|
599
574
|
- 0
|
600
575
|
version: "0"
|
metadata.gz.sig
CHANGED
Binary file
|