ruport 1.7.1 → 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 (43) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +38 -0
  3. data/HACKING +1 -17
  4. data/{README.rdoc → README.md} +30 -38
  5. data/Rakefile +0 -10
  6. data/examples/row_renderer.rb +1 -1
  7. data/examples/simple_pdf_lines.rb +1 -1
  8. data/examples/trac_ticket_status.rb +1 -1
  9. data/lib/ruport/controller.rb +1 -1
  10. data/lib/ruport/data/grouping.rb +7 -7
  11. data/lib/ruport/data/record.rb +4 -4
  12. data/lib/ruport/data/table.rb +9 -9
  13. data/lib/ruport/formatter/csv.rb +1 -1
  14. data/lib/ruport/formatter/markdown.rb +105 -0
  15. data/lib/ruport/formatter/prawn_pdf.rb +96 -9
  16. data/lib/ruport/formatter/text.rb +1 -1
  17. data/lib/ruport/formatter.rb +1 -2
  18. data/lib/ruport/version.rb +1 -1
  19. data/lib/ruport.rb +7 -11
  20. data/test/controller_test.rb +107 -109
  21. data/test/csv_formatter_test.rb +21 -21
  22. data/test/data_feeder_test.rb +39 -39
  23. data/test/expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test +265 -0
  24. data/test/grouping_test.rb +74 -74
  25. data/test/helpers.rb +16 -5
  26. data/test/html_formatter_test.rb +22 -22
  27. data/test/markdown_formatter_test.rb +142 -0
  28. data/test/prawn_pdf_formatter_test.rb +108 -0
  29. data/test/record_test.rb +82 -82
  30. data/test/table_pivot_test.rb +9 -2
  31. data/test/table_test.rb +33 -40
  32. data/test/template_test.rb +12 -12
  33. data/test/text_formatter_test.rb +34 -34
  34. data/util/bench/data/table/bench_column_manip.rb +0 -1
  35. data/util/bench/data/table/bench_dup.rb +0 -1
  36. data/util/bench/data/table/bench_init.rb +0 -1
  37. data/util/bench/data/table/bench_manip.rb +0 -1
  38. data/util/bench/formatter/bench_csv.rb +0 -1
  39. data/util/bench/formatter/bench_html.rb +0 -1
  40. data/util/bench/formatter/bench_pdf.rb +0 -1
  41. data/util/bench/formatter/bench_text.rb +0 -1
  42. metadata +30 -29
  43. data/lib/ruport/formatter/pdf.rb +0 -589
@@ -110,7 +110,7 @@ module Ruport
110
110
  def build_row(data = self.data)
111
111
  max_col_widths_for_row(data) unless options.max_col_width
112
112
 
