nitro 0.11.0 → 0.12.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 (56) hide show
  1. data/ChangeLog +150 -0
  2. data/README +1 -1
  3. data/RELEASES +89 -0
  4. data/Rakefile +3 -3
  5. data/{AUTHORS → doc/AUTHORS} +0 -0
  6. data/{LICENSE → doc/LICENSE} +0 -0
  7. data/doc/bugs.txt +2 -1
  8. data/examples/README.windows +2 -2
  9. data/examples/blog/lib/blog/controller.rb +9 -8
  10. data/examples/blog/log/apache.error_log +71 -0
  11. data/{lib/xsl → examples/blog/root}/base.xsl +0 -0
  12. data/examples/blog/root/error.xhtml +56 -0
  13. data/examples/blog/root/index.xhtml +2 -2
  14. data/examples/blog/root/recent_posts.xhtml +1 -1
  15. data/examples/blog/root/style.xsl +4 -4
  16. data/examples/blog/run.rb +1 -2
  17. data/examples/no_xsl_blog/root/index.xhtml +2 -2
  18. data/examples/no_xsl_blog/root/recent_posts.xhtml +1 -1
  19. data/examples/why_wiki/run.rb +19 -19
  20. data/lib/nitro.rb +2 -21
  21. data/lib/nitro/adapters/webrick.rb +19 -3
  22. data/lib/nitro/context.rb +15 -1
  23. data/lib/nitro/controller.rb +84 -49
  24. data/lib/nitro/dispatcher.rb +30 -6
  25. data/lib/nitro/markup.rb +4 -2
  26. data/lib/nitro/render.rb +15 -11
  27. data/lib/nitro/routing.rb +33 -0
  28. data/lib/nitro/runner.rb +38 -3
  29. data/lib/nitro/scaffold.rb +7 -4
  30. data/lib/nitro/shaders.rb +11 -4
  31. data/lib/nitro/template.rb +140 -0
  32. data/lib/og.rb +25 -11
  33. data/lib/og/adapter.rb +141 -7
  34. data/lib/og/adapters/mysql.rb +41 -3
  35. data/lib/og/adapters/oracle.rb +4 -3
  36. data/lib/og/adapters/psql.rb +3 -3
  37. data/lib/og/adapters/sqlite.rb +3 -3
  38. data/lib/og/connection.rb +5 -1
  39. data/lib/og/database.rb +26 -12
  40. data/lib/og/enchant.rb +50 -16
  41. data/lib/og/meta.rb +15 -15
  42. data/lib/og/observer.rb +53 -0
  43. data/test/glue/tc_property_type_checking.rb +3 -0
  44. data/test/nitro/tc_controller.rb +1 -1
  45. data/test/nitro/tc_dispatcher.rb +1 -1
  46. data/test/nitro/tc_template.rb +32 -0
  47. data/test/og/tc_many_to_many.rb +62 -0
  48. data/test/og/tc_observer.rb +85 -0
  49. data/test/tc_og.rb +16 -2
  50. metadata +12 -14
  51. data/bin/cluster +0 -218
  52. data/examples/why_wiki/wiki.yml +0 -6
  53. data/examples/wiki.yml +0 -1
  54. data/lib/nitro/ui/select.rb +0 -40
  55. data/lib/nitro/ui/sitemap.rb +0 -183
  56. data/test/nitro/ui/tc_sitemap.rb +0 -37
@@ -5,7 +5,7 @@ require 'nitro/dispatcher'
5
5
 
6
6
  class TC_Dispatcher < Test::Unit::TestCase # :nodoc: all
7
7
 
8
- class MainController
8
+ class MainController < N::Controller
9
9
  end
10
10
 
11
11
  class BlogController < N::Controller
