reportbuilder 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -0
- data/README.txt +38 -10
- data/Rakefile +1 -1
- data/lib/reportbuilder.rb +93 -31
- data/lib/reportbuilder/generator.rb +57 -18
- data/lib/reportbuilder/generator/html.rb +46 -55
- data/lib/reportbuilder/generator/text.rb +7 -8
- data/lib/reportbuilder/image.rb +22 -14
- data/lib/reportbuilder/section.rb +19 -13
- data/lib/reportbuilder/table.rb +49 -42
- data/lib/reportbuilder/table/htmlgenerator.rb +35 -35
- data/lib/reportbuilder/table/textgenerator.rb +16 -14
- data/test/test_html.rb +43 -22
- data/test/test_image.rb +11 -10
- data/test/test_reportbuilder.rb +70 -11
- data/test/test_section.rb +60 -44
- data/test/test_table.rb +52 -20
- metadata +63 -11
data/test/test_html.rb
CHANGED
@@ -3,45 +3,66 @@ $:.unshift(File.dirname(__FILE__)+"/../lib")
|
|
3
3
|
require "reportbuilder"
|
4
4
|
require 'fileutils'
|
5
5
|
require 'tmpdir'
|
6
|
+
require 'hpricot'
|
7
|
+
require 'tempfile'
|
6
8
|
class TestReportbuilderHtml < Test::Unit::TestCase
|
7
9
|
def setup
|
8
10
|
@tmpdir=Dir::mktmpdir
|
9
|
-
@
|
11
|
+
@title="Test #{rand(100)}"
|
12
|
+
@rp=ReportBuilder.new(:name=>@title, :directory=>@tmpdir)
|
10
13
|
@datadir=File.dirname(__FILE__)+"/../data"
|
11
14
|
end
|
12
15
|
def teardown
|
13
|
-
|
16
|
+
FileUtils.remove_entry_secure @tmpdir
|
17
|
+
end
|
18
|
+
def test_empty_document
|
19
|
+
doc=Hpricot(@rp.to_html)
|
20
|
+
assert_equal(@title, doc.search("head/title").inner_html)
|
21
|
+
assert_equal(@title, doc.search("body/h1").inner_html)
|
22
|
+
assert_match(/^\s+$/, doc.search("body").inner_html.gsub(/<h1>.+<\/h1>/,""))
|
23
|
+
|
24
|
+
end
|
25
|
+
def test_generate
|
26
|
+
html=ReportBuilder.generate(:format=>:html, :name=>@title, :directory=>@tmpdir) do
|
27
|
+
text("hola")
|
28
|
+
end
|
29
|
+
doc=Hpricot(html)
|
30
|
+
assert_equal(@title, doc.search("head/title").inner_html)
|
31
|
+
assert_equal(@title, doc.search("body/h1").inner_html)
|
32
|
+
assert_equal("hola", doc.search("body/p").inner_html)
|
33
|
+
|
14
34
|
end
|
15
35
|
def test_include_js
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
36
|
+
mock = ""
|
37
|
+
eval(" class << mock
|
38
|
+
def report_building_html(generator)
|
39
|
+
generator.js('"+@datadir+"/reportbuilder.js')
|
20
40
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
41
|
+
end ")
|
42
|
+
@rp.add(mock)
|
43
|
+
assert_match(/script.+js\/reportbuilder.js/, @rp.to_html)
|
44
|
+
assert(File.exists? @tmpdir+"/js/reportbuilder.js")
|
25
45
|
end
|
26
46
|
def test_save_html
|
47
|
+
tf=Tempfile.new("sdsd.html")
|
27
48
|
exp=@rp.to_html
|
28
|
-
@rp.save_html(
|
49
|
+
@rp.save_html(tf.path)
|
29
50
|
obt=""
|
30
|
-
File.open(
|
51
|
+
File.open(tf.path,"r") {|fp|
|
31
52
|
obt=fp.readlines(nil)[0]
|
32
53
|
}
|
33
54
|
assert_equal(exp,obt)
|
34
55
|
end
|
35
56
|
def test_include_css
|
36
57
|
mock_element = ""
|
37
|
-
eval(" class << mock_element
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
|
58
|
+
eval(" class << mock_element
|
59
|
+
def report_building_html(generator)
|
60
|
+
generator.css('"+@datadir+"/reportbuilder.css')
|
61
|
+
end
|
62
|
+
end ")
|
63
|
+
@rp.add(mock_element)
|
64
|
+
assert_match(/link rel='stylesheet'.+css\/reportbuilder.css/, @rp.to_html)
|
65
|
+
assert(File.exists? @tmpdir+"/css/reportbuilder.css")
|
66
|
+
end
|
67
|
+
|
47
68
|
end
|
data/test/test_image.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
require "test/unit"
|
2
1
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'test/unit'
|
3
|
+
require 'tmpdir'
|
3
4
|
require "reportbuilder"
|
4
|
-
|
5
5
|
class TestReportbuilderImage < Test::Unit::TestCase
|
6
6
|
def setup
|
7
7
|
@tmpdir=Dir::mktmpdir
|
8
|
-
@rp=ReportBuilder.new(
|
8
|
+
@rp=ReportBuilder.new(:no_name=>true, :directory=>@tmpdir)
|
9
9
|
@datadir=File.dirname(__FILE__)+"/../data"
|
10
|
-
@rp.add(
|
10
|
+
@rp.add(ReportBuilder::Image.new(@datadir+"/sheep.jpg"))
|
11
11
|
end
|
12
12
|
def teardown
|
13
|
-
|
13
|
+
FileUtils.remove_entry_secure @tmpdir
|
14
14
|
end
|
15
15
|
def test_image_text
|
16
16
|
expected= <<-HERE
|
17
|
-
|
17
|
+
Test
|
18
18
|
+--------------------------------+
|
19
19
|
| *********#** |
|
20
20
|
| ****#********# * |
|
@@ -31,12 +31,13 @@ Report: Test
|
|
31
31
|
| ****#** *#***** |
|
32
32
|
| **#***** |
|
33
33
|
+--------------------------------+
|
34
|
-
HERE
|
35
|
-
|
36
|
-
|
34
|
+
HERE
|
35
|
+
real=@rp.to_s
|
36
|
+
#expected=expected.gsub(/[^ ]/,'-')
|
37
|
+
assert_match(/[^\s]{12}$/,real)
|
37
38
|
end
|
38
39
|
def test_image_html
|
39
40
|
assert_match(/img src='images\/sheep.jpg'/, @rp.to_html)
|
40
41
|
end
|
41
|
-
|
42
|
+
|
42
43
|
end
|
data/test/test_reportbuilder.rb
CHANGED
@@ -1,22 +1,81 @@
|
|
1
1
|
require "test/unit"
|
2
2
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
3
|
require "reportbuilder"
|
4
|
-
|
4
|
+
require 'hpricot'
|
5
|
+
require 'tempfile'
|
5
6
|
class TestReportbuilder < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@datadir=File.dirname(__FILE__)+"/../data"
|
9
|
+
@image=@datadir+"/sheep.jpg"
|
10
|
+
end
|
6
11
|
# adding basic object
|
7
12
|
def test_basic_generators
|
8
13
|
# basic_classes = Array,String,Integer, Float,Time,Hash
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
args=[]
|
15
|
+
args << [1,2,3]
|
16
|
+
args << "1,2,3"
|
17
|
+
args << 1
|
18
|
+
args << 1.0
|
19
|
+
args << 1.quo(2)
|
20
|
+
args << Time.new
|
21
|
+
args << {'a'=>1,'b'=>2}
|
22
|
+
rb=ReportBuilder.new
|
23
|
+
args.each do |a|
|
24
|
+
assert_nothing_raised do
|
25
|
+
rb.add(a)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
def test_using_block
|
16
30
|
rb=ReportBuilder.new
|
17
|
-
|
18
|
-
|
19
|
-
|
31
|
+
a=lambda {|g|
|
32
|
+
g.text "para"
|
33
|
+
g.preformatted "pre"
|
34
|
+
g.table(:header=>%w{th1 th2}) {row([1,2]); row([1,3])}
|
35
|
+
g.image @image
|
36
|
+
|
37
|
+
}
|
38
|
+
rb.add(a)
|
39
|
+
out=rb.to_text
|
40
|
+
["para","pre","th1","th2"].each do |t|
|
41
|
+
assert_match(/#{t}/,out)
|
42
|
+
end
|
43
|
+
|
44
|
+
rb=ReportBuilder.new {|g|
|
45
|
+
g.text "para"
|
46
|
+
g.preformatted "pre"
|
47
|
+
g.table(:header=>%w{th1 th2}) {row([1,2]); row([1,3])}
|
48
|
+
g.image @image
|
49
|
+
}
|
50
|
+
|
51
|
+
out=rb.to_text
|
52
|
+
|
53
|
+
["para","pre","th1","th2"].each do |t|
|
54
|
+
assert_match(/#{t}/,out)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
def test_empty
|
58
|
+
rp=ReportBuilder.new
|
59
|
+
assert_match(/^Report.+\n$/,rp.to_s)
|
60
|
+
rp=ReportBuilder.new(:no_title=>true)
|
61
|
+
assert_equal("",rp.to_s)
|
62
|
+
rp.add("hola")
|
63
|
+
assert_equal("hola\n",rp.to_s)
|
64
|
+
end
|
65
|
+
def test_generate
|
66
|
+
res=ReportBuilder.generate(:format=>:text,:name=>"Test") do
|
67
|
+
text("hola")
|
68
|
+
end
|
69
|
+
assert_match(/^Test\nhola$/,res)
|
70
|
+
html_file=Tempfile.new("test.html")
|
71
|
+
html=ReportBuilder.generate(:name=>"Test", :format=>:html) do
|
72
|
+
text("hola")
|
73
|
+
end
|
74
|
+
ReportBuilder.generate(:name=>"Test", :filename=>html_file,:format=>:html) do
|
75
|
+
text("hola")
|
20
76
|
end
|
77
|
+
|
78
|
+
assert_equal(html,File.read(html_file.path))
|
79
|
+
|
21
80
|
end
|
22
81
|
end
|
data/test/test_section.rb
CHANGED
@@ -1,64 +1,80 @@
|
|
1
1
|
require "test/unit"
|
2
2
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
3
|
require "reportbuilder"
|
4
|
+
require 'hpricot'
|
4
5
|
|
5
6
|
class TestReportbuilderSection < Test::Unit::TestCase
|
6
7
|
def setup
|
7
|
-
@
|
8
|
-
|
8
|
+
@name="Test Section"
|
9
|
+
@rp=ReportBuilder.new(:name=>"Test Section")
|
10
|
+
s1=ReportBuilder::Section.new(:name=>"Section 1")
|
9
11
|
@rp.add s1
|
10
12
|
s1.add("Texto 1")
|
11
13
|
s1.add(2)
|
12
|
-
s11
|
14
|
+
s11=ReportBuilder::Section.new(:name=>"Section 1.1")
|
13
15
|
s1.add s11
|
14
|
-
s111
|
16
|
+
s111=ReportBuilder::Section.new(:name=>"Section 1.1.1")
|
15
17
|
s11.add s111
|
16
18
|
s1.add("Texto 1.1")
|
17
|
-
s2
|
19
|
+
s2=ReportBuilder::Section.new(:name=>"Section 2")
|
18
20
|
@rp.add s2
|
19
21
|
end
|
22
|
+
def test_section_generate
|
23
|
+
text=ReportBuilder.generate(:name=>@name,:format=>:text) {
|
24
|
+
section(:name=>"Section 1") {
|
25
|
+
text("Texto 1")
|
26
|
+
text("2")
|
27
|
+
section(:name=>"Section 1.1") {
|
28
|
+
section(:name=>"Section 1.1.1") {
|
29
|
+
}
|
30
|
+
}
|
31
|
+
text("Texto 1.1")
|
32
|
+
}
|
33
|
+
section(:name=>"Section 2")
|
34
|
+
}
|
35
|
+
assert_equal(@rp.to_text,text)
|
36
|
+
end
|
20
37
|
def test_section_text
|
21
38
|
expected= <<-HERE
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
assert_equal(expected, @rp.to_s)
|
39
|
+
Test Section
|
40
|
+
= Section 1
|
41
|
+
Texto 1
|
42
|
+
2
|
43
|
+
== Section 1.1
|
44
|
+
=== Section 1.1.1
|
45
|
+
Texto 1.1
|
46
|
+
= Section 2
|
47
|
+
HERE
|
48
|
+
assert_equal(expected, @rp.to_s)
|
33
49
|
end
|
34
50
|
def test_section_html
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
real=@rp.to_html
|
52
|
+
#puts real
|
53
|
+
doc = Hpricot(real)
|
54
|
+
# Sanity
|
55
|
+
assert_equal("Test Section", doc.search("head/title").inner_html)
|
56
|
+
# Test toc
|
57
|
+
base_ul=doc.search("/html/body/div[@id='toc']")
|
58
|
+
assert(base_ul!="")
|
59
|
+
#puts base_ul
|
60
|
+
[
|
61
|
+
["li/a[@href='#toc_1']","Section 1"],
|
62
|
+
["li/a[@href='#toc_2']","Section 1.1"],
|
63
|
+
["li/a[@href='#toc_3']","Section 1.1.1"],
|
64
|
+
["li/a[@href='#toc_4']","Section 2"]].each do |path, expected|
|
65
|
+
inner=base_ul.search(path).inner_html
|
66
|
+
assert_equal(expected, inner, "On #{path}")
|
67
|
+
end
|
68
|
+
|
69
|
+
[
|
70
|
+
["div[class='section']/h2", ["Section 1","Section 2"]],
|
71
|
+
["div[class='section']/h3",["Section 1.1"]],
|
72
|
+
["div[class='section']/h4",["Section 1.1.1"]]
|
73
|
+
].each do |path, expected|
|
74
|
+
base_ul.search(path).each do |el|
|
75
|
+
assert_equal(expected, el.inner_html, "On #{path} #{el}")
|
76
|
+
end
|
77
|
+
end
|
62
78
|
end
|
63
|
-
|
79
|
+
|
64
80
|
end
|
data/test/test_table.rb
CHANGED
@@ -1,40 +1,55 @@
|
|
1
1
|
require "test/unit"
|
2
2
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
3
|
require "reportbuilder"
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require 'reportbuilder/table/htmlgenerator'
|
5
|
+
require 'reportbuilder/table/textgenerator'
|
6
|
+
require 'hpricot'
|
6
7
|
|
7
8
|
class TestReportbuilderTable < Test::Unit::TestCase
|
8
9
|
def setup
|
9
10
|
super
|
10
|
-
|
11
|
-
|
12
|
-
table.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
@name="Table Test"
|
12
|
+
@header=%w{a bb ccc dddd eeee fff gggg hh i}
|
13
|
+
table=ReportBuilder::Table.new(:name=>"Table Test", :header=>@header) do
|
14
|
+
row(["a","b","c","d","e","f","g","h","i"])
|
15
|
+
row([colspan("a",2),nil,"c",rowspan("d",2),"e","f","g","h","i"])
|
16
|
+
row([colspan("a",3),nil,nil,nil,"e","f","g","h","i"])
|
17
|
+
row([colspan("a",4),nil,nil,nil,"e","f","g","h","i"])
|
18
|
+
row([colspan("a",5),nil,nil,nil,nil,colspan("f",3),nil,nil,"i"])
|
19
|
+
row([colspan("a",6),nil,nil,nil,nil,nil,"g","h","i"])
|
20
|
+
end
|
18
21
|
|
22
|
+
@table=table
|
23
|
+
|
19
24
|
@mock_generator = ""
|
20
25
|
class << @mock_generator
|
21
|
-
def
|
26
|
+
def preformatted(t)
|
22
27
|
replace(t)
|
23
28
|
end
|
24
|
-
def
|
29
|
+
def text(t)
|
25
30
|
replace(t)
|
26
31
|
end
|
27
|
-
def
|
32
|
+
def table_entry(t)
|
28
33
|
"MOCK"
|
29
34
|
end
|
35
|
+
def html(t)
|
36
|
+
replace(t)
|
37
|
+
end
|
30
38
|
end
|
31
|
-
|
39
|
+
|
40
|
+
end
|
41
|
+
def test_empty_table
|
42
|
+
text=ReportBuilder.generate(:no_title=>true,:format=>:text) do
|
43
|
+
table(:name=>"Table")
|
44
|
+
end
|
45
|
+
assert_match(/^Table\s+$/ , text)
|
32
46
|
end
|
33
47
|
def test_table_text
|
34
|
-
|
48
|
+
|
35
49
|
tg=ReportBuilder::Table::TextGenerator.new(@mock_generator,@table)
|
36
50
|
tg.generate
|
37
|
-
expected=
|
51
|
+
expected= <<-HEREDOC
|
52
|
+
Table Test
|
38
53
|
----------------------------------------------------
|
39
54
|
| a | bb | ccc | dddd | eeee | fff | gggg | hh | i |
|
40
55
|
----------------------------------------------------
|
@@ -47,14 +62,15 @@ class TestReportbuilderTable < Test::Unit::TestCase
|
|
47
62
|
----------------------------------------------------
|
48
63
|
HEREDOC
|
49
64
|
|
50
|
-
assert_equal(expected,@mock_generator)
|
65
|
+
assert_equal(expected,@mock_generator)
|
51
66
|
|
52
67
|
end
|
53
68
|
def test_table_html
|
54
|
-
|
69
|
+
|
55
70
|
tg=ReportBuilder::Table::HtmlGenerator.new(@mock_generator,@table)
|
56
71
|
tg.generate
|
57
|
-
|
72
|
+
|
73
|
+
expected= <<HEREDOC
|
58
74
|
<a name='MOCK'> </a>
|
59
75
|
<table>
|
60
76
|
<thead>
|
@@ -82,6 +98,22 @@ assert_equal(expected,@mock_generator)
|
|
82
98
|
</table>
|
83
99
|
HEREDOC
|
84
100
|
|
85
|
-
|
101
|
+
doc=Hpricot(@mock_generator)
|
102
|
+
|
103
|
+
assert(doc.search("a[@name='MOCK']")!="")
|
104
|
+
assert(doc.search("table"!=""))
|
105
|
+
assert_equal(@header, doc.search("table/thead/th").map {|m| m.inner_html} )
|
106
|
+
[[2,%w{a}],
|
107
|
+
[3,%w{a f}],
|
108
|
+
[4,%w{a}],
|
109
|
+
[5,%w{a}],
|
110
|
+
[6,%w{a}],
|
111
|
+
|
112
|
+
].each do |m,exp|
|
113
|
+
real=doc.search("table/tbody/tr/td[@colspan='#{m}']").map {|x| x.inner_html}
|
114
|
+
assert_equal(exp, real, "On table/tbody/tr/td[@colspan='#{m}']"
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
86
118
|
end
|
87
119
|
end
|