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.
Files changed (119) hide show
  1. data/AUTHORS +3 -0
  2. data/ChangeLog +83 -0
  3. data/LICENCE +8 -8
  4. data/README +5 -1
  5. data/RELEASES +9 -0
  6. data/Rakefile +43 -23
  7. data/bin/cluster.rb +15 -12
  8. data/examples/ndb/README +5 -0
  9. data/examples/ndb/run.rb +271 -0
  10. data/examples/simple/README +27 -0
  11. data/examples/simple/app.rb +2 -2
  12. data/examples/simple/conf/config.rb +3 -8
  13. data/examples/simple/conf/debug-config.rb +6 -7
  14. data/examples/simple/conf/live-config.rb +2 -4
  15. data/examples/simple/conf/requires.rb +2 -10
  16. data/examples/simple/ctl +1 -1
  17. data/examples/simple/env.rb +2 -2
  18. data/examples/simple/root/article-form.ss +1 -1
  19. data/examples/simple/root/comments-form.ss +1 -1
  20. data/examples/tiny/README +15 -0
  21. data/examples/tiny/app.rb +2 -2
  22. data/examples/tiny/conf/config.rb +8 -13
  23. data/examples/tiny/conf/requires.rb +2 -8
  24. data/examples/tiny/ctl +2 -17
  25. data/examples/tiny/root/index.sx +1 -1
  26. data/lib/n/app/cluster.rb +15 -12
  27. data/lib/n/app/cookie.rb +10 -9
  28. data/lib/n/app/filters/autologin.rb +5 -4
  29. data/lib/n/app/fragment.rb +13 -10
  30. data/lib/n/app/handlers.rb +29 -22
  31. data/lib/n/app/handlers/code-handler.rb +2 -4
  32. data/lib/n/app/handlers/page-handler.rb +3 -5
  33. data/lib/n/app/request-part.rb +2 -7
  34. data/lib/n/app/request.rb +27 -22
  35. data/lib/n/app/script.rb +4 -15
  36. data/lib/n/app/server.rb +11 -7
  37. data/lib/n/app/session.rb +7 -11
  38. data/lib/n/app/user.rb +10 -11
  39. data/lib/n/app/webrick-servlet.rb +23 -10
  40. data/lib/n/app/webrick.rb +13 -10
  41. data/lib/n/application.rb +13 -6
  42. data/lib/n/config.rb +18 -7
  43. data/lib/n/db.rb +56 -40
  44. data/lib/n/db/connection.rb +18 -22
  45. data/lib/n/db/managed.rb +6 -8
  46. data/lib/n/db/mixins.rb +4 -7
  47. data/lib/n/db/mysql.rb +6 -3
  48. data/lib/n/db/psql.rb +15 -10
  49. data/lib/n/db/tools.rb +5 -9
  50. data/lib/n/db/utils.rb +11 -8
  51. data/lib/n/events.rb +14 -10
  52. data/lib/n/logger.rb +8 -2
  53. data/lib/n/macros.rb +5 -2
  54. data/lib/n/parts.rb +13 -10
  55. data/lib/n/properties.rb +17 -12
  56. data/lib/n/server.rb +3 -2
  57. data/lib/n/server/filter.rb +2 -4
  58. data/lib/n/shaders.rb +11 -13
  59. data/lib/n/sitemap.rb +23 -20
  60. data/lib/n/std.rb +15 -4
  61. data/lib/n/sync/clc.rb +4 -2
  62. data/lib/n/sync/handler.rb +20 -12
  63. data/lib/n/sync/server.rb +24 -18
  64. data/lib/n/ui/date-select.rb +2 -4
  65. data/lib/n/ui/pager.rb +10 -8
  66. data/lib/n/ui/popup.rb +5 -4
  67. data/lib/n/ui/select.rb +3 -4
  68. data/lib/n/ui/tabs.rb +3 -4
  69. data/lib/n/utils/array.rb +6 -14
  70. data/lib/n/utils/cache.rb +3 -7
  71. data/lib/n/utils/gfx.rb +5 -6
  72. data/lib/n/utils/hash.rb +7 -12
  73. data/lib/n/utils/html.rb +8 -4
  74. data/lib/n/utils/http.rb +10 -6
  75. data/lib/n/utils/mail.rb +6 -6
  76. data/lib/n/utils/number.rb +3 -4
  77. data/lib/n/utils/pool.rb +5 -8
  78. data/lib/n/utils/string.rb +12 -10
  79. data/lib/n/utils/template.rb +3 -5
  80. data/lib/n/utils/time.rb +7 -5
  81. data/lib/n/utils/uri.rb +5 -4
  82. data/lib/p/README +1 -0
  83. data/lib/xsl/xforms.xsl +2 -0
  84. data/test/n/app/tc_cookie.rb +34 -0
  85. data/test/n/app/tc_request.rb +70 -0
  86. data/test/n/app/tc_requestpart.rb +28 -0
  87. data/test/n/app/tc_session.rb +34 -0
  88. data/test/n/tc_db.rb +223 -0
  89. data/test/n/tc_db_mysql.rb +241 -0
  90. data/test/n/tc_events.rb +44 -0
  91. data/test/n/tc_properties.rb +68 -0
  92. data/test/n/tc_sitemap.rb +37 -0
  93. data/test/n/ui/tc_pager.rb +52 -0
  94. data/test/n/utils/tc_cache.rb +47 -0
  95. data/test/n/utils/tc_hash.rb +39 -0
  96. data/test/n/utils/tc_html.rb +79 -0
  97. data/test/n/utils/tc_http.rb +18 -0
  98. data/test/n/utils/tc_number.rb +21 -0
  99. data/test/n/utils/tc_strings.rb +149 -0
  100. data/test/n/utils/tc_uri.rb +100 -0
  101. metadata +49 -22
  102. data/doc/css.txt +0 -20
  103. data/doc/ideas.txt +0 -120
  104. data/doc/pg.txt +0 -47
  105. data/doc/svn.txt +0 -82
  106. data/doc/todo.txt +0 -30
  107. data/examples/simple/conf/overrides.rb +0 -9
  108. data/examples/simple/logs/access_log +0 -2
  109. data/examples/simple/logs/apache.log +0 -3
  110. data/examples/simple/logs/app.log +0 -1
  111. data/examples/simple/logs/events.log +0 -1
  112. data/examples/tiny/conf/apache.conf +0 -100
  113. data/examples/tiny/logs/access_log +0 -9
  114. data/examples/tiny/logs/apache.log +0 -9
  115. data/lib/n/db/make-release.sh +0 -26
  116. data/lib/n/tools/README +0 -11
  117. data/lib/xsl/ce.xsl +0 -30
  118. data/lib/xsl/localization.xsl +0 -23
  119. data/test/run.rb +0 -95
