nitro 0.15.0 → 0.16.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 (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