ruport 1.6.3 → 1.8.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 (57) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +11 -0
  3. data/CHANGELOG.md +38 -0
  4. data/HACKING +1 -17
  5. data/README.md +97 -0
  6. data/Rakefile +9 -50
  7. data/examples/add_row_table.rb +46 -0
  8. data/examples/data/wine.csv +255 -0
  9. data/examples/pdf_grouping.rb +39 -0
  10. data/examples/pdf_table.rb +28 -0
  11. data/examples/pdf_table_from_csv.rb +26 -0
  12. data/examples/pdf_table_prawn.rb +30 -0
  13. data/examples/pdf_table_simple.rb +13 -0
  14. data/examples/row_renderer.rb +1 -1
  15. data/examples/simple_pdf_lines.rb +1 -1
  16. data/examples/trac_ticket_status.rb +1 -1
  17. data/lib/ruport/controller.rb +17 -21
  18. data/lib/ruport/data/feeder.rb +2 -2
  19. data/lib/ruport/data/grouping.rb +8 -8
  20. data/lib/ruport/data/record.rb +4 -4
  21. data/lib/ruport/data/table.rb +318 -206
  22. data/lib/ruport/formatter/csv.rb +6 -7
  23. data/lib/ruport/formatter/html.rb +13 -11
  24. data/lib/ruport/formatter/markdown.rb +105 -0
  25. data/lib/ruport/formatter/prawn_pdf.rb +159 -0
  26. data/lib/ruport/formatter/template.rb +1 -1
  27. data/lib/ruport/formatter/text.rb +1 -1
  28. data/lib/ruport/formatter.rb +54 -54
  29. data/lib/ruport/version.rb +1 -1
  30. data/lib/ruport.rb +7 -23
  31. data/test/controller_test.rb +201 -225
  32. data/test/csv_formatter_test.rb +36 -36
  33. data/test/data_feeder_test.rb +64 -64
  34. data/test/expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test +265 -0
  35. data/test/grouping_test.rb +103 -102
  36. data/test/helpers.rb +29 -10
  37. data/test/html_formatter_test.rb +46 -46
  38. data/test/markdown_formatter_test.rb +142 -0
  39. data/test/prawn_pdf_formatter_test.rb +108 -0
  40. data/test/record_test.rb +91 -91
  41. data/test/samples/sales.csv +21 -0
  42. data/test/table_pivot_test.rb +77 -26
  43. data/test/table_test.rb +376 -354
  44. data/test/template_test.rb +13 -13
  45. data/test/text_formatter_test.rb +52 -52
  46. data/util/bench/data/table/bench_column_manip.rb +0 -1
  47. data/util/bench/data/table/bench_dup.rb +0 -1
  48. data/util/bench/data/table/bench_init.rb +1 -2
  49. data/util/bench/data/table/bench_manip.rb +0 -1
  50. data/util/bench/formatter/bench_csv.rb +0 -1
  51. data/util/bench/formatter/bench_html.rb +0 -1
  52. data/util/bench/formatter/bench_pdf.rb +0 -1
  53. data/util/bench/formatter/bench_text.rb +0 -1
  54. metadata +131 -82
  55. data/README +0 -114
  56. data/lib/ruport/formatter/pdf.rb +0 -591
  57. data/test/pdf_formatter_test.rb +0 -354
@@ -1,14 +1,14 @@
1
- #!/usr/bin/env ruby -w
1
+ #!/usr/bin/env ruby -w
2
2
  require File.join(File.expand_path(File.dirname(__FILE__)), "helpers")
3
3
 
4
- class TestGroup < Test::Unit::TestCase
4
+ class TestGroup < Minitest::Test
5
5
 
6
6
  def setup
7
7
  @group = Ruport::Data::Group.new(:name => 'test',
8
8
  :data => [[1,2,3]],
9
9
  :column_names => %w[a b c])
10
10
  end
11
-
11
+
12
12
  def test_group_constructor
