ruport-util 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,69 @@
1
+ require "rake/rdoctask"
2
+ require "rake/testtask"
3
+ require "rake/gempackagetask"
4
+
5
+ begin
6
+ require "rubygems"
7
+ rescue LoadError
8
+ nil
9
+ end
10
+
11
+ task :default => [:test]
12
+
13
+ Rake::TestTask.new do |test|
14
+ test.libs << "test"
15
+ test.test_files = Dir[ "test/test_*.rb" ]
16
+ test.verbose = true
17
+ end
18
+
19
+ spec = Gem::Specification.new do |spec|
20
+ spec.name = "ruport-util"
21
+ spec.version = "0.1.0"
22
+ spec.platform = Gem::Platform::RUBY
23
+ spec.summary = "A set of tools and helper libs for Ruby Reports"
24
+ spec.files = Dir.glob("{example,lib,test,bin}/**/**/*") +
25
+ ["Rakefile"]
26
+
27
+ spec.require_path = "lib"
28
+
29
+ spec.test_files = Dir[ "test/test_*.rb" ]
30
+ spec.bindir = "bin"
31
+ spec.has_rdoc = true
32
+ spec.extra_rdoc_files = %w{}
33
+ spec.rdoc_options << '--title' << 'Ruport Documentation' #<<
34
+ # '--main' << 'README' << '-q'
35
+ spec.add_dependency('ruport', ">=0.9.3")
36
+ spec.add_dependency('scruffy', ">=0.2.2")
37
+ spec.author = "Gregory Brown"
38
+ spec.email = " gregory.t.brown@gmail.com"
39
+ spec.rubyforge_project = "ruport"
40
+ spec.homepage = "http://code.rubyreports.org"
41
+ spec.description = <<END_DESC
42
+ ruport-util provides a number of utilities and helper libs
43
+ for Ruby Reports
44
+ END_DESC
45
+ end
46
+
47
+ Rake::RDocTask.new do |rdoc|
48
+ rdoc.rdoc_files.include( "README",
49
+ "TODO", #"CHANGELOG",
50
+ "AUTHORS", "COPYING",
51
+ "LICENSE", "lib/" )
52
+ rdoc.main = "README"
53
+ rdoc.rdoc_dir = "doc/html"
54
+ rdoc.title = "Ruport Documentation"
55
+ end
56
+
57
+ Rake::GemPackageTask.new(spec) do |pkg|
58
+ pkg.need_zip = true
59
+ pkg.need_tar = true
60
+ end
61
+
62
+ begin
63
+ require 'rcov/rcovtask'
64
+ Rcov::RcovTask.new do |t|
65
+ t.test_files = Dir[ "test/test_*.rb" ]
66
+ end
67
+ rescue LoadError
68
+ nil
69
+ end
@@ -0,0 +1,17 @@
1
+ require "rubygems"
2
+ require "ruport"
3
+
4
+ require "ruport/util/graph"
5
+
6
+ class GraphReport < Ruport::Report
7
+
8
+ def generate
9
+ graph = Ruport::Graph(:column_names => %w[a b c d e])
10
+ graph.add_line [1,2,3,4,5], :name => "foo"
11
+ graph.add_line [11,22,70,2,19], :name => "bar"
12
+ graph.to_svg
13
+ end
14
+
15
+ end
16
+
17
+ GraphReport.run { |r| r.write("foo.svg") }
@@ -0,0 +1,28 @@
1
+ require "rubygems"
2
+ require "ruport"
3
+ require "ruport/util/invoice"
4
+
5
+ class SampleReport < Ruport::Report
6
+ include Invoice
7
+
8
+ def generate
9
+ render_invoice do |i|
10
+ i.data = Table("Item Number","Description","Price") { |t|
11
+ t << %w[101 Erlang\ The\ Movie $1000.00]
12
+ t << %w[102 Erlang\ The\ Book $45.95]
13
+ }
14
+ i.company_info = "Stone Code Productions\n43 Neagle Street"
15
+ i.customer_info = "Gregory Brown\n200 Foo Ave.\n"
16
+ i.comments = "Hello Mike! Hello Joe!"
17
+ i.order_info = "Some info\nabout your order"
18
+ i.title = "Invoice for 12.15.2006 - 12.31.2006"
19
+ i.options do |o|
20
+ o.body_width = 480
21
+ o.comments_font_size = 12
22
+ o.title_font_size = 10
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ SampleReport.run { |r| r.write "out.pdf" }
@@ -0,0 +1,37 @@
1
+ require "rubygems"
2
+ require "ruport"
3
+ require "ruport/util/report_manager"
4
+
5
+ class MyReport < Ruport::Report
6
+
7
+ acts_as_managed_report
8
+
9
+ def generate
10
+ "Hello Mike"
11
+ end
12
+
13
+ end
14
+
15
+ class YourReport < Ruport::Report
16
+
17
+ acts_as_managed_report
18
+
19
+ def generate
20
+ "Hello Joe"
21
+ end
22
+
23
+ end
24
+
25
+ class HisReport < Ruport::Report
26
+
27
+ acts_as_managed_report
28
+
29
+ def generate
30
+ "Hello Robert"
31
+ end
32
+
33
+ end
34
+
35
+ %w[MyReport YourReport HisReport].each do |report|
36
+ puts Ruport::ReportManager[report].run
37
+ end
@@ -0,0 +1,186 @@
1
+ # renderer/graph.rb
2
+ # Generalized graphing support for Ruby Reports
3
+ #
4
+ # Written by Gregory Brown, Copright December 2006, All Rights Reserved.
5
+ #
6
+ # This is free software. See LICENSE and COPYING for details.
7
+ #
8
+
9
+ begin
10
+ require "rubygems"
11
+ gem "ruport", ">= 0.9.3"
12
+ rescue LoadError
13
+ nil
14
+ end
15
+
16
+ module Ruport
17
+
18
+ def Graph(*args)
19
+ Graph.new(*args)
20
+ end
21
+
22
+ module_function :Graph
23
+
24
+ class Graph < Ruport::Data::Table
25
+
26
+ class Line < Ruport::Data::Record
27
+ attr_accessor :name
28
+
29
+ def initialize_copy(from)
30
+ @name = from.name.dup if from.name
31
+ end
32
+ end
33
+
34
+ def initialize(options={})
35
+ super({:record_class => Line}.merge(options))
36
+ end
37
+
38
+ def add_line(row_data,options={})
39
+ self << row_data
40
+ self[-1].name = options[:name]
41
+ end
42
+
43
+ def dup
44
+ obj = self.class.new(:column_names => column_names)
45
+ data.each { |r| obj.add_line(r.to_a,:name => r.name)}
46
+ return obj
47
+ end
48
+
49
+ def as(format,*args,&block)
50
+ Ruport::Renderer::Graph.render(format,*args,&block)
51
+ end
52
+
53
+ def method_missing(id,*args,&block)
54
+ id.to_s =~ /^to_(.*)/
55
+ $1 ? as($1.to_sym,{:data => self}.merge(args[0]||{}),&block) : super
56
+ end
57
+
58
+ end
59
+
60
+ # This class implements the basic graphing engine for Ruport.
61
+ #
62
+ # == Supported Format Plugins
63
+ #
64
+ # * Format::XML
65
+ # * Format::SVG
66
+ #
67
+ # == Default layout options
68
+ #
69
+ # * height #=> 350
70
+ # * width #=> 500
71
+ # * style #=> :line
72
+ #
73
+ # == Plugin hooks called (in order)
74
+ #
75
+ # * prepare_graph
76
+ # * build_graph
77
+ # * finalize_graph
78
+ class Renderer::Graph < Renderer
79
+
80
+ options { |o| o.style = :line }
81
+
82
+ prepare :graph
83
+
84
+ stage :graph
85
+
86
+ finalize :graph
87
+
88
+ end
89
+
90
+ class SVG < Formatter
91
+
92
+ renders :svg, :for => Renderer::Graph
93
+
94
+ # a hash of Scruffy themes.
95
+ #
96
+ # You can use these by setting options.theme like this:
97
+ #
98
+ # Graph.render_svg { |r| r.options.theme = r.plugin.themes[:mephisto] }
99
+ #
100
+ # Available themes: ( :mephisto, :keynote, :ruby_blog )
101
+ #
102
+ def themes
103
+ { :mephisto => Scruffy::Themes::Mephisto.new,
104
+ :keynote => Scruffy::Themes::Keynote.new,
105
+ :ruby_blog => Scruffy::Themes::RubyBlog.new }
106
+ end
107
+
108
+ # generates a scruffy graph object
109
+ def initialize
110
+ quiet { require 'scruffy' }
111
+
112
+ @graph = Scruffy::Graph.new
113
+ end
114
+
115
+ # the Scruffy::Graph object
116
+ attr_reader :graph
117
+
118
+ # sets the graph title, theme, and column_names
119
+ #
120
+ # column_names are defined by the Data::Table,
121
+ # theme may be specified by options.theme (see SVG#themes)
122
+ # title may be specified by options.title
123
+ #
124
+ def prepare_graph
125
+ @graph.title ||= options.title
126
+ @graph.theme = options.theme if options.theme
127
+ @graph.point_markers ||= data.column_names
128
+
129
+ end
130
+
131
+ # Generates an SVG using Scruffy.
132
+ def build_graph
133
+ data.each_with_index do |r,i|
134
+ add_line(r.to_a,r.name||"series #{i+1}")
135
+ end
136
+
137
+ output << @graph.render(
138
+ :size => [options.width||500, options.height||300]
139
+ )
140
+ end
141
+
142
+ # Uses Scruffy::Graph#add to add a new line to the graph.
143
+ #
144
+ # Line style is determined by options.style
145
+ #
146
+ def add_line(row,label)
147
+ @graph.add( options.style, label, row )
148
+ end
149
+
150
+ end
151
+
152
+ class XML_SWF < Formatter
153
+
154
+ renders :xml_swf, :for => Renderer::Graph
155
+
156
+ def prepare_graph
157
+ gem "builder"
158
+ require "builder"
159
+ @builder = Builder::XmlMarkup.new(:indent => 2)
160
+ end
161
+
162
+ def build_graph
163
+ output << @builder.chart do |b|
164
+ b.chart_type(options.style.to_s)
165
+
166
+ b.chart_data do |cd|
167
+
168
+ cd.row { |first|
169
+ first.null
170
+ data.column_names.each { |c| first.string(c) }
171
+ }
172
+
173
+ data.each_with_index { |r,i|
174
+ label = r.name || "Region #{i}"
175
+ cd.row { |data_row|
176
+ data_row.string(label)
177
+ r.each { |e| data_row.number(e) }
178
+ }
179
+ }
180
+ end
181
+ end
182
+ end
183
+
184
+ end
185
+
186
+ end
@@ -0,0 +1,138 @@
1
+ module Ruport
2
+ class Renderer
3
+ class Invoice < Ruport::Renderer
4
+
5
+ required_option :customer_info,:company_info,:order_info,:comments
6
+
7
+ option :title
8
+
9
+ stage :invoice_headers,:invoice_body,:invoice_footer
10
+
11
+ finalize :invoice
12
+
13
+ module InvoiceHelpers
14
+ def build_company_header
15
+ @tod = pdf_writer.y
16
+ rounded_text_box(options.company_info) { |o|
17
+ o.radius = 3
18
+ o.width = options.header_width || 200
19
+ o.height = options.header_height || 50
20
+ o.font_size = options.header_font_size || 10
21
+ o.y = pdf_writer.y
22
+ o.x = pdf_writer.absolute_left_margin + 10
23
+ }
24
+ end
25
+
26
+ def build_customer_header
27
+ move_cursor -5
28
+ rounded_text_box(options.customer_info) { |o|
29
+ o.radius = 3
30
+ o.width = options.header_width || 200
31
+ o.height = options.header_height || 50
32
+ o.font_size = options.header_font_size || 10
33
+ o.y = pdf_writer.y
34
+ o.x = pdf_writer.absolute_left_margin + 10
35
+ }
36
+ end
37
+
38
+ def build_title
39
+ add_title(options.title) if options.title
40
+ end
41
+
42
+ def add_title( title )
43
+ rounded_text_box("<b>#{title}</b>") do |o|
44
+ o.fill_color = Color::RGB::Gray80
45
+ o.radius = 5
46
+ o.width = options.header_width || 200
47
+ o.height = options.header_height || 20
48
+ o.font_size = options.header_font_size || 11
49
+ o.x = pdf_writer.absolute_right_margin - o.width
50
+ o.y = pdf_writer.absolute_top_margin
51
+ end
52
+ end
53
+
54
+ def build_order_header
55
+ if options.order_info
56
+ rounded_text_box("<b>#{options.order_info}</b>") do |o|
57
+ o.radius = 5
58
+ o.heading = "Billing Information"
59
+ o.width = options.header_width || 200
60
+ o.height = options.header_height || 80
61
+ o.font_size = options.header_font_size || 10
62
+ o.x = pdf_writer.absolute_right_margin - o.width
63
+ o.y = pdf_writer.absolute_top_margin - 25
64
+ end
65
+ end
66
+ end
67
+
68
+ def horizontal_line(x1,x2)
69
+ pdf_writer.line(x1,pdf_writer.y,x2,pdf_writer.y)
70
+ pdf_writer.stroke
71
+ end
72
+
73
+ end
74
+
75
+ class PDF < Ruport::Formatter::PDF
76
+
77
+ include InvoiceHelpers
78
+ renders :pdf, :for => Renderer::Invoice
79
+
80
+ def build_invoice_headers
81
+ build_company_header
82
+ build_customer_header
83
+ build_title
84
+ build_order_header
85
+ end
86
+
87
+ def build_invoice_body
88
+
89
+ pdf_writer.y = 600
90
+
91
+ Ruport::Renderer::Table.render_pdf { |r|
92
+ r.data = data
93
+ r.options.formatter = pdf_writer
94
+ r.options.table_width = options.body_width || 450
95
+ }
96
+
97
+ end
98
+
99
+ def build_invoice_footer
100
+ # footer
101
+ pdf_writer.open_object do |footer|
102
+ pdf_writer.save_state
103
+ pdf_writer.stroke_color! Color::RGB::Black
104
+ pdf_writer.stroke_style! ::PDF::Writer::StrokeStyle::DEFAULT
105
+ if options.comments
106
+
107
+ move_cursor_to 60
108
+
109
+ horizontal_line left_boundary + 20, right_boundary - 25
110
+
111
+ move_cursor -10
112
+
113
+ add_text(options.comments,:justification => :center,
114
+ :left => 0, :right => 0 )
115
+
116
+ end
117
+
118
+ pdf_writer.restore_state
119
+ pdf_writer.close_object
120
+ pdf_writer.add_object(footer, :all_pages)
121
+ end
122
+ end
123
+
124
+ def finalize_invoice
125
+ output << pdf_writer.render
126
+ end
127
+
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ module Ruport::Report::Invoice
134
+ def render_invoice(*args,&block)
135
+ Ruport::Renderer::Invoice.render_pdf(*args,&block)
136
+ end
137
+ end
138
+
@@ -0,0 +1,93 @@
1
+ module Ruport
2
+ class ReportManager
3
+
4
+ def self.add_model(*new_models)
5
+ self.models |= new_models
6
+ end
7
+
8
+ def self.add_report(*new_reports)
9
+ self.reports |= new_reports
10
+ end
11
+
12
+ # Looks in reports first, then models.
13
+ # if there is a conflict, you are F'ed.
14
+ #
15
+ # just kidding, use models#find or reports#find
16
+ def self.[](name)
17
+ reports.find { |r| r.name.eql?(name) } ||
18
+ models.find { |m| m.name.eql?(name) }
19
+ end
20
+
21
+ def self.models
22
+ @models ||= []
23
+ end
24
+
25
+ def self.reports
26
+ @reports ||= []
27
+ end
28
+
29
+ class << self
30
+ attr_writer :models
31
+ attr_writer :reports
32
+ end
33
+
34
+ end
35
+ end
36
+
37
+ if defined? ActiveRecord
38
+ class ActiveRecord::Base
39
+ def self.acts_as_managed_report
40
+ Ruport::ReportManager.add_model(self)
41
+ end
42
+ end
43
+ end
44
+
45
+ class Ruport::Report
46
+ def self.acts_as_managed_report
47
+ Ruport::ReportManager.add_report(self)
48
+ end
49
+ end
50
+
51
+ if __FILE__ == $PROGRAM_NAME
52
+
53
+ include Ruport
54
+
55
+ require "test/unit"
56
+
57
+ # we'll autoregister this one
58
+ class FakeModel
59
+ ReportManager.add_model(self)
60
+ end
61
+
62
+ # we'll add these afterwards
63
+ class FakeModel2;end
64
+ class FakeModel3;end
65
+
66
+
67
+ class TestReportManager < Test::Unit::TestCase
68
+
69
+ def test_simple_usage
70
+ assert_equal [FakeModel], ReportManager.models
71
+ assert_equal FakeModel, ReportManager["FakeModel"]
72
+ end
73
+
74
+ def test_add_models_externally
75
+ klass = ReportManager.dup # we need to do this to make the tests work
76
+ # no need in production code
77
+ assert_equal [FakeModel], klass.models
78
+
79
+ klass.add_model(FakeModel2)
80
+ assert_equal [FakeModel,FakeModel2], klass.models
81
+
82
+ klass.add_model(FakeModel3)
83
+ assert_equal [FakeModel,FakeModel2, FakeModel3], klass.models
84
+
85
+ # let's make sure we can still grab these by name (a string)
86
+ [FakeModel,FakeModel2,FakeModel3].each do |m|
87
+ assert_equal m, klass[m.name]
88
+ end
89
+ end
90
+
91
+ end
92
+ end
93
+
@@ -0,0 +1,3 @@
1
+ require "ruport/util/graph"
2
+ require "ruport/util/invoice"
3
+ require "ruport/util/report_manager"
data/test/init.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "test/unit"
2
+ begin
3
+ require "rubygems"
4
+ rescue LoadError
5
+ nil
6
+ end
7
+ require "ruport"
@@ -0,0 +1,105 @@
1
+ require "test/init"
2
+ require "ruport/util/graph"
3
+
4
+ class MockGraphPlugin < Ruport::Formatter
5
+ renders :mock, :for => Ruport::Renderer::Graph
6
+ def prepare_graph
7
+ output << "prepare"
8
+ end
9
+ def build_graph
10
+ output << "build"
11
+ end
12
+ def finalize_graph
13
+ output << "finalize"
14
+ end
15
+ end
16
+
17
+
18
+ class TestGraphRenderer < Test::Unit::TestCase
19
+
20
+ def test_basics
21
+ out = Ruport::Renderer::Graph.render_mock do |r|
22
+ r.options do |l|
23
+ assert_equal :line, l.style
24
+ end
25
+ end
26
+
27
+ assert_equal("preparebuildfinalize",out)
28
+ end
29
+
30
+ end
31
+
32
+
33
+ class TestSVGPlugin < Test::Unit::TestCase
34
+
35
+ def test_output
36
+ assert_not_nil Ruport::Renderer::Graph.render_svg { |r|
37
+ r.data = Ruport::Graph(:data => [[1,2,3],[4,5,6]])
38
+ }
39
+ end
40
+
41
+ end
42
+
43
+ class TestXMLSWFPlugin < Test::Unit::TestCase
44
+
45
+ def test_output
46
+
47
+ expected = <<-EOS
48
+ <chart>
49
+ <chart_type>line</chart_type>
50
+ <chart_data>
51
+ <row>
52
+ <null/>
53
+ </row>
54
+ <row>
55
+ <string>Region 0</string>
56
+ <number>1</number>
57
+ <number>2</number>
58
+ <number>3</number>
59
+ </row>
60
+ <row>
61
+ <string>Region 1</string>
62
+ <number>4</number>
63
+ <number>5</number>
64
+ <number>6</number>
65
+ </row>
66
+ </chart_data>
67
+ </chart>
68
+ EOS
69
+ assert_equal expected,
70
+ Ruport::Renderer::Graph.render_xml_swf { |r|
71
+ r.data = Ruport::Graph(:data => [[1,2,3],[4,5,6]])
72
+ }
73
+
74
+ expected = <<-EOS
75
+ <chart>
76
+ <chart_type>line</chart_type>
77
+ <chart_data>
78
+ <row>
79
+ <null/>
80
+ </row>
81
+ <row>
82
+ <string>Alpha</string>
83
+ <number>1</number>
84
+ <number>2</number>
85
+ <number>3</number>
86
+ </row>
87
+ <row>
88
+ <string>Beta</string>
89
+ <number>4</number>
90
+ <number>5</number>
91
+ <number>6</number>
92
+ </row>
93
+ </chart_data>
94
+ </chart>
95
+ EOS
96
+
97
+ graph = Ruport::Graph()
98
+ graph.add_line [1,2,3], :name => "Alpha"
99
+ graph.add_line [4,5,6], :name => "Beta"
100
+
101
+ assert_equal expected, graph.to_xml_swf
102
+
103
+ end
104
+
105
+ end
@@ -0,0 +1,29 @@
1
+ require "test/init"
2
+ require "ruport/util/invoice"
3
+
4
+ class TestInvoice < Test::Unit::TestCase
5
+
6
+ def test_required_options
7
+ assert_raises(RuntimeError) { Ruport::Renderer::Invoice.render_pdf }
8
+
9
+ #hash form
10
+ assert_nothing_raised {
11
+ Ruport::Renderer::Invoice.render_pdf :data => Table(%w[a b c]) << [1,2,3],
12
+ :customer_info => "blah", :company_info => "also blah",
13
+ :order_info => "Incredibly Blah", :comments => "Super Blah"
14
+ }
15
+
16
+ #block form
17
+ assert_nothing_raised {
18
+ Ruport::Renderer::Invoice.render_pdf do |r|
19
+ r.data = Table(%w[a b c]) << [1,2,3]
20
+ r.customer_info = "blah"
21
+ r.company_info = "also blah"
22
+ r.order_info = "Incredibly Blah"
23
+ r.comments = "Super blah"
24
+ end
25
+ }
26
+ end
27
+
28
+
29
+ end
@@ -0,0 +1,38 @@
1
+ require "test/init"
2
+ require "ruport/util/report_manager"
3
+
4
+ class Sample < Ruport::Report; def generate; "Hello Mike"; end; end
5
+ class Sample2 < Ruport::Report; def generate; "Hello Joe"; end; end
6
+ Sample.acts_as_managed_report
7
+ Sample2.acts_as_managed_report
8
+
9
+ class FakeModel2;end
10
+ class FakeModel3;end
11
+
12
+ class TestReportManager < Test::Unit::TestCase
13
+
14
+ def test_simple_usage
15
+ assert_equal "Hello Mike", Ruport::ReportManager["Sample"].run
16
+ assert_equal "Hello Joe", Ruport::ReportManager["Sample2"].run
17
+ assert_equal [ Sample, Sample2 ], Ruport::ReportManager.reports
18
+ end
19
+
20
+ def test_add_models
21
+ # we need to do this to make the tests work,no need in production code
22
+ klass = Ruport::ReportManager.dup
23
+
24
+ assert_equal [], klass.models
25
+
26
+ klass.add_model(FakeModel2)
27
+ assert_equal [FakeModel2], klass.models
28
+
29
+ klass.add_model(FakeModel3)
30
+ assert_equal [FakeModel2, FakeModel3], klass.models
31
+
32
+ # let's make sure we can still grab these by name (a string)
33
+ [FakeModel2,FakeModel3].each do |m|
34
+ assert_equal m, klass[m.name]
35
+ end
36
+ end
37
+
38
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.2
3
+ specification_version: 1
4
+ name: ruport-util
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2007-04-04 00:00:00 -04:00
8
+ summary: A set of tools and helper libs for Ruby Reports
9
+ require_paths:
10
+ - lib
11
+ email: " gregory.t.brown@gmail.com"
12
+ homepage: http://code.rubyreports.org
13
+ rubyforge_project: ruport
14
+ description: ruport-util provides a number of utilities and helper libs for Ruby Reports
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Gregory Brown
31
+ files:
32
+ - example/graph_report.rb
33
+ - example/invoice_report.rb
34
+ - example/managed_report.rb
35
+ - lib/ruport
36
+ - lib/ruport/util
37
+ - lib/ruport/util.rb
38
+ - lib/ruport/util/graph.rb
39
+ - lib/ruport/util/invoice.rb
40
+ - lib/ruport/util/report_manager.rb
41
+ - test/init.rb
42
+ - test/test_graph_renderer.rb
43
+ - test/test_invoice.rb
44
+ - test/test_report_manager.rb
45
+ - Rakefile
46
+ test_files:
47
+ - test/test_graph_renderer.rb
48
+ - test/test_invoice.rb
49
+ - test/test_report_manager.rb
50
+ rdoc_options:
51
+ - --title
52
+ - Ruport Documentation
53
+ extra_rdoc_files: []
54
+
55
+ executables: []
56
+
57
+ extensions: []
58
+
59
+ requirements: []
60
+
61
+ dependencies:
62
+ - !ruby/object:Gem::Dependency
63
+ name: ruport
64
+ version_requirement:
65
+ version_requirements: !ruby/object:Gem::Version::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.9.3
70
+ version:
71
+ - !ruby/object:Gem::Dependency
72
+ name: scruffy
73
+ version_requirement:
74
+ version_requirements: !ruby/object:Gem::Version::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 0.2.2
79
+ version: