ruport 0.8.14 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/README +42 -107
  2. data/Rakefile +29 -32
  3. data/examples/centered_pdf_text_box.rb +13 -19
  4. data/examples/example.csv +3 -0
  5. data/examples/line_plotter.rb +15 -15
  6. data/examples/pdf_complex_report.rb +10 -23
  7. data/examples/pdf_table_with_title.rb +12 -12
  8. data/examples/rope_examples/itunes/Rakefile +22 -1
  9. data/examples/rope_examples/itunes/config/environment.rb +4 -0
  10. data/examples/rope_examples/itunes/lib/init.rb +32 -2
  11. data/examples/rope_examples/itunes/util/build +50 -16
  12. data/examples/rope_examples/sales_report/README +1 -1
  13. data/examples/rope_examples/sales_report/Rakefile +22 -1
  14. data/examples/rope_examples/sales_report/config/environment.rb +4 -0
  15. data/examples/rope_examples/sales_report/lib/init.rb +32 -2
  16. data/examples/rope_examples/sales_report/lib/reports/sales.rb +10 -16
  17. data/examples/rope_examples/sales_report/util/build +50 -16
  18. data/examples/row_renderer.rb +39 -0
  19. data/examples/ruport_list/png_embed.rb +61 -0
  20. data/examples/ruport_list/roadmap.png +0 -0
  21. data/examples/sample.rb +16 -0
  22. data/examples/simple_pdf_lines.rb +24 -0
  23. data/lib/ruport.rb +143 -57
  24. data/lib/ruport/acts_as_reportable.rb +246 -0
  25. data/lib/ruport/data.rb +1 -2
  26. data/lib/ruport/data/grouping.rb +311 -0
  27. data/lib/ruport/data/record.rb +113 -84
  28. data/lib/ruport/data/table.rb +275 -174
  29. data/lib/ruport/formatter.rb +149 -0
  30. data/lib/ruport/formatter/csv.rb +87 -0
  31. data/lib/ruport/formatter/html.rb +89 -0
  32. data/lib/ruport/formatter/pdf.rb +357 -0
  33. data/lib/ruport/formatter/text.rb +151 -0
  34. data/lib/ruport/generator.rb +127 -30
  35. data/lib/ruport/query.rb +46 -99
  36. data/lib/ruport/renderer.rb +238 -194
  37. data/lib/ruport/renderer/grouping.rb +67 -0
  38. data/lib/ruport/renderer/table.rb +25 -98
  39. data/lib/ruport/report.rb +45 -96
  40. data/test/acts_as_reportable_test.rb +229 -0
  41. data/test/csv_formatter_test.rb +97 -0
  42. data/test/{_test_database.rb → database_test_.rb} +0 -0
  43. data/test/grouping_test.rb +305 -0
  44. data/test/html_formatter_test.rb +104 -0
  45. data/test/pdf_formatter_test.rb +25 -0
  46. data/test/{test_query.rb → query_test.rb} +32 -121
  47. data/test/{test_record.rb → record_test.rb} +40 -23
  48. data/test/renderer_test.rb +344 -0
  49. data/test/{test_report.rb → report_test.rb} +74 -44
  50. data/test/samples/ticket_count.csv +124 -0
  51. data/test/{test_sql_split.rb → sql_split_test.rb} +0 -0
  52. data/test/{test_table.rb → table_test.rb} +255 -44
  53. data/test/text_formatter_test.rb +144 -0
  54. data/util/bench/data/record/bench_as_vs_to.rb +17 -0
  55. data/util/bench/data/record/bench_constructor.rb +46 -0
  56. data/util/bench/data/record/bench_indexing.rb +65 -0
  57. data/util/bench/data/record/bench_reorder.rb +35 -0
  58. data/util/bench/data/record/bench_to_a.rb +19 -0
  59. data/util/bench/data/table/bench_column_manip.rb +103 -0
  60. data/util/bench/data/table/bench_dup.rb +24 -0
  61. data/util/bench/data/table/bench_init.rb +67 -0
  62. data/util/bench/data/table/bench_manip.rb +125 -0
  63. data/util/bench/formatter/bench_csv.rb +14 -0
  64. data/util/bench/formatter/bench_html.rb +14 -0
  65. data/util/bench/formatter/bench_pdf.rb +14 -0
  66. data/util/bench/formatter/bench_text.rb +14 -0
  67. data/util/bench/samples/tattle.csv +1237 -0
  68. metadata +121 -143
  69. data/TODO +0 -21
  70. data/examples/invoice.rb +0 -142
  71. data/examples/invoice_report.rb +0 -29
  72. data/examples/line_graph.rb +0 -38
  73. data/examples/rope_examples/itunes/config/ruport_config.rb +0 -8
  74. data/examples/rope_examples/sales_report/config/ruport_config.rb +0 -8
  75. data/lib/ruport/attempt.rb +0 -63
  76. data/lib/ruport/config.rb +0 -204
  77. data/lib/ruport/data/groupable.rb +0 -93
  78. data/lib/ruport/data/taggable.rb +0 -80
  79. data/lib/ruport/format.rb +0 -1
  80. data/lib/ruport/format/csv.rb +0 -29
  81. data/lib/ruport/format/html.rb +0 -42
  82. data/lib/ruport/format/latex.rb +0 -47
  83. data/lib/ruport/format/pdf.rb +0 -233
  84. data/lib/ruport/format/plugin.rb +0 -31
  85. data/lib/ruport/format/svg.rb +0 -60
  86. data/lib/ruport/format/text.rb +0 -103
  87. data/lib/ruport/format/xml.rb +0 -32
  88. data/lib/ruport/layout.rb +0 -1
  89. data/lib/ruport/layout/component.rb +0 -7
  90. data/lib/ruport/mailer.rb +0 -99
  91. data/lib/ruport/renderer/graph.rb +0 -46
  92. data/lib/ruport/report/graph.rb +0 -14
  93. data/lib/ruport/system_extensions.rb +0 -71
  94. data/test/test_config.rb +0 -88
  95. data/test/test_format_text.rb +0 -63
  96. data/test/test_graph_renderer.rb +0 -97
  97. data/test/test_groupable.rb +0 -56
  98. data/test/test_mailer.rb +0 -170
  99. data/test/test_renderer.rb +0 -151
  100. data/test/test_ruport.rb +0 -58
  101. data/test/test_table_renderer.rb +0 -141
  102. data/test/test_taggable.rb +0 -52
