ruport 1.6.3 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,72 @@
1
+ module Ruport
2
+ class Formatter::PrawnPDF < Formatter
3
+
4
+ renders :prawn_pdf, :for =>[Controller::Row, Controller::Table,
5
+ Controller::Group, Controller::Grouping]
6
+
7
+ attr_accessor :pdf
8
+
9
+ def method_missing(id,*args, &block)
10
+ pdf.send(id,*args, &block)
11
+ end
12
+
13
+ def initialize
14
+ require 'prawn'
15
+ require 'prawn/layout'
16
+ end
17
+
18
+ def pdf
19
+ @pdf ||= (options.formatter ||
20
+ ::Prawn::Document.new(options[:pdf_format] || {} ))
21
+ end
22
+
23
+ def draw_table(table, format_opts={})
24
+ m = "PDF Formatter requires column_names to be defined"
25
+ raise FormatterError, m if table.column_names.empty?
26
+
27
+ table.rename_columns { |c| c.to_s }
28
+
29
+ table_array = [table.column_names]
30
+ table_array += table_to_array(table)
31
+ table_array.map { |array| array.map! { |elem| elem.class != String ? elem.to_s : elem }}
32
+
33
+ if options[:table_format]
34
+ opt = options[:table_format]
35
+ else
36
+ opt = {}
37
+ end
38
+
39
+ pdf.table(table_array,opt)
40
+
41
+ end
42
+
43
+ def table_to_array(tbl)
44
+ tbl.map { |row| row.to_a}
45
+ end
46
+
47
+ def finalize
48
+ output << pdf.render
49
+ end
50
+
51
+ def build_table_body
52
+ draw_table(data)
53
+ end
54
+
55
+ def build_group_body
56
+ render_table data, options.to_hash.merge(:formatter => pdf)
57
+ end
58
+
59
+ def build_grouping_body
60
+ data.each do |name,group|
61
+
62
+ # Group heading
63
+ move_down(20)
64
+ text name, :style => :bold, :size => 15
65
+
66
+ # Table
67
+ move_down(10)
68
+ draw_table group
69
+ end
70
+ end
71
+ end
72
+ end
@@ -140,7 +140,7 @@ class Ruport::Formatter::TemplateNotDefined < StandardError; end
140
140
  #
141
141
  # format_options All options Corresponding values
142
142
  # available to
143
- # FasterCSV.new
143
+ # ::CSV.new
144
144
  #
145
145
  class Ruport::Formatter::Template < Ruport::Controller::Options
146
146
 
@@ -1,3 +1,3 @@
1
1
  module Ruport
2
- VERSION = "1.6.3"
2
+ VERSION = "1.7.1"
3
3
  end
@@ -94,7 +94,7 @@ class SpecialFinalize < Ruport::Formatter
94
94
  end
95
95
  end
96
96
 
97
- class TestController < Test::Unit::TestCase
97
+ class TestController < Minitest::Test
98
98
 
99
99
  def teardown
100
100
  Ruport::Formatter::Template.instance_variable_set(:@templates, nil)
@@ -115,14 +115,14 @@ class TestController < Test::Unit::TestCase
115
115
  context "when using templates" do
116
116
  def specify_apply_template_should_be_called
117
117
  Ruport::Formatter::Template.create(:stub)
118
- Table(%w[a b c]).to_csv(:template => :stub) do |r|
118
+ Ruport.Table(%w[a b c]).to_csv(:template => :stub) do |r|
119
119
  r.formatter.expects(:apply_template)
120
120
  end
121
121
  end
122
122
 
123
123
  def specify_undefined_template_should_throw_sensible_error
124
124
  assert_raises(Ruport::Formatter::TemplateNotDefined) do
125
- Table(%w[a b c]).to_csv(:template => :sub)
125
+ Ruport.Table(%w[a b c]).to_csv(:template => :sub)
126
126
  end
127
127
  end
128
128
  end
@@ -130,7 +130,7 @@ class TestController < Test::Unit::TestCase
130
130
  context "when using default templates" do
131
131
  def specify_default_template_should_be_called
132
132
  Ruport::Formatter::Template.create(:default)
133
- Table(%w[a b c]).to_csv do |r|
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
136
  end
@@ -139,7 +139,7 @@ class TestController < Test::Unit::TestCase
139
139
  def specify_specific_should_override_default
140
140
  Ruport::Formatter::Template.create(:default)
141
141
  Ruport::Formatter::Template.create(:stub)
