reportbuilder 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -5,15 +5,18 @@ Rakefile
5
5
  bin/reportbuilder
6
6
  data/reportbuilder.css
7
7
  data/reportbuilder.js
8
+ data/sheep.jpg
9
+ lib/reportbuilder.rb
8
10
  lib/reportbuilder/generator.rb
9
11
  lib/reportbuilder/generator/html.rb
10
12
  lib/reportbuilder/generator/text.rb
11
- lib/reportbuilder.rb
13
+ lib/reportbuilder/image.rb
12
14
  lib/reportbuilder/section.rb
13
15
  lib/reportbuilder/table.rb
14
16
  lib/reportbuilder/table/htmlgenerator.rb
15
17
  lib/reportbuilder/table/textgenerator.rb
16
18
  test/test_html.rb
19
+ test/test_image.rb
17
20
  test/test_reportbuilder.rb
18
21
  test/test_section.rb
19
22
  test/test_table.rb
data/Rakefile CHANGED
@@ -5,11 +5,12 @@ require 'rubygems'
5
5
  require 'hoe'
6
6
  require 'reportbuilder'
7
7
 
8
+
8
9
  Hoe.spec 'reportbuilder' do
9
10
  self.version=ReportBuilder::VERSION
10
- self.rubyforge_name = 'ruby-statsample'
11
- self.developer('Claudio Bustos', 'clbustos_at_gmail.com')
12
- self.url = "http://rubyforge.org/projects/ruby-statsample/"
11
+ self.rubyforge_name = 'ruby-statsample'
12
+ self.developer('Claudio Bustos', 'clbustos_at_gmail.com')
13
+ self.url = "http://rubyforge.org/projects/ruby-statsample/"
13
14
 
14
15
  end
15
16
 
@@ -0,0 +1,10 @@
1
+ body {
2
+ background-color: white;
3
+ color: black;
4
+ padding: 0;
5
+ font-family: "Arial",sans-serif;
6
+ }
7
+
8
+ h1,h2,h3 {
9
+ color:#600;
10
+ }
data/data/sheep.jpg ADDED
Binary file
@@ -5,31 +5,49 @@ class ReportBuilder
5
5
  class Html < Generator
6
6
  PREFIX="html"
7
7
  attr_reader :toc
8
- def initialize(builder)
8
+ def initialize(builder, options)
9
9
  super
10
10
  @body=""
11
- @toc=[]
12
- @table_n=1
13
- @entry_n=1
14
- @list_tables=[]
15
11
  @headers=[]
16
12
  @footers=[]
17
13
  end
18
14
  def parse
15
+ # add_css(File.dirname(__FILE__)+"/../../../data/reportbuilder.css")
16
+ # add_js(File.dirname(__FILE__)+"/../../../data/reportbuilder.js")
19
17
  parse_cycle(@builder)
20
18
  end
19
+ def basic_css
20
+ <<-HERE
21
+ <style>
22
+ body {
23
+ margin:0;
24
+ padding:1em;
25
+ }
26
+ table {
27
+ border-collapse: collapse;
28
+
29
+ }
30
+ table td {
31
+ border: 1px solid black;
32
+ }
33
+ .section {
34
+ margin:0.5em;
35
+ }
36
+ </style>
37
+ HERE
38
+ end
21
39
  def out
22
- out="<html><head><title>#{@builder.name}</title>"
40
+ out= <<-HERE
41
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
42
+ <html>
43
+ <head>
44
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
45
+ <title>#{@builder.name}</title>
46
+ #{basic_css}
47
+ HERE
23
48
  out << @headers.join("\n")
24
49
  out << "</head><body>\n"
25
50
  out << "<h1>#{@builder.name}</h1>"
26
- if (@list_tables.size>0)
27
- out << "<div class='tot'><div class='title'>List of tables</div><ul>"
28
- @list_tables.each {|anchor,name|
29
- out << "<li><a href='#"+anchor+"'>#{name}</a></li>"
30
- }
31
- out << "</ul></div>\n"
32
- end
33
51
  if(@toc.size>0)