@@ -15,15 +15,35 @@ rescue LoadError
15
15
  $stderr.puts "Warning: Mocha not found -- skipping some Report tests"
16
16
  end
17
17
 
18
+ class SampleReport < Ruport::Report
19
+ renders_with Ruport::Renderer::Table
20
+
21
+ def generate
22
+ Table(%w[not abc]) << %w[o r] << %w[one two] << %w[thr ee]
23
+ end
24
+ end
25
+
18
26
  class TestReport < Test::Unit::TestCase
19
27
  include Ruport
20
28
 
21
29
  def setup
22
30
  @report = Report.new
23
- Ruport::Config.source :default, :dsn => "ruport:test",
24
- :user => "foo", :password => "bar"
25
- @query1 = Ruport::Query.new "select * from foo", :cache_enabled => true
26
- @query1.cached_data = [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c])
31
+ end
32
+
33
+ def test_renders_with_shortcuts
34
+ a = SampleReport.new(:csv)
35
+ assert_equal("not,abc\no,r\none,two\nthr,ee\n",a.run)
36
+ assert_equal("not,abc\no,r\none,two\nthr,ee\n",SampleReport.as(:csv))
37
+ assert_equal("not,abc\no,r\none,two\nthr,ee\n",SampleReport.to_csv)
38
+ assert_equal("not,abc\no,r\none,two\nthr,ee\n",a.to_csv)
39
+ a = SampleReport.new
40
+ assert_equal("not,abc\no,r\none,two\nthr,ee\n",a.to_csv)
41
+
42
+ #not sure if this is 'good behaviour'
43
+ assert_equal :csv, a.format
44
+ a.to_text
45
+
46
+ assert_equal :text, a.format
27
47
  end
28
48
 
29
49
  def test_erb
@@ -33,23 +53,6 @@ class TestReport < Test::Unit::TestCase
33
53
  assert_equal "foo\n4\n---\n", @report.erb("test/samples/foo.rtxt")
34
54
  end
35
55
 
36
- def test_textile
37
- @report = Report.new
38
- assert_equal "<p><strong>foo</strong></p>", @report.textile("*foo*")
39
- end
40
-
41
- def test_query
42
- assert_kind_of Ruport::Data::Table,
43
- @report.query("blah",:query_obj => @query1)
44
- expected = [[1,2,3],[4,5,6],[7,8,9]]
45
- @report.query("blah",:query_obj => @query1, :yield_type => :by_row) { |r|
46
- assert_equal expected.shift, r.to_a
47
- assert_equal %w[a b c], r.attributes
48
- }
49
- assert_equal "a,b,c\n1,2,3\n4,5,6\n7,8,9\n",
50
- @report.query("blah",:query_obj => @query1, :as => :csv)
51
- end
52
-
53
56
  class MyReport < Report; end
54
57
 
55
58
  def test_klass_methods
@@ -91,7 +94,7 @@ class TestReport < Test::Unit::TestCase
91
94
  rep_klass.send(:generate) { raise }
92
95
 
93
96
  assert_raises(RuntimeError){
94
- rep_klass.run(:tries => 3, :interval => 1, :log_level => :log_only)
97
+ rep_klass.run(:tries => 3, :interval => 1)
95
98
  }
96
99
 
97
100
  rep_klass.send(:generate) { sleep 1.1 }
@@ -116,17 +119,7 @@ class TestReport < Test::Unit::TestCase
116
119
  assert_equal ["hello dolly", "hello dolly"],
117
120
  rep_klass.run(:reports => [rep_klass.new,rep_klass.new])
118
121
  end
119
-
120
- def test_send_to
121
- return unless Object.const_defined? :Mocha
122
- setup_mock_mailer
123
- @report = Report.new
124
- assert_equal "250 ok", @report.send_to("clyde@example.com") { |mail|
125
- mail.subject = "Test Report"
126
- mail.text = "Test"
127
- }
128
- end
129
-
122
+
130
123
  def test_write_to_file
131
124
  return unless Object.const_defined? :Mocha
132
125
  file = mock("file")
@@ -172,17 +165,54 @@ class TestReport < Test::Unit::TestCase
172
165
 
173
166
  assert_equal expected, array
174
167
  end
175
-
176
- private
177
-
178
- def setup_mock_mailer
179
- @smtp = mock('smtp')
180
-
181
- Net::SMTP.expects(:start).
182
- yields(@smtp).
183
- returns("250 ok").at_least_once
184
- @smtp.stubs(:send_message).
185
- returns("250 ok")
168
+
169
+ def test_renders_with
170
+ klass = MyReport.dup
171
+ klass.renders_with Ruport::Renderer::Table
172
+ klass.send(:generate) { [[1,2,3],[4,5,6]].to_table(%w[a b c]) }
173
+ a = klass.new(:csv)
174
+ assert_equal "a,b,c\n1,2,3\n4,5,6\n", a.run
175
+
176
+ klass.renders_with Ruport::Renderer::Table, :show_table_headers => false
177
+ a = klass.new(:csv)
178
+ assert_equal "1,2,3\n4,5,6\n", a.run
179
+ assert_equal "a,b,c\n1,2,3\n4,5,6\n", a.run(:show_table_headers => true)
180
+
181
+
186
182
  end
