ruport 0.8.14 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +42 -107
- data/Rakefile +29 -32
- data/examples/centered_pdf_text_box.rb +13 -19
- data/examples/example.csv +3 -0
- data/examples/line_plotter.rb +15 -15
- data/examples/pdf_complex_report.rb +10 -23
- data/examples/pdf_table_with_title.rb +12 -12
- data/examples/rope_examples/itunes/Rakefile +22 -1
- data/examples/rope_examples/itunes/config/environment.rb +4 -0
- data/examples/rope_examples/itunes/lib/init.rb +32 -2
- data/examples/rope_examples/itunes/util/build +50 -16
- data/examples/rope_examples/sales_report/README +1 -1
- data/examples/rope_examples/sales_report/Rakefile +22 -1
- data/examples/rope_examples/sales_report/config/environment.rb +4 -0
- data/examples/rope_examples/sales_report/lib/init.rb +32 -2
- data/examples/rope_examples/sales_report/lib/reports/sales.rb +10 -16
- data/examples/rope_examples/sales_report/util/build +50 -16
- data/examples/row_renderer.rb +39 -0
- data/examples/ruport_list/png_embed.rb +61 -0
- data/examples/ruport_list/roadmap.png +0 -0
- data/examples/sample.rb +16 -0
- data/examples/simple_pdf_lines.rb +24 -0
- data/lib/ruport.rb +143 -57
- data/lib/ruport/acts_as_reportable.rb +246 -0
- data/lib/ruport/data.rb +1 -2
- data/lib/ruport/data/grouping.rb +311 -0
- data/lib/ruport/data/record.rb +113 -84
- data/lib/ruport/data/table.rb +275 -174
- data/lib/ruport/formatter.rb +149 -0
- data/lib/ruport/formatter/csv.rb +87 -0
- data/lib/ruport/formatter/html.rb +89 -0
- data/lib/ruport/formatter/pdf.rb +357 -0
- data/lib/ruport/formatter/text.rb +151 -0
- data/lib/ruport/generator.rb +127 -30
- data/lib/ruport/query.rb +46 -99
- data/lib/ruport/renderer.rb +238 -194
- data/lib/ruport/renderer/grouping.rb +67 -0
- data/lib/ruport/renderer/table.rb +25 -98
- data/lib/ruport/report.rb +45 -96
- data/test/acts_as_reportable_test.rb +229 -0
- data/test/csv_formatter_test.rb +97 -0
- data/test/{_test_database.rb → database_test_.rb} +0 -0
- data/test/grouping_test.rb +305 -0
- data/test/html_formatter_test.rb +104 -0
- data/test/pdf_formatter_test.rb +25 -0
- data/test/{test_query.rb → query_test.rb} +32 -121
- data/test/{test_record.rb → record_test.rb} +40 -23
- data/test/renderer_test.rb +344 -0
- data/test/{test_report.rb → report_test.rb} +74 -44
- data/test/samples/ticket_count.csv +124 -0
- data/test/{test_sql_split.rb → sql_split_test.rb} +0 -0
- data/test/{test_table.rb → table_test.rb} +255 -44
- data/test/text_formatter_test.rb +144 -0
- data/util/bench/data/record/bench_as_vs_to.rb +17 -0
- data/util/bench/data/record/bench_constructor.rb +46 -0
- data/util/bench/data/record/bench_indexing.rb +65 -0
- data/util/bench/data/record/bench_reorder.rb +35 -0
- data/util/bench/data/record/bench_to_a.rb +19 -0
- data/util/bench/data/table/bench_column_manip.rb +103 -0
- data/util/bench/data/table/bench_dup.rb +24 -0
- data/util/bench/data/table/bench_init.rb +67 -0
- data/util/bench/data/table/bench_manip.rb +125 -0
- data/util/bench/formatter/bench_csv.rb +14 -0
- data/util/bench/formatter/bench_html.rb +14 -0
- data/util/bench/formatter/bench_pdf.rb +14 -0
- data/util/bench/formatter/bench_text.rb +14 -0
- data/util/bench/samples/tattle.csv +1237 -0
- metadata +121 -143
- data/TODO +0 -21
- data/examples/invoice.rb +0 -142
- data/examples/invoice_report.rb +0 -29
- data/examples/line_graph.rb +0 -38
- data/examples/rope_examples/itunes/config/ruport_config.rb +0 -8
- data/examples/rope_examples/sales_report/config/ruport_config.rb +0 -8
- data/lib/ruport/attempt.rb +0 -63
- data/lib/ruport/config.rb +0 -204
- data/lib/ruport/data/groupable.rb +0 -93
- data/lib/ruport/data/taggable.rb +0 -80
- data/lib/ruport/format.rb +0 -1
- data/lib/ruport/format/csv.rb +0 -29
- data/lib/ruport/format/html.rb +0 -42
- data/lib/ruport/format/latex.rb +0 -47
- data/lib/ruport/format/pdf.rb +0 -233
- data/lib/ruport/format/plugin.rb +0 -31
- data/lib/ruport/format/svg.rb +0 -60
- data/lib/ruport/format/text.rb +0 -103
- data/lib/ruport/format/xml.rb +0 -32
- data/lib/ruport/layout.rb +0 -1
- data/lib/ruport/layout/component.rb +0 -7
- data/lib/ruport/mailer.rb +0 -99
- data/lib/ruport/renderer/graph.rb +0 -46
- data/lib/ruport/report/graph.rb +0 -14
- data/lib/ruport/system_extensions.rb +0 -71
- data/test/test_config.rb +0 -88
- data/test/test_format_text.rb +0 -63
- data/test/test_graph_renderer.rb +0 -97
- data/test/test_groupable.rb +0 -56
- data/test/test_mailer.rb +0 -170
- data/test/test_renderer.rb +0 -151
- data/test/test_ruport.rb +0 -58
- data/test/test_table_renderer.rb +0 -141
- data/test/test_taggable.rb +0 -52
data/test/test_renderer.rb
DELETED
@@ -1,151 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'ruport'
|
3
|
-
|
4
|
-
class DummyText < Ruport::Format::Plugin
|
5
|
-
def prepare_document
|
6
|
-
output << "p"
|
7
|
-
end
|
8
|
-
|
9
|
-
def build_header
|
10
|
-
output << "header\n"
|
11
|
-
end
|
12
|
-
|
13
|
-
def build_body
|
14
|
-
output << "body\n"
|
15
|
-
end
|
16
|
-
|
17
|
-
def build_footer
|
18
|
-
output << "footer\n"
|
19
|
-
end
|
20
|
-
|
21
|
-
def finalize_document
|
22
|
-
output << "f"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
class TrivialRenderer < Ruport::Renderer
|
28
|
-
add_format DummyText, :text
|
29
|
-
|
30
|
-
def run
|
31
|
-
plugin do
|
32
|
-
build_header
|
33
|
-
build_body
|
34
|
-
build_footer
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
class RendererWithHelpers < Ruport::Renderer
|
41
|
-
include Ruport::Renderer::Helpers
|
42
|
-
|
43
|
-
add_format DummyText, :text
|
44
|
-
|
45
|
-
prepare :document
|
46
|
-
|
47
|
-
option :subtitle
|
48
|
-
|
49
|
-
stage :header
|
50
|
-
stage :body
|
51
|
-
stage :footer
|
52
|
-
|
53
|
-
finalize :document
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
class TestRenderer < Test::Unit::TestCase
|
58
|
-
|
59
|
-
def test_trivial
|
60
|
-
actual = TrivialRenderer.render(:text)
|
61
|
-
assert_equal "header\nbody\nfooter\n", actual
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_formats
|
65
|
-
assert_equal( {}, Ruport::Renderer.formats )
|
66
|
-
assert_equal( { :text => DummyText } , TrivialRenderer.formats )
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_try_require
|
70
|
-
assert_not_nil Ruport::Renderer.try_require(:csv)
|
71
|
-
assert_nil Ruport::Renderer.try_require(:not_a_plugin)
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_stage_helper
|
75
|
-
assert RendererWithHelpers.stages.include?('body')
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_finalize_helper
|
79
|
-
assert_equal :document, RendererWithHelpers.final_stage
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_prepare_helper
|
83
|
-
assert_equal :document, RendererWithHelpers.first_stage
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_finalize_again
|
87
|
-
assert_raise(RuntimeError) { RendererWithHelpers.finalize :report }
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_prepare_again
|
91
|
-
assert_raise(RuntimeError) { RendererWithHelpers.prepare :foo }
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_renderer_using_helpers
|
95
|
-
actual = RendererWithHelpers.render(:text)
|
96
|
-
assert_equal "pheader\nbody\nfooter\nf", actual
|
97
|
-
|
98
|
-
actual = RendererWithHelpers.render_text
|
99
|
-
assert_equal "pheader\nbody\nfooter\nf", actual
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_option_helper
|
103
|
-
RendererWithHelpers.render_text do |r|
|
104
|
-
r.subtitle = "Test Report"
|
105
|
-
assert_equal "Test Report", r.options.subtitle
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_required_option_helper
|
110
|
-
RendererWithHelpers.required_option :title
|
111
|
-
|
112
|
-
RendererWithHelpers.render_text do |r|
|
113
|
-
r.title = "Test Report"
|
114
|
-
assert_equal "Test Report", r.options.title
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_without_required_option
|
119
|
-
RendererWithHelpers.required_option :title
|
120
|
-
|
121
|
-
assert_raise(RuntimeError) { RendererWithHelpers.render(:text) }
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
def test_method_missing
|
126
|
-
actual = TrivialRenderer.render_text
|
127
|
-
assert_equal "header\nbody\nfooter\n", actual
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_plugin
|
131
|
-
# normal instance mode
|
132
|
-
|
133
|
-
rend = TrivialRenderer.new
|
134
|
-
rend.send(:use_plugin,:text)
|
135
|
-
|
136
|
-
assert_kind_of Ruport::Format::Plugin, rend.plugin
|
137
|
-
assert_kind_of DummyText, rend.plugin
|
138
|
-
|
139
|
-
# render mode
|
140
|
-
TrivialRenderer.render_text do |r|
|
141
|
-
assert_kind_of Ruport::Format::Plugin, r.plugin
|
142
|
-
assert_kind_of DummyText, r.plugin
|
143
|
-
end
|
144
|
-
|
145
|
-
assert_equal "body\n", rend.plugin { build_body }.output
|
146
|
-
|
147
|
-
rend.plugin.clear_output
|
148
|
-
assert_equal "", rend.plugin.output
|
149
|
-
end
|
150
|
-
|
151
|
-
end
|
data/test/test_ruport.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
require "test/unit"
|
2
|
-
require "fileutils"
|
3
|
-
require "stringio"
|
4
|
-
require "ruport"
|
5
|
-
|
6
|
-
class TestRuport < Test::Unit::TestCase
|
7
|
-
|
8
|
-
def setup
|
9
|
-
Ruport::Config.log_file = "test/complain.log"
|
10
|
-
@output = StringIO.new
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_file_created
|
14
|
-
assert(File.exist?("test/complain.log"))
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_fatal
|
18
|
-
assert_raise(RuntimeError) {
|
19
|
-
Ruport.log "Default problem", :status => :fatal,
|
20
|
-
:output => @output
|
21
|
-
}
|
22
|
-
@output.rewind
|
23
|
-
assert_equal("[!!] Default problem\n", @output.read)
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_fatal_log_only
|
27
|
-
assert_raise(RuntimeError) {
|
28
|
-
Ruport.log "Default problem",
|
29
|
-
:status => :fatal, :output => @output, :level => :log_only
|
30
|
-
}
|
31
|
-
@output.rewind
|
32
|
-
assert_equal("",@output.read)
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_warn
|
37
|
-
assert_nothing_raised {
|
38
|
-
Ruport.log "Default problem", :output => @output
|
39
|
-
}
|
40
|
-
@output.rewind
|
41
|
-
assert_equal("[!!] Default problem\n",@output.read)
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_warn_log_only
|
45
|
-
assert_nothing_raised {
|
46
|
-
Ruport.log "Default problem", :output => @output,
|
47
|
-
:level => :log_only
|
48
|
-
}
|
49
|
-
@output.rewind
|
50
|
-
assert_equal("",@output.read)
|
51
|
-
end
|
52
|
-
|
53
|
-
def teardown
|
54
|
-
Ruport::Config.class_eval("@logger").close
|
55
|
-
FileUtils.rm("test/complain.log")
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
data/test/test_table_renderer.rb
DELETED
@@ -1,141 +0,0 @@
|
|
1
|
-
require "test/unit"
|
2
|
-
require "ruport"
|
3
|
-
|
4
|
-
begin
|
5
|
-
require "rubygems"
|
6
|
-
rescue LoadError
|
7
|
-
nil
|
8
|
-
end
|
9
|
-
|
10
|
-
class TestTableRenderer < Test::Unit::TestCase
|
11
|
-
def test_render_csv_basic
|
12
|
-
actual = Ruport::Renderer::Table.render_csv { |r|
|
13
|
-
r.data = [[1,2,3],[4,5,6]].to_table
|
14
|
-
}
|
15
|
-
assert_equal("1,2,3\n4,5,6\n",actual)
|
16
|
-
|
17
|
-
actual = Ruport::Renderer::Table.render_csv { |r|
|
18
|
-
r.data = [[1,2,3],[4,5,6]].to_table(%w[a b c])
|
19
|
-
}
|
20
|
-
assert_equal("a,b,c\n1,2,3\n4,5,6\n",actual)
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_render_html_basic
|
24
|
-
|
25
|
-
actual = Ruport::Renderer::Table.render_html { |r|
|
26
|
-
r.data = [[1,2,3],[4,5,6]].to_table
|
27
|
-
}
|
28
|
-
|
29
|
-
assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2"+
|
30
|
-
"</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>\n\t\t"+
|
31
|
-
"\t<td>4</td>\n\t\t\t<td>5</td>\n\t\t\t<td>6</td>\n\t"+
|
32
|
-
"\t</tr>\n\t</table>",actual)
|
33
|
-
|
34
|
-
actual = Ruport::Renderer::Table.render_html { |r|
|
35
|
-
r.data = [ [1,2,3],[4,5,6]].to_table(%w[a b c])
|
36
|
-
}
|
37
|
-
|
38
|
-
assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>"+
|
39
|
-
"\n\t\t\t<th>c</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>1</td>"+
|
40
|
-
"\n\t\t\t<td>2</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>"+
|
41
|
-
"\n\t\t\t<td>4</td>\n\t\t\t<td>5</td>\n\t\t\t<td>6</td>\n\t"+
|
42
|
-
"\t</tr>\n\t</table>",actual)
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_render_html_with_tags
|
47
|
-
actual = Ruport::Renderer::Table.render_html { |r|
|
48
|
-
r.data = [[1,2,3],[4,5,6]].to_table(%w[a b c])
|
49
|
-
r.data.create_group("foo") { |r| r.a < 3 }
|
50
|
-
}
|
51
|
-
|
52
|
-
expected =
|
53
|
-
"\t<table>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>\n\t\t\t<th>"+
|
54
|
-
"c</th>\n\t\t</tr>\n\t\t<tr class='grp_foo'>\n\t\t\t"+
|
55
|
-
"<td class='grp_foo'>1</td>\n\t\t\t<td class='grp_foo'>2</td>"+
|
56
|
-
"\n\t\t\t<td class='grp_foo'>3</td>\n\t\t</tr>"+
|
57
|
-
"\n\t\t<tr>\n\t\t\t<td>4</td>\n\t\t\t<td>5</td>\n\t\t\t"+
|
58
|
-
"<td>6</td>\n\t\t</tr>\n\t</table>"
|
59
|
-
|
60
|
-
assert_equal(expected,actual)
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_ensure_html_tags_joined
|
64
|
-
actual = Ruport::Renderer::Table.render_html { |r|
|
65
|
-
r.data =[[1,2],[3,4]].to_table(%w[a b])
|
66
|
-
r.data.create_group("foo") { true }
|
67
|
-
r.data.create_group("bar") { true }
|
68
|
-
}
|
69
|
-
|
70
|
-
expected =
|
71
|
-
"\t<table>\n"+
|
72
|
-
"\t\t<tr>\n" +
|
73
|
-
"\t\t\t<th>a</th>\n" +
|
74
|
-
"\t\t\t<th>b</th>\n" +
|
75
|
-
"\t\t</tr>\n" +
|
76
|
-
"\t\t<tr class='grp_foo grp_bar'>\n" +
|
77
|
-
"\t\t\t<td class='grp_foo grp_bar'>1</td>\n" +
|
78
|
-
"\t\t\t<td class='grp_foo grp_bar'>2</td>\n" +
|
79
|
-
"\t\t</tr>\n" +
|
80
|
-
"\t\t<tr class='grp_foo grp_bar'>\n"+
|
81
|
-
"\t\t\t<td class='grp_foo grp_bar'>3</td>\n"+
|
82
|
-
"\t\t\t<td class='grp_foo grp_bar'>4</td>\n"+
|
83
|
-
"\t\t</tr>\n"+
|
84
|
-
"\t</table>"
|
85
|
-
|
86
|
-
assert_equal(expected,actual)
|
87
|
-
end
|
88
|
-
|
89
|
-
def test_render_latex_basic
|
90
|
-
data = [[1,2,3,2],[3,4,5,6]].to_table(%w[a b c d])
|
91
|
-
output = data.to_latex
|
92
|
-
assert_equal "\\documentclass", output[/\\documentclass/]
|
93
|
-
assert_equal "\\begin{document}", output[/\\begin\{document\}/]
|
94
|
-
assert_equal "\\end{document}", output[/\\end\{document\}/]
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_render_pdf_basic
|
98
|
-
begin
|
99
|
-
require "pdf/writer"
|
100
|
-
rescue LoadError
|
101
|
-
warn "skipping pdf test"; return
|
102
|
-
end
|
103
|
-
data = [[1,2],[3,4]].to_table
|
104
|
-
assert_raise(RuntimeError) { data.to_pdf }
|
105
|
-
|
106
|
-
data.column_names = %w[a b]
|
107
|
-
assert_nothing_raised { data.to_pdf }
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_prune
|
111
|
-
actual = Ruport::Renderer::Table.render_csv { |r|
|
112
|
-
r.data = [[1,2,3],[1,5,6]].to_table(%w[a b c])
|
113
|
-
r.prune(1)
|
114
|
-
}
|
115
|
-
assert_equal("a,b,c\n1,2,3\n,5,6\n",actual)
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_num_cols
|
119
|
-
Ruport::Renderer::Table.render_csv { |r|
|
120
|
-
r.data = [[1,2,3],[4,5,6]].to_table
|
121
|
-
assert_equal 3, r.num_cols
|
122
|
-
}
|
123
|
-
end
|
124
|
-
|
125
|
-
def test_rewrite_column
|
126
|
-
actual = Ruport::Renderer::Table.render_csv { |r|
|
127
|
-
r.data = [[1,2,3],[4,5,6]].to_table
|
128
|
-
r.rewrite_column(0) { |r| r[0]+r[1] }
|
129
|
-
}
|
130
|
-
assert_equal("3,2,3\n9,5,6\n",actual)
|
131
|
-
end
|
132
|
-
|
133
|
-
def test_layout_header
|
134
|
-
actual = Ruport::Renderer::Table.render_csv { |r|
|
135
|
-
r.data = [[1,2,3],[4,5,6]].to_table(%w[a b c])
|
136
|
-
r.layout { |l| l.show_table_headers = false }
|
137
|
-
}
|
138
|
-
assert_equal("1,2,3\n4,5,6\n",actual)
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
data/test/test_taggable.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
|
3
|
-
require "test/unit"
|
4
|
-
require "ruport"
|
5
|
-
|
6
|
-
class TestTaggable < Test::Unit::TestCase
|
7
|
-
|
8
|
-
include Ruport::Data
|
9
|
-
|
10
|
-
def setup
|
11
|
-
@obj = Object.new.extend(Taggable)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_tags_are_nil_initially
|
15
|
-
assert_equal nil, @obj.instance_variable_get(:@ruport_tags)
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_get_and_set_tags
|
19
|
-
@obj.tags = [:orange, :yellow]
|
20
|
-
assert_equal Set.new([:orange, :yellow]),
|
21
|
-
@obj.instance_variable_get(:@ruport_tags)
|
22
|
-
assert_equal Set.new([:orange, :yellow]), @obj.tags
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_tag
|
26
|
-
@obj.tag(:purple)
|
27
|
-
assert_equal Set.new([:purple]),
|
28
|
-
@obj.instance_variable_get(:@ruport_tags)
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_has_tag
|
33
|
-
@obj.tag(:maroon)
|
34
|
-
assert @obj.has_tag?(:maroon)
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_delete_tag
|
38
|
-
@obj.tag(:scarlet)
|
39
|
-
assert @obj.has_tag?(:scarlet)
|
40
|
-
@obj.delete_tag(:scarlet)
|
41
|
-
assert !@obj.has_tag?(:scarlet)
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_avoid_duplication
|
45
|
-
@obj.tag(:smelly)
|
46
|
-
assert_equal 1, @obj.tags.select { |t| t.eql? :smelly }.length
|
47
|
-
@obj.tag(:smelly)
|
48
|
-
assert_equal 1, @obj.tags.select { |t| t.eql? :smelly }.length
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|