@@ -0,0 +1,32 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
+
3
+ require 'test/unit'
4
+ require 'ostruct'
5
+
6
+ require 'nitro/template'
7
+
8
+ class TC_Template < Test::Unit::TestCase # :nodoc: all
9
+ include N
10
+
11
+ def test_all
12
+ template = %q{
13
+ Hello #{user}
14
+
15
+ dont forget the following todo items:
16
+
17
+ <?r for item in items ?>
18
+ <li>#{item}</li>
19
+ <?r end ?>
20
+ }
21
+
22
+ user = 'gmosx'
23
+ items = %w{ nitro is really great }
24
+ out = ''
25
+
26
+ Template.process(template, :out, binding)
27
+
28
+ assert_match %r{\<li\>nitro\</li\>}, out
29
+ assert_match %r{\<li\>really\</li\>}, out
30
+ assert_match %r{Hello gmosx}, out
31
+ end
32
+ end
@@ -0,0 +1,62 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
+
3
+ require 'test/unit'
4
+ require 'ostruct'
5
+
6
+ require 'og'
7
+
8
+ class TC_OgManyToMany < Test::Unit::TestCase # :nodoc: all
9
+ include N
10
+
11
+ class Attribute
12
+ property :name, String
13
+
14
+ def initialize(name = nil)
15
+ @name = name
16
+ end
17
+ end
18
+
19
+ class Klass
20
+ property :name, String
21
+ many_to_many :observed_attributes, Attribute, :linkback => :klass_observers
22
+ many_to_many :controlled_attributes, Attribute, :linkback => :klass_controllers
23
+
24
+ def initialize(name = nil)
25
+ @name = name
26
+ end
27
+ end
28
+
29
+ def test_all
30
+ config = {
31
+ :adapter => 'psql',
32
+ :database => 'test',
33
+ :user => 'postgres',
34
+ :password => 'navelrulez',
35
+ :connection_count => 2
36
+ }
37
+
38
+ Og::Database.drop_db!(config)
39
+ og = Og::Database.new(config)
40
+
41
+ og.get_connection
42
+
43
+ k = Klass.create('klass1')
44
+ a1 = Attribute.create('attr1')
45
+ a2 = Attribute.create('attr2')
46
+
47
+ k.add_observed_attribute(a1)
48
+ k.add_observed_attribute(a2)
49
+
50
+ assert_equal 2, k.observed_attributes.size
51
+ assert_equal 1, a1.klass_observers.size
52
+
53
+ k.add_controlled_attribute(a1)
54
+
55
+ assert_equal 1, k.controlled_attributes.size
56
+ assert_equal 1, a1.klass_controllers.size
57
+
58
+ og.put_connection
59
+ og.shutdown
60
+ end
61
+
62
+ end
@@ -0,0 +1,85 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
+
3
+ require 'test/unit'
4
+ require 'ostruct'
5
+
6
+ require 'og'
7
+
8
+ class TC_OgObserver < Test::Unit::TestCase # :nodoc: all
9
+ include N
10
+
11
+ class User
12
+ property :name
13
+ end
14
+
15
+ class Article
16
+ property :name, String
17
+ property :age, Fixnum
18
+
19
+ def initialize (name = nil, age = nil)
20
+ @name, @age = name, age
21
+ end
22
+ end
23
+
24
+ # Example of a simple class that acts as an observer.
25
+
26
+ class ArticleObserver
27
+ attr :count
28
+
29
+ def initialize
30
+ @count = 0
31
+ end
32
+
33
+ def og_pre_insert(conn, obj)
34
+ @count += 1
35
+ end
36
+ end
37
+
38
+ # Rails style observer, baaah...
39
+
40
+ class MultiObserver < Og::Observer
41
+ observe Article, User
42
+
43
+ attr :count
44
+
45
+ def initialize
46
+ @count = 0
47
+ end
48
+
49
+ def og_pre_insert(conn, obj)
50
+ @count += 1
51
+ end
52
+ end
53
+
54
+ def setup
55
+ end
56
+
57
+ def teardown
58
+ end
59
+
60
+ def test_all
61
+ config = {
62
+ :adapter => 'psql',
63
+ :database => 'test',
64
+ :user => 'postgres',
65
+ :password => 'navelrulez',
66
+ :connection_count => 2
67
+ }
68
+
69
+ Og::Database.drop_db!(config)
70
+ og = Og::Database.new(config)
71
+
72
+ og.get_connection
73
+
74
+ ao = ArticleObserver.new
75
+ Article.add_observer(ao)
76
+ Article.create('Hello', 5)
77
+
78
+ assert_equal 1, ao.count
79
+ assert_equal 1, MultiObserver.instance.count
80
+
81
+ og.put_connection
82
+ og.shutdown
83
+ end
84
+
85
+ end
data/test/tc_og.rb CHANGED
@@ -11,7 +11,7 @@ module Test # :nodoc: all
11
11
  # bug: creates a table that fucks-up postgres if not
12
12
  # correctly escaped.
13
13
  class User
14
- prop_accessor :name, String
14
+ prop_accessor :name, String, :unique => true
15
15
  prop_accessor :banned, TrueClass
16
16
 
17
17
  def initialize(name = nil)
@@ -212,6 +212,20 @@ class TC_N_OG < Test::Unit::TestCase
212
212
  article = Article.new("Title", "Body")
