manveru-ramaze 2008.10 → 2008.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/benchmark/run.rb +1 -1
  2. data/examples/app/blog/spec/blog.rb +2 -2
  3. data/examples/app/rapaste/spec/rapaste.rb +1 -1
  4. data/examples/app/rapaste/start.rb +2 -2
  5. data/examples/app/todolist/spec/todolist.rb +1 -1
  6. data/examples/app/whywiki/spec/whywiki.rb +1 -1
  7. data/examples/app/wikore/spec/wikore.rb +1 -1
  8. data/examples/app/wikore/src/model.rb +1 -1
  9. data/examples/app/wiktacular/spec/wiktacular.rb +1 -1
  10. data/examples/app/wiktacular/src/model.rb +1 -1
  11. data/examples/basic/partial.rb +28 -0
  12. data/examples/misc/ramaise.rb +2 -2
  13. data/examples/templates/template_amrita2.rb +1 -1
  14. data/examples/templates/template_erubis.rb +1 -1
  15. data/examples/templates/template_ezamar.rb +1 -1
  16. data/examples/templates/template_haml.rb +2 -2
  17. data/examples/templates/template_liquid.rb +1 -1
  18. data/examples/templates/template_markaby.rb +2 -2
  19. data/examples/templates/template_nagoro.rb +1 -1
  20. data/examples/templates/template_redcloth.rb +1 -1
  21. data/examples/templates/template_remarkably.rb +2 -2
  22. data/examples/templates/template_tenjin.rb +1 -1
  23. data/examples/templates/template_xslt.rb +1 -1
  24. data/lib/proto/public/dispatch.fcgi +2 -2
  25. data/lib/proto/spec/main.rb +3 -3
  26. data/lib/ramaze/action.rb +7 -1
  27. data/lib/ramaze/cache/file.rb +71 -0
  28. data/lib/ramaze/cache.rb +1 -0
  29. data/lib/ramaze/contrib/email.rb +2 -0
  30. data/lib/ramaze/contrib/facebook.rb +2 -2
  31. data/lib/ramaze/contrib/file_cache.rb +2 -64
  32. data/lib/ramaze/contrib/sequel/image.rb +1 -1
  33. data/lib/ramaze/controller.rb +6 -1
  34. data/lib/ramaze/current/request.rb +85 -68
  35. data/lib/ramaze/current/session/hash.rb +7 -11
  36. data/lib/ramaze/current/session.rb +3 -5
  37. data/lib/ramaze/dispatcher/action.rb +2 -0
  38. data/lib/ramaze/dispatcher/file.rb +4 -0
  39. data/lib/ramaze/helper/aspect.rb +2 -2
  40. data/lib/ramaze/helper/form.rb +5 -2
  41. data/lib/ramaze/helper/formatting.rb +4 -0
  42. data/lib/ramaze/helper/gravatar.rb +18 -1
  43. data/lib/ramaze/helper/maruku.rb +2 -0
  44. data/lib/ramaze/helper/redirect.rb +22 -4
  45. data/lib/ramaze/helper.rb +9 -2
  46. data/lib/ramaze/reloader/watch_inotify.rb +73 -0
  47. data/lib/ramaze/reloader/watch_stat.rb +62 -0
  48. data/lib/ramaze/reloader.rb +25 -41
  49. data/lib/ramaze/snippets/object/__dir__.rb +3 -3
  50. data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
  51. data/lib/ramaze/spec/helper/mock_http.rb +6 -5
  52. data/lib/ramaze/template/ezamar/render_partial.rb +8 -0
  53. data/lib/ramaze.rb +4 -0
  54. data/ramaze.gemspec +757 -756
  55. data/spec/contrib/profiling.rb +1 -1
  56. data/spec/ramaze/action/file_cache.rb +1 -1
  57. data/spec/ramaze/action/layout.rb +1 -1
  58. data/spec/ramaze/controller/actionless_templates.rb +1 -1
  59. data/spec/ramaze/controller/resolve.rb +1 -1
  60. data/spec/ramaze/controller/template_resolving.rb +1 -1
  61. data/spec/ramaze/dispatcher/directory.rb +3 -3
  62. data/spec/ramaze/helper/aspect.rb +1 -1
  63. data/spec/ramaze/helper/partial.rb +1 -1
  64. data/spec/ramaze/localize.rb +1 -1
  65. data/spec/ramaze/rewrite.rb +1 -1
  66. data/spec/ramaze/template/amrita2.rb +1 -1
  67. data/spec/ramaze/template/erubis.rb +1 -1
  68. data/spec/ramaze/template/ezamar.rb +1 -1
  69. data/spec/ramaze/template/haml.rb +2 -2
  70. data/spec/ramaze/template/nagoro.rb +1 -1
  71. data/spec/ramaze/template/redcloth.rb +1 -1
  72. data/spec/ramaze/template/sass.rb +1 -1
  73. data/spec/ramaze/template/tenjin.rb +1 -1
  74. data/spec/ramaze/template.rb +3 -3
  75. data/spec/snippets/object/__dir__.rb +6 -0
  76. data/spec/snippets/ramaze/acquire.rb +77 -0
  77. metadata +8 -8
