ruport 0.5.4 → 0.6.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 (56) hide show
  1. data/AUTHORS +13 -4
  2. data/CHANGELOG +15 -1
  3. data/Rakefile +1 -1
  4. data/bin/rope +5 -1
  5. data/examples/basic_grouping.rb +13 -3
  6. data/examples/latex_table.rb +17 -0
  7. data/examples/line_graph_report.rb +23 -0
  8. data/examples/line_graph_report.rb.rej +15 -0
  9. data/examples/line_graph_report.rb~ +23 -0
  10. data/examples/line_plotter.rb +1 -0
  11. data/examples/sql_erb.rb +20 -0
  12. data/examples/template.rb +1 -1
  13. data/examples/text_processors.rb +3 -9
  14. data/lib/ruport.rb +2 -3
  15. data/lib/ruport.rb~ +69 -0
  16. data/lib/ruport/attempt.rb +63 -0
  17. data/lib/ruport/data.rb +1 -1
  18. data/lib/ruport/data.rb.rej +5 -0
  19. data/lib/ruport/data.rb~ +1 -0
  20. data/lib/ruport/data/groupable.rb +20 -0
  21. data/lib/ruport/data/record.rb +18 -13
  22. data/lib/ruport/data/table.rb +92 -26
  23. data/lib/ruport/data/table.rb~ +329 -0
  24. data/lib/ruport/format.rb +7 -1
  25. data/lib/ruport/format/engine/table.rb +2 -1
  26. data/lib/ruport/format/plugin.rb +8 -8
  27. data/lib/ruport/format/plugin/csv_plugin.rb +5 -1
  28. data/lib/ruport/format/plugin/html_plugin.rb +12 -8
  29. data/lib/ruport/format/plugin/latex_plugin.rb +50 -0
  30. data/lib/ruport/format/plugin/text_plugin.rb +38 -33
  31. data/lib/ruport/meta_tools.rb +3 -3
  32. data/lib/ruport/query.rb +21 -9
  33. data/lib/ruport/report.rb +35 -20
  34. data/lib/ruport/report/graph.rb +14 -0
  35. data/lib/ruport/system_extensions.rb +9 -8
  36. data/test/_test_groupable.rb +0 -0
  37. data/test/samples/data.tsv +3 -0
  38. data/test/samples/erb_test.sql +1 -0
  39. data/test/samples/query_test.sql +1 -0
  40. data/test/test_collection.rb +1 -1
  41. data/test/test_format.rb +1 -1
  42. data/test/test_format_engine.rb +17 -0
  43. data/test/test_groupable.rb +41 -0
  44. data/test/test_invoice.rb +1 -1
  45. data/test/test_latex.rb +20 -0
  46. data/test/test_plugin.rb +59 -29
  47. data/test/test_query.rb +12 -6
  48. data/test/test_record.rb +23 -4
  49. data/test/test_record.rb.rej +46 -0
  50. data/test/test_report.rb +32 -7
  51. data/test/test_table.rb +152 -4
  52. data/test/ts_all.rb +21 -0
  53. data/test/unit.log +61 -154
  54. metadata +32 -12
  55. data/lib/ruport/rails.rb +0 -2
  56. data/lib/ruport/rails/reportable.rb +0 -58
@@ -0,0 +1,14 @@
1
+ module Ruport
2
+ class Report
3
+ module Graph
4
+ def build_graph
5
+ a = Ruport::Format.graph_object :plugin => :svg
6
+ yield(a); return a
7
+ end
8
+
9
+ def render_graph(&block)
10
+ build_graph(&block).render
11
+ end
12
+ end
13
+ end
14
+ end
@@ -58,16 +58,17 @@ module Ruport
58
58
  # A Unix savvy method to fetch the console columns, and rows.
59
59
  def terminal_size
60
60
  `stty size`.split.map { |x| x.to_i }.reverse
61
- end
62
- end
61
+ end
63
62
 