34
52
  out << "<div class='toc'><div class='title'>List of contents</div></div>"
35
53
  actual_level=0
@@ -47,10 +65,30 @@ class ReportBuilder
47
65
  actual_level.times { out << "</ul>\n"}
48
66
  out << "</div>\n"
49
67
  end
68
+ if (@list_tables.size>0)
69
+ out << "<div class='tot'><div class='title'>List of tables</div><ul>"
70
+ @list_tables.each {|anchor,name|
71
+ out << "<li><a href='#"+anchor+"'>#{name}</a></li>"
72
+ }
73
+ out << "</ul></div>\n"
74
+ end
75
+
50
76
  out << @body
51
77
  out << @footers.join("\n")
52
78
  out << "</body></html>"
53
79
  end
80
+
81
+
82
+ def add_image(filename)
83
+ if(File.exists? filename)
84
+ if(!File.exists? @builder.dir+"/images/"+File.basename(filename))
85
+ FileUtils.mkdir @builder.dir+"/images"
86
+ FileUtils.cp filename, @builder.dir+"/images/"+File.basename(filename)
87
+ end
88
+ end
89
+ "images/"+File.basename(filename)
90
+ end
91
+
54
92
  def add_js(js)
55
93
  if(File.exists? js)
56
94
  if(!File.exists? @builder.dir+"/js/"+File.basename(js))
@@ -74,26 +112,18 @@ class ReportBuilder
74
112
 
75
113
  def add_text(t)
76
114
  ws=(" "*parse_level*2)
77
- @body << ws << "<pre>#{t}</pre>\n"
115
+ @body << ws << "<p>#{t}</p>\n"
78
116
  end
79
- def add_raw(t)
117
+ def add_html(t)
80
118
  ws=(" "*parse_level*2)
81
119
  @body << ws << t << "\n"
82
120
  end
83
- def add_toc_entry(name)
84
- anchor="toc_#{@entry_n}"
85
- @entry_n+=1
86
- @toc.push([anchor, name, parse_level])
87
- anchor
88
- end
89
- # Add an entry for a table
90
- # Returns the name of the anchor
91
- def add_table_entry(name)
92
- anchor="table_#{@table_n}"
93
- @table_n+=1
94
- @list_tables.push([anchor,name])
95
- anchor
121
+ def add_preformatted(t)
122
+ ws=(" "*parse_level*2)
123
+ @body << ws << "<pre>#{t}</pre>\n"
124
+
96
125
  end
126
+
97
127
  end
98
128
  end
99
129
  end
@@ -4,7 +4,7 @@ class ReportBuilder
4
4
  PREFIX="text"
5
5
  attr_reader :toc
6
6
  attr_reader :out
7
- def initialize(builder)
7
+ def initialize(builder, options)
8
8
  super
9
9
  @out=""
10
10
  end
@@ -17,9 +17,12 @@ class ReportBuilder
17
17
  ws=" "*parse_level*2
18
18
  @out << ws << t << "\n"
19
19
  end
20
- def add_text_raw(t)
20
+ def add_preformatted(t)
21
21
  @out << t
22
22
  end
23
+ def add_html(t)
24
+ # Nothing printed
25
+ end
23
26
  end
24
27
  end
25
28
  end
@@ -1,32 +1,67 @@
1
1
  class ReportBuilder
2
2
  # Abstract class for generators.
3
- # A generator is a class which control the output for a builder.
3
+ # A generator is a class which control the output for a builder.
4
4
  # On parse_cycle()....
5
5
  #
6
6
  class Generator
7
- #PREFIX="none"
8
7
  attr_reader :parse_level
9
8
  # builder is a ReportBuilder object
10
- def initialize(builder)
9
+ def initialize(builder, options)
11
10
  @builder=builder
