ruport 0.2.9 → 0.3.8
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/ACKNOWLEDGEMENTS +33 -0
- data/AUTHORS +13 -1
- data/CHANGELOG +76 -1
- data/README +208 -89
- data/Rakefile +12 -8
- data/TODO +14 -122
- data/lib/ruport.rb +58 -0
- data/lib/ruport/config.rb +114 -0
- data/lib/ruport/data_row.rb +144 -0
- data/lib/ruport/data_set.rb +221 -0
- data/lib/ruport/format.rb +116 -0
- data/lib/ruport/format/builder.rb +29 -5
- data/lib/ruport/format/document.rb +77 -0
- data/lib/ruport/format/open_node.rb +36 -0
- data/lib/ruport/parser.rb +202 -0
- data/lib/ruport/query.rb +208 -0
- data/lib/ruport/query/sql_split.rb +33 -0
- data/lib/ruport/report.rb +116 -0
- data/lib/ruport/report/mailer.rb +17 -15
- data/test/{addressbook.csv → samples/addressbook.csv} +0 -0
- data/test/samples/car_ads.txt +505 -0
- data/test/{data.csv → samples/data.csv} +0 -0
- data/test/samples/document.xml +22 -0
- data/test/samples/five_lines.txt +5 -0
- data/test/samples/five_paragraphs.txt +9 -0
- data/test/samples/ross_report.txt +58530 -0
- data/test/samples/ruport_test.sql +8 -0
- data/test/samples/stonecodeblog.sql +279 -0
- data/test/{test.sql → samples/test.sql} +2 -1
- data/test/{test.yaml → samples/test.yaml} +0 -0
- data/test/tc_builder.rb +7 -4
- data/test/tc_config.rb +41 -0
- data/test/tc_data_row.rb +16 -26
- data/test/tc_data_set.rb +60 -41
- data/test/tc_database.rb +25 -0
- data/test/tc_document.rb +42 -0
- data/test/tc_element.rb +18 -0
- data/test/tc_page.rb +42 -0
- data/test/tc_query.rb +55 -0
- data/test/tc_reading.rb +60 -0
- data/test/tc_report.rb +31 -0
- data/test/tc_section.rb +45 -0
- data/test/tc_sql_split.rb +18 -0
- data/test/tc_state.rb +142 -0
- data/test/ts_all.rb +6 -3
- data/test/ts_format.rb +5 -0
- data/test/ts_parser.rb +10 -0
- metadata +102 -60
- data/bin/ruport +0 -104
- data/lib/ruport/format/chart.rb +0 -1
- data/lib/ruport/report/data_row.rb +0 -79
- data/lib/ruport/report/data_set.rb +0 -153
- data/lib/ruport/report/engine.rb +0 -201
- data/lib/ruport/report/fake_db.rb +0 -54
- data/lib/ruport/report/fake_engine.rb +0 -26
- data/lib/ruport/report/fake_mailer.rb +0 -23
- data/lib/ruport/report/sql.rb +0 -95
- data/lib/ruportlib.rb +0 -11
- data/test/tc_engine.rb +0 -102
- data/test/tc_mailer.rb +0 -21
data/lib/ruport/report/engine.rb
DELETED
@@ -1,201 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby
|
2
|
-
# engine.rb
|
3
|
-
# Created by Gregory Thomas Brown on 2005-08-02
|
4
|
-
# Copyright 2005 (Gregory Brown) All rights reserved.
|
5
|
-
#
|
6
|
-
# This product is free software, you may distribute it as such
|
7
|
-
# under your choice of the Ruby license or the GNU GPL
|
8
|
-
# See LICENSE for details
|
9
|
-
#
|
10
|
-
# Special thanks and acknowledgement go to James Edward Gray II
|
11
|
-
# for providing the original source code for this application
|
12
|
-
require "dbi"
|
13
|
-
require "rubygems"
|
14
|
-
require "erb"
|
15
|
-
require "csv"
|
16
|
-
require "yaml"
|
17
|
-
require "date"
|
18
|
-
require "logger"
|
19
|
-
require "fileutils"
|
20
|
-
module Ruport
|
21
|
-
module Report
|
22
|
-
class Engine
|
23
|
-
def initialize( dsn, user, password, mailer=nil )
|
24
|
-
|
25
|
-
File.exists?("log") or FileUtils.mkdir("log")
|
26
|
-
@logger = Logger.new("log/ruport.log")
|
27
|
-
|
28
|
-
@dsn = dsn
|
29
|
-
@user = user
|
30
|
-
@password = password
|
31
|
-
@mailer = mailer
|
32
|
-
@generate = true
|
33
|
-
@report_name = ""
|
34
|
-
@report = ""
|
35
|
-
@query_table = nil
|
36
|
-
@file = nil
|
37
|
-
@config = nil
|
38
|
-
@databases = Hash.new
|
39
|
-
@databases[:default] = { :dsn => @dsn,
|
40
|
-
:user => @user,
|
41
|
-
:password => @password
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
attr_accessor :query_table, :file
|
46
|
-
attr_reader :mailer, :generate, :config, :logger
|
47
|
-
|
48
|
-
# Takes a query and an optional sourcetype and then runs the query
|
49
|
-
# against the database. The return from the query is then converted
|
50
|
-
# into a DataSet which can then be manipulated.
|
51
|
-
#
|
52
|
-
# Example:
|
53
|
-
# query("SELECT * FROM address_book") do |data|
|
54
|
-
# @report << data.to_csv
|
55
|
-
# end
|
56
|
-
#
|
57
|
-
# The above would select all from the _address_book_ table
|
58
|
-
# and then convert the DataSet to a csv and then add it to the report
|
59
|
-
|
60
|
-
def query ( statement, source = :string, &action )
|
61
|
-
query_text = get_query(source,statement)
|
62
|
-
data = DataSet.new
|
63
|
-
DBI.connect(@dsn, @user, @password) do |dbh|
|
64
|
-
dbh.execute(query_text) do |sth|
|
65
|
-
if sth.rows > 0
|
66
|
-
results = sth.fetch_all
|
67
|
-
data.fields = sth.column_names
|
68
|
-
results.each { |row| data << row }
|
69
|
-
action.call(data) if block_given?
|
70
|
-
else
|
71
|
-
data = nil
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
return data || "command succeeded. 0 rows returned"
|
76
|
-
end
|
77
|
-
|
78
|
-
# Evaluates _code_ from _filename_ as pure ruby code for files ending in
|
79
|
-
# .rb, and as ERb templates for anything else.
|
80
|
-
def eval_report( filename, code )
|
81
|
-
if filename =~ /\.rb/
|
82
|
-
eval(code)
|
83
|
-
else
|
84
|
-
ERB.new(code, 0, "%").run(binding)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
# Loads a yaml file into the @config variable which is accessible in
|
89
|
-
# templates. If _interactive_ is set to true, the user will
|
90
|
-
# be prompted to enter information for each key.
|
91
|
-
def load_yaml(file, interactive=false)
|
92
|
-
file = "config/#{file}" unless File.exists? file
|
93
|
-
@config = YAML.load(File.open(file))
|
94
|
-
if (interactive)
|
95
|
-
@config.keys.map { |c| c.to_s }.sort.each do |property|
|
96
|
-
$stderr.print "#{property} (#{@config[property.to_sym]}): "
|
97
|
-
entered = $stdin.gets.strip
|
98
|
-
@config[property] = entered unless entered.eql?("")
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# Creates an SQL Object. The block is evaluated within the SQL
|
104
|
-
# instance so you may use any methods available to the SQL class.
|
105
|
-
# The generated query is returned.
|
106
|
-
#
|
107
|
-
# Example
|
108
|
-
# fetch { from :address_book order :name }
|
109
|
-
# => "SELECT * FROM address_book ORDER BY name
|
110
|
-
|
111
|
-
def fetch( &dsl )
|
112
|
-
begin
|
113
|
-
SQL.new(:SELECT, &dsl).to_s
|
114
|
-
rescue Exception
|
115
|
-
@logger.fatal "Error generating SQL."
|
116
|
-
raise "Error generating SQL."
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
# Returns the query string for queries of type string, file, or db
|
121
|
-
def get_query(type,query)
|
122
|
-
case (type)
|
123
|
-
when :string
|
124
|
-
query
|
125
|
-
when :file
|
126
|
-
load_file( query )
|
127
|
-
when :db
|
128
|
-
query ( "SELECT query FROM #{@query_table} WHERE " +
|
129
|
-
"label LIKE '#{query}';" ) do |data|
|
130
|
-
return data[0]["query"]
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Loads a query from file. Accepts absolute paths, relative paths from
|
136
|
-
# the toplevel directory, and relative paths from _queries/_.
|
137
|
-
# If you've been putting all your database queries in _queries_, you can
|
138
|
-
# just call them by name.
|
139
|
-
def load_file( query_file )
|
140
|
-
begin
|
141
|
-
File.read( query_file ).strip
|
142
|
-
rescue
|
143
|
-
@logger.fatal "Could not open #{query_file}"
|
144
|
-
raise "Could not open #{query_file}"; exit
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def render ( data )
|
149
|
-
builder = Format::Builder.new( data )
|
150
|
-
yield(builder)
|
151
|
-
builder.render
|
152
|
-
end
|
153
|
-
|
154
|
-
# Generates the report. If @pre or @post are defined with lambdas,
|
155
|
-
# they will be called before and after the main code. generate_report
|
156
|
-
# will automatically be run at the end of the execution
|
157
|
-
# of a ruport template unless @generate is set to false.
|
158
|
-
#
|
159
|
-
# If @file != nil, ruport will print to the
|
160
|
-
# file with the specified name. Otherwise, it will print to STDOUT by
|
161
|
-
# default. @file can be set implictly by a file argument, i.e.
|
162
|
-
# ruport templates/foo.rb reports/foo_out.html => @file =
|
163
|
-
# 'reports/foo_out.html' It can also be set explicitly within a template.
|
164
|
-
# A good way to define a default value is @file ||= "reports/somefile"
|
165
|
-
#
|
166
|
-
# Lastly, if you have your mailer configuration set up and
|
167
|
-
# you've specified recipients, the contents of @mailer.body will
|
168
|
-
# be automatically emailed by this fuction.
|
169
|
-
#
|
170
|
-
# The source for this function is probably easier to read than this
|
171
|
-
# explanation, so you may want to start there.
|
172
|
-
def generate_report
|
173
|
-
@pre.call if @pre
|
174
|
-
if (@file.nil?)
|
175
|
-
puts(@report)
|
176
|
-
else
|
177
|
-
File.open(@file,"w") { |f| f.puts @report }
|
178
|
-
end
|
179
|
-
unless @mailer.nil? || @mailer.recipients.empty?
|
180
|
-
@mailer.body = @report unless not @mailer.body.empty?
|
181
|
-
@mailer.send_report(@report_name)
|
182
|
-
end
|
183
|
-
@post.call if @post
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
def add_dsn(label, dsn, user, password )
|
188
|
-
@databases[label] = { :dsn => dsn, :user => user,
|
189
|
-
:password => password }
|
190
|
-
end
|
191
|
-
|
192
|
-
def select_dsn(label)
|
193
|
-
@dsn = @databases[label][:dsn]
|
194
|
-
@user = @databases[label][:user]
|
195
|
-
@password = @databases[label][:password]
|
196
|
-
end
|
197
|
-
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
@@ -1,54 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby
|
2
|
-
# fake_db.rb
|
3
|
-
# Created by Gregory Thomas Brown on 2005-08-02
|
4
|
-
# Copyright 2005 (Gregory Brown) All rights reserved.
|
5
|
-
#
|
6
|
-
# This product is free software, you may distribute it as such
|
7
|
-
# under your choice of the Ruby license or the GNU GPL
|
8
|
-
# See LICENSE for details
|
9
|
-
|
10
|
-
module Ruport
|
11
|
-
module Report
|
12
|
-
class FakeDB
|
13
|
-
|
14
|
-
# Creates a new FakeDB e.g.
|
15
|
-
#
|
16
|
-
# FakeDB.new([ "ruport", "ruport_example",
|
17
|
-
# "localhost", "test", "123"] )
|
18
|
-
#
|
19
|
-
# Which would create a fake database ruport_example at
|
20
|
-
# localhost with the username test and the password 123
|
21
|
-
# using the driver 'ruport'
|
22
|
-
def initialize(args)
|
23
|
-
@db_driver, @db_name, @db_host, @username, @password = *args
|
24
|
-
@data = Hash.new
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
# Verifies account info and retrieves information
|
29
|
-
def process( dsn, user, password, query )
|
30
|
-
if ( dsn.eql?("#{@db_driver}:#{@db_name}:#{@db_host}") and
|
31
|
-
user.eql?(@username) and password.eql?(@password) )
|
32
|
-
@data[query]
|
33
|
-
else
|
34
|
-
throw "Processing Error"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
# Allows query to be looked up in the data
|
40
|
-
def [](query)
|
41
|
-
@data[query]
|
42
|
-
end
|
43
|
-
|
44
|
-
# Used to setup fake queries E.g:
|
45
|
-
#
|
46
|
-
# DataSet#fake_db["SELECT * FROM address_book"] =
|
47
|
-
# DataSet.load("data/addressbook.csv")
|
48
|
-
def []=(query, contents)
|
49
|
-
@data[query] = contents
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby
|
2
|
-
# fake_engine.rb
|
3
|
-
# Created by Gregory Thomas Brown on 2005-08-02
|
4
|
-
# Copyright 2005 (Gregory Brown) All rights reserved.
|
5
|
-
#
|
6
|
-
# This product is free software, you may distribute it as such
|
7
|
-
# under your choice of the Ruby license or the GNU GPL
|
8
|
-
# See LICENSE for details
|
9
|
-
|
10
|
-
module Ruport
|
11
|
-
module Report
|
12
|
-
class FakeEngine < Ruport::Report::Engine
|
13
|
-
|
14
|
-
attr_accessor :fake_db
|
15
|
-
|
16
|
-
|
17
|
-
def query ( query, source = :string, &action)
|
18
|
-
query = get_query(source, query)
|
19
|
-
data = @fake_db.process(@dsn,@user,@password, query)
|
20
|
-
action.call(data) if block_given?
|
21
|
-
return data
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module Ruport
|
2
|
-
module Report
|
3
|
-
class FakeMailer < Mailer
|
4
|
-
|
5
|
-
@@fake_server = Hash.new
|
6
|
-
@@fake_server[:port] = 25
|
7
|
-
|
8
|
-
def self.[]=(key,value)
|
9
|
-
@@fake_server[key] = value
|
10
|
-
end
|
11
|
-
|
12
|
-
def send_report(report_name="No Subject")
|
13
|
-
raise "Invalid Host" unless @@fake_server[:host].eql?(@host)
|
14
|
-
raise "Invalid Account" unless @@fake_server[:account].eql?(@account)
|
15
|
-
raise "Bad Email Address" unless @@fake_server[:address].eql?(@address)
|
16
|
-
raise "Bad Password" unless @@fake_server[:password].eql?(@password)
|
17
|
-
raise "Invalid Port" unless @@fake_server[:port].eql?(@port)
|
18
|
-
raise "Bad Authorization Type" unless @@fake_server[:auth].eql?(@auth)
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/ruport/report/sql.rb
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
# sql.rb:
|
3
|
-
# Generates queries from simple ruby syntax
|
4
|
-
#
|
5
|
-
# Created by Gregory Thomas Brown on 2005-08-02
|
6
|
-
# Copyright 2005 (Gregory Brown) All rights reserved.
|
7
|
-
#
|
8
|
-
# This product is free software, you may distribute it as such
|
9
|
-
# under your choice of the Ruby license or the GNU GPL
|
10
|
-
# See LICENSE for details
|
11
|
-
#
|
12
|
-
# Special thanks and acknowledgement go to James Edward Gray II
|
13
|
-
# for providing the original source code for this application
|
14
|
-
module Ruport
|
15
|
-
module Report
|
16
|
-
class SQL
|
17
|
-
|
18
|
-
# Generates an SQL object which can generate queries.
|
19
|
-
def initialize( statement, &init )
|
20
|
-
@statement = statement
|
21
|
-
|
22
|
-
@fields = Array.new
|
23
|
-
@tables = Array.new
|
24
|
-
@conditions = Array.new
|
25
|
-
@order_by = Array.new
|
26
|
-
|
27
|
-
instance_eval(&init) unless init.nil?
|
28
|
-
end
|
29
|
-
|
30
|
-
#Specifies the fields to select from
|
31
|
-
def columns( *fields )
|
32
|
-
fields.each { |field| @fields << "'#{field}'" }
|
33
|
-
end
|
34
|
-
|
35
|
-
#generates an FROM clause for the given tables
|
36
|
-
def from( *tables )
|
37
|
-
tables.each { |table| @tables << table }
|
38
|
-
end
|
39
|
-
|
40
|
-
# generates a conditional expression.
|
41
|
-
# condition :name, :LIKE, :jim -> "name LIKE 'jim'"
|
42
|
-
def condition( field, operator, match )
|
43
|
-
@conditions << "#{field} #{operator.to_s.upcase} '#{match}'"
|
44
|
-
end
|
45
|
-
|
46
|
-
# generates an ORDER BY clause for list +order+
|
47
|
-
def order( *order )
|
48
|
-
order.each { |table| @order_by << table }
|
49
|
-
end
|
50
|
-
|
51
|
-
# Converts SQL object into a query string
|
52
|
-
def to_s
|
53
|
-
sql = "#{@statement} "
|
54
|
-
|
55
|
-
sql << if @fields.empty?
|
56
|
-
"* "
|
57
|
-
else
|
58
|
-
@fields.join(", ") + " "
|
59
|
-
end
|
60
|
-
|
61
|
-
sql << "FROM #{@tables.join(', ')} "
|
62
|
-
|
63
|
-
unless @conditions.empty?
|
64
|
-
sql << "WHERE #{@conditions.join(' AND ')} "
|
65
|
-
end
|
66
|
-
|
67
|
-
unless @order_by.empty?
|
68
|
-
sql << "ORDER BY #{@order_by.join(', ')} "
|
69
|
-
end
|
70
|
-
|
71
|
-
sql.sub!(/ \Z/, "")
|
72
|
-
sql << ";"
|
73
|
-
|
74
|
-
sql
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
class String
|
80
|
-
def with( other_table, field = nil )
|
81
|
-
if field.nil?
|
82
|
-
"#{self} NATURAL JOIN #{other_table}"
|
83
|
-
else
|
84
|
-
"#{self} LEFT JOIN #{other_table} " +
|
85
|
-
"ON #{self}.#{field} = #{other_table}.#{field}"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
class Symbol
|
91
|
-
def with( other_table, field = nil )
|
92
|
-
to_s.with(other_table, field)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
data/lib/ruportlib.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require "ruport/report/engine"
|
2
|
-
require "ruport/report/mailer"
|
3
|
-
require "ruport/report/sql"
|
4
|
-
require "ruport/report/fake_db"
|
5
|
-
require "ruport/report/fake_engine"
|
6
|
-
require "ruport/report/data_set"
|
7
|
-
require "ruport/report/data_row"
|
8
|
-
require "ruport/report/fake_mailer"
|
9
|
-
require "ruport/format/builder"
|
10
|
-
require "faster_csv"
|
11
|
-
include Ruport
|
data/test/tc_engine.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
#tc_engine.rb
|
2
|
-
#
|
3
|
-
# Created by Gregory Thomas Brown on 2005-08-09
|
4
|
-
# Copyright 2005 (Gregory Brown) All rights reserved.
|
5
|
-
|
6
|
-
require "test/unit"
|
7
|
-
require "ruportlib"
|
8
|
-
class TestEngine < Test::Unit::TestCase
|
9
|
-
def setup
|
10
|
-
@engine = Report::FakeEngine.new( "DBI:mysql:ruport:localhost",
|
11
|
-
"test", "123")
|
12
|
-
@engine.query_table = "ruport_queries"
|
13
|
-
|
14
|
-
@engine.fake_db = Report::FakeDB.new([ "DBI:mysql","ruport",
|
15
|
-
"localhost", "test", "123"])
|
16
|
-
|
17
|
-
@engine.fake_db["SELECT * FROM ruport_test"] = @data =
|
18
|
-
[ { "a" => "a column, row 1", "b" => "b column, row 1",
|
19
|
-
"c" => "c column, row 1", "d" => "d column, row 1" },
|
20
|
-
{ "a" => "a column, row 2", "b" => "b column, row 2",
|
21
|
-
"c" => "c column, row 2", "d" => "d column, row 2" },
|
22
|
-
{ "a" => "a column, row 3", "b" => "b column, row 3",
|
23
|
-
"c" => "c column, row 3", "d" => "d column, row 3" } ]
|
24
|
-
|
25
|
-
@engine.fake_db[ "SELECT query FROM #{@engine.query_table} " +
|
26
|
-
"WHERE label LIKE 'sql_stored_test';"] =
|
27
|
-
[ "query" => "SELECT * FROM ruport_test" ]
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_load_file
|
31
|
-
contents = "SELECT * FROM ruport_test"
|
32
|
-
|
33
|
-
#relative to working dir
|
34
|
-
assert_equal(contents, @engine.load_file("test/test.sql"));
|
35
|
-
|
36
|
-
#absolute path
|
37
|
-
assert_equal(contents,
|
38
|
-
@engine.load_file(File.expand_path("test/test.sql")))
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_sql_generation
|
42
|
-
sql = @engine.fetch do
|
43
|
-
from :ruport_test
|
44
|
-
end
|
45
|
-
assert_equal("SELECT * FROM ruport_test;", sql)
|
46
|
-
sql = @engine.fetch do
|
47
|
-
from :ruport_test
|
48
|
-
condition :last_name, :"=", "Brown"
|
49
|
-
order :first_name
|
50
|
-
end
|
51
|
-
assert_equal("SELECT * FROM ruport_test WHERE last_name = 'Brown' " +
|
52
|
-
"ORDER BY first_name;",sql)
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_load_yaml
|
56
|
-
config_hash = { :name => "Greg",
|
57
|
-
:friend => "Rob",
|
58
|
-
:job => "Programmer" }
|
59
|
-
@engine.load_yaml "test/test.yaml"
|
60
|
-
config_hash.each do |key, value|
|
61
|
-
assert_equal(value,@engine.config[key])
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_sql_file
|
66
|
-
@engine.query("test/test.sql",:file) do |result|
|
67
|
-
assert_equal(@data,result)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_sql_stored
|
72
|
-
@engine.query("sql_stored_test",:db) do |result|
|
73
|
-
assert_equal(@data,result)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_query
|
78
|
-
@engine.query("SELECT * FROM ruport_test") do |result|
|
79
|
-
assert_equal(@data,result)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_render
|
84
|
-
data = Report::DataSet.new
|
85
|
-
data.fields = %w[ col1 col2 col3]
|
86
|
-
data << %w[ a b c]
|
87
|
-
data << %w[ d e f]
|
88
|
-
assert_equal("col1,col2,col3\na,b,c\nd,e,f\n",
|
89
|
-
@engine.render(data) do |builder|
|
90
|
-
builder.format = :csv
|
91
|
-
end )
|
92
|
-
|
93
|
-
assert_equal("<table>\n <tr>\n <th>col1</th><th>col2</th>" +
|
94
|
-
"<th>col3</th>\n </tr>\n" +
|
95
|
-
" <tr>\n <td>a</td><td>b</td><td>c</td>\n </tr>\n" +
|
96
|
-
" <tr>\n <td>d</td><td>e</td><td>f</td>\n </tr>\n" +
|
97
|
-
"</table>", @engine.render(data) do |builder|
|
98
|
-
builder.format = :html
|
99
|
-
end )
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|