reportbuilder 1.3.0 → 1.4.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.tar.gz.sig CHANGED
Binary file
@@ -1,5 +1,8 @@
1
- === 1.3.0 / 2010-11-24
1
+ === 1.4.0 / 2010-11-26
2
+ * Basic support for pdf creation, using Prawn. SVG insertion could be realized using Prawn-svg (as vectors) or Rmagick (as bitmap)
3
+ * Added SimpleCov support
2
4
 
5
+ === 1.3.0 / 2010-11-24
3
6
  * Implemented loading of images via blobs and filenames.
4
7
  * SVG are converted to raster before inserted of RTFs
5
8
  * First (almost) complete support for Graph API on jqPlot and Flot. Test for Graph and jqPlot wrapper for html
@@ -385,6 +385,7 @@ examples/using_a_block.rb
385
385
  lib/reportbuilder.rb
386
386
  lib/reportbuilder/builder.rb
387
387
  lib/reportbuilder/builder/html.rb
388
+ lib/reportbuilder/builder/pdf.rb
388
389
  lib/reportbuilder/builder/rtf.rb
389
390
  lib/reportbuilder/builder/text.rb
390
391
  lib/reportbuilder/graph.rb
@@ -394,6 +395,7 @@ lib/reportbuilder/image.rb
394
395
  lib/reportbuilder/section.rb
395
396
  lib/reportbuilder/table.rb
396
397
  lib/reportbuilder/table/htmlbuilder.rb
398
+ lib/reportbuilder/table/pdfbuilder.rb
397
399
  lib/reportbuilder/table/rtfbuilder.rb
398
400
  lib/reportbuilder/table/textbuilder.rb
399
401
  test/helper_test.rb
data/Rakefile CHANGED
@@ -12,8 +12,10 @@ Hoe.spec 'reportbuilder' do
12
12
  self.rubyforge_name = 'ruby-statsample'
13
13
  self.developer('Claudio Bustos', 'clbustos_at_gmail.com')
14
14
  self.url = "http://ruby-statsample.rubyforge.org/reportbuilder/"
15
- self.extra_deps << ["clbustos-rtf","~>0.3.0"] << ['text-table', "~>1.2"]
15
+ self.extra_deps << ["clbustos-rtf","~>0.4.0"] << ['text-table', "~>1.2"] << ["prawn", "~>0.8.4"] << ["prawn-svg","~>0.9.1"]
16
16
  self.extra_dev_deps << ["nokogiri", "~>1.4"]
17
17
  end
18
18
 
19
+
20
+
19
21
  # vim: syntax=ruby
@@ -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.3.0'
55
+ VERSION = '1.4.0'
56
56
  DATA_DIR=File.dirname(__FILE__)+"/../data"
57
57
  FormatNotFound=Class.new(Exception)
58
58
  # Available formats
@@ -118,17 +118,22 @@ class ReportBuilder
118
118
  self
119
119
  end
120
120
  # Returns an Html output
121
- def to_html()
121
+ def to_html
122
122
  gen = Builder::Html.new(self,@options)
123
123
  gen.parse
124
124
  gen.out
125
125
  end
126
126
  # Returns a RTF output
127
- def to_rtf()
127
+ def to_rtf
128
128
  gen = Builder::Rtf.new(self, @options)
129
129
  gen.parse
130
130
  gen.out
131
- end
131
+ end
132
+ def to_pdf
133
+ gen = Builder::Pdf.new(self, @options)
134
+ gen.parse
135
+ gen.out
136
+ end
132
137
  # Save a rtf file
133
138
  def save_rtf(filename)
134
139
  gen = Builder::Rtf.new(self,@options)
@@ -143,6 +148,14 @@ class ReportBuilder
143
148
  gen.parse
144
149
  gen.save(file)
145
150
  end
151
+ # Save a pdf file
152
+ def save_pdf(file)
153
+ options=@options.dup
154
+ gen=Builder::Pdf.new(self, options)
155
+ gen.parse
156
+ gen.save(file)
157
+ end
158
+
146
159
  # Returns a Text output
147
160
  def to_text()
148
161
  gen=Builder::Text.new(self, @options)
@@ -154,5 +167,6 @@ class ReportBuilder
154
167
  gen.parse
155
168
  gen.save(file)
156
169
  end
170
+
157
171
  alias_method :to_s, :to_text
158
172
  end