12
11
  @parse_level=0
12
+ @options=default_options.merge(options)
13
+ @toc=[]
14
+ @table_n=1
15
+ @entry_n=1
16
+ @list_tables=[]
17
+
18
+ end
19
+ def default_options
20
+ {}
13
21
  end
14
22
  # parse each element of the parameters
15
23
  def parse_cycle(container)
16
24
  @parse_level+=1
17
25
  container.elements.each do |element|
18
- method=("to_rb_"+self.class::PREFIX).intern
19
- if element.respond_to? method
20
- element.send(method, self)
21
- else
22
- add_text(element.to_s)
23
- end
26
+ parse_element(element)
24
27
  end
25
28
  @parse_level-=1
26
29
  end
30
+
31
+ def parse_element(element)
32
+ method=("to_reportbuilder_"+self.class::PREFIX).intern
33
+ if element.respond_to? method
34
+ element.send(method, self)
35
+ elsif element.respond_to? :to_reportbuilder
36
+ element.send(:to_reportbuilder, self)
37
+ else
38
+ add_text(element.to_s)
39
+ end
40
+ end
41
+
27
42
  def add_text(t)
28
43
  raise "Implement this"
29
44
  end
45
+ def add_html(t)
46
+ raise "Implement this"
47
+ end
48
+ def add_preformatted(t)
49
+ raise "Implement this"
50
+ end
51
+ def add_toc_entry(name)
52
+ anchor="toc_#{@entry_n}"
53
+ @entry_n+=1
54
+ @toc.push([anchor, name, parse_level])
55
+ anchor
56
+ end
57
+ # Add an entry for a table
58
+ # Returns the name of the anchor
59
+ def add_table_entry(name)
60
+ anchor="table_#{@table_n}"
61
+ @table_n+=1
62
+ @list_tables.push([anchor,name])
63
+ anchor
64
+ end
30
65
  end
31
66
  class ElementGenerator
32
67
  def initialize(generator,element)
@@ -0,0 +1,78 @@
1
+ # Creates a Section
2
+ class ReportBuilder::Image
3
+ @@n=1
4
+ attr_reader :name
5
+ def initialize(filename, options={})
6
+ if !options.has_key? :name
7
+ @name="Image #{@@n}"
8
+ @@n+=1
9
+ else
10
+ @name=options[:name]
11
+ end
12
+ default_options={
13
+ :alt=>@name,
14
+ :chars => [ 'W', 'M', '$', '@', '#', '%', '^', 'x', '*', 'o', '=', '+',
15
+ ':', '~', '.', ' ' ],
16
+ :font_rows => 8,
17
+ :font_cols => 4
18
+ }
19
+ @options=default_options.merge(options)
20
+ @filename=filename
21
+ end
22
+ # Based on http://rubyquiz.com/quiz50.html
23
+ def to_reportbuilder_text(generator)
24
+ require 'RMagick'
25
+
26
+
27
+ img = Magick::Image.read(@filename).first
28
+
29
+ # Resize too-large images. The resulting image is going to be
30
+ # about twice the size of the input, so if the original image is too
31
+ # large we need to make it smaller so the ASCII version won't be too
32
+ # big. The `change_geometry' method computes new dimensions for an
33
+ # image based on the geometry argument. The '320x320>' argument says
34
+ # "If the image is too big to fit in a 320x320 square, compute the
35
+ # dimensions of an image that will fit, but retain the original aspect
36
+ # ratio. If the image is already smaller than 320x320, keep the same
37
+ # dimensions."
38
+ img.change_geometry('320x320>') do |cols, rows|
39
+ img.resize!(cols, rows) if cols != img.columns || rows != img.rows
40
+ end
41
+
42
+ # Compute the image size in ASCII "pixels" and resize the image to have
43
+ # those dimensions. The resulting image does not have the same aspect
44
+ # ratio as the original, but since our "pixels" are twice as tall as
45
+ # they are wide we'll get our proportions back (roughly) when we render.
46
+ pr = img.rows / @options[:font_rows]
47
+ pc = img.columns / @options[:font_cols]
48
+ img.resize!(pc, pr)
49
+
50
+ img = img.quantize(@options[:chars].size, Magick::GRAYColorspace)
51
+ img = img.normalize
52
+
53
+ out=""
54
+ # Draw the image surrounded by a border. The `view' method is slow but
55
+ # it makes it easy to address individual pixels. In grayscale images,
56
+ # all three RGB channels have the same value so the red channel is as
57
+ # good as any for choosing which character to represent the intensity of
58
+ # this particular pixel.
59
+ border = '+' + ('-' * pc) + '+'
60
+ out += border+"\n"
61
+ img.view(0, 0, pc, pr) do |view|
62
+ pr.times do |i|
63
+ out+= '|'
64
+ pc.times do |j|
65
+ out+= @options[:chars][view[i][j].red / (2**16/@options[:chars].size)]
66
+ end
67
+ out+= '|'+"\n"
68
+ end
69
+ end
70
+ out+= border
71
+ generator.add_raw(out)
72
+ end
73
+
74
+ def to_reportbuilder_html(generator)
75
+ src=generator.add_image(@filename)
76
+ generator.add_raw("<img src='#{src}' alt='#{@options[:alt]}' />")
77
+ end
78
+ end
@@ -2,12 +2,12 @@
2
2
  class ReportBuilder::Section