data/benchmark/run.rb CHANGED
@@ -176,7 +176,7 @@ class RamazeBenchmark
176
176
 
177
177
  # benchmarks
178
178
  __DIR__ = File.expand_path(File.dirname(__FILE__))
179
- Dir[__DIR__/"suite"/"*.rb"].each do |filename|
179
+ Dir[__DIR__('suite/*.rb')].each do |filename|
180
180
  @adapters.each do |adapter|
181
181
  @paths.each do |path|
182
182
  benchmark(filename, adapter, path) if @target.match(filename)
@@ -3,7 +3,7 @@ require 'ramaze/spec/helper'
3
3
 
4
4
  spec_require 'hpricot', 'sequel'
5
5
 
6
- $LOAD_PATH.unshift base = __DIR__/'..'
6
+ $LOAD_PATH.unshift base = __DIR__('..')
7
7
  require 'start'
8
8
 
9
9
  describe 'Blog' do
@@ -83,5 +83,5 @@ describe 'Blog' do
83
83
  (check_page/'div.entry').size.should == 1
84
84
  end
85
85
 
86
- FileUtils.rm_f(__DIR__/'../blog.db')
86
+ FileUtils.rm_f(__DIR__('../blog.db'))
87
87
  end
@@ -3,7 +3,7 @@ require 'ramaze/spec/helper'
3
3
 
4
4
  spec_require 'hpricot', 'uv', 'sequel'
5
5
 
6
- $LOAD_PATH.unshift base = __DIR__/'..'
6
+ $LOAD_PATH.unshift base = __DIR__('..')
7
7
  require 'start'
8
8
 
9
9
  describe 'RaPaste' do
@@ -7,7 +7,7 @@ require 'uv'
7
7
 
8
8
  Ramaze::Log.debug "Initializing UltraViolet..."
9
9
 
10
- Uv.copy_files "xhtml", __DIR__/"public"
10
+ Uv.copy_files "xhtml", __DIR__("public")
11
11
  Uv.init_syntaxes
12
12
 
13
13
  UV_PRIORITY_NAMES = %w[ ruby plain_text html css javascript yaml diff ]
@@ -16,7 +16,7 @@ STYLE = 'iplastic'
16
16
 
17
17
  Ramaze::Log.debug "done."
18
18
 
19
- DB_FILE = "#{__DIR__}/rapaste.sqlite" # for specs
19
+ DB_FILE = __DIR__("rapaste.sqlite") # for specs
20
20
  DB = Sequel.connect("sqlite://#{DB_FILE}")
21
21
 
22
22
  require 'model/paste'
@@ -3,7 +3,7 @@ require 'ramaze/spec/helper'
3
3
 
4
4
  spec_require 'hpricot'
5
5
 
