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
@@ -0,0 +1,241 @@
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
+
39
+ def initialize
40
+ @create_time = Time.now
41
+ end
42
+
43
+ end
44
+
45
+ class SubMessage < Message
46
+ manage {
47
+ # duplicate definition
48
+ prop_accessor Float, :count
49
+ }
50
+ end
51
+
52
+ class TC_N_Db < Test::Unit::TestCase
53
+
54
+ def setup
55
+ $db = N::Db.new(
56
+ :backend => "mysql",
57
+ :address => "localhost",
58
+ :database => "test",
59
+ :user => "root",
60
+ :password => "navelrulez",
61
+ :connection_count => 2
62
+ )
63
+
64
+ @art = Article.new()
65
+ @art.title = "The parent"
66
+ @art.body = "The body"
67
+
68
+ @msg1 = Message.new()
69
+ @msg1.name = "name1"
70
+ @msg1.body = "body1"
71
+ @msg1.title = "title1"
72
+ @msg1.count = "22"
73
+ @msg1.owner_oid = 1
74
+
75
+ @msg2 = Message.new()
76
+ @msg2.name = "name2"
77
+ @msg2.body = "body2"
78
+ @msg2.title = "title2"
79
+ @msg2.count = "22"
80
+ @msg1.owner_oid = 2
81
+ end
82
+
83
+ def teardown
84
+ @art = @msg1 = @msg2 = nil
85
+ $db.shutdown()
86
+ end
87
+
88
+ # gmosx: move to tc-properties
89
+ #
90
+ def test_props
91
+
92
+ # check multiple prop
93
+
94
+ assert_equal("SMALLINT", Message.__props.find { |p| :val2 == p.symbol }.sql_type)
95
+
96
+ # bug: props for subclasses.
97
+
98
+ assert(SubMessage.__props)
99
+ assert_equal(Message.__props.size(), SubMessage.__props.size())
100
+
101
+ # bug: duplicate definition
102
+
103
+ assert_equal(Float, SubMessage.__props.find { |p| :count == p.symbol }.klass)
104
+
105
+ # dont force conversion
106
+
107
+ @msg1.count = 2.4
108
+ assert_equal(Float, @msg1.count.class)
109
+
110
+ # force conversion
111
+
112
+ @msg1.__force_count__(2.4)
113
+ assert_equal(Fixnum, @msg1.count.class)
114
+ end
115
+
116
+ # gmosx: hmm, implemented in one method to enforce order.
117
+ #
118
+ def test_all
119
+ $db.open { |db|
120
+
121
+ # check exception, cleanup test db.
122
+
123
+ # db.drop_schema()
124
+ db.drop_table(Article)
125
+ db.drop_table(Message)
126
+
127
+ # db.create_schema()
128
+
129
+ # bug: get methods without entity table
130
+
131
+ db.get(1, Message)
132
+
133
+ # check put
134
+
135
+ db << @art
136
+ # one oid is missed when creating the table for the first time!
137
+ assert_equal(1, @art.oid)
138
+
139
+ art2 = Article.new()
140
+ art2.title = "Another test"
141
+ db << art2
142
+
143
+ @msg1.set_parent(@art)
144
+ @msg2.set_parent(@art)
145
+
146
+ db << @msg1
147
+ db << @msg2
148
+
149
+ $log.error "#{@msg2.oid}"
150
+ assert_equal(2, @msg2.oid)
151
+
152
+ # check children.
153
+
154
+ msgs = db.children(@art, Message, "ORDER BY count")
155
+ assert_equal(2, msgs.size())
156
+ assert_equal(Message, msgs[0].class)
157
+
158
+ assert_equal(2, db.count_children(@art, Message))
159
+
160
+ # bug: pid was string
161
+
162
+ assert_equal(@art.oid, msgs[0].pid)
163
+
164
+ # check updates
165
+
166
+ @art.title = "CHANGED TITLE"
167
+ db.update_properties("title='#{@art.title}'", @art)
168
+
169
+ art2 = db.get(@art.oid, Article)
170
+
171
+ assert_equal(art2.title, @art.title)
172
+
173
+ @art.body = "CHANGED BODY"
174
+ @art.title = "CHANGED AGAIN"
175
+ db << @art
176
+
177
+ art2 = db.get(@art.oid, Article)
178
+ assert_equal(art2.body, @art.body)
179
+ assert_equal(art2.title, "CHANGED AGAIN")
180
+
181
+ # check timestamp
182
+
183
+ now = Time.now()
184
+ @msg1.create_time = now
185
+ db << @msg1
186
+
187
+ msg = db.get(@msg1.oid, Message)
188
+
189
+ # bug:
190
+ # assert_equal(msg.create_time, @msg1.create_time)
191
+ assert_equal(msg.create_time.to_i(), @msg1.create_time.to_i())
192
+
193
+ # gmosx: not implemented in postgres driver.
194
+ # classes = db.managed_classes()
195
+ # assert_equal(2, classes.size())
196
+
197
+ # get_by_name
198
+
199
+ msg = db.get_by_name("name2", Message)
200
+ assert_equal("body2", msg.body)
201
+
202
+ # pclass
203
+
204
+ assert_equal(@art.class.to_s(), msg.pclass)
205
+
206
+ }
207
+
208
+ # deserialize = false
209
+
210
+ $db.open(deserialize = false) { |db|
211
+
212
+ assert_equal(false, db.deserialize)
213
+
214
+ msg = db.get_by_name("name2", Message)
215
+ assert_equal(Array, msg.class)
216
+
217
+ art = db.get(2, Article)
218
+ assert_equal(Array, art.class)
219
+
220
+ }
221
+
222
+ # cascade delete
223
+
224
+ msgs = $db.children(0, Message)
225
+ assert_equal(2, msgs.size())
226
+
227
+ $db.delete(@art)
228
+
229
+ msgs = $db.children(0, Message)
230
+ assert_equal(nil, msgs)
231
+
232
+ end
233
+
234
+ def test_sql_table_to_class
235
+ # assert_equal(Article,
236
+ # N::DbUtils.sql_table_to_class(N::DbUtils.sql_table(Article)))
237
+ end
238
+
239
+ end
240
+
241
+ end
@@ -0,0 +1,44 @@
1
+ # :nodoc: all
2
+
3
+ require "test/unit"
4
+ require "n/events"
5
+
6
+ class TC_Events < Test::Unit::TestCase
7
+ # :nodoc: all
8
+ include N
9
+
10
+ def setup
11
+ $flag = 0
12
+ $flag2 = 1
13
+ @events = N::EventManager.new
14
+ end
15
+
16
+ def teardown
17
+ @events = nil
18
+ end
19
+
20
+ def test_events
21
+ @events.add_handler("my.event", "test1", proc { |val|
22
+ $flag = val
23
+ })
24
+ @events.add_handler("my.event", "test2", proc { |val|
25
+ $flag2 += val
26
+ })
27
+
28
+ @events.fire("my.event", 5)
29
+
30
+ assert_equal(5, $flag)
31
+ assert_equal(6, $flag2)
32
+
33
+ @events.fire("my.event", 5)
34
+
35
+ assert_equal(11, $flag2)
36
+
37
+ # test remove handler
38
+
39
+ @events.remove_handler("my.event", "test2")
40
+ @events.fire("my.event", 5)
41
+
42
+ assert_equal(11, $flag2)
43
+ end
44
+ end
@@ -0,0 +1,68 @@
1
+ require "test/unit"
2
+
3
+ require "n/logger"; $log = Logger.new(STDERR) unless $log
4
+
5
+ require "n/properties"
6
+
7
+ module Test # :nodoc: all
8
+
9
+ class Message
10
+ prop_accessor Fixnum, :owner_oid
11
+ prop_accessor Fixnum, "smallint", :val1, :val2, :val3
12
+ prop_accessor String, :title, :body
13
+ prop_accessor String, "char(10) NOT NULL", :test
14
+ prop_accessor Fixnum, :count
15
+ prop_accessor Time, :create_time
16
+
17
+ # a marshaled property
18
+ prop_accessor Array, :options
19
+
20
+ def initialize
21
+ @create_time = Time.now
22
+ @options = []
23
+ end
24
+
25
+ end
26
+
27
+ class SubMessage < Message
28
+ inherit_meta(superclass)
29
+ # duplicate definition
30
+ prop_accessor Float, :count
31
+ end
32
+
33
+ class TC_N_Properties < Test::Unit::TestCase
34
+
35
+ def setup
36
+ @msg1 = Message.new
37
+ end
38
+
39
+ def teardown
40
+ @msg1 = nil
41
+ end
42
+
43
+ def test_props
44
+
45
+
46
+ # bug: props for subclasses.
47
+
48
+ assert(SubMessage.__props)
49
+ assert_equal(Message.__props.size(), SubMessage.__props.size())
50
+
51
+ # bug: duplicate definition
52
+
53
+ assert_equal(Float, SubMessage.__props.find { |p| :count == p.symbol }.klass)
54
+
55
+ # dont force conversion
56
+
57
+ @msg1.count = 2.4
58
+ assert_equal(Float, @msg1.count.class)
59
+
60
+ # force conversion
61
+
62
+ @msg1.__force_count(2.4)
63
+ assert_equal(Fixnum, @msg1.count.class)
64
+ end
65
+
66
+ end
67
+
68
+ end # module
@@ -0,0 +1,37 @@
1
+ # :nodoc: all
2
+
3
+ require "test/unit"
4
+
5
+ require "n/logger"; $log = Logger.new(STDERR) unless $log
6
+
7
+ require "n/sitemap"
8
+
9
+ class TC_N_SiteMap < Test::Unit::TestCase
10
+ include N
11
+
12
+ def setup
13
+ $n0 = SitePage.new "/index.sx", "Joy", nil, realm = "main-realm"
14
+ $n1 = SitePage.new "/id/index.sx", "Id", $n0
15
+ $n2 = SitePage.new "/id/page.sx", "My page", $n1
16
+ $n1 = SitePage.new "/id/login.sx", "Login", $n0
17
+ end
18
+
19
+ def teardown
20
+ $sitemap = nil
21
+ end
22
+
23
+ def test_all
24
+ assert_equal(3, $sitemap.path("/id/page.sx").size())
25
+
26
+ # bug: wrong order
27
+ assert_equal("Joy > Id > My page", $sitemap.str_path("/id/page.sx"))
28
+
29
+ # bug: wrong hrefs
30
+ assert_equal('<a href="/index.sx">Joy</a> > <a href="/id/index.sx">Id</a> > My page', $sitemap.linked_path("/id/page.sx"))
31
+
32
+ # bug: realm should be inherited from parent
33
+ setup
34
+ assert_equal($n2.realm, $n1.realm)
35
+ end
36
+
37
+ end
@@ -0,0 +1,52 @@
1
+ # :nodoc: all
2
+
3
+ require "test/unit"
4
+
5
+ require "n/logger"; $log = Logger.new(STDERR) unless $log
6
+
7
+ require "n/db"
8
+ require "n/ui/pager"
9
+
10
+ class RequestMock < Hash
11
+ def get(k, default)
12
+ return self[k] || default
13
+ end
14
+ end
15
+
16
+ class TC_N_UI_Pager < Test::Unit::TestCase
17
+
18
+ def setup
19
+ =begin
20
+ $db = N::Db.new(
21
+ :addres => "localhost",
22
+ :database => "testdb",
23
+ :user => "root",
24
+ # :password => "navelrulez",
25
+ :connection_count => 2
26
+ )
27
+ =end
28
+ end
29
+
30
+ def teardown
31
+ # $db.shutdown()
32
+ end
33
+
34
+ def test_all
35
+ items = [1, 2, 3, 4, 5, 6, 7, 8, 9]
36
+ count = items.size()
37
+
38
+ request = RequestMock.new()
39
+ pager = N::UI::Pager.new("tst", request, 2, items)
40
+
41
+ assert_equal(pager.total_count, count)
42
+
43
+ # bug: bad rounding.
44
+
45
+ assert_equal(5, pager.page_count)
46
+
47
+ # bug: FIXME
48
+ # assert_equal(2, items.size())
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,47 @@
1
+ # :nodoc: all
2
+
3
+ require "test/unit"
4
+ require "n/utils/cache"
5
+
6
+ class TC_N_Utils_Cache < Test::Unit::TestCase
7
+ # :nodoc: all
8
+
9
+ class Dummy
10
+ include N::LRUCache::Item
11
+ end
12
+
13
+ def setup
14
+ @cache = N::LRUCache.new(maxitems = 3)
15
+ end
16
+
17
+ def teardown
18
+ @cache = nil
19
+ end
20
+
21
+ def test_safe_cache
22
+ d1 = Dummy.new
23
+ d2 = Dummy.new
24
+ d3 = Dummy.new
25
+ d4 = Dummy.new
26
+
27
+ @cache[1] = d1
28
+ @cache[2] = d2
29
+ @cache[3] = d3
30
+
31
+ assert_equal(d1, @cache.last)
32
+ assert_equal(d3, @cache.first)
33
+
34
+ val = @cache[2]
35
+ assert_equal(d2, @cache.first)
36
+
37
+ @cache[4] = d4
38
+ assert_equal(3, @cache.size)
39
+ assert_equal(d4, @cache.first)
40
+
41
+ # insert the same key
42
+ @cache[4] = d4
43
+ assert_equal(3, @cache.size)
44
+ assert_equal(d4, @cache.first)
45
+ end
46
+
47
+ end