ruport-util 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +2 -2
- data/example/invoice_report.rb +3 -2
- data/lib/ruport/util.rb +3 -1
- data/lib/ruport/util/invoice.rb +2 -2
- data/lib/ruport/util/ods_table.rb +136 -0
- data/lib/ruport/util/query.rb +12 -1
- data/lib/ruport/util/xls_table.rb +136 -0
- data/test/samples/people.ods +0 -0
- data/test/samples/people.xls +0 -0
- data/test/test_ods_table.rb +219 -0
- data/test/test_query.rb +9 -1
- data/test/test_xls_table.rb +236 -0
- metadata +50 -42
data/Rakefile
CHANGED
@@ -33,7 +33,7 @@ end
|
|
33
33
|
|
34
34
|
spec = Gem::Specification.new do |spec|
|
35
35
|
spec.name = "ruport-util"
|
36
|
-
spec.version = "0.
|
36
|
+
spec.version = "0.13.0"
|
37
37
|
spec.platform = Gem::Platform::RUBY
|
38
38
|
spec.summary = "A set of tools and helper libs for Ruby Reports"
|
39
39
|
spec.files = Dir.glob("{example,lib,test,bin}/**/**/*") +
|
@@ -48,7 +48,7 @@ spec = Gem::Specification.new do |spec|
|
|
48
48
|
spec.extra_rdoc_files = %w{INSTALL}
|
49
49
|
spec.rdoc_options << '--title' << 'ruport-util Documentation' <<
|
50
50
|
'--main' << 'INSTALL' << '-q'
|
51
|
-
spec.add_dependency('ruport', ">=1.
|
51
|
+
spec.add_dependency('ruport', ">=1.4.0")
|
52
52
|
spec.add_dependency('mailfactory',">=1.2.3")
|
53
53
|
spec.add_dependency('rubyzip','>=0.9.1')
|
54
54
|
spec.author = "Gregory Brown"
|
data/example/invoice_report.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
+
require "rubygems"
|
1
2
|
require "ruport"
|
2
3
|
require "ruport/util"
|
3
4
|
|
4
5
|
class SampleReport < Ruport::Report
|
5
6
|
include Invoice
|
6
7
|
|
7
|
-
def
|
8
|
+
def renderable_data(format)
|
8
9
|
render_invoice do |i|
|
9
10
|
i.data = Table("Item Number","Description","Price") { |t|
|
10
11
|
t << %w[101 Erlang\ The\ Movie $1000.00]
|
@@ -25,4 +26,4 @@ class SampleReport < Ruport::Report
|
|
25
26
|
end
|
26
27
|
|
27
28
|
a = SampleReport.new
|
28
|
-
|
29
|
+
a.save_as("invoice.pdf")
|
data/lib/ruport/util.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Ruport
|
2
2
|
module Util
|
3
|
-
VERSION = "0.
|
3
|
+
VERSION = "0.13.0"
|
4
4
|
|
5
5
|
file = __FILE__
|
6
6
|
file = File.readlink(file) if File.symlink?(file)
|
@@ -21,3 +21,5 @@ require "ruport/util/pdf/form"
|
|
21
21
|
require "ruport/util/ods"
|
22
22
|
require "ruport/util/query"
|
23
23
|
require "ruport/util/xls"
|
24
|
+
require "ruport/util/ods_table"
|
25
|
+
require "ruport/util/xls_table"
|
data/lib/ruport/util/invoice.rb
CHANGED
@@ -22,7 +22,7 @@ module Ruport
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def build_customer_header
|
25
|
-
move_cursor
|
25
|
+
move_cursor(-5)
|
26
26
|
rounded_text_box(options.customer_info) { |o|
|
27
27
|
o.radius = 3
|
28
28
|
o.width = options.header_width || 200
|
@@ -99,7 +99,7 @@ module Ruport
|
|
99
99
|
|
100
100
|
horizontal_line left_boundary + 20, right_boundary - 25
|
101
101
|
|
102
|
-
move_cursor
|
102
|
+
move_cursor(-10)
|
103
103
|
|
104
104
|
add_text(options.comments,:justification => :center,
|
105
105
|
:left => 0, :right => 0 )
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'ruport'
|
2
|
+
|
3
|
+
# === Overview
|
4
|
+
#
|
5
|
+
# This class extends the core class Ruport::Data::Table and adds support for loading Openoffice
|
6
|
+
# spreadsheet files using roo. The idea is to get data from speadsheets that may contain
|
7
|
+
# already calculated values entered by non-programmers.
|
8
|
+
#
|
9
|
+
# Once your data is in a Table object, it can be manipulated
|
10
|
+
# to suit your needs, then used to build a report.
|
11
|
+
#
|
12
|
+
# Copyright (C) 2007, Wes Hays
|
13
|
+
# All Rights Reserved.
|
14
|
+
#
|
15
|
+
class Ruport::Data::Table
|
16
|
+
|
17
|
+
# === Overview
|
18
|
+
#
|
19
|
+
# This module provides facilities for creating tables from Openoffice spreadsheet file (ods).
|
20
|
+
#
|
21
|
+
module FromODS
|
22
|
+
# Loads a ods file directly into a Table using the roo library.
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
#
|
26
|
+
# # Load data from Openoffice ods file with defaults
|
27
|
+
# table = Table.load_ods('myspreadsheet.ods')
|
28
|
+
#
|
29
|
+
# # do not assume the data has column names - default is false.
|
30
|
+
# table = Table.load_ods('myspreadsheet.ods',{:has_column_names => false})
|
31
|
+
#
|
32
|
+
# # Select sheet - default is the first sheet.
|
33
|
+
# table = Table.load_ods('myspreadsheet.ods', {:select_sheet => 1})
|
34
|
+
#
|
35
|
+
# # Start row - default is the first row. Use this to override where
|
36
|
+
# the first row should start.
|
37
|
+
# table = Table.load_ods('myspreadsheet.ods', {:start_row => 1})
|
38
|
+
#
|
39
|
+
def load_ods(ods_file, options={})
|
40
|
+
get_table_from_ods_file(ods_file, options)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Creates a Table from an Openoffice object (from roo library).
|
44
|
+
#
|
45
|
+
# Example:
|
46
|
+
#
|
47
|
+
# # parse openoffice object with defaults.
|
48
|
+
# table = Table.parse_ods(openoffice_object)
|
49
|
+
#
|
50
|
+
# # do not assume the data has column names.
|
51
|
+
# table = Table.parse_ods(openoffice_object,{:has_column_names => false})
|
52
|
+
#
|
53
|
+
# # Select sheet - default is the first sheet.
|
54
|
+
# table = Table.parse_ods(openoffice_object, {:select_sheet => 1})
|
55
|
+
#
|
56
|
+
# # Start row - default is the first row. Use this to override where
|
57
|
+
# the first row should start.
|
58
|
+
# table = Table.parse_ods('myspreadsheet.ods', {:start_row => 1})
|
59
|
+
#
|
60
|
+
def parse_ods(ods_object, options={})
|
61
|
+
get_table_from_ods(ods_object, options)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def get_table_from_ods_file(ods_file, options) #:nodoc:
|
67
|
+
require 'roo'
|
68
|
+
oo = Openoffice.new(ods_file)
|
69
|
+
get_table_from_ods(oo, options)
|
70
|
+
end
|
71
|
+
|
72
|
+
def get_table_from_ods(oo, options) #:nodoc:
|
73
|
+
options = {:has_column_names => true,
|
74
|
+
:select_sheet => oo.sheets.first,
|
75
|
+
:start_row => 0}.merge(options)
|
76
|
+
oo.default_sheet = options[:select_sheet]
|
77
|
+
|
78
|
+
options[:start_row] = options[:start_row].to_i + 1 unless options[:start_row].nil?
|
79
|
+
start_row = options[:start_row]
|
80
|
+
|
81
|
+
raise 'start_row must be greater than or equal to zero' if options[:start_row].to_i < 0
|
82
|
+
|
83
|
+
last_row_index_zero = oo.last_row - 1
|
84
|
+
raise "start_row must be less than or equal to #{last_row_index_zero}" if !oo.last_row.nil? and
|
85
|
+
(options[:start_row].to_i > oo.last_row)
|
86
|
+
|
87
|
+
table = self.new(options) do |feeder|
|
88
|
+
|
89
|
+
if options[:has_column_names] == true
|
90
|
+
feeder.data.column_names = oo.row(start_row)
|
91
|
+
start_row = start_row + 1
|
92
|
+
end
|
93
|
+
|
94
|
+
unless oo.last_row.nil?
|
95
|
+
start_row.upto(oo.last_row) do |row|
|
96
|
+
tempArr = []
|
97
|
+
1.upto(oo.last_column) do |col|
|
98
|
+
tempArr << oo.cell(row,col)
|
99
|
+
end
|
100
|
+
feeder << tempArr
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
return table
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
extend FromODS
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
module Kernel
|
117
|
+
|
118
|
+
alias :RuportTableMethod :Table
|
119
|
+
|
120
|
+
# Updates the Ruport interface for creating Data::Tables with
|
121
|
+
# the ability to pass in a ODS file or Roo Openoffice object.
|
122
|
+
#
|
123
|
+
# t = Table("myspreadsheet.ods")
|
124
|
+
# t = Table("myspreadsheet.ods", :has_column_names => true)
|
125
|
+
def Table(*args,&block)
|
126
|
+
table=
|
127
|
+
case(args[0])
|
128
|
+
when /\.ods/
|
129
|
+
Ruport::Data::Table.load_ods(*args)
|
130
|
+
else
|
131
|
+
RuportTableMethod(*args,&block)
|
132
|
+
end
|
133
|
+
|
134
|
+
return table
|
135
|
+
end
|
136
|
+
end
|
data/lib/ruport/util/query.rb
CHANGED
@@ -66,13 +66,24 @@ module Ruport
|
|
66
66
|
# # explicitly use a file, even if it doesn't end in .sql
|
67
67
|
# Ruport::Query.new(:file => "foo")
|
68
68
|
#
|
69
|
+
# # query with parameter substitution
|
70
|
+
# Ruport::Query.new("select * from fo where bar=?", :params => [1234])
|
71
|
+
# Ruport::Query.new(:file => "foo", :params => [1234])
|
72
|
+
#
|
73
|
+
# # query with parameter substitution (ActiveRecord style)
|
74
|
+
# Ruport::Query.new(["select * from fo where bar=?", 1234])
|
75
|
+
#
|
69
76
|
def initialize(sql, options={})
|
70
77
|
if sql.kind_of?(Hash)
|
71
78
|
options = { :source => :default }.merge(sql)
|
72
79
|
sql = options[:file] || options[:string]
|
73
80
|
else
|
81
|
+
if sql.kind_of?(Array)
|
82
|
+
options[:params] = sql[1..-1]
|
83
|
+
sql = sql.first
|
84
|
+
end
|
74
85
|
options = { :source => :default, :string => sql }.merge(options)
|
75
|
-
options[:file] = sql if sql =~
|
86
|
+
options[:file] = sql if sql =~ /\.sql$/
|
76
87
|
end
|
77
88
|
origin = options[:file] ? :file : :string
|
78
89
|
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'ruport'
|
2
|
+
|
3
|
+
# === Overview
|
4
|
+
#
|
5
|
+
# This class extends the core class Ruport::Data::Table and adds support for loading Excel
|
6
|
+
# spreadsheet files using roo. The idea is to get data from speadsheets that may contain
|
7
|
+
# already calculated values entered by non-programmers.
|
8
|
+
#
|
9
|
+
# Once your data is in a Table object, it can be manipulated
|
10
|
+
# to suit your needs, then used to build a report.
|
11
|
+
#
|
12
|
+
# Copyright (C) 2008, Wes Hays
|
13
|
+
# All Rights Reserved.
|
14
|
+
#
|
15
|
+
class Ruport::Data::Table
|
16
|
+
|
17
|
+
# === Overview
|
18
|
+
#
|
19
|
+
# This module provides facilities for creating tables from Excel spreadsheet file (xls).
|
20
|
+
#
|
21
|
+
module FromXLS
|
22
|
+
# Loads a xls file directly into a Table using the roo library.
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
#
|
26
|
+
# # Load data from an Excel xls file with defaults
|
27
|
+
# table = Table.load_xls('myspreadsheet.xls')
|
28
|
+
#
|
29
|
+
# # do not assume the data has column names - default is false.
|
30
|
+
# table = Table.load_xls('myspreadsheet.xls',{:has_column_names => false})
|
31
|
+
#
|
32
|
+
# # Select sheet - default is the first sheet.
|
33
|
+
# table = Table.load_xls('myspreadsheet.xls', {:select_sheet => 1})
|
34
|
+
#
|
35
|
+
# # Start row - default is the first row. Use this to override where
|
36
|
+
# the first row should start.
|
37
|
+
# table = Table.load_xls('myspreadsheet.xls', {:start_row => 1})
|
38
|
+
#
|
39
|
+
def load_xls(xls_file, options={})
|
40
|
+
get_table_from_xls_file(xls_file, options)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Creates a Table from an Excel object (from roo library).
|
44
|
+
#
|
45
|
+
# Example:
|
46
|
+
#
|
47
|
+
# # parse excel object with defaults.
|
48
|
+
# table = Table.parse_xls(excel_object)
|
49
|
+
#
|
50
|
+
# # do not assume the data has column names.
|
51
|
+
# table = Table.parse_xls(excel_object,{:has_column_names => false})
|
52
|
+
#
|
53
|
+
# # Select sheet - default is the first sheet.
|
54
|
+
# table = Table.parse_xls(excel_object, {:select_sheet => 1})
|
55
|
+
#
|
56
|
+
# # Start row - default is the first row. Use this to override where
|
57
|
+
# the first row should start.
|
58
|
+
# table = Table.parse_xls('myspreadsheet.xls', {:start_row => 1})
|
59
|
+
#
|
60
|
+
def parse_xls(xls_object, options={})
|
61
|
+
get_table_from_xls(xls_object, options)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def get_table_from_xls_file(xls_file, options) #:nodoc:
|
67
|
+
require 'roo'
|
68
|
+
oo = Excel.new(xls_file)
|
69
|
+
get_table_from_xls(oo, options)
|
70
|
+
end
|
71
|
+
|
72
|
+
def get_table_from_xls(oo, options) #:nodoc:
|
73
|
+
options = {:has_column_names => true,
|
74
|
+
:select_sheet => oo.sheets.first,
|
75
|
+
:start_row => 0}.merge(options)
|
76
|
+
oo.default_sheet = options[:select_sheet]
|
77
|
+
|
78
|
+
options[:start_row] = options[:start_row].to_i + 1 unless options[:start_row].nil?
|
79
|
+
start_row = options[:start_row]
|
80
|
+
|
81
|
+
raise 'start_row must be greater than or equal to zero' if options[:start_row].to_i < 0
|
82
|
+
|
83
|
+
last_row_index_zero = oo.last_row - 1
|
84
|
+
raise "start_row must be less than or equal to #{last_row_index_zero}" if !oo.last_row.nil? and
|
85
|
+
(options[:start_row].to_i > oo.last_row)
|
86
|
+
|
87
|
+
table = self.new(options) do |feeder|
|
88
|
+
|
89
|
+
if options[:has_column_names] == true
|
90
|
+
feeder.data.column_names = oo.row(start_row)
|
91
|
+
start_row = start_row + 1
|
92
|
+
end
|
93
|
+
|
94
|
+
unless oo.last_row.nil?
|
95
|
+
start_row.upto(oo.last_row) do |row|
|
96
|
+
tempArr = []
|
97
|
+
1.upto(oo.last_column) do |col|
|
98
|
+
tempArr << oo.cell(row,col)
|
99
|
+
end
|
100
|
+
feeder << tempArr
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
return table
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
extend FromXLS
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
module Kernel
|
117
|
+
|
118
|
+
alias :RuportTableMethod2 :Table
|
119
|
+
|
120
|
+
# Updates the Ruport interface for creating Data::Tables with
|
121
|
+
# the ability to pass in a XLS file or Roo Excel object.
|
122
|
+
#
|
123
|
+
# t = Table("myspreadsheet.xls")
|
124
|
+
# t = Table("myspreadsheet.xls", :has_column_names => true)
|
125
|
+
def Table(*args,&block)
|
126
|
+
table=
|
127
|
+
case(args[0])
|
128
|
+
when /\.xls/
|
129
|
+
Ruport::Data::Table.load_xls(*args)
|
130
|
+
else
|
131
|
+
RuportTableMethod2(*args,&block)
|
132
|
+
end
|
133
|
+
|
134
|
+
return table
|
135
|
+
end
|
136
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,219 @@
|
|
1
|
+
# Copyright (C) 2007, Wes Hays
|
2
|
+
# All Rights Reserved.
|
3
|
+
|
4
|
+
require 'test/helper'
|
5
|
+
testcase_requires 'roo'
|
6
|
+
|
7
|
+
describe 'Ruport::Data::TableFromODS' do
|
8
|
+
before(:each) do
|
9
|
+
@ods_file = 'test/samples/people.ods'
|
10
|
+
@csv_file = 'test/samples/data.csv'
|
11
|
+
|
12
|
+
@ods_file_column_names = %w(Name Age DOB)
|
13
|
+
@rows = [ ['Andy', 27.0, Date.parse('01/20/1980')],
|
14
|
+
['Bob', 26.0, Date.parse('02/11/1981')],
|
15
|
+
['Charlie', 20.0, Date.parse('03/14/1987')],
|
16
|
+
['David', 73.0, Date.parse('04/26/1997')] ]
|
17
|
+
|
18
|
+
@ods_file_column_names2 = %w(Name Age Pet_Type)
|
19
|
+
@rows2 = [ ['Tigger', 3.0, 'Cat'],
|
20
|
+
['Chai', 4.0, 'Dog'],
|
21
|
+
['Rusky', 6.0, 'Dog'],
|
22
|
+
['Sam', 13.0, 'Dog'] ]
|
23
|
+
end
|
24
|
+
|
25
|
+
# ==== File check ====
|
26
|
+
# Raise error if file is not found
|
27
|
+
it "should raise if ods file is not found" do
|
28
|
+
lambda do
|
29
|
+
Ruport::Data::Table.load_ods('people.ods')
|
30
|
+
end.should raise_error
|
31
|
+
end
|
32
|
+
|
33
|
+
# Raise error if file is not found
|
34
|
+
it "shouldn't raise if ods file exists" do
|
35
|
+
lambda do
|
36
|
+
Ruport::Data::Table.load_ods(@ods_file)
|
37
|
+
end.should_not raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# ==== Constructor check ====
|
42
|
+
it "shouldn't be nil if a ods file is passed" do
|
43
|
+
table = Table(@ods_file)
|
44
|
+
table.should_not be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it "shouldn't be nil if a Openoffice object is passed" do
|
48
|
+
oo = Openoffice.new(@ods_file)
|
49
|
+
oo.default_sheet = oo.sheets.first
|
50
|
+
table = Table(oo) # This will be passed to the base Ruport::Data::Table class.
|
51
|
+
table.should_not be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "shouldn't be nil if a Ruport::Data::Table parameter is passed" do
|
55
|
+
table = Table(@csv_file) # Pass cs file
|
56
|
+
table.should_not be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# ==== Constructor check with options params ====
|
61
|
+
it "shouldn't be nil if a ods file is passed with options params" do
|
62
|
+
table = Table(@ods_file, {:has_column_names => false})
|
63
|
+
table.should_not be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it "shouldn't be nil if a Openoffice object is passed with options params using parse_ods method" do
|
67
|
+
oo = Openoffice.new(@ods_file)
|
68
|
+
oo.default_sheet = oo.sheets.first
|
69
|
+
table = Ruport::Data::Table.parse_ods(oo, {:has_column_names => false})
|
70
|
+
table.should_not be_nil
|
71
|
+
end
|
72
|
+
|
73
|
+
it "shouldn't be nil if a Ruport::Data::Table parameter is passed with options params" do
|
74
|
+
table = Table(@csv_file, {:has_column_names => false}) # Pass cs file
|
75
|
+
table.should_not be_nil
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should raise if start_row is less than zero" do
|
79
|
+
lambda do
|
80
|
+
Table(@ods_file, {:start_row => -2})
|
81
|
+
end.should raise_error
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should raise if start_row is greater than the number of rows (starting at 0) in the spreadsheet" do
|
85
|
+
lambda do
|
86
|
+
Table(@ods_file, {:start_row => 20})
|
87
|
+
end.should raise_error
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
# ==== Table load check ====
|
92
|
+
|
93
|
+
# Output:
|
94
|
+
# +-----------------------------+
|
95
|
+
# | Name | Age | DOB |
|
96
|
+
# | Andy | 27.0 | 1980-01-20 |
|
97
|
+
# | Bob | 26.0 | 1981-02-11 |
|
98
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
99
|
+
# | David | 73.0 | 1997-04-26 |
|
100
|
+
# +-----------------------------+
|
101
|
+
it "table should be valid without column names loaded from ods file starting at the row 1 (index 0) - column names will be data" do
|
102
|
+
# Load data from ods file but do not load column headers.
|
103
|
+
table = Table(@ods_file, {:has_column_names => false, :start_row => 0})
|
104
|
+
table.should_not be_nil
|
105
|
+
table.column_names.should == []
|
106
|
+
|
107
|
+
# Add headers to the first position
|
108
|
+
@rows.insert(0, @ods_file_column_names)
|
109
|
+
|
110
|
+
table.each { |r| r.to_a.should == @rows.shift
|
111
|
+
r.attributes.should == [0, 1, 2] }
|
112
|
+
end
|
113
|
+
|
114
|
+
# Output:
|
115
|
+
# +-----------------------------+
|
116
|
+
# | Bob | 26.0 | 1981-02-11 |
|
117
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
118
|
+
# | David | 73.0 | 1997-04-26 |
|
119
|
+
# +-----------------------------+
|
120
|
+
it "table should be valid without column names loaded from ods file starting at row 3 (index 2)" do
|
121
|
+
# Load data from ods file but do not load column headers.
|
122
|
+
# Will start at Row 3 (index 2): ['Bob', 26.0, Date.parse('02/11/1981')]
|
123
|
+
table = Table(@ods_file, {:has_column_names => false, :start_row => 2})
|
124
|
+
table.should_not be_nil
|
125
|
+
table.column_names.should == []
|
126
|
+
|
127
|
+
# The header row has not been included yet so don't worry about that one
|
128
|
+
# just delete the first row in @rows.
|
129
|
+
@rows.delete_at(0) # delete ['Andy', 27.0, Date.parse('01/20/1980')]
|
130
|
+
|
131
|
+
table.each { |r| r.to_a.should == @rows.shift
|
132
|
+
r.attributes.should == [0, 1, 2] }
|
133
|
+
end
|
134
|
+
|
135
|
+
# Output:
|
136
|
+
# +-----------------------------+
|
137
|
+
# | Name | Age | DOB |
|
138
|
+
# | Andy | 27.0 | 1980-01-20 |
|
139
|
+
# | Bob | 26.0 | 1981-02-11 |
|
140
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
141
|
+
# | David | 73.0 | 1997-04-26 |
|
142
|
+
# +-----------------------------+
|
143
|
+
it "table should be valid without column names loaded from ods file" do
|
144
|
+
# Load data from ods file but do not load column headers.
|
145
|
+
table = Table(@ods_file, {:has_column_names => false})
|
146
|
+
table.should_not be_nil
|
147
|
+
table.column_names.should == []
|
148
|
+
|
149
|
+
# Add headers to the first position
|
150
|
+
@rows.insert(0, @ods_file_column_names)
|
151
|
+
|
152
|
+
table.each { |r| r.to_a.should == @rows.shift
|
153
|
+
r.attributes.should == [0, 1, 2] }
|
154
|
+
end
|
155
|
+
|
156
|
+
# Output:
|
157
|
+
# +-----------------------------+
|
158
|
+
# | Name | Age | DOB |
|
159
|
+
# +-----------------------------+
|
160
|
+
# | Andy | 27.0 | 1980-01-20 |
|
161
|
+
# | Bob | 26.0 | 1981-02-11 |
|
162
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
163
|
+
# | David | 73.0 | 1997-04-26 |
|
164
|
+
# +-----------------------------+
|
165
|
+
it "table should be valid with column names loaded from ods file" do
|
166
|
+
# Load data from ods file but do not load column headers.
|
167
|
+
table = Table(@ods_file)
|
168
|
+
table.should_not be_nil
|
169
|
+
table.column_names.should == @ods_file_column_names
|
170
|
+
|
171
|
+
table.each { |r| r.to_a.should == @rows.shift
|
172
|
+
r.attributes.should == @ods_file_column_names }
|
173
|
+
end
|
174
|
+
|
175
|
+
# Output:
|
176
|
+
# +--------------------------+
|
177
|
+
# | Name | Age | Pet_Type |
|
178
|
+
# +--------------------------+
|
179
|
+
# | Tigger | 3.0 | Cat |
|
180
|
+
# | Chai | 4.0 | Dog |
|
181
|
+
# | Rusky | 6.0 | Dog |
|
182
|
+
# | Sam | 13.0 | Dog |
|
183
|
+
# +--------------------------+
|
184
|
+
it "table should be valid with column names loaded from ods file using Sheet2" do
|
185
|
+
# Load data from ods file but do not load column headers.
|
186
|
+
table = Table(@ods_file, {:select_sheet => 'Sheet2'})
|
187
|
+
table.should_not be_nil
|
188
|
+
table.column_names.should == @ods_file_column_names2
|
189
|
+
|
190
|
+
table.each { |r| r.to_a.should == @rows2.shift
|
191
|
+
r.attributes.should == @ods_file_column_names2 }
|
192
|
+
end
|
193
|
+
|
194
|
+
# Output:
|
195
|
+
# +--------------------------+
|
196
|
+
# | Name | Age | Pet_Type |
|
197
|
+
# +--------------------------+
|
198
|
+
# | Tigger | 3.0 | Cat |
|
199
|
+
# | Chai | 4.0 | Dog |
|
200
|
+
# | Rusky | 6.0 | Dog |
|
201
|
+
# | Sam | 13.0 | Dog |
|
202
|
+
# +--------------------------+
|
203
|
+
it "should be valid if an Openoffice object is passed using parse_ods method" do
|
204
|
+
oo = Openoffice.new(@ods_file)
|
205
|
+
oo.default_sheet = oo.sheets.first
|
206
|
+
table = Ruport::Data::Table.parse_ods(oo)
|
207
|
+
table.should_not be_nil
|
208
|
+
|
209
|
+
table.column_names.should == @ods_file_column_names
|
210
|
+
|
211
|
+
table.each { |r| r.to_a.should == @rows.shift
|
212
|
+
r.attributes.should == @ods_file_column_names }
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
|
data/test/test_query.rb
CHANGED
@@ -29,6 +29,7 @@ describe "A Query" do
|
|
29
29
|
:plain => Ruport::Query.new(@sql[0]),
|
30
30
|
:sourced => Ruport::Query.new(@sql[0], :source => :alternative),
|
31
31
|
:paramed => Ruport::Query.new(@sql[0], :params => [ 42 ]),
|
32
|
+
:paramed_ar => Ruport::Query.new([@sql[0], 69, 777]),
|
32
33
|
:raw => Ruport::Query.new(@sql[0], :row_type => :raw),
|
33
34
|
:resultless => Ruport::Query.new(@sql[1]),
|
34
35
|
:multi => Ruport::Query.new(@sql[2]),
|
@@ -52,13 +53,20 @@ describe "A Query" do
|
|
52
53
|
query.execute.should == nil
|
53
54
|
end
|
54
55
|
|
55
|
-
it "should allow
|
56
|
+
it "should allow execute to accept parameters" do
|
56
57
|
query = @query[:paramed]
|
57
58
|
setup_mock_dbi(1, :params => [ 42 ])
|
58
59
|
|
59
60
|
query.execute.should == nil
|
60
61
|
end
|
61
62
|
|
63
|
+
it "should allow execute to accept parameters (ActiveRecord style)" do
|
64
|
+
query = @query[:paramed_ar]
|
65
|
+
setup_mock_dbi(1, :params => [ 69, 777 ])
|
66
|
+
|
67
|
+
query.execute.should == nil
|
68
|
+
end
|
69
|
+
|
62
70
|
it "should return nil for empty results" do
|
63
71
|
query = @query[:resultless]
|
64
72
|
setup_mock_dbi(1, :resultless => true, :sql => @sql[1])
|
@@ -0,0 +1,236 @@
|
|
1
|
+
# Copyright (C) 2008, Wes Hays
|
2
|
+
# All Rights Reserved.
|
3
|
+
|
4
|
+
require 'test/helper'
|
5
|
+
testcase_requires 'roo'
|
6
|
+
|
7
|
+
describe 'Ruport::Data::TableFromXLS' do
|
8
|
+
before(:each) do
|
9
|
+
@xls_file = 'test/samples/people.xls'
|
10
|
+
@csv_file = 'test/samples/data.csv'
|
11
|
+
|
12
|
+
@xls_file_column_names = %w(Name Age DOB)
|
13
|
+
# This test will pass once Spreadsheet and Roo support
|
14
|
+
# formulas in an excel file.
|
15
|
+
# @rows = [ ['Andy', 27.0, Date.parse('01/20/1980')],
|
16
|
+
# ['Bob', 26.0, Date.parse('02/11/1981')],
|
17
|
+
# ['Charlie', 20.0, Date.parse('03/14/1987')],
|
18
|
+
# ['David', 73.0, Date.parse('04/26/1997')] ]
|
19
|
+
|
20
|
+
# Delete this once Roo supports formulas in an excel file.
|
21
|
+
@rows = [ ['Andy', 27.0, Date.parse('01/20/1980')],
|
22
|
+
['Bob', 26.0, Date.parse('02/11/1981')],
|
23
|
+
['Charlie', 20.0, Date.parse('03/14/1987')],
|
24
|
+
['David', nil, Date.parse('04/26/1997')] ]
|
25
|
+
|
26
|
+
|
27
|
+
@xls_file_column_names2 = %w(Name Age Pet_Type)
|
28
|
+
# This test will pass once Spreadsheet and Roo support
|
29
|
+
# formulas in an excel file.
|
30
|
+
# @rows2 = [ ['Tigger', 3.0, 'Cat'],
|
31
|
+
# ['Chai', 4.0, 'Dog'],
|
32
|
+
# ['Rusky', 6.0, 'Dog'],
|
33
|
+
# ['Sam', 13.0, 'Dog'] ]
|
34
|
+
|
35
|
+
# Delete this once Roo supports formulas in an excel file.
|
36
|
+
@xls_file_column_names2 = %w(Name Age Pet_Type)
|
37
|
+
@rows2 = [ ['Tigger', 3.0, 'Cat'],
|
38
|
+
['Chai', 4.0, 'Dog'],
|
39
|
+
['Rusky', 6.0, 'Dog'],
|
40
|
+
['Sam', nil, 'Dog'] ]
|
41
|
+
end
|
42
|
+
|
43
|
+
# ==== File check ====
|
44
|
+
# Raise error if file is not found
|
45
|
+
it "should raise if xls file is not found" do
|
46
|
+
lambda do
|
47
|
+
Ruport::Data::Table.load_xls('people.xls')
|
48
|
+
end.should raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
# Raise error if file is not found
|
52
|
+
it "shouldn't raise if xls file exists" do
|
53
|
+
lambda do
|
54
|
+
Ruport::Data::Table.load_xls(@xls_file)
|
55
|
+
end.should_not raise_error
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# ==== Constructor check ====
|
60
|
+
it "shouldn't be nil if a xls file is passed" do
|
61
|
+
table = Table(@xls_file)
|
62
|
+
table.should_not be_nil
|
63
|
+
end
|
64
|
+
|
65
|
+
it "shouldn't be nil if a Excel object is passed" do
|
66
|
+
oo = Excel.new(@xls_file)
|
67
|
+
oo.default_sheet = oo.sheets.first
|
68
|
+
table = Table(oo) # This will be passed to the base Ruport::Data::Table class.
|
69
|
+
table.should_not be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it "shouldn't be nil if a Ruport::Data::Table parameter is passed" do
|
73
|
+
table = Table(@csv_file) # Pass cs file
|
74
|
+
table.should_not be_nil
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
# ==== Constructor check with options params ====
|
79
|
+
it "shouldn't be nil if a xls file is passed with options params" do
|
80
|
+
table = Table(@xls_file, {:has_column_names => false})
|
81
|
+
table.should_not be_nil
|
82
|
+
end
|
83
|
+
|
84
|
+
it "shouldn't be nil if a Excel object is passed with options params using parse_xls method" do
|
85
|
+
oo = Excel.new(@xls_file)
|
86
|
+
oo.default_sheet = oo.sheets.first
|
87
|
+
table = Ruport::Data::Table.parse_xls(oo, {:has_column_names => false})
|
88
|
+
table.should_not be_nil
|
89
|
+
end
|
90
|
+
|
91
|
+
it "shouldn't be nil if a Ruport::Data::Table parameter is passed with options params" do
|
92
|
+
table = Table(@csv_file, {:has_column_names => false}) # Pass cs file
|
93
|
+
table.should_not be_nil
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should raise if start_row is less than zero" do
|
97
|
+
lambda do
|
98
|
+
Table(@xls_file, {:start_row => -2})
|
99
|
+
end.should raise_error
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should raise if start_row is greater than the number of rows (starting at 0) in the spreadsheet" do
|
103
|
+
lambda do
|
104
|
+
Table(@xls_file, {:start_row => 20})
|
105
|
+
end.should raise_error
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
# ==== Table load check ====
|
110
|
+
|
111
|
+
# Output:
|
112
|
+
# +-----------------------------+
|
113
|
+
# | Name | Age | DOB |
|
114
|
+
# | Andy | 27.0 | 1980-01-20 |
|
115
|
+
# | Bob | 26.0 | 1981-02-11 |
|
116
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
117
|
+
# | David | 73.0 | 1997-04-26 |
|
118
|
+
# +-----------------------------+
|
119
|
+
it "table should be valid without column names loaded from xls file starting at the row 1 (index 0) - column names will be data" do
|
120
|
+
# Load data from xls file but do not load column headers.
|
121
|
+
table = Table(@xls_file, {:has_column_names => false, :start_row => 0})
|
122
|
+
table.should_not be_nil
|
123
|
+
table.column_names.should == []
|
124
|
+
|
125
|
+
# Add headers to the first position
|
126
|
+
@rows.insert(0, @xls_file_column_names)
|
127
|
+
|
128
|
+
table.each { |r| r.to_a.should == @rows.shift
|
129
|
+
r.attributes.should == [0, 1, 2] }
|
130
|
+
end
|
131
|
+
|
132
|
+
# Output:
|
133
|
+
# +-----------------------------+
|
134
|
+
# | Bob | 26.0 | 1981-02-11 |
|
135
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
136
|
+
# | David | 73.0 | 1997-04-26 |
|
137
|
+
# +-----------------------------+
|
138
|
+
it "table should be valid without column names loaded from xls file starting at row 3 (index 2)" do
|
139
|
+
# Load data from xls file but do not load column headers.
|
140
|
+
# Will start at Row 3 (index 2): ['Bob', 26.0, Date.parse('02/11/1981')]
|
141
|
+
table = Table(@xls_file, {:has_column_names => false, :start_row => 2})
|
142
|
+
table.should_not be_nil
|
143
|
+
table.column_names.should == []
|
144
|
+
|
145
|
+
# The header row has not been included yet so don't worry about that one
|
146
|
+
# just delete the first row in @rows.
|
147
|
+
@rows.delete_at(0) # delete ['Andy', 27.0, Date.parse('01/20/1980')]
|
148
|
+
|
149
|
+
table.each { |r| r.to_a.should == @rows.shift
|
150
|
+
r.attributes.should == [0, 1, 2] }
|
151
|
+
end
|
152
|
+
|
153
|
+
# Output:
|
154
|
+
# +-----------------------------+
|
155
|
+
# | Name | Age | DOB |
|
156
|
+
# | Andy | 27.0 | 1980-01-20 |
|
157
|
+
# | Bob | 26.0 | 1981-02-11 |
|
158
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
159
|
+
# | David | 73.0 | 1997-04-26 |
|
160
|
+
# +-----------------------------+
|
161
|
+
it "table should be valid without column names loaded from xls file" do
|
162
|
+
# Load data from xls file but do not load column headers.
|
163
|
+
table = Table(@xls_file, {:has_column_names => false})
|
164
|
+
table.should_not be_nil
|
165
|
+
table.column_names.should == []
|
166
|
+
|
167
|
+
# Add headers to the first position
|
168
|
+
@rows.insert(0, @xls_file_column_names)
|
169
|
+
|
170
|
+
table.each { |r| r.to_a.should == @rows.shift
|
171
|
+
r.attributes.should == [0, 1, 2] }
|
172
|
+
end
|
173
|
+
|
174
|
+
# Output:
|
175
|
+
# +-----------------------------+
|
176
|
+
# | Name | Age | DOB |
|
177
|
+
# +-----------------------------+
|
178
|
+
# | Andy | 27.0 | 1980-01-20 |
|
179
|
+
# | Bob | 26.0 | 1981-02-11 |
|
180
|
+
# | Charlie | 20.0 | 1987-03-14 |
|
181
|
+
# | David | 73.0 | 1997-04-26 |
|
182
|
+
# +-----------------------------+
|
183
|
+
it "table should be valid with column names loaded from xls file" do
|
184
|
+
# Load data from xls file but do not load column headers.
|
185
|
+
table = Table(@xls_file)
|
186
|
+
table.should_not be_nil
|
187
|
+
table.column_names.should == @xls_file_column_names
|
188
|
+
|
189
|
+
table.each { |r| r.to_a.should == @rows.shift
|
190
|
+
r.attributes.should == @xls_file_column_names }
|
191
|
+
end
|
192
|
+
|
193
|
+
# Output:
|
194
|
+
# +--------------------------+
|
195
|
+
# | Name | Age | Pet_Type |
|
196
|
+
# +--------------------------+
|
197
|
+
# | Tigger | 3.0 | Cat |
|
198
|
+
# | Chai | 4.0 | Dog |
|
199
|
+
# | Rusky | 6.0 | Dog |
|
200
|
+
# | Sam | 13.0 | Dog |
|
201
|
+
# +--------------------------+
|
202
|
+
it "table should be valid with column names loaded from xls file using Sheet2" do
|
203
|
+
# Load data from xls file but do not load column headers.
|
204
|
+
table = Table(@xls_file, {:select_sheet => 'Sheet2'})
|
205
|
+
table.should_not be_nil
|
206
|
+
table.column_names.should == @xls_file_column_names2
|
207
|
+
|
208
|
+
table.each { |r| r.to_a.should == @rows2.shift
|
209
|
+
r.attributes.should == @xls_file_column_names2 }
|
210
|
+
end
|
211
|
+
|
212
|
+
# Output:
|
213
|
+
# +--------------------------+
|
214
|
+
# | Name | Age | Pet_Type |
|
215
|
+
# +--------------------------+
|
216
|
+
# | Tigger | 3.0 | Cat |
|
217
|
+
# | Chai | 4.0 | Dog |
|
218
|
+
# | Rusky | 6.0 | Dog |
|
219
|
+
# | Sam | 13.0 | Dog |
|
220
|
+
# +--------------------------+
|
221
|
+
it "should be valid if an Excel object is passed using parse_xls method" do
|
222
|
+
oo = Excel.new(@xls_file)
|
223
|
+
oo.default_sheet = oo.sheets.first
|
224
|
+
table = Ruport::Data::Table.parse_xls(oo)
|
225
|
+
table.should_not be_nil
|
226
|
+
|
227
|
+
table.column_names.should == @xls_file_column_names
|
228
|
+
|
229
|
+
table.each { |r| r.to_a.should == @rows.shift
|
230
|
+
r.attributes.should == @xls_file_column_names }
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
|
235
|
+
|
236
|
+
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: ruport-util
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date:
|
6
|
+
version: 0.13.0
|
7
|
+
date: 2008-02-08 00:00:00 -05:00
|
8
8
|
summary: A set of tools and helper libs for Ruby Reports
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -30,71 +30,79 @@ authors:
|
|
30
30
|
- Gregory Brown
|
31
31
|
files:
|
32
32
|
- example/data
|
33
|
-
- example/data/amline_settings.xml
|
34
|
-
- example/data/blank.xlsx
|
35
|
-
- example/data/amline_graph.xml
|
36
|
-
- example/data/blank.ods
|
37
|
-
- example/invoice_report.rb
|
38
33
|
- example/draw_graph.rb
|
39
34
|
- example/form.rb
|
35
|
+
- example/graph_report.rb
|
40
36
|
- example/gruff_report.rb
|
41
|
-
- example/
|
42
|
-
- example/managed_report.rb
|
37
|
+
- example/invoice_report.rb
|
43
38
|
- example/mailer.rb
|
44
|
-
- example/
|
39
|
+
- example/managed_report.rb
|
40
|
+
- example/ods.rb
|
41
|
+
- example/data/amline_graph.xml
|
42
|
+
- example/data/amline_settings.xml
|
43
|
+
- example/data/blank.ods
|
44
|
+
- example/data/blank.xlsx
|
45
|
+
- lib/open_flash_chart.rb
|
45
46
|
- lib/ruport
|
46
47
|
- lib/ruport/util
|
47
|
-
- lib/ruport/util
|
48
|
-
- lib/ruport/util/graph/scruffy.rb
|
49
|
-
- lib/ruport/util/graph/amline.rb
|
50
|
-
- lib/ruport/util/graph/o_f_c.rb
|
51
|
-
- lib/ruport/util/graph/gruff.rb
|
52
|
-
- lib/ruport/util/pdf
|
53
|
-
- lib/ruport/util/pdf/form.rb
|
54
|
-
- lib/ruport/util/generator.rb
|
48
|
+
- lib/ruport/util.rb
|
55
49
|
- lib/ruport/util/bench.rb
|
50
|
+
- lib/ruport/util/generator.rb
|
51
|
+
- lib/ruport/util/graph
|
56
52
|
- lib/ruport/util/graph.rb
|
53
|
+
- lib/ruport/util/invoice.rb
|
54
|
+
- lib/ruport/util/mailer.rb
|
57
55
|
- lib/ruport/util/ods.rb
|
56
|
+
- lib/ruport/util/ods_table.rb
|
57
|
+
- lib/ruport/util/pdf
|
58
58
|
- lib/ruport/util/query.rb
|
59
|
+
- lib/ruport/util/report.rb
|
59
60
|
- lib/ruport/util/report_manager.rb
|
60
61
|
- lib/ruport/util/xls.rb
|
61
|
-
- lib/ruport/util/
|
62
|
-
- lib/ruport/util/
|
63
|
-
- lib/ruport/util/
|
64
|
-
- lib/ruport/util.rb
|
65
|
-
- lib/
|
62
|
+
- lib/ruport/util/xls_table.rb
|
63
|
+
- lib/ruport/util/graph/amline.rb
|
64
|
+
- lib/ruport/util/graph/gruff.rb
|
65
|
+
- lib/ruport/util/graph/o_f_c.rb
|
66
|
+
- lib/ruport/util/graph/scruffy.rb
|
67
|
+
- lib/ruport/util/pdf/form.rb
|
66
68
|
- test/helper
|
67
|
-
- test/helper
|
68
|
-
- test/helper/wrap.rb
|
69
|
+
- test/helper.rb
|
69
70
|
- test/samples
|
70
|
-
- test/
|
71
|
-
- test/samples/foo.rtxt
|
72
|
-
- test/test_report_manager.rb
|
71
|
+
- test/test_format_ods.rb
|
73
72
|
- test/test_format_xls.rb
|
74
|
-
- test/helper.rb
|
75
|
-
- test/test_query.rb
|
76
|
-
- test/test_hpricot_traverser.rb
|
77
|
-
- test/test_graph_renderer.rb
|
78
73
|
- test/test_graph_ofc.rb
|
74
|
+
- test/test_graph_renderer.rb
|
75
|
+
- test/test_hpricot_traverser.rb
|
76
|
+
- test/test_invoice.rb
|
79
77
|
- test/test_mailer.rb
|
78
|
+
- test/test_ods_table.rb
|
79
|
+
- test/test_query.rb
|
80
80
|
- test/test_report.rb
|
81
|
-
- test/
|
82
|
-
- test/
|
81
|
+
- test/test_report_manager.rb
|
82
|
+
- test/test_xls_table.rb
|
83
|
+
- test/helper/layout.rb
|
84
|
+
- test/helper/wrap.rb
|
85
|
+
- test/samples/data.csv
|
86
|
+
- test/samples/foo.rtxt
|
87
|
+
- test/samples/people.ods
|
88
|
+
- test/samples/people.xls
|
83
89
|
- bin/csv2ods
|
84
90
|
- bin/rope
|
85
91
|
- Rakefile
|
86
92
|
- INSTALL
|
87
93
|
test_files:
|
88
|
-
- test/
|
94
|
+
- test/test_format_ods.rb
|
89
95
|
- test/test_format_xls.rb
|
90
|
-
- test/test_query.rb
|
91
|
-
- test/test_hpricot_traverser.rb
|
92
|
-
- test/test_graph_renderer.rb
|
93
96
|
- test/test_graph_ofc.rb
|
97
|
+
- test/test_graph_renderer.rb
|
98
|
+
- test/test_hpricot_traverser.rb
|
99
|
+
- test/test_invoice.rb
|
94
100
|
- test/test_mailer.rb
|
101
|
+
- test/test_ods_table.rb
|
102
|
+
- test/test_query.rb
|
95
103
|
- test/test_report.rb
|
96
|
-
- test/
|
97
|
-
- test/
|
104
|
+
- test/test_report_manager.rb
|
105
|
+
- test/test_xls_table.rb
|
98
106
|
rdoc_options:
|
99
107
|
- --title
|
100
108
|
- ruport-util Documentation
|
@@ -118,7 +126,7 @@ dependencies:
|
|
118
126
|
requirements:
|
119
127
|
- - ">="
|
120
128
|
- !ruby/object:Gem::Version
|
121
|
-
version: 1.
|
129
|
+
version: 1.4.0
|
122
130
|
version:
|
123
131
|
- !ruby/object:Gem::Dependency
|
124
132
|
name: mailfactory
|