ruport-util 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/INSTALL +8 -7
- data/Rakefile +66 -11
- data/bin/csv2ods +53 -0
- data/example/data/blank.ods +0 -0
- data/example/graph_report.rb +6 -2
- data/example/invoice_report.rb +2 -1
- data/example/mailer.rb +7 -7
- data/example/managed_report.rb +5 -5
- data/example/ods.rb +12 -0
- data/lib/ruport/util/generator.rb +2 -11
- data/lib/ruport/util/graph.rb +8 -0
- data/lib/ruport/util/ods.rb +80 -0
- data/lib/ruport/util/report.rb +33 -299
- data/lib/ruport/util/report_manager.rb +2 -3
- data/lib/ruport/util.rb +9 -1
- data/test/helper/layout.rb +55 -0
- data/test/helper/wrap.rb +190 -0
- data/test/helper.rb +27 -0
- data/test/test_format_ods.rb +46 -0
- data/test/test_graph_renderer.rb +21 -31
- data/test/test_invoice.rb +30 -28
- data/test/test_mailer.rb +116 -159
- data/test/test_report.rb +80 -183
- data/test/test_report_manager.rb +32 -29
- metadata +30 -22
- data/example/foo.svg +0 -83
- data/example/form.pdf +0 -160
- data/example/out.pdf +0 -229
- data/test/init.rb +0 -7
data/INSTALL
CHANGED
@@ -3,14 +3,18 @@
|
|
3
3
|
ruport-util provides a home for marooned former parts of Ruby Reports,
|
4
4
|
and newer fringe ideas.
|
5
5
|
|
6
|
-
Support as of 2007.
|
6
|
+
Support as of 2007.06.07:
|
7
7
|
|
8
8
|
* Basic Graphing (util/graph)
|
9
9
|
* Report runner (util/report)
|
10
10
|
* Report Mailing (util/mailer)
|
11
11
|
* Report Manager (util/report_manager)
|
12
12
|
* Invoices (util/invoice)
|
13
|
+
* PDF form helpers (util/pdf/form)
|
14
|
+
* ODS formatter for tables (util/ods)
|
15
|
+
* Benchmarking Tool (util/bench)
|
13
16
|
* Ruport centric code generation via the rope command.
|
17
|
+
* csv to OpenDocument conversion via csv2ods
|
14
18
|
|
15
19
|
See example/ for more information
|
16
20
|
|
@@ -27,14 +31,11 @@ It's on RubyForge:
|
|
27
31
|
gem install ruport-util -y
|
28
32
|
|
29
33
|
== Using
|
30
|
-
|
31
|
-
|
32
|
-
|
34
|
+
|
35
|
+
require "ruport"
|
33
36
|
require "ruport/util"
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
require "ruport/util/graph"
|
38
|
+
# then just use whatever tools you want.
|
38
39
|
|
39
40
|
== Help?
|
40
41
|
|
data/Rakefile
CHANGED
@@ -1,24 +1,39 @@
|
|
1
|
-
require "rake/rdoctask"
|
2
|
-
require "rake/testtask"
|
3
|
-
require "rake/gempackagetask"
|
4
|
-
|
5
1
|
begin
|
6
2
|
require "rubygems"
|
7
3
|
rescue LoadError
|
8
4
|
nil
|
9
5
|
end
|
10
6
|
|
11
|
-
|
7
|
+
require 'rake'
|
8
|
+
require "rake/rdoctask"
|
9
|
+
require "rake/gempackagetask"
|
10
|
+
|
11
|
+
require 'spec/rake/spectask'
|
12
|
+
|
13
|
+
task :default => [:wraptest]
|
14
|
+
|
15
|
+
desc "Run all tests"
|
16
|
+
Spec::Rake::SpecTask.new('test') do |t|
|
17
|
+
t.spec_files = FileList['test/test_*.rb']
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Generate specdocs for examples for inclusion in RDoc"
|
21
|
+
Spec::Rake::SpecTask.new('specdoc') do |t|
|
22
|
+
t.spec_files = FileList['test/test_*.rb']
|
23
|
+
t.spec_opts = ["--format", "rdoc"]
|
24
|
+
t.out = 'EXAMPLES.rd'
|
25
|
+
end
|
12
26
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
27
|
+
desc "Generate HTML report for failing examples"
|
28
|
+
Spec::Rake::SpecTask.new('failing_examples_with_html') do |t|
|
29
|
+
t.spec_files = FileList['test/test_*.rb']
|
30
|
+
t.spec_opts = ["--format", "html:failing_examples.html", "--diff"]
|
31
|
+
t.fail_on_error = false
|
17
32
|
end
|
18
33
|
|
19
34
|
spec = Gem::Specification.new do |spec|
|
20
35
|
spec.name = "ruport-util"
|
21
|
-
spec.version = "0.
|
36
|
+
spec.version = "0.7.0"
|
22
37
|
spec.platform = Gem::Platform::RUBY
|
23
38
|
spec.summary = "A set of tools and helper libs for Ruby Reports"
|
24
39
|
spec.files = Dir.glob("{example,lib,test,bin}/**/**/*") +
|
@@ -28,7 +43,7 @@ spec = Gem::Specification.new do |spec|
|
|
28
43
|
|
29
44
|
spec.test_files = Dir[ "test/test_*.rb" ]
|
30
45
|
spec.bindir = "bin"
|
31
|
-
spec.executables = FileList["rope"]
|
46
|
+
spec.executables = FileList["rope", "csv2ods"]
|
32
47
|
spec.has_rdoc = true
|
33
48
|
spec.extra_rdoc_files = %w{INSTALL}
|
34
49
|
spec.rdoc_options << '--title' << 'ruport-util Documentation' <<
|
@@ -67,3 +82,43 @@ begin
|
|
67
82
|
rescue LoadError
|
68
83
|
nil
|
69
84
|
end
|
85
|
+
|
86
|
+
## RSpec Wrapper
|
87
|
+
|
88
|
+
require 'test/helper/layout'
|
89
|
+
|
90
|
+
class String
|
91
|
+
def /(obj)
|
92
|
+
File.join(self, obj.to_s)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
SPEC_BASE = File.expand_path('test')
|
97
|
+
|
98
|
+
# ignore files with these paths
|
99
|
+
ignores = [ './helper/*', './helper.rb' ]
|
100
|
+
|
101
|
+
files = Dir[SPEC_BASE/'**'/'*.rb']
|
102
|
+
ignores.each do |ignore|
|
103
|
+
ignore_files = Dir[SPEC_BASE/ignore]
|
104
|
+
ignore_files.each do |ignore_file|
|
105
|
+
files.delete File.expand_path(ignore_file)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
files.sort!
|
110
|
+
|
111
|
+
spec_layout = Hash.new{|h,k| h[k] = []}
|
112
|
+
|
113
|
+
files.each do |file|
|
114
|
+
name = file.gsub(/^#{SPEC_BASE}/, '.')
|
115
|
+
dir_name = File.dirname(name)[2..-1] || './'
|
116
|
+
task_name = 'wrap' + ([:test] + dir_name.split('/')).join(':')
|
117
|
+
spec_layout[task_name] << file
|
118
|
+
end
|
119
|
+
|
120
|
+
desc "Test all"
|
121
|
+
task "wraptest" => [] do
|
122
|
+
wrap = SpecWrap.new(*spec_layout.values.flatten)
|
123
|
+
wrap.run
|
124
|
+
end
|
data/bin/csv2ods
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'rubygems'
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'ruport'
|
13
|
+
require 'ruport/util'
|
14
|
+
|
15
|
+
options = OpenStruct.new(:output => 'output.ods')
|
16
|
+
|
17
|
+
opts = OptionParser.new do |opt|
|
18
|
+
ruby_version = "ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
19
|
+
ruport_util_version = "Ruport Util Version #{Ruport::Util::VERSION}"
|
20
|
+
ruport_version = "Ruport Version #{Ruport::VERSION}, on #{ruby_version}"
|
21
|
+
version = "#{ruport_util_version} - #{ruport_version}"
|
22
|
+
|
23
|
+
opt.banner = "Usage: csv2ods [ OPTIONS ] input.csv [ output.ods ]"
|
24
|
+
opt.define_head(version)
|
25
|
+
|
26
|
+
opt.separator ''
|
27
|
+
opt.separator 'Common options:'
|
28
|
+
|
29
|
+
opt.on_tail('-h', '--help', 'Show this message') do
|
30
|
+
puts opts
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
opt.on_tail('-v', '--version', 'Show version') do
|
35
|
+
puts version
|
36
|
+
exit
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.parse!(ARGV)
|
41
|
+
|
42
|
+
input = ARGV.shift
|
43
|
+
options.input = input if input
|
44
|
+
output = ARGV.shift
|
45
|
+
options.output = output if output
|
46
|
+
|
47
|
+
unless options.input and options.output
|
48
|
+
puts opts
|
49
|
+
exit
|
50
|
+
end
|
51
|
+
|
52
|
+
ods = Table(options.input).to_ods(:tempfile => true)
|
53
|
+
FileUtils.cp(ods.path, options.output)
|
Binary file
|
data/example/graph_report.rb
CHANGED
@@ -4,13 +4,17 @@ require "ruport/util"
|
|
4
4
|
|
5
5
|
class GraphReport < Ruport::Report
|
6
6
|
|
7
|
+
renders_as_graph
|
8
|
+
|
7
9
|
def generate
|
8
10
|
graph = Ruport::Graph(:column_names => %w[a b c d e])
|
9
11
|
graph.add_line [1,2,3,4,5], :name => "foo"
|
10
12
|
graph.add_line [11,22,70,2,19], :name => "bar"
|
11
|
-
graph
|
13
|
+
return graph
|
12
14
|
end
|
13
15
|
|
14
16
|
end
|
15
17
|
|
16
|
-
GraphReport.
|
18
|
+
GraphReport.generate do |r|
|
19
|
+
r.save_as("foo.svg")
|
20
|
+
end
|
data/example/invoice_report.rb
CHANGED
data/example/mailer.rb
CHANGED
@@ -2,6 +2,9 @@ require "ruport"
|
|
2
2
|
require "ruport/util"
|
3
3
|
require "fileutils"
|
4
4
|
class MyReport < Ruport::Report
|
5
|
+
|
6
|
+
renders_as_table
|
7
|
+
|
5
8
|
def prepare
|
6
9
|
add_mailer :default,
|
7
10
|
:host => "mail.adelphia.net",
|
@@ -9,17 +12,14 @@ class MyReport < Ruport::Report
|
|
9
12
|
end
|
10
13
|
|
11
14
|
def generate
|
12
|
-
Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
|
15
|
+
Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
|
13
16
|
end
|
14
17
|
|
15
|
-
def cleanup
|
16
|
-
FileUtils.rm("foo.pdf")
|
17
|
-
end
|
18
18
|
end
|
19
19
|
|
20
|
-
MyReport.
|
21
|
-
|
22
|
-
|
20
|
+
MyReport.generate do |report|
|
21
|
+
report.save_as "foo.pdf"
|
22
|
+
report.send_to("gregory.t.brown@gmail.com") do |mail|
|
23
23
|
mail.subject = "Sample report"
|
24
24
|
mail.attach "foo.pdf"
|
25
25
|
mail.text = <<-EOS
|
data/example/managed_report.rb
CHANGED
@@ -5,7 +5,7 @@ class MyReport < Ruport::Report
|
|
5
5
|
|
6
6
|
acts_as_managed_report
|
7
7
|
|
8
|
-
def
|
8
|
+
def content
|
9
9
|
"Hello Mike"
|
10
10
|
end
|
11
11
|
|
@@ -15,7 +15,7 @@ class YourReport < Ruport::Report
|
|
15
15
|
|
16
16
|
acts_as_managed_report
|
17
17
|
|
18
|
-
def
|
18
|
+
def content
|
19
19
|
"Hello Joe"
|
20
20
|
end
|
21
21
|
|
@@ -25,12 +25,12 @@ class HisReport < Ruport::Report
|
|
25
25
|
|
26
26
|
acts_as_managed_report
|
27
27
|
|
28
|
-
def
|
28
|
+
def content
|
29
29
|
"Hello Robert"
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
34
|
%w[MyReport YourReport HisReport].each do |report|
|
35
|
-
puts Ruport::ReportManager[report].
|
36
|
-
end
|
35
|
+
puts Ruport::ReportManager[report].generate { |r| r.content }
|
36
|
+
end
|
data/example/ods.rb
ADDED
@@ -175,15 +175,12 @@ REP = <<EOR
|
|
175
175
|
require "lib/init"
|
176
176
|
class #{class_name} < Ruport::Report
|
177
177
|
|
178
|
-
def
|
178
|
+
def renderable_data
|
179
179
|
|
180
180
|
end
|
181
181
|
|
182
182
|
end
|
183
183
|
|
184
|
-
if __FILE__ == $0
|
185
|
-
puts #{class_name}.run
|
186
|
-
end
|
187
184
|
EOR
|
188
185
|
|
189
186
|
TEST = <<EOR
|
@@ -296,13 +293,7 @@ README = <<END_README
|
|
296
293
|
|
297
294
|
Rope provides you with a number of simple utilities that script away
|
298
295
|
much of your boilerplate code, and also provide useful tools for
|
299
|
-
development
|
300
|
-
SQL queries for validity. Additionally, you'll get logging for free
|
301
|
-
and you can share a common configuration file between applications
|
302
|
-
in the same project.
|
303
|
-
|
304
|
-
Though each tool on it's own isn't complicated, having them all
|
305
|
-
working together can be a major win.
|
296
|
+
development
|
306
297
|
|
307
298
|
# The Basics
|
308
299
|
|
data/lib/ruport/util/graph.rb
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
require 'zip/zip'
|
5
|
+
|
6
|
+
module Ruport
|
7
|
+
|
8
|
+
class Formatter::ODS < Formatter
|
9
|
+
BLANK_ODS = File.join(Ruport::Util::BASEDIR, 'example', 'data', 'blank.ods')
|
10
|
+
|
11
|
+
renders :ods, :for => [ Renderer::Row, Renderer::Table]
|
12
|
+
|
13
|
+
def prepare_table
|
14
|
+
output << %{<?xml version="1.0" encoding="UTF-8"?>
|
15
|
+
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.0">
|
16
|
+
<office:scripts/>
|
17
|
+
<office:font-face-decls/>
|
18
|
+
<office:automatic-styles/>
|
19
|
+
<office:body>
|
20
|
+
<office:spreadsheet>
|
21
|
+
<table:table table:name="Ruport" table:print="false">
|
22
|
+
<office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_table_header
|
27
|
+
if @options.show_table_headers
|
28
|
+
table_row{ build_cells(data.column_names) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def build_table_body
|
33
|
+
render_data_by_row
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_row
|
37
|
+
table_row{ build_cells(data.to_a) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def table_row
|
41
|
+
output << %{ <table:table-row>\n}
|
42
|
+
yield
|
43
|
+
output << %{ </table:table-row>\n}
|
44
|
+
end
|
45
|
+
|
46
|
+
def build_cells(values)
|
47
|
+
values.each do |value|
|
48
|
+
value = CGI.escapeHTML(value.to_s)
|
49
|
+
output << %{ <table:table-cell>\n}
|
50
|
+
output << %{ <text:p>#{value}</text:p>\n}
|
51
|
+
output << %{ </table:table-cell>\n}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def finalize_table
|
56
|
+
output << %{ </table:table>
|
57
|
+
</office:spreadsheet>
|
58
|
+
</office:body>
|
59
|
+
</office:document-content>}
|
60
|
+
|
61
|
+
@tempfile = Tempfile.new('output.ods')
|
62
|
+
|
63
|
+
File.open(BLANK_ODS){|bo| @tempfile.print(bo.read(1024)) until bo.eof? }
|
64
|
+
@tempfile.close
|
65
|
+
|
66
|
+
zip = Zip::ZipFile.open(@tempfile.path)
|
67
|
+
zip.get_output_stream('content.xml') do |cxml|
|
68
|
+
cxml.write(output)
|
69
|
+
end
|
70
|
+
zip.close
|
71
|
+
|
72
|
+
options.io =
|
73
|
+
if options.tempfile
|
74
|
+
@tempfile
|
75
|
+
else
|
76
|
+
File.read(@tempfile.path)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|