@@ -157,4 +157,4 @@ end
157
157
  require 'reportbuilder/builder/text'
158
158
  require 'reportbuilder/builder/html'
159
159
  require 'reportbuilder/builder/rtf'
160
-
160
+ require 'reportbuilder/builder/pdf'
@@ -0,0 +1,67 @@
1
+ require 'prawn'
2
+ require 'prawn-svg'
3
+ require 'pp'
4
+ class ReportBuilder
5
+ class Builder
6
+ # Rtf Builder.
7
+ # Based on Prawn[http://prawn.majesticseacreature.com/]
8
+ #
9
+ class Pdf < Builder
10
+ # Pdf object.
11
+ attr_accessor :pdf
12
+ # Creates a new Pdf object
13
+ # Params:
14
+ # * <tt>builder</tt>: A ReportBuilder::Builder object or other with same interface
15
+ # * <tt>options</tt>: Hash of options.
16
+ def initialize(builder, options)
17
+ super
18
+ @pdf=Prawn::Document.new(options)
19
+ @pdf.font_size=@options[:font_size]
20
+ end
21
+
22
+ def self.code
23
+ %w{pdf}
24
+ end
25
+ def parse
26
+ unless @builder.no_title
27
+ header(0,@builder.name)
28
+ end
29
+ parse_cycle(@builder)
30
+ end
31
+
32
+ def default_options
33
+ {
34
+ :font_size=>12
35
+ }
36
+ end
37
+ # Add a paragraph of text.
38
+ def text(t)
39
+
40
+ @pdf.text(t)
41
+ end
42
+ # Add a header of level <tt>level</tt> with text <tt>t</tt>
43
+ # Level works similar to h
44
+ def header(level, t)
45
+ @pdf.text t, :size=>15-level
46
+ end
47
+ # Add preformatted text.
48
+ def preformatted(t)
49
+ @pdf.font("Courier") do
50
+ @pdf.text t
51
+ end
52
+ end
53
+ # Returns pdf code for report
54
+ def out
55
+ @pdf.render
56
+ end
57
+ # Save pdf file
58
+ def save(filename)
59
+ @pdf.render_file(filename)
60
+ end
61
+ # Do nothing on this builder
62
+ def html(t)
63
+ # Nothing
64
+ end
65
+ end
66
+ end
67
+ end
@@ -33,14 +33,19 @@ class ReportBuilder
33
33
  @header_styles=Hash.new {|h,k|
34
34
  cs=CharacterStyle.new
35
35
  cs.font=@font
36
- cs.font_size=@options[:font_size]+(8-k)*2
36
+ cs.font_size=@options[:font_size]+(8-k)*1.5
37
37
  cs.bold=true
38
38
  ps=ParagraphStyle.new
39
39
  ps.justification = ParagraphStyle::CENTER_JUSTIFY
40
40
  h[k]={:cs=>cs, :ps=>ps}
41
41
  }
42
42
  end
43
-
43
+ def parse
44
+ unless @builder.no_title
45
+ header(0,@builder.name)
46
+ end
47
+ parse_cycle(@builder)
48
+ end
44
49
  def self.code
45
50
  %w{rtf}
46
51
  end
@@ -10,6 +10,7 @@ class ReportBuilder
10
10
  attr_accessor :font_cols
11
11
  attr_accessor :width
12
12
  attr_accessor :height
13
+ attr_accessor :svg_raster
13
14
  attr_accessor :type
14
15
  attr_reader :filename
15
16
  attr_reader :url
@@ -22,7 +23,7 @@ class ReportBuilder
22
23
  @name="Image #{@@n}"
23
24
  @@n+=1
24
25
  else
25
- @name=options[:name]
26
+ @name=options.delete :name
26
27
  end
27
28
 
28
29
  default_options={
@@ -31,17 +32,23 @@ class ReportBuilder
31
32
  ':', '~', '.', ' ' ],
32
33
  :font_rows => 8,
33
34
  :font_cols => 4,
34
- :width=>400,
35
- :height=>300
35
+ :width=>nil,
36
+ :height=>nil,
37
+ :svg_raster=>false
36
38
  }
37
- @options=default_options.merge(options)
39
+ @options=default_options.merge options
38
40
  @options.each {|k,v|
39
41
  self.send("#{k}=",v) if self.respond_to? k
40
42
  }
41
43
  end