213
213
  article.save!
214
214
 
215
+ # advanced finder
216
+
217
+ users3 = User.find_by_banned(true)
218
+ assert users3.empty?
219
+
220
+ user3 = User.find_by_name('gmosx')
221
+ assert_equal 'gmosx', user3.name
222
+
223
+ user3.banned = true
224
+ user3.save
225
+
226
+ users3 = User.find_by_banned(true)
227
+ assert !users3.empty?
228
+
215
229
  comment = Comment.new("This is a comment")
216
230
  comment.article = article
217
231
  comment.author = User["gmosx"]
@@ -330,7 +344,7 @@ class TC_N_OG < Test::Unit::TestCase
330
344
 
331
345
  og = Og::Database.new(config)
332
346
 
333
- user = User.new("gmosx")
347
+ user = User.new("kokoriko")
334
348
  user.save!
335
349
 
336
350
  og.shutdown
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.6
3
3
  specification_version: 1
4
4
  name: nitro
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.11.0
7
- date: 2005-02-28
6
+ version: 0.12.0
7
+ date: 2005-03-07
8
8
  summary: Nitro Web Engine
9
9
  require_paths:
10
10
  - lib
@@ -30,15 +30,12 @@ authors:
30
30
  files:
31
31
  - Rakefile
32
32
  - ChangeLog
33
- - LICENSE
34
- - AUTHORS
35
33
  - INSTALL
36
34
  - RELEASES
37
35
  - README
38
36
  - install.rb
39
37
  - bin/nitro
40
38
  - bin/new_app.rb
41
- - bin/cluster
42
39
  - bin/proto
43
40
  - bin/new_form.rb
44
41
  - bin/proto/ctl
@@ -80,7 +77,6 @@ files:
80
77
  - examples/blog
81
78
  - examples/README.windows
82
79
  - examples/og
83
- - examples/wiki.yml
84
80
  - examples/no_xsl_blog/log
85
81
  - examples/no_xsl_blog/conf
86
82
  - examples/no_xsl_blog/root
@@ -121,7 +117,6 @@ files:
121
117
  - examples/no_xsl_blog/lib/blog/template.rb
122
118
  - examples/no_xsl_blog/lib/blog/model.rb
123
119
  - examples/no_xsl_blog/lib/blog/controller.rb
124
- - examples/why_wiki/wiki.yml
125
120
  - examples/why_wiki/run.rb
126
121
  - examples/why_wiki/README
127
122
  - examples/flash/log
@@ -158,6 +153,7 @@ files:
158
153
  - examples/blog/conf/apache.conf
159
154
  - examples/blog/conf/lhttpd.conf
160
155
  - examples/blog/root/login.xhtml
156
+ - examples/blog/root/error.xhtml
161
157
  - examples/blog/root/index.xhtml
162
158
  - examples/blog/root/style.css
163
159
  - examples/blog/root/entry_form.xhtml
@@ -165,6 +161,7 @@ files:
165
161
  - examples/blog/root/fcgi.rb
166
162
  - examples/blog/root/comments.xhtml
167
163
  - examples/blog/root/style.xsl
164
+ - examples/blog/root/base.xsl
168
165
  - examples/blog/root/recent_posts.xhtml
169
166
  - examples/blog/root/view_entry.xhtml
170
167
  - examples/blog/root/view_entry.xml
@@ -193,6 +190,8 @@ files:
193
190
  - examples/og/README
194
191
  - doc/ChangeLog.1
195
192
  - doc/config.txt
193
+ - doc/LICENSE
194
+ - doc/AUTHORS
196
195
  - doc/apache.txt
197
196
  - doc/tutorial.txt
198
197
  - doc/og_tutorial.txt
@@ -201,7 +200,6 @@ files:
201
200
  - doc/og_config.txt
202
201
  - lib/nitro
203
202
  - lib/parts
204
- - lib/xsl
205
203
  - lib/glue.rb
206
204
  - lib/nitro.rb
207
205
  - lib/glue
@@ -210,6 +208,7 @@ files:
210
208
  - lib/nitro/localization.rb
211
209
  - lib/nitro/cookie.rb
212
210
  - lib/nitro/session.rb
211
+ - lib/nitro/routing.rb
213
212
  - lib/nitro/uri.rb
214
213
  - lib/nitro/output.rb
215
214
  - lib/nitro/runner.rb
@@ -217,6 +216,7 @@ files:
217
216
  - lib/nitro/scaffold.rb
218
217
  - lib/nitro/adapters
