nitro 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -0
- data/ChangeLog +83 -0
- data/LICENCE +8 -8
- data/README +5 -1
- data/RELEASES +9 -0
- data/Rakefile +43 -23
- data/bin/cluster.rb +15 -12
- data/examples/ndb/README +5 -0
- data/examples/ndb/run.rb +271 -0
- data/examples/simple/README +27 -0
- data/examples/simple/app.rb +2 -2
- data/examples/simple/conf/config.rb +3 -8
- data/examples/simple/conf/debug-config.rb +6 -7
- data/examples/simple/conf/live-config.rb +2 -4
- data/examples/simple/conf/requires.rb +2 -10
- data/examples/simple/ctl +1 -1
- data/examples/simple/env.rb +2 -2
- data/examples/simple/root/article-form.ss +1 -1
- data/examples/simple/root/comments-form.ss +1 -1
- data/examples/tiny/README +15 -0
- data/examples/tiny/app.rb +2 -2
- data/examples/tiny/conf/config.rb +8 -13
- data/examples/tiny/conf/requires.rb +2 -8
- data/examples/tiny/ctl +2 -17
- data/examples/tiny/root/index.sx +1 -1
- data/lib/n/app/cluster.rb +15 -12
- data/lib/n/app/cookie.rb +10 -9
- data/lib/n/app/filters/autologin.rb +5 -4
- data/lib/n/app/fragment.rb +13 -10
- data/lib/n/app/handlers.rb +29 -22
- data/lib/n/app/handlers/code-handler.rb +2 -4
- data/lib/n/app/handlers/page-handler.rb +3 -5
- data/lib/n/app/request-part.rb +2 -7
- data/lib/n/app/request.rb +27 -22
- data/lib/n/app/script.rb +4 -15
- data/lib/n/app/server.rb +11 -7
- data/lib/n/app/session.rb +7 -11
- data/lib/n/app/user.rb +10 -11
- data/lib/n/app/webrick-servlet.rb +23 -10
- data/lib/n/app/webrick.rb +13 -10
- data/lib/n/application.rb +13 -6
- data/lib/n/config.rb +18 -7
- data/lib/n/db.rb +56 -40
- data/lib/n/db/connection.rb +18 -22
- data/lib/n/db/managed.rb +6 -8
- data/lib/n/db/mixins.rb +4 -7
- data/lib/n/db/mysql.rb +6 -3
- data/lib/n/db/psql.rb +15 -10
- data/lib/n/db/tools.rb +5 -9
- data/lib/n/db/utils.rb +11 -8
- data/lib/n/events.rb +14 -10
- data/lib/n/logger.rb +8 -2
- data/lib/n/macros.rb +5 -2
- data/lib/n/parts.rb +13 -10
- data/lib/n/properties.rb +17 -12
- data/lib/n/server.rb +3 -2
- data/lib/n/server/filter.rb +2 -4
- data/lib/n/shaders.rb +11 -13
- data/lib/n/sitemap.rb +23 -20
- data/lib/n/std.rb +15 -4
- data/lib/n/sync/clc.rb +4 -2
- data/lib/n/sync/handler.rb +20 -12
- data/lib/n/sync/server.rb +24 -18
- data/lib/n/ui/date-select.rb +2 -4
- data/lib/n/ui/pager.rb +10 -8
- data/lib/n/ui/popup.rb +5 -4
- data/lib/n/ui/select.rb +3 -4
- data/lib/n/ui/tabs.rb +3 -4
- data/lib/n/utils/array.rb +6 -14
- data/lib/n/utils/cache.rb +3 -7
- data/lib/n/utils/gfx.rb +5 -6
- data/lib/n/utils/hash.rb +7 -12
- data/lib/n/utils/html.rb +8 -4
- data/lib/n/utils/http.rb +10 -6
- data/lib/n/utils/mail.rb +6 -6
- data/lib/n/utils/number.rb +3 -4
- data/lib/n/utils/pool.rb +5 -8
- data/lib/n/utils/string.rb +12 -10
- data/lib/n/utils/template.rb +3 -5
- data/lib/n/utils/time.rb +7 -5
- data/lib/n/utils/uri.rb +5 -4
- data/lib/p/README +1 -0
- data/lib/xsl/xforms.xsl +2 -0
- data/test/n/app/tc_cookie.rb +34 -0
- data/test/n/app/tc_request.rb +70 -0
- data/test/n/app/tc_requestpart.rb +28 -0
- data/test/n/app/tc_session.rb +34 -0
- data/test/n/tc_db.rb +223 -0
- data/test/n/tc_db_mysql.rb +241 -0
- data/test/n/tc_events.rb +44 -0
- data/test/n/tc_properties.rb +68 -0
- data/test/n/tc_sitemap.rb +37 -0
- data/test/n/ui/tc_pager.rb +52 -0
- data/test/n/utils/tc_cache.rb +47 -0
- data/test/n/utils/tc_hash.rb +39 -0
- data/test/n/utils/tc_html.rb +79 -0
- data/test/n/utils/tc_http.rb +18 -0
- data/test/n/utils/tc_number.rb +21 -0
- data/test/n/utils/tc_strings.rb +149 -0
- data/test/n/utils/tc_uri.rb +100 -0
- metadata +49 -22
- data/doc/css.txt +0 -20
- data/doc/ideas.txt +0 -120
- data/doc/pg.txt +0 -47
- data/doc/svn.txt +0 -82
- data/doc/todo.txt +0 -30
- data/examples/simple/conf/overrides.rb +0 -9
- data/examples/simple/logs/access_log +0 -2
- data/examples/simple/logs/apache.log +0 -3
- data/examples/simple/logs/app.log +0 -1
- data/examples/simple/logs/events.log +0 -1
- data/examples/tiny/conf/apache.conf +0 -100
- data/examples/tiny/logs/access_log +0 -9
- data/examples/tiny/logs/apache.log +0 -9
- data/lib/n/db/make-release.sh +0 -26
- data/lib/n/tools/README +0 -11
- data/lib/xsl/ce.xsl +0 -30
- data/lib/xsl/localization.xsl +0 -23
- data/test/run.rb +0 -95
data/lib/n/utils/html.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
3
|
+
# * Anastasios Koutoumanos <ak@navel.gr>
|
4
|
+
# * Elias Karakoulakis <ekarak@ktismata.com>
|
4
5
|
#
|
5
6
|
# (c) 2004 Navel, all rights reserved.
|
6
|
-
# $Id: html.rb
|
7
|
+
# $Id: html.rb 101 2004-10-22 12:35:39Z gmosx $
|
7
8
|
|
8
9
|
require "uri"
|
9
10
|
require "cgi"
|
@@ -12,6 +13,8 @@ module N;
|
|
12
13
|
|
13
14
|
# = HtmlUtils
|
14
15
|
#
|
16
|
+
# HTML utilities collection.
|
17
|
+
#
|
15
18
|
# === Design:
|
16
19
|
#
|
17
20
|
# Implement as a module to avoid class polution. You can still Ruby's
|
@@ -23,6 +26,7 @@ module N;
|
|
23
26
|
# code
|
24
27
|
#
|
25
28
|
# === TODO:
|
29
|
+
#
|
26
30
|
# - add xxx! versions
|
27
31
|
#
|
28
32
|
module HtmlUtils
|
data/lib/n/utils/http.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# code:: tml, drak, ekarak
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
3
|
+
# * Elias Karakoulakis <ekarak@ktismata.com>
|
6
4
|
#
|
7
5
|
# (c) 2004 Navel, all rights reserved.
|
8
|
-
# $Id: http.rb
|
6
|
+
# $Id: http.rb 101 2004-10-22 12:35:39Z gmosx $
|
9
7
|
|
10
8
|
require "uri"
|
11
9
|
require "cgi"
|
@@ -13,6 +11,10 @@ require "net/http"
|
|
13
11
|
|
14
12
|
module N
|
15
13
|
|
14
|
+
# = HTTP
|
15
|
+
#
|
16
|
+
# HTTP protocol constants.
|
17
|
+
#
|
16
18
|
module HTTP
|
17
19
|
# HTTP protocol EOL constants
|
18
20
|
|
@@ -73,6 +75,8 @@ end
|
|
73
75
|
|
74
76
|
# = HttpUtils
|
75
77
|
#
|
78
|
+
# HTTP utilities collection
|
79
|
+
#
|
76
80
|
module HttpUtils
|
77
81
|
|
78
82
|
# Converts the given time object to an http time string.
|
data/lib/n/utils/mail.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
# = Mail utilities
|
2
|
-
#
|
3
|
-
# A thin wrapper arround net/smtp
|
4
|
-
#
|
5
1
|
# code:
|
6
|
-
# George Moschovitis <gm@navel.gr>
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
7
3
|
#
|
8
4
|
# (c) 2004 Navel, all rights reserved.
|
9
|
-
# $Id: mail.rb
|
5
|
+
# $Id: mail.rb 101 2004-10-22 12:35:39Z gmosx $
|
10
6
|
|
11
7
|
require "net/smtp"
|
12
8
|
|
13
9
|
module N
|
14
10
|
|
11
|
+
# = Mail
|
12
|
+
#
|
13
|
+
# A thin wrapper arround net/smtp
|
14
|
+
#
|
15
15
|
module Mail
|
16
16
|
|
17
17
|
# Send an email
|
data/lib/n/utils/number.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# code: gmosx
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
4
3
|
#
|
5
4
|
# (c) 2004 Navel, all rights reserved.
|
6
|
-
# $Id: number.rb
|
5
|
+
# $Id: number.rb 101 2004-10-22 12:35:39Z gmosx $
|
7
6
|
|
8
7
|
module N;
|
9
8
|
|
data/lib/n/utils/pool.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Generalized object pool implementation.
|
4
|
-
#
|
5
|
-
# code: gmosx
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
6
3
|
#
|
7
4
|
# (c) 2004 Navel, all rights reserved.
|
8
|
-
# $Id: pool.rb
|
5
|
+
# $Id: pool.rb 101 2004-10-22 12:35:39Z gmosx $
|
9
6
|
|
10
7
|
require "thread"
|
11
8
|
require "monitor"
|
@@ -14,8 +11,8 @@ module N
|
|
14
11
|
|
15
12
|
# = Pool
|
16
13
|
#
|
17
|
-
#
|
18
|
-
# both for push and pop.
|
14
|
+
# Generalized object pool implementation. Implemented as a thread
|
15
|
+
# safe stack. Exclusive locking is needed both for push and pop.
|
19
16
|
#
|
20
17
|
# INVESTIGATE: Could use the SizedQueue/Queue.
|
21
18
|
#
|
data/lib/n/utils/string.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
3
|
+
# * Anastasios Koutoumanos <ak@navel.gr>
|
4
|
+
# * Elias Karakoulakis <ekarak@ktismata.com>
|
4
5
|
#
|
5
6
|
# (c) 2004 Navel, all rights reserved.
|
6
|
-
# $Id: string.rb
|
7
|
+
# $Id: string.rb 106 2004-10-25 11:31:11Z gmosx $
|
7
8
|
|
8
9
|
require "uri"
|
9
10
|
|
@@ -11,6 +12,8 @@ module N;
|
|
11
12
|
|
12
13
|
# = StringUtils
|
13
14
|
#
|
15
|
+
# General string utilities collection.
|
16
|
+
#
|
14
17
|
# === Design:
|
15
18
|
#
|
16
19
|
# Implement as a module to avoid class polution. You can
|
@@ -153,6 +156,8 @@ module StringUtils
|
|
153
156
|
return wrapped_string
|
154
157
|
end
|
155
158
|
|
159
|
+
EXTENSION_REGEX = /\.(\w+)$/
|
160
|
+
|
156
161
|
# extracts the extension from a path or filename.
|
157
162
|
#
|
158
163
|
# === Input:
|
@@ -160,17 +165,14 @@ module StringUtils
|
|
160
165
|
#
|
161
166
|
# === Output:
|
162
167
|
# the extension of the filename
|
163
|
-
# returns
|
168
|
+
# returns nil if no exception
|
164
169
|
# the extension is DOWNCASED!
|
165
|
-
|
166
|
-
EXTENSION_REGEX = /\.(\w+)$/
|
167
|
-
|
170
|
+
#
|
168
171
|
def self.extension_from_path(path)
|
169
172
|
if md = EXTENSION_REGEX.match(path)
|
170
173
|
return md[1].downcase
|
171
174
|
else
|
172
|
-
|
173
|
-
return ""
|
175
|
+
return nil
|
174
176
|
end
|
175
177
|
end
|
176
178
|
|
data/lib/n/utils/template.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
|
-
# = Template
|
2
|
-
#
|
3
|
-
# A simple templating mechanism.
|
4
|
-
#
|
5
1
|
# code:
|
6
|
-
# George Moschovitis <gm@navel.gr>
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
7
3
|
#
|
8
4
|
# (c) 2004 Navel, all rights reserved.
|
9
5
|
# $Id$
|
@@ -12,6 +8,8 @@ module N;
|
|
12
8
|
|
13
9
|
# = Template
|
14
10
|
#
|
11
|
+
# A simple templating mechanism.
|
12
|
+
#
|
15
13
|
class Template
|
16
14
|
attr_accessor :body
|
17
15
|
|
data/lib/n/utils/time.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# code: gmosx
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
4
3
|
#
|
5
4
|
# (c) 2004 Navel, all rights reserved.
|
6
|
-
# $Id: time.rb
|
5
|
+
# $Id: time.rb 101 2004-10-22 12:35:39Z gmosx $
|
7
6
|
|
8
7
|
require "time.rb"
|
9
8
|
|
@@ -11,6 +10,8 @@ module N;
|
|
11
10
|
|
12
11
|
# = TimeUtils
|
13
12
|
#
|
13
|
+
# General time utilities collection
|
14
|
+
#
|
14
15
|
# === Design:
|
15
16
|
#
|
16
17
|
# Implement as a module to avoid class polution. You can
|
@@ -29,7 +30,7 @@ module TimeUtils
|
|
29
30
|
NEVER = Time.mktime(2038)
|
30
31
|
ZERO = Time.mktime(1972)
|
31
32
|
|
32
|
-
#
|
33
|
+
# Convert the time to a nice String representation.
|
33
34
|
#
|
34
35
|
def self.date_time(time)
|
35
36
|
return nil unless time
|
@@ -89,3 +90,4 @@ module TimeUtils
|
|
89
90
|
end
|
90
91
|
|
91
92
|
end # module
|
93
|
+
|
data/lib/n/utils/uri.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# code: gmosx
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
4
3
|
#
|
5
4
|
# (c) 2004 Navel, all rights reserved.
|
6
|
-
# $Id: uri.rb
|
5
|
+
# $Id: uri.rb 101 2004-10-22 12:35:39Z gmosx $
|
7
6
|
|
8
7
|
require "uri"
|
9
8
|
require "cgi"
|
@@ -14,6 +13,8 @@ module N
|
|
14
13
|
|
15
14
|
# = UriUtils
|
16
15
|
#
|
16
|
+
# URI utilities collection
|
17
|
+
#
|
17
18
|
# === Design:
|
18
19
|
#
|
19
20
|
# Implement as a module to avoid class polution. You can still
|
data/lib/p/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Add Web Application Framework parts in this directory
|
data/lib/xsl/xforms.xsl
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "n/app/cookie"
|
6
|
+
|
7
|
+
include N::App
|
8
|
+
|
9
|
+
|
10
|
+
class TC_Cookie < Test::Unit::TestCase
|
11
|
+
# :nodoc: all
|
12
|
+
|
13
|
+
def setup
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_initialize
|
20
|
+
# bug: default path should be /
|
21
|
+
cookie = Cookie.new("nsid", "24324234234234234")
|
22
|
+
assert_equal("/", cookie.path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_parse
|
26
|
+
res = Cookie.parse("nsid=293230807; nauth=gmosx:meMXs0ifW7JBQ; koko=123&345")
|
27
|
+
|
28
|
+
assert_equal("293230807", res["nsid"][0])
|
29
|
+
assert_equal("gmosx:meMXs0ifW7JBQ", res["nauth"][0])
|
30
|
+
assert_equal("123", res["koko"][0])
|
31
|
+
assert_equal("345", res["koko"][1])
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "n/logger"; $log = Logger.new(STDERR) unless $log
|
6
|
+
|
7
|
+
require "n/app/cookie"
|
8
|
+
require "n/app/request"
|
9
|
+
|
10
|
+
include N::App
|
11
|
+
|
12
|
+
class TC_Request < Test::Unit::TestCase
|
13
|
+
# :nodoc: all
|
14
|
+
|
15
|
+
def setup
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
end
|
20
|
+
=begin
|
21
|
+
def test_parse
|
22
|
+
request = N::App::Request.new
|
23
|
+
|
24
|
+
request.parse_cookies("nsid=293230807; nauth=gmosx:meMXs0ifW7JBQ; koko=123&345")
|
25
|
+
|
26
|
+
# empty cookie should be converted to nil.
|
27
|
+
assert_nil(request.get_cookie("nonexisting-cookie"))
|
28
|
+
|
29
|
+
assert_equal("293230807", request.get_cookie("nsid"))
|
30
|
+
assert_equal("gmosx:meMXs0ifW7JBQ", request.get_cookie("nauth"))
|
31
|
+
|
32
|
+
# multivalued cookie
|
33
|
+
assert_equal(2, request.get_cookie("koko").length)
|
34
|
+
|
35
|
+
assert_equal("123", request.get_cookie("koko")[0])
|
36
|
+
assert_equal("345", request.get_cookie("koko")[1])
|
37
|
+
end
|
38
|
+
=end
|
39
|
+
def test_get_cookie
|
40
|
+
# bug: call get_cookie w/o cookies.
|
41
|
+
request = N::App::Request.new
|
42
|
+
request.in_cookies = nil
|
43
|
+
assert_nothing_raised {
|
44
|
+
request.get_cookie("test")
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_tx
|
49
|
+
request = N::App::Request.new
|
50
|
+
request.session = {}
|
51
|
+
request.parameters = {}
|
52
|
+
|
53
|
+
request.new_tx_entity!(1)
|
54
|
+
assert_equal(1, request.session["TXSEQ"])
|
55
|
+
|
56
|
+
request.new_tx_entity!("test")
|
57
|
+
assert_equal(2, request.session["TXSEQ"])
|
58
|
+
|
59
|
+
assert_equal("TX2", request["txid"])
|
60
|
+
|
61
|
+
assert_equal("test", request.get_tx_entity())
|
62
|
+
request.update_tx_entity!("changed")
|
63
|
+
assert_equal("changed", request.get_tx_entity())
|
64
|
+
assert_equal(2, request.session["TXSEQ"])
|
65
|
+
|
66
|
+
request.del_tx_entity!;
|
67
|
+
assert_equal(nil, request.get_tx_entity())
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "n/app/cookie"
|
6
|
+
require "n/app/request"
|
7
|
+
|
8
|
+
include N::App
|
9
|
+
|
10
|
+
class TC_N2_Web_Server_RequestPart < Test::Unit::TestCase # :nodoc: all
|
11
|
+
# :nodoc: all
|
12
|
+
|
13
|
+
def setup
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_filename
|
20
|
+
part = RequestPart.new("/home/gmosx/files/pic.gif", "tmp/1232132.0", nil)
|
21
|
+
assert_equal("pic.gif", part.filename)
|
22
|
+
|
23
|
+
# bug: handle \ as separator
|
24
|
+
part = RequestPart.new('C:\gmosx\files\pic.gif', "tmp/1232132.0", nil)
|
25
|
+
assert_equal("pic.gif", part.filename)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# :nodoc: all
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "n/app/session"
|
6
|
+
|
7
|
+
include N::App
|
8
|
+
|
9
|
+
class TC_N2_Web_Server_Session < Test::Unit::TestCase
|
10
|
+
# :nodoc: all
|
11
|
+
|
12
|
+
def setup
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_calculate_id
|
19
|
+
id1 = Session.calculate_id
|
20
|
+
id2 = Session.calculate_id
|
21
|
+
id3 = Session.calculate_id
|
22
|
+
id4 = Session.calculate_id
|
23
|
+
id5 = Session.calculate_id
|
24
|
+
id6 = Session.calculate_id
|
25
|
+
|
26
|
+
assert_not_equal(id1, id2)
|
27
|
+
assert_not_equal(id2, id3)
|
28
|
+
assert_not_equal(id3, id4)
|
29
|
+
assert_not_equal(id4, id5)
|
30
|
+
assert_not_equal(id5, id6)
|
31
|
+
assert_not_equal(id1, id6)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/test/n/tc_db.rb
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "n/logger"; $log = Logger.new(STDERR) unless $log
|
4
|
+
|
5
|
+
require "n/db"
|
6
|
+
|
7
|
+
module Test # :nodoc: all
|
8
|
+
|
9
|
+
class Article
|
10
|
+
manage {
|
11
|
+
include N::Entity
|
12
|
+
|
13
|
+
prop_accessor String, :title, :body
|
14
|
+
}
|
15
|
+
|
16
|
+
def self.__descendants_classes
|
17
|
+
[Message]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Message
|
22
|
+
manage {
|
23
|
+
include N::Entity
|
24
|
+
include N::Named
|
25
|
+
include N::Child
|
26
|
+
include N::ParentClass
|
27
|
+
|
28
|
+
include N::Sequenced
|
29
|
+
|
30
|
+
prop_accessor Fixnum, :owner_oid
|
31
|
+
prop_accessor Fixnum, "smallint", :val1, :val2, :val3
|
32
|
+
prop_accessor String, :title, :body
|
33
|
+
prop_accessor String, "text NOT NULL", :test
|
34
|
+
prop_accessor Fixnum, :count
|
35
|
+
prop_accessor Time, :create_time
|
36
|
+
sql_index "owner_oid, pid"
|
37
|
+
|
38
|
+
# a marshaled property
|
39
|
+
prop_accessor Array, :options
|
40
|
+
}
|
41
|
+
|
42
|
+
def initialize
|
43
|
+
@create_time = Time.now
|
44
|
+
@options = []
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
class SubMessage < Message
|
50
|
+
manage {
|
51
|
+
# duplicate definition
|
52
|
+
prop_accessor Float, :count
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
class TC_N_Db < Test::Unit::TestCase
|
57
|
+
|
58
|
+
def setup
|
59
|
+
$db = N::Db.new(
|
60
|
+
:backend => "psql",
|
61
|
+
:address => "localhost",
|
62
|
+
:database => "test",
|
63
|
+
:user => "postgres",
|
64
|
+
:password => "navelrulez",
|
65
|
+
:connection_count => 2
|
66
|
+
)
|
67
|
+
|
68
|
+
@art = Article.new()
|
69
|
+
@art.title = "The parent"
|
70
|
+
@art.body = "The body"
|
71
|
+
|
72
|
+
@msg1 = Message.new()
|
73
|
+
@msg1.name = "name1"
|
74
|
+
@msg1.body = "body1"
|
75
|
+
@msg1.title = "title1"
|
76
|
+
@msg1.count = "22"
|
77
|
+
@msg1.owner_oid = 1
|
78
|
+
|
79
|
+
@msg2 = Message.new()
|
80
|
+
@msg2.name = "name2"
|
81
|
+
@msg2.body = "body2"
|
82
|
+
@msg2.title = "title2"
|
83
|
+
@msg2.count = "22"
|
84
|
+
@msg2.owner_oid = 2
|
85
|
+
end
|
86
|
+
|
87
|
+
def teardown
|
88
|
+
@art = @msg1 = @msg2 = nil
|
89
|
+
$db.shutdown()
|
90
|
+
end
|
91
|
+
|
92
|
+
# gmosx: hmm, implemented in one method to enforce order.
|
93
|
+
#
|
94
|
+
def test_all
|
95
|
+
$db.open { |db|
|
96
|
+
|
97
|
+
# check exception, cleanup test db.
|
98
|
+
|
99
|
+
db.drop_schema()
|
100
|
+
db.drop_table(Article)
|
101
|
+
db.drop_table(Message)
|
102
|
+
|
103
|
+
db.create_schema()
|
104
|
+
|
105
|
+
# bug: get methods without entity table
|
106
|
+
|
107
|
+
db.get(1, Message)
|
108
|
+
|
109
|
+
# check put
|
110
|
+
|
111
|
+
db << @art
|
112
|
+
# one oid is missed when creating the table for the first time!
|
113
|
+
assert_equal(1, @art.oid)
|
114
|
+
|
115
|
+
art2 = Article.new()
|
116
|
+
art2.title = "Another test"
|
117
|
+
db << art2
|
118
|
+
|
119
|
+
@msg1.set_parent(@art)
|
120
|
+
@msg1.options << "test"
|
121
|
+
@msg1.options << "value"
|
122
|
+
@msg1.options << "exit"
|
123
|
+
@msg2.set_parent(@art)
|
124
|
+
|
125
|
+
db << @msg1
|
126
|
+
db << @msg2
|
127
|
+
|
128
|
+
assert_equal(2, @msg2.oid)
|
129
|
+
|
130
|
+
# check marshaling
|
131
|
+
|
132
|
+
msg = db.get(1, Message)
|
133
|
+
assert_equal("value", msg.options[1])
|
134
|
+
# check children.
|
135
|
+
|
136
|
+
msgs = db.children(@art, Message, "ORDER BY count")
|
137
|
+
assert_equal(2, msgs.size())
|
138
|
+
assert_equal(Message, msgs[0].class)
|
139
|
+
|
140
|
+
assert_equal(2, db.count_children(@art, Message))
|
141
|
+
|
142
|
+
# bug: pid was string
|
143
|
+
|
144
|
+
assert_equal(@art.oid, msgs[0].pid)
|
145
|
+
|
146
|
+
# check updates
|
147
|
+
|
148
|
+
@art.title = "CHANGED TITLE"
|
149
|
+
db.update_properties("title='#{@art.title}'", @art)
|
150
|
+
|
151
|
+
art2 = db.get(@art.oid, Article)
|
152
|
+
|
153
|
+
assert_equal(art2.title, @art.title)
|
154
|
+
|
155
|
+
@art.body = "CHANGED BODY"
|
156
|
+
@art.title = "CHANGED AGAIN"
|
157
|
+
db << @art
|
158
|
+
|
159
|
+
art2 = db.get(@art.oid, Article)
|
160
|
+
assert_equal(art2.body, @art.body)
|
161
|
+
assert_equal(art2.title, "CHANGED AGAIN")
|
162
|
+
|
163
|
+
# check timestamp
|
164
|
+
|
165
|
+
now = Time.now()
|
166
|
+
@msg1.create_time = now
|
167
|
+
db << @msg1
|
168
|
+
|
169
|
+
msg = db.get(@msg1.oid, Message)
|
170
|
+
|
171
|
+
# bug:
|
172
|
+
# assert_equal(msg.create_time, @msg1.create_time)
|
173
|
+
assert_equal(msg.create_time.to_i(), @msg1.create_time.to_i())
|
174
|
+
|
175
|
+
# gmosx: not implemented in postgres driver.
|
176
|
+
# classes = db.managed_classes()
|
177
|
+
# assert_equal(2, classes.size())
|
178
|
+
|
179
|
+
# get_by_name
|
180
|
+
|
181
|
+
msg = db.get_by_name("name2", Message)
|
182
|
+
assert_equal("body2", msg.body)
|
183
|
+
|
184
|
+
# pclass
|
185
|
+
|
186
|
+
assert_equal(@art.class.to_s(), msg.pclass)
|
187
|
+
|
188
|
+
}
|
189
|
+
|
190
|
+
# deserialize = false
|
191
|
+
|
192
|
+
$db.open(deserialize = false) { |db|
|
193
|
+
|
194
|
+
assert_equal(false, db.deserialize)
|
195
|
+
|
196
|
+
msg = db.get_by_name("name2", Message)
|
197
|
+
assert_equal(Array, msg.class)
|
198
|
+
|
199
|
+
art = db.get(2, Article)
|
200
|
+
assert_equal(Array, art.class)
|
201
|
+
|
202
|
+
}
|
203
|
+
|
204
|
+
# cascade delete
|
205
|
+
|
206
|
+
msgs = $db.children(0, Message)
|
207
|
+
assert_equal(2, msgs.size())
|
208
|
+
|
209
|
+
$db.delete(@art)
|
210
|
+
|
211
|
+
msgs = $db.children(0, Message)
|
212
|
+
assert_equal(nil, msgs)
|
213
|
+
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_sql_table_to_class
|
217
|
+
# assert_equal(Article,
|
218
|
+
# N::DbUtils.sql_table_to_class(N::DbUtils.sql_table(Article)))
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|