nitro 0.1.2 → 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 +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
|