64
- def terminal_width
65
- terminal_size.first
66
- end
63
+ end
64
+
65
+ def terminal_width
66
+ terminal_size.first
67
+ end
67
68
 
68
- def terminal_height
69
- terminal_size.last
70
- end
69
+ def terminal_height
70
+ terminal_size.last
71
+ end
71
72
 
72
73
  end
73
74
  end
File without changes
@@ -0,0 +1,3 @@
1
+ a b c
2
+ 1 2 3
3
+ 4 5 6
@@ -0,0 +1 @@
1
+ select * from <%= @table %>
@@ -0,0 +1 @@
1
+ select * from foo
@@ -40,5 +40,5 @@ class TestCollection < Test::Unit::TestCase
40
40
  assert_raise(InvalidPluginError) { @ghost_collection.to_papyrus_scroll }
41
41
  assert_raise(InvalidPluginError) { @ghost_collection.as(:stone_tablet)}
42
42
  end
43
-
43
+
44
44
  end
data/test/test_format.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require "ruport"
2
2
  require "test/unit"
3
3
 
4
- require "rubygems" rescue LoadError nil
4
+ begin; require "rubygems"; rescue LoadError; nil; end
5
5
  class TestFormat < Test::Unit::TestCase
6
6
 
7
7
  def setup
@@ -42,6 +42,16 @@ class MockPlugin < Ruport::Format::Plugin
42
42
 
43
43
  end
44
44
 
45
+ class MockForTestingTableEngine < Ruport::Format::Plugin
46
+
47
+ renderer(:table) {}
48
+
49
+ format_field_names { raise }
50
+ plugin_name :table_mock
51
+ register_on :table_engine
52
+
53
+ end
54
+
45
55
  class TestFormatEngine < Test::Unit::TestCase
46
56
 
47
57
  def test_no_data_required
@@ -79,6 +89,13 @@ class TestTabularFormatEngine < Test::Unit::TestCase
79
89
  @engine.active_plugin.apple = :banana
80
90
  assert_equal :banana, @engine.active_plugin.apple
81
91
  end
92
+
93
+ def test_ensure_column_names_only_rendered_if_non_empty
94
+ @engine.plugin = :mock
95
+ @engine.data = [[1,2,3]].to_table
96
+ assert_nothing_raised { @engine.render }
97
+ end
98
+
82
99
  def test_basic_render
83
100
  @engine.plugin = :mock
84
101
  @engine.data = [[1,2,3],[4,5,6],[7,8,9]]
@@ -0,0 +1,41 @@
1
+ require "ruport"
2
+ require "test/unit"
3
+
4
+ class Ruport::Data::Table
5
+ include Ruport::Data::Groupable
6
+ end
7
+
8
+ # ticket:96
9
+ class TestGroupable < Test::Unit::TestCase
10
+ def test_simple
11
+ a = [[1,2],[3,4],[5,6],[7,8]].to_table(%w[a b])
12
+ a[0].tag(:foo); a[1].tag(:bar);
13
+ a[2].tag(:bar); a[3].tag(:foo);
14
+
15
+
16
+ expected = Ruport::Data::Record.new( [ [[1,2],[7,8]].to_table(%w[a b]),
17
+ [[3,4],[5,6]].to_table(%w[a b]) ],
18
+ :attributes => ["foo","bar"] )
19
+ assert_equal expected, a.group_by_tag
20
+
21
+ a[0].tag(:bar)
22
+
23
+ expected = Ruport::Data::Record.new( [ [[1,2],[7,8]].to_table(%w[a b]),
24
+ [[1,2],[3,4],[5,6]].to_table(%w[a b]) ],
25
+ :attributes => ["foo","bar"] )
26
+ assert_equal expected, a.group_by_tag
27
+ end
28
+
29
+ def test_create_tag_group
30
+ a = [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c])
31
+ expected = Ruport::Data::Record.new( [ [[1,2,3],[7,8,9]].to_table(%w[a b c]),
32
+ [[4,5,6]].to_table(%w[a b c]) ],
33
+ :attributes => %w[starts_odd starts_even])
34
+ a.create_tag_group(:starts_odd) { |r| (r[0] % 2) != 0 }
35
+ a.create_tag_group(:starts_even) { |r| (r[0] % 2).zero? }
36
+
37
+ assert_equal expected, a.group_by_tag
38
+ end
39
+ end
40
+
41
+
data/test/test_invoice.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'ruport'
2
- require 'rubygems' rescue LoadError nil
2
+ begin; require 'rubygems'; rescue LoadError; nil; end
3
3
  require "test/unit"
