ramaze 0.3.5 → 0.3.9
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/Rakefile +5 -20
- data/bin/ramaze +0 -4
- data/doc/AUTHORS +5 -0
- data/doc/meta/announcement.txt +2 -1
- data/doc/tutorial/todolist.html +20 -21
- data/doc/tutorial/todolist.mkd +10 -9
- data/examples/blog/{src/controller.rb → controller/main.rb} +2 -0
- data/examples/blog/{src/model.rb → model/entry.rb} +0 -0
- data/examples/blog/spec/blog.rb +3 -3
- data/examples/blog/start.rb +2 -3
- data/examples/blog/view/edit.xhtml +17 -0
- data/examples/blog/view/index.xhtml +17 -0
- data/examples/blog/view/layout.xhtml +11 -0
- data/examples/blog/view/new.xhtml +16 -0
- data/examples/facebook.rb +15 -8
- data/examples/identity.rb +1 -1
- data/examples/memleak_detector.rb +1 -1
- data/examples/rammit/src/model.rb +1 -1
- data/examples/rapaste/controller/paste.rb +7 -7
- data/examples/rapaste/model/paste.rb +1 -3
- data/examples/rapaste/public/css/display.css +2 -1
- data/examples/rapaste/start.rb +2 -3
- data/examples/sourceview/sourceview.rb +1 -1
- data/examples/templates/template/external.tenjin +28 -0
- data/examples/templates/template_amrita2.rb +0 -3
- data/examples/templates/template_tenjin.rb +57 -0
- data/examples/todolist/spec/todolist.rb +13 -2
- data/examples/todolist/src/controller/main.rb +1 -1
- data/examples/todolist/template/index.xhtml +1 -1
- data/examples/wiktacular/spec/wiktacular.rb +18 -0
- data/examples/wiktacular/src/controller.rb +2 -2
- data/examples/wiktacular/src/model.rb +8 -2
- data/lib/proto/public/css/ramaze_error.css +4 -0
- data/lib/proto/public/dispatch.fcgi +11 -0
- data/lib/proto/spec/main.rb +1 -1
- data/lib/proto/start.ru +8 -0
- data/lib/proto/view/error.xhtml +2 -0
- data/lib/ramaze.rb +28 -5
- data/lib/ramaze/action.rb +9 -2
- data/lib/ramaze/action/render.rb +40 -24
- data/lib/ramaze/adapter.rb +10 -17
- data/lib/ramaze/adapter/base.rb +8 -12
- data/lib/ramaze/adapter/cgi.rb +14 -13
- data/lib/ramaze/adapter/ebb.rb +34 -0
- data/lib/ramaze/adapter/evented_mongrel.rb +1 -1
- data/lib/ramaze/adapter/fcgi.rb +14 -14
- data/lib/ramaze/adapter/lsws.rb +15 -11
- data/lib/ramaze/adapter/mongrel.rb +2 -1
- data/lib/ramaze/adapter/scgi.rb +24 -0
- data/lib/ramaze/adapter/swiftiplied_mongrel.rb +1 -1
- data/lib/ramaze/adapter/thin.rb +4 -5
- data/lib/ramaze/adapter/webrick.rb +5 -5
- data/lib/ramaze/cache.rb +1 -1
- data/lib/ramaze/cache/memcached.rb +1 -1
- data/lib/ramaze/contrib.rb +70 -10
- data/lib/ramaze/contrib/auto_params.rb +1 -1
- data/lib/ramaze/contrib/email.rb +15 -15
- data/lib/ramaze/contrib/facebook.rb +2 -2
- data/lib/ramaze/contrib/facebook/facebook.rb +7 -4
- data/lib/ramaze/contrib/file_cache.rb +65 -0
- data/lib/ramaze/contrib/gettext.rb +56 -55
- data/lib/ramaze/contrib/profiling.rb +36 -0
- data/lib/ramaze/contrib/sequel_cache.rb +92 -0
- data/lib/ramaze/controller.rb +80 -47
- data/lib/ramaze/controller/error.rb +10 -5
- data/lib/ramaze/controller/resolve.rb +36 -48
- data/lib/ramaze/current.rb +70 -0
- data/lib/ramaze/{trinity → current}/request.rb +62 -15
- data/lib/ramaze/current/response.rb +19 -0
- data/lib/ramaze/{trinity → current}/session.rb +32 -110
- data/lib/ramaze/current/session/flash.rb +67 -0
- data/lib/ramaze/current/session/hash.rb +65 -0
- data/lib/ramaze/dispatcher.rb +1 -28
- data/lib/ramaze/dispatcher/action.rb +6 -3
- data/lib/ramaze/dispatcher/directory.rb +1 -1
- data/lib/ramaze/dispatcher/error.rb +26 -5
- data/lib/ramaze/dispatcher/file.rb +13 -2
- data/lib/ramaze/gestalt.rb +3 -1
- data/lib/ramaze/global.rb +6 -3
- data/lib/ramaze/global/globalstruct.rb +3 -1
- data/lib/ramaze/helper.rb +66 -20
- data/lib/ramaze/helper/aspect.rb +25 -17
- data/lib/ramaze/helper/auth.rb +4 -3
- data/lib/ramaze/helper/cache.rb +5 -4
- data/lib/ramaze/helper/cgi.rb +11 -9
- data/lib/ramaze/helper/flash.rb +28 -3
- data/lib/ramaze/helper/formatting.rb +1 -3
- data/lib/ramaze/helper/identity.rb +2 -3
- data/lib/ramaze/helper/inform.rb +7 -6
- data/lib/ramaze/helper/link.rb +15 -17
- data/lib/ramaze/helper/markaby.rb +2 -4
- data/lib/ramaze/helper/maruku.rb +1 -1
- data/lib/ramaze/helper/nitroform.rb +4 -4
- data/lib/ramaze/helper/pager.rb +4 -6
- data/lib/ramaze/helper/partial.rb +24 -21
- data/lib/ramaze/helper/redirect.rb +8 -5
- data/lib/ramaze/helper/{file.rb → sendfile.rb} +1 -3
- data/lib/ramaze/helper/sequel.rb +1 -3
- data/lib/ramaze/helper/stack.rb +1 -3
- data/lib/ramaze/helper/tagz.rb +19 -0
- data/lib/ramaze/helper/user.rb +63 -0
- data/lib/ramaze/inform.rb +2 -24
- data/lib/ramaze/log.rb +28 -0
- data/lib/ramaze/{inform → log}/analogger.rb +3 -3
- data/lib/ramaze/{inform → log}/growl.rb +2 -2
- data/lib/ramaze/{inform → log}/hub.rb +4 -6
- data/lib/ramaze/{inform → log}/informer.rb +4 -4
- data/lib/ramaze/{inform → log}/knotify.rb +2 -2
- data/lib/ramaze/log/logger.rb +22 -0
- data/lib/ramaze/{inform/informing.rb → log/logging.rb} +16 -16
- data/lib/ramaze/{inform → log}/syslog.rb +0 -0
- data/lib/ramaze/{inform → log}/xosd.rb +2 -2
- data/lib/ramaze/route.rb +64 -36
- data/lib/ramaze/snippets/array/put_within.rb +13 -0
- data/lib/ramaze/snippets/binding/locals.rb +13 -0
- data/lib/ramaze/snippets/kernel/__dir__.rb +10 -8
- data/lib/ramaze/snippets/kernel/aquire.rb +1 -1
- data/lib/ramaze/snippets/kernel/constant.rb +1 -1
- data/lib/ramaze/snippets/object/pretty.rb +6 -0
- data/lib/ramaze/snippets/object/scope.rb +11 -0
- data/lib/ramaze/snippets/object/thread_accessor.rb +5 -0
- data/lib/ramaze/snippets/ordered_set.rb +1 -1
- data/lib/ramaze/snippets/proc/locals.rb +11 -0
- data/lib/ramaze/snippets/ramaze/thread_accessor.rb +44 -0
- data/lib/ramaze/snippets/string/esc.rb +29 -0
- data/lib/ramaze/snippets/string/start_with.rb +7 -0
- data/lib/ramaze/snippets/string/unindent.rb +6 -1
- data/lib/ramaze/snippets/struct/values_at.rb +1 -5
- data/lib/ramaze/sourcereload.rb +16 -14
- data/lib/ramaze/spec.rb +1 -0
- data/lib/ramaze/spec/helper.rb +11 -3
- data/lib/ramaze/spec/helper/browser.rb +25 -1
- data/lib/ramaze/spec/helper/pretty_output.rb +11 -11
- data/lib/ramaze/template.rb +5 -4
- data/lib/ramaze/template/amrita2.rb +2 -3
- data/lib/ramaze/template/ezamar/element.rb +2 -3
- data/lib/ramaze/template/ezamar/morpher.rb +1 -2
- data/lib/ramaze/template/ezamar/render_partial.rb +1 -1
- data/lib/ramaze/template/haml.rb +5 -2
- data/lib/ramaze/template/markaby.rb +2 -0
- data/lib/ramaze/template/tagz.rb +79 -0
- data/lib/ramaze/template/tenjin.rb +34 -0
- data/lib/ramaze/tool/create.rb +0 -3
- data/lib/ramaze/tool/localize.rb +107 -105
- data/lib/ramaze/tool/mime.rb +0 -2
- data/lib/ramaze/trinity.rb +1 -26
- data/lib/ramaze/version.rb +1 -1
- data/lib/vendor/bacon.rb +47 -41
- data/rake_tasks/conf.rake +18 -0
- data/rake_tasks/darcs.rake +5 -0
- data/rake_tasks/maintenance.rake +37 -24
- data/rake_tasks/spec.rake +1 -1
- data/spec/contrib/auto_params.rb +3 -1
- data/spec/contrib/profiling.rb +26 -0
- data/spec/examples/templates/template_redcloth.rb +1 -1
- data/spec/examples/templates/template_tenjin.rb +28 -0
- data/spec/helper.rb +0 -1
- data/spec/ramaze/action/layout.rb +28 -0
- data/spec/ramaze/controller/actionless_templates.rb +32 -0
- data/spec/ramaze/controller/template/other_wrapper.xhtml +1 -0
- data/spec/ramaze/controller/template_resolving.rb +37 -0
- data/spec/ramaze/{trinity → current}/request.rb +12 -2
- data/spec/ramaze/current/session.rb +97 -0
- data/spec/ramaze/dispatcher/directory.rb +2 -1
- data/spec/ramaze/dispatcher/file.rb +8 -3
- data/spec/ramaze/dispatcher/public/file name.txt +1 -0
- data/spec/ramaze/gestalt.rb +11 -0
- data/spec/ramaze/helper/aspect.rb +28 -22
- data/spec/ramaze/helper/cgi.rb +2 -2
- data/spec/ramaze/helper/flash.rb +33 -15
- data/spec/ramaze/helper/formatting.rb +2 -2
- data/spec/ramaze/helper/link.rb +46 -18
- data/spec/ramaze/helper/pager.rb +8 -5
- data/spec/ramaze/helper/partial.rb +8 -1
- data/spec/ramaze/helper/template/recursive_local_ivars.xhtml +7 -0
- data/spec/ramaze/helper/user.rb +46 -0
- data/spec/ramaze/{inform → log}/informer.rb +0 -0
- data/spec/ramaze/{inform → log}/syslog.rb +1 -1
- data/spec/ramaze/request.rb +14 -10
- data/spec/ramaze/route.rb +23 -0
- data/spec/ramaze/template.rb +48 -1
- data/spec/ramaze/template/haml.rb +6 -16
- data/spec/ramaze/template/haml/locals.haml +2 -1
- data/spec/ramaze/template/tagz.rb +62 -0
- data/spec/ramaze/template/tagz/external.tagz +8 -0
- data/spec/ramaze/template/tagz/sum.tagz +1 -0
- data/spec/ramaze/template/tenjin.rb +49 -0
- data/spec/ramaze/template/tenjin/external.tenjin +1 -0
- data/spec/snippets/string/unindent.rb +15 -0
- metadata +509 -475
- data/doc/README.html +0 -729
- data/doc/changes.txt +0 -5757
- data/doc/changes.xml +0 -5759
- data/examples/blog/src/view.rb +0 -16
- data/examples/blog/template/edit.xhtml +0 -19
- data/examples/blog/template/index.xhtml +0 -19
- data/examples/blog/template/new.xhtml +0 -18
- data/examples/wiktacular/mkd/newpagename/current.mkd +0 -1
- data/examples/wiktacular/mkd/newpagename/current.mkd.bak +0 -1
- data/lib/ramaze/contrib/email.rb-darcs-backup0 +0 -81
- data/lib/ramaze/template/bijou.rb +0 -39
- data/lib/ramaze/trinity/response.rb +0 -32
- data/spec/ramaze/template/bijou.rb +0 -25
- data/spec/ramaze/trinity/session.rb +0 -29
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require "ruby-prof"
|
|
2
|
+
|
|
3
|
+
module Ramaze
|
|
4
|
+
module Dispatcher
|
|
5
|
+
class ActionProfiler < Action
|
|
6
|
+
def self.process(path)
|
|
7
|
+
if RubyProf.running?
|
|
8
|
+
super
|
|
9
|
+
else
|
|
10
|
+
result = RubyProf.profile { super }
|
|
11
|
+
output = StringIO.new
|
|
12
|
+
printer = RubyProf::FlatPrinter.new(result)
|
|
13
|
+
options = {
|
|
14
|
+
:min_percent => Contrib::Profiling.trait[:min_percent],
|
|
15
|
+
:print_file => false
|
|
16
|
+
}
|
|
17
|
+
printer.print(output, options)
|
|
18
|
+
output.string.split("\n").each do |line|
|
|
19
|
+
Log.info(line)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module Contrib
|
|
27
|
+
class Profiling
|
|
28
|
+
trait :min_percent => 1
|
|
29
|
+
|
|
30
|
+
def self.startup
|
|
31
|
+
Dispatcher::FILTER.delete(Dispatcher::Action)
|
|
32
|
+
Dispatcher::FILTER << Dispatcher::ActionProfiler
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#
|
|
2
|
+
# drop-in replacement for Ramaze's built-in MemoryCache built on the Sequel.
|
|
3
|
+
# to use with sessions do
|
|
4
|
+
#
|
|
5
|
+
# Ramaze::Global::cache_alternative[:sessions] = Ramaze::SequelCache
|
|
6
|
+
#
|
|
7
|
+
# to use with everything do
|
|
8
|
+
#
|
|
9
|
+
# Ramaze::Global::cache = Ramaze::SequelCache
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
class Ramaze::SequelCache
|
|
13
|
+
class Table < Sequel::Model(:ramaze_cache_t)
|
|
14
|
+
set_schema do
|
|
15
|
+
primary_key :id
|
|
16
|
+
string :key
|
|
17
|
+
string :value
|
|
18
|
+
index :key, :unique => true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
## use sequel's built-in serialize function if you like execptions: the
|
|
22
|
+
## serialized data blows up the sql
|
|
23
|
+
## serialize :value, :format => :marshal
|
|
24
|
+
|
|
25
|
+
transform :value => [
|
|
26
|
+
lambda{|value| Marshal.load(Base64.decode64(value))},
|
|
27
|
+
lambda{|value| Base64.encode64(Marshal.dump(value))},
|
|
28
|
+
]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def table() Table end
|
|
32
|
+
def t() Table end
|
|
33
|
+
|
|
34
|
+
def self.[] key
|
|
35
|
+
record = Table.find :key => key
|
|
36
|
+
record ? record.value : nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.[]= key, value
|
|
40
|
+
begin
|
|
41
|
+
Table.create :key => key, :value => value
|
|
42
|
+
rescue
|
|
43
|
+
Table.filter(:key => key).update :value => value
|
|
44
|
+
unless Table.find(:key => key)
|
|
45
|
+
Table.create :key => key, :value => value rescue nil
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
# ruby always returns 'value' for []= !
|
|
49
|
+
rescue
|
|
50
|
+
nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.values_at *keys
|
|
54
|
+
keys.map{|key| Table[key]}
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.delete *keys
|
|
58
|
+
keys.map do |key|
|
|
59
|
+
record = Table[key]
|
|
60
|
+
record.delete if record
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.clear
|
|
65
|
+
Table.delete_all
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def self.new
|
|
69
|
+
self
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def self.to_sym
|
|
73
|
+
name.split(%r/::/).last.to_sym
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
if $0 == __FILE__
|
|
81
|
+
case ARGV.first
|
|
82
|
+
when /create|up/
|
|
83
|
+
Ramaze::SequelCache::Table.create_table!
|
|
84
|
+
when /drop|down/
|
|
85
|
+
Ramaze::SequelCache::Table.drop_table
|
|
86
|
+
else
|
|
87
|
+
abort "usage: ruby #{ __FILE__ } create/up | drop/down"
|
|
88
|
+
end
|
|
89
|
+
else
|
|
90
|
+
Ramaze::SequelCache::Table.create_table! unless
|
|
91
|
+
Ramaze::SequelCache::Table.table_exists?
|
|
92
|
+
end
|
data/lib/ramaze/controller.rb
CHANGED
|
@@ -13,10 +13,9 @@ module Ramaze
|
|
|
13
13
|
# The Controller is responsible for combining and rendering actions.
|
|
14
14
|
|
|
15
15
|
class Controller
|
|
16
|
-
include
|
|
17
|
-
extend Ramaze::Helper
|
|
16
|
+
include Helper::Methods
|
|
18
17
|
|
|
19
|
-
helper :redirect, :link, :
|
|
18
|
+
helper :redirect, :link, :sendfile, :flash, :cgi, :partial
|
|
20
19
|
|
|
21
20
|
# Whether or not to map this controller on startup automatically
|
|
22
21
|
|
|
@@ -26,27 +25,19 @@ module Ramaze
|
|
|
26
25
|
|
|
27
26
|
trait[:map] ||= nil
|
|
28
27
|
|
|
29
|
-
# Modules that are excluded from the Action lookup
|
|
30
|
-
|
|
31
|
-
trait :exclude_action_modules => [Kernel, Object, PP::ObjectMixin]
|
|
32
|
-
|
|
33
28
|
# Caches patterns for the given path.
|
|
34
29
|
|
|
35
30
|
trait :pattern_cache => Hash.new{|h,k| h[k] = Controller.pattern_for(k) }
|
|
36
31
|
|
|
37
32
|
class << self
|
|
38
|
-
include Ramaze::Helper
|
|
39
|
-
extend Ramaze::Helper
|
|
40
|
-
|
|
41
33
|
# When Controller is subclassed the resulting class is placed in
|
|
42
34
|
# Global.controllers and a new trait :actions_cached is set on it.
|
|
43
35
|
|
|
44
36
|
def inherited controller
|
|
45
37
|
controller.trait :actions_cached => {}
|
|
46
|
-
controller.trait :layout => {:all => nil, :deny => Set.new}
|
|
47
38
|
Global.controllers << controller
|
|
48
39
|
if map = controller.mapping
|
|
49
|
-
|
|
40
|
+
Log.dev("mapping #{map} => #{controller}")
|
|
50
41
|
Global.mapping[map] ||= controller
|
|
51
42
|
end
|
|
52
43
|
end
|
|
@@ -56,26 +47,22 @@ module Ramaze
|
|
|
56
47
|
# they are not assigned yet.
|
|
57
48
|
|
|
58
49
|
def startup options = {}
|
|
59
|
-
|
|
50
|
+
Log.dev("found Controllers: #{Global.controllers.inspect}")
|
|
60
51
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
unless File.directory?(path)
|
|
64
|
-
Inform.warn("#{type} root: #{path} doesn't exist")
|
|
65
|
-
else
|
|
66
|
-
Inform.info("#{type} root: #{File.expand_path path}")
|
|
67
|
-
end
|
|
68
|
-
end
|
|
52
|
+
check_path("Public root: '%s' doesn't exist", Global.public_root)
|
|
53
|
+
check_path("Template root: '%s' doesn't exist", Global.template_root)
|
|
69
54
|
|
|
70
55
|
require 'ramaze/controller/main' if Global.mapping.empty?
|
|
71
56
|
|
|
72
|
-
|
|
57
|
+
Log.debug("mapped Controllers: #{Global.mapping.inspect}")
|
|
73
58
|
end
|
|
74
59
|
|
|
75
60
|
# checks paths for existance and logs a warning if it doesn't exist yet.
|
|
76
61
|
|
|
77
|
-
def check_path(
|
|
78
|
-
|
|
62
|
+
def check_path(message, *paths)
|
|
63
|
+
paths.each do |path|
|
|
64
|
+
Log.warn(message % path) unless File.directory?(path)
|
|
65
|
+
end
|
|
79
66
|
end
|
|
80
67
|
|
|
81
68
|
# if trait[:automap] is set and controller is not in Global.mapping yet
|
|
@@ -86,7 +73,7 @@ module Ramaze
|
|
|
86
73
|
global_mapping = Global.mapping.invert[self]
|
|
87
74
|
return global_mapping if global_mapping
|
|
88
75
|
if ancestral_trait[:automap]
|
|
89
|
-
name = self.to_s.gsub('Controller', '').
|
|
76
|
+
name = self.to_s.gsub('Controller', '').gsub('::', '/')
|
|
90
77
|
name == 'Main' ? '/' : "/#{name.snake_case}"
|
|
91
78
|
end
|
|
92
79
|
end
|
|
@@ -122,23 +109,26 @@ module Ramaze
|
|
|
122
109
|
# the layout-action where @content may or may not be used, returning
|
|
123
110
|
# whatever the layout returns.
|
|
124
111
|
|
|
125
|
-
def layout(meth_or_hash)
|
|
126
|
-
if meth_or_hash.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
112
|
+
def layout(*meth_or_hash)
|
|
113
|
+
if meth_or_hash.empty?
|
|
114
|
+
trait[:layout] ||= ( ancestral_trait[:layout] || {:all => nil, :deny => Set.new} ).dup
|
|
115
|
+
else
|
|
116
|
+
meth_or_hash = meth_or_hash.first
|
|
117
|
+
if meth_or_hash.respond_to?(:to_hash)
|
|
118
|
+
meth_or_hash.each do |layout_name, *actions|
|
|
119
|
+
actions.flatten.each do |action|
|
|
120
|
+
layout[action.to_s] = layout_name
|
|
121
|
+
end
|
|
131
122
|
end
|
|
123
|
+
else
|
|
124
|
+
layout[:all] = meth_or_hash
|
|
132
125
|
end
|
|
133
|
-
else
|
|
134
|
-
layout_name = R(self, meth_or_hash) if meth_or_hash.to_s !~ /\A\//
|
|
135
|
-
trait[:layout][:all] = layout_name || meth_or_hash
|
|
136
126
|
end
|
|
137
127
|
end
|
|
138
128
|
|
|
139
129
|
def deny_layout(*actions)
|
|
140
130
|
actions.each do |action|
|
|
141
|
-
|
|
131
|
+
layout[:deny] << action.to_s
|
|
142
132
|
end
|
|
143
133
|
end
|
|
144
134
|
|
|
@@ -146,13 +136,12 @@ module Ramaze
|
|
|
146
136
|
# if no argument is given.
|
|
147
137
|
# Runs every given path through Controller::check_path
|
|
148
138
|
|
|
149
|
-
def template_root
|
|
150
|
-
if
|
|
151
|
-
message = "#{self}.template_root is #{path} which does not exist"
|
|
152
|
-
check_path(path, message)
|
|
153
|
-
@template_root = path
|
|
154
|
-
else
|
|
139
|
+
def template_root *args
|
|
140
|
+
if args.empty?
|
|
155
141
|
@template_root
|
|
142
|
+
else
|
|
143
|
+
check_path("#{self}.template_root: '%s' doesn't exist", *args)
|
|
144
|
+
@template_root = args.flatten
|
|
156
145
|
end
|
|
157
146
|
end
|
|
158
147
|
|
|
@@ -163,6 +152,10 @@ module Ramaze
|
|
|
163
152
|
# class MainController
|
|
164
153
|
# template :index, OtherController, :list
|
|
165
154
|
# template :foo, :bar
|
|
155
|
+
# template :bar, :file => '/absolute/path'
|
|
156
|
+
# template :baz, :file => 'relative/path'
|
|
157
|
+
# template :abc, :controller => OtherController
|
|
158
|
+
# template :xyz, :controller => OtherController, :action => 'list'
|
|
166
159
|
#
|
|
167
160
|
# def index
|
|
168
161
|
# 'will use template from OtherController#list'
|
|
@@ -171,18 +164,58 @@ module Ramaze
|
|
|
171
164
|
# def foo
|
|
172
165
|
# 'will use template from self#bar'
|
|
173
166
|
# end
|
|
167
|
+
#
|
|
168
|
+
# def bar
|
|
169
|
+
# 'will use template from /absolute/path'
|
|
170
|
+
# end
|
|
171
|
+
#
|
|
172
|
+
# def baz
|
|
173
|
+
# 'will use template from relative/path'
|
|
174
|
+
# end
|
|
175
|
+
#
|
|
176
|
+
# def abc
|
|
177
|
+
# 'will use template from OtherController#index'
|
|
178
|
+
# end
|
|
179
|
+
#
|
|
180
|
+
# def xyz
|
|
181
|
+
# 'will use template from OtherController#list'
|
|
182
|
+
# end
|
|
174
183
|
# end
|
|
175
184
|
|
|
176
|
-
def template(this,
|
|
177
|
-
|
|
178
|
-
|
|
185
|
+
def template(this, *argv)
|
|
186
|
+
case argv.first
|
|
187
|
+
when Hash
|
|
188
|
+
options, *ignored = argv
|
|
189
|
+
controller = options[:controller] || options['controller']
|
|
190
|
+
action = options[:action] || options['action']
|
|
191
|
+
file = options[:file] || options['file']
|
|
192
|
+
info = {}
|
|
193
|
+
if file
|
|
194
|
+
file = file.to_s
|
|
195
|
+
unless Pathname(file).absolute?
|
|
196
|
+
root = [template_root || Global.template_root].flatten.first
|
|
197
|
+
file = File.join(root, file)
|
|
198
|
+
end
|
|
199
|
+
info[:file] = file
|
|
200
|
+
else
|
|
201
|
+
controller ||= self
|
|
202
|
+
action = (action || 'index').to_s
|
|
203
|
+
info[:controller] = controller
|
|
204
|
+
info[:action] = action
|
|
205
|
+
end
|
|
206
|
+
trait "#{this}_template" => info
|
|
207
|
+
else
|
|
208
|
+
controller, action, *ignored = argv
|
|
209
|
+
controller, action = self, controller unless action
|
|
210
|
+
trait "#{this}_template" => {:controller => controller, :action => action}
|
|
211
|
+
end
|
|
179
212
|
end
|
|
180
213
|
|
|
181
214
|
def engine(name)
|
|
182
|
-
name =
|
|
215
|
+
name = Template.const_get(name)
|
|
183
216
|
rescue NameError => ex
|
|
184
|
-
|
|
185
|
-
|
|
217
|
+
Log.warn ex
|
|
218
|
+
Log.warn "Try to use passed engine directly"
|
|
186
219
|
ensure
|
|
187
220
|
trait :engine => name
|
|
188
221
|
end
|
|
@@ -12,15 +12,20 @@ module Ramaze
|
|
|
12
12
|
# holds the exception thrown.
|
|
13
13
|
|
|
14
14
|
def error
|
|
15
|
-
error =
|
|
15
|
+
error = Dispatcher::Error.current
|
|
16
16
|
title = error.message
|
|
17
17
|
|
|
18
18
|
unless Action.current.template
|
|
19
19
|
response['Content-Type'] = 'text/plain'
|
|
20
|
-
|
|
20
|
+
respond %(
|
|
21
|
+
#{error.message}
|
|
22
|
+
#{error.backtrace.join("\n ")}
|
|
23
|
+
|
|
24
|
+
#{PP.pp request, '', 200}
|
|
25
|
+
).ui
|
|
21
26
|
end
|
|
22
27
|
|
|
23
|
-
backtrace_size =
|
|
28
|
+
backtrace_size = Global.backtrace_size
|
|
24
29
|
@backtrace = error.backtrace[0..20].map do |line|
|
|
25
30
|
file, lineno, meth = *Ramaze.parse_backtrace(line)
|
|
26
31
|
lines = Ramaze.caller_lines(file, lineno, backtrace_size)
|
|
@@ -31,11 +36,11 @@ module Ramaze
|
|
|
31
36
|
# for backwards-compat with old error.zmr
|
|
32
37
|
@colors = [255] * @backtrace.size
|
|
33
38
|
|
|
34
|
-
@title = CGI.escapeHTML(title)
|
|
39
|
+
@title = ::CGI.escapeHTML(title)
|
|
35
40
|
@editor = (ENV['EDITOR'] || 'vim')
|
|
36
41
|
title
|
|
37
42
|
rescue Object => ex
|
|
38
|
-
|
|
43
|
+
Log.error(ex)
|
|
39
44
|
end
|
|
40
45
|
end
|
|
41
46
|
end
|
|
@@ -3,24 +3,24 @@
|
|
|
3
3
|
|
|
4
4
|
module Ramaze
|
|
5
5
|
class Controller
|
|
6
|
-
FILTER = [ :cached, :
|
|
6
|
+
FILTER = [ :cached, :default ] unless defined?(FILTER)
|
|
7
7
|
|
|
8
8
|
class << self
|
|
9
9
|
|
|
10
10
|
# Resolve an absolute path in the application by passing it to each
|
|
11
11
|
# element of Ramaze::Controller::FILTER.
|
|
12
|
-
# Elements in exclude_filter are excluded from handling.
|
|
13
12
|
# If an element does not respond to call it will be sent to self
|
|
14
13
|
# instead, in either case with path as argument.
|
|
15
14
|
|
|
16
|
-
def resolve(path,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
def resolve(path, routed = false)
|
|
16
|
+
@routed = routed
|
|
17
|
+
|
|
18
|
+
FILTER.each do |filter|
|
|
19
|
+
answer = if filter.respond_to?(:call)
|
|
20
|
+
filter.call(path)
|
|
21
|
+
else
|
|
22
|
+
send(filter.to_s, path)
|
|
23
|
+
end
|
|
24
24
|
return answer if answer
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -35,7 +35,7 @@ module Ramaze
|
|
|
35
35
|
if found.respond_to?(:relaxed_hash)
|
|
36
36
|
return found.dup
|
|
37
37
|
else
|
|
38
|
-
|
|
38
|
+
Log.warn("Found faulty `#{path}' in Cache.resolved, deleting it for sanity.")
|
|
39
39
|
Cache.resolved.delete path
|
|
40
40
|
end
|
|
41
41
|
end
|
|
@@ -43,33 +43,6 @@ module Ramaze
|
|
|
43
43
|
nil
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
# Routing filter
|
|
47
|
-
# Loops over Route.trait[:routes] to find a matching route
|
|
48
|
-
|
|
49
|
-
def routed(path)
|
|
50
|
-
Route.trait[:routes].each do |key, val|
|
|
51
|
-
if key.is_a?(Regexp)
|
|
52
|
-
if md = path.match(key)
|
|
53
|
-
new_path = val % md.to_a[1..-1]
|
|
54
|
-
return resolve(new_path, :routed)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
elsif val.respond_to?(:call)
|
|
58
|
-
if new_path = val.call(path, request)
|
|
59
|
-
return resolve(new_path, :routed)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
elsif val.is_a?(String)
|
|
63
|
-
return resolve(val, :routed) if path == key
|
|
64
|
-
|
|
65
|
-
else
|
|
66
|
-
Inform.error "Invalid route #{key} => #{val}"
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
nil
|
|
71
|
-
end
|
|
72
|
-
|
|
73
46
|
# Default element of FILTER.
|
|
74
47
|
# The default handler that tries to find the best match for the given
|
|
75
48
|
# path in terms of Controller/method/template and given arguments.
|
|
@@ -91,7 +64,12 @@ module Ramaze
|
|
|
91
64
|
action = controller.resolve_action(method, *params)
|
|
92
65
|
template = action.template
|
|
93
66
|
|
|
94
|
-
valid_action =
|
|
67
|
+
valid_action =
|
|
68
|
+
if Action.stack.size > 0 || Global.actionless_templates
|
|
69
|
+
action.method or (params.empty? && template)
|
|
70
|
+
else
|
|
71
|
+
action.method
|
|
72
|
+
end
|
|
95
73
|
|
|
96
74
|
if valid_action
|
|
97
75
|
Cache.resolved[path] = action
|
|
@@ -100,6 +78,11 @@ module Ramaze
|
|
|
100
78
|
end
|
|
101
79
|
end
|
|
102
80
|
|
|
81
|
+
if !@routed and new_path = Route.resolve(path)
|
|
82
|
+
Log.dev("Routing from `#{path}' to `#{new_path}'")
|
|
83
|
+
return resolve(new_path, true)
|
|
84
|
+
end
|
|
85
|
+
|
|
103
86
|
raise_no_action(first_controller, path) if first_controller
|
|
104
87
|
raise_no_controller(path)
|
|
105
88
|
end
|
|
@@ -109,9 +92,12 @@ module Ramaze
|
|
|
109
92
|
|
|
110
93
|
def resolve_action(path, *parameter)
|
|
111
94
|
path, parameter = path.to_s, parameter.map{|e| e.to_s}
|
|
112
|
-
if
|
|
113
|
-
|
|
114
|
-
template
|
|
95
|
+
if info = trait["#{path}_template"]
|
|
96
|
+
template = info[:file]
|
|
97
|
+
unless template
|
|
98
|
+
controller, action = info.values_at :controller, :action
|
|
99
|
+
template = controller.resolve_template(action)
|
|
100
|
+
end
|
|
115
101
|
end
|
|
116
102
|
|
|
117
103
|
method, params = resolve_method(path, *parameter)
|
|
@@ -146,8 +132,11 @@ module Ramaze
|
|
|
146
132
|
# controller.
|
|
147
133
|
|
|
148
134
|
def template_paths
|
|
149
|
-
|
|
150
|
-
|
|
135
|
+
if paths = template_root
|
|
136
|
+
paths
|
|
137
|
+
else
|
|
138
|
+
template_root(Global.template_root / Global.mapping.invert[self])
|
|
139
|
+
end
|
|
151
140
|
end
|
|
152
141
|
|
|
153
142
|
# Based on methodname and arity, tries to find the right method on current controller.
|
|
@@ -168,14 +157,13 @@ module Ramaze
|
|
|
168
157
|
|
|
169
158
|
# methodnames that may be used for current controller.
|
|
170
159
|
def action_methods
|
|
171
|
-
|
|
160
|
+
ancs = ancestors.select{|ancestor|
|
|
161
|
+
ancestor <= Ramaze::Controller
|
|
162
|
+
} + Helper::LOOKUP.to_a
|
|
172
163
|
|
|
173
|
-
ancs = (ancestors - exclude).select{|a| a.is_a?(Module) }
|
|
174
164
|
meths = ancs.map{|a|
|
|
175
165
|
a.instance_methods(false).map{|iv| iv.to_s }
|
|
176
166
|
}.flatten.uniq
|
|
177
|
-
# fix for facets/more/paramix
|
|
178
|
-
meths - ancs.map{|a| a.to_s}
|
|
179
167
|
end
|
|
180
168
|
|
|
181
169
|
# Generate all possible permutations for given path.
|