42
44
  # Get image_magick version of the image
43
45
  def image_magick
44
- raise "Must be implemented"
46
+ if ReportBuilder.has_rmagick?
47
+ _image_magick if respond_to? :_image_magick
48
+
49
+ else
50
+ raise "Requires RMagick"
51
+ end
45
52
  end
46
53
  # Based on http://rubyquiz.com/quiz50.html
47
54
  def report_building_text(builder)
@@ -97,16 +104,20 @@ class ReportBuilder
97
104
  end
98
105
  # Generate the code for images on html
99
106
  def generate_tag_html(builder)
107
+ attrs=""
108
+ attrs+=" height='#{:height}' " if :height
109
+ attrs+=" width='#{:width}' " if :width
110
+
100
111
  if @type=='svg'
101
112
  builder.html("
102
113
  <div class='image'>
103
114
  <!--[if IE]>
104
- <embed class='svg' height='#{@options[:height]}' src='#{@url}' width='#{@options[:width]}'></embed>
115
+ <embed class='svg' src='#{@url}' #{attrs}'></embed>
105
116
  <![endif]-->
106
- <object class='svg' data='#{@url}' height='#{@options[:height]}' type='image/svg+xml' width='#{@options[:width]}'></object>
117
+ <object class='svg' data='#{@url}' type='image/svg+xml' #{attrs} ></object>
107
118
  </div>")
108
119
  else
109
- builder.html("<img src='#{@url}' alt='#{@options[:alt]}' />")
120
+ builder.html "<img src='#{@url}' alt='#{alt}' #{attrs} />"
110
121
  end
111
122
  end
112
123
  def create_file(directory)
@@ -116,13 +127,29 @@ class ReportBuilder
116
127
  create_file(builder.directory)
117
128
  generate_tag_html(builder)
118
129
  end
130
+ def report_building_pdf(builder)
131
+ require 'tmpdir'
132
+ dir=Dir::mktmpdir
133
+ create_file(dir)
134
+ if @type=='svg'
135
+ if svg_raster
136
+ builder.pdf.image(generate_raster_from_svg(dir))
137
+ else
138
+ # Prawn-svg is not ready for production.
139
+ y=builder.pdf.y
140
+ builder.pdf.svg File.read(@filename), :at=>[0, y-60]
141
+ end
142
+ else
143
+ builder.pdf.image(filename, @options)
144
+ end
145
+ end
119
146
  # return filename
120
147
  def generate_raster_from_svg(dir)
121
-
122
148
  out_file="#{dir}/#{@id}.png"
123
- `rsvg '#{filename}' #{out_file}`
149
+ image_magick.write(out_file)
124
150
  out_file
125
151
  end
152
+
126
153
  def report_building_rtf(builder)
127
154
  require 'tmpdir'
128
155
  directory=Dir::mktmpdir
@@ -149,8 +176,14 @@ class ReportBuilder
149
176
  end
150
177
  end
151
178
  end
152
- def image_magick
153
- Magick::Image.from_blob(@blob)
179
+ def _image_magick
180
+ that=self
181
+ img=Magick::Image.from_blob(@blob) {
182
+ if that.type=='svg'
183
+ self.format='SVG'
184
+ end
185
+ }
186
+ img.first
154
187
  end
155
188
  def create_file(directory)
156
189
  FileUtils.mkdir_p directory+"/images"
@@ -171,7 +204,7 @@ class ReportBuilder
171
204
  File.basename(@filename)=~/\.(.+)$/
172
205
  @type=File.basename($1)
173
206
  end
174
- def image_magick
207
+ def _image_magick
175
208
  Magick::Image.read(@filename).first
176
209
  end
177
210
  def create_file(directory)
@@ -40,9 +40,14 @@ class ReportBuilder::Section
40
40
  end
41
41
  def report_building_rtf(g)
42
42
  level=g.parse_level
43
- g.header(level,name)
43
+ g.header(level, name)
44
44
  g.parse_cycle(self)
45
45
  end
46
+ def report_building_pdf(g)
47
+ level=g.parse_level
48
+ g.header(level, name)
49
+ g.parse_cycle(self)
50
+ end
46
51
  def add(element)
47
52
  if element.is_a? ReportBuilder::Section
48
53
  element.parent=self
@@ -28,23 +28,24 @@ class ReportBuilder
28
28
  # Array of headers
29
29
  attr_accessor :header, :name
30
30
  # Size for each column
31
- attr_reader :max_cols
31
+ attr_reader :max_cols
32
32
  # Array of rows
33
- attr_reader :rows
33
+ attr_reader :rows
34
+ attr_accessor :options
34
35
  # Create a new table.
35
36
  # Options: :name, :header
36
37
  # Use:
37
38
  # table=ReportBuilder::Table.new(:header =>["var1","var2"])
38
39
  def initialize(opts=Hash.new, &block)
39
40
  raise ArgumentError,"opts should be a Hash" if !opts.is_a? Hash
40
- opts=DEFAULT_OPTIONS.merge opts
41
- if opts[:name].nil?
41
+ @options=DEFAULT_OPTIONS.merge opts
42
+ if @options[:name].nil?
42
43
  @name= "Table #{@@n}"
43
44
  @@n+=1
44
45
  else
45
- @name=opts[:name]
46
+ @name=@options.delete :name
46
47
  end
47
- @header=opts[:header]
48
+ @header=@options.delete :header
48
49
  @rows=[]
49
50
  @max_cols=[]
50
51
  if block
@@ -124,6 +125,12 @@ class ReportBuilder
124
125
  table_builder=ReportBuilder::Table::RtfBuilder.new(builder, self)
125
126
  table_builder.generate
126
127
  end
128
+ def report_building_pdf(builder)
129
+ require 'reportbuilder/table/pdfbuilder'
130
+ table_builder=ReportBuilder::Table::PdfBuilder.new(builder, self)
131
+ table_builder.generate
132
+ end
133
+
127
134
  def total_width # :nodoc:
128
135
  if @max_cols.size>0
129
136
  @max_cols.inject(0){|a,v| a+(v+3)}+1
@@ -0,0 +1,36 @@
1
+ require 'text-table'
2
+ require 'prawn/table'
3
+ class ReportBuilder
4
+ class Table
5
+ # Text Builder for ReportBuilder::Table objects.
6
+ #
7
+ # Uses Aaron Tinio's text-table gem[http://github.com/aptinio/text-table]
8
+
9
+ class PdfBuilder < ElementBuilder
10
+ def generate()
11
+ t=@element
12
+ @pdf=@builder.pdf
13
+ @rowspans=[]
14
+ @pdf.text t.name, :size=>14
15
+ return if t.header.size+t.rows.size==0
16
+ has_header=t.header.size>0
17
+ if has_header
18
+ t_options=t.options.merge({:headers=>t.header})
19
+ @pdf.table(t.rows.map{|row| parse_row(row)}, t_options) do
20
+ row(0).style(:style => :bold, :background_color => 'cccccc')
21
+ end
22
+ else
23
+ @pdf.table(t.rows.map{|row| parse_row(row)}, t.options)
24
+ end
25
+ end
26
+ # Parse a row
27
+ def parse_row(row)
28
+ if row==:hr
29
+ []
30
+ else
31
+ row
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,4 +1,15 @@
1
1
  $:.unshift(File.dirname(__FILE__)+"/../lib")
2
+ begin
3
+ require 'simplecov'
4
+
5
+ SimpleCov.start do
6
+ add_filter '/test/'
7
+ add_filter '/examples/'
8
+ add_group 'Libraries', 'lib'
9
+ end
10
+ rescue LoadError
11
+ end
12
+
2
13
  require "reportbuilder"
3
14
  require 'nokogiri'
4
15
  require 'minitest/unit'
@@ -11,7 +11,6 @@ class TestReportbuilderImage < MiniTest::Unit::TestCase
11
11
  end
12
12
  def test_image_text
13
13
  @rp.add(ReportBuilder::ImageFilename.new(@datadir+"/sheep.jpg"))
14
-
15
14
  expected= <<-HERE
16
15
  Test
17
16
  +--------------------------------+
@@ -49,7 +48,6 @@ Test
49
48
  assert_equal(out, File.read(image_blob.filename))
50
49
  assert_match(/img src='#{image_blob.url}'/, @rp.to_html)
51
50
  assert_match(/\\pict\\picw128\\pich112\\bliptag\d+\\jpegblip/, @rp.to_rtf)
52
-
53
51
  end
54
52
  def test_image_blob_svg
55
53
  svg='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="200px" height="50px">
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reportbuilder
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 1.3.0
10
+ version: 1.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Claudio Bustos
@@ -36,7 +36,7 @@ cert_chain:
36
36
  rpP0jjs0
37
37
  -----END CERTIFICATE-----
38
38
 
39
- date: 2010-11-24 00:00:00 -03:00
39
+ date: 2010-11-26 00:00:00 -03:00
40
40
  default_executable:
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
@@ -47,12 +47,12 @@ dependencies:
47
47
  requirements:
48
48
  - - ~>
49
49
  - !ruby/object:Gem::Version
50
- hash: 19
50
+ hash: 15
51
51
  segments:
52
52
  - 0
53
- - 3
53
+ - 4
54
54
  - 0
55
- version: 0.3.0
55
+ version: 0.4.0
56
56
  type: :runtime
57
57
  version_requirements: *id001
58
58
  - !ruby/object:Gem::Dependency
@@ -71,9 +71,41 @@ dependencies:
71
71
  type: :runtime
72
72
  version_requirements: *id002
73
73
  - !ruby/object:Gem::Dependency
74
- name: rubyforge
74
+ name: prawn
75
75
  prerelease: false
76
76
  requirement: &id003 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ hash: 55
82
+ segments:
83
+ - 0
84
+ - 8
85
+ - 4
86
+ version: 0.8.4
87
+ type: :runtime
88
+ version_requirements: *id003
89
+ - !ruby/object:Gem::Dependency
90
+ name: prawn-svg
91
+ prerelease: false
92
+ requirement: &id004 !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ hash: 57
98
+ segments:
99
+ - 0
100
+ - 9
101
+ - 1
102
+ version: 0.9.1
103
+ type: :runtime
104
+ version_requirements: *id004
105
+ - !ruby/object:Gem::Dependency
106
+ name: rubyforge
107
+ prerelease: false
108
+ requirement: &id005 !ruby/object:Gem::Requirement
77
109
  none: false
78
110
  requirements:
79
111
  - - ">="
@@ -85,11 +117,11 @@ dependencies:
85
117
  - 4
86
118
  version: 2.0.4
87
119
  type: :development
88
- version_requirements: *id003
120
+ version_requirements: *id005
89
121
  - !ruby/object:Gem::Dependency
90
122
  name: nokogiri
91
123
  prerelease: false
92
- requirement: &id004 !ruby/object:Gem::Requirement
124
+ requirement: &id006 !ruby/object:Gem::Requirement
93
125
  none: false
94
126
  requirements:
95
127
  - - ~>
@@ -100,11 +132,11 @@ dependencies:
100
132
  - 4
101
133
  version: "1.4"
102
134
  type: :development
103
- version_requirements: *id004
135
+ version_requirements: *id006
104
136
  - !ruby/object:Gem::Dependency
105
137
  name: hoe
106
138
  prerelease: false
107
- requirement: &id005 !ruby/object:Gem::Requirement
139
+ requirement: &id007 !ruby/object:Gem::Requirement
108
140
  none: false
109
141
  requirements:
110
142
  - - ">="
@@ -116,7 +148,7 @@ dependencies:
116
148
  - 0
117
149
  version: 2.7.0
118
150
  type: :development
119
- version_requirements: *id005
151
+ version_requirements: *id007
120
152
  description: Report Abstract Interface. Creates text, html and rtf output, based on a common framework.
121
153
  email:
122
154
  - clbustos_at_gmail.com
@@ -516,6 +548,7 @@ files:
516
548
  - lib/reportbuilder.rb
517
549
  - lib/reportbuilder/builder.rb
518
550
  - lib/reportbuilder/builder/html.rb
551
+ - lib/reportbuilder/builder/pdf.rb
519
552
  - lib/reportbuilder/builder/rtf.rb
520
553
  - lib/reportbuilder/builder/text.rb
521
554
  - lib/reportbuilder/graph.rb
@@ -525,6 +558,7 @@ files:
525
558
  - lib/reportbuilder/section.rb
526
559
  - lib/reportbuilder/table.rb
527
560
  - lib/reportbuilder/table/htmlbuilder.rb
561
+ - lib/reportbuilder/table/pdfbuilder.rb
528
562
  - lib/reportbuilder/table/rtfbuilder.rb
529
563
  - lib/reportbuilder/table/textbuilder.rb
530
564
  - test/helper_test.rb
metadata.gz.sig CHANGED
Binary file