3
3
  @@n=1
4
4
  attr_reader :parent, :elements, :name
5
- def initialize(name=nil)
6
- if name.nil?
5
+ def initialize(options={})
6
+ if !options.has_key? :name
7
7
  @name="Section #{@nn}"
8
8
  @nn+=1
9
9
  else
10
- @name=name
10
+ @name=options[:name]
11
11
  end
12
12
  @parent = nil
13
13
  @elements = []
@@ -20,29 +20,23 @@ class ReportBuilder::Section
20
20
  end
21
21
  end
22
22
 
23
- def to_rb_text(generator)
23
+ def to_reportbuilder_text(generator)
24
24
  generator.add_text(("="*generator.parse_level)+" "+name)
25
25
  generator.parse_cycle(self)
26
26
  end
27
27
 
28
- def to_rb_html(generator)
28
+ def to_reportbuilder_html(generator)
29
29
  htag="h#{generator.parse_level+1}"
30
30
  anchor=generator.add_toc_entry(name)
31
- generator.add_raw "<div class='section'><#{htag}>#{name}</#{htag}><a name='#{anchor}'></a>"
31
+ generator.add_html "<div class='section'><#{htag}>#{name}</#{htag}><a name='#{anchor}'></a>"
32
32
  generator.parse_cycle(self)
33
- generator.add_raw "</div>"
33
+ generator.add_html "</div>"
34
34
  end
35
35
 
36
- def add(*elements)
37
- elements.each do |element|
38
- if element.is_a? ReportBuilder::Section
39
- element.parent=self
40
- end
41
- if element.respond_to?(:to_reportbuilder)
42
- @elements.push(element.to_reportbuilder)
43
- else
44
- @elements.push(element)
45
- end
36
+ def add(element)
37
+ if element.is_a? ReportBuilder::Section
38
+ element.parent=self
46
39
  end
40
+ @elements.push(element)
47
41
  end
48
42
  end
@@ -4,7 +4,7 @@ class ReportBuilder
4
4
  def generate()
5
5
  t=@element
6
6
  anchor=@generator.add_table_entry(t.name)
7
- out="<a name='#{anchor}'></a><table>"
7
+ out="<a name='#{anchor}'></a><table><caption>#{t.name}</caption>"
8
8
  @rowspans=[]
9
9
  if t.header.size>0
