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.
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
+