187
183
 
184
+ def test_renders_as_table
185
+ klass = MyReport.dup
186
+ klass.renders_as_table
187
+ klass.send(:generate) { [[1,2,3],[4,5,6]].to_table(%w[a b c]) }
188
+ a = klass.new(:csv)
189
+ assert_equal "a,b,c\n1,2,3\n4,5,6\n", a.run
190
+ end
191
+
192
+ def test_renders_as_row
193
+ klass = MyReport.dup
194
+ klass.renders_as_row
195
+ klass.send(:generate) { [[1,2,3]].to_table(%w[a b c])[0] }
196
+ a = klass.new(:csv)
197
+ assert_equal "1,2,3\n", a.run
198
+ end
199
+
200
+ def test_renders_as_group
201
+ klass = MyReport.dup
202
+ klass.renders_as_group
203
+ klass.send(:generate) { [[1,2,3]].to_table(%w[a b c]).to_group("foo") }
204
+ a = klass.new(:csv)
205
+ assert_equal "foo\n\na,b,c\n1,2,3\n", a.run
206
+ end
207
+
208
+ def test_renders_as_grouping
209
+ klass = MyReport.dup
210
+ klass.renders_as_grouping
211
+ klass.send(:generate) {
212
+ Grouping([[1,2,3],[4,5,6]].to_table(%w[a b c]),:by => "a")
213
+ }
214
+ a = klass.new(:csv)
215
+ assert_equal "1\n\nb,c\n2,3\n\n4\n\nb,c\n5,6\n\n", a.run
216
+ end
217
+
188
218
  end
