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/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
|