ruport 0.1.0 → 0.2.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/AUTHORS +1 -0
- data/CHANGELOG +45 -0
- data/README +32 -13
- data/Rakefile +48 -51
- data/TODO +36 -23
- data/bin/ruport +75 -57
- data/lib/ruport/db/data_row.rb +64 -0
- data/lib/ruport/db/data_set.rb +101 -0
- data/lib/ruport/db/mailer.rb +42 -0
- data/lib/ruport/db/mock_db.rb +49 -0
- data/lib/ruport/db/mock_report.rb +44 -0
- data/lib/ruport/db/report.rb +212 -0
- data/lib/ruport/db/sql.rb +93 -0
- data/lib/ruport/format/chart.rb +1 -0
- data/lib/ruportlib.rb +7 -0
- data/test/tc_data_row.rb +53 -0
- data/test/tc_data_set.rb +67 -0
- data/test/tc_report.rb +104 -0
- data/test/ts_all.rb +4 -0
- metadata +20 -20
- data/bin/ruport.rb +0 -4
- data/lib/mailer.rb +0 -44
- data/lib/query.rb +0 -140
- data/lib/sql.rb +0 -93
- data/setup.rb +0 -1360
- data/tests/tc_ruport.rb +0 -69
@@ -0,0 +1,93 @@
|
|
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
|
+
class SQL
|
15
|
+
|
16
|
+
# Generates an SQL object which can generate queries.
|
17
|
+
def initialize( statement, &init )
|
18
|
+
@statement = statement
|
19
|
+
|
20
|
+
@fields = Array.new
|
21
|
+
@tables = Array.new
|
22
|
+
@conditions = Array.new
|
23
|
+
@order_by = Array.new
|
24
|
+
|
25
|
+
instance_eval(&init) unless init.nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
#Specifies the fields to select from
|
29
|
+
def columns( *fields )
|
30
|
+
fields.each { |field| @fields << "'#{field}'" }
|
31
|
+
end
|
32
|
+
|
33
|
+
#generates an FROM clause for the given tables
|
34
|
+
def from( *tables )
|
35
|
+
tables.each { |table| @tables << table }
|
36
|
+
end
|
37
|
+
|
38
|
+
# generates a conditional expression.
|
39
|
+
# condition :name, :LIKE, :jim -> "name LIKE 'jim'"
|
40
|
+
def condition( field, operator, match )
|
41
|
+
@conditions << "#{field} #{operator.to_s.upcase} '#{match}'"
|
42
|
+
end
|
43
|
+
|
44
|
+
# generates an ORDER BY clause for list +order+
|
45
|
+
def order( *order )
|
46
|
+
order.each { |table| @order_by << table }
|
47
|
+
end
|
48
|
+
|
49
|
+
# Converts SQL object into a query string
|
50
|
+
def to_s
|
51
|
+
sql = "#{@statement} "
|
52
|
+
|
53
|
+
sql << if @fields.empty?
|
54
|
+
"* "
|
55
|
+
else
|
56
|
+
@fields.join(", ") + " "
|
57
|
+
end
|
58
|
+
|
59
|
+
sql << "FROM #{@tables.join(', ')} "
|
60
|
+
|
61
|
+
unless @conditions.empty?
|
62
|
+
sql << "WHERE #{@conditions.join(' AND ')} "
|
63
|
+
end
|
64
|
+
|
65
|
+
unless @order_by.empty?
|
66
|
+
sql << "ORDER BY #{@order_by.join(', ')} "
|
67
|
+
end
|
68
|
+
|
69
|
+
sql.sub!(/ \Z/, "")
|
70
|
+
sql << ";"
|
71
|
+
|
72
|
+
sql
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class String
|
77
|
+
def with( other_table, field = nil )
|
78
|
+
if field.nil?
|
79
|
+
"#{self} NATURAL JOIN #{other_table}"
|
80
|
+
else
|
81
|
+
"#{self} LEFT JOIN #{other_table} " +
|
82
|
+
"ON #{self}.#{field} = #{other_table}.#{field}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class Symbol
|
88
|
+
def with( other_table, field = nil )
|
89
|
+
to_s.with(other_table, field)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
# Do me!
|
data/lib/ruportlib.rb
ADDED
data/test/tc_data_row.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "ruportlib"
|
5
|
+
|
6
|
+
class TestDataRow < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@rows = DataSet.new
|
9
|
+
@rows.fields = %w[ foo bar ]
|
10
|
+
@rows << [ 1 , 2 ]
|
11
|
+
@rows << [ 3 , 4 ]
|
12
|
+
@rows << [ 5 , 6 ]
|
13
|
+
@rows << { "foo" => 7, "bar" => 8 }
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_first?
|
17
|
+
assert(@rows[0].first?)
|
18
|
+
@rows[1..-1].each do |row|
|
19
|
+
assert(!row.first?)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_middle?
|
24
|
+
assert(!@rows[0].middle?)
|
25
|
+
assert(!@rows[-1].middle?)
|
26
|
+
@rows[1..-2].each do |row|
|
27
|
+
assert(row.middle?)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_last?
|
32
|
+
@rows[0..-2].each do |row|
|
33
|
+
assert(!row.last?)
|
34
|
+
end
|
35
|
+
assert(@rows[-1].last?)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_oddity
|
39
|
+
@rows[0..-1].each_with_index do |row,index|
|
40
|
+
if (index % 2 == 0)
|
41
|
+
assert(row.even?)
|
42
|
+
else
|
43
|
+
assert(row.odd?)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_to_s
|
49
|
+
assert_equal("[1,2]",@rows[0].to_s)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
data/test/tc_data_set.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "ruportlib"
|
5
|
+
|
6
|
+
class TestDataSet < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@data = DataSet.new
|
9
|
+
@data.fields = %w[ col1 col2 col3 ]
|
10
|
+
@data.default = ""
|
11
|
+
@data << %w[ a b c ]
|
12
|
+
@data << { "col1" => "d", "col3" => "e"}
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_fields
|
16
|
+
assert_equal(%w[ col1 col2 col3 ], @data.fields )
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_default
|
20
|
+
@data.default = "x"
|
21
|
+
@data << { }
|
22
|
+
assert_equal( ['x','x','x'],
|
23
|
+
@data[2].to_a )
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_brackets
|
27
|
+
row0 = { "col1" => "a", "col2" => "b", "col3" => "c" }
|
28
|
+
row1 = { "col1" => "d", "col2" => "", "col3" => "e" }
|
29
|
+
row0.each do |key,value|
|
30
|
+
assert_equal( value, @data[0][key] )
|
31
|
+
end
|
32
|
+
row1.each do |key,value|
|
33
|
+
assert_equal( value, @data[1][key] )
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_eql?
|
38
|
+
data2 = DataSet.new
|
39
|
+
data2.fields = %w[ col1 col2 col3 ]
|
40
|
+
data2.default = ""
|
41
|
+
data2 << %w[ a b c ]
|
42
|
+
data2 << { "col1" => "d", "col3" => "e" }
|
43
|
+
|
44
|
+
#FIXME: This looks like some shady discrete math assignment
|
45
|
+
assert(@data.eql?(data2) && data2.eql?(@data))
|
46
|
+
data2 << [2, 3, 4]
|
47
|
+
assert(!( @data.eql?(data2) || data2.eql?(@data) ))
|
48
|
+
@data << [2, 3, 4]
|
49
|
+
assert(@data.eql?(data2) && data2.eql?(@data))
|
50
|
+
@data << [8, 9, 10]
|
51
|
+
assert(!( @data.eql?(data2) || data2.eql?(@data) ))
|
52
|
+
data2 << [8, 9, 10]
|
53
|
+
assert(@data.eql?(data2) && data2.eql?(@data))
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_load
|
57
|
+
loaded_data = DataSet.load("test/data.csv")
|
58
|
+
assert(@data.eql?(loaded_data))
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_to_csv
|
62
|
+
loaded_data = DataSet.load("test/data.csv" )
|
63
|
+
csv = loaded_data.to_csv
|
64
|
+
assert_equal("col1,col2,col3\na,b,c\nd,\"\",e\n",csv)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
data/test/tc_report.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
#tc_ruport.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 "lib/ruportlib"
|
8
|
+
class TestRuport < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@report = MockReport.new( "DBI:mysql:ruport:localhost", "test", "123")
|
12
|
+
@report.query_table = "ruport_queries"
|
13
|
+
|
14
|
+
@report.fake_db = MockDB.new([ "DBI:mysql","ruport",
|
15
|
+
"localhost", "test", "123"])
|
16
|
+
|
17
|
+
@report.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
|
+
@report.fake_db[ "SELECT query FROM #{@report.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, @report.load_file("test/test.sql"));
|
35
|
+
|
36
|
+
#absolute path
|
37
|
+
assert_equal(contents,
|
38
|
+
@report.load_file(File.expand_path("test/test.sql")))
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_sql_generation
|
42
|
+
sql = @report.fetch do
|
43
|
+
from :ruport_test
|
44
|
+
end
|
45
|
+
assert_equal("SELECT * FROM ruport_test;", sql)
|
46
|
+
sql = @report.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
|
+
@report.load_yaml "test/test.yaml"
|
60
|
+
config_hash.each do |key, value|
|
61
|
+
assert_equal(value,@report.config[key])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_sql
|
66
|
+
row_i = 0
|
67
|
+
@report.select("* FROM ruport_test") do |row|
|
68
|
+
assert_equal(@data[row_i]["a"], row["a"].to_s)
|
69
|
+
assert_equal(@data[row_i]["b"], row["b"].to_s)
|
70
|
+
assert_equal(@data[row_i]["c"], row["c"].to_s)
|
71
|
+
assert_equal(@data[row_i]["d"], row["d"].to_s)
|
72
|
+
row_i += 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_sql_file
|
77
|
+
row_i = 0
|
78
|
+
@report.select("test/test.sql",:file) do |row|
|
79
|
+
assert_equal(@data[row_i]["a"], row["a"].to_s)
|
80
|
+
assert_equal(@data[row_i]["b"], row["b"].to_s)
|
81
|
+
assert_equal(@data[row_i]["c"], row["c"].to_s)
|
82
|
+
assert_equal(@data[row_i]["d"], row["d"].to_s)
|
83
|
+
row_i += 1
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_sql_stored
|
88
|
+
row_i = 0
|
89
|
+
@report.select("sql_stored_test",:db) do |row|
|
90
|
+
assert_equal(@data[row_i]["a"], row["a"].to_s)
|
91
|
+
assert_equal(@data[row_i]["b"], row["b"].to_s)
|
92
|
+
assert_equal(@data[row_i]["c"], row["c"].to_s)
|
93
|
+
assert_equal(@data[row_i]["d"], row["d"].to_s)
|
94
|
+
row_i += 1
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_query
|
99
|
+
@report.query("SELECT * FROM ruport_test") do |result|
|
100
|
+
assert(@data,result)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
data/test/ts_all.rb
ADDED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruport
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2005-08
|
6
|
+
version: 0.2.0
|
7
|
+
date: 2005-11-08
|
8
8
|
summary: A generalized Ruby report generation and templating engine.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -27,16 +27,25 @@ platform: ruby
|
|
27
27
|
authors:
|
28
28
|
- Gregory Brown
|
29
29
|
files:
|
30
|
-
-
|
31
|
-
- lib/
|
32
|
-
- lib/
|
33
|
-
- lib/
|
34
|
-
-
|
30
|
+
- lib/ruportlib.rb
|
31
|
+
- lib/ruport/db/data_row.rb
|
32
|
+
- lib/ruport/db/data_set.rb
|
33
|
+
- lib/ruport/db/mailer.rb
|
34
|
+
- lib/ruport/db/mock_db.rb
|
35
|
+
- lib/ruport/db/mock_report.rb
|
36
|
+
- lib/ruport/db/report.rb
|
37
|
+
- lib/ruport/db/sql.rb
|
38
|
+
- lib/ruport/format/chart.rb
|
39
|
+
- test/tc_data_row.rb
|
40
|
+
- test/tc_data_set.rb
|
41
|
+
- test/tc_report.rb
|
42
|
+
- test/ts_all.rb
|
35
43
|
- Rakefile
|
36
|
-
- setup.rb
|
37
44
|
- README
|
38
45
|
- LICENSE
|
39
46
|
- TODO
|
47
|
+
- AUTHORS
|
48
|
+
- CHANGELOG
|
40
49
|
test_files: []
|
41
50
|
rdoc_options:
|
42
51
|
- "--title"
|
@@ -47,19 +56,10 @@ extra_rdoc_files:
|
|
47
56
|
- README
|
48
57
|
- LICENSE
|
49
58
|
- TODO
|
59
|
+
- AUTHORS
|
60
|
+
- CHANGELOG
|
50
61
|
executables:
|
51
62
|
- ruport
|
52
|
-
- ruport.rb
|
53
63
|
extensions: []
|
54
64
|
requirements: []
|
55
|
-
dependencies:
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: parseinput
|
58
|
-
version_requirement:
|
59
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
60
|
-
requirements:
|
61
|
-
-
|
62
|
-
- ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: 0.0.1
|
65
|
-
version:
|
65
|
+
dependencies: []
|
data/bin/ruport.rb
DELETED
data/lib/mailer.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
# mailer.rb
|
2
|
-
|
3
|
-
# Created by Gregory Brown on 2005-08-16
|
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
|
-
require "net/smtp"
|
11
|
-
class Mailer
|
12
|
-
|
13
|
-
# Creates a new Mailer object. User must specify their mail host, email
|
14
|
-
# address, and account. Password, port, and authentication method are all
|
15
|
-
# optional.
|
16
|
-
def initialize(host, address, account, password=nil, port=25, authentication=nil)
|
17
|
-
@host = host
|
18
|
-
@account = account
|
19
|
-
@password = password
|
20
|
-
@address = address
|
21
|
-
@port = port
|
22
|
-
@auth = authentication
|
23
|
-
@recipients = []
|
24
|
-
@body = ""
|
25
|
-
end
|
26
|
-
|
27
|
-
#A list of email addresses to send the message to.
|
28
|
-
attr_accessor :recipients
|
29
|
-
|
30
|
-
#The body of the message to be sent
|
31
|
-
attr_accessor :body
|
32
|
-
|
33
|
-
# This takes _report_name_ as argument and sends the contents of @body to
|
34
|
-
# @recipients
|
35
|
-
def send_report(report_name)
|
36
|
-
return if @body.empty?
|
37
|
-
Net::SMTP.start(@host,@port,@host,@account,@password,@auth) do |smtp|
|
38
|
-
smtp.send_message( "Subject: #{report_name}\n\n#{@body}",
|
39
|
-
@address,
|
40
|
-
@recipients )
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|