nitro 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/AUTHORS +4 -1
  2. data/ChangeLog +290 -7
  3. data/README +3 -3
  4. data/RELEASES +94 -0
  5. data/Rakefile +7 -7
  6. data/benchmark/og/bench.rb +11 -10
  7. data/{ChangeLog.1 → doc/ChangeLog.1} +0 -0
  8. data/doc/apache.txt +9 -0
  9. data/doc/architecture.txt +1 -27
  10. data/doc/bugs.txt +11 -4
  11. data/doc/config.txt +22 -0
  12. data/doc/og_config.txt +35 -0
  13. data/doc/og_tutorial.txt +595 -0
  14. data/doc/tutorial.txt +22 -0
  15. data/examples/blog/conf/apache.conf +30 -0
  16. data/examples/blog/conf/lhttpd.conf +2 -2
  17. data/examples/blog/lib/blog/controller.rb +11 -2
  18. data/examples/blog/log/apache.error_log +5528 -0
  19. data/examples/blog/root/fcgi.rb +1 -1
  20. data/examples/blog/run.rb +9 -3
  21. data/examples/flash/run.rb +2 -2
  22. data/examples/no_xsl_blog/conf/apache.conf +30 -0
  23. data/examples/no_xsl_blog/conf/lhttpd.conf +1 -1
  24. data/examples/no_xsl_blog/lib/blog/controller.rb +2 -2
  25. data/examples/no_xsl_blog/log/apache.error_log +68 -0
  26. data/examples/no_xsl_blog/root/fcgi.rb +2 -2
  27. data/examples/no_xsl_blog/run.rb +3 -3
  28. data/examples/og/run.rb +1 -1
  29. data/examples/tiny/conf/apache.conf +29 -4
  30. data/examples/tiny/conf/lhttpd.conf +1 -1
  31. data/examples/tiny/log/apache.error_log +30 -0
  32. data/examples/tiny/root/fcgi.rb +2 -2
  33. data/examples/tiny/root/index.xhtml +1 -1
  34. data/examples/tiny/run.rb +3 -2
  35. data/examples/wee_style/run.rb +7 -9
  36. data/examples/why_wiki/README +5 -0
  37. data/examples/why_wiki/run.rb +57 -0
  38. data/examples/why_wiki/wiki.yml +6 -0
  39. data/examples/wiki.yml +1 -0
  40. data/lib/glue/array.rb +14 -33
  41. data/lib/glue/hash.rb +32 -53
  42. data/lib/glue/pool.rb +9 -12
  43. data/lib/glue/property.rb +31 -9
  44. data/lib/nitro.rb +30 -8
  45. data/lib/nitro/adapters/cgi.rb +23 -3
  46. data/lib/nitro/adapters/webrick.rb +9 -3
  47. data/lib/nitro/builders/form.rb +21 -13
  48. data/lib/nitro/builders/rss.rb +20 -9
  49. data/lib/nitro/builders/table.rb +69 -10
  50. data/lib/nitro/builders/xhtml.rb +13 -4
  51. data/lib/nitro/component.rb +15 -0
  52. data/lib/nitro/conf.rb +4 -3
  53. data/lib/nitro/context.rb +22 -14
  54. data/lib/nitro/controller.rb +63 -5
  55. data/lib/nitro/dispatcher.rb +11 -6
  56. data/lib/nitro/output.rb +28 -0
  57. data/lib/nitro/render.rb +78 -59
  58. data/lib/nitro/request.rb +5 -1
  59. data/lib/nitro/runner.rb +20 -6
  60. data/lib/nitro/session.rb +89 -18
  61. data/lib/nitro/session/drb.rb +31 -0
  62. data/lib/nitro/session/drbserver.rb +71 -0
  63. data/lib/nitro/session/memory.rb +13 -0
  64. data/lib/nitro/simple.rb +7 -0
  65. data/lib/nitro/ui/date-select.rb +2 -5
  66. data/lib/nitro/ui/pager.rb +4 -4
  67. data/lib/nitro/ui/tabs.rb +2 -4
  68. data/lib/nitro/uri.rb +7 -4
  69. data/lib/og.rb +20 -12
  70. data/lib/og/adapter.rb +40 -13
  71. data/lib/og/adapters/filesys.rb +121 -0
  72. data/lib/og/adapters/mysql.rb +10 -5
  73. data/lib/og/adapters/oracle.rb +374 -0
  74. data/lib/og/adapters/psql.rb +10 -23
  75. data/lib/og/adapters/sqlite.rb +3 -3
  76. data/lib/og/backend.rb +2 -2
  77. data/lib/og/connection.rb +6 -6
  78. data/lib/og/database.rb +5 -5
  79. data/lib/og/enchant.rb +6 -2
  80. data/lib/og/meta.rb +56 -26
  81. data/lib/og/mock.rb +1 -1
  82. data/lib/og/typemacros.rb +23 -0
  83. data/lib/parts/content.rb +4 -10
  84. data/test/nitro/adapters/tc_cgi.rb +1 -1
  85. data/test/nitro/builders/tc_rss.rb +1 -1
  86. data/test/nitro/builders/tc_table.rb +30 -0
  87. data/test/nitro/tc_context.rb +4 -0
  88. data/test/nitro/tc_controller.rb +9 -2
  89. data/test/og/tc_filesys.rb +83 -0
  90. data/test/og/tc_meta.rb +55 -0
  91. data/test/tc_og.rb +115 -36
  92. data/vendor/README +11 -5
  93. data/vendor/breakpoint.rb +35 -38
  94. data/vendor/breakpoint_client.rb +119 -80
  95. data/vendor/composite_sexp_processor.rb +43 -0
  96. data/vendor/parse_tree.rb +745 -0
  97. data/vendor/sexp_processor.rb +453 -0
  98. metadata +34 -7
  99. data/examples/no_xsl_blog/conf/app.conf.rb +0 -47