@@ -0,0 +1,124 @@
1
+ title,date
2
+ Ticket #238 (enhancement closed): Table#sort_rows_by!,2007-04-17
3
+ Ticket #225 (task closed): corner bottlenecks with focused benchmarks,2007-04-17
4
+ Ticket #223 (task closed): Identify a small set of key benchmarks,2007-04-17
5
+ Ticket #209 (task closed): Refactor Formatters,2007-04-15
6
+ Ticket #236 (task closed): api.rubyreports.org/edge,2007-04-13
7
+ Ticket #212 (task closed): Users Field Guide,2007-04-13
8
+ Ticket #186 (enhancement closed): simple_html_table,2007-04-13
9
+ Ticket #235 (task closed): Get a big list of all the methods in Ruport. Stare at them. Identify their interface. Cry.,2007-04-13
10
+ Ticket #196 (defect closed): as() returns unintelligible error for non-registered formats,2007-04-13
11
+ Ticket #244 (defect closed): Allow proper copying of Grouping,2007-04-12
12
+ Ticket #249 (enhancement closed): Table#rename_columns should accept a block,2007-04-11
13
+ Ticket #249 (enhancement created): Table#rename_columns should accept a block,2007-04-11
14
+ Ticket #188 (defect closed): class_str broken in 0.9.2,2007-04-11
15
+ Ticket #224 (task closed): Build ruport_bench which will run benchmarks and generate reports,2007-04-11
16
+ Ticket #241 (task closed): rewrite Table/Group dup methods to use initialize_copy instead,2007-04-11
17
+ Ticket #220 (enhancement closed): rope rake tasks for ruport-util,2007-04-10
18
+ Ticket #219 (task closed): XML/FO Formatter,2007-04-07
19
+ Ticket #211 (task closed): Remove Multilevel Grouping Formatters,2007-04-06
20
+ Ticket #248 (task created): AAR Name,2007-04-05
21
+ Ticket #204 (task closed): Merge AAR to Trunk,2007-04-05
22
+ Ticket #203 (task closed): AAR Tests,2007-04-05
23
+ Ticket #226 (task closed): investigate Ara's xx for html helpers.,2007-04-04
24
+ "Ticket #247 (task created): Ruport Utils wiki page, and update of deprecated plugin pages",2007-04-04
25
+ Ticket #245 (task closed): Make initial RubyForge release,2007-04-04
26
+ Ticket #246 (enhancement created): Grouping#summary,2007-04-04
27
+ Ticket #245 (task created): Make initial RubyForge release,2007-04-04
28
+ Ticket #229 (enhancement closed): Add tests for invoice,2007-04-04
29
+ Ticket #231 (enhancement closed): ReportManager tests,2007-04-04
30
+ Ticket #221 (task closed): improve invoice interface,2007-04-04
31
+ Ticket #233 (task closed): ReportManager example,2007-04-04
32
+ Ticket #230 (enhancement closed): Add support for line labels in graph,2007-04-04
33
+ Ticket #242 (task closed): set mike up with stats access,2007-04-04
34
+ Ticket #202 (task closed): AAR Branch,2007-04-04
35
+ Ticket #234 (defect closed): options should not be used as an argument name anywhere in Renderers or Formatters,2007-04-04
36
+ Ticket #244 (defect created): Allow proper copying of Grouping,2007-04-04
37
+ Ticket #240 (task closed): use self.class.new where appropriate,2007-04-04
38
+ Ticket #243 (task closed): fix circular dependency issue in rope,2007-04-04
39
+ Ticket #243 (task created): fix circular dependency issue in rope,2007-04-04
40
+ Ticket #242 (task created): set mike up with stats access,2007-04-03
41
+ Ticket #241 (task created): rewrite Table/Group dup methods to use initialize_copy instead,2007-04-03
42
+ Ticket #237 (task closed): set mike up with all the necessary resource permissions for releases,2007-04-02
43
+ Ticket #227 (task closed): packaging rake task for Release,2007-04-02
44
+ Ticket #240 (task created): use self.class.new where appropriate,2007-04-02
45
+ Ticket #191 (enhancement closed): render_grouping,2007-04-01
46
+ Ticket #239 (enhancement created): Table#sort_rows_by should accept non-array single arg.,2007-04-01
47
+ Ticket #238 (enhancement created): Table#sort_rows_by!,2007-04-01
48
+ Ticket #237 (task created): set mike up with all the necessary resource permissions for releases,2007-04-01
49
+ Ticket #78 (enhancement closed): Do we need to bring back a SQL generator?,2007-03-31
50
+ Ticket #236 (task created): api.rubyreports.org/edge,2007-03-31
51
+ Ticket #235 (task created): Get a big list of all the methods in Ruport. Stare at them. Identify their interface. Cry.,2007-03-31
52
+ Ticket #228 (enhancement closed): Layout method,2007-03-31
53
+ Ticket #234 (defect created): options should not be used as an argument name anywhere in Renderers or Formatters,2007-03-31
54
+ Ticket #217 (task closed): Depluginize initial set of utils,2007-03-31
55
+ Ticket #232 (task closed): ReportManager example,2007-03-31
56
+ Ticket #233 (task created): ReportManager example,2007-03-31
57
+ Ticket #232 (task created): ReportManager example,2007-03-31
58
+ Ticket #231 (enhancement created): ReportManager tests,2007-03-31
59
+ Ticket #230 (enhancement created): Add support for line labels in graph,2007-03-31
60
+ Ticket #216 (task closed): Fix Graphing,2007-03-31
61
+ Ticket #229 (enhancement created): Add tests for invoice,2007-03-31
62
+ Ticket #228 (enhancement created): Layout method,2007-03-31
63
+ Ticket #222 (task closed): add ruport-util component in Trac,2007-03-31
64
+ Ticket #218 (task closed): move svn repository up one level,2007-03-31
65
+ Ticket #227 (task created): packaging rake task for Release,2007-03-31
66
+ Ticket #226 (task created): investigate Ara's xx for html helpers.,2007-03-30
67
+ Ticket #199 (task closed): Update License Information,2007-03-30
68
+ Ticket #178 (task closed): Grouping Renderer,2007-03-30
69
+ Ticket #225 (task created): corner bottlenecks with focused benchmarks,2007-03-30
70
+ Ticket #224 (task created): Build ruport_bench which will run benchmarks and generate reports,2007-03-30
71
+ Ticket #223 (task created): Identify a small set of key benchmarks,2007-03-30
72
+ Ticket #106 (task closed): standardize API documentation format and cleanup where needed,2007-03-30
73
+ Ticket #199 (task closed): Update License Information,2007-03-30
74
+ Ticket #184 (task closed): Consistent Errors,2007-03-30
75
+ Ticket #222 (task created): add ruport-util component in Trac,2007-03-30
76
+ Ticket #221 (task created): improve invoice interface,2007-03-30
77
+ Ticket #220 (enhancement created): rope rake tasks for ruport-util,2007-03-30
78
+ Ticket #219 (task created): XML/FO Formatter,2007-03-30
79
+ Ticket #218 (task created): move svn repository up one level,2007-03-30
80
+ Ticket #217 (task created): Depluginize initial set of utils,2007-03-30
81
+ Ticket #216 (task created): Fix Graphing,2007-03-30
82
+ Ticket #215 (task closed): apply for RubyForge project,2007-03-30
83
+ Ticket #215 (task created): apply for RubyForge project,2007-03-30
84
+ Ticket #214 (task created): Determine if cheatsheets can be released,2007-03-30
85
+ Ticket #213 (task created): Contributors Field Guide,2007-03-30
86
+ Ticket #212 (task created): Users Field Guide,2007-03-30
87
+ Ticket #211 (task created): Remove Multilevel Grouping Formatters,2007-03-30
88
+ Ticket #210 (task created): Formatting Helpers,2007-03-30
89
+ Ticket #209 (task created): Refactor Formatters,2007-03-30
90
+ Ticket #208 (task created): API Stability,2007-03-30
91
+ Ticket #207 (task created): Refactor Unit Tests,2007-03-30
92
+ Ticket #206 (task created): Testing Audit,2007-03-30
93
+ Ticket #205 (task created): Custom Exceptions,2007-03-30
94
+ Ticket #204 (task created): Merge AAR to Trunk,2007-03-30
95
+ Ticket #203 (task created): AAR Tests,2007-03-30
96
+ Ticket #202 (task created): AAR Branch,2007-03-30
97
+ Ticket #201 (task created): Standardize API Docs,2007-03-30
98
+ Ticket #200 (task created): Remove Deprecated Docs,2007-03-30
99
+ Ticket #199 (task created): Update License Information,2007-03-30
100
+ Ticket #198 (task created): rubyreports.org webpage,2007-03-30
101
+ Ticket #197 (task created): Proper Licensing Statements,2007-03-28
102
+ Ticket #196 (defect created): as() returns unintelligible error for non-registered formats,2007-03-28
103
+ Ticket #195 (enhancement closed): Formatter::PDF#draw_table,2007-03-27
104
+ "Ticket #194 (enhancement closed): renders_for should take multiple formats, renderers.",2007-03-26
105
+ Ticket #193 (task closed): Make Renderer.add_format private and remove add_core_format,2007-03-26
106
+ Ticket #195 (enhancement created): Formatter::PDF#draw_table,2007-03-26
107
+ "Ticket #194 (enhancement created): renders_for should take multiple formats, renderers.",2007-03-26
108
+ Ticket #193 (task created): Make Renderer.add_format private and remove add_core_format,2007-03-26
109
+ Ticket #183 (task closed): Remove Shortcuts from Core,2007-03-26
110
+ Ticket #192 (enhancement created): renders_with should take default options,2007-03-26
111
+ Ticket #191 (enhancement created): render_grouping,2007-03-25
112
+ Ticket #190 (enhancement created): Report shortcuts for rendering,2007-03-25
113
+ Ticket #189 (enhancement created): sub_table / reduce should take single arg range,2007-03-25
114
+ Ticket #187 (enhancement closed): Ruport::Format::Plugin becomes Ruport::Formatter,2007-03-24
115
+ Ticket #163 (task closed): Data::Group,2007-03-23
116
+ Ticket #144 (enhancement closed): SQL Formatter?,2007-03-23
117
+ Ticket #188 (defect created): class_str broken in 0.9.2,2007-03-23
118
+ Ticket #187 (enhancement created): Ruport::Format::Plugin becomes Ruport::Formatter,2007-03-23
119
+ Ticket #174 (enhancement closed): Grouping &amp; Group data structures,2007-03-23
120
+ Ticket #186 (enhancement created): simple_html_table,2007-03-23
121
+ Ticket #185 (task created): Sanitize,2007-03-22
122
+ Ticket #184 (task created): Consistent Errors,2007-03-22
123
+ Ticket #183 (task created): Remove Shortcuts from Core,2007-03-22
124
+ Ticket #182 (defect closed): rope does not regenerate deleted test_files when using 'rake build',2007-03-19
File without changes
@@ -26,11 +26,7 @@ class TestTable < Test::Unit::TestCase
26
26
  assert_equal n, t.column_names