@@ -1,9 +1,10 @@
1
- # = HTML utilities collection
2
- #
3
- # code:: gmosx, tkout, ekarak
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 71 2004-10-18 10:50:22Z gmosx $
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
@@ -1,11 +1,9 @@
1
- # = HTTP utilities collection
2
- #
3
- # Some older functionality is removed, use open-uri instead.
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 71 2004-10-18 10:50:22Z gmosx $
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.
@@ -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 71 2004-10-18 10:50:22Z gmosx $
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
@@ -1,9 +1,8 @@
1
- # = General number utilities collection
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 71 2004-10-18 10:50:22Z gmosx $
5
+ # $Id: number.rb 101 2004-10-22 12:35:39Z gmosx $
7
6
 
8
7
  module N;
9
8
 
@@ -1,11 +1,8 @@
1
- # = Pool
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 71 2004-10-18 10:50:22Z gmosx $
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
- # Implemente a thread safe stack. Exclusive locking is needed
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
  #
@@ -1,9 +1,10 @@
1
- # = General string utilities collection
2
- #
3
- # code: gmosx, drak, ekarak
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 71 2004-10-18 10:50:22Z gmosx $
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 empty string if no exception
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
- # gmosx: "" is safer, no??? and it is logical too.
173
- return ""
175
+ return nil
174
176
  end
175
177
  end
176
178
 
@@ -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
 
@@ -1,9 +1,8 @@
1
- # = General time utilities collection
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 71 2004-10-18 10:50:22Z gmosx $
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
+
@@ -1,9 +1,8 @@
1
- # = URI utilities collection
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 71 2004-10-18 10:50:22Z gmosx $
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
@@ -0,0 +1 @@
1
+ Add Web Application Framework parts in this directory
@@ -3,6 +3,8 @@
3
3
  <!--
4
4
  gmosx:
5
5
  XForms related templates
6
+
7
+ NOT IMPLEMENTED yet.
6
8
  -->
7
9
 
8
10
  <xsl:stylesheet
@@ -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
@@ -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