ruport 0.6.1 → 0.7.0

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 (83) hide show
  1. data/AUTHORS +6 -0
  2. data/Rakefile +4 -4
  3. data/TODO +3 -2
  4. data/bin/rope +2 -103
  5. data/examples/pdf_complex_report.rb +53 -0
  6. data/lib/ruport/config.rb +7 -7
  7. data/lib/ruport/data/collection.rb +8 -7
  8. data/lib/ruport/data/groupable.rb +3 -2
  9. data/lib/ruport/data/record.rb +13 -16
  10. data/lib/ruport/data/table.rb +89 -18
  11. data/lib/ruport/format/csv.rb +29 -0
  12. data/lib/ruport/format/html.rb +40 -0
  13. data/lib/ruport/format/latex.rb +50 -0
  14. data/lib/ruport/format/pdf.rb +78 -0
  15. data/lib/ruport/format/plugin.rb +20 -65
  16. data/lib/ruport/format/svg.rb +39 -0
  17. data/lib/ruport/format/text.rb +77 -0
  18. data/lib/ruport/format/xml.rb +32 -0
  19. data/lib/ruport/format.rb +1 -159
  20. data/lib/ruport/generator.rb +158 -0
  21. data/lib/ruport/layout/component.rb +7 -0
  22. data/lib/ruport/layout.rb +1 -0
  23. data/lib/ruport/query.rb +3 -3
  24. data/lib/ruport/renderer/graph.rb +48 -0
  25. data/lib/ruport/renderer/table.rb +132 -0
  26. data/lib/ruport/renderer.rb +193 -0
  27. data/lib/ruport/report/graph.rb +2 -2
  28. data/lib/ruport/report.rb +94 -96
  29. data/lib/ruport/system_extensions.rb +3 -6
  30. data/lib/ruport.rb +6 -4
  31. data/test/samples/dates.csv +1409 -0
  32. data/test/samples/foo.rtxt +3 -0
  33. data/test/test_collection.rb +0 -14
  34. data/test/test_config.rb +6 -6
  35. data/test/test_graph_renderer.rb +97 -0
  36. data/test/test_groupable.rb +1 -0
  37. data/test/test_query.rb +325 -324
  38. data/test/test_record.rb +3 -2
  39. data/test/test_renderer.rb +74 -0
  40. data/test/test_report.rb +29 -26
  41. data/test/test_table.rb +54 -29
  42. data/test/test_table_renderer.rb +93 -0
  43. data/test/test_text_table.rb +61 -0
  44. data/test/unit.log +24 -0
  45. metadata +41 -63
  46. data/CHANGELOG +0 -587
  47. data/examples/basic_grouping.rb +0 -19
  48. data/examples/fieldless_table.rb +0 -13
  49. data/examples/latex_table.rb +0 -17
  50. data/examples/line_graph.rb +0 -22
  51. data/examples/line_graph_report.rb +0 -23
  52. data/examples/line_plotter.rb +0 -46
  53. data/examples/long.txt +0 -24
  54. data/examples/new_plugin.rb +0 -24
  55. data/examples/report.rb +0 -35
  56. data/examples/sample_invoice_report.rb +0 -32
  57. data/examples/simple_mail.rb +0 -15
  58. data/examples/simple_table_interface.rb +0 -20
  59. data/examples/sql_erb.rb +0 -20
  60. data/examples/template.rb +0 -15
  61. data/examples/text_processors.rb +0 -13
  62. data/lib/ruport/format/engine/document.rb +0 -28
  63. data/lib/ruport/format/engine/graph.rb +0 -18
  64. data/lib/ruport/format/engine/invoice.rb +0 -23
  65. data/lib/ruport/format/engine/table.rb +0 -54
  66. data/lib/ruport/format/engine.rb +0 -108
  67. data/lib/ruport/format/plugin/csv_plugin.rb +0 -26
  68. data/lib/ruport/format/plugin/html_plugin.rb +0 -32
  69. data/lib/ruport/format/plugin/latex_plugin.rb +0 -50
  70. data/lib/ruport/format/plugin/pdf_plugin.rb +0 -126
  71. data/lib/ruport/format/plugin/svg_plugin.rb +0 -61
  72. data/lib/ruport/format/plugin/text_plugin.rb +0 -77
  73. data/lib/ruport/meta_tools.rb +0 -66
  74. data/lib/ruport/report/invoice.rb +0 -29
  75. data/test/_test_groupable.rb +0 -0
  76. data/test/test_format.rb +0 -39
  77. data/test/test_format_engine.rb +0 -264
  78. data/test/test_graph.rb +0 -93
  79. data/test/test_invoice.rb +0 -32
  80. data/test/test_latex.rb +0 -20
  81. data/test/test_meta_tools.rb +0 -14
  82. data/test/test_plugin.rb +0 -277
  83. data/test/ts_all.rb +0 -21
