ruport 1.6.3 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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")