nitro 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/CHANGELOG +218 -0
  2. data/INSTALL +3 -0
  3. data/README +4 -2
  4. data/Rakefile +150 -8
  5. data/benchmark/bench.rb +1 -1
  6. data/doc/AUTHORS +2 -8
  7. data/doc/RELEASES +63 -1
  8. data/examples/ajax/controller.rb +2 -2
  9. data/examples/ajax/public/index.xhtml +3 -1
  10. data/examples/ajax/run.rb +3 -3
  11. data/examples/blog/README +8 -0
  12. data/examples/blog/cache/entriesadmintrue +3 -0
  13. data/examples/blog/run.rb +38 -40
  14. data/examples/blog/src/blog.rb +2 -1
  15. data/examples/blog/src/controller.rb +40 -20
  16. data/examples/blog/src/mailer.rb +2 -2
  17. data/examples/blog/src/models/blog.rb +2 -1
  18. data/examples/blog/src/models/content.rb +4 -33
  19. data/examples/blog/src/views/error.xhtml +1 -1
  20. data/examples/blog/src/xsl/style.xsl +1 -1
  21. data/examples/blog/test/tc_blog.rb +43 -0
  22. data/examples/flash/run.rb +2 -2
  23. data/examples/no_xsl_blog/lib/blog.rb +1 -1
  24. data/examples/no_xsl_blog/lib/blog/controller.rb +26 -17
  25. data/examples/no_xsl_blog/lib/blog/model.rb +3 -3
  26. data/examples/no_xsl_blog/lib/blog/template.rb +1 -1
  27. data/examples/no_xsl_blog/lib/content.rb +3 -7
  28. data/examples/no_xsl_blog/run.rb +34 -34
  29. data/examples/tiny/public/deep/dir/hello.xhtml +2 -0
  30. data/examples/tiny/run.rb +2 -2
  31. data/examples/wee_style/run.rb +5 -3
  32. data/examples/why_wiki/run.rb +5 -3
  33. data/install.rb +1 -1
  34. data/lib/nitro.rb +10 -9
  35. data/lib/nitro/adapters/cgi.rb +27 -2
  36. data/lib/nitro/adapters/fastcgi.rb +6 -2
  37. data/lib/nitro/adapters/webrick.rb +11 -9
  38. data/lib/nitro/buffering.rb +2 -2
  39. data/lib/nitro/builders/atom.rb +78 -0
  40. data/lib/nitro/builders/form.rb +2 -2
  41. data/lib/nitro/builders/rss.rb +4 -4
  42. data/lib/nitro/builders/table.rb +2 -2
  43. data/lib/nitro/builders/xhtml.rb +5 -8
  44. data/lib/nitro/builders/xml.rb +38 -14
  45. data/lib/nitro/caching.rb +2 -2
  46. data/lib/nitro/caching/actions.rb +2 -2
  47. data/lib/nitro/caching/fragments.rb +2 -2
  48. data/lib/nitro/caching/invalidation.rb +2 -28
  49. data/lib/nitro/caching/output.rb +3 -3
  50. data/lib/nitro/caching/stores.rb +4 -4
  51. data/lib/nitro/conf.rb +11 -6
  52. data/lib/nitro/context.rb +2 -2
  53. data/lib/nitro/controller.rb +12 -7
  54. data/lib/nitro/cookie.rb +2 -2
  55. data/lib/nitro/dispatcher.rb +33 -40
  56. data/lib/nitro/environment.rb +1 -1
  57. data/lib/nitro/localization.rb +5 -7
  58. data/lib/nitro/mail.rb +2 -2
  59. data/lib/nitro/markup.rb +5 -5
  60. data/lib/nitro/output.rb +2 -2
  61. data/lib/nitro/part.rb +8 -5
  62. data/lib/nitro/render.rb +46 -45
  63. data/lib/nitro/request.rb +7 -6
  64. data/lib/nitro/response.rb +14 -5
  65. data/lib/nitro/routing.rb +2 -2
  66. data/lib/nitro/runner.rb +57 -17
  67. data/lib/nitro/scaffold.rb +14 -8
  68. data/lib/nitro/session.rb +7 -4
  69. data/lib/nitro/session/drb.rb +2 -2
  70. data/lib/nitro/session/drbserver.rb +2 -2
  71. data/lib/nitro/session/memory.rb +2 -2
  72. data/lib/nitro/shaders.rb +8 -7
  73. data/lib/nitro/simple.rb +4 -1
  74. data/lib/nitro/template.rb +8 -8
  75. data/lib/nitro/testing.rb +6 -0
  76. data/lib/nitro/testing/assertions.rb +102 -0
  77. data/lib/nitro/testing/context.rb +52 -0
  78. data/lib/nitro/testing/testcase.rb +55 -0
  79. data/lib/nitro/ui/pager.rb +3 -3
  80. data/lib/nitro/ui/popup.rb +8 -13
  81. data/lib/nitro/ui/tabs.rb +4 -10
  82. data/lib/nitro/uri.rb +7 -7
  83. data/proto/doc/README +1 -0
  84. data/proto/public/cgi.rb +5 -0
  85. data/proto/run.rb +2 -4
  86. data/test/nitro/adapters/tc_cgi.rb +1 -1
  87. data/test/nitro/adapters/tc_webrick.rb +1 -2
  88. data/test/nitro/builders/tc_atom.rb +26 -0
  89. data/test/nitro/builders/tc_rss.rb +3 -2
  90. data/test/nitro/builders/tc_table.rb +1 -1
  91. data/test/nitro/builders/tc_xhtml.rb +4 -3
  92. data/test/nitro/builders/tc_xml.rb +7 -7
  93. data/test/nitro/tc_context.rb +1 -1
  94. data/test/nitro/tc_controller.rb +5 -3
  95. data/test/nitro/tc_dispatcher.rb +19 -18
  96. data/test/nitro/tc_localization.rb +1 -1
  97. data/test/nitro/tc_mail.rb +1 -1
  98. data/test/nitro/tc_session.rb +1 -1
  99. data/test/nitro/tc_template.rb +1 -1
  100. data/test/nitro/tc_uri.rb +3 -4
  101. data/test/nitro/ui/tc_pager.rb +7 -7
  102. data/test/public/blog/inc1.xhtml +2 -0
  103. data/test/public/blog/inc2.xhtml +1 -0
  104. data/test/public/blog/list.xhtml +3 -0
  105. metadata +180 -203
  106. data/examples/blog/cache/entriesadmin +0 -12
  107. data/lib/nitro/cluster.rb +0 -218
  108. data/lib/nitro/component.rb +0 -15
  109. data/lib/nitro/filters.rb +0 -215
  110. data/lib/nitro/ui/date-select.rb +0 -69
  111. data/test/nitro/tc_filters.rb +0 -111