@@ -9,5 +9,9 @@ class TC_Context < Test::Unit::TestCase # :nodoc: all
9
9
  include N
10
10
 
11
11
  def test_context
12
+ conf = OpenStruct.new
13
+ conf.dispatcher = nil
14
+ c = Context.new(conf)
15
+ assert_equal 200, c.status
12
16
  end
13
17
  end
@@ -11,7 +11,7 @@ class TC_Controller < Test::Unit::TestCase # :nodoc: all
11
11
  include N
12
12
 
13
13
  class BlogController < Controller
14
- attr_accessor :aflag, :tflag
14
+ attr_reader :aflag, :tflag
15
15
 
16
16
  def list
17
17
  @aflag = true
@@ -30,8 +30,9 @@ class TC_Controller < Test::Unit::TestCase # :nodoc: all
30
30
  def test_render
31
31
  ctx = Context.new(@conf)
32
32
  ctx.headers = {}
33
+ ctx.params = {}
33
34
  puts '=', ctx.dispatcher.root
34
- klass, action, base = ctx.dispatcher.dispatch('/blog/list')
35
+ klass, action, base = ctx.dispatcher.dispatch('/blog/list', ctx)
35
36
  c = klass.new(ctx, base)
36
37
  begin
37
38
  c.send(action)
@@ -44,4 +45,10 @@ class TC_Controller < Test::Unit::TestCase # :nodoc: all
44
45
  assert_equal true, c.tflag
45
46
  end
46
47
 
48
+ def test_action_methods
49
+ # aflag/tflag are counted too!
50
+ assert_equal 3, BlogController.action_methods.size
51
+ assert BlogController.action_methods.include?('list')
52
+ end
53
+
47
54
  end
