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
@@ -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