13
13
  group = Ruport::Data::Group.new(:name => 'test',
14
14
  :data => [[1,2,3]],
@@ -34,7 +34,7 @@ class TestGroup < Test::Unit::TestCase
34
34
  end
35
35
 
36
36
  def test_eql
37
- table = Table(%w[a b c], :data => [[1,2,3]])
37
+ table = Ruport.Table(%w[a b c], :data => [[1,2,3]])
38
38
 
39
39
  group2 = Ruport::Data::Group.new(:name => 'test',
40
40
  :data => [[1,2,3]],
@@ -44,7 +44,7 @@ class TestGroup < Test::Unit::TestCase
44
44
  assert_equal @group, group2
45
45
  assert_equal @group, @group.dup
46
46
  end
47
-
47
+
48
48
  def test_create_subgroups
49
49
  group = @group << [4,5,6]
50
50
  group.send(:create_subgroups, "a")
@@ -55,7 +55,7 @@ class TestGroup < Test::Unit::TestCase
55
55
  :column_names => %w[b c],
56
56
  :name => 4 ) }
57
57
  assert_equal b, group.subgroups
58
-
58
+
59
59
  group.send(:create_subgroups, "b")
60
60
  c = { 2 => Ruport::Data::Group.new( :data => [[3]],
61
61
  :column_names => %w[c],
@@ -65,8 +65,8 @@ class TestGroup < Test::Unit::TestCase
65
65
  :name => 5 ) }
66
66
  assert_equal c, group.subgroups[1].subgroups
67
67
  assert_equal d, group.subgroups[4].subgroups
68
- end
69
-
68
+ end
69
+
70
70
  def test_grouped_data
71
71
  a = @group << [4,5,6]
72
72
  b = { 1 => Ruport::Data::Group.new( :data => [[2,3]],
@@ -79,24 +79,25 @@ class TestGroup < Test::Unit::TestCase
79
79
  end
80
80
  end
81
81
 
82
- class TestGroupRendering < Test::Unit::TestCase
82
+ class TestGroupRendering < Minitest::Test
83
83
 
84
84
  def setup
85
85
  @group = Ruport::Data::Group.new(:name => 'test',
86
86
  :data => [[1,2,3]],
87
87
  :column_names => %w[a b c])
88
- end
88
+ end
89
89
 
90
90
  def test_group_as
91
- assert_equal(7, @group.to_text.to_a.length)
91
+ assert_equal(7, @group.to_text.split("\n").size)
92
92
  assert_equal(5, @group.as(:text,
93
- :show_table_headers => false).to_a.length)
94
- assert_equal(13, @group.to_html.to_a.length)
93
+ :show_table_headers => false).split("\n").size)
94
+ assert_equal(15, @group.to_html.split("\n").size)
95
+ assert_equal(8, @group.to_html(:show_table_headers => false).split("\n").size)
95
96
  end
96
-
97
+
97
98
  def test_as_throws_proper_errors
98
- assert_nothing_raised { @group.as(:csv) }
99
- assert_nothing_raised { @group.to_csv }
99
+ @group.as(:csv)
100
+ @group.to_csv
100
101
  assert_raises(Ruport::Controller::UnknownFormatError) {
101
102
  @group.as(:nothing) }