10
10
  out+="<thead>"+parse_row(t,t.header,"th")+"</thead>\n"
@@ -21,7 +21,7 @@ class ReportBuilder
21
21
  end
22
22
  }
23
23
  out+="</tbody>\n</table>\n"
24
- @generator.add_raw(out)
24
+ @generator.add_html(out)
25
25
  end
26
26
  def parse_row(t,row,tag="td")
27
27
  row_ary=[]
@@ -6,7 +6,7 @@ class ReportBuilder
6
6
  t=@element
7
7
  t.calculate_widths
8
8
  total_width=t.total_width
9
- out=""
9
+ out="Table: #{t.name}\n"
10
10
  if t.header.size>0
11
11
  out+=parse_hr(total_width)+"\n"
12
12
  out+=parse_row(t,t.header)+"\n"
@@ -19,8 +19,8 @@ class ReportBuilder
19
19
  # | 4 | London |George | ab-4 |
20
20
  # -----------------------------------------
21
21
  class Table
22
- @@n=1
23
- # :nodoc:
22
+ @@n=1 # :nodoc:
23
+
24
24
  DEFAULT_OPTIONS={
25
25
  :header => [],
26
26
  :name => nil
@@ -36,6 +36,7 @@ class ReportBuilder
36
36
  # Use:
37
37
  # table=ReportBuilder::Table.new(:header =>["var1","var2"])
38
38
  def initialize(opts=Hash.new)
39
+ raise ArgumentError,"opts should be a Hash" if !opts.is_a? Hash
39
40
  opts=DEFAULT_OPTIONS.merge opts
40
41
  if opts[:name].nil?
41
42
  @name= "Table #{@@n}"
@@ -57,6 +58,7 @@ class ReportBuilder
57
58
  def add_hr
58
59
  @rows.push(:hr)
59
60
  end
61
+ alias_method :add_horizontal_line, :add_hr
60
62
  # Adds a rowspan on a cell
61
63
  # table.add_row(["a",table.rowspan("b",2)])
62
64
  def rowspan(data,n)
@@ -93,12 +95,12 @@ class ReportBuilder
93
95
  }
94
96
  }
95
97
  end
96
- def to_rb_text(generator)
98
+ def to_reportbuilder_text(generator)
97
99
  require 'reportbuilder/table/textgenerator'
98
100
  table_generator=ReportBuilder::Table::TextGenerator.new( generator, self)
99
101
  table_generator.generate
100
102
  end
101
- def to_rb_html(generator)
103
+ def to_reportbuilder_html(generator)
102
104
  require 'reportbuilder/table/htmlgenerator'
103
105
  table_generator=ReportBuilder::Table::HtmlGenerator.new(generator, self)
104
106
  table_generator.generate
data/lib/reportbuilder.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  require 'reportbuilder/table'
2
2
  require 'reportbuilder/section'
3
3
  require 'reportbuilder/generator'
4
+ require 'reportbuilder/image'
4
5
 
5
6
  class ReportBuilder
6
7
  attr_reader :elements
7
8
  attr_reader :name
8
9
  attr_reader :dir
9
- VERSION = '0.1.0'
10
+ VERSION = '0.2.0'
10
11
  # Create a new Report
11
12
  def initialize(name=nil,dir=nil)
12
13
  name||="Report "+Time.new.to_s
@@ -19,40 +20,38 @@ class ReportBuilder
19
20
  # If parameters is an object which respond to :to_reportbuilder,
20
21
  # this method will called.
21
22
  # Otherwise, the element itself will be added
22
- def add(*elements)
23
- elements.each do |element|
24
- if element.respond_to?(:to_reportbuilder)
25
- @elements.push(element.to_reportbuilder)
26
- else
27
- @elements.push(element)
28
- end
29
- end
23
+ def add(element)
24
+ @elements.push(element)
30
25
  end
31
26
  # Returns a Section