27
27
 
28
28
  t = [[1,2,3],[4,5,6]].to_table(%w[a b c])
29
- t[0].tag :foo
30
- t[1].tag :bar
31
29
  table_from_records = t.data.to_table(t.column_names)
32
- assert_equal Set.new([:foo]), table_from_records[0].tags
33
- assert_equal Set.new([:bar]), table_from_records[1].tags
34
30
  end
35
31
 
36
32
  a = Ruport::Data::Record.new [1,2,3]
@@ -51,6 +47,14 @@ class TestTable < Test::Unit::TestCase
51
47
  assert_equal [1,2,3,4], a.column(0)
52
48
 
53
49
  end
50
+
51
+ def test_to_group
52
+ a =[[1,2,3],[4,5,6]].to_table(%w[a b c]).to_group("Packrats")
53
+ b = Ruport::Data::Group.new( :data => [[1,2,3],[4,5,6]],
54
+ :column_names => %w[a b c],
55
+ :name => "Packrats" )
56
+ assert_equal a,b
57
+ end
54
58
 
55
59
  def test_set_column_names
56
60
  a = [[1,2,3],[4,5,6]].to_table
@@ -78,7 +82,7 @@ class TestTable < Test::Unit::TestCase
78
82
  assert_equal([table[2]], table.rows_with_b(8))
79
83
  assert_equal [table[1]], table.rows_with(%w[a b]) { |a,b| [a,b] == [1,3] }
80
84
  end
81
-
85
+
82
86
  def test_append_record
83
87
  table = Ruport::Data::Table.new :column_names => %w[a b c]
84
88
  table << Ruport::Data::Record.new([1,2,3], :attributes => %w[a b c])
@@ -86,8 +90,7 @@ class TestTable < Test::Unit::TestCase
86
90
  assert_equal(%w[a b c],table[0].attributes)
87
91
  rec = table[0].dup
88
92
  rec.attributes = %w[a b c d]
89
- assert_raise(ArgumentError) { table << Object.new }
90
- assert_raise(ArgumentError) { table << [].to_table }
93
+ assert_raise(NoMethodError) { table << Object.new }
91
94
  end
92
95
 
93
96
  def test_append_hash
@@ -133,10 +136,30 @@ class TestTable < Test::Unit::TestCase
133
136
  table.sub_table(%w[a c])
134
137
 
135
138
  assert_equal [[10,11,12,13],[14,15,16,17]].to_table(%w[a b c d]),
136
- table.sub_table { |r| r.c > 10 }
139
+ table.sub_table { |r| r.c > 10 }
140
+
141
+ assert_equal [[10,11,12,13],[14,15,16,17]].to_table(%w[a b c d]),
142
+ table.sub_table(2..-1)
137
143
 
138
144
  end
139
145
 
146
+ def test_reduce
147
+
148
+ table = [ [1,2,3,4],[5,6,7,9],
149
+ [10,11,12,13],[14,15,16,17] ].to_table(%w[a b c d])
150
+
151
+ table.reduce(%w[b c],1..-2)
152
+ assert_equal [[6,7],[11,12]].to_table(%w[b c]), table
153
+
154
+ table = [ [1,2,3,4],[5,6,7,9],
155
+ [10,11,12,13],[14,15,16,17] ].to_table(%w[a b c d])
156
+ table.reduce(%w[c d a]) { |r| r.a < 10 }
157
+
158
+ assert_equal [[3,4,1],[7,9,5]].to_table(%w[c d a]),
159
+ table
160
+
161
+ end
162
+
140
163
  def test_csv_load