113
- data.enum_for(:each_with_index).inject(line=[]) { |s,e|
113
+ data.enum_for(:each_with_index).inject(line=[]) { |_s,e|
114
114
  field,index = e
115
115
  if options.alignment.eql? :center
116
116
  line << field.to_s.center(options.max_col_width[index])
@@ -117,7 +117,6 @@ module Ruport
117
117
  :io => output,
118
118
  :layout => false }.merge(options)
119
119
 
120
- options[:io] = "" if self.class.kind_of?(Ruport::Formatter::PDF)
121
120
  rend_klass.render(format,options) do |rend|
122
121
  block[rend] if block
123
122
  end
@@ -251,5 +250,5 @@ require "ruport/formatter/template"
251
250
  require "ruport/formatter/csv"
252
251
  require "ruport/formatter/html"
253
252
  require "ruport/formatter/text"
254
- require "ruport/formatter/pdf"
255
253
  require "ruport/formatter/prawn_pdf"
254
+ require "ruport/formatter/markdown"
@@ -1,3 +1,3 @@
1
1
  module Ruport
2
- VERSION = "1.7.1"
2
+ VERSION = "1.8.0"
3
3
  end
data/lib/ruport.rb CHANGED
@@ -60,29 +60,26 @@ module Ruport #:nodoc:#
60
60
  stdout_handle = m_GetStdHandle.call(0xFFFFFFF5)
61
61
 
62
62
  m_GetConsoleScreenBufferInfo.call(stdout_handle, buf)
63
- bufx, bufy, curx, cury, wattr,
64
- left, top, right, bottom, maxx, maxy = buf.unpack(format)
63
+ _bufx, _bufy, _curx, _cury, _wattr, left, top, right, bottom, _maxx, _maxy = buf.unpack(format)
65
64
  return right - left + 1, bottom - top + 1
66
65
  end
67
66
  rescue LoadError # If we're not on Windows try...
68
67
  # A Unix savvy method to fetch the console columns, and rows.
69
68
  def terminal_size
70
69
  size = if /solaris/ =~ RUBY_PLATFORM
71
- output = `stty`
70
+ output = `stty 2>&1`
72
71
  [output.match('columns = (\d+)')[1].to_i,
73
72
  output.match('rows = (\d+)')[1].to_i]
74
73
  else
75
- `stty size`.split.map { |x| x.to_i }.reverse
74
+ `stty size 2>&1`.split.map { |x| x.to_i }.reverse
76
75
  end
77
76
  return $? == 0 ? size : [80,24]
78
77
  end
79
-
80
- end
78
+ end
81
79
 
82
- def terminal_width
83
- terminal_size.first
84
- end
85
-
80
+ def terminal_width
81
+ terminal_size.first
82
+ end
86
83
  end
87
84
 
88
85
  # quiets warnings for block
@@ -99,7 +96,6 @@ module Ruport #:nodoc:#
99
96
  end
100
97
 
101
98
  require "ruport/version"
102
- require "enumerator"
103
99
  require "ruport/controller"
104
100
  require "ruport/data"
105
101
  require "ruport/formatter"
@@ -1,4 +1,4 @@
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
4
  ###########################################################################
@@ -28,7 +28,7 @@ class OldSchoolController < Ruport::Controller
28
28
  end
29
29
  end
30
30
 
31
- end
31
+ end
32
32
 
33
33
  class VanillaController < Ruport::Controller
34
34
  stage :header,:body,:footer
@@ -39,9 +39,9 @@ end
39
39
  # that the hooks are being set up right. Perhaps these could
40
40
  # be replaced by mock objects in the future.
41
41
  class DummyText < Ruport::Formatter
42
-
42
+
43
43
  renders :text, :for => OldSchoolController
44
-
44
+
45
45
  def prepare_document
46
46
  output << "p"
47
47
  end
@@ -61,7 +61,7 @@ class DummyText < Ruport::Formatter
61
61
  def finalize_document
62
62
  output << "f"
63
63
  end
64
- end
64
+ end
65
65
 
66
66
  # This formatter modifies the (String) data object passed to it
67
67
  class Destructive < Ruport::Formatter
@@ -84,11 +84,11 @@ end
84
84
  class VanillaBinary < Ruport::Formatter
85
85
  renders :bin, :for => VanillaController
86
86
  save_as_binary_file
87
- end
87
+ end
88
88
 
89
89
  class SpecialFinalize < Ruport::Formatter
90
90
  renders :with_finalize, :for => VanillaController
91
-
91
+
92
92
  def finalize
93
93
  output << "I has been finalized"
94
94
  end
@@ -103,60 +103,60 @@ class TestController < Minitest::Test
103
103
  def test_trivial
104
104
  actual = OldSchoolController.render(:text)
105
105
  assert_equal "header\nbody\nfooter\n", actual
106
- end
107
-
106
+ end
107
+
108
108
  context "when running a formatter with custom a finalize method" do
109
- def specify_finalize_method_should_be_called
110
- assert_equal "I has been finalized",
109
+ should "specify_finalize_method_should_be_called" do
110
+ assert_equal "I has been finalized",
111
111
  VanillaController.render_with_finalize
112
- end
112
+ end
113
113
  end
114
-
114
+
115
115
  context "when using templates" do
116
- def specify_apply_template_should_be_called
116
+ should "specify_apply_template_should_be_called" do
117
117
  Ruport::Formatter::Template.create(:stub)
118
118
  Ruport.Table(%w[a b c]).to_csv(:template => :stub) do |r|
119
119
  r.formatter.expects(:apply_template)
120
- end
121
- end
120
+ end
121
+ end
122
122
 
123
- def specify_undefined_template_should_throw_sensible_error
123
+ should "specify_undefined_template_should_throw_sensible_error" do
124
124
  assert_raises(Ruport::Formatter::TemplateNotDefined) do
125
125
  Ruport.Table(%w[a b c]).to_csv(:template => :sub)
126
- end
126
+ end
127
127
  end
128
128
  end
129
129
 
130
130
  context "when using default templates" do
131
- def specify_default_template_should_be_called
131
+ should "specify_default_template_should_be_called" do
132
132
  Ruport::Formatter::Template.create(:default)
133
133
  Ruport.Table(%w[a b c]).to_csv do |r|
134
134
  r.formatter.expects(:apply_template)
135
135
  assert r.formatter.template == Ruport::Formatter::Template[:default]
136
- end
136
+ end
137
137
  end
138
138
 
139
- def specify_specific_should_override_default
139
+ should "specify_specific_should_override_default" do
140
140
  Ruport::Formatter::Template.create(:default)
141
141
  Ruport::Formatter::Template.create(:stub)
142
142
  Ruport.Table(%w[a b c]).to_csv(:template => :stub) do |r|
143
143
  r.formatter.expects(:apply_template)
144
144
  assert r.formatter.template == Ruport::Formatter::Template[:stub]
145
- end
145
+ end
146
146
  end
147
147
 
148
- def specify_should_be_able_to_disable_templates
148
+ should "specify_should_be_able_to_disable_templates" do
149
149
  Ruport::Formatter::Template.create(:default)
150
150
  Ruport.Table(%w[a b c]).to_csv(:template => false) do |r|
151
151
  r.formatter.expects(:apply_template).never
152
- end
152
+ end
153
153
  end
154
154
  end
155
155
 
156
156
  def test_using_io
157
157
  require "stringio"
158
158
  out = StringIO.new
159
- a = OldSchoolController.render(:text) { |r| r.io = out }
159
+ OldSchoolController.render(:text) { |r| r.io = out }
160
160
  out.rewind
161
161
  assert_equal "header\nbody\nfooter\n", out.read
162
162
  assert_equal "", out.read
@@ -165,21 +165,21 @@ class TestController < Minitest::Test
165
165
  def test_using_file
166
166
  f = []
167
167
  File.expects(:open).yields(f)
168
- a = OldSchoolController.render(:text, :file => "foo.text")
168
+ OldSchoolController.render(:text, :file => "foo.text")
169
169
  assert_equal "header\nbody\nfooter\n", f[0]
170
-
170
+
171
171
  f = []
172
172
  File.expects(:open).with("blah","wb").yields(f)
173
- VanillaController.render(:bin, :file => "blah")
174
- end
175
-
176
- def test_using_file_via_rendering_tools
173
+ VanillaController.render(:bin, :file => "blah")
174
+ end
175
+
176
+ def test_using_file_via_rendering_tools
177
177
  f = []
178
- File.expects(:open).yields(f)
178
+ File.expects(:open).yields(f)
179
179
  Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]]).save_as("foo.csv")