4
4
 
5
5
  class SampleInvoiceReport < Ruport::Report
@@ -0,0 +1,20 @@
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
data/test/test_plugin.rb CHANGED
@@ -33,6 +33,11 @@ class TSVPlugin < Format::Plugin
33
33
 
34
34
  end
35
35
 
36
+ class NakedPlugin < Ruport::Format::Plugin
37
+ plugin_name :naked
38
+ end
39
+
40
+
36
41
  class TestPlugin < Test::Unit::TestCase
37
42
  def test_helper
38
43
  t = Ruport::Format.table_object :data => [[1,2]], :plugin => :tsv
@@ -58,9 +63,26 @@ class TestPlugin < Test::Unit::TestCase
58
63
  assert_nil t.options
59
64
  end
60
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
+
61
83
  end
62
84
 
63
- class CSVPluginTest < Test::Unit::TestCase
85
+ class TestCSVPlugin < Test::Unit::TestCase
64
86
 
65
87
  def test_basic
66
88
  a = Format.table_object :plugin => :csv, :data => [[1,2],[3,4]]
@@ -83,7 +105,7 @@ class CSVPluginTest < Test::Unit::TestCase
83
105
 
84
106
  end
85
107
 
86
- class PDFPluginTest < Test::Unit::TestCase
108
+ class TestPDFPlugin < Test::Unit::TestCase
87
109
 
88
110
  def test_ensure_fails_on_array
89
111
  begin
@@ -124,28 +146,35 @@ class PDFPluginTest < Test::Unit::TestCase
124
146
 
125
147
  end
126
148
 
127
- class HTMLPluginTest < Test::Unit::TestCase
149
+ class TestHTMLPlugin < Test::Unit::TestCase
128
150
 
129
151
  def test_basic
130
152
  a = Format.table_object :plugin => :html, :data => [[1,2],[3,nil]]
131
- assert_equal("<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2</td>"+
153
+ assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2</td>"+
132
154
  "\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>3</td>\n\t\t\t<td>&nbsp;"+
133
155
  "</td>\n\t\t</tr>\n\t</table>",a.render)
134
156
  a.data = a.data.to_table(:column_names => %w[a b])
135
- assert_equal("<table>\n\t\t<tr>\n\t\t\t<th>a </th>\n\t\t\t<th>b</th>"+
157
+ assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>"+
136
158
  "\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>"+
137
159
  "2</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>3</td>\n\t\t\t<td>"+
138
160
  "&nbsp;</td>\n\t\t</tr>\n\t</table>",a.render)
139
161
  a.show_field_names = false
140
- assert_equal("<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2</td>"+
162
+ assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2</td>"+
141
163
  "\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>3</td>\n\t\t\t<td>&nbsp;"+
142
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)
143
172
  end
144
173
  end
145
174
 
146
175
 
147
176
  #this test is intended to ensure proper functionality of the plugin system.
148
- class NewPluginTest < Test::Unit::TestCase
177
+ class TestNewPlugin < Test::Unit::TestCase
149
178
 
150
179
  def test_basic
151
180
  a = Format.table_object :plugin => :tsv, :data => [[1,2],[3,4]]
@@ -160,7 +189,7 @@ class NewPluginTest < Test::Unit::TestCase
160
189
 
161
190
  end
162
191
 
163
- class TextPluginTest < Test::Unit::TestCase
192
+ class TestTextPlugin < Test::Unit::TestCase
164
193
 