6
- $LOAD_PATH.unshift base = __DIR__/'..'
6
+ $LOAD_PATH.unshift base = __DIR__('..')
7
7
  require 'start'
8
8
 
9
9
  describe 'todolist' do
@@ -3,7 +3,7 @@ require 'ramaze/spec/helper'
3
3
 
4
4
  spec_require 'bluecloth', 'hpricot'
5
5
 
6
- $LOAD_PATH.unshift base = __DIR__/'..'
6
+ $LOAD_PATH.unshift base = __DIR__('..')
7
7
 
8
8
  Db = Ramaze::YAMLStoreCache.new("#{base}/testwiki.yaml")
9
9
  require 'start'
@@ -3,7 +3,7 @@ require 'ramaze/spec/helper'
3
3
 
4
4
  spec_require 'hpricot', 'sequel'
5
5
 
6
- $LOAD_PATH.unshift base = __DIR__/'..'
6
+ $LOAD_PATH.unshift base = __DIR__('..')
7
7
  require 'start'
8
8
 
9
9
  describe 'Wikore' do
@@ -5,7 +5,7 @@ begin
5
5
  when :memory
6
6
  DB = Sequel.sqlite
7
7
  else
8
- DB_FILE = __DIR__/'wikore.db'
8
+ DB_FILE = __DIR__('wikore.db')
9
9
  DB = Sequel.connect("sqlite://#{DB_FILE}")
10
10
  end
11
11
  rescue NoMethodError
@@ -3,7 +3,7 @@ require 'ramaze/spec/helper'
3
3
 
4
4
  spec_require 'hpricot', 'bluecloth'
5
5
 
6
- $LOAD_PATH.unshift base = __DIR__/'..'
6
+ $LOAD_PATH.unshift base = __DIR__('..')
7
7
  require 'start'
8
8
 
9
9
  describe 'wiktacular' do
@@ -2,7 +2,7 @@ require 'fileutils'
2
2
  require 'cgi'
3
3
 
4
4
  class WikiEntry
5
- ENTRIES_DIR = __DIR__/'../mkd'
5
+ ENTRIES_DIR = __DIR__('../mkd')
6
6
  class << self
7
7
  def [](name)
8
8
  if File.exist?(ENTRIES_DIR/File.basename(File.expand_path(name)))
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'ramaze'
3
+
4
+ # This is a small extension to the hello world example, showing how to use the
5
+ # <render> tag of Ezamar.
6
+ #
7
+ # Browse to /more and /even_more
8
+
9
+ pipeline = Ramaze::Template::Ezamar::TRANSFORM_PIPELINE
10
+ pipeline.put_after(::Ezamar::Element, ::Ezamar::RenderPartial)
11
+ pipeline.uniq!
12
+
13
+ class MainController < Ramaze::Controller
14
+ def index
15
+ "Hello, World!"
16
+ end
17
+
18
+ def more
19
+ @tail = request[:tail] || 'the standard'
20
+ 'More of <render src="/index" /> #@tail'
21
+ end
22
+
23
+ def even_more
24
+ '<render src="/more" tail="This is even more" />'
25
+ end
26
+ end
27
+
28
+ Ramaze.start
@@ -15,7 +15,7 @@
15
15
  %w(rubygems ramaze bluecloth rubypants haml).each{|lib| require lib }
16
16
 
17
17
  class BlogPost
18
- DIR = __DIR__/:entries
18
+ DIR = __DIR__(:entries)
19
19
 
20
20
  def initialize filename
21
21
  raise 'Invalid BlogPost filename' unless File.exists?(filename)
@@ -129,4 +129,4 @@ class MainController < Ramaze::Controller
129
129
 
130
130
  end
131
131
 
132
- Ramaze.start :sessions => false #, :adapter => :mongrel, :port => 3000
132
+ Ramaze.start :sessions => false #, :adapter => :mongrel, :port => 3000
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :Amrita2
7
7
 
8
8
  def index
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :Erubis
7
7
 
