nitro 0.31.0 → 0.40.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/adapter/script.rb
CHANGED
@@ -12,7 +12,7 @@ class ScriptAdapter
|
|
12
12
|
|
13
13
|
attr_accessor :response
|
14
14
|
|
15
|
-
def initialize
|
15
|
+
def initialize(server)
|
16
16
|
@server = server
|
17
17
|
end
|
18
18
|
|
@@ -25,7 +25,7 @@ class ScriptAdapter
|
|
25
25
|
# app.post 'users/login?name=gmosx;password=pass
|
26
26
|
# app.post 'articles/view/1'
|
27
27
|
|
28
|
-
def handle
|
28
|
+
def handle(uri, options = {})
|
29
29
|
context = Context.new(@server)
|
30
30
|
|
31
31
|
begin
|
@@ -52,14 +52,14 @@ class ScriptAdapter
|
|
52
52
|
|
53
53
|
# Perform a programmatic http get request to the web app.
|
54
54
|
|
55
|
-
def get
|
55
|
+
def get(uri, options = {})
|
56
56
|
options[:method] = :get
|
57
57
|
handle uri, options
|
58
58
|
end
|
59
59
|
|
60
60
|
# Perform a programmatic http post request to the web app.
|
61
61
|
|
62
|
-
def post
|
62
|
+
def post(uri, options = {})
|
63
63
|
options[:method] = :post
|
64
64
|
handle uri, options
|
65
65
|
end
|
@@ -67,5 +67,3 @@ class ScriptAdapter
|
|
67
67
|
end
|
68
68
|
|
69
69
|
end
|
70
|
-
|
71
|
-
# * George Moschovitis <gm@navel.gr>
|
@@ -45,9 +45,16 @@ class Webrick
|
|
45
45
|
]
|
46
46
|
)
|
47
47
|
|
48
|
-
|
49
|
-
|
48
|
+
if $record_session_filename
|
49
|
+
require 'nitro/adapter/webrick/vcr'
|
50
|
+
VCR.record($record_session_filename)
|
51
|
+
end
|
50
52
|
|
53
|
+
if $playback_session_filename
|
54
|
+
require 'nitro/adapter/webrick/vcr'
|
55
|
+
VCR.playback($playback_session_filename)
|
56
|
+
end
|
57
|
+
|
51
58
|
@webrick = WEBrick::HTTPServer.new(webrick_options)
|
52
59
|
|
53
60
|
trap('INT') { stop }
|
@@ -71,75 +78,6 @@ class Webrick
|
|
71
78
|
def initialize_webrick(server)
|
72
79
|
end
|
73
80
|
|
74
|
-
# Enables session recording. The recorded data can be used
|
75
|
-
# for automatic app testing by means of the playback mode.
|
76
|
-
|
77
|
-
def enable_record_mode(filename = 'session.yaml')
|
78
|
-
Logger.info "Recording application server session to '#{filename}'."
|
79
|
-
|
80
|
-
require 'facets/core/file/self/create'
|
81
|
-
|
82
|
-
$record_session = []
|
83
|
-
$last_record_time = Time.now
|
84
|
-
|
85
|
-
Nitro::WebrickAdapter.class_eval %{
|
86
|
-
def do_GET(req, res)
|
87
|
-
record_context(req, res)
|
88
|
-
handle(req, res)
|
89
|
-
end
|
90
|
-
alias_method :do_POST, :do_GET
|
91
|
-
|
92
|
-
def record_context(req, res)
|
93
|
-
delta = Time.now - $last_record_time
|
94
|
-
$last_record_time = Time.now
|
95
|
-
$record_session << [delta, req, res]
|
96
|
-
end
|
97
|
-
}
|
98
|
-
|
99
|
-
at_exit do
|
100
|
-
File.create(filename, YAML.dump($record_session))
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
# Playback a recorded session. Typically used for testing.
|
105
|
-
|
106
|
-
def enable_playback_mode(filename = 'session.yaml')
|
107
|
-
Logger.info "Playing back application server session from '#{filename}'."
|
108
|
-
|
109
|
-
$playback_session = YAML.load_file(filename)
|
110
|
-
$playback_exception_count = 0
|
111
|
-
|
112
|
-
WEBrick::HTTPServer.class_eval %{
|
113
|
-
def start(&block)
|
114
|
-
run(nil)
|
115
|
-
end
|
116
|
-
|
117
|
-
def run(sock)
|
118
|
-
while true
|
119
|
-
delta, req, res = $playback_session.shift
|
120
|
-
|
121
|
-
if delta
|
122
|
-
sleep(delta)
|
123
|
-
begin
|
124
|
-
service(req, res)
|
125
|
-
rescue Object => ex
|
126
|
-
$playback_exception_count += 1
|
127
|
-
p '---', ex
|
128
|
-
end
|
129
|
-
else
|
130
|
-
return
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
}
|
135
|
-
|
136
|
-
at_exit do
|
137
|
-
puts "\n\n"
|
138
|
-
puts "Playback raised #$playback_exception_count exceptions.\n"
|
139
|
-
puts "\n"
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
81
|
end
|
144
82
|
|
145
83
|
end
|
@@ -168,6 +106,8 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
|
|
168
106
|
@server = server
|
169
107
|
@server.options[:HandlerTable] = { 'xhtml' => XhtmlFileHandler }
|
170
108
|
|
109
|
+
@handle_static_files = Server.handle_static_files
|
110
|
+
|
171
111
|
# Handles static resources. Useful when running
|
172
112
|
# a stand-alone webrick server.
|
173
113
|
|
@@ -181,18 +121,28 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
|
|
181
121
|
# Handle a static file. Also handles cached pages.
|
182
122
|
|
183
123
|
def handle_file(req, res)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
124
|
+
rewrite(req)
|
125
|
+
|
126
|
+
# gmosx, FIXME: this is a nasty hack that fixes a really
|
127
|
+
# *nasty* caching bug. Find a better solution. When hitting
|
128
|
+
# the backend server, if the index method takes parameters
|
129
|
+
# the dispatcher considers all static files as parameters.
|
130
|
+
# If you have output caching enabled for the index page,
|
131
|
+
# all your static files get corrupted.
|
132
|
+
|
133
|
+
if (@handle_static_files == false) and (req.path_info =~ /\.html$/)
|
192
134
|
return false
|
193
|
-
ensure
|
194
|
-
unrewrite(req)
|
195
135
|
end
|
136
|
+
|
137
|
+
@file_handler.do_GET(req, res)
|
138
|
+
return true
|
139
|
+
rescue WEBrick::HTTPStatus::PartialContent, WEBrick::HTTPStatus::NotModified => err
|
140
|
+
res.set_error(err)
|
141
|
+
return true
|
142
|
+
rescue Object => ex
|
143
|
+
return false
|
144
|
+
ensure
|
145
|
+
unrewrite(req)
|
196
146
|
end
|
197
147
|
|
198
148
|
# Handle the request.
|
@@ -243,7 +193,7 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
|
|
243
193
|
if req.path_info == '/'
|
244
194
|
req.instance_variable_set(:@path_info, '/index.html')
|
245
195
|
elsif req.path_info =~ /^([^.]+)$/
|
246
|
-
req.instance_variable_set(:@path_info, "#{$1}
|
196
|
+
req.instance_variable_set(:@path_info, "#{$1}.html")
|
247
197
|
end
|
248
198
|
end
|
249
199
|
|
@@ -252,14 +202,10 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
|
|
252
202
|
def unrewrite(req)
|
253
203
|
if req.path_info == '/index.html'
|
254
204
|
req.instance_variable_set(:@path_info, '/')
|
255
|
-
elsif req.path_info =~ /^([^.]+)
|
205
|
+
elsif req.path_info =~ /^([^.]+)\.html$/
|
256
206
|
req.instance_variable_set(:@path_info, $1)
|
257
207
|
end
|
258
208
|
end
|
259
209
|
end
|
260
210
|
|
261
211
|
end
|
262
|
-
|
263
|
-
# * George Moschovitis <gm@navel.gr>
|
264
|
-
# * Guillaume Pierronnet <guillaume.pierronnet@laposte.net>
|
265
|
-
# * Bryan Soto <bryan.a.soto@gmail.com>
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'nitro/adapter/webrick'
|
2
|
+
|
3
|
+
class Webrick
|
4
|
+
|
5
|
+
# VCR functionality, typically used for proxy based regression
|
6
|
+
# testing.
|
7
|
+
|
8
|
+
class VCR
|
9
|
+
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Enables session recording. The recorded data can be used
|
13
|
+
# for automatic app testing by means of the playback mode.
|
14
|
+
|
15
|
+
def record(filename = 'session.yaml')
|
16
|
+
Logger.info "Recording application server session to '#{filename}'."
|
17
|
+
|
18
|
+
require 'facets/core/file/self/create'
|
19
|
+
|
20
|
+
$record_session = []
|
21
|
+
$last_record_time = Time.now
|
22
|
+
|
23
|
+
Nitro::WebrickAdapter.class_eval %{
|
24
|
+
def do_GET(req, res)
|
25
|
+
record_context(req, res)
|
26
|
+
handle(req, res)
|
27
|
+
end
|
28
|
+
alias_method :do_POST, :do_GET
|
29
|
+
|
30
|
+
def record_context(req, res)
|
31
|
+
delta = Time.now - $last_record_time
|
32
|
+
$last_record_time = Time.now
|
33
|
+
$record_session << [delta, req, res]
|
34
|
+
end
|
35
|
+
}
|
36
|
+
|
37
|
+
at_exit do
|
38
|
+
File.create(filename, YAML.dump($record_session))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Playback a recorded session. Typically used for testing.
|
43
|
+
|
44
|
+
def playback(filename = 'session.yaml')
|
45
|
+
Logger.info "Playing back application server session from '#{filename}'."
|
46
|
+
|
47
|
+
$playback_session = YAML.load_file(filename)
|
48
|
+
$playback_exception_count = 0
|
49
|
+
|
50
|
+
WEBrick::HTTPServer.class_eval %{
|
51
|
+
def start(&block)
|
52
|
+
run(nil)
|
53
|
+
end
|
54
|
+
|
55
|
+
def run(sock)
|
56
|
+
while true
|
57
|
+
delta, req, res = $playback_session.shift
|
58
|
+
|
59
|
+
if delta
|
60
|
+
sleep(delta)
|
61
|
+
begin
|
62
|
+
service(req, res)
|
63
|
+
rescue Object => ex
|
64
|
+
$playback_exception_count += 1
|
65
|
+
p '---', ex
|
66
|
+
end
|
67
|
+
else
|
68
|
+
return
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
}
|
73
|
+
|
74
|
+
at_exit do
|
75
|
+
puts "\n\n"
|
76
|
+
puts "Playback raised #$playback_exception_count exceptions.\n"
|
77
|
+
puts "\n"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
data/lib/nitro/caching.rb
CHANGED
data/lib/nitro/caching/output.rb
CHANGED
@@ -1,17 +1,25 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
|
3
|
+
require 'nitro/helper/url'
|
4
|
+
|
3
5
|
module Nitro
|
4
6
|
|
5
7
|
# Adds support for caching.
|
6
8
|
|
7
9
|
module Caching
|
8
10
|
|
11
|
+
# The directory where cached pages are generated.
|
12
|
+
#--
|
13
|
+
# TODO: use Server.public_root as default.
|
14
|
+
#++
|
15
|
+
|
9
16
|
setting :output_cache_root, :default => 'public', :doc => 'The directory where cached pages are generated'
|
10
17
|
|
11
18
|
# The Output caching subsystem stores whole pages in the
|
12
19
|
# filesystem to be served directly be the front web server
|
13
20
|
# (Lighttpd, Apache, etc) for optimal performance.
|
14
|
-
#
|
21
|
+
# require 'nitro/helper/url'
|
22
|
+
|
15
23
|
# Nitro promotes coding your application in such a way as to
|
16
24
|
# allow for output caching to the greatest extend. Output
|
17
25
|
# caching *is your friend*.
|
@@ -22,6 +30,16 @@ module Caching
|
|
22
30
|
|
23
31
|
module Output
|
24
32
|
|
33
|
+
# TODO: something more elegant here.
|
34
|
+
|
35
|
+
class << self
|
36
|
+
# The collection of cached actions.
|
37
|
+
|
38
|
+
attr_accessor :cached_actions
|
39
|
+
end
|
40
|
+
|
41
|
+
Nitro::Caching::Output.cached_actions = []
|
42
|
+
|
25
43
|
def self.included(base) # :nodoc:
|
26
44
|
base.extend(ClassMethods)
|
27
45
|
end
|
@@ -40,6 +58,11 @@ module Caching
|
|
40
58
|
def cache_output(*actions)
|
41
59
|
return unless caching_enabled?
|
42
60
|
|
61
|
+
# keep track of cached actions.
|
62
|
+
for a in actions
|
63
|
+
Nitro::Caching::Output.cached_actions << [self, a]
|
64
|
+
end
|
65
|
+
|
43
66
|
str = actions.collect { |a| ":#{a}" }.join(', ')
|
44
67
|
|
45
68
|
module_eval %{
|
@@ -48,14 +71,22 @@ module Caching
|
|
48
71
|
end
|
49
72
|
|
50
73
|
private
|
51
|
-
|
74
|
+
=begin
|
52
75
|
def output_cache_path(path)
|
53
76
|
filename = ((path.empty? || path == '/') ? 'index.html' : path.dup)
|
54
|
-
# filename.gsub!(/\/$/, '')
|
55
77
|
filename << '/index.html' unless (filename.split('/').last || filename).include? '.'
|
56
|
-
return Caching.output_cache_root
|
78
|
+
return File.join(Caching.output_cache_root, filename).squeeze('/')
|
79
|
+
end
|
80
|
+
=end
|
81
|
+
def output_cache_path(path)
|
82
|
+
if path.empty? or path == '/'
|
83
|
+
filename = 'index.html'
|
84
|
+
else
|
85
|
+
filename = "#{path}.html"
|
86
|
+
end
|
87
|
+
return File.join(Caching.output_cache_root, filename).squeeze('/')
|
57
88
|
end
|
58
|
-
|
89
|
+
|
59
90
|
end
|
60
91
|
|
61
92
|
private
|
@@ -70,19 +101,19 @@ module Caching
|
|
70
101
|
# cache key. The cache key is typically the name of the
|
71
102
|
# top level action responsible for generating the page.
|
72
103
|
#--
|
73
|
-
# If you change this method, don't forget the CacheSweeper
|
104
|
+
# WARNING: If you change this method, don't forget the CacheSweeper
|
74
105
|
# expire method.
|
106
|
+
# FIXME: make the above unneeded through refactoring.
|
75
107
|
#++
|
76
108
|
|
77
109
|
def expire_output(name)
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
110
|
+
filename = "#{Server.public_root}/#{name}".squeeze('/')
|
111
|
+
Logger.debug "Expiring cache file '#{filename}'" if $DBG
|
112
|
+
FileUtils.rm_rf(filename)
|
113
|
+
rescue Object => ex
|
114
|
+
# ignore any error.
|
84
115
|
end
|
85
|
-
|
116
|
+
alias delete_output expire_output
|
86
117
|
|
87
118
|
# Is caching allowed for this action (page)? The default
|
88
119
|
# implementation does not cache post request or request
|
@@ -91,7 +122,7 @@ module Caching
|
|
91
122
|
# for 'nice' urls.
|
92
123
|
|
93
124
|
def caching_allowed?
|
94
|
-
not (
|
125
|
+
not (request.post? or request.uri =~ /\?/)
|
95
126
|
end
|
96
127
|
|
97
128
|
end
|
@@ -99,5 +130,3 @@ module Caching
|
|
99
130
|
end
|
100
131
|
|
101
132
|
end
|
102
|
-
|
103
|
-
# * George Moschovitis <gm@navel.gr>
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'nitro/helper/url'
|
2
|
+
require 'nitro/caching/output'
|
3
|
+
|
4
|
+
module Nitro
|
5
|
+
|
6
|
+
module Caching
|
7
|
+
|
8
|
+
# A proxy to the caching system. This is typically used from the
|
9
|
+
# console.
|
10
|
+
#--
|
11
|
+
# gmosx: If anyone can suggest a better name, please speak up!
|
12
|
+
#++
|
13
|
+
|
14
|
+
class Proxy
|
15
|
+
extend URLHelper
|
16
|
+
extend Output
|
17
|
+
|
18
|
+
class << self
|
19
|
+
|
20
|
+
def cleanup_output
|
21
|
+
dirs = {}
|
22
|
+
|
23
|
+
for ctrl, a in Nitro::Caching::Output.cached_actions
|
24
|
+
file = encode_url(ctrl, a)
|
25
|
+
|
26
|
+
file << 'index' if file == '/'
|
27
|
+
|
28
|
+
unless dirs[file]
|
29
|
+
puts "Expiring cache directory '#{file}'"
|
30
|
+
expire_output(file)
|
31
|
+
dirs[file] = true
|
32
|
+
end
|
33
|
+
|
34
|
+
file << '.html'
|
35
|
+
puts "Expiring cache file '#{file}'"
|
36
|
+
expire_output(file)
|
37
|
+
end
|
38
|
+
|
39
|
+
return true
|
40
|
+
end
|
41
|
+
alias cleanup cleanup_output
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|