141
164
  table = Ruport::Data::Table.load("test/samples/data.csv")
142
165
  assert_equal %w[col1 col2 col3], table.column_names
@@ -149,7 +172,26 @@ class TestTable < Test::Unit::TestCase
149
172
  table = Ruport::Data::Table.load( "test/samples/data.tsv",
150
173
  :csv_options => { :col_sep => "\t" } )
151
174
  assert_equal expected, table
152
-
175
+
176
+
177
+ expected = ['c','e']
178
+
179
+ table = Ruport::Data::Table.load( "test/samples/data.csv", :csv_options =>
180
+ { :headers => true, :header_converters => :symbol } ) do |s,r|
181
+ assert_equal expected.shift, r[:col3]
182
+ end
183
+
184
+ assert_equal [:col1,:col2,:col3], table.column_names
185
+
186
+
187
+ expected = ['c','e']
188
+
189
+ Ruport::Data::Table.load( "test/samples/data.csv",
190
+ :records => true ) do |s,r|
191
+ assert_equal expected.shift, r.col3
192
+ assert_kind_of Ruport::Data::Record, r
193
+ end
194
+
153
195
  table = Ruport::Data::Table.load("test/samples/data.csv", :has_names => false)
154
196
  assert_equal([],table.column_names)
155
197
  assert_equal([%w[col1 col2 col3],%w[a b c],["d",nil,"e"]].to_table, table)
@@ -174,6 +216,7 @@ class TestTable < Test::Unit::TestCase
174
216
  :has_names => false)
175
217
  assert_equal([],table.column_names)
176
218
  assert_equal([%w[a b c],%w[1 2 3], %w[4 5 6]].to_table, table)
219
+
177
220
 
178
221
  end
179
222
 
@@ -246,6 +289,55 @@ class TestTable < Test::Unit::TestCase
246
289
  [3,nil,4,'x',7],
247
290
  [5,nil,6,'x',11] ].to_table(%w[a x b c d]), a)
248
291
 
292
+ end
293
+
294
+ def test_add_columns
295
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
296
+ a.add_columns(%w[c d])
297
+ expected = [ [1,2,nil,nil],
298
+ [3,4,nil,nil],
299
+ [5,6,nil,nil] ].to_table(%w[a b c d])
300
+
301
+ assert_equal expected, a
302
+
303
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
304
+
305
+ a.add_columns(%w[c d],:after => "a")
306
+
307
+ expected = [ [1,nil,nil,2],
308
+ [3,nil,nil,4],
309
+ [5,nil,nil,6], ].to_table(%w[a c d b])
310
+
311
+ assert_equal expected, a
312
+
313
+ a.add_columns(%w[x f],:before => "a")
314
+
315
+ expected = [ [nil,nil,1,nil,nil,2],
316
+ [nil,nil,3,nil,nil,4],
317
+ [nil,nil,5,nil,nil,6] ].to_table(%w[x f a c d b])
318
+
319
+ assert_equal expected, a
320
+
321
+ a = [[1,2,0],[3,4,0],[5,6,0]].to_table(%w[a b c])
322
+
323
+ a.add_columns(%w[x y],:default => 9, :position => 1)
324
+
325
+ expected = [[1,9,9,2,0],[3,9,9,4,0],[5,9,9,6,0]].to_table(%w[a x y b c])
326
+
327
+ assert_equal expected, a
328
+
329
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
330
+ a.add_columns(%w[f x],:default => 0)
331
+
332
+ expected = [[1,2,0,0],[3,4,0,0],[5,6,0,0]].to_table(%w[a b f x])
333
+ assert_equal expected, a
334
+
335
+ assert_raises(RuntimeError) do
336
+ a.add_columns(%w[a b]) { }
337
+ end
338
+
339
+
340
+
249
341
  end
250
342
 
251
343
  def test_remove_column
@@ -273,6 +365,28 @@ class TestTable < Test::Unit::TestCase
273
365
  a.rename_column("b","x")
274
366
  assert_equal Table(%w[a x]) { |t| t << [1,2] << [3,4] }, a
275
367
  end
368
+
369
+
370
+ def test_rename_columns
371
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
372
+ a.rename_columns(%w[a b], %w[x y])
373
+ assert_equal Table(%w[x y]) { |t| t << [1,2] << [3,4] }, a
374
+
375
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
376
+ a.rename_columns("a"=>"x","b"=>"y")
377
+ assert_equal Table(%w[x y]) { |t| t << [1,2] << [3,4] }, a
378
+
379
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
380
+ assert_raise(ArgumentError) { a.rename_columns(%w[a b], %w[x]) }
381
+
382
+ a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
383
+ a.rename_columns { |r| r.to_sym }
384
+ assert_equal(a, Table(:a,:b,:c) { |t| t << [1,2,3] << [4,5,6] })
385
+
386
+ a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
387
+ a.rename_columns(%w[a c]) { |r| r.to_sym }
388
+ assert_equal(a, Table(:a,"b",:c) { |t| t << [1,2,3] << [4,5,6] })
389
+ end
276
390
 
277
391
  def test_swap_column
278
392
  a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
@@ -286,6 +400,8 @@ class TestTable < Test::Unit::TestCase
286
400
  a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
287
401
  a.replace_column("b","d") { |r| r.b.to_s }
288
402
  assert_equal Table(%w[a d c]) { |t| t << [1,"2",3] << [4,"5",6] }, a
403
+ a.replace_column("d") { |r| r.d.to_i }
404
+ assert_equal Table(%w[a d c]) { |t| t << [1,2,3] << [4,5,6] }, a
289
405
  end
290
406
 