@@ -0,0 +1,83 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
+
3
+ require 'test/unit'
4
+ require 'ostruct'
5
+
6
+ require 'og'
7
+ require 'og/adapters/filesys'
8
+
9
+ class TC_OgFilesys < Test::Unit::TestCase # :nodoc: all
10
+ include N, Og
11
+
12
+ # Forward declaration.
13
+
14
+ class Comment; end
15
+
16
+ class Article
17
+ prop_accessor :name, String
18
+ prop_accessor :age, Fixnum
19
+ has_many :comments, Comment
20
+
21
+ def initialize (name = nil, age = nil)
22
+ @name, @age = name, age
23
+ end
24
+ end
25
+
26
+ class Comment
27
+ prop_accessor :text, String
28
+ belongs_to :article, Article
29
+
30
+ def initialize(text = nil)
31
+ @text = text
32
+ end
33
+ end
34
+
35
+ def setup
36
+ config = {
37
+ :adapter => 'filesys',
38
+ :database => 'fstest',
39
+ }
40
+
41
+ $DBG = true
42
+
43
+ Og::Database.drop_db!(config)
44
+ @og = Og::Database.new(config)
45
+ end
46
+
47
+ def teardown
48
+ @og.shutdown
49
+ end
50
+
51
+ def test_all
52
+ a = Article.new('gmosx', 30)
53
+ a.save!
54
+
55
+ a1 = Article[1]
56
+
57
+ assert_equal 'gmosx', a1.name
58
+ assert_equal 30, a1.age
59
+ assert_equal 1, a1.oid
60
+
61
+ Article.create('drak', 12)
62
+ Article.create('ekarak', 34)
63
+ Article.create('mario', 53)
64
+ Article.create('elathan', 34)
65
+ =begin
66
+ articles = Article.all
67
+
68
+ assert_equal 5, articles.size
69
+ =end
70
+ a3 = Article[3]
71
+
72
+ assert_equal 'ekarak', a3.name
73
+
74
+ c1 = Comment.new('a comment')
75
+ c1.save!
76
+ a3.add_comment(c1)
77
+ =begin
78
+ a5 = Article[3]
79
+ assert_equal 1, a5.comments.size
80
+ =end
81
+ end
82
+
83
+ end
@@ -0,0 +1,55 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
+
3
+ require 'test/unit'
4
+ require 'ostruct'
5
+
6
+ require 'og'
7
+
8
+ class TC_OgMeta < Test::Unit::TestCase # :nodoc: all
9
+ include N
10
+
11
+ # Forward declaration.
12
+
13
+ class Comment; end
14
+
15
+ class Article
16
+ property :name, String
17
+ property :age, Fixnum
18
+ has_many :comments, Comment
19
+
20
+ def initialize (name = nil, age = nil)
21
+ @name, @age = name, age
22
+ end
23
+ end
24
+
25
+ class Comment
26
+ prop_accessor :text, String
27
+ belongs_to :article, Article
28
+
29
+ def initialize(text = nil)
30
+ @text = text
31
+ end
32
+ end
33
+
34
+ def setup
35
+ end
36
+
37
+ def teardown
38
+ end
39
+
40
+ def test_all
41
+ par = Article.__meta[:props_and_relations]
42
+ assert_equal 3, par.size
43
+ assert_equal N::Property, par[1].class
44
+ assert_equal Og::HasMany, par[2].class
45
+
46
+ par = Comment.__meta[:props_and_relations]
47
+ assert_equal 3, par.size
48
+ assert_equal N::Property, par[0].class
49
+ assert_equal Og::BelongsTo, par[1].class
50
+ assert_equal 'article_oid', par[1].meta[:property].to_s
51
+ assert_equal String, par[0].klass
52
+ assert_equal Article, par[1].foreign_class
53
+ end
54
+
55
+ end
@@ -1,5 +1,7 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
2
 
3
+ $DBG = true
4
+
3
5
  require 'test/unit'
4
6
 
5
7
  require 'og'
@@ -19,15 +21,24 @@ end
19
21
 
20
22
  class Role
21
23
  prop_accessor :title, String
24
+ property :chk_not_null, Fixnum, :default => 2
22
25
  end
23
26
 
24
27
  class Comment; end