8
8
  def index
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
 
7
7
  def index
8
8
  %{ #{A 'Home', :href => :/} | #{A(:internal)} | #{A(:external)} }
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :Haml
7
7
 
8
8
  def index
@@ -29,7 +29,7 @@ class MainController < Ramaze::Controller
29
29
  = A("#@place/one/two/three")
30
30
  %br/
31
31
  = A("#@place/one?foo=bar")
32
- %div
32
+ %div
33
33
  The arguments you have passed to this action are:
34
34
  - if @args.empty?
35
35
  none
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :Liquid
7
7
 
8
8
  def index
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/'template'
5
+ view_root __DIR__('template')
6
6
  engine :Markaby
7
7
 
8
8
  helper :markaby
@@ -33,7 +33,7 @@ class MainController < Ramaze::Controller
33
33
  br
34
34
  end
35
35
  div do
36
- text "The arguments you have passed to this action are:"
36
+ text "The arguments you have passed to this action are:"
37
37
  if @args.empty?
38
38
  text "none"
39
39
  else
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :Nagoro
7
7
 
8
8
  def index
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :RedCloth
7
7
  layout :layout
8
8
 
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'ramaze'
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :Remarkably
7
7
 
8
8
  include Remarkably::Common
@@ -31,7 +31,7 @@ class MainController < Ramaze::Controller
31
31
  br
32
32
  end
33
33
  div do
34
- text "The arguments you have passed to this action are:"
34
+ text "The arguments you have passed to this action are:"
35
35
  if args.empty?
36
36
  "none"
37
37
  else
@@ -2,7 +2,7 @@ require "rubygems"
2
2
  require "ramaze"
3
3
 
4
4
  class MainController < Ramaze::Controller
5
- view_root __DIR__/:template
5
+ view_root __DIR__(:template)
6
6
  engine :Tenjin
7
7
 
8
8
  def index
@@ -3,7 +3,7 @@ require 'ramaze'
3
3
  require 'ramaze/gestalt'
4
4
 
5
5
  class MainController < Ramaze::Controller
6
- view_root __DIR__/:template
6
+ view_root __DIR__(:template)
7
7
  engine :XSLT
8
8
 
9
9
  def index
@@ -4,8 +4,8 @@ require 'rubygems'
4
4
  require 'ramaze'
5
5
 
6
6
  # FCGI doesn't like you writing to stdout
7
- Ramaze::Log.loggers = [ Ramaze::Logger::Informer.new( File.join(__DIR__, '..', 'ramaze.fcgi.log') ) ]
7
+ Ramaze::Log.loggers = [ Ramaze::Logger::Informer.new( __DIR__("../ramaze.fcgi.log") ) ]
8
8
  Ramaze::Global.adapter = :fcgi
9
9
 
10
- $0 = File.join(__DIR__, '..', 'start.rb')
10
+ $0 = __DIR__("../start.rb")
11
11
  require $0
@@ -1,12 +1,12 @@
1
1
  require 'ramaze'
2
2
  require 'ramaze/spec/helper'
3
3
 
4
- require __DIR__/'../start'
4
+ require __DIR__('../start')
5
5
 
6
6
  describe MainController do
7
7
  behaves_like 'http', 'xpath'
8
- ramaze :view_root => __DIR__/'../view',
9
- :public_root => __DIR__/'../public'
8
+ ramaze :view_root => __DIR__('../view'),
9
+ :public_root => __DIR__('../public')
10
10
 
11
11
  it 'should show start page' do
12
12
  got = get('/')
data/lib/ramaze/action.rb CHANGED
@@ -110,17 +110,21 @@ module Ramaze
110
110
  end
111
111
 
112
112
  # Try to figure out a sane name for current action.
113
+
113
114
  def name
114
115
  File.basename((self[:method] || self[:template]).to_s).split('.').first
115
116
  end
116
117
 
117
118
  # combined path to current action, from path and params
119
+
118
120
  def extended_path
119
121
  (path == "index" && !params.empty? ? params : Array[path, *params]).join('/')
120
122
  end
121
123
 
124
+ # same as Ramaze::Action#extended_path, with mapping of the current controller prepended.
125
+
122
126
  def full_path
123
- self.controller.mapping/extended_path
127
+ File.join(self.controller.mapping, extended_path)
124
128
  end
125
129
 
126
130
  # Hook for AspectHelper
@@ -133,6 +137,8 @@ module Ramaze
133
137
  def after_process
134
138
  end
135
139
 
140
+ # Returns true if current request is valid REST request.
141
+
136
142
  def valid_rest?
137
143
  return true unless rest = controller.trait[:REST]
138
144
  meth = Request.current.request_method
@@ -0,0 +1,71 @@
1
+ module Ramaze
2
+ # Persist cache contents to the filesystem.
3
+ # By default this will create a `/cache` directory in your APPDIR
4
+ #
5
+ # Usage for sessions only:
6
+ #
7
+ # Ramaze::Global::cache_alternative[:sessions] = Ramaze::FileCache
8
+ #
9
+ # Usage for everything:
10
+ #
11
+ # Ramaze::Global::cache = Ramaze::FileCache
12
+
13
+ class FileCache
14
+ attr_accessor :root, :subdir
15
+ attr_reader :host, :pid
16
+
17
+ def initialize(root = Ramaze::Global.root, subdir = 'cache')
18
+ @root, @subdir = root, subdir
19
+ @host = Socket.gethostname
20
+ @pid = $$
21
+
22
+ FileUtils.mkdir_p(dir)
23
+ end
24
+
25
+ def dir(*further)
26
+ File.join(root, subdir, *further)
27
+ end
28
+
29
+ def [](key)
30
+ Marshal.load(File.read(dir(key.to_s, 'data')))
31
+ rescue
32
+ nil
33
+ end
34
+
35
+ def []=(key, value)
36
+ key = key.to_s
37
+ tmp_name = dir(key, "data.#{host}.#{pid}")
38
+ key_name = dir(key, 'data')
39
+ dir_name = dir(key)
40
+
41
+ data = Marshal.dump(value)
42
+
43
+ FileUtils.rm_rf(dir_name)
44
+ FileUtils.mkdir_p(dir_name)
45
+
46
+ File.open(tmp_name, 'w'){|fd| fd.write(data) }
47
+
48
+ FileUtils.mv(tmp_name, key_name)
49
+
50
+ return value
51
+ end
52
+
53
+ def values_at(*keys)
54
+ keys.map{|key| self[key] }
55
+ end
56
+
57
+ def delete(*keys)
58
+ keys.map do |key|
59
+ FileUtils.rm_rf(dir(key.to_s))
60
+ end
61
+ end
62
+
63
+ def clear
64
+ Dir[dir('*')].each{|entry| FileUtils.rm_rf(entry) }
65
+ end
66
+
67
+ def to_sym
68
+ name.split('::').last.to_sym
69
+ end
70
+ end
71
+ end
data/lib/ramaze/cache.rb CHANGED
@@ -6,6 +6,7 @@ require 'ramaze/cache/memory'
6
6
  module Ramaze
7
7
  autoload :YAMLStoreCache, "ramaze/cache/yaml_store.rb"
8
8
  autoload :MemcachedCache, "ramaze/cache/memcached.rb"
9
+ autoload :FileCache, "ramaze/cache/file.rb"
9
10
 
10
11
  # This is the wrapper of all caches, providing mechanism
11
12
  # for switching caching from one adapter to another.
@@ -67,6 +67,8 @@ Message-Id: #{id}
67
67
  send_smtp( email, recipient, subject )
68
68
  end
69
69
 
70
+ # the raw mail sending method used by Ramaze::EmailHelper
71
+
70
72
  def send_smtp( email, recipient, subject )
71
73
  options = trait.values_at(:smtp_server, :smtp_port, :smtp_helo_domain,
72
74
  :smtp_username, :smtp_password, :smtp_auth_type)
@@ -1,4 +1,4 @@
1
- require __DIR__/:facebook/:facebook
1
+ require __DIR__('facebook/facebook')
2
2
 
3
3
  module Ramaze
4
4
  module Helper::Facebook
@@ -20,4 +20,4 @@ module Ramaze
20
20
  end
21
21
  alias fb facebook
22
22
  end
23
- end
23
+ end
@@ -1,65 +1,3 @@
1
- #
2
- # drop-in replacement for Ramaze's built-in MemoryCache built on the
3
- # filesystem. # to use with sessions do
4
- #
5
- # Ramaze::Global::cache_alternative[:sessions] = Ramaze::FileCache
6
- #
7
- # to use with everything do
8
- #
9
- # Ramaze::Global::cache = Ramaze::FileCache
10
- #
1
+ Ramaze::Log.warn("ramaze/contrib/file_cache is now ramaze/cache/file")
11
2
 
12
- module Ramaze::FileCache
13
- require "fileutils"
14
- require "socket"
15
-
16
- Host = Socket.gethostname
17
- Pid = Process.pid
18
- Fu = FileUtils
19
- Root = File.join Ramaze::APPDIR, "cache"
20
-
21
- Fu.mkdir_p(Root) rescue nil
22
-
23
- def self.[] key
24
- path = File.join Root, key, "data"
25
- Marshal.load(IO.read(path))
26
- rescue
27
- nil
28
- end
29
-
30
- def self.[]= key, value
31
- tmp = File.join Root, key, "data.#{ Host }.#{ Pid }"
32
- dirname = File.join Root, key
33
- path = File.join Root, key, "data"
34
- data = Marshal.dump value
35
- Fu.rm_rf dirname rescue nil
36
- Fu.mkdir_p dirname rescue nil
37
- open(tmp, 'w'){|fd| fd.write data}
38
- Fu.mv tmp, path
39
- rescue
40
- nil
41
- end
42
-
43
- def self.values_at *keys
44
- keys.map{|key| self[key]}
45
- end
46
-
47
- def self.delete *keys
48
- keys.map do |key|
49
- dirname = File.join Root, key
50
- Fu.rm_rf dirname rescue next
51
- end
52
- end
53
-
54
- def self.clear
55
- Dir["#{ Root }/*"].each{|entry| Fu.rm_rf entry}
56
- end
57
-
58
- def self.new
59
- self
60
- end
61
-
62
- def self.to_sym
63
- name.split(%r/::/).last.to_sym
64
- end
65
- end
3
+ require 'ramaze/cache/file'
@@ -31,7 +31,7 @@
31
31
  # # Creates a square thumbnail of the image cropping the longest edge
32
32
  # # to match the shortest edge, resizes to +size+.
33
33
  #
34
- # :agorithm => :thumbnail,
34
+ # :algorithm => :thumbnail,
35
35
  #
36
36
  #
37
37
  # # Key specifies the filename and accessors, value are arguments to the
@@ -67,7 +67,8 @@ module Ramaze
67
67
 
68
68
  # if trait[:automap] is set and controller is not in Global.mapping yet
69
69
  # this will build a new default mapping-point, MainController is put
70
- # at '/' by default.
70
+ # at '/' by default. For other Class names, String#snake_case is called,
71
+ # e.g. FooBarController is mapped at '/foo_bar'.
71
72
 
72
73
  def mapping
73
74
  global_mapping = Global.mapping.invert[self]
@@ -265,6 +266,10 @@ module Ramaze
265
266
  action.render
266
267
  end
267
268
 
269
+ # By default, returns all ancestors of current Controller that have
270
+ # Ramaze::Controller as their ancestor. Optional argument parent
271
+ # can be used return ancestors that have parent as an ancestor.
272
+
268
273
  def relevant_ancestors(parent = Ramaze::Controller)
269
274
  ancestors.select do |anc|
270
275
  anc.ancestors.include?(parent)