ramaze 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/doc/AUTHORS +2 -0
- data/doc/CHANGELOG +173 -0
- data/doc/changes.txt +4184 -0
- data/doc/changes.xml +4186 -0
- data/doc/meta/announcement.txt +22 -25
- data/doc/meta/internals.txt +146 -9
- data/examples/blog/template/index.xhtml +5 -2
- data/examples/fcgi.rb +13 -0
- data/examples/wiktacular/main.rb +8 -0
- data/examples/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
- data/examples/wiktacular/mkd/link/current.mkd +1 -0
- data/examples/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
- data/examples/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
- data/examples/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
- data/examples/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
- data/examples/wiktacular/mkd/main/current.mkd +2 -0
- data/examples/wiktacular/mkd/markdown/current.mkd +3 -0
- data/examples/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
- data/examples/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
- data/examples/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
- data/examples/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
- data/examples/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
- data/examples/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
- data/examples/wiktacular/mkd/testing/current.mkd +17 -0
- data/examples/wiktacular/public/favicon.ico +0 -0
- data/examples/wiktacular/public/screen.css +72 -0
- data/examples/wiktacular/src/controller.rb +44 -0
- data/examples/wiktacular/src/model.rb +92 -0
- data/examples/wiktacular/src/page.rb +66 -0
- data/examples/wiktacular/template/edit.xhtml +7 -0
- data/examples/wiktacular/template/index.xhtml +11 -0
- data/examples/wiktacular/template/new.xhtml +7 -0
- data/lib/proto/main.rb +2 -0
- data/lib/proto/public/error.zmr +3 -0
- data/lib/proto/public/js/jquery.js +1755 -1334
- data/lib/proto/template/index.xhtml +2 -2
- data/lib/ramaze.rb +8 -3
- data/lib/ramaze/action/render.rb +11 -0
- data/lib/ramaze/adapter/base.rb +11 -7
- data/lib/ramaze/cache.rb +25 -10
- data/lib/ramaze/cache/memcached.rb +16 -1
- data/lib/ramaze/cache/yaml_store.rb +10 -0
- data/lib/ramaze/controller.rb +12 -2
- data/lib/ramaze/controller/error.rb +9 -3
- data/lib/ramaze/controller/resolve.rb +20 -18
- data/lib/ramaze/dispatcher.rb +13 -4
- data/lib/ramaze/dispatcher/action.rb +7 -3
- data/lib/ramaze/dispatcher/error.rb +24 -2
- data/lib/ramaze/dispatcher/file.rb +12 -6
- data/lib/ramaze/global.rb +0 -3
- data/lib/ramaze/global/dsl.rb +9 -0
- data/lib/ramaze/global/globalstruct.rb +7 -1
- data/lib/ramaze/helper/aspect.rb +4 -2
- data/lib/ramaze/helper/cgi.rb +2 -2
- data/lib/ramaze/helper/file.rb +3 -0
- data/lib/ramaze/helper/link.rb +20 -0
- data/lib/ramaze/helper/markaby.rb +3 -0
- data/lib/ramaze/helper/pager.rb +10 -17
- data/lib/ramaze/helper/partial.rb +9 -3
- data/lib/ramaze/inform/analogger.rb +14 -0
- data/lib/ramaze/inform/growl.rb +7 -0
- data/lib/ramaze/inform/hub.rb +9 -0
- data/lib/ramaze/inform/informer.rb +9 -3
- data/lib/ramaze/inform/informing.rb +9 -3
- data/lib/ramaze/inform/knotify.rb +5 -1
- data/lib/ramaze/inform/syslog.rb +3 -0
- data/lib/ramaze/inform/xosd.rb +12 -0
- data/lib/ramaze/template.rb +3 -0
- data/lib/ramaze/template/amrita2.rb +2 -0
- data/lib/ramaze/template/erubis.rb +1 -0
- data/lib/ramaze/template/ezamar.rb +1 -0
- data/lib/ramaze/template/ezamar/element.rb +17 -11
- data/lib/ramaze/template/ezamar/engine.rb +5 -0
- data/lib/ramaze/template/ezamar/render_partial.rb +4 -2
- data/lib/ramaze/template/haml.rb +4 -0
- data/lib/ramaze/template/liquid.rb +4 -0
- data/lib/ramaze/template/markaby.rb +4 -0
- data/lib/ramaze/template/remarkably.rb +4 -0
- data/lib/ramaze/tool.rb +10 -0
- data/lib/ramaze/tool/localize.rb +1 -1
- data/lib/ramaze/trinity/session.rb +8 -1
- data/lib/ramaze/version.rb +1 -1
- data/rake_tasks/maintaince.rake +2 -2
- data/spec/ramaze/action/basics.rb +1 -1
- data/spec/ramaze/cache.rb +11 -0
- data/spec/ramaze/controller.rb +0 -14
- data/spec/ramaze/dispatcher/file.rb +5 -5
- data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
- data/spec/ramaze/dispatcher/public/test_download.css +141 -0
- data/spec/ramaze/error.rb +21 -7
- data/spec/ramaze/helper/link.rb +15 -0
- data/spec/ramaze/helper/pager.rb +26 -3
- data/spec/ramaze/helper/partial.rb +2 -2
- metadata +43 -4
- data/doc/COPYING.ja +0 -51
@@ -7,9 +7,9 @@
|
|
7
7
|
<ol>
|
8
8
|
<li><code>template/index.xhtml</code>, which this text</li>
|
9
9
|
<li><code>src/elements/page.rb</code>, which is the Element around this text</li>
|
10
|
-
<li><code>src/controllers/main.rb</code>, where you can change the header of this page and the
|
10
|
+
<li><code>src/controllers/main.rb</code>, where you can change the header of this page and the <a href="/notemplate">notemplate</a> action</li>
|
11
11
|
<li><code>src/model.rb</code>, which is the the persistent backend for your app</li>
|
12
12
|
</ol>
|
13
13
|
</p>
|
14
|
-
<p>You can also read the tutorial in the <code>doc/</code> directory of ramaze or browse the <a href="http://ramaze.rubyforge.org/rdoc/files/doc/README.html">rdocs</a
|
14
|
+
<p>You can also read the tutorial in the <code>doc/</code> directory of ramaze or browse the <a href="http://ramaze.rubyforge.org/rdoc/files/doc/README.html">rdocs</a></p>
|
15
15
|
</Page>
|
data/lib/ramaze.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
# The main namespace for Ramaze
|
5
5
|
module Ramaze
|
6
6
|
BASEDIR = File.dirname(File.expand_path(__FILE__))
|
7
|
+
SEEED = $0.dup
|
7
8
|
$:.unshift BASEDIR
|
8
9
|
end
|
9
10
|
|
@@ -15,6 +16,7 @@ require 'ramaze/snippets'
|
|
15
16
|
require 'ramaze/inform'
|
16
17
|
require 'ramaze/global'
|
17
18
|
require 'ramaze/cache'
|
19
|
+
require 'ramaze/tool'
|
18
20
|
|
19
21
|
# Startup
|
20
22
|
require 'ramaze/controller'
|
@@ -42,10 +44,13 @@ module Ramaze
|
|
42
44
|
Inform.info("Starting up Ramaze (Version #{VERSION})")
|
43
45
|
|
44
46
|
starter = caller[0].split(':').first
|
45
|
-
return unless ($0 == starter or options.delete(:force))
|
46
47
|
|
47
|
-
|
48
|
-
|
48
|
+
if $0 == starter or options.delete(:force)
|
49
|
+
SEEED.replace(starter)
|
50
|
+
|
51
|
+
trait[:essentials].each do |obj|
|
52
|
+
obj.startup(options)
|
53
|
+
end
|
49
54
|
end
|
50
55
|
end
|
51
56
|
|
data/lib/ramaze/action/render.rb
CHANGED
@@ -22,6 +22,11 @@ module Ramaze
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
# Return the cached output of the action if it exists, otherwise do a
|
26
|
+
# normal Action#uncached_render and store the output in the Cache.actions.
|
27
|
+
# Action#cached_render is only called if Action#should_cache? returns
|
28
|
+
# true.
|
29
|
+
|
25
30
|
def cached_render
|
26
31
|
action_cache = Cache.actions
|
27
32
|
|
@@ -34,6 +39,9 @@ module Ramaze
|
|
34
39
|
action_cache[relaxed_hash] = uncached_render
|
35
40
|
end
|
36
41
|
|
42
|
+
# The 'normal' rendering process. Passes the Action instance to
|
43
|
+
# Action#engine.transform, which returns the output of the action.
|
44
|
+
|
37
45
|
def uncached_render
|
38
46
|
[ before_process,
|
39
47
|
engine.transform(self),
|
@@ -41,6 +49,9 @@ module Ramaze
|
|
41
49
|
].join
|
42
50
|
end
|
43
51
|
|
52
|
+
# return true if the action is flagged for caching. Called by
|
53
|
+
# Action#render.
|
54
|
+
|
44
55
|
def should_cache?
|
45
56
|
ctrait = controller.trait
|
46
57
|
actions_cached = ctrait[:actions_cached]
|
data/lib/ramaze/adapter/base.rb
CHANGED
@@ -27,22 +27,26 @@ module Ramaze
|
|
27
27
|
Inform.debug("Stopping #{self.class}")
|
28
28
|
end
|
29
29
|
|
30
|
+
# This is called by Rack with the usual env, subsequently calls
|
31
|
+
# ::respond with it.
|
32
|
+
#
|
33
|
+
# The method itself acts just as a wrapper for benchmarking and then
|
34
|
+
# calls .finish on the current response after ::respond has finished.
|
35
|
+
|
30
36
|
def call(env)
|
31
37
|
if Ramaze::Global.benchmarking
|
32
|
-
time = Benchmark.measure{ respond
|
38
|
+
time = Benchmark.measure{ respond(env) }
|
33
39
|
Inform.debug("request took #{time.real}s")
|
34
40
|
else
|
35
41
|
respond env
|
36
42
|
end
|
37
43
|
|
38
|
-
finish
|
44
|
+
Thread.current[:response].finish
|
39
45
|
end
|
40
46
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
response.finish
|
45
|
-
end
|
47
|
+
# Initializes Request with env and an empty Response. Records the
|
48
|
+
# request into Ramaze::Record if Global.record is true.
|
49
|
+
# Then goes on and calls Dispatcher::handle with request and response.
|
46
50
|
|
47
51
|
def respond env
|
48
52
|
request, response = Request.new(env), Response.new
|
data/lib/ramaze/cache.rb
CHANGED
@@ -14,18 +14,29 @@ module Ramaze
|
|
14
14
|
include Enumerable
|
15
15
|
CACHES = {} unless defined?(CACHES)
|
16
16
|
|
17
|
+
attr_accessor :cache
|
18
|
+
|
17
19
|
class << self
|
18
20
|
|
21
|
+
# Initializes the Cache for the general caches Ramaze uses.
|
22
|
+
# Cache#startup is called by Ramaze#startup, when initializing the
|
23
|
+
# Ramaze.trait(:essentials).
|
24
|
+
|
19
25
|
def startup(options)
|
20
26
|
Cache.add :compiled, :actions, :patterns, :resolved, :shield
|
21
27
|
end
|
22
28
|
|
23
29
|
# This will define a method to access a new cache directly over
|
24
|
-
#
|
30
|
+
# singleton-methods on Cache.
|
31
|
+
#---
|
32
|
+
# The @cache_name is internally used for caches which do not save
|
33
|
+
# different caches in different namespaces, for example memcached.
|
34
|
+
#+++
|
25
35
|
|
26
36
|
def add *keys
|
27
37
|
keys.each do |key|
|
28
38
|
CACHES[key] = new
|
39
|
+
CACHES[key].instance_variable_set("@cache_name", key)
|
29
40
|
self.class.class_eval do
|
30
41
|
define_method(key){ CACHES[key] }
|
31
42
|
end
|
@@ -35,30 +46,34 @@ module Ramaze
|
|
35
46
|
|
36
47
|
end
|
37
48
|
|
49
|
+
# Initializes the cache, defined by Global.cache
|
50
|
+
|
38
51
|
def initialize(cache = Global.cache)
|
39
52
|
@cache = cache.new
|
40
53
|
end
|
41
54
|
|
42
55
|
def [](key)
|
43
|
-
@cache[key
|
56
|
+
@cache["#{@cache_name}:#{key}"]
|
44
57
|
end
|
45
58
|
|
46
59
|
def []=(key, value)
|
47
|
-
@cache[key
|
60
|
+
@cache["#{@cache_name}:#{key}"] = value
|
48
61
|
end
|
49
62
|
|
63
|
+
# deletes the keys of each argument passed from Cache instance.
|
64
|
+
|
50
65
|
def delete(*args)
|
51
66
|
args.each do |arg|
|
52
|
-
@cache.delete(arg
|
67
|
+
@cache.delete("#{@cache_name}:#{arg}")
|
53
68
|
end
|
54
69
|
end
|
55
70
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
71
|
+
def clear
|
72
|
+
@cache.clear
|
73
|
+
end
|
74
|
+
|
75
|
+
def values_at(*args)
|
76
|
+
@cache.values_at(*args.map {|key| "#{@cache_name}:#{key}" })
|
62
77
|
end
|
63
78
|
end
|
64
79
|
end
|
@@ -3,6 +3,10 @@
|
|
3
3
|
require 'memcache'
|
4
4
|
|
5
5
|
module Ramaze
|
6
|
+
|
7
|
+
# Cache based on the memcache library which utilizes the memcache-daemon to
|
8
|
+
# store key/value pairs in namespaces.
|
9
|
+
|
6
10
|
class MemcachedCache
|
7
11
|
|
8
12
|
# Create a new MemcachedCache with host, port and a namespace that defaults
|
@@ -10,7 +14,8 @@ module Ramaze
|
|
10
14
|
#
|
11
15
|
# For your own usage you should use another namespace.
|
12
16
|
|
13
|
-
def initialize(host = 'localhost', port = '11211', namespace =
|
17
|
+
def initialize(host = 'localhost', port = '11211', namespace = SEEED)
|
18
|
+
namespace = Digest::SHA1.hexdigest(namespace)[0..16]
|
14
19
|
@cache = MemCache.new("#{host}:#{port}", :namespace => namespace, :multithread => true)
|
15
20
|
end
|
16
21
|
|
@@ -63,6 +68,10 @@ end
|
|
63
68
|
# add the MemCache#clear method
|
64
69
|
|
65
70
|
class MemCache
|
71
|
+
|
72
|
+
# MemCache.clear sends 'flush_all' command to all registered MemCache
|
73
|
+
# servers.
|
74
|
+
|
66
75
|
def clear
|
67
76
|
raise MemCacheError, "Update of readonly cache" if @readonly
|
68
77
|
|
@@ -71,7 +80,13 @@ class MemCache
|
|
71
80
|
end
|
72
81
|
end
|
73
82
|
|
83
|
+
# implements the flushing of MemCache server. Flushes a single server,
|
84
|
+
# MemCache#clear can be used for clearing out all MemCache servers.
|
85
|
+
|
74
86
|
class Server
|
87
|
+
|
88
|
+
# Serverside implementation of the #clear functionality for MemCache
|
89
|
+
|
75
90
|
def flush_all
|
76
91
|
socket.write "flush_all\r\n"
|
77
92
|
end
|
@@ -3,6 +3,10 @@
|
|
3
3
|
require 'yaml/store'
|
4
4
|
|
5
5
|
module Ramaze
|
6
|
+
|
7
|
+
# Cache based on _whys YAML::Store, which uses PStore to serialize objects
|
8
|
+
# as YAML in a thread-safe manner.
|
9
|
+
|
6
10
|
class YAMLStoreCache
|
7
11
|
|
8
12
|
attr_accessor :file
|
@@ -23,16 +27,22 @@ module Ramaze
|
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
30
|
+
# Loads @file into memory via YAML::load_file
|
31
|
+
|
26
32
|
def underlying_yaml
|
27
33
|
YAML.load_file(@file)
|
28
34
|
end
|
29
35
|
|
36
|
+
# clears the YAML::Store based cache, by emptying the YAML file.
|
37
|
+
|
30
38
|
def clear
|
31
39
|
transaction do |y|
|
32
40
|
File.open(@file, 'w+'){|f| f.puts({}.to_yaml)}
|
33
41
|
end
|
34
42
|
end
|
35
43
|
|
44
|
+
# Deletes the key from YAML::Store based cache.
|
45
|
+
|
36
46
|
def delete(key)
|
37
47
|
transaction do |y|
|
38
48
|
y.delete(key)
|
data/lib/ramaze/controller.rb
CHANGED
@@ -60,7 +60,11 @@ module Ramaze
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
|
63
|
+
if Global.mapping.empty?
|
64
|
+
Inform.warn("No Controllers mapped, will serve /public only.")
|
65
|
+
else
|
66
|
+
Inform.debug("mapped Controllers: #{Global.mapping.inspect}")
|
67
|
+
end
|
64
68
|
end
|
65
69
|
|
66
70
|
# checks paths for existance and logs a warning if it doesn't exist yet.
|
@@ -70,7 +74,7 @@ module Ramaze
|
|
70
74
|
end
|
71
75
|
|
72
76
|
# if trait[:automap] is set and controller is not in Global.mapping yet
|
73
|
-
# this will build a new default mapping-point,
|
77
|
+
# this will build a new default mapping-point, MainController is put
|
74
78
|
# at '/' by default.
|
75
79
|
|
76
80
|
def mapping
|
@@ -90,6 +94,12 @@ module Ramaze
|
|
90
94
|
end
|
91
95
|
end
|
92
96
|
|
97
|
+
# Returns the Controller at a mapped path.
|
98
|
+
|
99
|
+
def at(mapping)
|
100
|
+
Global.mapping[mapping.to_s]
|
101
|
+
end
|
102
|
+
|
93
103
|
# Define a template_root for Controller, returns the current template_root
|
94
104
|
# if no argument is given.
|
95
105
|
# Runs every given path through Controller::check_path
|
@@ -8,14 +8,20 @@ module Ramaze
|
|
8
8
|
#
|
9
9
|
# Error-pages can be in whatever the templating-engine of your controller
|
10
10
|
# is set to.
|
11
|
-
#
|
11
|
+
# Ramaze::Dispatcher::Error.current
|
12
12
|
# holds the exception thrown.
|
13
13
|
|
14
14
|
def error
|
15
|
-
error =
|
16
|
-
@backtrace = error.backtrace[0..20]
|
15
|
+
error = Ramaze::Dispatcher::Error.current
|
17
16
|
title = error.message
|
18
17
|
|
18
|
+
unless Action.current.template
|
19
|
+
response['Content-Type'] = 'text/plain'
|
20
|
+
return [title, "", error.backtrace].flatten.join("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
@backtrace = error.backtrace[0..20]
|
24
|
+
|
19
25
|
@colors = []
|
20
26
|
min = 200
|
21
27
|
max = 255
|
@@ -14,7 +14,12 @@ module Ramaze
|
|
14
14
|
|
15
15
|
def resolve(path)
|
16
16
|
if found = Cache.resolved[path]
|
17
|
-
|
17
|
+
if found.respond_to?(:relaxed_hash)
|
18
|
+
return found
|
19
|
+
else
|
20
|
+
Inform.warn("Found faulty `#{path}' in Cache.resolved, deleting it for sanity.")
|
21
|
+
Cache.resolved.delete path
|
22
|
+
end
|
18
23
|
end
|
19
24
|
|
20
25
|
mapping = Global.mapping
|
@@ -32,7 +37,7 @@ module Ramaze
|
|
32
37
|
action = controller.resolve_action(method, *params)
|
33
38
|
template = action.template
|
34
39
|
|
35
|
-
valid_action = (action.method or (params.empty? &&
|
40
|
+
valid_action = (action.method or (params.empty? && template))
|
36
41
|
|
37
42
|
return Cache.resolved[path] = action if valid_action
|
38
43
|
end
|
@@ -75,7 +80,7 @@ module Ramaze
|
|
75
80
|
|
76
81
|
def template_paths
|
77
82
|
@template_root ||= Global.template_root / Global.mapping.invert[self]
|
78
|
-
[ @template_root, Global.public_root
|
83
|
+
[ @template_root, Global.public_root ].compact
|
79
84
|
end
|
80
85
|
|
81
86
|
def resolve_method(name, *params)
|
@@ -100,28 +105,24 @@ module Ramaze
|
|
100
105
|
def pattern_for(path)
|
101
106
|
atoms = path.split('/').grep(/\S/)
|
102
107
|
atoms.unshift('')
|
103
|
-
patterns,
|
108
|
+
patterns, joiner = [], '/'
|
104
109
|
|
105
110
|
atoms.size.times do |enum|
|
106
111
|
enum += 1
|
107
|
-
|
108
|
-
|
109
|
-
joiners.each do |joinus|
|
110
|
-
pattern = atoms.dup
|
112
|
+
pattern = atoms.dup
|
111
113
|
|
112
|
-
|
113
|
-
|
114
|
-
|
114
|
+
controller = pattern[0, enum].join(joiner)
|
115
|
+
controller.gsub!(/^__/, '/')
|
116
|
+
controller = "/" if controller == ""
|
115
117
|
|
116
|
-
|
117
|
-
|
118
|
+
pattern = pattern[enum..-1]
|
119
|
+
args, temp = [], []
|
118
120
|
|
119
|
-
|
121
|
+
patterns << [controller, 'index', atoms[enum..-1]]
|
120
122
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
end
|
123
|
+
until pattern.empty?
|
124
|
+
args << pattern.shift
|
125
|
+
patterns << [controller, args.join( '__' ), pattern.dup]
|
125
126
|
end
|
126
127
|
end
|
127
128
|
|
@@ -145,6 +146,7 @@ module Ramaze
|
|
145
146
|
# Raises Ramaze::Error::NoAction
|
146
147
|
|
147
148
|
def raise_no_action(controller, path)
|
149
|
+
Thread.current[:failed_controller] = controller
|
148
150
|
raise Ramaze::Error::NoAction, "No Action found for `#{path}' on #{controller}"
|
149
151
|
end
|
150
152
|
end
|
data/lib/ramaze/dispatcher.rb
CHANGED
@@ -12,6 +12,10 @@ require 'ramaze/dispatcher/error'
|
|
12
12
|
require 'ramaze/dispatcher/file'
|
13
13
|
|
14
14
|
module Ramaze
|
15
|
+
|
16
|
+
# The Dispatcher receives requests from adapters and sets up the proper environment
|
17
|
+
# to process them and respond.
|
18
|
+
|
15
19
|
module Dispatcher
|
16
20
|
|
17
21
|
# requests are passed to every
|
@@ -35,7 +39,7 @@ module Ramaze
|
|
35
39
|
dispatch(path)
|
36
40
|
end
|
37
41
|
rescue Object => error
|
38
|
-
Dispatcher::Error.process(error)
|
42
|
+
Dispatcher::Error.process(error, :path => path, :request => request)
|
39
43
|
end
|
40
44
|
|
41
45
|
def dispatch(path)
|
@@ -78,14 +82,19 @@ module Ramaze
|
|
78
82
|
|
79
83
|
# Calls .process(path) on every class in Dispatcher::FILTER until one
|
80
84
|
# returns something else than false/nil.
|
81
|
-
# Raises NoAction otherwise.
|
82
85
|
|
83
86
|
def filter path
|
87
|
+
result = nil
|
84
88
|
FILTER.each do |dispatcher|
|
85
89
|
result = dispatcher.process(path)
|
86
|
-
return result if result
|
90
|
+
return result if result and not result.respond_to?(:exception)
|
87
91
|
end
|
88
|
-
|
92
|
+
|
93
|
+
meta = {
|
94
|
+
:path => path,
|
95
|
+
:controller => Thread.current[:failed_controller]
|
96
|
+
}
|
97
|
+
Dispatcher::Error.process(result, meta)
|
89
98
|
end
|
90
99
|
|
91
100
|
# build a response, default values are from the current response.
|