28
+ class Article; end
29
+
30
+ class Category
31
+ prop_accessor :title, String
32
+ many_to_many :articles, Article
33
+ end
25
34
 
26
35
  class Article
27
36
  prop_accessor :title, String
28
37
  prop_accessor :body, String
29
38
  prop_accessor :owner_oid, Fixnum, :sql_index => true
30
39
  prop_accessor :another_oid, Fixnum
40
+ property :create_time, Time
41
+ property :rate, Float
31
42
  sql_index 'owner_oid, another_oid'
32
43
  prop_accessor :options, Hash
33
44
  has_many :comments, Test::Comment
@@ -80,48 +91,69 @@ class MyClass
80
91
  end
81
92
 
82
93
  class OrderItem
83
- prop_accessor :number, Fixnum
94
+ prop_accessor :onumber, Fixnum
84
95
  refers_to :article, Article
85
96
  end
86
97
 
87
98
  class TC_N_OG < Test::Unit::TestCase
88
- def test_psql
89
- config = {
90
- :adapter => 'psql',
91
- # :address => 'localhost',
92
- :database => 'test',
93
- :user => 'postgres',
94
- :password => 'navelrulez',
95
- :connection_count => 2
96
- }
97
-
98
- run_all_tests(config)
99
- end
100
99
 
101
- =begin
102
- def test_mysql
103
- config = {
104
- :adapter => 'mysql',
105
- # :address => 'localhost',
106
- :database => 'test',
107
- :user => 'root',
108
- :password => 'navelrulez',
109
- :connection_count => 2
110
- }
111
-
112
- run_all_tests(config)
113
- end
100
+ @@adapter = :psql
101
+
102
+ case @@adapter
114
103
 
115
- def test_sqlite
116
- config = {
117
- :adapter => 'sqlite',
118
- :database => 'test',
119
- :connection_count => 2
120
- }
104
+ when :psql
105
+ def test_psql
106
+ config = {
107
+ :adapter => 'psql',
108
+ # :address => 'localhost',
109
+ :database => 'test',
110
+ :user => 'postgres',
111
+ :password => 'navelrulez',
112
+ :connection_count => 2
113
+ }
114
+
115
+ run_all_tests(config)
116
+ end
121
117
 
122
- run_all_tests(config)
118
+ when :mysql
119
+ def test_mysql
120
+ config = {
121
+ :adapter => 'mysql',
122
+ # :address => 'localhost',
123
+ :database => 'test',
124
+ :user => 'root',
125
+ :password => 'navelrulez',
126
+ :connection_count => 2
127
+ }
128
+
129
+ run_all_tests(config)
130
+ end
131
+
132
+ when :oracle
133
+ def test_oracle
134
+ config = {
135
+ :adapter => 'oracle',
136
+ # :address => 'localhost',
137
+ :database => 'test',
138
+ :user => 'root',
139
+ :password => 'navelrulez',
140
+ :connection_count => 2
141
+ }
142
+
143
+ run_all_tests(config)
144
+ end
145
+
146
+ when :sqlite
147
+ def test_sqlite
148
+ config = {
149
+ :adapter => 'sqlite',
150
+ :database => 'test',
151
+ :connection_count => 2
152
+ }
153
+
154
+ run_all_tests(config)
155
+ end
123
156
  end
124
- =end
125
157
 
126
158
  # gmosx: hmm, implemented in one method to enforce order.
127
159
 
@@ -132,6 +164,8 @@ class TC_N_OG < Test::Unit::TestCase
132
164
  og.get_connection
133
165
 
134
166
  article = Article.new("Title", "Here comes the body")
167
+ article.create_time = now = Time.now
168
+ article.rate = rate = 12.33
135
169
  og << article
136
170
 
137
171
  article.title = "Changed"
@@ -143,6 +177,9 @@ class TC_N_OG < Test::Unit::TestCase
143
177
 
144
178
  another = Article[1]
145
179
  assert_equal(1, another.oid)
180
+ assert_equal now.to_i, another.create_time.to_i
181
+ assert_equal rate, another.rate
182
+
146
183
  # bug: yaml load problem.