291
407
  def test_append_chain
@@ -299,12 +415,16 @@ class TestTable < Test::Unit::TestCase
299
415
  table = Ruport::Data::Table.new :column_names => %w[a b],
300
416
  :data => [[1,2],[3,4],[5,6]]
301
417
  assert_equal("a,b\n1,2\n3,4\n5,6\n",table.to_csv)
418
+ assert_raises(Ruport::Renderer::UnknownFormatError) { table.to_nothing }
302
419
  end
303
420
 
304
421
 
305
422
  def test_sort_rows_by
306
423
  table = Ruport::Data::Table.new :column_names => %w[a b c]
307
- table << [1,2,3] << [6,1,8] << [9,1,4]
424
+ table << [1,2,3] << [6,1,8] << [9,1,4]
425
+
426
+ table2 = Ruport::Data::Table.new :column_names => [:a, :b, :c]
427
+ table2 << [1,2,3] << [6,1,8] << [9,1,4]
308
428
 
309
429
  sorted_table_a = Ruport::Data::Table.new :column_names => %w[a b c]
310
430
  sorted_table_a << [1,2,3] << [6,1,8] << [9,1,4]
@@ -313,11 +433,42 @@ class TestTable < Test::Unit::TestCase
313
433
  sorted_table_b << [6,1,8] << [9,1,4] << [1,2,3]
314
434
 
315
435
  sorted_table_bc = Ruport::Data::Table.new :column_names => %w[a b c]
316
- sorted_table_bc << [9,1,4] << [6,1,8] << [1,2,3]
436
+ sorted_table_bc << [9,1,4] << [6,1,8] << [1,2,3]
437
+
438
+ sorted_table_bs = Ruport::Data::Table.new :column_names => [:a, :b, :c]
439
+ sorted_table_bs << [6,1,8] << [9,1,4] << [1,2,3]
317
440
 
318
441
  assert_equal sorted_table_a, table.sort_rows_by {|r| r['a']}
319
442
  assert_equal sorted_table_b, table.sort_rows_by(['b'])
320
443
  assert_equal sorted_table_bc, table.sort_rows_by(['b', 'c'])
444
+ assert_equal sorted_table_bs, table2.sort_rows_by(:b)
445
+ end
446
+
447
+ def test_sort_rows_by!
448
+ table = Ruport::Data::Table.new :column_names => %w[a b c]
449
+ table << [1,2,3] << [6,1,8] << [9,1,4]
450
+
451
+ sorted_table_a = Ruport::Data::Table.new :column_names => %w[a b c]
452
+ sorted_table_a << [1,2,3] << [6,1,8] << [9,1,4]
453
+
454
+ sorted_table_b = Ruport::Data::Table.new :column_names => %w[a b c]
455
+ sorted_table_b << [6,1,8] << [9,1,4] << [1,2,3]
456
+
457
+ sorted_table_bc = Ruport::Data::Table.new :column_names => %w[a b c]
458
+ sorted_table_bc << [9,1,4] << [6,1,8] << [1,2,3]
459
+
460
+ table_a = table.dup
461
+ table_a.sort_rows_by! { |r| r['a'] }
462
+
463
+ table_b = table.dup
464
+ table_b.sort_rows_by!("b")
465
+
466
+ table_bc = table.dup
467
+ table_bc.sort_rows_by!(['b', 'c'])
468
+
469
+ assert_equal sorted_table_a, table_a
470
+ assert_equal sorted_table_b, table_b
471
+ assert_equal sorted_table_bc, table_bc
321
472
  end
322
473
 
323
474
  def test_array_hack
@@ -332,14 +483,6 @@ class TestTable < Test::Unit::TestCase
332
483
  assert_equal table, table2
333
484
 
334
485
  end
335
-
336
- # for those in a meta-mood (mostly just a collection coverage )
337
- def test_table_to_table
338
- a = [[1,2,3]].to_table
339
- assert_kind_of Ruport::Data::Table, a
340
- assert_equal [[1,2,3]].to_table(%w[a b c]),
341
- a.to_table(:column_names => %w[a b c])
342
- end
343
486
 
344
487
  def test_record_class
345
488
  a = Ruport::Data::Table.new( :column_names => %w[first_name last_name c],
@@ -362,6 +505,30 @@ class TestTable < Test::Unit::TestCase
362
505
  assert_equal ['joe frasier', 'brian black'],
363
506
  b.map { |r| r.name }
364
507
 
508
+ end
509
+
510
+ def test_to_hack_takes_args
511
+ a = Table(%w[hello mr crowley]) << %w[would you like] << %w[one red cat]
512
+
513
+ assert_equal "would,you,like\none,red,cat\n",
514
+ a.to_csv(:show_table_headers => false)
515
+
516
+ assert_equal "would,you,like\none,red,cat\n",
517
+ a.to_csv { |r| r.show_table_headers = false }
518
+
519
+ assert_equal "would\tyou\tlike\none\tred\tcat\n",
520
+ a.to_csv(:show_table_headers => false) { |r|
521
+ r.format_options = { :col_sep => "\t" }
522
+ }
523
+
524
+ end
525
+
526
+ def test_as_throws_proper_errors
527
+ a = [[1,2,3],[4,5,6]].to_table(%w[a b c])
528
+ assert_nothing_raised { a.as(:csv) }
529
+ assert_nothing_raised { a.to_csv }
530
+ assert_raises(Ruport::Renderer::UnknownFormatError) { a.as(:nothing) }
531
+ assert_raises(Ruport::Renderer::UnknownFormatError) { a.to_nothing }
365
532
  end
366
533
 
367
534
 
@@ -428,15 +595,6 @@ class TestTable < Test::Unit::TestCase
428
595
  assert_equal 4, x.length
429
596
  end
430
597
 
431
- # bug found with paul novak 2007.01.17
432
- def test_ensure_tags_preserved_in_subtable
433
- a = [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c])
434
- a[1].tag(:foo)
435
- a.create_group("bar") { |r| r.b < 6 }
436
- assert_equal Set.new(["grp_bar"]), a.group("bar")[0].tags
437
- assert_equal Set.new([:foo,"grp_bar"]), a.group("bar")[1].tags
438
- end
439
-
440
598
  def test_ensure_coerce_sum
