ruport 1.7.1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +38 -0
- data/HACKING +1 -17
- data/{README.rdoc → README.md} +30 -38
- data/Rakefile +0 -10
- data/examples/row_renderer.rb +1 -1
- data/examples/simple_pdf_lines.rb +1 -1
- data/examples/trac_ticket_status.rb +1 -1
- data/lib/ruport/controller.rb +1 -1
- data/lib/ruport/data/grouping.rb +7 -7
- data/lib/ruport/data/record.rb +4 -4
- data/lib/ruport/data/table.rb +9 -9
- data/lib/ruport/formatter/csv.rb +1 -1
- data/lib/ruport/formatter/markdown.rb +105 -0
- data/lib/ruport/formatter/prawn_pdf.rb +96 -9
- data/lib/ruport/formatter/text.rb +1 -1
- data/lib/ruport/formatter.rb +1 -2
- data/lib/ruport/version.rb +1 -1
- data/lib/ruport.rb +7 -11
- data/test/controller_test.rb +107 -109
- data/test/csv_formatter_test.rb +21 -21
- data/test/data_feeder_test.rb +39 -39
- data/test/expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test +265 -0
- data/test/grouping_test.rb +74 -74
- data/test/helpers.rb +16 -5
- data/test/html_formatter_test.rb +22 -22
- data/test/markdown_formatter_test.rb +142 -0
- data/test/prawn_pdf_formatter_test.rb +108 -0
- data/test/record_test.rb +82 -82
- data/test/table_pivot_test.rb +9 -2
- data/test/table_test.rb +33 -40
- data/test/template_test.rb +12 -12
- data/test/text_formatter_test.rb +34 -34
- data/util/bench/data/table/bench_column_manip.rb +0 -1
- data/util/bench/data/table/bench_dup.rb +0 -1
- data/util/bench/data/table/bench_init.rb +0 -1
- data/util/bench/data/table/bench_manip.rb +0 -1
- data/util/bench/formatter/bench_csv.rb +0 -1
- data/util/bench/formatter/bench_html.rb +0 -1
- data/util/bench/formatter/bench_pdf.rb +0 -1
- data/util/bench/formatter/bench_text.rb +0 -1
- metadata +30 -29
- data/lib/ruport/formatter/pdf.rb +0 -589
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
|
3
|
+
require_relative 'helpers'
|
4
|
+
|
5
|
+
class TestRenderPDFTable < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
Ruport::Formatter::Template.create(:simple) do |format|
|
9
|
+
format.page = {
|
10
|
+
size: "LETTER",
|
11
|
+
layout: :landscape
|
12
|
+
}
|
13
|
+
format.text = {
|
14
|
+
font_size: 16
|
15
|
+
}
|
16
|
+
format.table = {
|
17
|
+
show_headings: false
|
18
|
+
}
|
19
|
+
format.column = {
|
20
|
+
alignment: :center,
|
21
|
+
width: 50
|
22
|
+
}
|
23
|
+
format.heading = {
|
24
|
+
alignment: :right,
|
25
|
+
bold: false,
|
26
|
+
title: "Test"
|
27
|
+
}
|
28
|
+
format.grouping = {
|
29
|
+
style: :separated
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_render_pdf_errors
|
35
|
+
# can't render without column names
|
36
|
+
data = Ruport.Table([], data: [[1,2],[3,4]])
|
37
|
+
assert_raises(Ruport::FormatterError) do
|
38
|
+
data.to_prawn_pdf
|
39
|
+
end
|
40
|
+
|
41
|
+
data.column_names = %w[a b]
|
42
|
+
|
43
|
+
data.to_prawn_pdf
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_render_pdf_basic
|
47
|
+
expected_output = IO.binread(File.join(__dir__, 'expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test')).bytes
|
48
|
+
|
49
|
+
data = Ruport.Table(%w[a b c], data: [[1,2,3]])
|
50
|
+
# debugging:
|
51
|
+
# data.to_prawn_pdf(:file => File.join(__dir__, 'expected_outputs/prawn_pdf_formatter/pdf_actual.pdf.test'))
|
52
|
+
actual_output = data.to_prawn_pdf.bytes
|
53
|
+
|
54
|
+
assert_equal expected_output, actual_output
|
55
|
+
end
|
56
|
+
|
57
|
+
# this is mostly to check that the transaction hack gets called
|
58
|
+
def test_relatively_large_pdf
|
59
|
+
table = Ruport.Table(File.join(File.expand_path(File.dirname(__FILE__)), "../test/",
|
60
|
+
%w[samples dates.csv]))
|
61
|
+
table.reduce(0..99)
|
62
|
+
table.to_prawn_pdf
|
63
|
+
end
|
64
|
+
|
65
|
+
#--------BUG TRAPS--------#
|
66
|
+
|
67
|
+
# PDF::SimpleTable does not handle symbols as column names
|
68
|
+
# Ruport should smartly fix this surprising behaviour (#283)
|
69
|
+
def test_tables_should_render_with_symbol_column_name
|
70
|
+
data = Ruport.Table([:a,:b,:c], data: [[1,2,3],[4,5,6]])
|
71
|
+
data.to_prawn_pdf
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
class TestRenderPDFGrouping < Minitest::Test
|
77
|
+
|
78
|
+
#--------BUG TRAPS----------#
|
79
|
+
|
80
|
+
def test_grouping_should_have_consistent_font_size
|
81
|
+
a = Ruport.Table(%w[a b c]) << %w[eye like chicken] << %w[eye like liver] <<
|
82
|
+
%w[meow mix meow ] << %w[mix please deliver ]
|
83
|
+
b = Grouping(a, by: "a")
|
84
|
+
splat = b.to_prawn_pdf.split("\n")
|
85
|
+
splat.grep(/meow/).each do |m|
|
86
|
+
assert_equal '10.0', m.split[5]
|
87
|
+
end
|
88
|
+
splat.grep(/mix/).each do |m|
|
89
|
+
assert_equal '10.0', m.split[5]
|
90
|
+
end
|
91
|
+
splat.grep(/eye/).each do |m|
|
92
|
+
assert_equal '10.0', m.split[5]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
class TestPDFFormatterHelpers < Minitest::Test
|
99
|
+
|
100
|
+
def test_move_up
|
101
|
+
a = Ruport::Formatter::PrawnPDF.new
|
102
|
+
a.move_cursor_to(500)
|
103
|
+
a.move_up(50)
|
104
|
+
assert_equal(550,a.cursor)
|
105
|
+
a.move_down(100)
|
106
|
+
assert_equal(450,a.cursor)
|
107
|
+
end
|
108
|
+
end
|
data/test/record_test.rb
CHANGED
@@ -1,75 +1,75 @@
|
|
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
|
class TestRecord < Minitest::Test
|
5
5
|
|
6
6
|
include Ruport::Data
|
7
|
-
|
7
|
+
|
8
8
|
def setup
|
9
9
|
@attributes = %w[a b c d]
|
10
|
-
@record = Ruport::Data::Record.new [1,2,3,4], :attributes => @attributes
|
11
|
-
end
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
@record = Ruport::Data::Record.new [1,2,3,4], :attributes => @attributes
|
11
|
+
end
|
12
|
+
|
13
|
+
context "when initializing with an array with attributes" do
|
14
|
+
should "test_specify_key_access_should_work" do
|
15
15
|
assert_equal 1, @record["a"]
|
16
16
|
assert_equal 4, @record["d"]
|
17
17
|
assert_equal 2, @record.b
|
18
18
|
assert_equal 3, @record.c
|
19
|
-
assert_raises(NoMethodError) { @record.f }
|
20
|
-
end
|
21
|
-
|
22
|
-
|
19
|
+
assert_raises(NoMethodError) { @record.f }
|
20
|
+
end
|
21
|
+
|
22
|
+
should "test_specify_ordinal_access_should_work" do
|
23
23
|
assert_equal 1, @record[0]
|
24
24
|
assert_equal 2, @record[1]
|
25
25
|
assert_equal 3, @record[2]
|
26
26
|
assert_equal 4, @record[3]
|
27
27
|
end
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when initializing with an array without attributes" do
|
31
|
+
should "test_specify_ordinal_access_should_work" do
|
32
32
|
record = Ruport::Data::Record.new [1,2,3,4]
|
33
33
|
assert_equal 1, record[0]
|
34
34
|
assert_equal 2, record[1]
|
35
35
|
assert_equal 3, record[2]
|
36
|
-
assert_equal 4, record[3]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
36
|
+
assert_equal 4, record[3]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
40
|
describe "when initializing with a hash without attributes" do
|
41
|
-
def setup
|
41
|
+
def setup
|
42
42
|
@record = Ruport::Data::Record.new({:a => 1, :b => 2, :c => 3},{})
|
43
|
-
end
|
44
|
-
|
45
|
-
def
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_specify_key_access_should_work
|
46
46
|
assert_equal 1, @record[:a]
|
47
47
|
assert_equal 2, @record[:b]
|
48
48
|
assert_equal 3, @record[:c]
|
49
|
-
assert_equal 3, @record.c
|
50
|
-
end
|
49
|
+
assert_equal 3, @record.c
|
50
|
+
end
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
describe "when initializing with a hash with attributes" do
|
54
54
|
def setup
|
55
|
-
@record = Record.new({:a => 1, :b => 2, :c => 3 },
|
55
|
+
@record = Record.new({:a => 1, :b => 2, :c => 3 },
|
56
56
|
:attributes => [:c,:b,:a])
|
57
|
-
end
|
58
|
-
|
59
|
-
def
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_specify_key_access_should_work
|
60
60
|
assert_equal 1, @record[:a]
|
61
61
|
assert_equal 2, @record[:b]
|
62
62
|
assert_equal 3, @record[:c]
|
63
|
-
assert_equal 3, @record.c
|
63
|
+
assert_equal 3, @record.c
|
64
64
|
end
|
65
|
-
|
66
|
-
def
|
65
|
+
|
66
|
+
def test_specify_ordinal_access_should_work
|
67
67
|
assert_equal 3, @record[0]
|
68
|
-
assert_equal 2, @record[1]
|
69
|
-
assert_equal 1, @record[2]
|
68
|
+
assert_equal 2, @record[1]
|
69
|
+
assert_equal 1, @record[2]
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
def test_bracket_equals
|
74
74
|
@record[1] = "godzilla"
|
75
75
|
@record["d"] = "mothra"
|
@@ -80,16 +80,16 @@ class TestRecord < Minitest::Test
|
|
80
80
|
assert_equal @record[3], "mothra"
|
81
81
|
assert_equal @record["d"], "mothra"
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
def test_accessors
|
85
85
|
assert_equal @record.a, @record["a"]
|
86
86
|
assert_equal @record.b, @record["b"]
|
87
87
|
assert_equal @record.c, @record["c"]
|
88
88
|
assert_equal @record.d, @record["d"]
|
89
|
-
end
|
90
|
-
|
89
|
+
end
|
90
|
+
|
91
91
|
def test_can_has_id
|
92
|
-
record = Ruport::Data::Record.new(:id => 12345)
|
92
|
+
record = Ruport::Data::Record.new(:id => 12345)
|
93
93
|
assert_equal 12345, record.id
|
94
94
|
end
|
95
95
|
|
@@ -98,7 +98,7 @@ class TestRecord < Minitest::Test
|
|
98
98
|
@record.e
|
99
99
|
end
|
100
100
|
end
|
101
|
-
|
101
|
+
|
102
102
|
def test_attribute_setting
|
103
103
|
@record.a = 10
|
104
104
|
@record.b = 20
|
@@ -114,22 +114,22 @@ class TestRecord < Minitest::Test
|
|
114
114
|
def test_to_hash
|
115
115
|
@record.to_hash
|
116
116
|
assert_equal({ "a" => 1, "b" => 2, "c" => 3, "d" => 4 }, @record.to_hash)
|
117
|
-
end
|
118
|
-
|
117
|
+
end
|
118
|
+
|
119
119
|
def test_rename_attribute
|
120
120
|
@record.rename_attribute("b","x")
|
121
121
|
assert_equal %w[a x c d], @record.attributes
|
122
122
|
assert_equal 2, @record["x"]
|
123
123
|
assert_equal 2, @record.x
|
124
124
|
assert_equal 2, @record[1]
|
125
|
-
end
|
125
|
+
end
|
126
126
|
|
127
127
|
def test_equality
|
128
128
|
|
129
129
|
dc = %w[a b c d]
|
130
130
|
dc2 = %w[a b c d]
|
131
131
|
dc3 = %w[a b c]
|
132
|
-
|
132
|
+
|
133
133
|
rec1 = Record.new [1,2,3,4]
|
134
134
|
rec2 = Record.new [1,2,3,4]
|
135
135
|
rec3 = Record.new [1,2]
|
@@ -137,7 +137,7 @@ class TestRecord < Minitest::Test
|
|
137
137
|
rec5 = Record.new [1,2,3,4], :attributes => dc2
|
138
138
|
rec6 = Record.new [1,2,3,4], :attributes => dc3
|
139
139
|
rec7 = Record.new [1,2], :attributes => dc
|
140
|
-
|
140
|
+
|
141
141
|
[:==, :eql?].each do |op|
|
142
142
|
assert rec1.send(op, rec2)
|
143
143
|
assert rec4.send(op, rec5)
|
@@ -162,7 +162,7 @@ class TestRecord < Minitest::Test
|
|
162
162
|
|
163
163
|
assert_equal [1,2,3,4], @record.to_a
|
164
164
|
assert_equal %w[a b c d], @record.attributes
|
165
|
-
|
165
|
+
|
166
166
|
@record.reorder "a","d","b","c"
|
167
167
|
assert_equal [1,4,2,3], @record.to_a
|
168
168
|
assert_equal %w[a d b c], @record.attributes
|
@@ -199,12 +199,12 @@ class TestRecord < Minitest::Test
|
|
199
199
|
s = Record.new :attributes => %w[a b], :data => [1,2]
|
200
200
|
assert_equal r.hash, s.hash
|
201
201
|
end
|
202
|
-
|
202
|
+
|
203
203
|
def test_records_with_differing_attrs_and_data_hash_differently
|
204
204
|
r = Record.new [1,2],:attributes => %w[a b]
|
205
205
|
s = Record.new [nil,nil],:attributes => %w[a b]
|
206
206
|
assert r.hash != s.hash
|
207
|
-
|
207
|
+
|
208
208
|
t = Record.new [1,3],:attributes => %w[a b]
|
209
209
|
assert r.hash != t.hash
|
210
210
|
end
|
@@ -225,7 +225,7 @@ class TestRecord < Minitest::Test
|
|
225
225
|
new_object_id = @record.instance_variable_get(:@attributes).object_id
|
226
226
|
assert_equal a.object_id, new_object_id
|
227
227
|
end
|
228
|
-
|
228
|
+
|
229
229
|
#----------------------------------------------------------------------
|
230
230
|
# BUG Traps
|
231
231
|
#----------------------------------------------------------------------
|
@@ -245,35 +245,35 @@ class TestRecord < Minitest::Test
|
|
245
245
|
end
|
246
246
|
|
247
247
|
# Ticket #172
|
248
|
-
def test_ensure_get_really_indifferent
|
248
|
+
def test_ensure_get_really_indifferent
|
249
249
|
a = Record.new({"a" => 1, "b" => 2})
|
250
250
|
assert_equal(2,a.get("b"))
|
251
251
|
assert_equal(2,a.get(:b))
|
252
|
-
a = Record.new({:a => 1, :b => 2})
|
252
|
+
a = Record.new({:a => 1, :b => 2})
|
253
253
|
assert_equal(2,a.get("b"))
|
254
254
|
assert_equal(2,a.get(:b))
|
255
255
|
end
|
256
|
-
|
256
|
+
|
257
257
|
def test_ensure_get_throws_argument_error
|
258
258
|
a = Record.new({"a" => 1, "b" => 2})
|
259
259
|
assert_raises(ArgumentError) { a.get([]) }
|
260
260
|
end
|
261
|
-
|
261
|
+
|
262
262
|
def test_ensure_delete_removes_attribute
|
263
263
|
a = Record.new({"a" => 1, "b" => 2})
|
264
264
|
assert_equal({"a" => 1, "b" => 2}, a.data)
|
265
265
|
assert_equal(["a","b"], a.attributes)
|
266
|
-
|
266
|
+
|
267
267
|
a.send(:delete, "a")
|
268
268
|
assert_equal({"b" => 2}, a.data)
|
269
269
|
assert_equal(["b"], a.attributes)
|
270
270
|
end
|
271
|
-
|
271
|
+
|
272
272
|
def test_ensure_bracket_equals_updates_attributes
|
273
273
|
a = Record.new({"a" => 1, "b" => 2})
|
274
274
|
assert_equal({"a" => 1, "b" => 2}, a.data)
|
275
275
|
assert_equal(["a","b"], a.attributes)
|
276
|
-
|
276
|
+
|
277
277
|
a["b"] = 3
|
278
278
|
assert_equal({"a" => 1, "b" => 3}, a.data)
|
279
279
|
assert_equal(["a","b"], a.attributes)
|
@@ -289,44 +289,44 @@ class TestRecord < Minitest::Test
|
|
289
289
|
a = MyRecordSub.new [1,2,3]
|
290
290
|
assert_equal "1,2,3\n", a.to_csv
|
291
291
|
end
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
292
|
+
|
293
|
+
context "when rendering records" do
|
294
|
+
|
295
|
+
should "test_specify_record_as_should_work" do
|
296
296
|
rendered_row = @record.as(:text)
|
297
297
|
assert_equal("| 1 | 2 | 3 | 4 |\n", rendered_row)
|
298
298
|
end
|
299
299
|
|
300
|
-
|
300
|
+
should "test_specify_record_to_format_should_work_without_options" do
|
301
301
|
rendered_row = @record.to_text
|
302
|
-
assert_equal("| 1 | 2 | 3 | 4 |\n", rendered_row)
|
303
|
-
end
|
304
|
-
|
305
|
-
|
302
|
+
assert_equal("| 1 | 2 | 3 | 4 |\n", rendered_row)
|
303
|
+
end
|
304
|
+
|
305
|
+
should "test_specify_record_to_format_should_work_with_options" do
|
306
306
|
rendered_row = @record.to_csv(:format_options => { :col_sep => "\t"})
|
307
|
-
assert_equal("1\t2\t3\t4\n",rendered_row)
|
308
|
-
end
|
309
|
-
|
307
|
+
assert_equal("1\t2\t3\t4\n",rendered_row)
|
308
|
+
end
|
309
|
+
|
310
310
|
describe "when given bad format names" do
|
311
|
-
def setup
|
312
|
-
@a = Record.new({ "a" => 1, "b" => 2 })
|
311
|
+
def setup
|
312
|
+
@a = Record.new({ "a" => 1, "b" => 2 })
|
313
313
|
end
|
314
314
|
|
315
|
-
def
|
316
|
-
assert_raises(Ruport::Controller::UnknownFormatError) { @a.as(:nothing) }
|
317
|
-
end
|
318
|
-
|
319
|
-
def
|
315
|
+
def test_specify_as_should_throw_proper_errors
|
316
|
+
assert_raises(Ruport::Controller::UnknownFormatError) { @a.as(:nothing) }
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_specify_to_format_should_throw_proper_errors
|
320
320
|
assert_raises(Ruport::Controller::UnknownFormatError) { @a.to_nothing }
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
324
|
## -- BUG TRAPS --------------------
|
325
|
-
|
326
|
-
|
325
|
+
|
326
|
+
should "test_specify_attributes_should_not_be_broken_by_to_hack" do
|
327
327
|
record = Ruport::Data::Record.new [1,2], :attributes => %w[a to_something]
|
328
328
|
assert_equal 2, record.to_something
|
329
|
-
end
|
329
|
+
end
|
330
330
|
end
|
331
331
|
|
332
332
|
end
|
data/test/table_pivot_test.rb
CHANGED
@@ -21,6 +21,13 @@ class TablePivotSimpleCaseTest < Minitest::Test
|
|
21
21
|
assert_equal(expected, @pivoted)
|
22
22
|
end
|
23
23
|
|
24
|
+
def test_pivot_empty_table
|
25
|
+
tab = Ruport.Table ["id", "num_sessions", "status", "diagnosis"]
|
26
|
+
tab << ["one", 10, :aborted, :good]
|
27
|
+
tab << ["two", 10, :success, :bad]
|
28
|
+
|
29
|
+
tab.pivot("status", :group_by=>"diagnosis", :values=>"num_sessions", :operation=>:mean)
|
30
|
+
end
|
24
31
|
end
|
25
32
|
|
26
33
|
class PivotConvertRowOrderToGroupOrderTest < Minitest::Test
|
@@ -55,7 +62,7 @@ class PivotConvertRowOrderToGroupOrderTest < Minitest::Test
|
|
55
62
|
end
|
56
63
|
|
57
64
|
def test_nil
|
58
|
-
|
65
|
+
assert_nil convert(nil)
|
59
66
|
end
|
60
67
|
|
61
68
|
end
|
@@ -125,7 +132,7 @@ class PivotPreservesOrdering < Minitest::Test
|
|
125
132
|
].each {|e| table << e}
|
126
133
|
table.add_column('pivotme') {|row| 10 - row.group.to_i}
|
127
134
|
pivoted = table.pivot('pivotme', :group_by => 'group', :values => 'a',
|
128
|
-
:pivot_order => proc {|
|
135
|
+
:pivot_order => proc {|_row, pivot| pivot })
|
129
136
|
assert_equal(['group', 7, 8, 9], pivoted.column_names)
|
130
137
|
end
|
131
138
|
|