147
184
  assert_equal("world", another.options["hello"])
148
185
 
@@ -180,17 +217,44 @@ class TC_N_OG < Test::Unit::TestCase
180
217
  comment.author = User["gmosx"]
181
218
  comment.save!
182
219
 
183
- # test automatically generated add_commnet
220
+ # test automatically generated add_comment
184
221
  comment = Comment.new("This is another comment")
185
222
  comment.author = User["gmosx"]
186
223
  article.add_comment(comment)
187
224
 
225
+ # test add_comment with block.
226
+ article.add_comment do |c|
227
+ c.body = 'Another one'
228
+ c.author = User['gmosx']
229
+ end
230
+
188
231
  assert_equal(article.oid, comment.article_oid)
189
232
 
190
233
  comments = article.comments
191
234
 
192
- assert_equal(2, comments.size)
235
+ assert_equal(3, comments.size)
236
+
237
+ # test many_to_many relations.
238
+
239
+ category = Category.create
240
+ category.add_article(article)
241
+
242
+ assert_equal 1, category.articles.size
243
+
244
+ # bug: test many_to_many with non-saved object.
245
+
246
+ ans = Article.new
247
+ ans.title = 'non saved'
248
+ category.add_article(ans)
249
+
250
+ category.add_article do |a|
251
+ a.title = 'another'
252
+ end
193
253
 
254
+ assert_equal 3, category.articles.size
255
+
256
+ assert_equal 1, article.categories.size
257
+
194
258
  assert_equal("gmosx", comments[0].author.name)
195
259
 
196
260
  article.delete_all_comments
@@ -244,6 +308,21 @@ class TC_N_OG < Test::Unit::TestCase
244
308
  user = User['gmosx']
245
309
  assert_equal true, user.banned
246
310
 
311
+ # test not null
312
+
313
+ role = Role.new
314
+
315
+ begin
316
+ role.save
317
+ rescue Exception, StandardError
318
+ # drink it
319
+ end
320
+
321
+ role = Role[1]
322
+
323
+ # not saved due to not nul constraint.
324
+ assert_equal nil, role
325
+
247
326
  og.put_connection
248
327
  og.shutdown
249
328
 
@@ -1,6 +1,12 @@
1
- Libraries from other vendors belong here.
1
+ = Extensions and Libraries from other vendors.
2
+
3
+ Libraries from other vendors belong here. This file
4
+
5
+ === Included libraries
6
+
7
+ * extensions
8
+ * breakpointer
9
+ * dev-utils
10
+ * postgres-pr
11
+ * ParseTree
2
12
 
3
- extensions
4
- breakpointer
5
- dev-utils
6
- postgres-pr
@@ -21,6 +21,9 @@ require 'drb'
21
21
  require 'drb/acl'
22
22
 
23
23
  module Breakpoint
24
+ id = %q$Id: breakpoint.rb 92 2005-02-04 22:35:53Z flgr $
25
+ Version = id.split(" ")[2].to_i
26
+
24
27
  extend self
25
28
 
26
29
  # This will pop up an interactive ruby session at a
@@ -119,6 +122,7 @@ module Breakpoint
119
122
  # in the context of the client.
120
123
  class Client
121
124
  def initialize(eval_handler) # :nodoc:
125
+ eval_handler.untaint
122
126
  @eval_handler = eval_handler
123
127
  end
124
128
 
@@ -133,15 +137,23 @@ module Breakpoint
133
137
  end
134
138
 
135
139
  # Will execute the specified statement at the client.
136
- def method_missing(method, *args)
137
- if args.empty?
138
- result = eval("#{method}")
140
+ def method_missing(method, *args, &block)
141
+ if args.empty? and not block
142
+ result = eval "#{method}"
139
143
  else