165
194
  def test_basic
166
195
 
@@ -176,38 +205,29 @@ class TextPluginTest < Test::Unit::TestCase
176
205
 
177
206
  def test_max_col_width
178
207
  a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
179
- assert_equal(3,a.active_plugin.max_col_width(0))
180
- assert_equal(1,a.active_plugin.max_col_width(1))
181
-
182
- a.data = [[1,2],[300,4]].to_table(:column_names => %w[a b])
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])
183
211
 
184
- assert_equal(3,a.active_plugin.max_col_width("a"))
185
- assert_equal(1,a.active_plugin.max_col_width("b"))
186
- assert_equal(3,a.active_plugin.max_col_width(0))
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])
187
216
 
188
217
  a.data = [[1,2],[3,40000]].to_table(:column_names => %w[foo bazz])
189
- assert_equal(3,a.active_plugin.max_col_width("foo"))
190
- assert_equal(5,a.active_plugin.max_col_width("bazz"))
191
-
192
- assert_equal(3,a.active_plugin.max_col_width(0))
193
- assert_equal(5,a.active_plugin.max_col_width(1))
194
- end
195
-
196
- def test_table_width
197
- a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
198
- assert_equal(4,a.active_plugin.table_width)
199
-
200
- a.data = [[1,2],[3,40000]].to_table(:column_names =>%w[foo bazz])
201
- assert_equal(8,a.active_plugin.table_width)
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])
202
221
  end
203
222
 
204
223
  def test_hr
205
224
  a = Format.table_object :plugin => :text, :data => [[1,2],[300,4]]
206
-
225
+ a.active_plugin.calculate_max_col_widths
207
226
  assert_equal("+---------+\n",a.active_plugin.hr)
208
227
 
209
228
 
210
229
  a.data = [[1,2],[3,40000]].to_table(:column_names => %w[foo bazz])
230
+ a.active_plugin.calculate_max_col_widths
211
231
  assert_equal "+-------------+\n", a.active_plugin.hr
212
232
 
213
233
  end
@@ -237,6 +257,16 @@ class TextPluginTest < Test::Unit::TestCase
237
257
  assert_equal(nil,a.active_plugin.right_margin)
238
258
  end
239
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
+
240
270
  def test_graceful_failure_on_empty_table
241
271
  assert_nothing_raised { [].to_table.to_text }
242
272
  assert_nothing_raised { [].to_table(%w[a b c]).to_text }
data/test/test_query.rb CHANGED
@@ -19,7 +19,18 @@ class TestQuery < Test::Unit::TestCase
19
19
  assert_nothing_raised { @query1.result }
20
20
  assert_equal([[1,2,3],[4,5,6],[7,8,9]],@query1.result)
21
21
  end
22
-
22
+
23
+ def test_auto_resolve_file
24
+ q = Ruport::Query.new "test/samples/query_test.sql"
25
+ assert_equal "select * from foo", q.sql
26
+ end
27
+
28
+ def test_erb_replacement
29
+ @table = 'bar'
30
+ q = Ruport::Query.new "test/samples/erb_test.sql", :binding => binding
31
+ assert_equal "select * from bar", q.sql
32
+ end
33
+
23
34
  def test_each
24
35
  data = [[1,2,3],[4,5,6],[7,8,9]]
25
36
  @query1.each do |r|
@@ -61,11 +72,6 @@ class TestQuery < Test::Unit::TestCase
61
72
  assert_raise(EOFError) { gen.next }
62
73
  end
63
74
 
64
- def test_to_dataset
65
- # query needs to be re-worked for a test like this
66
- # to be written
67
- end
68
-
69
75
  def test_caching_triggers
70
76
  assert_nothing_raised { @query1.enable_caching }
71
77
  assert_nothing_raised { @query1.disable_caching }
data/test/test_record.rb CHANGED
@@ -2,7 +2,7 @@ require "test/unit"
2
2
  require "ruport"
3
3
 
4
4
 
