reportbuilder 0.1.0 → 0.2.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/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