reportbuilder 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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