ramaze 2008.11 → 2009.01
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +7 -7
- data/benchmark/run.rb +1 -1
- data/doc/CHANGELOG +662 -0
- data/examples/app/blog/model/entry.rb +8 -1
- data/examples/app/blog/spec/blog.rb +2 -2
- data/examples/app/rapaste/spec/rapaste.rb +1 -1
- data/examples/app/rapaste/start.rb +2 -2
- data/examples/app/rapaste/view/view.xhtml +3 -0
- data/examples/app/todolist/spec/todolist.rb +1 -1
- data/examples/app/whywiki/spec/whywiki.rb +1 -1
- data/examples/app/wikore/spec/wikore.rb +1 -1
- data/examples/app/wikore/src/model.rb +8 -2
- data/examples/app/wiktacular/spec/wiktacular.rb +1 -1
- data/examples/app/wiktacular/src/model.rb +1 -1
- data/examples/basic/partial.rb +28 -0
- data/examples/helpers/httpdigest.rb +68 -10
- data/examples/misc/ramaise.rb +2 -2
- data/examples/templates/template_amrita2.rb +1 -1
- data/examples/templates/template_erubis.rb +1 -1
- data/examples/templates/template_ezamar.rb +1 -1
- data/examples/templates/template_haml.rb +2 -2
- data/examples/templates/template_liquid.rb +1 -1
- data/examples/templates/template_markaby.rb +2 -2
- data/examples/templates/template_nagoro.rb +1 -1
- data/examples/templates/template_redcloth.rb +1 -1
- data/examples/templates/template_remarkably.rb +2 -2
- data/examples/templates/template_tenjin.rb +1 -1
- data/examples/templates/template_xslt.rb +1 -1
- data/lib/proto/controller/init.rb +2 -1
- data/lib/proto/model/init.rb +3 -3
- data/lib/proto/public/dispatch.fcgi +2 -2
- data/lib/proto/spec/main.rb +3 -3
- data/lib/proto/start.rb +4 -0
- data/lib/ramaze.rb +6 -0
- data/lib/ramaze/action.rb +7 -1
- data/lib/ramaze/action/render.rb +6 -5
- data/lib/ramaze/cache.rb +1 -0
- data/lib/ramaze/cache/file.rb +71 -0
- data/lib/ramaze/contrib.rb +1 -1
- data/lib/ramaze/contrib/email.rb +2 -0
- data/lib/ramaze/contrib/facebook.rb +2 -2
- data/lib/ramaze/contrib/file_cache.rb +2 -64
- data/lib/ramaze/contrib/sequel/image.rb +1 -1
- data/lib/ramaze/controller.rb +9 -1
- data/lib/ramaze/controller/resolve.rb +10 -5
- data/lib/ramaze/current/request.rb +87 -70
- data/lib/ramaze/current/session.rb +3 -5
- data/lib/ramaze/current/session/hash.rb +7 -11
- data/lib/ramaze/dispatcher/action.rb +2 -0
- data/lib/ramaze/dispatcher/file.rb +6 -1
- data/lib/ramaze/helper.rb +12 -4
- data/lib/ramaze/helper/aspect.rb +2 -2
- data/lib/ramaze/helper/bench.rb +43 -0
- data/lib/ramaze/helper/form.rb +5 -2
- data/lib/ramaze/helper/formatting.rb +4 -0
- data/lib/ramaze/helper/gravatar.rb +18 -1
- data/lib/ramaze/helper/httpdigest.rb +55 -28
- data/lib/ramaze/helper/markaby.rb +1 -1
- data/lib/ramaze/helper/maruku.rb +2 -0
- data/lib/ramaze/helper/paginate.rb +1 -1
- data/lib/ramaze/helper/partial.rb +1 -1
- data/lib/ramaze/helper/redirect.rb +22 -4
- data/lib/ramaze/helper/user.rb +4 -4
- data/lib/ramaze/option.rb +1 -1
- data/lib/ramaze/option/holder.rb +3 -3
- data/lib/ramaze/reloader.rb +25 -41
- data/lib/ramaze/reloader/watch_inotify.rb +85 -0
- data/lib/ramaze/reloader/watch_stat.rb +58 -0
- data/lib/ramaze/snippets/divide.rb +2 -0
- data/lib/ramaze/snippets/numeric/time.rb +1 -1
- data/lib/ramaze/snippets/object/__dir__.rb +3 -3
- data/lib/ramaze/snippets/object/acquire.rb +3 -6
- data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
- data/lib/ramaze/snippets/ramaze/deprecated.rb +2 -1
- data/lib/ramaze/spec/helper/mock_http.rb +6 -5
- data/lib/ramaze/template/ezamar/render_partial.rb +8 -0
- data/lib/ramaze/tool/mime.rb +1 -1
- data/lib/ramaze/tool/project_creator.rb +2 -1
- data/lib/ramaze/version.rb +2 -2
- data/rake_tasks/coverage.rake +4 -5
- data/rake_tasks/spec.rake +6 -6
- data/ramaze-2008.11.gem +0 -0
- data/ramaze.gemspec +759 -758
- data/spec/contrib/profiling.rb +2 -2
- data/spec/ramaze/action/file_cache.rb +1 -1
- data/spec/ramaze/action/layout.rb +1 -1
- data/spec/ramaze/controller/actionless_templates.rb +1 -1
- data/spec/ramaze/controller/resolve.rb +1 -1
- data/spec/ramaze/controller/template_resolving.rb +1 -1
- data/spec/ramaze/dispatcher/directory.rb +3 -3
- data/spec/ramaze/helper/aspect.rb +1 -1
- data/spec/ramaze/helper/partial.rb +1 -1
- data/spec/ramaze/localize.rb +1 -1
- data/spec/ramaze/rewrite.rb +1 -1
- data/spec/ramaze/template.rb +3 -3
- data/spec/ramaze/template/amrita2.rb +1 -1
- data/spec/ramaze/template/erubis.rb +1 -1
- data/spec/ramaze/template/ezamar.rb +1 -1
- data/spec/ramaze/template/haml.rb +2 -2
- data/spec/ramaze/template/nagoro.rb +1 -1
- data/spec/ramaze/template/redcloth.rb +1 -1
- data/spec/ramaze/template/sass.rb +1 -1
- data/spec/ramaze/template/tenjin.rb +1 -1
- data/spec/snippets/object/__dir__.rb +6 -0
- data/spec/snippets/{object → ramaze}/acquire.rb +24 -18
- metadata +18 -16
- data/lib/ramaze/contrib/auto_params.rb +0 -135
- data/lib/ramaze/contrib/auto_params/get_args.rb +0 -58
- data/spec/contrib/auto_params.rb +0 -121
- data/spec/snippets/divide.rb +0 -19
data/lib/ramaze/helper/user.rb
CHANGED
@@ -8,10 +8,10 @@ module Ramaze
|
|
8
8
|
#
|
9
9
|
# class MainController < Ramaze::Controller
|
10
10
|
# def index
|
11
|
-
# if
|
12
|
-
# A('login', :href => Rs(:login))
|
13
|
-
# else
|
11
|
+
# if logged_in?
|
14
12
|
# "Hello #{user.name}"
|
13
|
+
# else
|
14
|
+
# A('login', :href => Rs(:login))
|
15
15
|
# end
|
16
16
|
# end
|
17
17
|
#
|
@@ -77,7 +77,7 @@ module Ramaze
|
|
77
77
|
elsif _model.respond_to?(:authenticate)
|
78
78
|
_model.authenticate(creds)
|
79
79
|
else
|
80
|
-
Log.warn("Helper::User has no callback and
|
80
|
+
Log.warn("Helper::User has no callback and there is no %p::authenticate" % _model)
|
81
81
|
nil
|
82
82
|
end
|
83
83
|
end
|
data/lib/ramaze/option.rb
CHANGED
@@ -78,7 +78,7 @@ module Ramaze
|
|
78
78
|
o "Turn on customized error pages. Use Rack::ShowException otherwise.",
|
79
79
|
:error_page, true, :cli => true
|
80
80
|
|
81
|
-
o "
|
81
|
+
o "Cache actions to filesystem, uses String as directory name or Global.public_root if other truism",
|
82
82
|
:file_cache, false, :cli => false
|
83
83
|
|
84
84
|
o "Specify what IP Ramaze will respond to - 0.0.0.0 for all",
|
data/lib/ramaze/option/holder.rb
CHANGED
@@ -78,7 +78,7 @@ module Ramaze
|
|
78
78
|
# currently set one.
|
79
79
|
def public_root
|
80
80
|
[ @public_root,
|
81
|
-
root
|
81
|
+
File.join(root, @public_root)
|
82
82
|
].find{|path| File.directory?(path) } || @public_root
|
83
83
|
end
|
84
84
|
|
@@ -90,8 +90,8 @@ module Ramaze
|
|
90
90
|
# the currently set one.
|
91
91
|
def view_root
|
92
92
|
[ @view_root,
|
93
|
-
root
|
94
|
-
root
|
93
|
+
File.join(root, @view_root),
|
94
|
+
File.join(root, 'template'),
|
95
95
|
].find{|path| File.directory?(path) } || @view_root
|
96
96
|
end
|
97
97
|
|
data/lib/ramaze/reloader.rb
CHANGED
@@ -11,9 +11,7 @@ module Ramaze
|
|
11
11
|
# Reloader::Hooks module or include your own module to override the hooks.
|
12
12
|
# You also might have to set the Log constant.
|
13
13
|
#
|
14
|
-
#
|
15
|
-
# any file will only be checked once and there will only be made one system
|
16
|
-
# call stat(2).
|
14
|
+
# Currently, it uses RInotify if available and falls back to using File.stat.
|
17
15
|
#
|
18
16
|
# Please note that this will not reload files in the background, it does so
|
19
17
|
# only when actively called
|
@@ -47,11 +45,21 @@ module Ramaze
|
|
47
45
|
:control => nil, # lambda{ cycle },
|
48
46
|
}
|
49
47
|
|
48
|
+
begin
|
49
|
+
gem 'RInotify', '>=0.9' # is older version ok?
|
50
|
+
require 'rinotify'
|
51
|
+
require 'ramaze/reloader/watch_inotify'
|
52
|
+
Watcher = WatchInotify
|
53
|
+
rescue LoadError
|
54
|
+
# stat always available
|
55
|
+
require 'ramaze/reloader/watch_stat'
|
56
|
+
Watcher = WatchStat
|
57
|
+
end
|
58
|
+
|
50
59
|
def initialize(app)
|
51
60
|
@app = app
|
52
|
-
@
|
53
|
-
@
|
54
|
-
@cache = {}
|
61
|
+
@files = {}
|
62
|
+
@watcher = Watcher.new
|
55
63
|
options_reload
|
56
64
|
end
|
57
65
|
|
@@ -63,7 +71,7 @@ module Ramaze
|
|
63
71
|
def call(env)
|
64
72
|
options_reload
|
65
73
|
|
66
|
-
|
74
|
+
@watcher.call(@cooldown) do
|
67
75
|
if @control
|
68
76
|
instance_eval(&@control)
|
69
77
|
elsif @thread
|
@@ -71,8 +79,6 @@ module Ramaze
|
|
71
79
|
else
|
72
80
|
cycle
|
73
81
|
end
|
74
|
-
|
75
|
-
@last = Time.now
|
76
82
|
end
|
77
83
|
|
78
84
|
@app.call(env)
|
@@ -81,16 +87,8 @@ module Ramaze
|
|
81
87
|
def cycle
|
82
88
|
before_cycle
|
83
89
|
|
84
|
-
rotation
|
85
|
-
|
86
|
-
if mtime > (@mtimes[file] ||= mtime)
|
87
|
-
safe_load(file)
|
88
|
-
@mtimes[file] = mtime
|
89
|
-
end
|
90
|
-
else
|
91
|
-
@cache.delete(file)
|
92
|
-
end
|
93
|
-
end
|
90
|
+
rotation{|file| @watcher.watch(file) }
|
91
|
+
@watcher.changed_files{|f| safe_load(f) }
|
94
92
|
|
95
93
|
after_cycle
|
96
94
|
end
|
@@ -111,37 +109,23 @@ module Ramaze
|
|
111
109
|
|
112
110
|
files.each do |file|
|
113
111
|
next if file =~ @ignore
|
114
|
-
path
|
115
|
-
|
116
|
-
|
117
|
-
@cache[file] = path
|
118
|
-
yield(path, stat)
|
119
|
-
else
|
120
|
-
# Quite harmless, we just couldn't figure out path for #{file}
|
112
|
+
if not @files.has_key?(file) and path = figure_path(file, paths)
|
113
|
+
@files[file] = path
|
114
|
+
yield path
|
121
115
|
end
|
122
116
|
end
|
123
117
|
end
|
124
118
|
|
125
119
|
def figure_path(file, paths)
|
126
|
-
if
|
127
|
-
|
128
|
-
return cached, stat if stat.file?
|
129
|
-
elsif Pathname.new(file).absolute?
|
130
|
-
stat = File.stat(file)
|
131
|
-
return file, stat if stat.file? # do directories really end up in $" ?
|
120
|
+
if Pathname.new(file).absolute?
|
121
|
+
return File.exist?(file) ? file : nil
|
132
122
|
end
|
133
123
|
|
134
124
|
paths.each do |possible_path|
|
135
|
-
|
136
|
-
|
137
|
-
begin
|
138
|
-
stat = File.stat(path)
|
139
|
-
return path, stat if stat.file?
|
140
|
-
rescue Errno::ENOENT, Errno::ENOTDIR
|
141
|
-
end
|
125
|
+
full_path = File.join(possible_path, file)
|
126
|
+
return full_path if File.exist?(full_path)
|
142
127
|
end
|
143
|
-
|
144
|
-
return nil
|
128
|
+
nil
|
145
129
|
end
|
146
130
|
|
147
131
|
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Ramaze
|
2
|
+
class Reloader
|
3
|
+
# TODO:
|
4
|
+
# * There seems to be a problem somewhere that I couldn't identify yet, a
|
5
|
+
# file has to be modified twice initially to make it show up as
|
6
|
+
# modified here, subsequent changes work just fine.
|
7
|
+
# The only workaround I could find right now would be to read/write
|
8
|
+
# every single file, but that would be unexpected, irresponsible, and
|
9
|
+
# error-prone.
|
10
|
+
#
|
11
|
+
# NOTE:
|
12
|
+
# * I have changed from using a Mutex to using a Queue, which uses a
|
13
|
+
# Mutex internally.
|
14
|
+
|
15
|
+
class WatchInotify
|
16
|
+
POLL_INTERVAL = 2 # seconds
|
17
|
+
NOTIFY_MASK = RInotify::MODIFY | RInotify::IN_ONESHOT
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@watcher = RInotify.new
|
21
|
+
@changed = Queue.new
|
22
|
+
@watcher_thread = start_watcher
|
23
|
+
end
|
24
|
+
|
25
|
+
def call(cooldown)
|
26
|
+
yield
|
27
|
+
end
|
28
|
+
|
29
|
+
# TODO: define a finalizer to cleanup? -- reloader never calls #close
|
30
|
+
|
31
|
+
def start_watcher
|
32
|
+
Thread.new{ loop{ watcher_cycle }}
|
33
|
+
end
|
34
|
+
|
35
|
+
# Not much work here, we just have to empty the event queue and push the
|
36
|
+
# descriptors for reloading on next request.
|
37
|
+
def watcher_cycle
|
38
|
+
return unless @watcher.wait_for_events(POLL_INTERVAL)
|
39
|
+
|
40
|
+
@watcher.each_event do |event|
|
41
|
+
@changed.push(event.watch_descriptor)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def watch(file)
|
46
|
+
return if @watcher.watch_descriptors.has_value?(file)
|
47
|
+
return unless File.exist?(file)
|
48
|
+
|
49
|
+
@watcher.add_watch(file, NOTIFY_MASK)
|
50
|
+
rescue Errno::ENOENT
|
51
|
+
retry
|
52
|
+
end
|
53
|
+
|
54
|
+
# FIXME:
|
55
|
+
# Seems like this won't work due to some bug in the rinotify library.
|
56
|
+
# Would be cool if someone could make a FFI version.
|
57
|
+
|
58
|
+
def remove_watch(file)
|
59
|
+
@watcher.rm_watch(file)
|
60
|
+
end
|
61
|
+
|
62
|
+
def close
|
63
|
+
@watcher_thread.terminate
|
64
|
+
@watcher.close
|
65
|
+
true
|
66
|
+
end
|
67
|
+
|
68
|
+
# NOTE:
|
69
|
+
# We have to add the changed file again after we got a notification, I
|
70
|
+
# have no idea why, but using IN_ONESHOT should make sure that there is
|
71
|
+
# no memory leak in the C level even if we add a file again.
|
72
|
+
# There is a memory leak however in the watch_descriptors hash, since
|
73
|
+
# rinotify won't synchronize the contents properly and will only add to
|
74
|
+
# the hash, so we have to clean up ourselves.
|
75
|
+
def changed_files
|
76
|
+
until @changed.empty?
|
77
|
+
descriptor = @changed.shift
|
78
|
+
file = @watcher.watch_descriptors.delete(descriptor)
|
79
|
+
watch(file)
|
80
|
+
yield(file)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Ramaze
|
2
|
+
class Reloader
|
3
|
+
class WatchStat
|
4
|
+
def initialize
|
5
|
+
# @files[file_path] = stat
|
6
|
+
@files = {}
|
7
|
+
@last = Time.now
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(cooldown)
|
11
|
+
if cooldown and Time.now > @last + cooldown
|
12
|
+
yield
|
13
|
+
@last = Time.now
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# start watching a file for changes
|
18
|
+
# true if succeeded, false if failure
|
19
|
+
def watch(file)
|
20
|
+
return true if watching?(file) # if already watching
|
21
|
+
if stat = safe_stat(file)
|
22
|
+
@files[file] = stat
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def watching?(file)
|
27
|
+
@files.has_key?(file)
|
28
|
+
end
|
29
|
+
|
30
|
+
# stop watching a file for changes
|
31
|
+
def remove_watch(file)
|
32
|
+
@files.delete(file)
|
33
|
+
end
|
34
|
+
|
35
|
+
# no need for cleanup
|
36
|
+
def close
|
37
|
+
end
|
38
|
+
|
39
|
+
# return files changed since last call
|
40
|
+
def changed_files
|
41
|
+
@files.each do |file, stat|
|
42
|
+
if new_stat = safe_stat(file)
|
43
|
+
if new_stat.mtime > stat.mtime
|
44
|
+
@files[file] = new_stat
|
45
|
+
yield(file)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def safe_stat(file)
|
52
|
+
File.stat(file)
|
53
|
+
rescue Errno::ENOENT, Errno::ENOTDIR
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -6,6 +6,7 @@ class String
|
|
6
6
|
# Usage:
|
7
7
|
# 'a' / 'b' # => 'a/b'
|
8
8
|
def / obj
|
9
|
+
Ramaze.deprecated('String#/', 'File::join')
|
9
10
|
File.join(self, obj.to_s)
|
10
11
|
end
|
11
12
|
end
|
@@ -15,6 +16,7 @@ class Symbol
|
|
15
16
|
# Usage:
|
16
17
|
# :dir/:file # => 'dir/file'
|
17
18
|
def / obj
|
19
|
+
Ramaze.deprecated('Symbol#/', 'File::join(sym.to_s)')
|
18
20
|
self.to_s / obj
|
19
21
|
end
|
20
22
|
end
|
@@ -16,11 +16,11 @@ module Ramaze
|
|
16
16
|
# This method is convenience for the
|
17
17
|
# File.expand_path(File.dirname(__FILE__))
|
18
18
|
# idiom.
|
19
|
-
#
|
20
19
|
|
21
|
-
def __DIR__()
|
20
|
+
def __DIR__(*args)
|
22
21
|
filename = caller[0][/^(.*):/, 1]
|
23
|
-
File.expand_path(File.dirname(filename))
|
22
|
+
dir = File.expand_path(File.dirname(filename))
|
23
|
+
::File.expand_path(::File.join(dir, *args.map{|a| a.to_s}))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -27,12 +27,9 @@ module Ramaze
|
|
27
27
|
# # require 'src/foo.rb' and 'src/bar.so' and 'src/foobar/baz.rb'
|
28
28
|
# acquire 'src/*', 'src/foobar/*'
|
29
29
|
|
30
|
-
def acquire
|
31
|
-
|
32
|
-
|
33
|
-
require file if file =~ /\.(rb|so)$/
|
34
|
-
end
|
35
|
-
end
|
30
|
+
def acquire(*globs)
|
31
|
+
Ramaze.deprecated('Object#acquire', 'Ramaze::acquire')
|
32
|
+
Ramaze.acquire(*globs)
|
36
33
|
end
|
37
34
|
end
|
38
35
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
module Ramaze
|
5
|
+
# Require all .rb and .so files on the given globs, utilizes Dir::[].
|
6
|
+
#
|
7
|
+
# Examples:
|
8
|
+
# # Given following directory structure:
|
9
|
+
# # src/foo.rb
|
10
|
+
# # src/bar.so
|
11
|
+
# # src/foo.yaml
|
12
|
+
# # src/foobar/baz.rb
|
13
|
+
# # src/foobar/README
|
14
|
+
#
|
15
|
+
# # requires all files in 'src':
|
16
|
+
# Ramaze.acquire 'src/*'
|
17
|
+
#
|
18
|
+
# # requires all files in 'src' recursive:
|
19
|
+
# Ramaze.acquire 'src/**/*'
|
20
|
+
#
|
21
|
+
# # require 'src/foo.rb' and 'src/bar.so' and 'src/foobar/baz.rb'
|
22
|
+
# Ramaze.acquire 'src/*', 'src/foobar/*'
|
23
|
+
|
24
|
+
def self.acquire(*globs)
|
25
|
+
globs.flatten.each do |glob|
|
26
|
+
Dir[glob].each do |file|
|
27
|
+
require file if file =~ /\.(rb|so)$/
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -6,7 +6,8 @@ module Ramaze
|
|
6
6
|
def self.deprecated(from, to = nil)
|
7
7
|
message = "%s is deprecated"
|
8
8
|
message << ", use %s instead" unless to.nil?
|
9
|
-
|
9
|
+
message << " - from: %p"
|
10
|
+
Log.warn(message % [from, to, caller[1]])
|
10
11
|
end
|
11
12
|
|
12
13
|
def self.const_missing(name)
|
@@ -42,8 +42,9 @@ module MockHTTP
|
|
42
42
|
|
43
43
|
def process_request(path, query)
|
44
44
|
options = {}
|
45
|
-
FISHING.each
|
46
|
-
options[value] = query.delete(key)
|
45
|
+
FISHING.each do |key, value|
|
46
|
+
options[value] = query.delete(key) if query.key?(key)
|
47
|
+
end if query.is_a?(Hash)
|
47
48
|
[create_url(path, query), options]
|
48
49
|
end
|
49
50
|
|
@@ -54,10 +55,10 @@ module MockHTTP
|
|
54
55
|
uri.to_s
|
55
56
|
end
|
56
57
|
|
57
|
-
|
58
|
-
|
58
|
+
def make_query query
|
59
|
+
return query unless query and not query.is_a?(String)
|
59
60
|
query.map{|key, value|
|
60
61
|
"#{Rack::Utils.escape(key)}=#{Rack::Utils.escape(value)}"
|
61
62
|
}.join('&')
|
62
|
-
|
63
|
+
end
|
63
64
|
end
|
@@ -7,6 +7,14 @@ require 'ramaze/template/ezamar/engine'
|
|
7
7
|
module Ezamar
|
8
8
|
|
9
9
|
# A transformer for <render /> tags.
|
10
|
+
#
|
11
|
+
# Setup:
|
12
|
+
#
|
13
|
+
# pipeline = Ramaze::Template::Ezamar::TRANSFORM_PIPELINE
|
14
|
+
# pipeline.put_after(::Ezamar::Element, ::Ezamar::RenderPartial)
|
15
|
+
# pipline.uniq!
|
16
|
+
#
|
17
|
+
# See /examples/basic/partial.rb for usage.
|
10
18
|
|
11
19
|
class RenderPartial
|
12
20
|
extend Ramaze::Helper::Partial
|