180
- assert_equal "a,b,c\n1,2,3\n4,5,6\n", f[0]
180
+ assert_equal "a,b,c\n1,2,3\n4,5,6\n", f[0]
181
181
  end
182
-
182
+
183
183
 
184
184
  def test_formats
185
185
  assert_equal( {}, Ruport::Controller.formats )
@@ -209,33 +209,33 @@ class TestController < Minitest::Test
209
209
 
210
210
  rend.formatter.clear_output
211
211
  assert_equal "", rend.formatter.output
212
- end
213
-
212
+ end
213
+
214
214
  def test_options_act_like_indifferent_hash
215
215
  opts = Ruport::Controller::Options.new
216
216
  opts.foo = "bar"
217
217
  assert_equal "bar", opts[:foo]
218
- assert_equal "bar", opts["foo"]
219
-
218
+ assert_equal "bar", opts["foo"]
219
+
220
220
  opts["f"] = "bar"
221
221
  assert_equal "bar", opts[:f]
222
222
  assert_equal "bar", opts.f
223
223
  assert_equal "bar", opts["f"]
224
-
224
+
225
225
  opts[:apple] = "banana"
226
226
  assert_equal "banana", opts.apple
227
227
  assert_equal "banana", opts["apple"]
228
228
  assert_equal "banana", opts[:apple]