142
- Table(%w[a b c]).to_csv(:template => :stub) do |r|
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
145
  end
@@ -147,7 +147,7 @@ class TestController < Test::Unit::TestCase
147
147
 
148
148
  def specify_should_be_able_to_disable_templates
149
149
  Ruport::Formatter::Template.create(:default)
150
- Table(%w[a b c]).to_csv(:template => false) do |r|
150
+ Ruport.Table(%w[a b c]).to_csv(:template => false) do |r|
151
151
  r.formatter.expects(:apply_template).never
152
152
  end
153
153
  end
@@ -176,7 +176,7 @@ class TestController < Test::Unit::TestCase
176
176
  def test_using_file_via_rendering_tools
177
177
  f = []
178
178
  File.expects(:open).yields(f)
179
- Table(%w[a b c], :data => [[1,2,3],[4,5,6]]).save_as("foo.csv")
179
+ Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]]).save_as("foo.csv")
180
180
  assert_equal "a,b,c\n1,2,3\n4,5,6\n", f[0]
181
181
  end
182
182
 
@@ -231,7 +231,7 @@ class TestController < Test::Unit::TestCase
231
231
  end
232
232
 
233
233
 
234
- class TestFormatterUsingBuild < Test::Unit::TestCase
234
+ class TestFormatterUsingBuild < Minitest::Test
235
235
  # This formatter uses the build syntax
236
236
  class UsesBuild < Ruport::Formatter
237
237
  renders :text_using_build, :for => VanillaController
@@ -261,7 +261,7 @@ class TestFormatterUsingBuild < Test::Unit::TestCase
261
261
  end
262
262
 
263
263
 
264
- class TestFormatterWithLayout < Test::Unit::TestCase
264
+ 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
@@ -288,7 +288,7 @@ class TestFormatterWithLayout < Test::Unit::TestCase
288
288
  end
289
289
 
290
290
 
291
- class TestControllerWithManyHooks < Test::Unit::TestCase
291
+ class TestControllerWithManyHooks < Minitest::Test
292
292
  # This provides a way to check several hooks that controllers supports
293
293
  class ControllerWithManyHooks < Ruport::Controller
294
294
  add_format DummyText, :text
@@ -351,13 +351,13 @@ class TestControllerWithManyHooks < Test::Unit::TestCase
351
351
  end
352
352
 
353
353
  def test_finalize_again