@@ -1,12 +0,0 @@
1
- <div class="entry"><h2 class="date">March 28, 2005</h2><div class="post"><h3 class="title">kokok</h3>lalal<div class="footer">posted by George Moschovitis at <a href="view_entry/14">11:32 AM</a> | <a href="view_entry/14#comments">4 comments</a>.</div></div></div><div class="entry"><h2 class="date">March 28, 2005</h2><div class="post"><h3 class="title">UNCACHE</h3>it bastard<div class="footer">posted by at <a href="view_entry/13">11:31 AM</a> | <a href="view_entry/13#comments">0 comments</a>.</div></div></div><div class="entry"><h2 class="date">March 28, 2005</h2><div class="post"><h3 class="title">UNCACHE</h3>it bastard<div class="footer">posted by George Moschovitis at <a href="view_entry/12">11:26 AM</a> | <a href="view_entry/12#comments">0 comments</a>.</div></div></div><div class="pager">
2
- <div class="last"><a href="/?__pgentries=4">Last</a></div>
3
- <div class="next"><a href="/?__pgentries=2">Next</a></div>
4
- <ul>
5
- <li class="active">1</li>
6
-
7
- <li><a href="/?__pgentries=2">2</a></li>
8
-
9
- <li><a href="/?__pgentries=3">3</a></li>
10
-
11
- <li><a href="/?__pgentries=4">4</a></li>
12
- </ul><div class="clear">.</div></div>
@@ -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
@@ -1,15 +0,0 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: component.rb 266 2005-02-28 14:50:48Z gmosx $
4
-
5
- require 'nitro/controller'
6
-
7
- module N
8
-
9
- # A Web Component. A Component extends from the
10
- # base controller class.
11
-
12
- class Component < Controller
13
- end
14
-
15
- end
@@ -1,215 +0,0 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: filters.rb 335 2005-03-31 14:02:02Z gmosx $
4
-
5
- module N
6
-
7
- # Filtering functionality for renders.
8
- # The design and implementation is HEAVILY influenced
9
- # by Rails.
10
- #
11
- # === Examples
12
- #
13
- # Filter as class:
14
- #
15
- # class TouchFilter
16
- # end
17
- #
18
- # Filter
19
- # before
20
- # filter
21
- # after
22
- #
23
- #--
24
- # TODO: rethink what happens with module filters.
25
- #++
26
-
27
- module Filtering
28
-
29
- # Store the code and the metadata (options) for
30
- # the a Filter.
31
-
32
- Filter = Struct.new(:code, :options)
33
-
34
- def self.append_features(base)
35
- super
36
- base.extend(ClassMethods)
37
- base.class_eval %{
38
- @before_filters = []
39
-
40
- def self.before_filters
41
- @before_filters
42
- end
43
-
44
- def self.before_filters=(bf)
45
- @before_filters = bf
46
- end
47
-
48
- @after_filters = []
49
-
50
- def self.after_filters
51
- @after_filters
52
- end
53
-
54
- def self.after_filters=(af)
55
- @after_filters = af
56
- end
57
-
58
- def self.inherited(sub)
59
- super
60
- sub.before_filters = self.before_filters.dup
61
- sub.after_filters = self.after_filters.dup
62
- end
63
- }
64
- end
65
-
66
- module ClassMethods
67
-
68
- # Prepend a filter to the before_filters collection.
69
-
70
- def prepend_before_filter(*args, &block)
71
- options = args.pop if args.last.is_a?(Hash)
72
-
73
- if block_given?
74
- filters = [ Filter.new(block, options) ]
75
- else
76
- filters = args.collect { |c| Filter.new(c, options) }
77
- end
78
-
79
- self.before_filters = filters + self.before_filters
80
- end
81
-
82
- # Append a filter to the before_filters collection.
83
-
84
- def append_before_filter(*args, &block)
85
- options = args.pop if args.last.is_a?(Hash)
86
-
87
- if block_given?
88
- filters = [ Filter.new(block, options) ]
89
- else
90
- filters = args.collect { |c| Filter.new(c, options) }
91
- end
92
-
93
- self.before_filters = self.before_filters + filters
94
- end
95
-
96
- # Alias for the most common case.
97
-
98
- alias :before_filter :prepend_before_filter
99
-
100
- # Prepend a filter to the after_filters collection.
101
-
102
- def prepend_after_filter(*args, &block)
103
- options = args.pop if args.last.is_a?(Hash)
104
-
105
- if block_given?
106
- filters = [ Filter.new(block, options) ]
107
- else
108
- filters = args.collect { |c| Filter.new(c, options) }
109
- end
110
-
111
- self.after_filters = filters + self.after_filters
112
- end
113
-
114
- # Append a filter to the after_filters collection.
115
-
116
- def append_after_filter(*args, &block)
117
- options = args.pop if args.last.is_a?(Hash)
118
-
119
- if block_given?
120
- filters = [ Filter.new(block, options) ]
121
- else
122
- filters = args.collect { |c| Filter.new(c, options) }
123
- end
124
-
125
- self.after_filters = self.after_filters + filters
126
- end
127
-
128
- # Alias for the most common case.
129
-
130
- alias :after_filter :append_after_filter
131
-
132
- # Install an arround Filter. A filter is a class that
133
- # responds to the before and after methods. Both methods
134
- # are prepended to the respective lists.
135
-
136
- def prepend_arround_filter(*args)
137
- options = args.pop if args.last.is_a?(Hash)
138
-
139
- filters = [options].flatten
140
-
141
- for filter in filters
142
- if filter.respond_to?(:before)
143
- prepend_before_filter(options) { |c| filter.before(c) }
144
- elsif filter.respond_to?(:filter)
145
- # consider 'filter' as synonym of before.
146
- prepend_before_filter(options) { |c| filter.filter(c) }
147
- end
148
- prepend_after_filter(options) { |c| filter.after(c) } if filter.respond_to?(:after)
149
- end
150
- end
151
-
152
- # Install an arround Filter. A filter is a class that responds
153
- # to the before and after methods. Both methods are appended to
154
- # the respective lists.
155
-
156
- def append_arround_filter(*args)
157
- options = args.pop if args.last.is_a?(Hash)
158
-
159
- filters = [filters].flatten
160
-
161
- for filter in filters
162
- if filter.respond_to?(:before)
163
- append_before_filter(options) { |c| filter.before(c) }
164
- elsif filter.respond_to?(:filter)
165
- # consider 'filter' as synonym of before.
166
- append_before_filter(options) { |c| filter.filter(c) }
167
- end
168
- append_after_filter(options) { |c| filter.after(c) } if filter.respond_to?(:after)
169
- end
170
- end
171
-
172
- # Alias for the most common case.
173
- alias :filter :append_arround_filter
174
-
175
- # Generates the code to call the filters
176
-
177
- def gen_filters_call_code(action, filters) # :nodoc:
178
- code = ""
179
-
180
- for filter in filters
181
-
182
- if options = filter.options
183
- if only = options[:only]
184
- next unless [only].flatten.include?(action.to_sym)
185
- elsif except = options[:except]
186
- next if [except].flatten.include?(action.to_sym)
187
- end
188
- end
189
-
190
- filter = filter.code
191
-
192
- if Symbol === filter
193
- code << "if #{filter} == false then return false end;"
194
- elsif String === filter
195
- code << "#{filter};"
196
- elsif filter.respond_to?('call') && (filter.arity == 1 || filter.arity == -1)
197
- code << 'if filter.call(self) == false then return false end;'
198
- elsif filter.is_a?(Module) and filter.instance_methods.size > 0
199
- class_eval "include #{filter};"
200
- meth = filter.instance_methods[0]
201
- code << "if #{meth} == false then return false end;"
202
- elsif filter.respond_to?('filter')
203
- code << "if #{filter}.filter(self) == false then return false end"
204
- else
205
- raise 'Valid filters are either a Symbol, a String or a Proc/Method.'
206
- end
207
- end
208
-
209
- return code
210
- end
211
- end
212
-
213
- end
214
-
215
- end