report_engine 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/images/empty_heart.jpg +0 -0
- data/images/folder_open.png +0 -0
- data/images/full_heart.jpg +0 -0
- data/images/half_heart.jpg +0 -0
- data/lib/report_engine.rb +50 -0
- data/lib/report_engine/canvas_factory.rb +13 -0
- data/lib/report_engine/container.rb +4 -0
- data/lib/report_engine/footer.rb +13 -0
- data/lib/report_engine/google_chart.rb +59 -0
- data/lib/report_engine/horizontal_chart.rb +43 -0
- data/lib/report_engine/html/container.rb +9 -0
- data/lib/report_engine/html/google_chart.rb +9 -0
- data/lib/report_engine/html/list.rb +18 -0
- data/lib/report_engine/html/question_stats.rb +29 -0
- data/lib/report_engine/html/section.rb +16 -0
- data/lib/report_engine/html/sub_table.rb +14 -0
- data/lib/report_engine/html/table.rb +77 -0
- data/lib/report_engine/html/text.rb +15 -0
- data/lib/report_engine/html_canvas.rb +23 -0
- data/lib/report_engine/list.rb +22 -0
- data/lib/report_engine/page.rb +14 -0
- data/lib/report_engine/pdf/container.rb +9 -0
- data/lib/report_engine/pdf/google_chart.rb +9 -0
- data/lib/report_engine/pdf/list.rb +9 -0
- data/lib/report_engine/pdf/question_stats.rb +27 -0
- data/lib/report_engine/pdf/section.rb +17 -0
- data/lib/report_engine/pdf/sub_table.rb +6 -0
- data/lib/report_engine/pdf/table.rb +72 -0
- data/lib/report_engine/pdf/text.rb +11 -0
- data/lib/report_engine/pdf_canvas.rb +38 -0
- data/lib/report_engine/question_stats.rb +12 -0
- data/lib/report_engine/report.rb +19 -0
- data/lib/report_engine/sub_table.rb +10 -0
- data/lib/report_engine/table.rb +35 -0
- data/lib/report_engine/text.rb +13 -0
- data/report_engine.gemspec +90 -0
- data/test/category_test.rb +65 -0
- data/test/chart_test.rb +8 -0
- data/test/forebyg_test.rb +81 -0
- data/test/helper.rb +11 -0
- data/test/horizontal_chart_test.rb +5 -0
- data/test/pdftest.rb +15 -0
- data/test/repartition_test.rb +32 -0
- data/test/test_chart.rb +22 -0
- data/test/test_correlation_report.rb +65 -0
- data/test/test_feedback.rb +48 -0
- data/test/test_question_stats.rb +35 -0
- data/test/test_report.rb +82 -0
- data/test/test_report_engine.rb +8 -0
- data/test/test_table.rb +54 -0
- metadata +110 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
module Html
|
3
|
+
class Text < ReportEngine::Text
|
4
|
+
def render
|
5
|
+
@canvas.add_content "<#{@tag_type.to_s} #{tag_id}>#{@text.to_s}</#{@tag_type.to_s}>"
|
6
|
+
end
|
7
|
+
|
8
|
+
def tag_id
|
9
|
+
return "" if @tag_id.nil?
|
10
|
+
"id=\"#{@tag_id}\""
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
class HtmlCanvas
|
3
|
+
def initialize
|
4
|
+
@content = ''
|
5
|
+
end
|
6
|
+
|
7
|
+
def paint(klass, options)
|
8
|
+
ReportEngine::Html.const_get(klass.to_s.camelize).new(self, options).render
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_content(html)
|
12
|
+
@content << html
|
13
|
+
end
|
14
|
+
|
15
|
+
def render
|
16
|
+
@content
|
17
|
+
end
|
18
|
+
|
19
|
+
def render_file(filename)
|
20
|
+
raise "Rendering HTML to a file is not possible."
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
class List
|
3
|
+
def initialize(canvas, options)
|
4
|
+
@elements = options[:elements]
|
5
|
+
@canvas = canvas
|
6
|
+
end
|
7
|
+
|
8
|
+
def render
|
9
|
+
add_list_start
|
10
|
+
@elements.each do |element|
|
11
|
+
add_list_element(element)
|
12
|
+
end
|
13
|
+
add_list_end
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_list_start
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_list_end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
module Pdf
|
3
|
+
class QuestionStats < ReportEngine::QuestionStats
|
4
|
+
|
5
|
+
# TODO: Remove initializer
|
6
|
+
def initialize(canvas, options)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
@canvas.add_block do |pdf|
|
12
|
+
pdf.bounding_box([0, pdf.cursor], :width => pdf.bounds.width) do
|
13
|
+
pdf.text @text, :size => 10
|
14
|
+
end
|
15
|
+
pdf.move_down(10)
|
16
|
+
pdf.bounding_box([10, pdf.cursor], :width => pdf.bounds.width - 10) do
|
17
|
+
pdf.image open(@canvas.paint(@chart[:type], @chart)), :scale => 0.6
|
18
|
+
end
|
19
|
+
pdf.bounding_box([20, pdf.cursor], :width => pdf.bounds.width - 20) do
|
20
|
+
@canvas.paint(@details[:type], @details)
|
21
|
+
end
|
22
|
+
pdf.move_down(10)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
module Pdf
|
3
|
+
class Section < ReportEngine::Page
|
4
|
+
def print_content
|
5
|
+
@elements.each do |element|
|
6
|
+
@canvas.paint(element.delete(:type), element)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def print_title
|
11
|
+
@canvas.pdf.pad(10) do
|
12
|
+
@canvas.pdf.text @title, :size => 24
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
module Pdf
|
3
|
+
class Table < ReportEngine::Table
|
4
|
+
|
5
|
+
def initialize(canvas, options)
|
6
|
+
super
|
7
|
+
@font_size = options[:font_size] || 8
|
8
|
+
@padding = options[:padding] || 5
|
9
|
+
end
|
10
|
+
|
11
|
+
def render
|
12
|
+
pdf = @canvas.pdf
|
13
|
+
if @data.first.is_a? Hash
|
14
|
+
@data = @data.map{|sub_table| ReportEngine::Pdf::SubTable.new(@canvas, sub_table.clone).data}.inject([]){|x, y| x+= y }
|
15
|
+
end
|
16
|
+
add_headers if @x_headers
|
17
|
+
table_top_position = pdf.cursor
|
18
|
+
margin = @y_label.nil? ? 0 : 40
|
19
|
+
pdf.bounding_box([margin, table_top_position], :width => pdf.bounds.width) do
|
20
|
+
pdf.table @data, :border_style => :grid,
|
21
|
+
:align => :center,
|
22
|
+
:font_size => @font_size,
|
23
|
+
:vertical_padding => @padding,
|
24
|
+
:column_widths => @column_widths,
|
25
|
+
:row_colors => @row_colors,
|
26
|
+
:border_color => @border_color
|
27
|
+
end
|
28
|
+
write_x_label(table_top_position) if @x_label
|
29
|
+
write_y_label(table_top_position) if @y_label
|
30
|
+
print_legends if @legends
|
31
|
+
end
|
32
|
+
|
33
|
+
def write_y_label(table_top_position)
|
34
|
+
pdf = @canvas.pdf
|
35
|
+
vertical_text_width = pdf.width_of(@y_label)
|
36
|
+
pdf.draw_text @y_label, :at => [30, table_top_position - 30 - vertical_text_width], :rotate => 90
|
37
|
+
end
|
38
|
+
|
39
|
+
def write_x_label(table_top_position)
|
40
|
+
@canvas.pdf.draw_text @x_label, :at => [90, table_top_position + 10]
|
41
|
+
end
|
42
|
+
|
43
|
+
def print_legends
|
44
|
+
@canvas.pdf.move_down(10)
|
45
|
+
@legends.each do |legend|
|
46
|
+
@canvas.pdf.text legend, :size => 10
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def height(options={})
|
51
|
+
pdf = @canvas.pdf
|
52
|
+
# not an ideal way of getting the height, very aproximative
|
53
|
+
font_size = options[:font_size] || 10
|
54
|
+
padding = options[:padding] || 10
|
55
|
+
|
56
|
+
line_height = pdf.font.height_at(font_size) + (padding * 2)
|
57
|
+
number_of_lines = @y_headers.nil? ? 0 : 1
|
58
|
+
|
59
|
+
if @data.first.is_a? ReportEngine::SubTable
|
60
|
+
temp_height = @data.map{|sub_table| sub_table.height(pdf, options) }.inject(0){|sum, v| sum += v}
|
61
|
+
else
|
62
|
+
number_of_lines += @data.size
|
63
|
+
temp_height = 0
|
64
|
+
end
|
65
|
+
|
66
|
+
temp_height + (number_of_lines * line_height)
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
class PdfCanvas
|
3
|
+
|
4
|
+
attr_reader :pdf
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@pdf = Prawn::Document.new()
|
8
|
+
end
|
9
|
+
|
10
|
+
def render_file(filename)
|
11
|
+
@pdf.render_file(filename)
|
12
|
+
end
|
13
|
+
|
14
|
+
def render
|
15
|
+
@pdf.render
|
16
|
+
end
|
17
|
+
|
18
|
+
def add(element)
|
19
|
+
element.render(@pdf)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_block(&blk)
|
23
|
+
success = @pdf.transaction do
|
24
|
+
blk.call @pdf
|
25
|
+
@pdf.rollback if @pdf.cursor < 0
|
26
|
+
end
|
27
|
+
unless success
|
28
|
+
@pdf.start_new_page
|
29
|
+
blk.call @pdf
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def paint(klass, options)
|
34
|
+
ReportEngine::Pdf.const_get(klass.to_s.camelize).new(self, options).render
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
class Report
|
3
|
+
def initialize(options)
|
4
|
+
@options = options
|
5
|
+
end
|
6
|
+
|
7
|
+
def render(format)
|
8
|
+
canvas = CanvasFactory.build(format)
|
9
|
+
canvas.paint(@options.delete(:type), @options)
|
10
|
+
canvas.render
|
11
|
+
end
|
12
|
+
|
13
|
+
def render_file(format, filename)
|
14
|
+
canvas = CanvasFactory.build(format)
|
15
|
+
canvas.paint(@options.delete(:type), @options)
|
16
|
+
canvas.render_file(filename)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
class Table
|
3
|
+
def initialize(canvas, options)
|
4
|
+
@canvas = canvas
|
5
|
+
@data = options[:data].clone
|
6
|
+
@axis_title= options[:axis_title] || "Axes"
|
7
|
+
@x_label = options[:x_label]
|
8
|
+
@y_label = options[:y_label]
|
9
|
+
@x_headers = options[:x_headers]
|
10
|
+
@y_headers = options[:y_headers]
|
11
|
+
@border_color = options[:border_color] || '000000'
|
12
|
+
@row_colors = options[:row_colors] || []
|
13
|
+
@column_widths = options[:column_widths] || {}
|
14
|
+
@legends = options[:legends]
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_y_headers
|
18
|
+
if !@y_headers.nil? && !@y_headers.empty?
|
19
|
+
@data.each_with_index do |line, i|
|
20
|
+
line.insert(0, @y_headers[i] )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_headers
|
26
|
+
add_y_headers
|
27
|
+
@data.insert 0, @x_headers
|
28
|
+
end
|
29
|
+
|
30
|
+
def data
|
31
|
+
return @data
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ReportEngine
|
2
|
+
class Text
|
3
|
+
def initialize(canvas, options)
|
4
|
+
@canvas = canvas
|
5
|
+
@text = options[:text]
|
6
|
+
@size = options[:size] || 10
|
7
|
+
@padding = options[:padding] || 0
|
8
|
+
@tag_type = options[:tag_type] || :p
|
9
|
+
@tag_id = options[:id]
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "report_engine"
|
8
|
+
s.version = "1.2.4"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Bastien Vaucher", "Jacob Atzen"]
|
12
|
+
s.date = "2011-11-02"
|
13
|
+
s.description = "Layer on top of prawn and the html renderer to generate reports for Novalis::teneo"
|
14
|
+
s.email = "bastien.vaucher@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"images/empty_heart.jpg",
|
26
|
+
"images/folder_open.png",
|
27
|
+
"images/full_heart.jpg",
|
28
|
+
"images/half_heart.jpg",
|
29
|
+
"lib/report_engine.rb",
|
30
|
+
"lib/report_engine/canvas_factory.rb",
|
31
|
+
"lib/report_engine/container.rb",
|
32
|
+
"lib/report_engine/footer.rb",
|
33
|
+
"lib/report_engine/google_chart.rb",
|
34
|
+
"lib/report_engine/horizontal_chart.rb",
|
35
|
+
"lib/report_engine/html/container.rb",
|
36
|
+
"lib/report_engine/html/google_chart.rb",
|
37
|
+
"lib/report_engine/html/list.rb",
|
38
|
+
"lib/report_engine/html/question_stats.rb",
|
39
|
+
"lib/report_engine/html/section.rb",
|
40
|
+
"lib/report_engine/html/sub_table.rb",
|
41
|
+
"lib/report_engine/html/table.rb",
|
42
|
+
"lib/report_engine/html/text.rb",
|
43
|
+
"lib/report_engine/html_canvas.rb",
|
44
|
+
"lib/report_engine/list.rb",
|
45
|
+
"lib/report_engine/page.rb",
|
46
|
+
"lib/report_engine/pdf/container.rb",
|
47
|
+
"lib/report_engine/pdf/google_chart.rb",
|
48
|
+
"lib/report_engine/pdf/list.rb",
|
49
|
+
"lib/report_engine/pdf/question_stats.rb",
|
50
|
+
"lib/report_engine/pdf/section.rb",
|
51
|
+
"lib/report_engine/pdf/sub_table.rb",
|
52
|
+
"lib/report_engine/pdf/table.rb",
|
53
|
+
"lib/report_engine/pdf/text.rb",
|
54
|
+
"lib/report_engine/pdf_canvas.rb",
|
55
|
+
"lib/report_engine/question_stats.rb",
|
56
|
+
"lib/report_engine/report.rb",
|
57
|
+
"lib/report_engine/sub_table.rb",
|
58
|
+
"lib/report_engine/table.rb",
|
59
|
+
"lib/report_engine/text.rb",
|
60
|
+
"report_engine.gemspec",
|
61
|
+
"test/category_test.rb",
|
62
|
+
"test/chart_test.rb",
|
63
|
+
"test/forebyg_test.rb",
|
64
|
+
"test/helper.rb",
|
65
|
+
"test/horizontal_chart_test.rb",
|
66
|
+
"test/pdftest.rb",
|
67
|
+
"test/repartition_test.rb",
|
68
|
+
"test/test_chart.rb",
|
69
|
+
"test/test_correlation_report.rb",
|
70
|
+
"test/test_feedback.rb",
|
71
|
+
"test/test_question_stats.rb",
|
72
|
+
"test/test_report.rb",
|
73
|
+
"test/test_report_engine.rb",
|
74
|
+
"test/test_table.rb"
|
75
|
+
]
|
76
|
+
s.homepage = "http://github.com/bastien/report_engine"
|
77
|
+
s.require_paths = ["lib"]
|
78
|
+
s.rubygems_version = "1.8.10"
|
79
|
+
s.summary = "Report engine specific to the teneo app"
|
80
|
+
|
81
|
+
if s.respond_to? :specification_version then
|
82
|
+
s.specification_version = 3
|
83
|
+
|
84
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
85
|
+
else
|
86
|
+
end
|
87
|
+
else
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|