354
- assert_raise(Ruport::Controller::StageAlreadyDefinedError) {
354
+ assert_raises(Ruport::Controller::StageAlreadyDefinedError) {
355
355
  ControllerWithManyHooks.finalize :report
356
356
  }
357
357
  end
358
358
 
359
359
  def test_prepare_again
360
- assert_raise(Ruport::Controller::StageAlreadyDefinedError) {
360
+ assert_raises(Ruport::Controller::StageAlreadyDefinedError) {
361
361
  ControllerWithManyHooks.prepare :foo
362
362
  }
363
363
  end
@@ -385,13 +385,13 @@ class TestControllerWithManyHooks < Test::Unit::TestCase
385
385
  a = ControllerWithManyHooks.dup
386
386
  a.required_option :title
387
387
 
388
- assert_raise(Ruport::Controller::RequiredOptionNotSet) { a.render(:text) }
388
+ assert_raises(Ruport::Controller::RequiredOptionNotSet) { a.render(:text) }
389
389
  end
390
390
 
391
391
  end
392
392
 
393
393
 
394
- class TestControllerWithRunHook < Test::Unit::TestCase
394
+ class TestControllerWithRunHook < Minitest::Test
395
395
 
396
396
  class ControllerWithRunHook < Ruport::Controller
397
397
  add_format DummyText, :text
@@ -416,7 +416,7 @@ class TestControllerWithRunHook < Test::Unit::TestCase
416
416
  end
417
417
 
418
418
 
419
- class TestControllerWithHelperModule < Test::Unit::TestCase
419
+ class TestControllerWithHelperModule < Minitest::Test
420
420
 
421
421
  class ControllerWithHelperModule < VanillaController
422
422
 
@@ -437,7 +437,7 @@ class TestControllerWithHelperModule < Test::Unit::TestCase
437
437
  end
438
438
 
439
439
 
440
- class TestMultiPurposeFormatter < Test::Unit::TestCase
440
+ class TestMultiPurposeFormatter < Minitest::Test
441
441
  # This provides a way to check the multi-format hooks for the Controller
442
442
  class MultiPurposeFormatter < Ruport::Formatter
443
443
 
@@ -489,40 +489,40 @@ class TestMultiPurposeFormatter < Test::Unit::TestCase
489
489
  end
490
490
 
491
491
 
492
- class TestFormatterErbHelper < Test::Unit::TestCase
492
+ class TestFormatterErbHelper < Minitest::Test
493
493
  class ErbFormatter < Ruport::Formatter
494
-
494
+
495
495
  renders :terb, :for => VanillaController
496
-
497
- def build_body
496
+
497
+ def build_body
498
498
  # demonstrate local binding
499
- @foo = "bar"
499
+ @foo = "bar"
500
500
  if options.binding
501
- output << erb("Binding Override: <%= reverse %>",
502
- :binding => options.binding)
503
- else
504
- output << erb("Default Binding: <%= @foo %>")
505
- end
501
+ output << erb("Binding Override: <%= reverse.inspect %>",
502
+ :binding => options.binding)
503
+ else
504
+ output << erb("Default Binding: <%= @foo %>")
505
+ end
506
506
  end
507
507
 
508
508
  end
509
509
 
510
- #FIXME: need to test file
510
+ #FIXME: need to test file
511
511
 
512
512
  def test_self_bound
513
513
  assert_equal "Default Binding: bar", VanillaController.render_terb
514
514
  end
515
-
515
+
516
516
  def test_custom_bound
517
517
  a = [1,2,3]
518
518
  arr_binding = a.instance_eval { binding }
519
- assert_equal "Binding Override: 321",
519
+ assert_equal "Binding Override: [3, 2, 1]",
520
520
  VanillaController.render_terb(:binding => arr_binding)
521
521
  end
522
- end
522
+ end
523
523
 
524
524
 
525
- class TestOptionReaders < Test::Unit::TestCase
525
+ class TestOptionReaders < Minitest::Test
526
526
 
527
527
  class ControllerForCheckingOptionReaders < Ruport::Controller
528
528
  required_option :foo
@@ -557,7 +557,7 @@ class TestOptionReaders < Test::Unit::TestCase
557
557
 
558
558
  end
559
559
 
560
- class TestSetupOrdering < Test::Unit::TestCase
560
+ class TestSetupOrdering < Minitest::Test
561
561
 
562
562
  class ControllerWithSetup < Ruport::Controller
563
563
  stage :bar
@@ -630,24 +630,20 @@ class ControllerWithAnonymousFormatters < Ruport::Controller
630
630
 
631
631
  end
632
632
 
633
- class TestAnonymousFormatter < Test::Unit::TestCase
634
- context "When using built in Ruport formatters" do
633
+ class TestAnonymousFormatter < Minitest::Test
635
634
 
636
- def specify_text_formatter_shortcut_is_accessible
637
- assert_equal "Hello world", ControllerWithAnonymousFormatters.render_text
638
- assert_equal "1,2,3\n", ControllerWithAnonymousFormatters.render_csv
639
- assert_equal "<h1>Hi there</h1>", ControllerWithAnonymousFormatters.render_html
635
+ def test_text_formatter_shortcut_is_accessible
636
+ assert_equal "Hello world", ControllerWithAnonymousFormatters.render_text
637
+ assert_equal "1,2,3\n", ControllerWithAnonymousFormatters.render_csv
638
+ assert_equal "<h1>Hi there</h1>", ControllerWithAnonymousFormatters.render_html
639
+ if RUBY_VERSION < "1.9"
640
640
  assert_not_nil ControllerWithAnonymousFormatters.render_pdf
641
641
  end
642
-
643
642
  end
644
643
 
645
- context "When using custom formatters" do
646
- def specify_custom_formatter_shortcut_is_accessible
647
- assert_equal "This is Custom!", ControllerWithAnonymousFormatters.render_custom
648
- end
644
+ def test_custom_formatter_shortcut_is_accessible
645
+ assert_equal "This is Custom!", ControllerWithAnonymousFormatters.render_custom
649
646
  end
650
-
651
647
  end
652
648
 
653
649
  # Used to ensure that problems in controller code aren't mistakenly intercepted
@@ -663,106 +659,88 @@ class MisbehavingFormatter < Ruport::Formatter
663
659
  end
664
660
  end
665
661
 
666
- class TestMisbehavingController < Test::Unit::TestCase
662
+ class TestMisbehavingController < Minitest::Test
667
663
 
668
- context "using a controller that throws NoMethodError" do
669
- def specify_controller_errors_should_bubble_up
670
- assert_raises(NoMethodError) do
671
- MisbehavingController.render :text
672
- end
664
+ def test_controller_errors_should_bubble_up
665
+ assert_raises(NoMethodError) do
666
+ MisbehavingController.render :text
673
667
  end
674
668
  end
675
669
 
676
670
  end
677
671
 
678
- class TestControllerHooks < Test::Unit::TestCase
679
-
680
- context "when renderable_data omitted" do
681
-
682
- require "mocha"
683
-
684
- class DummyObject
685
- include Ruport::Controller::Hooks
686
- renders_as_table
687
- end
672
+ class TestControllerHooks < Minitest::Test
688
673
 
689
- def specify_should_return_self
690
- a = DummyObject.new
691
- rend = mock("renderer")
692
- rend.expects(:data=).with(a)
693
- Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
694
- a.as(:csv)
695
- end
674
+ require "mocha"
696
675
 
676
+ class DummyObject
677
+ include Ruport::Controller::Hooks
678
+ renders_as_table
697
679
  end
698
680
 
699
- context "when using renderable_data" do
700
-
701
- class DummyObject2
702
- include Ruport::Controller::Hooks
703
- renders_as_table
704
-
705
- def renderable_data(format)
706
- 1
707
- end
708
- end
709
-
710
- def specify_should_return_results_of_renderable_data
711
- a = DummyObject2.new
712
- rend = mock("renderer")
713
- rend.expects(:data=).with(1)
714
- Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
715
- a.as(:csv)
716
- end
681
+ def test_should_return_self
682
+ a = DummyObject.new
683
+ rend = mock("renderer")
684
+ rend.expects(:data=).with(a)
685
+ Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
686
+ a.as(:csv)
687
+ end
717
688
 
718
- class DummyObject3
719
- include Ruport::Controller::Hooks
720
- renders_as_table
721
-
722
- def renderable_data
723
- raise ArgumentError
724
- end
725
- end
689
+ class DummyObject2
690
+ include Ruport::Controller::Hooks
691
+ renders_as_table
726
692
 
727
- def specify_should_not_mask_errors
728
- assert_raises(ArgumentError) { DummyObject3.new.as(:csv) }
693
+ def renderable_data(format)
694
+ 1
729
695
  end
696
+ end
730
697
 
731
- class DummyObject4
732
- include Ruport::Controller::Hooks
733
- renders_as_table
734
-
735
- def renderable_data(format)
736
- case format
737
- when :html
738
- 1
739
- when :csv
740
- 2
741
- end
742
- end
743
- end
698
+ def test_should_return_results_of_renderable_data
699
+ a = DummyObject2.new
700
+ rend = mock("renderer")
701
+ rend.expects(:data=).with(1)
702
+ Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
703
+ a.as(:csv)
704
+ end
744
705
 
745
- def specify_should_return_results_of_renderable_data_using_format
746
- a = DummyObject4.new
747
- rend = mock("renderer")
748
- rend.expects(:data=).with(2)
749
- Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
750
- a.as(:csv)
706
+ class DummyObject3
707
+ include Ruport::Controller::Hooks
708
+ renders_as_table
709
+
710
+ def renderable_data
711
+ raise ArgumentError
751
712
  end
713
+ end
752
714
 
753
- end
754
-
755
- context "when attempting to render a format that doesn't exist" do
715
+ def test_should_not_mask_errors
716
+ assert_raises(ArgumentError) { DummyObject3.new.as(:csv) }
717
+ end
756
718
 
757
- def specify_an_unknown_format_error_should_be_raised
719
+ class DummyObject4
720
+ include Ruport::Controller::Hooks
721
+ renders_as_table
758
722
 
759
- assert_raises(Ruport::Controller::UnknownFormatError) do
760
- Ruport::Controller.render_foo
723
+ def renderable_data(format)
724
+ case format
725
+ when :html
726
+ 1
727
+ when :csv
728
+ 2
761
729
  end
762
-
763
730
  end
764
731
  end
765
732
 
733
+ def test_should_return_results_of_renderable_data_using_format
734
+ a = DummyObject4.new
735
+ rend = mock("renderer")
736
+ rend.expects(:data=).with(2)
737
+ Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
738
+ a.as(:csv)
739
+ end
766
740
 
767
-
741
+ def test_an_unknown_format_error_should_be_raised
742
+ assert_raises(Ruport::Controller::UnknownFormatError) do
743
+ Ruport::Controller.render_foo
744
+ end
745
+ end
768
746
  end