data/test/test_graph.rb DELETED
@@ -1,93 +0,0 @@
1
- require "ruport"
2
-
3
- begin; require 'rubygems'; rescue LoadError; nil; end
4
- require "test/unit"
5
-
6
- begin
7
- require 'scruffy'
8
-
9
- class TestGraph < Test::Unit::TestCase
10
- def setup
11
- @data = [[1,2,3,2],[3,4,5,6]].to_table(%w[a b c d])
12
- @data_mismatched_headings = [[3,2],[3,4]].to_table(%w[a b c])
13
- @data_float = [[1.3,2],[3.28322,4]].to_table(%w[a b])
14
- @data_not_numbers = [["d",:sdfs,"not a number","1"],[3,4,5,6]].to_table(%w[a b c d])
15
- end
16
-
17
- # basic test to ensure bar charts render
18
- def test_bar
19
- graph = Ruport::Format.graph_object :plugin => :svg, :data => @data
20
- graph.title = "A Simple Bar Graph"
21
- graph.width = 600
22
- graph.height = 500
23
- graph.style = :bar
24
- output = graph.render
25
-
26
- assert_not_equal nil, output
27
- end
28
-
29
- # basic test to ensure line charts render
30
- def test_line
31
- graph = Ruport::Format.graph_object :plugin => :svg, :data => @data
32
- graph.title = "A Simple Line Graph"
33
- graph.width = 600
34
- graph.height = 500
35
- graph.style = :line
36
-
37
- output = graph.render
38
- assert_not_equal nil, output
39
- end
40
-
41
- # ensure an exception is raised if the user doesn't name every column
42
- def test_mismatched_headings
43
- graph = Ruport::Format.graph_object :plugin => :svg, :data => @data_mismatched_headings
44
- graph.title = "Mismatched Headings"
45
- graph.width = 600
46
- graph.height = 500
47
- graph.style = :line
48
-
49
- assert_raises(InvalidGraphDataError) {
50
- output = graph.render
51
- }
52
- end
53
-
54
- # test to ensure floats can be graphed
55
- def test_floats
56
- graph = Ruport::Format.graph_object :plugin => :svg, :data => @data_float
57
- graph.title = "Graphing Floats"
58
- graph.width = 600
59
- graph.height = 500
60
- graph.style = :line
61
- output = graph.render
62
-
63
- assert_not_equal nil, output
64
- end
65
-
66
- # ensure an exception is raised if non numeric data is graphed
67
- def test_not_numbers
68
- graph = Ruport::Format.graph_object :plugin => :svg, :data => @data_not_numbers
69
- graph.title = "Graphing Things That Aren't Numbers"
70
- graph.width = 600
71
- graph.height = 500
72
- graph.style = :line
73
-
74
- assert_raises(InvalidGraphDataError) {
75
- output = graph.render
76
- }
77
- end
78
-
79
- # ensure an exception is raised if non numeric data is graphed
80
- def test_missing_required_option
81
- graph = Ruport::Format.graph_object :plugin => :svg, :data => @data
82
- graph.title = "Rendering a graph with a missing option"
83
- graph.height = 500
84
- graph.style = :line
85
-
86
- assert_raises(InvalidGraphOptionError) {
87
- output = graph.render
88
- }
89
- end
90
- end
91
- rescue LoadError
92
- puts "Skipping Graph Tests (needs scruffy)"
93
- end
data/test/test_invoice.rb DELETED
@@ -1,32 +0,0 @@
1
- require 'ruport'
2
- begin; require 'rubygems'; rescue LoadError; nil; end
3
- require "test/unit"
4
-
5
- class SampleInvoiceReport < Ruport::Report
6
- extend Invoice
7
- end
8
-
9
- class TestInvoice < Test::Unit::TestCase
10
-
11
- def test_basic
12
- begin
13
- require "pdf/writer"
14
- rescue LoadError
15
- warn "skipping pdf test"; return
16
- end
17
- inv = SampleInvoiceReport.build_invoice do |i|
18
- i.company_info = "Foo Inc.\n42 Bar Street\nBaz, CT\n"
19
- i.customer_info = "Gregory Brown\ngregory.t.brown@gmail.com"
20
- i.data = [[1,2],[3,4]].to_table(%w[a b])
21
- end
22
- assert_nothing_raised { inv.render }
23
- assert_nothing_raised {
24
- SampleInvoiceReport.render_invoice do |i|
25
- i.company_info = "Foo Inc.\n42 Bar Street\nBaz, CT\n"
26
- i.customer_info = "Gregory Brown\ngregory.t.brown@gmail.com"
27
- i.data = [[1,2],[3,4]].to_table(%w[a b])
28
- end
29
- }
30
- end
31
-
32
- end
data/test/test_latex.rb DELETED
@@ -1,20 +0,0 @@
1
- require "ruport"
2
- begin; require 'rubygems'; rescue LoadError; nil; end
3
- require "test/unit"
4
-
5
- class TestLatex < Test::Unit::TestCase
6
-
7
- def setup
8
- @data = [[1,2,3,2],[3,4,5,6]].to_table(%w[a b c d])
9
- end
10
-
11
- # basic test to ensure bar charts render
12
- def test_table_to_latex
13
- report = Ruport::Format.table_object :plugin => :latex, :data => @data
14
- output = report.render
15
- assert_equal "\\documentclass", output[/\\documentclass/]
16
- assert_equal "\\begin{document}", output[/\\begin\{document\}/]
17
- assert_equal "\\end{document}", output[/\\end\{document\}/]
18
- end
19
-
20
- end
@@ -1,14 +0,0 @@
1
- require "test/unit"
2
- require "ruport"
3
-
4
- class A; extend Ruport::MetaTools; end
5
-
6
- class TestMetaTools < Test::Unit::TestCase
7
-
8
- def test_action
9
- assert_nothing_raised { A.action(:foo) { |x| x + 1 } }
10
- assert_equal 4, A.foo(3)
11
- assert_raise(ActionAlreadyDefinedError) { A.action(:foo) { } }
12
- end
13
-
14
- end
data/test/test_plugin.rb DELETED
@@ -1,277 +0,0 @@
1
- require "test/unit"
2
- require "ruport"
3
- begin; require "rubygems"; rescue LoadError; nil; end
4
-
5
- include Ruport
6
-
7
- # a sample plugin to test the system
8
- class TSVPlugin < Format::Plugin
9
-
10
- require "fastercsv"
11
-
12
- format_field_names do
13
- FasterCSV.generate(:col_sep => "\t") { |csv| csv << data.column_names }
14
- end
15
-
16
- renderer :table do
17
- rendered_field_names +
18
- FasterCSV.generate(:col_sep => "\t") { |csv| data.each { |r| csv << r } }
19
- end
20
-
21
- helper(:foo, :engine => :table_engine) { }
22
- helper(:bar, :engines => [:table_engine,:invoice_engine]) { }
23
- helper(:baz) {}
24
-
25
- plugin_name :tsv
26
- register_on :table_engine
27
-
28
- # wont work, just for helper tests
29
- register_on :invoice_engine
30
- register_on :document_engine
31
-
32
- rendering_options :boring => :true
33
-
34
- end
35
-
36
- class NakedPlugin < Ruport::Format::Plugin
37
- plugin_name :naked
38
- end
39
-
40
-
41
- class TestPlugin < Test::Unit::TestCase
42
- def test_helper
43
- t = Ruport::Format.table_object :data => [[1,2]], :plugin => :tsv
44
- i = Ruport::Format.invoice_object :data => [[1,2]].to_table(%w[a b]), :plugin => :tsv
45
- d = Ruport::Format.document_object :data => "foo", :plugin => :tsv
46
- assert_nothing_raised { t.foo }
47
- assert_nothing_raised { t.bar }
48
- assert_nothing_raised { t.baz }
49
- assert_nothing_raised { i.bar }
50
- assert_nothing_raised { i.baz }
51
- assert_nothing_raised { d.baz }
52
- assert_raise(NoMethodError) { i.foo }
53
- assert_raise(NoMethodError) { d.foo }
54
- assert_raise(NoMethodError) { d.bar }
55
- end
56
-
57
- def test_rendering_options
58
- t = Ruport::Format.table_object(:data => [[1,2]], :plugin => :tsv)
59
- assert t.active_plugin.respond_to?(:options)
60
- assert t.active_plugin.respond_to?(:rendering_options)
61
- assert t.active_plugin.rendering_options[:boring]
62
- assert_nil t.active_plugin.options
63
- assert_nil t.options
64
- end
65
-
66
- def test_register_on
67
- a = NakedPlugin.dup
68
- assert a.respond_to?(:register_on)
69
- assert_raise(InvalidPluginError) {
70
- Ruport::Format.table_object(:plugin => :naked)
71
- }
72
- assert_raise(InvalidPluginError) {
73
- Ruport::Format.document_object(:plugin => :naked)
74
- }
75
- a.register_on :table_engine, :document_engine
76
- assert_nothing_raised {
77
- Ruport::Format.table_object(:plugin => :naked)
78
- Ruport::Format.document_object(:plugin => :naked)
79
- }
80
-
81
- end
82
-
83
- end
84
-
85
- class TestCSVPlugin < Test::Unit::TestCase
86
-
87
- def test_basic
88
- a = Format.table_object :plugin => :csv, :data => [[1,2],[3,4]]
89
- assert_equal("1,2\n3,4\n",a.render)
90
-
91
- a.data = a.data.to_table(:column_names => %w[a b])
92
- assert_equal("a,b\n1,2\n3,4\n",a.render)
93
-
94
- a.data = Ruport::Data::Table.new :data => [[1,2],[3,4]]
95
- assert_equal("1,2\n3,4\n",a.render)
96
-
97
- a.data = Ruport::Data::Table.new :data => [[1,2],[3,4]],
98
- :column_names => %w[a b]
99
-
100
- assert_equal("a,b\n1,2\n3,4\n",a.render)
101
-
102
- a.show_field_names = false
103
- assert_equal("1,2\n3,4\n", a.render)
104
- end
105
-
106
- end
107
-
108
- class TestPDFPlugin < Test::Unit::TestCase
109
-
110
- def test_ensure_fails_on_array
111
- begin
112
- require "pdf/writer"
113
- rescue LoadError
114
- warn "skipping pdf test"; return
115
- end
116
- a = Format.table_object :plugin => :pdf, :data => [[1,2],[3,4]]
117
- assert_raise(RuntimeError) { a.render }
118
-
119
- a.data = a.data.to_table(:column_names => %w[a b])
120
- assert_nothing_raised { a.render }
121
-
122
- #FIXME: Engine should be further duck typed so this test will pass
123
- #a.data = [{ "a" => "b", "c" => "d" },{"a" => "f", "c" => "g"}]
124
- #assert_nothing_raised { a.render }
125
- end
126
-
127
- def test_hooks
128
- begin
129
- require "pdf/writer"
130
- rescue LoadError
131
- warn "skipping pdf test"; return
132
- end
133
- a = Format.table_object :plugin => :pdf, :data => [[1,2],[3,4]]
134
- a = Format.table_object :plugin => :pdf,
135
- :data => [[1,2],[3,4]].to_table(:column_names => %w[a b])
136
- y = 0
137
- a.active_plugin.pre = lambda { |pdf|
138
- assert_instance_of(PDF::Writer,pdf);
139
- y = pdf.y
140
- }
141
- a.active_plugin.post = lambda { |pdf|
142
- assert_instance_of(PDF::Writer,pdf); assert(pdf.y < y)
143
- }
144
- assert_nothing_raised { a.render }
145
- end
146
-
147
- end
148
-
149
- class TestHTMLPlugin < Test::Unit::TestCase
150
-
151
- def test_basic
152
- a = Format.table_object :plugin => :html, :data => [[1,2],[3,nil]]
153
- assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2</td>"+
154
- "\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>3</td>\n\t\t\t<td>&nbsp;"+
155
- "</td>\n\t\t</tr>\n\t</table>",a.render)
156
- a.data = a.data.to_table(:column_names => %w[a b])
157
- assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>"+
158
- "\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>"+
159
- "2</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>3</td>\n\t\t\t<td>"+
160
- "&nbsp;</td>\n\t\t</tr>\n\t</table>",a.render)
161
- a.show_field_names = false
162
- assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2</td>"+
163
- "\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>3</td>\n\t\t\t<td>&nbsp;"+
164
- "</td>\n\t\t</tr>\n\t</table>",a.render)
165
- a.data[0].tag(:odd)
166
- a.data[1].tag(:even)
167
- assert_equal("\t<table>\n\t\t<tr class='odd'>\n\t\t\t<td class='odd'>"+
168
- "1</td>\n\t\t\t<td class='odd'>2</td>\n\t\t</tr>\n\t\t"+
169
- "<tr class='even'>\n\t\t\t<td class='even'>3</td>\n\t\t\t"+
170
- "<td class='even'>&nbsp;</td>\n\t\t</tr>\n\t</table>",
171
- a.render)
172
- end
173
- end
174
-
175
-
176
- #this test is intended to ensure proper functionality of the plugin system.
177
- class TestNewPlugin < Test::Unit::TestCase
178
-
179
- def test_basic
180
- a = Format.table_object :plugin => :tsv, :data => [[1,2],[3,4]]
181
- assert_equal("1\t2\n3\t4\n",a.render)
182
-
183
- a.data = a.data.to_table(:column_names => %w[a b])
184
- assert_equal("a\tb\n1\t2\n3\t4\n",a.render)
185
-
186
- a.show_field_names = false
187
- assert_equal("1\t2\n3\t4\n",a.render)
188
- end
189
-
190
- end
191
-
192
- class TestTextPlugin < Test::Unit::TestCase
193
-
194
- def test_basic
195
-
196
- tf = "+-------+\n"
197
-
198
- a = Format.table_object :plugin => :text, :data => [[1,2],[3,4]]
199
- assert_equal("#{tf}| 1 | 2 |\n| 3 | 4 |\n#{tf}",a.render)
200
-
201
- a.data = a.data.to_table(:column_names => %w[a b])
202
- assert_equal("#{tf}| a | b |\n#{tf}| 1 | 2 |\n| 3 | 4 |\n#{tf}", a.render)
203
-
204
- end
205
-
206
- def test_max_col_width
207
- a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
208
- a.active_plugin.calculate_max_col_widths
209
- assert_equal(3,a.active_plugin.max_col_width[0])
210
- assert_equal(1,a.active_plugin.max_col_width[1])
211
-
212
- a.data = [[1,2],[300,4]].to_table(:column_names => %w[a ba])
213
- a.active_plugin.calculate_max_col_widths
214
- assert_equal(3,a.active_plugin.max_col_width[0])
215
- assert_equal(2,a.active_plugin.max_col_width[1])
216
-
217
- a.data = [[1,2],[3,40000]].to_table(:column_names => %w[foo bazz])
218
- a.active_plugin.calculate_max_col_widths
219
- assert_equal(3,a.active_plugin.max_col_width[0])
220
- assert_equal(5,a.active_plugin.max_col_width[1])
221
- end
222
-
223
- def test_hr
224
- a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
225
- a.active_plugin.calculate_max_col_widths
226
- assert_equal("+---------+\n",a.active_plugin.hr)
227
-
228
-
229
- a.data = [[1,2],[3,40000]].to_table(:column_names => %w[foo bazz])
230
- a.active_plugin.calculate_max_col_widths
231
- assert_equal "+-------------+\n", a.active_plugin.hr
232
-
233
- end
234
-
235
- def test_centering
236
- tf = "+---------+\n"
237
-
238
- a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
239
- assert_equal("#{tf}| 1 | 2 |\n| 300 | 4 |\n#{tf}",a.render)
240
-
241
- tf = "+------------+\n"
242
- a.data = a.data.to_table(:column_names => %w[a bark])
243
- assert_equal("#{tf}| a | bark |\n#{tf}| 1 | 2 |\n"+
244
- "| 300 | 4 |\n#{tf}",a.render)
245
-
246
- end
247
-
248
- def test_wrapping
249
-
250
- a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
251
-
252
- #def SystemExtensions.terminal_width; 10; end
253
- a.active_plugin.right_margin = 10
254
- assert_equal("+------->>\n| 1 | >>\n| 300 | >>\n+------->>\n",a.render)
255
-
256
- a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
257
- assert_equal(nil,a.active_plugin.right_margin)
258
- end
259
-
260
-
261
- def test_make_sure_this_damn_column_names_bug_dies_a_horrible_death!
262
- a = Format.table :plugin => :text, :data => [[1,2,3]].to_table
263
- expected = "+-----------+\n"+
264
- "| 1 | 2 | 3 |\n"+
265
- "+-----------+\n"
266
- assert_equal(expected,a)
267
-
268
- end
269
-
270
- def test_graceful_failure_on_empty_table
271
- assert_nothing_raised { [].to_table.to_text }
272
- assert_nothing_raised { [].to_table(%w[a b c]).to_text }
273
- end
274
-
275
-
276
- end
277
-
data/test/ts_all.rb DELETED
@@ -1,21 +0,0 @@
1
- begin; require "tesly_reporter"; rescue LoadError; nil; end
2
- %w[
3
- test_collection.rb
4
- test_config.rb
5
- test_format.rb
6
- test_format_engine.rb
7
- test_graph.rb
8
- test_invoice.rb
9
- test_latex.rb
10
- test_mailer.rb
11
- test_meta_tools.rb
12
- test_plugin.rb
13
- test_query.rb
14
- test_record.rb
15
- test_report.rb
16
- test_ruport.rb
17
- test_set.rb
18
- test_sql_split.rb
19
- test_table.rb
20
- test_taggable.rb
21
- ].each { |t| require "test/#{t}" }