report_engine 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.document +5 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +17 -0
  4. data/Rakefile +53 -0
  5. data/VERSION +1 -0
  6. data/images/empty_heart.jpg +0 -0
  7. data/images/folder_open.png +0 -0
  8. data/images/full_heart.jpg +0 -0
  9. data/images/half_heart.jpg +0 -0
  10. data/lib/report_engine.rb +50 -0
  11. data/lib/report_engine/canvas_factory.rb +13 -0
  12. data/lib/report_engine/container.rb +4 -0
  13. data/lib/report_engine/footer.rb +13 -0
  14. data/lib/report_engine/google_chart.rb +59 -0
  15. data/lib/report_engine/horizontal_chart.rb +43 -0
  16. data/lib/report_engine/html/container.rb +9 -0
  17. data/lib/report_engine/html/google_chart.rb +9 -0
  18. data/lib/report_engine/html/list.rb +18 -0
  19. data/lib/report_engine/html/question_stats.rb +29 -0
  20. data/lib/report_engine/html/section.rb +16 -0
  21. data/lib/report_engine/html/sub_table.rb +14 -0
  22. data/lib/report_engine/html/table.rb +77 -0
  23. data/lib/report_engine/html/text.rb +15 -0
  24. data/lib/report_engine/html_canvas.rb +23 -0
  25. data/lib/report_engine/list.rb +22 -0
  26. data/lib/report_engine/page.rb +14 -0
  27. data/lib/report_engine/pdf/container.rb +9 -0
  28. data/lib/report_engine/pdf/google_chart.rb +9 -0
  29. data/lib/report_engine/pdf/list.rb +9 -0
  30. data/lib/report_engine/pdf/question_stats.rb +27 -0
  31. data/lib/report_engine/pdf/section.rb +17 -0
  32. data/lib/report_engine/pdf/sub_table.rb +6 -0
  33. data/lib/report_engine/pdf/table.rb +72 -0
  34. data/lib/report_engine/pdf/text.rb +11 -0
  35. data/lib/report_engine/pdf_canvas.rb +38 -0
  36. data/lib/report_engine/question_stats.rb +12 -0
  37. data/lib/report_engine/report.rb +19 -0
  38. data/lib/report_engine/sub_table.rb +10 -0
  39. data/lib/report_engine/table.rb +35 -0
  40. data/lib/report_engine/text.rb +13 -0
  41. data/report_engine.gemspec +90 -0
  42. data/test/category_test.rb +65 -0
  43. data/test/chart_test.rb +8 -0
  44. data/test/forebyg_test.rb +81 -0
  45. data/test/helper.rb +11 -0
  46. data/test/horizontal_chart_test.rb +5 -0
  47. data/test/pdftest.rb +15 -0
  48. data/test/repartition_test.rb +32 -0
  49. data/test/test_chart.rb +22 -0
  50. data/test/test_correlation_report.rb +65 -0
  51. data/test/test_feedback.rb +48 -0
  52. data/test/test_question_stats.rb +35 -0
  53. data/test/test_report.rb +82 -0
  54. data/test/test_report_engine.rb +8 -0
  55. data/test/test_table.rb +54 -0
  56. 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,14 @@
1
+ module ReportEngine
2
+ class Page
3
+ def initialize(canvas, options)
4
+ @canvas = canvas
5
+ @title = options[:title]
6
+ @elements = options[:elements]
7
+ end
8
+
9
+ def render
10
+ print_title
11
+ print_content
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module ReportEngine
2
+ module Pdf
3
+ class Container < ReportEngine::Container
4
+ def add_list_element(element)
5
+ @canvas.paint(element.delete(:type), element)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ReportEngine
2
+ module Pdf
3
+ class GoogleChart < ReportEngine::GoogleChart
4
+ def render
5
+ generate_url
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ReportEngine
2
+ module Pdf
3
+ class List < ReportEngine::List
4
+ def add_list_element(element)
5
+ @canvas.paint(element.delete(:type), element)
6
+ end
7
+ end
8
+ end
9
+ 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,6 @@
1
+ module ReportEngine
2
+ module Pdf
3
+ class SubTable < ReportEngine::SubTable
4
+ end
5
+ end
6
+ 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,11 @@
1
+ module ReportEngine
2
+ module Pdf
3
+ class Text < ReportEngine::Text
4
+ def render
5
+ @canvas.pdf.pad(@padding) do
6
+ @canvas.pdf.text @text.to_s, :size => @size
7
+ end
8
+ end
9
+ end
10
+ end
11
+ 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,12 @@
1
+ module ReportEngine
2
+ class QuestionStats
3
+ def initialize(canvas, options)
4
+ @canvas = canvas
5
+ @text = options[:text]
6
+ @chart = options[:chart]
7
+ @details = options[:details]
8
+ @id = options[:id]
9
+ @index = options[:index]
10
+ end
11
+ end
12
+ 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,10 @@
1
+ module ReportEngine
2
+ class SubTable < ReportEngine::Table
3
+
4
+ def data
5
+ add_headers
6
+ @data
7
+ end
8
+
9
+ end
10
+ 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
+