nitro 0.31.0 → 0.40.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.
- data/bin/nitro +135 -37
- data/doc/CHANGELOG.1 +108 -108
- data/doc/CHANGELOG.2 +89 -89
- data/doc/CHANGELOG.3 +105 -105
- data/{CHANGELOG → doc/CHANGELOG.4} +509 -509
- data/doc/{AUTHORS → CONTRIBUTORS} +49 -37
- data/doc/LIBRARIES +13 -0
- data/doc/LICENSE +2 -3
- data/doc/MIGRATION +45 -0
- data/doc/RELEASES +131 -11
- data/doc/TODO +67 -0
- data/lib/glue/magick.rb +0 -3
- data/lib/glue/sweeper.rb +30 -15
- data/lib/glue/thumbnails.rb +0 -2
- data/lib/glue/webfile.rb +23 -11
- data/lib/nitro.rb +37 -44
- data/lib/nitro/adapter/cgi.rb +0 -3
- data/lib/nitro/adapter/console.rb +0 -2
- data/lib/nitro/adapter/fastcgi.rb +6 -3
- data/lib/nitro/adapter/mongrel.rb +97 -58
- data/lib/nitro/adapter/script.rb +4 -6
- data/lib/nitro/adapter/webrick.rb +33 -87
- data/lib/nitro/adapter/webrick/vcr.rb +85 -0
- data/lib/nitro/caching.rb +0 -2
- data/lib/nitro/caching/actions.rb +0 -2
- data/lib/nitro/caching/fragments.rb +0 -2
- data/lib/nitro/caching/output.rb +45 -16
- data/lib/nitro/caching/proxy.rb +49 -0
- data/lib/nitro/cgi.rb +3 -6
- data/lib/nitro/cgi/cookie.rb +0 -3
- data/lib/nitro/cgi/request.rb +67 -24
- data/lib/nitro/cgi/response.rb +0 -2
- data/lib/nitro/cgi/{sendfile.rb → send_file.rb} +7 -6
- data/lib/nitro/compiler.rb +62 -55
- data/lib/nitro/compiler/cleanup.rb +0 -3
- data/lib/nitro/compiler/elements.rb +31 -28
- data/lib/nitro/compiler/errors.rb +2 -5
- data/lib/nitro/compiler/include.rb +10 -8
- data/lib/nitro/compiler/layout.rb +0 -2
- data/lib/nitro/compiler/localization.rb +0 -2
- data/lib/nitro/compiler/markup.rb +14 -6
- data/lib/nitro/compiler/morphing.rb +1 -5
- data/lib/nitro/compiler/script.rb +2 -4
- data/lib/nitro/compiler/squeeze.rb +0 -2
- data/lib/nitro/compiler/xslt.rb +0 -2
- data/lib/nitro/context.rb +10 -5
- data/lib/nitro/control.rb +18 -0
- data/lib/nitro/control/attribute.rb +88 -0
- data/lib/nitro/control/attribute/checkbox.rb +19 -0
- data/lib/nitro/control/attribute/datetime.rb +21 -0
- data/lib/nitro/control/attribute/file.rb +20 -0
- data/lib/nitro/control/attribute/fixnum.rb +26 -0
- data/lib/nitro/control/attribute/float.rb +26 -0
- data/lib/nitro/control/attribute/options.rb +38 -0
- data/lib/nitro/control/attribute/password.rb +16 -0
- data/lib/nitro/control/attribute/text.rb +16 -0
- data/lib/nitro/control/attribute/textarea.rb +16 -0
- data/lib/nitro/control/none.rb +16 -0
- data/lib/nitro/control/relation.rb +53 -0
- data/lib/nitro/control/relation/belongs_to.rb +0 -0
- data/lib/nitro/control/relation/has_many.rb +97 -0
- data/lib/nitro/control/relation/joins_many.rb +0 -0
- data/lib/nitro/control/relation/many_to_many.rb +0 -0
- data/lib/nitro/control/relation/refers_to.rb +29 -0
- data/lib/nitro/controller.rb +7 -296
- data/lib/nitro/dispatcher.rb +72 -34
- data/lib/nitro/element.rb +36 -10
- data/lib/nitro/element/javascript.rb +0 -2
- data/lib/nitro/flash.rb +23 -10
- data/lib/nitro/global.rb +36 -11
- data/lib/nitro/helper.rb +22 -8
- data/lib/nitro/helper/benchmark.rb +0 -2
- data/lib/nitro/helper/buffer.rb +0 -3
- data/lib/nitro/helper/css.rb +12 -0
- data/lib/nitro/helper/debug.rb +1 -3
- data/lib/nitro/helper/default.rb +1 -0
- data/lib/nitro/helper/feed.rb +400 -386
- data/lib/nitro/helper/form.rb +246 -116
- data/lib/nitro/helper/javascript.rb +28 -2
- data/lib/nitro/helper/javascript/morphing.rb +0 -2
- data/lib/nitro/helper/javascript/prototype.rb +0 -2
- data/lib/nitro/helper/javascript/scriptaculous.rb +0 -1
- data/lib/nitro/helper/layout.rb +0 -2
- data/lib/nitro/helper/navigation.rb +87 -0
- data/lib/nitro/helper/pager.rb +11 -22
- data/lib/nitro/helper/table.rb +9 -32
- data/lib/nitro/helper/url.rb +104 -0
- data/lib/nitro/helper/xhtml.rb +20 -4
- data/lib/nitro/helper/xml.rb +0 -2
- data/lib/nitro/markup.rb +131 -0
- data/lib/nitro/part.rb +52 -7
- data/lib/nitro/publishable.rb +328 -0
- data/lib/nitro/render.rb +30 -61
- data/lib/nitro/router.rb +12 -4
- data/lib/nitro/sanitize.rb +48 -0
- data/lib/nitro/scaffold.rb +9 -11
- data/lib/nitro/scaffold/controller.rb +25 -0
- data/lib/nitro/scaffold/model.rb +150 -0
- data/lib/nitro/scaffolding.rb +1 -3
- data/lib/nitro/server.rb +57 -32
- data/lib/nitro/server/drb.rb +16 -2
- data/lib/nitro/server/runner.rb +80 -102
- data/lib/nitro/service.rb +0 -1
- data/lib/nitro/service/xmlrpc.rb +0 -2
- data/lib/nitro/session.rb +26 -18
- data/lib/nitro/session/drb.rb +2 -16
- data/lib/nitro/session/memory.rb +0 -2
- data/lib/nitro/template.rb +219 -0
- data/lib/nitro/test/assertions.rb +1 -3
- data/lib/nitro/test/context.rb +0 -1
- data/lib/nitro/test/testcase.rb +0 -1
- data/lib/nitro/version.rb +6 -0
- data/lib/part/admin.rb +16 -0
- data/lib/part/admin/controller.rb +19 -0
- data/lib/part/admin/helper.rb +30 -0
- data/lib/part/admin/og/controller.rb +114 -0
- data/lib/part/admin/og/customize.rb +4 -0
- data/lib/part/admin/og/template/index.xhtml +27 -0
- data/lib/part/admin/og/template/list.xhtml +38 -0
- data/lib/part/admin/og/template/search.xhtml +20 -0
- data/lib/part/admin/og/template/update.xhtml +25 -0
- data/lib/part/admin/skin.rb +207 -0
- data/lib/part/admin/template/denied.xhtml +13 -0
- data/lib/part/admin/template/index.xhtml +12 -0
- data/lib/part/admin/todo.txt +2 -0
- data/proto/public/error.xhtml +4 -2
- data/proto/run.rb +0 -2
- data/test/glue/tc_webfile.rb +1 -0
- data/test/nitro/cgi/tc_request.rb +23 -0
- data/test/nitro/helper/tc_feed.rb +0 -3
- data/test/nitro/helper/tc_navbar.rb +74 -0
- data/test/nitro/helper/tc_table.rb +2 -0
- data/test/nitro/tc_cgi.rb +72 -19
- data/test/nitro/tc_controller.rb +35 -26
- data/test/nitro/tc_controller_aspect.rb +1 -0
- data/test/nitro/tc_controller_params.rb +864 -0
- data/test/nitro/tc_dispatcher.rb +2 -2
- data/test/nitro/tc_element.rb +16 -16
- data/test/nitro/tc_flash.rb +3 -3
- data/test/nitro/tc_markup.rb +31 -0
- data/test/nitro/tc_render.rb +12 -14
- data/test/nitro/tc_session.rb +9 -7
- data/test/nitro/tc_template.rb +34 -0
- metadata +217 -198
- data/INSTALL +0 -121
- data/ProjectInfo +0 -74
- data/README +0 -555
- data/doc/apache.txt +0 -9
- data/doc/config.txt +0 -28
- data/doc/faq.txt +0 -7
- data/doc/lhttpd.txt +0 -7
- data/lib/nitro/adapter/scgi.rb +0 -239
- data/lib/nitro/helper/form/builder.rb +0 -144
- data/lib/nitro/helper/form/controls.rb +0 -389
- data/lib/nitro/helper/rss.rb +0 -72
- data/proto/conf/apache.conf +0 -51
- data/proto/public/scaffold/advanced_search.xhtml +0 -30
- data/proto/public/scaffold/edit.xhtml +0 -11
- data/proto/public/scaffold/form.xhtml +0 -1
- data/proto/public/scaffold/index.xhtml +0 -20
- data/proto/public/scaffold/list.xhtml +0 -32
- data/proto/public/scaffold/new.xhtml +0 -11
- data/proto/public/scaffold/search.xhtml +0 -29
- data/proto/public/scaffold/view.xhtml +0 -8
- data/proto/script/scgi_ctl +0 -221
- data/proto/script/scgi_service +0 -128
- data/setup.rb +0 -1585
- data/src/part/admin.rb +0 -16
- data/src/part/admin/controller.rb +0 -81
- data/src/part/admin/skin.rb +0 -21
- data/src/part/admin/system.css +0 -135
- data/src/part/admin/template/denied.xhtml +0 -1
- data/src/part/admin/template/index.xhtml +0 -43
- data/test/nitro/helper/tc_rss.rb +0 -24
data/lib/nitro/cgi.rb
CHANGED
|
@@ -78,7 +78,7 @@ class Cgi
|
|
|
78
78
|
|
|
79
79
|
def self.structure_param(params, key, val)
|
|
80
80
|
if key =~ /(.+)\[(.+)\]$/ or key =~ /([^\.]+)\.(.+)$/
|
|
81
|
-
params[$1] ||=
|
|
81
|
+
params[$1] ||= Dictionary.new
|
|
82
82
|
params[$1] = structure_param(params[$1], $2, val)
|
|
83
83
|
elsif key =~ /(.+)\[\]$/
|
|
84
84
|
params[$1] ||= Array.new
|
|
@@ -94,7 +94,7 @@ class Cgi
|
|
|
94
94
|
# in parse_request_params is not done here.
|
|
95
95
|
|
|
96
96
|
def self.parse_query_string(query_string)
|
|
97
|
-
params =
|
|
97
|
+
params = Dictionary.new
|
|
98
98
|
|
|
99
99
|
# gmosx, THINK: better return nil here?
|
|
100
100
|
return params if (query_string.nil? or query_string.empty?)
|
|
@@ -261,7 +261,7 @@ class Cgi
|
|
|
261
261
|
else
|
|
262
262
|
input.read(content_length)
|
|
263
263
|
end
|
|
264
|
-
if c.nil?
|
|
264
|
+
if c.nil? || c.empty?
|
|
265
265
|
raise EOFError, "bad content body"
|
|
266
266
|
end
|
|
267
267
|
buf.concat(c)
|
|
@@ -315,6 +315,3 @@ class Cgi
|
|
|
315
315
|
end
|
|
316
316
|
|
|
317
317
|
end
|
|
318
|
-
|
|
319
|
-
# * George Moschovitis <gm@navel.gr>
|
|
320
|
-
# * Guillaume Pierronnet <guillaume.pierronnet@gmail.com>
|
data/lib/nitro/cgi/cookie.rb
CHANGED
data/lib/nitro/cgi/request.rb
CHANGED
|
@@ -21,12 +21,13 @@ module Request
|
|
|
21
21
|
# The parsed query parameters collection.
|
|
22
22
|
|
|
23
23
|
attr_accessor :params
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
alias query params
|
|
25
|
+
alias parameters params
|
|
26
|
+
|
|
26
27
|
# The request cookies.
|
|
27
28
|
|
|
28
29
|
attr_accessor :cookies
|
|
29
|
-
|
|
30
|
+
alias cookie cookies
|
|
30
31
|
|
|
31
32
|
# The request protocol.
|
|
32
33
|
|
|
@@ -58,11 +59,11 @@ module Request
|
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
# Returns the domain part of a host.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
#
|
|
63
|
+
# === Examples
|
|
64
|
+
#
|
|
65
|
+
# www.nitroproject.org: request.domain # => 'nitroproject.org'
|
|
66
|
+
# www.nitroproject.co.uk: request.domain(2) # => 'nitroproject.co.uk'
|
|
66
67
|
|
|
67
68
|
def domain tld_length = 1
|
|
68
69
|
host.split('.').last(1 + tld_length).join('.')
|
|
@@ -95,6 +96,12 @@ module Request
|
|
|
95
96
|
headers['QUERY_STRING']
|
|
96
97
|
end
|
|
97
98
|
|
|
99
|
+
# The parameters the action will be called with
|
|
100
|
+
|
|
101
|
+
def action_params
|
|
102
|
+
headers['ACTION_PARAMS']
|
|
103
|
+
end
|
|
104
|
+
|
|
98
105
|
# The request method. Alternatively you could use the
|
|
99
106
|
# request method predicates.
|
|
100
107
|
#
|
|
@@ -168,7 +175,7 @@ module Request
|
|
|
168
175
|
not /XMLHttpRequest/i.match(@headers['HTTP_X_REQUESTED_WITH']).nil?
|
|
169
176
|
end
|
|
170
177
|
alias xhr? :xml_http_request?
|
|
171
|
-
alias
|
|
178
|
+
alias script? :xml_http_request?
|
|
172
179
|
|
|
173
180
|
# Return the referer. For the initial page in the
|
|
174
181
|
# clickstream there is no referer, set "/" by default.
|
|
@@ -197,7 +204,7 @@ module Request
|
|
|
197
204
|
|
|
198
205
|
if @headers.include?('HTTP_X_FORWARDED_FOR') then
|
|
199
206
|
remote_ips = @headers['HTTP_X_FORWARDED_FOR'].split(',').reject do |ip|
|
|
200
|
-
ip =~ /^unknown
|
|
207
|
+
ip =~ /^unknown$/i or local_net?(ip)
|
|
201
208
|
end
|
|
202
209
|
|
|
203
210
|
return remote_ips.first.strip unless remote_ips.empty?
|
|
@@ -206,6 +213,30 @@ module Request
|
|
|
206
213
|
return @headers['REMOTE_ADDR']
|
|
207
214
|
end
|
|
208
215
|
|
|
216
|
+
# Request is from a local network? (RFC1918 + localhost)
|
|
217
|
+
|
|
218
|
+
def local_net?(ip = remote_ip)
|
|
219
|
+
bip = ip.split('.').map{ |x| x.to_i }.pack('C4').unpack('N')[0]
|
|
220
|
+
|
|
221
|
+
# 127.0.0.1/32 => 2130706433
|
|
222
|
+
# 192.168.0.0/16 => 49320
|
|
223
|
+
# 172.16.0.0/12 => 2753
|
|
224
|
+
# 10.0.0.0/8 => 10
|
|
225
|
+
|
|
226
|
+
{ 0 => 2130706433, 16 => 49320, 20 => 2753, 24 => 10}.each do |s,c|
|
|
227
|
+
return true if (bip >> s) == c
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
return false
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# Request comming from local?
|
|
234
|
+
|
|
235
|
+
def local?(ip = remote_ip)
|
|
236
|
+
# TODO: should check if requesting machine is the one the server is running
|
|
237
|
+
return true if ip == '127.0.0.1'
|
|
238
|
+
end
|
|
239
|
+
|
|
209
240
|
# The server port.
|
|
210
241
|
|
|
211
242
|
def port
|
|
@@ -242,28 +273,36 @@ module Request
|
|
|
242
273
|
end
|
|
243
274
|
|
|
244
275
|
# Lookup a query parameter.
|
|
245
|
-
|
|
246
|
-
|
|
276
|
+
#--
|
|
277
|
+
# TODO: Check if unescape is needed.
|
|
278
|
+
#++
|
|
279
|
+
|
|
280
|
+
def [](param)
|
|
247
281
|
@params[param]
|
|
282
|
+
=begin
|
|
283
|
+
if par = @params[param] and par.is_a?(String)
|
|
284
|
+
CGI.unescape(par)
|
|
285
|
+
end
|
|
286
|
+
=end
|
|
248
287
|
end
|
|
249
288
|
|
|
250
289
|
# Set a query parameter.
|
|
251
290
|
|
|
252
|
-
def []=
|
|
291
|
+
def []=(param, value)
|
|
253
292
|
@params[param] = value
|
|
254
293
|
end
|
|
255
294
|
|
|
256
295
|
# Check if a boolean param (checkbox) is true.
|
|
257
296
|
|
|
258
|
-
def true?
|
|
297
|
+
def true?(param)
|
|
259
298
|
@params[param] == 'on'
|
|
260
299
|
end
|
|
261
|
-
|
|
262
|
-
|
|
300
|
+
alias enabled? true?
|
|
301
|
+
alias boolean true?
|
|
263
302
|
|
|
264
303
|
# Check if a boolean param (checkbox) is false.
|
|
265
304
|
|
|
266
|
-
def false?
|
|
305
|
+
def false?(param)
|
|
267
306
|
!true?(param)
|
|
268
307
|
end
|
|
269
308
|
|
|
@@ -274,15 +313,19 @@ module Request
|
|
|
274
313
|
end
|
|
275
314
|
|
|
276
315
|
# Check if a param is available.
|
|
277
|
-
|
|
316
|
+
#--
|
|
317
|
+
# gmosx: use nil test instead of has_key? to be more robust.
|
|
318
|
+
# (nil can be a hash element !)
|
|
319
|
+
#++
|
|
320
|
+
|
|
278
321
|
def has_key? key
|
|
279
|
-
|
|
322
|
+
!@params[key].nil?
|
|
280
323
|
end
|
|
281
|
-
|
|
282
|
-
|
|
324
|
+
alias has_param? has_key?
|
|
325
|
+
alias param? has_key?
|
|
326
|
+
alias has? has_key?
|
|
327
|
+
alias is? has_key?
|
|
328
|
+
|
|
283
329
|
end
|
|
284
330
|
|
|
285
331
|
end
|
|
286
|
-
|
|
287
|
-
# * George Moschovitis <gm@navel.gr>
|
|
288
|
-
# * Guillaume Pierronnet <guillaume.pierronnet@laposte.net>
|
data/lib/nitro/cgi/response.rb
CHANGED
|
@@ -16,20 +16,21 @@ module Render
|
|
|
16
16
|
#
|
|
17
17
|
# === Examples
|
|
18
18
|
#
|
|
19
|
-
# require 'nitro/cgi/
|
|
19
|
+
# require 'nitro/cgi/send_file'
|
|
20
|
+
#
|
|
20
21
|
# class MyController < Nitro:Controller
|
|
21
22
|
# def download(fname)
|
|
22
|
-
#
|
|
23
|
+
# send_file(fname)
|
|
23
24
|
# end
|
|
24
25
|
# end
|
|
25
26
|
#
|
|
26
27
|
# class MyController < Nitro:Controller
|
|
27
28
|
# def download()
|
|
28
|
-
#
|
|
29
|
+
# send_file('/etc/password', true)
|
|
29
30
|
# end
|
|
30
31
|
# end
|
|
31
|
-
|
|
32
|
-
def
|
|
32
|
+
|
|
33
|
+
def send_file(fname=nil, fullpath=false)
|
|
33
34
|
fname = fullpath ? fname : "#{Server.public_root}/#{fname}"
|
|
34
35
|
f = File.open(fname, "rb")
|
|
35
36
|
@context.response_headers["Cache-control"] = 'private'
|
|
@@ -38,8 +39,8 @@ module Render
|
|
|
38
39
|
@context.out = f
|
|
39
40
|
raise RenderExit
|
|
40
41
|
end
|
|
42
|
+
alias sendfile send_file
|
|
41
43
|
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
end
|
|
45
|
-
|
data/lib/nitro/compiler.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'nitro/template'
|
|
2
2
|
|
|
3
3
|
require 'nitro/compiler/errors'
|
|
4
4
|
|
|
@@ -59,7 +59,24 @@ class Compiler
|
|
|
59
59
|
# ...
|
|
60
60
|
# end
|
|
61
61
|
|
|
62
|
-
setting :transformation_pipeline, :default => [StaticInclude, Morphing,
|
|
62
|
+
setting :transformation_pipeline, :default => [StaticInclude, Morphing, ElementCompiler, MarkupCompiler, ScriptCompiler, Cleanup], :doc => 'The default transformation pipeline'
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# This specifies if
|
|
66
|
+
# def my_action(oid, val)
|
|
67
|
+
# should handle both
|
|
68
|
+
# my_action/1/23
|
|
69
|
+
# and
|
|
70
|
+
# my_action?oid=1;val=23
|
|
71
|
+
|
|
72
|
+
setting :mixin_get_parameters, :default => true
|
|
73
|
+
|
|
74
|
+
# Treats
|
|
75
|
+
# def my_action(oid, val)
|
|
76
|
+
# as
|
|
77
|
+
# def my_action(oid = nil, val = nil)
|
|
78
|
+
|
|
79
|
+
setting :non_strict_action_calling, :default => false
|
|
63
80
|
|
|
64
81
|
def initialize(controller = nil)
|
|
65
82
|
@controller = controller
|
|
@@ -75,7 +92,8 @@ class Compiler
|
|
|
75
92
|
# hello_world -> template_root/hello_world.xhtml
|
|
76
93
|
# this__is__my__hello_world -> template_root/this/is/my/hello_world
|
|
77
94
|
|
|
78
|
-
def template_for_action(action, ext =
|
|
95
|
+
def template_for_action(action, ext = Template.extension)
|
|
96
|
+
action = action.to_s
|
|
79
97
|
for template_root in @controller.instance_variable_get(:@template_root)
|
|
80
98
|
# attempt to find a template of the form
|
|
81
99
|
# template_root/action.xhtml
|
|
@@ -86,7 +104,7 @@ class Compiler
|
|
|
86
104
|
# attempt to find a template of the form
|
|
87
105
|
# template_root/action/index.xhtml
|
|
88
106
|
|
|
89
|
-
path = "#{template_root}/#{action.gsub(/__/, '/')}/#{
|
|
107
|
+
path = "#{template_root}/#{action.gsub(/__/, '/')}/#{Template.default}.#{ext}".squeeze('/')
|
|
90
108
|
return path if File.exist?(path)
|
|
91
109
|
end
|
|
92
110
|
return nil
|
|
@@ -174,7 +192,7 @@ class Compiler
|
|
|
174
192
|
#
|
|
175
193
|
# This generated method is called by the dispatcher.
|
|
176
194
|
#
|
|
177
|
-
# ===
|
|
195
|
+
# === Template root overloading
|
|
178
196
|
#
|
|
179
197
|
# Nitro provides a nice method of template_root overloading
|
|
180
198
|
# that allows you to use OOP principles with templates.
|
|
@@ -229,47 +247,40 @@ class Compiler
|
|
|
229
247
|
params = params.collect { |p| "@#{p} = @context['#{p}']" }
|
|
230
248
|
code << "#{params.join(';')}"
|
|
231
249
|
end
|
|
232
|
-
|
|
233
|
-
# Try to resolve action parameters. Returns negative
|
|
234
|
-
# numbers for arbitrary parameters.
|
|
235
|
-
#--
|
|
236
|
-
# gmosx: This needs a better implementation. Better means
|
|
237
|
-
# cleaner and more optimized code.
|
|
238
|
-
#++
|
|
239
|
-
|
|
240
|
-
param_count = @controller.instance_method(action.to_sym).arity
|
|
241
250
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
251
|
+
arity = @controller.instance_method(action.to_sym).arity
|
|
252
|
+
|
|
253
|
+
# Call action with given parameters, raises ActionError when the params
|
|
254
|
+
# are wrong.
|
|
255
|
+
# TODO: return 404 or other error code for browser?
|
|
256
|
+
|
|
257
|
+
code << %{
|
|
258
|
+
params = context.action_params || []
|
|
259
|
+
|
|
260
|
+
# Fill not given parameters with nils
|
|
261
|
+
|
|
262
|
+
arity = (#{arity} < -1) ? (#{arity}.abs - 1) : #{arity}
|
|
263
|
+
if Nitro::Compiler.non_strict_action_calling
|
|
264
|
+
arity.times {|i| params[i] ? nil : params[i] = nil }
|
|
253
265
|
end
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
+
|
|
267
|
+
# When arity zero, ignore params
|
|
268
|
+
params.clear if arity == 0
|
|
269
|
+
|
|
270
|
+
if Nitro::Compiler.mixin_get_parameters && params.empty? && arity > 0
|
|
271
|
+
context.params.each_with_index do |(k,v),i|
|
|
272
|
+
break if i > arity
|
|
273
|
+
params << v
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
begin
|
|
266
278
|
action_return_value = #{action}(*params)
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
end
|
|
279
|
+
rescue ArgumentError => e
|
|
280
|
+
raise ActionError, "Wrong parameter count for \#{@action_name}(\#{params.join(', ')})."
|
|
281
|
+
end
|
|
282
|
+
}
|
|
283
|
+
|
|
273
284
|
code << %{
|
|
274
285
|
unless :stop == action_return_value
|
|
275
286
|
}
|
|
@@ -285,14 +296,15 @@ class Compiler
|
|
|
285
296
|
# better practice to place the output related code in an
|
|
286
297
|
# external template file.
|
|
287
298
|
|
|
288
|
-
# Take :
|
|
299
|
+
# Take :template annotation into account.
|
|
289
300
|
|
|
290
|
-
|
|
291
|
-
|
|
301
|
+
unless template = @controller.ann(action.to_sym)[:template] # FIXME
|
|
302
|
+
template = action
|
|
303
|
+
end
|
|
292
304
|
|
|
293
305
|
# Search the [controller] class and it's ancestors for the template
|
|
294
306
|
|
|
295
|
-
template_path = template_for_action(
|
|
307
|
+
template_path = template_for_action(template.to_s)
|
|
296
308
|
if template_path or @controller.instance_methods.include?("#{action}_template")
|
|
297
309
|
valid = true
|
|
298
310
|
code << %{
|
|
@@ -313,7 +325,7 @@ class Compiler
|
|
|
313
325
|
|
|
314
326
|
if Render.redirect_on_empty
|
|
315
327
|
code << %{
|
|
316
|
-
|
|
328
|
+
redirect_to_referer if @out.empty?
|
|
317
329
|
}
|
|
318
330
|
end
|
|
319
331
|
|
|
@@ -354,12 +366,12 @@ class Compiler
|
|
|
354
366
|
# Typically used to precompile css templates.
|
|
355
367
|
|
|
356
368
|
def precompile(filename)
|
|
357
|
-
src = File.join(
|
|
369
|
+
src = File.join(Template.root, "#{filename}t")
|
|
358
370
|
dst = File.join(Server.public_root, filename)
|
|
359
371
|
|
|
360
372
|
if (!File.exist?(dst)) or (File.mtime(src) > File.mtime(dst))
|
|
361
373
|
Logger.info "Compiling template '#{src}' to '#{dst}'."
|
|
362
|
-
template =
|
|
374
|
+
template = FileTemplate.new(src)
|
|
363
375
|
File.open(dst, 'w') do |f|
|
|
364
376
|
f << template.process
|
|
365
377
|
end
|
|
@@ -371,8 +383,3 @@ class Compiler
|
|
|
371
383
|
end
|
|
372
384
|
|
|
373
385
|
end
|
|
374
|
-
|
|
375
|
-
# * George Moschovitis <gm@navel.gr>
|
|
376
|
-
# * Chris Farmiloe <chris.farmiloe@farmiloe.com>
|
|
377
|
-
# * Rob Pitt <rob@motionpath.co.uk>
|
|
378
|
-
# * Jonas Pfenniger <zimba.tm@gmail.com>
|
|
@@ -3,7 +3,7 @@ require 'rexml/streamlistener'
|
|
|
3
3
|
require 'facet/class/by_name'
|
|
4
4
|
|
|
5
5
|
require 'nitro/element'
|
|
6
|
-
require
|
|
6
|
+
require 'glue/html'
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
module Nitro
|
|
@@ -62,6 +62,7 @@ class Elements # :nodoc: all
|
|
|
62
62
|
def tag_end(name)
|
|
63
63
|
# check if the name starts with the element prefix, or
|
|
64
64
|
# is capitalized.
|
|
65
|
+
|
|
65
66
|
if is_element? name
|
|
66
67
|
obj, @buffer, @parent = @stack.pop
|
|
67
68
|
@buffer << obj.render
|
|
@@ -71,10 +72,10 @@ class Elements # :nodoc: all
|
|
|
71
72
|
end
|
|
72
73
|
|
|
73
74
|
|
|
74
|
-
# Check if a tag is a Nitro::Element. If found, it also
|
|
75
|
-
# auto-extend the klass.
|
|
76
|
-
#
|
|
77
|
-
|
|
75
|
+
# Check if a tag is a Nitro::Element. If found, it also
|
|
76
|
+
# tries to auto-extend the klass. Returns the Element class
|
|
77
|
+
# if found.
|
|
78
|
+
|
|
78
79
|
def is_element?(name)
|
|
79
80
|
# Doesn't support modulized classes
|
|
80
81
|
# name = name.demodulize
|
|
@@ -82,34 +83,42 @@ class Elements # :nodoc: all
|
|
|
82
83
|
|
|
83
84
|
name = name.gsub(PREFIX_RE,'').camelize if name =~ PREFIX_RE
|
|
84
85
|
|
|
85
|
-
#
|
|
86
|
+
# Try to use Controller::xxx
|
|
87
|
+
#--
|
|
88
|
+
# gmosx, THINK: this looks a bit dangerous to me!
|
|
89
|
+
#++
|
|
86
90
|
|
|
87
91
|
begin
|
|
88
|
-
|
|
92
|
+
#--
|
|
93
|
+
# gmosx, FIXME: Class.by_name also returns top level
|
|
94
|
+
# classes, how can we fix this?
|
|
95
|
+
#++
|
|
96
|
+
klass = Class.by_name("#{@compiler.controller}::#{name}")
|
|
89
97
|
rescue
|
|
98
|
+
# drink it!
|
|
90
99
|
end
|
|
91
100
|
|
|
92
|
-
#
|
|
101
|
+
# Try to use the Controller's :elements annotation
|
|
93
102
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
103
|
+
if (!klass) and namespace = @compiler.controller.ann.self[:element_namespace]
|
|
104
|
+
begin
|
|
105
|
+
klass = Class.by_name("#{namespace}::#{name}")
|
|
106
|
+
rescue
|
|
107
|
+
# drink it!
|
|
99
108
|
end
|
|
100
|
-
|
|
101
|
-
end unless klass
|
|
102
|
-
|
|
103
|
-
# Look in the root module
|
|
109
|
+
end
|
|
104
110
|
|
|
111
|
+
# Try to use Nitro::Element::xxx then ::xxx
|
|
112
|
+
|
|
105
113
|
begin
|
|
106
|
-
klass = Class.by_name(name)
|
|
114
|
+
klass = Class.by_name("Nitro::Element::#{name}")
|
|
107
115
|
rescue
|
|
116
|
+
# drink it!
|
|
108
117
|
end unless klass
|
|
109
118
|
|
|
110
|
-
return false unless klass.kind_of?
|
|
119
|
+
return false unless klass.kind_of? Class
|
|
111
120
|
|
|
112
|
-
# Try to auto-extend
|
|
121
|
+
# Try to auto-extend.
|
|
113
122
|
|
|
114
123
|
unless klass.ancestors.include? Nitro::Element
|
|
115
124
|
if Element.auto_extend
|
|
@@ -131,7 +140,7 @@ class Elements # :nodoc: all
|
|
|
131
140
|
end
|
|
132
141
|
|
|
133
142
|
def comment(c)
|
|
134
|
-
unless
|
|
143
|
+
unless Template.strip_xml_comments
|
|
135
144
|
@buffer << "<!--#{c}-->"
|
|
136
145
|
end
|
|
137
146
|
end
|
|
@@ -163,14 +172,8 @@ class Elements # :nodoc: all
|
|
|
163
172
|
end
|
|
164
173
|
end
|
|
165
174
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
unless const_defined? :ElementProcessor
|
|
169
|
-
ElementProcessor = Elements
|
|
175
|
+
unless const_defined? :ElementCompiler
|
|
170
176
|
ElementCompiler = Elements
|
|
171
177
|
end
|
|
172
178
|
|
|
173
179
|
end
|
|
174
|
-
|
|
175
|
-
# * George Moschovitis <gm@navel.gr>
|
|
176
|
-
# * Chris Farmiloe <chris.farmiloe@farmiloe.com>
|