441
599
  s = [["1"],["3"],["5"] ].to_table
442
600
  t = [["1.23"],["1.5"]].to_table
@@ -445,20 +603,6 @@ class TestTable < Test::Unit::TestCase
445
603
  assert_equal(2.73,t.sum(0))
446
604
  end
447
605
 
448
- #Ticket #142
449
- def test_ensure_constructor_dups_record_tags
450
- a = [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c])
451
- b = a.dup
452
-
453
- a[0].tag :foo
454
- assert_equal Set.new([]), b[0].tags
455
- assert_equal Set.new([:foo]),a[0].tags
456
-
457
- b[1].tag :bar
458
- assert_equal Set.new([]), a[1].tags
459
- assert_equal Set.new([:bar]), b[1].tags
460
- end
461
-
462
606
  def test_ensure_serializable
463
607
  a = [].to_table
464
608
  assert_nothing_raised { a.to_yaml }
@@ -489,21 +633,52 @@ class TestTable < Test::Unit::TestCase
489
633
 
490
634
  a = [[1,2,3],[4,5,6]].to_table
491
635
 
636
+ a.replace_column(1) { |r| r[0] + r[2] }
637
+
638
+ a.column_names = %w[d e f]
639
+ assert_equal [[1,4,3],[4,10,6]].to_table(%w[d e f]), a
640
+
641
+ a = [[1,2,3],[4,5,6]].to_table
642
+
643
+ a.replace_column(2) { |r| r[0] + 5 }
644
+
492
645
  a.column_names = %w[a b c]
493
646
 
647
+ a.replace_column("b") { |r| r.a + 4 }
494
648
  a.replace_column("b","foo") { |r| r.b + 1 }
495
649
 
496
- assert_equal [[1,3,3],[4,6,6]].to_table(%w[a foo c]), a
650
+ assert_equal [[1,6,6],[4,9,9]].to_table(%w[a foo c]), a
497
651
  end
498
652
 
499
653
  def test_ensure_propagate_record_class
500
- a = Ruport::Data::Table.new(:record_class => DuckRecord)
654
+ a = Table(:record_class => DuckRecord)
501
655
  assert_equal DuckRecord, a.record_class
502
656
 
503
657
  b = a.dup
504
658
  assert_equal DuckRecord, b.record_class
505
659
  end
506
660
 
661
+ def test_ensure_reorder_raises_on_bad_reorder_use
662
+ a = Table() << [1,2,3] << [4,5,6]
663
+ assert_raise(ArgumentError) { a.reorder("a","b","c") }
664
+ assert_raise(ArgumentError) { a.reorder(%w[a b c]) }
665
+ assert_raise(ArgumentError) { a.reorder(2,1,0) }
666
+ end
667
+
668
+ def test_ensure_csv_loading_accepts_table_options
669
+ a = Table("test/samples/addressbook.csv",:record_class => DuckRecord)
670
+ a.each { |r| assert_kind_of(DuckRecord,r) }
671
+ end
672
+
673
+
674
+ class MySubClass < Ruport::Data::Table; end
675
+
676
+ def test_ensure_table_subclasses_render_properly
677
+ a = MySubClass.new
678
+ a << [1,2,3] << [4,5,6]
679
+ assert_equal("1,2,3\n4,5,6\n",a.as(:csv))
680
+ end
681
+
507
682
  end
508
683
 
509
684
  class DuckRecord < Ruport::Data::Record; end
@@ -526,5 +701,41 @@ class TestTableKernelHack < Test::Unit::TestCase
526
701
  assert_equal Table("a"), Table(%w[a])
527
702
  assert_equal Table(:a), Table([:a])
528
703
  end
704
+
705
+ def test_iterators
706
+
707
+ Table("test/samples/addressbook.csv") do |s,r|
708
+ assert_kind_of(Array,r)
709
+ assert_kind_of(Ruport::Data::Table,s)
710
+ end
711
+
712
+ n = 0
713
+
714
+ Table(:string => "a,b,c\n1,2,3\n4,5,6\n") do |s,r|
715
+ assert_kind_of(Array,r)
716
+ assert_kind_of(Ruport::Data::Table,s)
717
+ n += 1
718
+ end
719
+
720
+ assert_equal 2, n
721
+
722
+ end
723
+
724
+ def test_with_file_arg
725
+ assert_equal Table("test/samples/addressbook.csv"),
726
+ Table(:file => "test/samples/addressbook.csv")
727
+ end
728
+
729
+ def test_with_string_arg
730
+ csv_string = "id,name\n1,Inky\n2,Blinky\n3,Clyde"
731
+
732
+ assert_equal Ruport::Data::Table.parse(csv_string),
733
+ Table(:string => csv_string)
734
+ end
735
+
736
+ def test_ensure_table_hack_accepts_normal_constructor_args
737
+ assert_equal Ruport::Data::Table.new(:column_names => %w[a b c]),
738
+ Table(:column_names => %w[a b c])
739
+ end
529
740
 
530
741
  end