report_engine 1.2.4
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/.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
|
+
|