102
103
  assert_raises(Ruport::Controller::UnknownFormatError) {
@@ -110,16 +111,16 @@ class TestGroupRendering < Test::Unit::TestCase
110
111
  assert_equal "1\n\nb,c\n2,3\n", t.to_csv
111
112
  end
112
113
  end
113
-
114
- class TestGrouping < Test::Unit::TestCase
115
-
114
+
115
+ class TestGrouping < Minitest::Test
116
+
116
117
  def setup
117
- table = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
118
+ table = Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
118
119
  @grouping = Ruport::Data::Grouping.new(table, :by => "a")
119
120
  end
120
-
121
+
121
122
  def test_grouping_constructor
122
- a = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
123
+ a = Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
123
124
  b = Ruport::Data::Grouping.new(a, :by => "a")
124
125
  c = { 1 => Ruport::Data::Group.new( :data => [[2,3]],
125
126
  :column_names => %w[b c],
@@ -128,24 +129,24 @@ class TestGrouping < Test::Unit::TestCase
128
129
  :column_names => %w[b c],
129
130
  :name => 4 ) }
130
131
  assert_equal c, b.data
131
- end
132
-
132
+ end
133
+
133
134
  def test_empty_grouping
134
135
  a = Ruport::Data::Grouping.new()
135
136
  a << Group("foo",:data => [[1,2,3],[4,5,6]],
136
137
  :column_names => %w[a b c] )
137
- assert_equal "foo", a["foo"].name
138
- assert_nil a.grouped_by
139
- end
140
-
138
+ assert_equal "foo", a["foo"].name
139
+ assert_nil a.grouped_by
140
+ end
141
+
141
142
  def test_empty_grouping_with_grouped_by
142
- a = Ruport::Data::Grouping.new(:by => "nada")
143
+ a = Ruport::Data::Grouping.new(:by => "nada")
143
144
  a << Group("foo",:data => [[1,2,3],[4,5,6]],
144
145
  :column_names => %w[a b c] )
145
- assert_equal "foo", a["foo"].name
146
+ assert_equal "foo", a["foo"].name
146
147
  assert_equal "nada", a.grouped_by
147
148
  end
148
-
149
+
149
150
  def test_grouping_indexing
150
151
  a = [Ruport::Data::Group.new( :data => [[2,3]],
151
152
  :column_names => %w[b c],
@@ -159,8 +160,8 @@ class TestGrouping < Test::Unit::TestCase
159
160
  assert_equal a[0], @grouping[1]
160
161
  assert_equal a[1], @grouping[4]
161
162
  assert_raises(IndexError) { @grouping[2] }
162
- end
163
-
163
+ end
164
+
164
165
  def test_should_copy_grouping
165
166
  a = { 1 => Ruport::Data::Group.new( :data => [[2,3]],
166
167
  :column_names => %w[b c],
@@ -174,19 +175,19 @@ class TestGrouping < Test::Unit::TestCase
174
175
  end
175
176
 
176
177
  def test_append
177
- a = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
178
+ a = Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
178
179
  @grouping << a.to_group("red snapper")
179
180
  assert_equal @grouping["red snapper"], a.to_group("red snapper")
180
-
181
+
181
182
  assert_raises(ArgumentError) { @grouping << a.to_group("red snapper") }
182
183
  end
183
-
184
+
184
185
  def test_grouped_by
185
186
  assert_equal "a", @grouping.grouped_by
186
187
  end
187
188
 
188
189
  def test_grouping_on_multiple_columns
189
- a = Table(%w[a b c d], :data => [[1,2,3,4],[4,5,6,7]])
190
+ a = Ruport.Table(%w[a b c d], :data => [[1,2,3,4],[4,5,6,7]])
190
191
  b = Ruport::Data::Grouping.new(a, :by => %w[a b c])
191
192
  c = { 1 => Ruport::Data::Group.new( :data => [[2,3,4]],
192
193
  :column_names => %w[b c d],
@@ -204,10 +205,10 @@ class TestGrouping < Test::Unit::TestCase
204
205
  :name => 5 ) }
205
206
  assert_equal d, b[1].subgroups
206
207
  assert_equal e, b[4].subgroups
207
- end
208
+ end
208
209
 
209
210
  def test_subgrouping
210
- a = Table(%w[first_name last_name id])
211
+ a = Ruport.Table(%w[first_name last_name id])
211
212
  a << %w[ greg brown awesome ]
212
213
  a << %w[ mike milner schweet ]
213
214
  a << %w[ greg brown sick ]
@@ -219,7 +220,7 @@ class TestGrouping < Test::Unit::TestCase
219
220
  sub = (g / "mike")["milner"]
220
221
  assert_equal %w[schweet], sub.column("id")
221
222
  end
222
-
223
+
223
224
  class TicketStatus < Ruport::Data::Record
224
225
 
225
226
  def closed
@@ -231,41 +232,41 @@ class TestGrouping < Test::Unit::TestCase
231
232
  end
232
233
 
233
234
  end
234
-
235
+
235
236
  def test_grouping_summary
236
- source = Table(File.join(File.expand_path(File.dirname(__FILE__)),
237
+ source = Ruport.Table(File.join(File.expand_path(File.dirname(__FILE__)),
237
238
  *%w[samples ticket_count.csv]),
238
239
  :record_class => TicketStatus)
239
240
  grouping = Grouping(source,:by => "date")
240
-
241
- expected = Table(:date, :opened,:closed)
241
+
242
+ expected = Ruport.Table(:date, :opened,:closed)
242
243
  grouping.each do |date,group|
243
244
  opened = group.sigma { |r| r.opened }
244
245
  closed = group.sigma { |r| r.closed }
245
246
  expected << { :date => date, :opened => opened, :closed => closed }
246
247
  end
247
-
248
+
248
249
  actual = grouping.summary :date,
249
250
  :opened => lambda { |g| g.sigma(:opened) },
250
251
  :closed => lambda { |g| g.sigma(:closed) },
251
252
  :order => [:date,:opened,:closed]
252
-
253
+
253
254
  assert_equal expected, actual
254
-
255
+
255
256
  actual = grouping.summary :date,
256
257
  :opened => lambda { |g| g.sigma(:opened) },
257
258
  :closed => lambda { |g| g.sigma(:closed) }
258
-
259
- assert_equal [], expected.column_names - actual.column_names
260
- end
261
-
259
+
260
+ assert_equal [], expected.column_names - actual.column_names
261
+ end
262
+
262
263
  def test_grouping_sigma
263
264
  assert_respond_to @grouping, :sigma
264
265
  assert_respond_to @grouping, :sum
265
-
266
+
266
267
  expected = {}
267
268
  @grouping.data[@grouping.data.keys.first].column_names.each do |col|
268
- expected[col] = @grouping.inject(0) do |s, (group_name, group)|
269
+ expected[col] = @grouping.inject(0) do |s, (_group_name, group)|
269
270
  s + group.sigma(col)
270
271
  end
271
272
  end
@@ -275,7 +276,7 @@ class TestGrouping < Test::Unit::TestCase
275
276
 
276
277
  expected = {}
277
278
  @grouping.data[@grouping.data.keys.first].column_names.each do |col|
278
- expected[col] = @grouping.inject(0) do |s, (group_name, group)|
279
+ expected[col] = @grouping.inject(0) do |s, (_group_name, group)|
279
280
  s + group.sigma {|r| r[col] + 2 }
280
281
  end
281
282
  end
@@ -284,101 +285,101 @@ class TestGrouping < Test::Unit::TestCase
284
285
  end
285
286
  end
286
287
 
287
- context "when sorting groupings" do
288
-
288
+ describe "when sorting groupings" do
289
+
289
290
  def setup
290
- @table = Table(%w[a b c]) << ["dog",1,2] << ["cat",3,5] <<
291
+ @table = Ruport.Table(%w[a b c]) << ["dog",1,2] << ["cat",3,5] <<
291
292
  ["banana",8,1] << ["dog",5,6] << ["dog",2,4] << ["banana",7,9]
292
293
  end
293
-
294
- def specify_can_set_by_group_name_order_in_constructor
295
- a = Grouping(@table, :by => "a", :order => :name)
296
- names = %w[banana cat dog]
294
+
295
+ def test_specify_can_set_by_group_name_order_in_constructor
296
+ a = Grouping(@table, :by => "a", :order => :name)
297
+ names = %w[banana cat dog]
297
298
  data = [ [[8,1],[7,9]], [[3,5]], [[1,2],[5,6],[2,4]] ]
298
299
  a.each do |name,group|
299
300
  assert_equal names.shift, name
300
- assert_equal data.shift, group.map { |r| r.to_a }
301
+ assert_equal data.shift, group.map { |r| r.to_a }
301
302
  end
302
303
  end
303
-
304
- def specify_can_set_by_proc_ordering_in_constructor
305
- a = Grouping(@table, :by => "a", :order => lambda { |g| -g.length } )
306
- names = %w[dog banana cat]
304
+
305
+ def test_specify_can_set_by_proc_ordering_in_constructor
306
+ a = Grouping(@table, :by => "a", :order => lambda { |g| -g.length } )
307
+ names = %w[dog banana cat]
307
308
  data = [ [[1,2],[5,6],[2,4]], [[8,1],[7,9]], [[3,5]] ]
308
309
  a.each do |name,group|
309
310
  assert_equal names.shift, name
310
- assert_equal data.shift, group.map { |r| r.to_a }
311
+ assert_equal data.shift, group.map { |r| r.to_a }
311
312
  end
312
- end
313
-
314
- def specify_can_override_sorting
315
- a = Grouping(@table, :by => "a", :order => lambda { |g| -g.length } )
313
+ end
314
+
315
+ def test_specify_can_override_sorting
316
+ a = Grouping(@table, :by => "a", :order => lambda { |g| -g.length } )
316
317
  a.sort_grouping_by!(:name)
317
- names = %w[banana cat dog]
318
+ names = %w[banana cat dog]
318
319
  data = [ [[8,1],[7,9]], [[3,5]], [[1,2],[5,6],[2,4]] ]
319
320
  a.each do |name,group|
320
321
  assert_equal names.shift, name
321
- assert_equal data.shift, group.map { |r| r.to_a }
322
+ assert_equal data.shift, group.map { |r| r.to_a }
322
323
  end
323
- end
324
-
325
- def specify_can_get_a_new_sorted_grouping
326
- a = Grouping(@table, :by => "a", :order => lambda { |g| -g.length } )
327
- b = a.sort_grouping_by(:name)
328
-
329
- names = %w[banana cat dog]
324
+ end
325
+
326
+ def test_specify_can_get_a_new_sorted_grouping
327
+ a = Grouping(@table, :by => "a", :order => lambda { |g| -g.length } )
328
+ b = a.sort_grouping_by(:name)
329
+
330
+ names = %w[banana cat dog]
330
331
  data = [ [[8,1],[7,9]], [[3,5]], [[1,2],[5,6],[2,4]] ]
331
332
  b.each do |name,group|
332
333
  assert_equal names.shift, name
333
- assert_equal data.shift, group.map { |r| r.to_a }
334
+ assert_equal data.shift, group.map { |r| r.to_a }
334
335
  end
335
-
336
+
336
337
  # assert original retained
337
- names = %w[dog banana cat]
338
+ names = %w[dog banana cat]
338
339
  data = [ [[1,2],[5,6],[2,4]], [[8,1],[7,9]], [[3,5]] ]
339
340
  a.each do |name,group|
340
341
  assert_equal names.shift, name
341
- assert_equal data.shift, group.map { |r| r.to_a }
342
- end
342
+ assert_equal data.shift, group.map { |r| r.to_a }
343
+ end
343
344
  end
344
345
  end
345
-
346
+
346
347
  class MyRecord < Ruport::Data::Record; end
347
-
348
+
348
349
  def test_grouping_should_set_record_class
349
- a = Table(%w[a b c], :record_class => MyRecord) { |t|
350
+ a = Ruport.Table(%w[a b c], :record_class => MyRecord) { |t|
350
351
  t << [1,2,3]
351
352
  t << [4,5,6]
352
353
  }
353
354
  b = Ruport::Data::Grouping.new(a, :by => "a")
354
355
  assert_equal MyRecord, b[1].record_class
355
- end
356
+ end
356
357
 
357
358
  class MyGroupingSub < Ruport::Data::Grouping; end
358
359
 
359
360
  def test_ensure_grouping_subclasses_render_properly
360
- t = Table(%w[a b c]) << [1,2,3]
361
- a = MyGroupingSub.new(t, :by => "a")
361
+ t = Ruport.Table(%w[a b c]) << [1,2,3]
362
+ a = MyGroupingSub.new(t, :by => "a")
362
363
  assert_equal "1\n\nb,c\n2,3\n\n", a.to_csv
363
364
  end
364
365
  end
365
366
 
366
- class TestGroupingRendering < Test::Unit::TestCase
367
+ class TestGroupingRendering < Minitest::Test
367
368
 
368
369
  def setup
369
- table = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
370
+ table = Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
370
371
  @grouping = Ruport::Data::Grouping.new(table, :by => "a")
371
372
  end
372
-
373
+
373
374
  def test_grouping_as
374
- assert_equal(16, @grouping.to_text.to_a.length)
375
- assert_equal(12, @grouping.as(:text,
376
- :show_table_headers => false).to_a.length)
375
+ assert_equal(15, @grouping.to_text.split("\n").size)
376
+ assert_equal(11, @grouping.as(:text,
377
+ :show_table_headers => false).split("\n").size)
377
378
  end
378
379
 
379
380
  def test_as_throws_proper_errors
380
- assert_nothing_raised { @grouping.as(:csv) }
381
- assert_nothing_raised { @grouping.to_csv }
381
+ @grouping.as(:csv)
382
+ @grouping.to_csv
382
383
  assert_raises(Ruport::Controller::UnknownFormatError) {
383
384
  @grouping.as(:nothing) }
384
385
  assert_raises(Ruport::Controller::UnknownFormatError) {
@@ -386,18 +387,18 @@ class TestGroupingRendering < Test::Unit::TestCase
386
387
  end
387
388
  end
388
389
 
389
- class TestGroupingKernelHacks < Test::Unit::TestCase
390
+ class TestGroupingKernelHacks < Minitest::Test
390
391
 
391
392
  def test_group_kernel_hack
392
393
  group = Ruport::Data::Group.new( :name => 'test',
393
394
  :data => [[1,2,3]],
394
395
  :column_names => %w[a b c])
395
396
  assert_equal group, Group('test', :data => [[1,2,3]],
396
- :column_names => %w[a b c])
397
+ :column_names => %w[a b c])
397
398
  end
398
399
 
399
400
  def test_grouping_kernel_hack
400
- table = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
401
+ table = Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
401
402
  grouping = Ruport::Data::Grouping.new(table, :by => "a")
402
403
  a = { 1 => Ruport::Data::Group.new( :data => [[2,3]],
403
404
  :column_names => %w[b c],
data/test/helpers.rb CHANGED
@@ -1,10 +1,29 @@
1
- require "test/unit"
2
- $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
3
- require "ruport"
4
- begin; require "rubygems"; rescue LoadError; nil; end
5
- require "spec-unit"
6
- require "mocha"
7
-
8
- class Test::Unit::TestCase
9
- include SpecUnit
10
- end
1
+ require 'coveralls'
2
+ require 'simplecov'
3
+ require 'coveralls'
4
+
5
+ # Use this formatter instead if you want to see coverage locally:
6
+ #
7
+ # SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
8
+ # SimpleCov::Formatter::HTMLFormatter,
9
+ # Coveralls::SimpleCov::Formatter
10
+ # ])
11
+
12
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
13
+ SimpleCov.start do
14
+ add_filter 'test'
15
+ end
16
+
17
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
18
+ require 'ruport'
19
+ require 'minitest'
20
+ require 'minitest/autorun'
21
+ require 'minitest/spec'
22
+ require 'minitest/unit'
23
+ require 'shoulda-context'
24
+ require 'mocha/minitest'
25
+ class Minitest::Test
26
+ include Ruport
27
+ end
28
+
29
+ TEST_SAMPLES = File.join(File.expand_path(File.dirname(__FILE__)), "samples")