reportbuilder 1.1.0 → 1.1.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/History.txt +8 -2
- data/Manifest.txt +1 -1
- data/README.txt +4 -1
- data/Rakefile +3 -2
- data/examples/{rtf.rb → create_rtf.rb} +2 -0
- data/examples/generic_interface.rb +2 -1
- data/examples/images.rb +1 -1
- data/examples/test.rtf +78 -95
- data/lib/reportbuilder.rb +4 -5
- data/lib/reportbuilder/generator.rb +3 -2
- data/lib/reportbuilder/generator/rtf.rb +14 -3
- data/lib/reportbuilder/image.rb +4 -1
- data/lib/reportbuilder/section.rb +1 -1
- data/lib/reportbuilder/table/rtfgenerator.rb +5 -0
- data/test/test_html.rb +12 -11
- data/test/test_image.rb +6 -3
- data/test/test_reportbuilder.rb +16 -5
- data/test/test_section.rb +16 -15
- data/test/test_table.rb +10 -8
- metadata +29 -54
data/History.txt
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
-
=== 1.1.
|
1
|
+
=== 1.1.1 / 2010-03-24
|
2
|
+
* Test suite replaces Test::Unit for Test::MiniUnit and Hpricot for Nokogiri
|
3
|
+
* Bug fix: rtf generator doesn't accept a ReportBuilder::Image object
|
4
|
+
* Improved output for rtf on tables and headers of sections
|
5
|
+
* More documentation
|
6
|
+
|
7
|
+
=== 1.1.0 / 2010-03-23
|
2
8
|
* Added rtf support
|
3
|
-
=== 1.0.0 /
|
9
|
+
=== 1.0.0 / 2010-03-22
|
4
10
|
Change of API:
|
5
11
|
* Deleted "add_" before methods
|
6
12
|
* Massive use of block after functions, to allow easy creation of reports
|
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -16,7 +16,10 @@ Report Abstract Interface. Creates text, html and rtf output, based on a common
|
|
16
16
|
== SYNOPSIS:
|
17
17
|
|
18
18
|
* Using generic ReportBuilder#add, every object will be parsed
|
19
|
-
using
|
19
|
+
using methods
|
20
|
+
* report_building_FORMAT
|
21
|
+
* report_building or
|
22
|
+
* to_s
|
20
23
|
|
21
24
|
require "reportbuilder"
|
22
25
|
rb=ReportBuilder.new
|
data/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
# -*- ruby -*-
|
3
3
|
$:.unshift(File.dirname(__FILE__)+"/lib")
|
4
|
+
|
4
5
|
require 'rubygems'
|
5
6
|
require 'hoe'
|
6
7
|
require 'reportbuilder'
|
@@ -10,8 +11,8 @@ Hoe.spec 'reportbuilder' do
|
|
10
11
|
self.version=ReportBuilder::VERSION
|
11
12
|
self.rubyforge_name = 'ruby-statsample'
|
12
13
|
self.developer('Claudio Bustos', 'clbustos_at_gmail.com')
|
13
|
-
self.url = "http://rubyforge.org/
|
14
|
-
self.extra_deps << ["rtf","~>0.1"]
|
14
|
+
self.url = "http://ruby-statsample.rubyforge.org/reportbuilder/"
|
15
|
+
self.extra_deps << ["clbustos-rtf","~>0.2.1"]
|
15
16
|
self.extra_dev_deps << ["hpricot", "~>0.8"]
|
16
17
|
end
|
17
18
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
-
require "reportbuilder"
|
2
|
+
require "reportbuilder"
|
3
3
|
rb=ReportBuilder.new
|
4
4
|
rb.add(2) # Int#to_s used
|
5
5
|
section=ReportBuilder::Section.new(:name=>"Section 1")
|
@@ -11,6 +11,7 @@ table.row([2,"Peter"])
|
|
11
11
|
section.add(table) # Section is a container for other methods
|
12
12
|
rb.add(section) # table have a #report_building method
|
13
13
|
rb.add("Another text") # used directly
|
14
|
+
|
14
15
|
rb.name="Text output"
|
15
16
|
puts rb.to_text
|
16
17
|
rb.name="Html output"
|
data/examples/images.rb
CHANGED
data/examples/test.rtf
CHANGED
@@ -1,103 +1,86 @@
|
|
1
1
|
{\rtf1\ansi\deff0\deflang2057\plain\fs24\fet1
|
2
2
|
{\fonttbl
|
3
3
|
{\f0\froman Times New Roman;}
|
4
|
-
{\f1\fmodern Courier;}
|
5
4
|
}
|
6
5
|
{\info
|
7
|
-
{\createim\yr2010\mo3\dy23\
|
6
|
+
{\createim\yr2010\mo3\dy23\hr17\min51}
|
8
7
|
}
|
9
8
|
\paperw11907\paperh16840\margl1800\margr1800\margt1440\margb1440
|
10
|
-
{\
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
{\*\shppict{\pict\picw128\pich112\bliptag2303101\jpegblip
|
10
|
+
ffd8ffe000104a46494600010102001200120000ffdb004300050304040403050404040505050607
|
11
|
+
0c08070707070f0b0b090c110f1212110f111113161c1713141a1511111821181a1d1d1f1f1f1317
|
12
|
+
2224221e241c1e1f1effdb0043010505050706070e08080e1e1411141e1e1e1e1e1e1e1e1e1e1e1e
|
13
|
+
1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1effc0
|
14
|
+
0011080070008003012200021101031101ffc4001c00000105010101000000000000000000000002
|
15
|
+
03040506070801ffc4003b1000020103020403070204030900000000010203000411051206213151
|
16
|
+
134161071422718191a108b1233242521572c11633627382a2d1e1f0ffc4001a0100020301010000
|
17
|
+
00000000000000000003040001050206ffc400211100020201040301010000000000000000000102
|
18
|
+
1103041221311341512291ffda000c03010002110311003f00f65d1506f758d3ace7305cdc849000
|
19
|
+
4a852d8f9e0541838a34b91cabf8f08c6773a641f4f849aadc822c391ab48bca2a2da6a56177b45b
|
20
|
+
ddc4ecf9da9bb0c71ff09e7e552aace1a69d319bcbab7b3b769ee6558e3504927a9e59c01d49e5d0
|
21
|
+
73ac06adabde6a1339791d216e421563b401d33dcfad4be33b8925d69e163f040a1507cc024fcf9f
|
22
|
+
e055250272b746ae97028c54df6c53b339cbb16380324e7901803ed49a28a18d85145150b27e9bab
|
23
|
+
5f69e9e1db4a047bf79428082797d7cbbd6cf87f564d52d98edd93c7812ae3973e841ec707e5f93c
|
24
|
+
f6af3843528ac6ee64b860914a992e4742b923f19fae2bb849a7429a9c11941c92e4dcd15473f146
|
25
|
+
971b854f1e618cee44c01e9f111441c51a5c8e55fc784633b9d320fa7c24d1b72fa67783255ed2f2
|
26
|
+
8a66d2eed6ed37db4f1ca3009dad9233d323cbeb4f57409a6b866727d02c37ed31b291e6ac467d68
|
27
|
+
8f43d357ac05bfcce6afe78848bd70c3a1a88e8c870c3eb5c6d430b3cdaeca6bcd02ca543e08303f
|
28
|
+
910491f506a2a6b1abe8e5e0bc5f79054f84ce73cfbe7a91cfa1f4e95a1a8da85a457b6cd0ca3af3
|
29
|
+
53e6a7bd538fc091cb7c64e51998a0bed68dc5d4b29925450173c81f41e43cfea6ab1d591ca3a956
|
30
|
+
53820f506b67a0db1b5d3523618724b37cf3ff008c57cd4349b4bc6323a94908fe7538cfceb8d96a
|
31
|
+
c616a5464d3e8c5d1563368ba8a4bb041bc67932918348ff0009d47c5f0fdd5f39ebcb1f7e95c531
|
32
|
+
af243e9068ab16d175112ecf77cf3fe60c314e49a06a2ae15511c7f70718fcd4dacaf2c3e95556fa
|
33
|
+
468b25dac73cadb20604f2ea79f4ab6b0d0ad22850dca09651cd8e4e3ed5637332da5a349b3f8680
|
34
|
+
6428e83d2bb8c3db16c9a9bfcc0660d32c215c25ac67d5c6e3f9a71acacd976b5ac047fcb14ab5ba
|
35
|
+
b7ba19b79924f4079fda9ea22484dca57cb33dab6886222eb4edcac8776c04e411e6a6a4f0cebf34
|
36
|
+
b711d85f10c48db1ca4e0e7b367ae7a77cf7cd5bd46b9d1a1bb97c5f0da199482255ca907bfa9aad
|
37
|
+
b4ed04f2c651db93fa5dd040230464514d5e4deef6935c6ddde146cfb738ce067144134ad99ed4b5
|
38
|
+
fb4b7bf7b78e091d63255dc1c7c40f3001eddea35cf1242233eef0485fcb7e001f6359b766776776
|
39
|
+
2ccc72493924f7a4d2ee6cd88e971a4ace81067c08f7733b467ed4ceaf7f6fa569379a9de315b6b3
|
40
|
+
81e79881921114b37e01a9119cc6a479814d5cc56d770cf6570a92c724656589b9ee4604608ec798
|
41
|
+
fbd18cd6783b5ffd60fb48b8e247bcd1acf47b2d2964fe0d94b6e652c99e4247dc0938ebb76d7b1b
|
42
|
+
d8cf1d5b7b46f66da5717c36dee66ed184f016c88a54628e01f3195241ec4579df5efd16594fc48f
|
43
|
+
3e8dc6cf65a34921616f35978b342b9fe40fbc06f4240f2ce6bd2dc11c19a270870159f05e911cab
|
44
|
+
a65adbb400bbe64937125dd88fea66662718193cb02ace15fb382f16feb238474ae26974dd1f86af
|
45
|
+
f59d3e094c6f7eb72b10930705a3420ee5ec495cd77ff67dc5da2f1d708d871470fced3585ea164d
|
46
|
+
ebb5d1812191c79302083e5cb912306bc25c59fa51f6ada77134d61a1e996dace986522defd2f228
|
47
|
+
86ccf22eaec195b1d400467a135ecafd3d7b3d97d997b2ed3f85eeaee3bbbd577b8bb962cf866573
|
48
|
+
92173cf68181938ce33819c54226ef93a15337cbbeca74ef1b0fc531677f15dea17b6b082459b247
|
49
|
+
23f978854395fa2b21ff00abd2a4dc1c41213e4a7f6aa3b5d980ad3f0c6bae655b0bf669448d88e4
|
50
|
+
6e6413e47b8f5f2f974cbd14ba6d335f2638e48d33aa8000c0000f4a2a3697742f34e82e72a4c880
|
51
|
+
b60100374239fae6a4d346134d3a614d5ec3ef16735beedbe2c6c9bb19c646334ed15089d3b3963a
|
52
|
+
b23b23a956538208c107b5269fbf956e2fae274042c92b3807a804934c5287a05d726eb4a944da6d
|
53
|
+
bc80e731807e6391aa6e2799b4de20d0b53524473dc9d3ae467915941284fa891140ff003b77a7f8
|
54
|
+
46e77dac96cc7e28cee5f91ffdfef50bdabab0e00d52ea3ff7b64897b11ecf0baca3f294c45da323
|
55
|
+
2c76cda3534525183a06539046452aac1857c665552cc40503249f215f6a8bda15cbd9f01ebf751b
|
56
|
+
6d78b4db8643d9bc36c7e7150846f6645a7e10b7d4a407c5d4e596fd89ea44b233a7d90a8f901577
|
57
|
+
ac4be0e9770f9c7c040f99e5feb48d02d92cb42d3ece35da905ac7128ec15401fb557f17dc85822b
|
58
|
+
5079b9dedf21d3f3fb5549d209863ba69199a28a297360e8fc3f6ed6ba35b42f9dc1371057041639
|
59
|
+
c63d338a9d51b4a667d2ed1dd8b334084927249da39d49a697479f9b6e4db0a28a2ace4e69aac22d
|
60
|
+
f52b9816331aa4ac154e792e7975f4c545ad3f1ec1124f6b3a2059240c1d87f5636e33f7acc52b25
|
61
|
+
4e8ddc33df05224e9976d657893af303930ee3ceaf38ec25efb3ed796321966d2ee0291eb1362b35
|
62
|
+
561a7dd936b3699382f6d748d111fdbb86323ef5d4255c02d4e1dead766bac94a594087aac6a3f14
|
63
|
+
f53375736f6b1892e654863ce37b9c28f99e83eb4f518cd0acf7b4a84dc7b3ee2080757d3a61ff00
|
64
|
+
61ab2bad5ad20bf4d3d4bcf78c037810aee655fee6f251eac467ca9cd6238a6d26ee19d82452c2f1
|
65
|
+
b13e41811feb509563f3491dbc0d2c842c68326b0fa8dd3de5dc93bf2dc7e11d8790a99adeaaf7cf
|
66
|
+
e1c794814f207ab1ee6aae833959a5a7c3b15bec28a2b49c35a0dd1bbb6bfb811a5baff1154b659b
|
67
|
+
902a463a0c9cf33e58c73c8e526c364c9182b66a74d8de1d3ada1906d748515867a100035228a29a
|
68
|
+
309bb76145145428cf71cda9974e8ee5412607c1e63015b967ee17ef58baea73469342f0c83723a9
|
69
|
+
5619c641e46b05af68b3e9b33322bcb6a79ac98fe5f46ec7f7fc507247d9a5a2ccab632a69703049
|
70
|
+
e373d1581fcd228a10f9d0884923c10ae8c3983cc106b3f2ddff00b32b729725e4d3cab496407365
|
71
|
+
6039db8ef9ea83e63c8655c2b7f2484d94ad90ab98c9eb8ed5737bb8420adafbd1560de1e4039072
|
72
|
+
08cf2c838ed4c276acc7c90709532b7846c2e6c348f13512a751ba76b9bc6073f1b73db9eca30a3d
|
73
|
+
16a4f11305d1e7c9ea001f714ca0d4afee54dddbad8d94477786640f24cc3a6ec72551d700927974
|
74
|
+
1906935cd4defa531af28118ed03fabd4d54dd209a7c6e7355e8aca28a2806a8b86379a648635dce
|
75
|
+
ec154671927a574eb6856deda281092b1a045cf5c018acef0968822116a7724f8846e850372008c6
|
76
|
+
4e3ae41e9e5f3e9a6a3e38d2b664eb3329c9463e828a28a20985145150814514542183e26d266b2b
|
77
|
+
d9678a03ee8e772b28c84cf507039733cbd31eb54d5d51d55d191d432b0c329190476aa4bee18d3a
|
78
|
+
e1de488c96ecc0e0211b41e7cf07f60474f2a0cb1fc3470eb525533156f3496f3a4d136d743906b4
|
79
|
+
f6bc4368f18f1d5e27f300647d2a1eabc3375690096de4377cf0cab1e187a81939aa27564764752a
|
80
|
+
ca70411820f6ae2e50196b1e7568bbd635cf7889a0b456446e4ce79123b0aa2a5c31493482386379
|
81
|
+
1cf4551927e956adc35ab88d18408c5b395122e57e7cf1cfd3353997274bc78555d14f52f49b1935
|
82
|
+
1be4b58cedddcd9b190a0753ff00de78ab2b1e17d466908b9d96c83fa890c4f5e801fdc8eb5acd2b
|
83
|
+
4db5d360315b29cb1cb3b1cb376cfcaae306fb059b55182a8bb64b45545088a155460003000afb45
|
84
|
+
14c190145145421fffd9
|
85
|
+
}}
|
16
86
|
}
|
17
|
-
\par}
|
18
|
-
{\pard\qc
|
19
|
-
{\b\f0\fs32
|
20
|
-
Section 1.1
|
21
|
-
}
|
22
|
-
\par}
|
23
|
-
{\pard
|
24
|
-
Paragraph inside section 1.1
|
25
|
-
\par}
|
26
|
-
\trowd\tgraph100
|
27
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx400
|
28
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx1400
|
29
|
-
\pard\intbl
|
30
|
-
id
|
31
|
-
\cell
|
32
|
-
\pard\intbl
|
33
|
-
name
|
34
|
-
\cell
|
35
|
-
\row
|
36
|
-
\trowd\tgraph100
|
37
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx400
|
38
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx1400
|
39
|
-
\pard\intbl
|
40
|
-
1
|
41
|
-
\cell
|
42
|
-
\pard\intbl
|
43
|
-
John
|
44
|
-
\cell
|
45
|
-
\row
|
46
|
-
\trowd\tgraph100
|
47
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx400
|
48
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx1400
|
49
|
-
\pard\intbl
|
50
|
-
2
|
51
|
-
\cell
|
52
|
-
\pard\intbl
|
53
|
-
Peter
|
54
|
-
\cell
|
55
|
-
\row
|
56
|
-
\trowd\tgraph100
|
57
|
-
\clbrdrt\brdrw25\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx400
|
58
|
-
\clbrdrt\brdrw25\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx1400
|
59
|
-
\pard\intbl
|
60
|
-
3
|
61
|
-
\cell
|
62
|
-
\pard\intbl
|
63
|
-
John
|
64
|
-
\cell
|
65
|
-
\row
|
66
|
-
\trowd\tgraph100
|
67
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx400
|
68
|
-
\clbrdrt\brdrw3\brdrs\clbrdrl\brdrw3\brdrs\clbrdrb\brdrw3\brdrs\clbrdrr\brdrw3\brdrs\cellx1400
|
69
|
-
\pard\intbl
|
70
|
-
4
|
71
|
-
\cell
|
72
|
-
\pard\intbl
|
73
|
-
Peter
|
74
|
-
\cell
|
75
|
-
\row
|
76
|
-
{\pard\ql
|
77
|
-
{\f1\fs20
|
78
|
-
def test_generate
|
79
|
-
{\line}
|
80
|
-
html=ReportBuilder.generate(:format=>:html, :name=>@title, :directory=>@tmpdir) do
|
81
|
-
{\line}
|
82
|
-
text("hola")
|
83
|
-
{\line}
|
84
|
-
end
|
85
|
-
{\line}
|
86
|
-
doc=Hpricot(html)
|
87
|
-
{\line}
|
88
|
-
assert_equal(@title, doc.search("head/title").inner_html)
|
89
|
-
{\line}
|
90
|
-
assert_equal(@title, doc.search("body/h1").inner_html)
|
91
|
-
{\line}
|
92
|
-
assert_equal("hola", doc.search("body/p").inner_html)
|
93
|
-
{\line}
|
94
|
-
|
95
|
-
{\line}
|
96
|
-
end
|
97
|
-
{\line}
|
98
|
-
}
|
99
|
-
\par}
|
100
|
-
{\pard
|
101
|
-
Last paragraph
|
102
|
-
\par}
|
103
|
-
}
|
data/lib/reportbuilder.rb
CHANGED
@@ -50,8 +50,7 @@ class ReportBuilder
|
|
50
50
|
attr_accessor :name
|
51
51
|
# Doesn't print a title if set to true
|
52
52
|
attr_accessor :no_title
|
53
|
-
|
54
|
-
VERSION = '1.1.0'
|
53
|
+
VERSION = '1.1.1'
|
55
54
|
# Generates and optionally save the report on one function
|
56
55
|
def self.generate(options=Hash.new, &block)
|
57
56
|
options[:filename]||=nil
|
@@ -64,10 +63,10 @@ class ReportBuilder
|
|
64
63
|
file=options.delete(:filename)
|
65
64
|
format=options.delete(:format).to_s
|
66
65
|
format[0]=format[0,1].upcase
|
67
|
-
|
68
|
-
|
69
66
|
rb=ReportBuilder.new(options)
|
67
|
+
|
70
68
|
rb.add(block)
|
69
|
+
|
71
70
|
generator=Generator.const_get(format.to_sym).new(rb, options)
|
72
71
|
generator.parse
|
73
72
|
out=generator.out
|
@@ -103,7 +102,7 @@ class ReportBuilder
|
|
103
102
|
end
|
104
103
|
# Returns a RTF output
|
105
104
|
def to_rtf()
|
106
|
-
gen = Generator::Rtf.new(self
|
105
|
+
gen = Generator::Rtf.new(self, @options)
|
107
106
|
gen.parse
|
108
107
|
gen.out
|
109
108
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
class ReportBuilder
|
2
2
|
# Abstract class for generators.
|
3
3
|
# A generator is a class which control the output for a ReportBuilder object
|
4
|
-
#
|
4
|
+
# Every object which have a #report_building() method could be
|
5
|
+
# parsed with #parse_element method.
|
5
6
|
class Generator
|
6
7
|
# Level of heading. See ReportBuilder::Section for using it.
|
7
8
|
attr_reader :parse_level
|
@@ -51,7 +52,7 @@ class ReportBuilder
|
|
51
52
|
def parse_element(element)
|
52
53
|
method=("report_building_" + self.class::PREFIX).intern
|
53
54
|
if element.is_a? Proc
|
54
|
-
element.arity
|
55
|
+
element.arity<1 ? instance_eval(&element) : element.call(self)
|
55
56
|
elsif element.respond_to? method
|
56
57
|
element.send(method, self)
|
57
58
|
elsif element.respond_to? :report_building
|
@@ -1,10 +1,16 @@
|
|
1
|
+
gem 'clbustos-rtf'
|
1
2
|
require 'rtf'
|
3
|
+
|
2
4
|
class ReportBuilder
|
3
5
|
class Generator
|
6
|
+
# Rtf Generator.
|
7
|
+
# Based on ruby-rtf (http://ruby-rtf.rubyforge.org/)
|
8
|
+
#
|
4
9
|
class Rtf < Generator
|
5
10
|
PREFIX="rtf"
|
11
|
+
# RTF::Document object.
|
12
|
+
# See http://ruby-rtf.rubyforge.org/ for documentation
|
6
13
|
attr_accessor :rtf
|
7
|
-
attr_reader :options
|
8
14
|
include RTF
|
9
15
|
def initialize(builder, options)
|
10
16
|
super
|
@@ -26,8 +32,7 @@ class ReportBuilder
|
|
26
32
|
ps=ParagraphStyle.new
|
27
33
|
ps.justification = ParagraphStyle::CENTER_JUSTIFY
|
28
34
|
h[k]={:cs=>cs, :ps=>ps}
|
29
|
-
}
|
30
|
-
|
35
|
+
}
|
31
36
|
end
|
32
37
|
def default_options
|
33
38
|
|
@@ -48,7 +53,9 @@ class ReportBuilder
|
|
48
53
|
def header(level,t)
|
49
54
|
@rtf.paragraph(@header_styles[level][:ps]) do |n1|
|
50
55
|
n1.apply(@header_styles[level][:cs]) do |n2|
|
56
|
+
n2.line_break
|
51
57
|
n2 << t
|
58
|
+
n2.line_break
|
52
59
|
end
|
53
60
|
end
|
54
61
|
end
|
@@ -63,6 +70,7 @@ class ReportBuilder
|
|
63
70
|
end
|
64
71
|
|
65
72
|
end
|
73
|
+
|
66
74
|
def out
|
67
75
|
@rtf.to_rtf
|
68
76
|
end
|
@@ -70,6 +78,9 @@ class ReportBuilder
|
|
70
78
|
File.open(filename,'wb') {|file| file.write(@rtf.to_rtf)
|
71
79
|
}
|
72
80
|
end
|
81
|
+
def html(t)
|
82
|
+
# Nothing
|
83
|
+
end
|
73
84
|
end
|
74
85
|
end
|
75
86
|
end
|
data/lib/reportbuilder/image.rb
CHANGED
@@ -71,7 +71,10 @@ class ReportBuilder::Image
|
|
71
71
|
out+= border
|
72
72
|
generator.preformatted(out)
|
73
73
|
end
|
74
|
-
|
74
|
+
def report_building_rtf(generator)
|
75
|
+
raise "Not implemented on RTF::Document. Use gem install thecrisoshow-ruby-rtf for support" unless generator.rtf.respond_to? :image
|
76
|
+
generator.rtf.image(@filename)
|
77
|
+
end
|
75
78
|
def report_building_html(generator)
|
76
79
|
basedir=generator.directory+"/images"
|
77
80
|
out=basedir+"/"+File.basename(@filename)
|
@@ -34,7 +34,7 @@ class ReportBuilder::Section
|
|
34
34
|
def report_building_html(g)
|
35
35
|
htag="h#{g.parse_level+1}"
|
36
36
|
anchor=g.toc_entry(name)
|
37
|
-
|
37
|
+
g.html "<div class='section'><#{htag}>#{name}</#{htag}><a name='#{anchor}'></a>"
|
38
38
|
g.parse_cycle(self)
|
39
39
|
g.html "</div>"
|
40
40
|
end
|
@@ -5,6 +5,11 @@ class ReportBuilder
|
|
5
5
|
def generate()
|
6
6
|
@t=@element
|
7
7
|
@rtf=@generator.rtf
|
8
|
+
|
9
|
+
# Title
|
10
|
+
|
11
|
+
@generator.header(6,@t.name)
|
12
|
+
|
8
13
|
max_cols=@t.calculate_widths
|
9
14
|
n_rows=@t.n_rows_no_hr+(@t.header.size>0 ? 1: 0)
|
10
15
|
args=[n_rows, @t.n_columns]+max_cols.map{|m| m*@generator.options[:font_size]*10}
|
data/test/test_html.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
require "
|
1
|
+
require "minitest/unit"
|
2
2
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
3
|
require "reportbuilder"
|
4
4
|
require 'fileutils'
|
5
5
|
require 'tmpdir'
|
6
|
-
require '
|
6
|
+
require 'nokogiri'
|
7
7
|
require 'tempfile'
|
8
|
-
|
8
|
+
MiniTest::Unit.autorun
|
9
|
+
class TestReportbuilderHtml < MiniTest::Unit::TestCase
|
9
10
|
def setup
|
10
11
|
@tmpdir=Dir::mktmpdir
|
11
12
|
@title="Test #{rand(100)}"
|
@@ -16,20 +17,20 @@ class TestReportbuilderHtml < Test::Unit::TestCase
|
|
16
17
|
FileUtils.remove_entry_secure @tmpdir
|
17
18
|
end
|
18
19
|
def test_empty_document
|
19
|
-
doc=
|
20
|
-
assert_equal(@title, doc.
|
21
|
-
assert_equal(@title, doc.
|
22
|
-
assert_match(
|
20
|
+
doc=Nokogiri::HTML(@rp.to_html)
|
21
|
+
assert_equal(@title, doc.at_xpath("/html/head/title").content)
|
22
|
+
assert_equal(@title, doc.at_xpath("/html/body/h1").content)
|
23
|
+
assert_match("", doc.at_xpath("/html/body").to_s.gsub(/<h1>.+<\/h1>|<\/?body>/,""))
|
23
24
|
|
24
25
|
end
|
25
26
|
def test_generate
|
26
27
|
html=ReportBuilder.generate(:format=>:html, :name=>@title, :directory=>@tmpdir) do
|
27
28
|
text("hola")
|
28
29
|
end
|
29
|
-
doc=
|
30
|
-
assert_equal(@title, doc.
|
31
|
-
assert_equal(@title, doc.
|
32
|
-
assert_equal("hola", doc.
|
30
|
+
doc=Nokogiri::HTML(html)
|
31
|
+
assert_equal(@title, doc.at_xpath("/html/head/title").inner_html)
|
32
|
+
assert_equal(@title, doc.at_xpath("/html/body/h1").inner_html)
|
33
|
+
assert_equal("hola", doc.at_xpath("/html/body/p").inner_html)
|
33
34
|
|
34
35
|
end
|
35
36
|
def test_include_js
|
data/test/test_image.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
-
require '
|
2
|
+
require 'minitest/unit'
|
3
3
|
require 'tmpdir'
|
4
4
|
require "reportbuilder"
|
5
|
-
|
5
|
+
MiniTest::Unit.autorun
|
6
|
+
class TestReportbuilderImage < MiniTest::Unit::TestCase
|
6
7
|
def setup
|
7
8
|
@tmpdir=Dir::mktmpdir
|
8
9
|
@rp=ReportBuilder.new(:no_name=>true, :directory=>@tmpdir)
|
@@ -39,5 +40,7 @@ Test
|
|
39
40
|
def test_image_html
|
40
41
|
assert_match(/img src='images\/sheep.jpg'/, @rp.to_html)
|
41
42
|
end
|
42
|
-
|
43
|
+
def test_image_rtf
|
44
|
+
assert_match(/\\pict\\picw128\\pich112\\bliptag2403101\\jpegblip/, @rp.to_rtf)
|
45
|
+
end
|
43
46
|
end
|
data/test/test_reportbuilder.rb
CHANGED
@@ -1,13 +1,24 @@
|
|
1
|
-
require "
|
1
|
+
require "minitest/unit"
|
2
2
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
3
|
require "reportbuilder"
|
4
|
-
require 'hpricot'
|
5
4
|
require 'tempfile'
|
6
|
-
|
5
|
+
MiniTest::Unit.autorun
|
6
|
+
class TestReportbuilder < MiniTest::Unit::TestCase
|
7
7
|
def setup
|
8
8
|
@datadir=File.dirname(__FILE__)+"/../data"
|
9
9
|
@image=@datadir+"/sheep.jpg"
|
10
10
|
end
|
11
|
+
def assert_nothing_raised(msg=nil)
|
12
|
+
msg||="Nothing should be raised, but raised %s"
|
13
|
+
begin
|
14
|
+
yield
|
15
|
+
not_raised=true
|
16
|
+
rescue Exception => e
|
17
|
+
not_raised=false
|
18
|
+
msg=sprintf(msg,e)
|
19
|
+
end
|
20
|
+
assert(not_raised,msg)
|
21
|
+
end
|
11
22
|
# adding basic object
|
12
23
|
def test_basic_generators
|
13
24
|
# basic_classes = Array,String,Integer, Float,Time,Hash
|
@@ -63,7 +74,7 @@ class TestReportbuilder < Test::Unit::TestCase
|
|
63
74
|
assert_equal("hola\n",rp.to_s)
|
64
75
|
end
|
65
76
|
def test_generate
|
66
|
-
res=ReportBuilder.generate(:format=>:text,:name=>"Test") do
|
77
|
+
res=ReportBuilder.generate(:format=>:text,:name=>"Test") do
|
67
78
|
text("hola")
|
68
79
|
end
|
69
80
|
assert_match(/^Test\nhola$/,res)
|
@@ -71,7 +82,7 @@ class TestReportbuilder < Test::Unit::TestCase
|
|
71
82
|
html=ReportBuilder.generate(:name=>"Test", :format=>:html) do
|
72
83
|
text("hola")
|
73
84
|
end
|
74
|
-
ReportBuilder.generate(:name=>"Test", :filename=>html_file,:format=>:html) do
|
85
|
+
ReportBuilder.generate(:name=>"Test", :filename=>html_file.path,:format=>:html) do
|
75
86
|
text("hola")
|
76
87
|
end
|
77
88
|
|
data/test/test_section.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require "
|
1
|
+
require "minitest/unit"
|
2
2
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
3
|
require "reportbuilder"
|
4
|
-
require '
|
5
|
-
|
6
|
-
class TestReportbuilderSection <
|
4
|
+
require 'nokogiri'
|
5
|
+
MiniTest::Unit.autorun
|
6
|
+
class TestReportbuilderSection < MiniTest::Unit::TestCase
|
7
7
|
def setup
|
8
8
|
@name="Test Section"
|
9
9
|
@rp=ReportBuilder.new(:name=>"Test Section")
|
@@ -50,20 +50,21 @@ Test Section
|
|
50
50
|
def test_section_html
|
51
51
|
real=@rp.to_html
|
52
52
|
#puts real
|
53
|
-
|
53
|
+
base = Nokogiri::HTML(real)
|
54
54
|
# Sanity
|
55
|
-
|
55
|
+
doc=base.at_xpath("/html")
|
56
|
+
assert_equal("Test Section", doc.at_xpath("head/title").content)
|
56
57
|
# Test toc
|
57
|
-
base_ul=doc.
|
58
|
-
assert(base_ul
|
59
|
-
#puts base_ul
|
58
|
+
base_ul=doc.at_xpath("/html/body/div[@id='toc']/ul")
|
59
|
+
assert(base_ul,"Toc have something")
|
60
60
|
[
|
61
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"],
|
62
|
+
["ul/li/a[@href='#toc_2']","Section 1.1"],
|
63
|
+
["ul/ul/li/a[@href='#toc_3']","Section 1.1.1"],
|
64
64
|
["li/a[@href='#toc_4']","Section 2"]].each do |path, expected|
|
65
|
-
inner=base_ul.
|
66
|
-
|
65
|
+
assert(inner=base_ul.at_xpath(path),"#{path} should return something")
|
66
|
+
content=inner.content
|
67
|
+
assert_equal(expected, content, "On #{path}")
|
67
68
|
end
|
68
69
|
|
69
70
|
[
|
@@ -71,8 +72,8 @@ Test Section
|
|
71
72
|
["div[class='section']/h3",["Section 1.1"]],
|
72
73
|
["div[class='section']/h4",["Section 1.1.1"]]
|
73
74
|
].each do |path, expected|
|
74
|
-
base_ul.
|
75
|
-
assert_equal(expected, el.
|
75
|
+
base_ul.xpath(path).each do |el|
|
76
|
+
assert_equal(expected, el.content, "On #{path} #{el}")
|
76
77
|
end
|
77
78
|
end
|
78
79
|
end
|
data/test/test_table.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
require "
|
1
|
+
require "minitest/unit"
|
2
2
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
3
|
require "reportbuilder"
|
4
4
|
require 'reportbuilder/table/htmlgenerator'
|
5
5
|
require 'reportbuilder/table/textgenerator'
|
6
|
-
require '
|
6
|
+
require 'nokogiri'
|
7
7
|
|
8
|
-
|
8
|
+
MiniTest::Unit.autorun
|
9
|
+
class TestReportbuilderTable < MiniTest::Unit::TestCase
|
9
10
|
def setup
|
10
11
|
super
|
11
12
|
@name="Table Test"
|
@@ -98,11 +99,12 @@ HEREDOC
|
|
98
99
|
</table>
|
99
100
|
HEREDOC
|
100
101
|
|
101
|
-
doc=
|
102
|
+
doc=Nokogiri::HTML(@mock_generator).at_xpath("/html")
|
102
103
|
|
103
|
-
assert(doc.
|
104
|
-
assert(doc.
|
105
|
-
|
104
|
+
assert(doc.at_xpath("a[@name='MOCK']")!="")
|
105
|
+
assert(doc.at_xpath("table")!="")
|
106
|
+
|
107
|
+
assert_equal(@header, doc.xpath("//table/thead/th").map {|m| m.content} )
|
106
108
|
[[2,%w{a}],
|
107
109
|
[3,%w{a f}],
|
108
110
|
[4,%w{a}],
|
@@ -110,7 +112,7 @@ HEREDOC
|
|
110
112
|
[6,%w{a}],
|
111
113
|
|
112
114
|
].each do |m,exp|
|
113
|
-
real=doc.
|
115
|
+
real=doc.xpath("//table/tbody/tr/td[@colspan='#{m}']").map {|x| x.inner_html}
|
114
116
|
assert_equal(exp, real, "On table/tbody/tr/td[@colspan='#{m}']"
|
115
117
|
)
|
116
118
|
end
|
metadata
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reportbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 1
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
version: 1.1.0
|
4
|
+
version: 1.1.1
|
10
5
|
platform: ruby
|
11
6
|
authors:
|
12
7
|
- Claudio Bustos
|
@@ -14,77 +9,59 @@ autorequire:
|
|
14
9
|
bindir: bin
|
15
10
|
cert_chain: []
|
16
11
|
|
17
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-24 00:00:00 -03:00
|
18
13
|
default_executable:
|
19
14
|
dependencies:
|
20
15
|
- !ruby/object:Gem::Dependency
|
21
|
-
name: rtf
|
22
|
-
|
23
|
-
|
16
|
+
name: clbustos-rtf
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
20
|
requirements:
|
25
21
|
- - ~>
|
26
22
|
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
|
29
|
-
- 1
|
30
|
-
version: "0.1"
|
31
|
-
type: :runtime
|
32
|
-
version_requirements: *id001
|
23
|
+
version: 0.2.1
|
24
|
+
version:
|
33
25
|
- !ruby/object:Gem::Dependency
|
34
26
|
name: rubyforge
|
35
|
-
|
36
|
-
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
30
|
requirements:
|
38
31
|
- - ">="
|
39
32
|
- !ruby/object:Gem::Version
|
40
|
-
segments:
|
41
|
-
- 2
|
42
|
-
- 0
|
43
|
-
- 4
|
44
33
|
version: 2.0.4
|
45
|
-
|
46
|
-
version_requirements: *id002
|
34
|
+
version:
|
47
35
|
- !ruby/object:Gem::Dependency
|
48
36
|
name: gemcutter
|
49
|
-
|
50
|
-
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
40
|
requirements:
|
52
41
|
- - ">="
|
53
42
|
- !ruby/object:Gem::Version
|
54
|
-
segments:
|
55
|
-
- 0
|
56
|
-
- 5
|
57
|
-
- 0
|
58
43
|
version: 0.5.0
|
59
|
-
|
60
|
-
version_requirements: *id003
|
44
|
+
version:
|
61
45
|
- !ruby/object:Gem::Dependency
|
62
46
|
name: hpricot
|
63
|
-
|
64
|
-
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
50
|
requirements:
|
66
51
|
- - ~>
|
67
52
|
- !ruby/object:Gem::Version
|
68
|
-
segments:
|
69
|
-
- 0
|
70
|
-
- 8
|
71
53
|
version: "0.8"
|
72
|
-
|
73
|
-
version_requirements: *id004
|
54
|
+
version:
|
74
55
|
- !ruby/object:Gem::Dependency
|
75
56
|
name: hoe
|
76
|
-
|
77
|
-
|
57
|
+
type: :development
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
60
|
requirements:
|
79
61
|
- - ">="
|
80
62
|
- !ruby/object:Gem::Version
|
81
|
-
segments:
|
82
|
-
- 2
|
83
|
-
- 5
|
84
|
-
- 1
|
85
63
|
version: 2.5.1
|
86
|
-
|
87
|
-
version_requirements: *id005
|
64
|
+
version:
|
88
65
|
description: Report Abstract Interface. Creates text, html and rtf output, based on a common framework.
|
89
66
|
email:
|
90
67
|
- clbustos_at_gmail.com
|
@@ -105,9 +82,9 @@ files:
|
|
105
82
|
- data/reportbuilder.css
|
106
83
|
- data/reportbuilder.js
|
107
84
|
- data/sheep.jpg
|
85
|
+
- examples/create_rtf.rb
|
108
86
|
- examples/generic_interface.rb
|
109
87
|
- examples/images.rb
|
110
|
-
- examples/rtf.rb
|
111
88
|
- examples/test.rtf
|
112
89
|
- examples/using_a_block.rb
|
113
90
|
- lib/reportbuilder.rb
|
@@ -127,7 +104,7 @@ files:
|
|
127
104
|
- test/test_section.rb
|
128
105
|
- test/test_table.rb
|
129
106
|
has_rdoc: true
|
130
|
-
homepage: http://rubyforge.org/
|
107
|
+
homepage: http://ruby-statsample.rubyforge.org/reportbuilder/
|
131
108
|
licenses: []
|
132
109
|
|
133
110
|
post_install_message:
|
@@ -140,20 +117,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
140
117
|
requirements:
|
141
118
|
- - ">="
|
142
119
|
- !ruby/object:Gem::Version
|
143
|
-
segments:
|
144
|
-
- 0
|
145
120
|
version: "0"
|
121
|
+
version:
|
146
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
123
|
requirements:
|
148
124
|
- - ">="
|
149
125
|
- !ruby/object:Gem::Version
|
150
|
-
segments:
|
151
|
-
- 0
|
152
126
|
version: "0"
|
127
|
+
version:
|
153
128
|
requirements: []
|
154
129
|
|
155
130
|
rubyforge_project: ruby-statsample
|
156
|
-
rubygems_version: 1.3.
|
131
|
+
rubygems_version: 1.3.5
|
157
132
|
signing_key:
|
158
133
|
specification_version: 3
|
159
134
|
summary: Report Abstract Interface
|