nitro 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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