32
- def section(name)
33
- Section.new(name)
27
+ def section(options={})
28
+ Section.new(options)
29
+ end
30
+ def image(filename)
31
+ Image.new(filename)
34
32
  end
35
33
  # Returns a Table
36
34
  def table(h=[])
37
35
  Table.new(h)
38
36
  end
39
37
  # Returns an Html output
40
- def to_html
41
- gen=Generator::Html.new(self)
38
+ def to_html(options={})
39
+ gen = Generator::Html.new(self,options)
42
40
  gen.parse
43
41
  gen.out
44
42
  end
45
- def save_html(file)
46
- gen=Generator::Html.new(self)
43
+ def save_html(file, options={})
44
+ gen=Generator::Html.new(self,options)
47
45
  gen.parse
48
46
  File.open(@dir+"/"+file,"wb") {|fp|
49
47
  fp.write(gen.out)
50
48
  }
51
49
  end
52
50
  # Returns a Text output
53
- def to_s
54
- gen=Generator::Text.new(self)
51
+ def to_text(options={})
52
+ gen=Generator::Text.new(self, options)
55
53
  gen.parse
56
54
  gen.out
57
55
  end
56
+ alias_method :to_s, :to_text
58
57
  end
data/test/test_html.rb CHANGED
@@ -15,7 +15,7 @@ class TestReportbuilderHtml < Test::Unit::TestCase
15
15
  def test_include_js
16
16
  mock_element = ""