229
- end
230
-
229
+ end
230
+
231
231
  end
232
232
 
233
233
 
234
234
  class TestFormatterUsingBuild < Minitest::Test
235
235
  # This formatter uses the build syntax
236
236
  class UsesBuild < Ruport::Formatter
237
- renders :text_using_build, :for => VanillaController
238
-
237
+ renders :text_using_build, :for => VanillaController
238
+
239
239
  build :header do
240
240
  output << "header\n"
241
241
  end
@@ -246,7 +246,7 @@ class TestFormatterUsingBuild < Minitest::Test
246
246
 
247
247
  build :footer do
248
248
  output << "footer\n"
249
- end
249
+ end
250
250
  end
251
251
 
252
252
  def test_should_render_using_build_syntax
@@ -265,21 +265,21 @@ class TestFormatterWithLayout < Minitest::Test
265
265
  # This formatter is meant to check out a special case in Ruport's renderer,
266
266
  # in which a layout method is called and yielded to when defined
267
267
  class WithLayout < DummyText
268
- renders :text_with_layout, :for => VanillaController
269
-
270
- def layout
268
+ renders :text_with_layout, :for => VanillaController
269
+
270
+ def layout
271
271
  output << "---\n"
272
272
  yield
273
273
  output << "---\n"
274
274
  end
275
-
275
+
276
276
  end
277
277
 
278
278
  def test_layout
279
- assert_equal "---\nheader\nbody\nfooter\n---\n",
279
+ assert_equal "---\nheader\nbody\nfooter\n---\n",
280
280
  VanillaController.render_text_with_layout
281
281
  end
282
-
282
+
283
283
  def test_layout_disabled
284
284
  assert_equal "header\nbody\nfooter\n",
285
285
  VanillaController.render_text_with_layout(:layout => false)
@@ -305,30 +305,28 @@ class TestControllerWithManyHooks < Minitest::Test
305
305
  def setup
306
306
  options.apple = true
307
307
  end
308
-
309
308
  end
310
309
 
311
310
  def test_hash_options_setters
312
- a = ControllerWithManyHooks.render(:text, :subtitle => "foo",
313
- :subsubtitle => "bar") { |r|
311
+ ControllerWithManyHooks.render(:text, :subtitle => "foo", :subsubtitle => "bar") do |r|
314
312
  assert_equal "foo", r.options.subtitle
315
313
  assert_equal "bar", r.options.subsubtitle
316
- }
314
+ end
317
315
  end
318
316
 
319
317
  def test_data_accessors
320
- a = ControllerWithManyHooks.render(:text, :data => [1,2,4]) { |r|
321
- assert_equal [1,2,4], r.data
322
- }
323
-
324
- b = ControllerWithManyHooks.render_text(%w[a b c]) { |r|
325
- assert_equal %w[a b c], r.data
326
- }
327
-
328
- c = ControllerWithManyHooks.render_text(%w[a b f],:snapper => :red) { |r|
329
- assert_equal %w[a b f], r.data
330
- assert_equal :red, r.options.snapper
331
- }
318
+ ControllerWithManyHooks.render(:text, :data => [1,2,4]) do |r|
319
+ assert_equal [1,2,4], r.data
320
+ end
321
+
322
+ ControllerWithManyHooks.render_text(%w[a b c]) do |r|
323
+ assert_equal %w[a b c], r.data
324
+ end
325
+
326
+ ControllerWithManyHooks.render_text(%w[a b f],:snapper => :red) do |r|
327
+ assert_equal %w[a b f], r.data
328
+ assert_equal :red, r.options.snapper
329
+ end
332
330
  end