5
- class RecordTest < Test::Unit::TestCase
5
+ class TestRecord < Test::Unit::TestCase
6
6
 
7
7
  include Ruport::Data
8
8
 
@@ -170,11 +170,30 @@ class RecordTest < Test::Unit::TestCase
170
170
  end
171
171
 
172
172
  def test_records_with_differing_attrs_and_data_hash_differently
173
- r = Record.new :attributes => %w[a b], :data => [1,2]
174
- s = Record.new :attributes => %w[a b]
173
+ r = Record.new [1,2],:attributes => %w[a b]
174
+ s = Record.new [nil,nil],:attributes => %w[a b]
175
175
  assert r.hash != s.hash
176
176
 
177
- t = Record.new :attributes => %w[a b], :data => [1,3]
177
+ t = Record.new [1,3],:attributes => %w[a b]
178
178
  assert r.hash != t.hash
179
179
  end
180
+
181
+ # ticket:71
182
+ def test_record_has_indifferent_access
183
+ t = Record.new [1,2,3], :attributes => %w[a b c]
184
+ assert_equal [1,2,3], [t[0],t[1],t[2]]
185
+ assert_equal [1,2,3], [t["a"],t["b"],t["c"]]
186
+ assert_equal [1,2,3], [t.a,t.b,t.c]
187
+
188
+ assert_equal [1,2,3], [t[:a],t[:b],t[:c]]
189
+
190
+ x = Record.new [1,2,3], :attributes => [:a,:b,:c]
191
+ assert_equal [1,2,3], [x[0],x[1],x[2]]
192
+ assert_equal [1,2,3], [x[:a],x[:b],x[:c]]
193
+
194
+ #FIXME: ...
195
+
196
+ assert_equal [1,2,3], [x["a"],x["b"],x["c"]]
197
+ assert_equal [1,2,3], [x.a,x.b,x.c]
198
+ end
180
199
  end
@@ -0,0 +1,46 @@
1
+ ***************
2
+ *** 170,180 ****
3
+ end
4
+
5
+ def test_records_with_differing_attrs_and_data_hash_differently
6
+ - r = Record.new :attributes => %w[a b], :data => [1,2]
7
+ - s = Record.new :attributes => %w[a b]
8
+ assert r.hash != s.hash
9
+
10
+ - t = Record.new :attributes => %w[a b], :data => [1,3]
11
+ assert r.hash != t.hash
12
+ end
13
+ end
14
+ --- 170,201 ----
15
+ end
16
+
17
+ def test_records_with_differing_attrs_and_data_hash_differently
18
+ + r = Record.new [1,2],:attributes => %w[a b]
19
+ + s = Record.new [nil,nil],:attributes => %w[a b]
20
+ assert r.hash != s.hash
21
+
22
+ + t = Record.new [1,3],:attributes => %w[a b]
23
+ assert r.hash != t.hash
24
+ end
25
+ +
26
+ + # ticket:71
27
+ + def test_record_has_indifferent_access
28
+ + t = Record.new [1,2,3], :attributes => %w[a b c]
29
+ + assert_equal [1,2,3], [t[0],t[1],t[2]]
30
+ + assert_equal [1,2,3], [t["a"],t["b"],t["c"]]
31
+ + assert_equal [1,2,3], [t.a,t.b,t.c]
32
+ +
33
+ + #FIXME: Dinko, the commented out tests need to pass
34
+ +
35
+ + # assert_equal [1,2,3], [t[:a],t[:b],t[:c]]
36
+ +
37
+ + x = Record.new [1,2,3], :attributes => [:a,:b,:c]
38
+ + assert_equal [1,2,3], [x[0],x[1],x[2]]
39
+ + assert_equal [1,2,3], [x[:a],x[:b],x[:c]]
40
+ +
41
+ + #FIXME: ...
42
+ +
43
+ + #assert_equal [1,2,3], [x["a"],x["b"],x["c"]]
44
+ + #assert_equal [1,2,3], [x.a,x.b,x.c]
45
+ + end
46
+ end