17
17
  eval(" class << mock_element
18
- def to_rb_html(generator)
18
+ def to_reportbuilder_html(generator)
19
19
  generator.add_js('"+@datadir+"/reportbuilder.js')
20
20
  end
21
21
  end ")
@@ -35,7 +35,7 @@ class TestReportbuilderHtml < Test::Unit::TestCase
35
35
  def test_include_css
36
36
  mock_element = ""
37
37
  eval(" class << mock_element
38
- def to_rb_html(generator)
38
+ def to_reportbuilder_html(generator)
39
39
  generator.add_css('"+@datadir+"/reportbuilder.css')
40
40
  end
41
41
  end ")
@@ -0,0 +1,42 @@
1
+ require "test/unit"
2
+ $:.unshift(File.dirname(__FILE__)+"/../lib")
3
+ require "reportbuilder"
4
+
5
+ class TestReportbuilderImage < Test::Unit::TestCase
6
+ def setup
7
+ @tmpdir=Dir::mktmpdir
8
+ @rp=ReportBuilder.new("Test", @tmpdir)
9
+ @datadir=File.dirname(__FILE__)+"/../data"
10
+ @rp.add(@rp.image(@datadir+"/sheep.jpg"))
11
+ end
12
+ def teardown
13
+ FileUtils.remove_entry_secure @tmpdir
14
+ end
15
+ def test_image_text
16
+ expected= <<-HERE
17
+ Report: Test
18
+ +--------------------------------+
19
+ | *********#** |
20
+ | ****#********# * |
21
+ | * * *********#******* * |
22
+ | * *** *** * *|
23
+ | * * WWW WW* *** |
24
+ | **** *WW* WWW * **#* |
25
+ | **** * * **** |
26
+ | ***** # ** *#*** |
27
+ | ****** ** * *#**** |
28
+ | ****** ******** |
29
+ | ******* ** ****** |
30
+ | **#*** * ******* |
31
+ | ****#** *#***** |
32
+ | **#***** |
33
+ +--------------------------------+
34
+ HERE
35
+ puts @rp.to_s
36
+ assert_equal(expected, @rp.to_s)
37
+ end
38
+ def test_image_html
39
+ assert_match(/img src='images\/sheep.jpg'/, @rp.to_html)
40
+ end
41
+
42
+ end
data/test/test_section.rb CHANGED
@@ -5,14 +5,16 @@ require "reportbuilder"
5
5
  class TestReportbuilderSection < Test::Unit::TestCase
6
6
  def setup
7
7
  @rp=ReportBuilder.new("Test Report")
8
- s1=@rp.section("Section 1")
8
+ s1=@rp.section(:name=>"Section 1")
9
9
  @rp.add s1
10
10
  s1.add("Texto 1")
11
11
  s1.add(2)
12
- s11=@rp.section("Section 1.1")
12
+ s11=@rp.section(:name=>"Section 1.1")
13
13
  s1.add s11
14
+ s111=@rp.section(:name=>"Section 1.1.1")
15
+ s11.add s111
14
16
  s1.add("Texto 1.1")
15
- s2=@rp.section("Section 2")
17
+ s2=@rp.section(:name=>"Section 2")
16
18
  @rp.add s2
17
19
  end
18
20
  def test_section_text
@@ -22,6 +24,7 @@ Report: Test Report
22
24
  Texto 1
23
25
  2
24
26
  == Section 1.1
27
+ === Section 1.1.1
25
28
  Texto 1.1
26
29
  = Section 2
27
30
 
@@ -35,18 +38,23 @@ HERE
35
38
  <li><a href='#toc_1'>Section 1</a></li>
36
39
  <ul>
37
40
  <li><a href='#toc_2'>Section 1.1</a></li>
41
+ <ul>
42
+ <li><a href='#toc_3'>Section 1.1.1</a></li>
43
+ </ul>
38
44
  </ul>
39
- <li><a href='#toc_3'>Section 2</a></li>
45
+ <li><a href='#toc_4'>Section 2</a></li>
40
46
  </ul>
41
47
  </div>
42
48
  <div class='section'><h2>Section 1</h2><a name='toc_1'></a>
43
49
  <pre>Texto 1</pre>
44
50
  <pre>2</pre>
45
51
  <div class='section'><h3>Section 1.1</h3><a name='toc_2'></a>
52
+ <div class='section'><h4>Section 1.1.1</h4><a name='toc_3'></a>
53
+ </div>
46
54
  </div>
47
55
  <pre>Texto 1.1</pre>
48
56
  </div>
49
- <div class='section'><h2>Section 2</h2><a name='toc_3'></a>
57
+ <div class='section'><h2>Section 2</h2><a name='toc_4'></a>
50
58
  </div>
51
59
  </body></html>
52
60
  HERE
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reportbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Bustos
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-08 00:00:00 -03:00
12
+ date: 2010-02-06 00:00:00 -03:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 2.3.3
23
+ version: 2.4.0
24
24
  version:
25
25
  description: Report Abstract Interface. Creates text, html and pdf output, based on a common framework
26
26
  email:
@@ -41,15 +41,18 @@ files:
41
41
  - bin/reportbuilder
42
42
  - data/reportbuilder.css
43
43
  - data/reportbuilder.js
44
+ - data/sheep.jpg
45
+ - lib/reportbuilder.rb
44
46
  - lib/reportbuilder/generator.rb
45
47
  - lib/reportbuilder/generator/html.rb
46
48
  - lib/reportbuilder/generator/text.rb
47
- - lib/reportbuilder.rb
49
+ - lib/reportbuilder/image.rb
48
50
  - lib/reportbuilder/section.rb
49
51
  - lib/reportbuilder/table.rb
50
52
  - lib/reportbuilder/table/htmlgenerator.rb
51
53
  - lib/reportbuilder/table/textgenerator.rb
52
54
  - test/test_html.rb
55
+ - test/test_image.rb
53
56
  - test/test_reportbuilder.rb
54
57
  - test/test_section.rb
55
58
  - test/test_table.rb
@@ -85,5 +88,6 @@ summary: Report Abstract Interface
85
88
  test_files:
86
89
  - test/test_section.rb
87
90
  - test/test_table.rb
91
+ - test/test_image.rb
88
92
  - test/test_html.rb
89
93
  - test/test_reportbuilder.rb