333
331
 
334
332
  def test_formatter_data_dup
@@ -341,7 +339,7 @@ class TestControllerWithManyHooks < Minitest::Test
341
339
  def test_stage_helper
342
340
  assert ControllerWithManyHooks.stages.include?('body')
343
341
  end
344
-
342
+
345
343
  def test_finalize_helper
346
344
  assert_equal :document, ControllerWithManyHooks.final_stage
347
345
  end
@@ -351,14 +349,14 @@ class TestControllerWithManyHooks < Minitest::Test
351
349
  end
352
350
 
353
351
  def test_finalize_again
354
- assert_raises(Ruport::Controller::StageAlreadyDefinedError) {
355
- ControllerWithManyHooks.finalize :report
352
+ assert_raises(Ruport::Controller::StageAlreadyDefinedError) {
353
+ ControllerWithManyHooks.finalize :report
356
354
  }
357
355
  end
358
356
 
359
357
  def test_prepare_again
360
- assert_raises(Ruport::Controller::StageAlreadyDefinedError) {
361
- ControllerWithManyHooks.prepare :foo
358
+ assert_raises(Ruport::Controller::StageAlreadyDefinedError) {
359
+ ControllerWithManyHooks.prepare :foo
362
360
  }
363
361
  end
364
362
 
@@ -387,7 +385,7 @@ class TestControllerWithManyHooks < Minitest::Test
387
385
 
388
386
  assert_raises(Ruport::Controller::RequiredOptionNotSet) { a.render(:text) }
389
387
  end
390
-
388
+
391
389
  end
392
390
 
393
391
 
@@ -409,7 +407,7 @@ class TestControllerWithRunHook < Minitest::Test
409
407
  end
410
408
 
411
409
  def test_renderer_with_run_hooks
412
- assert_equal "|header\nbody\nfooter\n",
410
+ assert_equal "|header\nbody\nfooter\n",
413
411
  ControllerWithRunHook.render_text(:foo => "bar",:bar => "baz")
414
412
  end
415
413
 
@@ -427,7 +425,7 @@ class TestControllerWithHelperModule < Minitest::Test
427
425
  "Hello Dolly"
428
426
  end
429
427
  end
430
- end
428
+ end
431
429
 
432
430
  def test_renderer_helper_module
433
431
  ControllerWithHelperModule.render_stub do |r|
@@ -439,7 +437,7 @@ end
439
437
 
440
438
  class TestMultiPurposeFormatter < Minitest::Test
441
439
  # This provides a way to check the multi-format hooks for the Controller
442
- class MultiPurposeFormatter < Ruport::Formatter
440
+ class MultiPurposeFormatter < Ruport::Formatter
443
441
 
444
442
  renders [:html,:text], :for => VanillaController
445
443
 
@@ -447,7 +445,7 @@ class TestMultiPurposeFormatter < Minitest::Test
447
445
  a = 10
448
446
 
449
447
  text { output << "Foo: #{a}\n" }
450
- html { output << "<b>Foo: #{a}</b>\n" }
448
+ html { output << "<b>Foo: #{a}</b>\n" }
451
449
  end
452
450
 
453
451
  def build_body
@@ -456,7 +454,7 @@ class TestMultiPurposeFormatter < Minitest::Test
456
454
  html { output << "\n</pre>\n" }
457
455
  end
458
456
 
459
- end
457
+ end
460
458
 
461
459
  def test_multi_purpose
462
460
  text = VanillaController.render_text(:body_text => "foo")
@@ -471,12 +469,12 @@ class TestMultiPurposeFormatter < Minitest::Test
471
469
 
472
470
  a = MultiPurposeFormatter.new
473
471
  a.format = :html
474
-
472
+
475
473
  visited = false
476
474
  a.html { visited = true }
477
475
 
478
476
  assert visited
479
-
477
+
480
478
  visited = false
481
479
  a.text { visited = true }
482
480
  assert !visited
@@ -504,7 +502,7 @@ class TestFormatterErbHelper < Minitest::Test
504
502
  output << erb("Default Binding: <%= @foo %>")
505
503
  end
506
504
  end
507
-
505
+
508
506
  end
509
507
 
510
508
  #FIXME: need to test file
@@ -523,66 +521,66 @@ end
523
521
 
524
522
 
525
523
  class TestOptionReaders < Minitest::Test
526
-
524
+
527
525
  class ControllerForCheckingOptionReaders < Ruport::Controller
528
- required_option :foo
529
- end
530
-
526
+ required_option :foo
527
+ end
528
+
531
529
  class ControllerForCheckingPassivity < Ruport::Controller
532
530
  def foo
533
531
  "apples"
534
532
  end
535
- required_option :foo
533
+ required_option :foo
536
534
  end
537
535
 
538
- def setup
539
- @renderer = ControllerForCheckingOptionReaders.new
540
- @renderer.formatter = Ruport::Formatter.new
541
-
536
+ def setup
537
+ @renderer = ControllerForCheckingOptionReaders.new
538
+ @renderer.formatter = Ruport::Formatter.new
539
+
542
540
  @passive = ControllerForCheckingPassivity.new
543
541
  @passive.formatter = Ruport::Formatter.new
544
542
  end
545
-
543
+
546
544
  def test_options_are_readable
547
545
  @renderer.foo = 5
548
546
  assert_equal 5, @renderer.foo
549
- end
550
-
547
+ end
548
+
551
549
  def test_methods_are_not_overridden
552
550
  @passive.foo = 5
553
551
  assert_equal "apples", @passive.foo
554
552
  assert_equal 5, @passive.options.foo
555
553
  assert_equal 5, @passive.formatter.options.foo
556
554
  end
557
-
555
+
558
556
  end
559
-
557
+
560
558
  class TestSetupOrdering < Minitest::Test
561
-
559
+
562
560
  class ControllerWithSetup < Ruport::Controller
563
561
  stage :bar
564
562
  def setup
565
563
  options.foo.capitalize!
566
- end
567
- end
568
-
569
- class BasicFormatter < Ruport::Formatter
564
+ end
565
+ end
566
+
567
+ class BasicFormatter < Ruport::Formatter
570
568
  renders :text, :for => ControllerWithSetup
571
-
569
+
572
570
  def build_bar
573
571
  output << options.foo
574
572
  end
575
573
  end
576
-
574
+
577
575
  def test_render_hash_options_should_be_called_before_setup
578
576
  assert_equal "Hello", ControllerWithSetup.render_text(:foo => "hello")
579
- end
580
-
577
+ end
578
+
581
579
  def test_render_block_should_be_called_before_setup
582
- assert_equal "Hello",
580
+ assert_equal "Hello",
583
581
  ControllerWithSetup.render_text { |r| r.options.foo = "hello" }
584
582
  end
585
-
583
+
586
584
  end
587
585
 
588
586
  class CustomFormatter < Ruport::Formatter
@@ -608,7 +606,7 @@ class ControllerWithAnonymousFormatters < Ruport::Controller
608
606
  end
609
607
 
610
608
  formatter :pdf do
611
- build :report do
609
+ build :report do
612
610
  add_text "hello world"
613
611
  end
614
612
  end
@@ -673,7 +671,7 @@ class TestControllerHooks < Minitest::Test
673
671
 
674
672
  require "mocha"
675
673
 
676
- class DummyObject
674
+ class DummyObject
677
675
  include Ruport::Controller::Hooks
678
676
  renders_as_table
679
677
  end
@@ -690,7 +688,7 @@ class TestControllerHooks < Minitest::Test
690
688
  include Ruport::Controller::Hooks
691
689
  renders_as_table
692
690
 
693
- def renderable_data(format)
691
+ def renderable_data(_format)
694
692
  1
695
693
  end
696
694
  end
@@ -706,7 +704,7 @@ class TestControllerHooks < Minitest::Test
706
704
  class DummyObject3
707
705
  include Ruport::Controller::Hooks
708
706
  renders_as_table
709
-
707
+
710
708
  def renderable_data
711
709
  raise ArgumentError
712
710
  end