219
218
  - lib/nitro/context.rb
219
+ - lib/nitro/template.rb
220
220
  - lib/nitro/shaders.rb
221
221
  - lib/nitro/buffering.rb
222
222
  - lib/nitro/builders
@@ -245,16 +245,13 @@ files:
245
245
  - lib/nitro/session/drb.rb
246
246
  - lib/nitro/session/memory.rb
247
247
  - lib/nitro/session/drbserver.rb
248
- - lib/nitro/ui/sitemap.rb
249
248
  - lib/nitro/ui/pager.rb
250
249
  - lib/nitro/ui/date-select.rb
251
250
  - lib/nitro/ui/tabs.rb
252
- - lib/nitro/ui/select.rb
253
251
  - lib/nitro/ui/popup.rb
254
252
  - lib/parts/content.rb
255
253
  - lib/parts/content
256
254
  - lib/parts/README
257
- - lib/xsl/base.xsl
258
255
  - lib/glue/mixins.rb
259
256
  - lib/glue/logger.rb
260
257
  - lib/glue/pool.rb
@@ -275,6 +272,7 @@ files:
275
272
  - lib/og/adapters
276
273
  - lib/og/enchant.rb
277
274
  - lib/og/connection.rb
275
+ - lib/og/observer.rb
278
276
  - lib/og/database.rb
279
277
  - lib/og/mock.rb
280
278
  - lib/og/meta.rb
@@ -291,6 +289,7 @@ files:
291
289
  - test/glue
292
290
  - test/og
293
291
  - test/nitro/tc_uri.rb
292
+ - test/nitro/tc_template.rb
294
293
  - test/nitro/tc_controller.rb
295
294
  - test/nitro/adapters
296
295
  - test/nitro/tc_session.rb
@@ -306,7 +305,6 @@ files:
306
305
  - test/nitro/builders/tc_xml.rb
307
306
  - test/nitro/builders/tc_rss.rb
308
307
  - test/nitro/ui/tc_pager.rb
309
- - test/nitro/ui/tc_sitemap.rb
310
308
  - test/root/blog
311
309
  - test/root/blog/list.xhtml
312
310
  - test/glue/tc_strings.rb
@@ -320,8 +318,10 @@ files:
320
318
  - test/glue/tc_cache.rb
321
319
  - test/glue/tc_numbers.rb
322
320
  - test/og/tc_sqlite.rb
321
+ - test/og/tc_observer.rb
323
322
  - test/og/tc_filesys.rb
324
323
  - test/og/tc_meta.rb
324
+ - test/og/tc_many_to_many.rb
325
325
  - test/og/tc_lifecycle.rb
326
326
  - vendor/breakpoint_client.rb
327
327
  - vendor/sexp_processor.rb
@@ -360,8 +360,6 @@ rdoc_options:
360
360
  extra_rdoc_files:
361
361
  - Rakefile
362
362
  - ChangeLog
363
- - LICENSE
364
- - AUTHORS
365
363
  - INSTALL
366
364
  - RELEASES
367
365
  - README