140
- result = eval("#{method}(*Marshal.load(#{Marshal.dump(args).inspect}))")
141
- end
142
-
143
- unless [true, false, nil].include?(result)
144
- result.extend(DRbUndumped) rescue nil
144
+ # This is a bit ugly. The alternative would be using an
145
+ # eval context instead of an eval handler for executing
146
+ # the code at the client. The problem with that approach
147
+ # is that we would have to handle special expressions
148
+ # like "self", "nil" or constants ourself which is hard.
149
+ remote = eval %{
150
+ result = lambda { |block, *args| #{method}(*args, &block) }
151
+ def result.call_with_block(*args, &block)
152
+ call(block, *args)
153
+ end
154
+ result
155
+ }
156
+ remote.call_with_block(*args, &block)
145
157
  end
146
158
 
147
159
  return result
@@ -175,6 +187,7 @@ module Breakpoint
175
187
  # client.File.open("temp.txt", "w") { |f| f.puts "Hello" }
176
188
  def client()
177
189
  if Breakpoint.use_drb? then
190
+ sleep(0.5) until Breakpoint.drb_service.eval_handler
178
191
  Client.new(Breakpoint.drb_service.eval_handler)
179
192
  else
180
193
  Client.new(lambda { |code| eval(code, TOPLEVEL_BINDING) })
@@ -276,10 +289,12 @@ module Breakpoint
276
289
  def collision
277
290
  sleep(0.5) until @collision_handler
278
291
 
292
+ @collision_handler.untaint
293
+
279
294
  @collision_handler.call
280
295
  end
281
296
 
282
- def ping; end
297
+ def ping() end
283
298
 
284
299
  def add_breakpoint(context, message)
285
300
  workspace = IRB::WorkSpace.new(context)
@@ -287,34 +302,11 @@ module Breakpoint
287
302
 
288
303
  sleep(0.5) until @handler
289
304
 
305
+ @handler.untaint
290
306
  @handler.call(workspace, message)
291
307
  end
292
308
 
293
- def register_handler(&block)
294
- @handler = block
295
- end
296
-
297
- def unregister_handler
298
- @handler = nil
299
- end
300
-
301
- attr_reader :eval_handler
302
-
303
- def register_eval_handler(&block)
304
- @eval_handler = block
305
- end
306
-
307
- def unregister_eval_handler
308
- @eval_handler = lambda { }
309
- end
310
-
311
- def register_collision_handler(&block)
312
- @collision_handler = block
313
- end
314
-
315
- def unregister_collision_handler
316
- @collision_handler = lambda { }
317
- end
309
+ attr_accessor :handler, :eval_handler, :collision_handler
318
310
  end
319
311
 
320
312
  # Will run Breakpoint in DRb mode. This will spawn a server
@@ -441,7 +433,11 @@ module IRB # :nodoc:
441
433
  @CONF[:MAIN_CONTEXT] = irb.context
442
434
 
443
435
  old_sigint = trap("SIGINT") do
444
- irb.signal_handle
436
+ begin
437
+ irb.signal_handle
438
+ rescue RubyLex::TerminateLineInput
439
+ # ignored
440
+ end
445
441
  end
446
442
 
447
443
  catch(:IRB_EXIT) do
@@ -464,6 +460,7 @@ module IRB # :nodoc:
464
460
  old_CurrentContext
465
461
  end
466
462
  end
463
+ def IRB.parse_opts() end
467
464
 
468
465
  class Context
469
466
  alias :old_evaluate :evaluate
@@ -485,7 +482,7 @@ module IRB # :nodoc:
485
482
  if args[0] != :no_proxy and
486
483
  not [true, false, nil].include?(result)
487
484
  then
488
- result.extend(DRbUndumped) if result
485
+ result.extend(DRbUndumped) rescue nil
489
486
  end
490
487
  return result
491
488
  else
@@ -506,8 +503,8 @@ end
506
503
 
507
504
  module DRb # :nodoc:
508
505
  class DRbObject
509
- undef :inspect
510
- undef :clone
506
+ undef :inspect if method_defined?(:inspect)
507
+ undef :clone if method_defined?(:clone)
511
508
  end
512
509
  end
513
510