data/bin/cluster DELETED
@@ -1,218 +0,0 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: cluster.rb 249 2005-02-04 14:03:00Z gmosx $
4
-
5
- # WARNING: This is old code, not updated to work in the
6
- # latest nitro release. Will be fixed ASAP.
7
-
8
- $:.unshift 'lib'
9
-
10
- require 'drb'
11
- require 'monitor'
12
-
13
- require 'nitro/application'
14
- require 'nitro/server'
15
- require 'glue/cache'
16
- require 'nitro/server/session'
17
-
18
- module N
19
-
20
- # A Cluster manages the state of a collection of servers. The cluster
21
- # synchronizes the servers and distributes the state. An older version
22
- # used a polling system, ie: the servers polled the cluster to
23
- # obtain the state. This version uses a push system, ie when the
24
- # state is changed a delta is pushed to the clients.
25
- #
26
- # TODO: use Sync instead of Monitor
27
-
28
- class Cluster < N::Application
29
-
30
- # The CHash 'endpoint' resides in the Cluster server
31
-
32
- class CHash < Hash
33
- attr :mon
34
-
35
- # drbobject for this hash (local)
36
-
37
- attr_accessor :ldrb
38
-
39
- # the cluster, use a cluster to implement a set
40
- # (one server per drb_uri)
41
-
42
- attr_accessor :cluster
43
-
44
- #
45
-
46
- def initialize(ldrb_uri = "druby://:8000")
47
- @mon = Monitor.new
48
- @ldrb = DRb.start_service(ldrb_uri, self)
49
- @cluster = {}
50
- end
51
-
52
- #
53
-
54
- def join(sdrb_uri)
55
- @mon.synchronize {
56
- cluster[sdrb_uri] = DRbObject.new(nil, sdrb_uri)
57
- }
58
- end
59
-
60
- alias_method :old_set, :[]=
61
-
62
- # Not really usefull
63
-
64
- def []=(key, value)
65
- # store the value (useful on server restarts)
66
- @mon.synchronize {
67
- old_set(key, value)
68
-
69
- puts "CLUSTER #{key} = #{value}"
70
-
71
- cluster.each { |uri, sdrb|
72
- begin
73
- sdrb.server_sync(key, value)
74
- rescue => ex
75
- Logger.error "Server at #{uri} is down, removing from cluster"
76
- cluster.delete(uri)
77
- end
78
- }
79
- }
80
- end
81
-
82
- # Use this, avoids syncing the original server, and avoids a
83
- # nasty deadlock.
84
- #
85
- def cluster_sync(key, value, server_uri)
86
- # store the value (useful on server restarts)
87
- @mon.synchronize {
88
- old_set(key, value)
89
-
90
- puts "CLUSTER #{key} = #{value}"
91
-
92
- cluster.each { |uri, sdrb|
93
- begin
94
- sdrb.server_sync(key, value) unless uri == server_uri
95
- rescue => ex
96
- Logger.error "Server at #{uri} is down, removing from cluster"
97
- cluster.delete(uri)
98
- end
99
- }
100
- }
101
- end
102
-
103
- def [](key)
104
- @mon.synchronize {
105
- puts "LOOKUP #{key}"
106
- return super
107
- }
108
- end
109
-
110
- end
111
-
112
- # The SHash 'endpoint' resides in the App server
113
-
114
- class SHash < Hash
115
- attr :mon
116
-
117
- # drbobject for this hash (local)
118
- attr_accessor :ldrb
119
-
120
- # drb for the cluster hash
121
- attr_accessor :cdrb
122
-
123
- # ldrb = local drb uri
124
- # cdrb = cluster drb uri
125
-
126
- def initialize(ldrb_uri = "druby://:9000", cdrb_uri = "druby://:8000")
127
- @mon = Monitor.new
128
- @ldrb_uri = ldrb_uri
129
- @ldrb = DRb.start_service(ldrb_uri, self)
130
- @cdrb = DRbObject.new(nil, cdrb_uri)
131
- @cdrb.join(ldrb_uri)
132
- end
133
-
134
- alias_method :old_set, :[]=
135
-
136
- #
137
- #
138
- def []=(key, value)
139
- # store the value in the local hash
140
- @mon.synchronize {
141
- puts "LOCAL #{key} = #{value}"
142
- old_set(key, value)
143
- @cdrb.cluster_sync(key, value, @ldrb_uri)
144
- }
145
- end
146
-
147
- # If the key is not found in the local hash, try the
148
- # cluster hash.
149
- #
150
- def [](key)
151
- @mon.synchronize {
152
- unless value = super
153
- value = @cdrb[key]
154
- old_set(key, value)
155
- end
156
- return value
157
- }
158
- end
159
-
160
- # Called by the cluster
161
- #
162
- def server_sync(key, value)
163
- puts "SYNC #{key} = #{value}"
164
- @mon.synchronize {
165
- old_set(key, value)
166
- }
167
- end
168
-
169
- end
170
-
171
- # Cluster Last Modified Hash
172
-
173
- class Clm < CHash
174
- def [](key)
175
- @mon.synchronize {
176
- unless value = super
177
- puts "INIT #{key}"
178
- value = Time.now.to_i
179
- old_set(key, value)
180
- end
181
- return value
182
- }
183
- end
184
- end
185
-
186
- # = Slm Server Last Modified Hash
187
-
188
- class Slm < SHash
189
- def set!(key, lm = nil)
190
- lm = Time.now.to_i unless lm
191
- self[key] = lm
192
- return lm
193
- end
194
- end
195
-
196
- def initialize(name = "Cluster")
197
- super
198
- end
199
-
200
- def run
201
- N::Cluster::Clm.new
202
- DRb.start_service("druby://:8001", N::SessionManager.new)
203
-
204
- while true
205
- sleep(5000)
206
- end
207
-
208
- super
209
- end
210
-
211
- end
212
-
213
- end
214
-
215
- if $0 == __FILE__
216
- require 'logger'
217
- N::Cluster.new.exec()
218
- end