topherfangio-inherit_views 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +27 -0
- data/License.txt +20 -0
- data/README.rdoc +65 -0
- data/Rakefile +64 -0
- data/Todo.txt +0 -0
- data/garlic.rb +33 -0
- data/inherit_views.gemspec +17 -0
- data/init.rb +5 -0
- data/lib/inherit_views.rb +166 -0
- data/spec/app.rb +47 -0
- data/spec/controllers/a_controller_spec.rb +44 -0
- data/spec/controllers/b_controller_spec.rb +70 -0
- data/spec/controllers/c_controller_spec.rb +71 -0
- data/spec/controllers/d_controller_spec.rb +21 -0
- data/spec/controllers/normal_controller_spec.rb +10 -0
- data/spec/mailers/mailer_spec.rb +42 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/views_for_specs/a/_partial_render_parent.html.erb +1 -0
- data/spec/views_for_specs/a/in_a.html.erb +1 -0
- data/spec/views_for_specs/a/in_ab.html.erb +1 -0
- data/spec/views_for_specs/a/in_abc.html.erb +1 -0
- data/spec/views_for_specs/a/render_non_existent_partial.html.erb +1 -0
- data/spec/views_for_specs/a/render_parent.html.erb +1 -0
- data/spec/views_for_specs/b/_partial_in_b.html.erb +1 -0
- data/spec/views_for_specs/b/_partial_in_bc.html.erb +1 -0
- data/spec/views_for_specs/b/_partial_render_parent.html.erb +1 -0
- data/spec/views_for_specs/b/bad_render_parent.html.erb +1 -0
- data/spec/views_for_specs/b/collection_in_bc.html.erb +1 -0
- data/spec/views_for_specs/b/in_ab.html.erb +1 -0
- data/spec/views_for_specs/b/in_abc.html.erb +1 -0
- data/spec/views_for_specs/b/in_b.html.erb +1 -0
- data/spec/views_for_specs/b/partial_in_b.html.erb +1 -0
- data/spec/views_for_specs/b/partial_in_bc.html.erb +1 -0
- data/spec/views_for_specs/b/partial_render_parent.html.erb +1 -0
- data/spec/views_for_specs/b/render_parent.html.erb +1 -0
- data/spec/views_for_specs/c/_partial_in_bc.html.erb +1 -0
- data/spec/views_for_specs/c/_partial_render_parent.html.erb +1 -0
- data/spec/views_for_specs/c/in_abc.html.erb +1 -0
- data/spec/views_for_specs/c/in_c.html.erb +1 -0
- data/spec/views_for_specs/c/render_parent.html.erb +1 -0
- data/spec/views_for_specs/inheriting_mailer/email.erb +2 -0
- data/spec/views_for_specs/normal/partial_from_c.html.erb +1 -0
- data/spec/views_for_specs/normal_mailer/_partial.erb +1 -0
- data/spec/views_for_specs/normal_mailer/email.erb +2 -0
- metadata +97 -0
data/History.txt
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
* Added gemspec for GitHub auto-creation
|
2
|
+
|
3
|
+
* Added ActionMailer support
|
4
|
+
|
5
|
+
* Added support for rails 2.3
|
6
|
+
|
7
|
+
* Removed render_parent for now (in edge rails version)
|
8
|
+
|
9
|
+
* inherit_views allows inherited templates to be rendered where there is no action method
|
10
|
+
|
11
|
+
* Vastly simplified internals, making use of the _pick_template single point of entry
|
12
|
+
|
13
|
+
* branched fro rails 2.0 and 2.1 in rails-2.0-2.1, edge rails follows master branch
|
14
|
+
|
15
|
+
* Now using garlic for CI
|
16
|
+
|
17
|
+
* Compatibility update for the new ActionView::Partial refactoring.
|
18
|
+
[thanks Chris Hapgood for reporting, and tracking down, the bug]
|
19
|
+
|
20
|
+
* Compatible with both Rails 2.0.x and beyond - uses the template.finder object
|
21
|
+
to find templates if that is available
|
22
|
+
|
23
|
+
* Vastly improved readability of specs, and made them much more acceptance like
|
24
|
+
|
25
|
+
* BC Alert! inherit_views has changed to keep up with edge rails internals.
|
26
|
+
If you're using latest Edge, no problems. If you're using < 7413 then freeze
|
27
|
+
to r390 of inherit_views
|
data/License.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008-2009 Ian White - ian.w.white@gmail.com
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
= {ianwhite}[http://github.com/ianwhite] / {inherit_views}[http://github.com/ianwhite/inherit_views] >>{info}[http://ianwhite.github.com/inherit_views] >>{api}[http://ianwhite.github.com/inherit_views/doc]
|
2
|
+
|
3
|
+
== Status
|
4
|
+
|
5
|
+
inherit_views works with rails 2.x
|
6
|
+
|
7
|
+
If you're on <b>rails 2.3 or rails edge</b>, you want {inherit_views/master}[http://github.com/ianwhite/inherit_views/tree/master]
|
8
|
+
|
9
|
+
If you're on <b>rails 2.2</b>, you want {inherit_views/rails-2.2}[http://github.com/ianwhite/inherit_views/tree/rails-2.2]
|
10
|
+
|
11
|
+
If you're on <b>rails 2.0, or 2.1</b>, you want {inherit_views/rails-2.0-2.1}[http://github.com/ianwhite/inherit_views/tree/rails-2.0-2.1]
|
12
|
+
|
13
|
+
== what does it do?
|
14
|
+
|
15
|
+
This rails plugin allows your controllers/mailers to inherit their views from parent controllers/mailers.
|
16
|
+
The default behaviour is to inherit along the ancestor path of the controller/mailer, but you can also specify custom inherit view paths to search.
|
17
|
+
|
18
|
+
Example:
|
19
|
+
|
20
|
+
class ApplicationController < ActionController::Base
|
21
|
+
inherit_views
|
22
|
+
end
|
23
|
+
|
24
|
+
class FooController < ApplicationController
|
25
|
+
# will look for views in 'views/foo', then 'views/application'
|
26
|
+
end
|
27
|
+
|
28
|
+
class BarController < FooController
|
29
|
+
# will look for views in 'views/bar', then 'views/foo', then 'view/application'
|
30
|
+
end
|
31
|
+
|
32
|
+
See InheritViews for more details
|
33
|
+
|
34
|
+
NOTE: this plugin is not aimed at having multiple view paths for your controllers, which is addressed with the view_paths addition to ActionController::Base for rails 2.0. Rather, within these view paths, you can inherit views from other controller paths.
|
35
|
+
|
36
|
+
== In templates
|
37
|
+
|
38
|
+
You can render the 'parent' template from within a template if you so choose. This works for partials and top-level templates alike.
|
39
|
+
|
40
|
+
<b>foo/view.html.erb</b>
|
41
|
+
<h1>Foo View</h1>
|
42
|
+
|
43
|
+
<b>bar/view.html.erb</b>
|
44
|
+
<%= render :parent %>
|
45
|
+
<h2>With some 'bar' action</h2>
|
46
|
+
|
47
|
+
rendering bar/view (with the controller setup described above):
|
48
|
+
<h1>Foo View</h1>
|
49
|
+
<h2>With some 'bar' action</h2>
|
50
|
+
|
51
|
+
== Testing & CI
|
52
|
+
|
53
|
+
RSpec is used for testing, so the tests are in <tt>spec/</tt> rather than
|
54
|
+
<tt>test/</tt> Do rake --tasks for more details.
|
55
|
+
|
56
|
+
{garlic}[http://github.com/ianwhite/garlic] is used for CI, see garlic.rb for details on
|
57
|
+
what versions of rails are tested.
|
58
|
+
|
59
|
+
== Contributors
|
60
|
+
|
61
|
+
Author: {Ian W. White}[http://github.com/ianwhite]
|
62
|
+
|
63
|
+
Contributions by:
|
64
|
+
|
65
|
+
* {The Dark One}[http://github.com/thedarkone]
|
data/Rakefile
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# use pluginized rpsec if it exists
|
2
|
+
rspec_base = File.expand_path(File.dirname(__FILE__) + '/../rspec/lib')
|
3
|
+
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base) and !$LOAD_PATH.include?(rspec_base)
|
4
|
+
|
5
|
+
require 'spec/rake/spectask'
|
6
|
+
require 'spec/rake/verify_rcov'
|
7
|
+
|
8
|
+
PluginName = 'inherit_views'
|
9
|
+
|
10
|
+
task :default => :spec
|
11
|
+
|
12
|
+
desc "Run the specs for #{PluginName}"
|
13
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
14
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
15
|
+
t.spec_opts = ["--colour"]
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Generate RCov report for #{PluginName}"
|
19
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
20
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
t.rcov = true
|
22
|
+
t.rcov_dir = 'doc/coverage'
|
23
|
+
t.rcov_opts = ['--text-report', '--exclude', "spec/,rcov.rb,#{File.expand_path(File.join(File.dirname(__FILE__),'../../..'))}"]
|
24
|
+
end
|
25
|
+
|
26
|
+
namespace :rcov do
|
27
|
+
desc "Verify RCov threshold for #{PluginName}"
|
28
|
+
RCov::VerifyTask.new(:verify => :rcov) do |t|
|
29
|
+
t.threshold = 100.0
|
30
|
+
t.index_html = File.join(File.dirname(__FILE__), 'doc/coverage/index.html')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# the following optional tasks are for CI and doc building
|
35
|
+
begin
|
36
|
+
require 'hanna/rdoctask'
|
37
|
+
require 'garlic/tasks'
|
38
|
+
require 'grancher/task'
|
39
|
+
|
40
|
+
task :cruise => ['garlic:all', 'doc:publish']
|
41
|
+
|
42
|
+
Rake::RDocTask.new(:doc) do |d|
|
43
|
+
d.options << '--all'
|
44
|
+
d.rdoc_dir = 'doc'
|
45
|
+
d.main = 'README.rdoc'
|
46
|
+
d.title = "#{PluginName} API docs"
|
47
|
+
d.rdoc_files.include('README.rdoc', 'History.txt', 'License.txt', 'Todo.txt', 'lib/**/*.rb')
|
48
|
+
end
|
49
|
+
|
50
|
+
namespace :doc do
|
51
|
+
task :publish => :doc do
|
52
|
+
Rake::Task['doc:push'].invoke unless uptodate?('.git/refs/heads/gh-pages', 'doc')
|
53
|
+
end
|
54
|
+
|
55
|
+
Grancher::Task.new(:push) do |g|
|
56
|
+
g.keep_all
|
57
|
+
g.directory 'doc', 'doc'
|
58
|
+
g.branch = 'gh-pages'
|
59
|
+
g.push_to = 'origin'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
rescue LoadError
|
64
|
+
end
|
data/Todo.txt
ADDED
File without changes
|
data/garlic.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
garlic do
|
2
|
+
repo 'inherit_views', :path => '.'
|
3
|
+
|
4
|
+
repo 'rails', :url => 'git://github.com/rails/rails'
|
5
|
+
repo 'rspec', :url => 'git://github.com/dchelimsky/rspec'
|
6
|
+
repo 'rspec-rails', :url => 'git://github.com/dchelimsky/rspec-rails'
|
7
|
+
|
8
|
+
# Make sure you set up tracking branches for origin/rails-2.2, and origin/rails-2.0-2.1
|
9
|
+
[
|
10
|
+
{:rails => 'master', :inherit_views => 'master'},
|
11
|
+
{:rails => '2-3-stable', :inherit_views => 'master'},
|
12
|
+
{:rails => '2-2-stable', :inherit_views => 'rails-2.2'},
|
13
|
+
{:rails => '2-1-stable', :inherit_views => 'rails-2.0-2.1'},
|
14
|
+
{:rails => '2-0-stable', :inherit_views => 'rails-2.0-2.1'}
|
15
|
+
].each do |target|
|
16
|
+
|
17
|
+
target target[:rails], :branch => "origin/#{target[:rails]}" do
|
18
|
+
prepare do
|
19
|
+
plugin 'inherit_views', :branch => "origin/#{target[:inherit_views]}", :clone => true
|
20
|
+
plugin 'rspec', :branch => 'origin/1.1-maintenance'
|
21
|
+
plugin 'rspec-rails', :branch => 'origin/1.1-maintenance' do
|
22
|
+
sh "script/generate rspec -f"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
run do
|
26
|
+
cd "vendor/plugins/inherit_views" do
|
27
|
+
sh "rake rcov:verify"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = %q{inherit_views}
|
3
|
+
s.version = '1.0.1'
|
4
|
+
|
5
|
+
s.date = %q{2009-06-18}
|
6
|
+
s.summary = %q{Allow rails views to inherit from each other.}
|
7
|
+
s.description = %q{Allow rails views to inherit from each other.}
|
8
|
+
s.authors = ["Ian W. White", "thedarkone"]
|
9
|
+
s.email = "ian.w.white@gmail.com"
|
10
|
+
s.homepage = "http://github.com/topherfangio/inherit_views/tree/master"
|
11
|
+
|
12
|
+
s.has_rdoc = true
|
13
|
+
s.require_paths = ["lib"]
|
14
|
+
|
15
|
+
s.files = ["garlic.rb", "History.txt", "inherit_views.gemspec", "init.rb", "License.txt", "Rakefile", "README.rdoc", "Todo.txt", "lib/inherit_views.rb", "spec/controllers/a_controller_spec.rb", "spec/controllers/c_controller_spec.rb", "spec/controllers/b_controller_spec.rb", "spec/controllers/normal_controller_spec.rb", "spec/controllers/d_controller_spec.rb", "spec/spec_helper.rb", "spec/app.rb", "spec/mailers/mailer_spec.rb", "spec/views_for_specs/b/partial_in_b.html.erb", "spec/views_for_specs/b/bad_render_parent.html.erb", "spec/views_for_specs/b/partial_in_bc.html.erb", "spec/views_for_specs/b/in_abc.html.erb", "spec/views_for_specs/b/partial_render_parent.html.erb", "spec/views_for_specs/b/_partial_in_b.html.erb", "spec/views_for_specs/b/_partial_in_bc.html.erb", "spec/views_for_specs/b/collection_in_bc.html.erb", "spec/views_for_specs/b/in_b.html.erb", "spec/views_for_specs/b/in_ab.html.erb", "spec/views_for_specs/b/_partial_render_parent.html.erb", "spec/views_for_specs/b/render_parent.html.erb", "spec/views_for_specs/normal_mailer/email.erb", "spec/views_for_specs/normal_mailer/_partial.erb", "spec/views_for_specs/a/render_non_existent_partial.html.erb", "spec/views_for_specs/a/in_a.html.erb", "spec/views_for_specs/a/in_abc.html.erb", "spec/views_for_specs/a/in_ab.html.erb", "spec/views_for_specs/a/_partial_render_parent.html.erb", "spec/views_for_specs/a/render_parent.html.erb", "spec/views_for_specs/normal/partial_from_c.html.erb", "spec/views_for_specs/c/in_abc.html.erb", "spec/views_for_specs/c/_partial_in_bc.html.erb", "spec/views_for_specs/c/_partial_render_parent.html.erb", "spec/views_for_specs/c/in_c.html.erb", "spec/views_for_specs/c/render_parent.html.erb", "spec/views_for_specs/inheriting_mailer/email.erb"]
|
16
|
+
|
17
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1,5 @@
|
|
1
|
+
require 'inherit_views'
|
2
|
+
|
3
|
+
defined?(ActionController) && ActionController::Base.extend(InheritViews::ActMethod)
|
4
|
+
defined?(ActionMailer) && ActionMailer::Base.extend(InheritViews::ActMethod)
|
5
|
+
defined?(ActionView) && ActionView::Base.send(:include, InheritViews::ActionView)
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# Allow your controllers to inherit their views from parent controllers, or from
|
2
|
+
# specified view paths.
|
3
|
+
#
|
4
|
+
# === Example
|
5
|
+
#
|
6
|
+
# class FooController < ApplicationController
|
7
|
+
# inherit_views
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# class BarController < FooController
|
11
|
+
# ... # will look for views in 'views/bar' and 'views/foo'
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# In the example above, If BarController, or any of the views in views/bar, renders 'bar/view'
|
15
|
+
# and it is not found then 'foo/view' is rendered (if it can be found)
|
16
|
+
#
|
17
|
+
# You can also specify an inherit path other than the default (it does not have to be the default controller path)
|
18
|
+
# If your controller inherits from a controller with inherit_views then that controller
|
19
|
+
# gets the inherited view paths as well.
|
20
|
+
#
|
21
|
+
# class FooController < ApplicationController
|
22
|
+
# inherit_views 'far', 'faz' # will look for views in 'foo', then 'far', then 'faz'
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# class BarController < FooController
|
26
|
+
# # will look for views in 'bar', 'foo', 'far', 'faz'
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# If you want to turn off inherited views for a controller that has inherit_views in its
|
30
|
+
# ancestors use self.inherit_views=
|
31
|
+
#
|
32
|
+
# class BarController < FooController
|
33
|
+
# self.inherit_views = false
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# You can completely override the inherited view paths in a subclass controller using
|
37
|
+
# inherit_view_paths=
|
38
|
+
#
|
39
|
+
# class BarController < FooController
|
40
|
+
# self.inherit_view_paths = ['you_can_go', 'your_own_way']
|
41
|
+
# # will look for views in 'bar', 'you_can_go', and 'your_own_way'
|
42
|
+
# # (not 'far' or 'faz' from FooController)
|
43
|
+
# end
|
44
|
+
module InheritViews
|
45
|
+
# class extension which enables specification of inherit_views
|
46
|
+
module ActMethod
|
47
|
+
# Specify this to have your controller or mailer inherit its views from the specified path
|
48
|
+
# or the current controller/mailer's default path if no argument is given
|
49
|
+
def inherit_views(*paths)
|
50
|
+
class_eval do
|
51
|
+
extend PathsContainer unless respond_to?(:inherit_views_paths)
|
52
|
+
self.inherit_views = true
|
53
|
+
self.inherit_view_paths = paths if paths.any?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# class extension that enables inherit_view_paths to be calculated/set
|
59
|
+
#
|
60
|
+
# requires a class method called 'controller_path' (ActionController::Base & ActionMailer::Base have this)
|
61
|
+
module PathsContainer
|
62
|
+
def self.extended(base)
|
63
|
+
base.class_eval do
|
64
|
+
delegate :inherit_views?, :inherit_view_paths, :to => 'self.class'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Return true if the class is inheriting views
|
69
|
+
def inherit_views?
|
70
|
+
read_inheritable_attribute('inherit_views') ? true : false
|
71
|
+
end
|
72
|
+
|
73
|
+
# Instruct the class that it is, or is not, inheriting views
|
74
|
+
def inherit_views=(bool)
|
75
|
+
write_inheritable_attribute('inherit_views', bool)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Return the inherit view paths, in order of self to ancestor.
|
79
|
+
# Takes inherit_view_paths from the superclass when first read, and prepends the current controller_path
|
80
|
+
def inherit_view_paths
|
81
|
+
instance_variable_get('@inherit_view_paths') || instance_variable_set('@inherit_view_paths', [controller_path] + (superclass.inherit_view_paths rescue []))
|
82
|
+
end
|
83
|
+
|
84
|
+
# Set the inherit view paths, in order of self to ancestor.
|
85
|
+
# The controller_path for self is always prepended to the front, no matter what the arguments.
|
86
|
+
def inherit_view_paths=(new_paths)
|
87
|
+
new_paths -= [controller_path]
|
88
|
+
old_paths = inherit_view_paths - [controller_path] - new_paths
|
89
|
+
instance_variable_set('@inherit_view_paths', [controller_path] + new_paths + old_paths)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# just like a normal path set, but can have an optional array of inherit_view_paths
|
94
|
+
# which will be used to look for a matching template if the original template is missing
|
95
|
+
class PathSet < ::ActionView::PathSet
|
96
|
+
attr_accessor :inherit_view_paths
|
97
|
+
|
98
|
+
alias_method :orig_find_template, :find_template
|
99
|
+
|
100
|
+
# look for a parent template if a standard one can't be found
|
101
|
+
def find_template(template_path, format = nil, html_fallback = true)
|
102
|
+
super
|
103
|
+
rescue ::ActionView::MissingTemplate
|
104
|
+
find_parent_template(template_path, format)
|
105
|
+
end
|
106
|
+
|
107
|
+
# given a template_path and format, returns a parent template, or raise ActionView::MissingTemplate
|
108
|
+
def find_parent_template(template_path, format = nil, html_fallback = true)
|
109
|
+
# first, we grab the inherit view paths that are 'above' the given template_path
|
110
|
+
if inherit_view_paths.present? && (starting_path = inherit_view_paths.detect {|path| template_path.starts_with?("#{path}/")})
|
111
|
+
parent_paths = inherit_view_paths.slice(inherit_view_paths.index(starting_path)+1..-1)
|
112
|
+
# then, search through each path, substituting the inherit view path, returning the first found
|
113
|
+
parent_paths.each do |path|
|
114
|
+
begin
|
115
|
+
return orig_find_template(template_path.sub(/^#{starting_path}/, path), format, html_fallback)
|
116
|
+
rescue ::ActionView::MissingTemplate
|
117
|
+
next
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
raise ::ActionView::MissingTemplate.new(self, template_path, format)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Mixin for ActionView::Base to enable inherit views functionality. There are two
|
126
|
+
# enhancements
|
127
|
+
#
|
128
|
+
# * view_paths are set to an InheritViews::PathSet object, and any inherit_view_paths
|
129
|
+
# are passed from the view's controller to the view_paths
|
130
|
+
#
|
131
|
+
# * render is extended to include support for render :parent, see render_with_parent
|
132
|
+
module ActionView
|
133
|
+
def self.included(base)
|
134
|
+
base.class_eval do
|
135
|
+
def self.process_view_paths(value)
|
136
|
+
InheritViews::PathSet.new(Array(value))
|
137
|
+
end
|
138
|
+
|
139
|
+
alias_method_chain :view_paths=, :inherit_views
|
140
|
+
alias_method_chain :render, :parent
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# set the view_paths, and afterwards pass it my controller's inherit_view_paths
|
145
|
+
def view_paths_with_inherit_views=(value)
|
146
|
+
returning self.view_paths_without_inherit_views=(value) do
|
147
|
+
@view_paths.inherit_view_paths = controller.inherit_view_paths if (controller.inherit_views? rescue false)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Extension for render which enables the following (in partials as well as top-level tenplates)
|
152
|
+
#
|
153
|
+
# <%= render :parent %>
|
154
|
+
# <%= render :parent, :locals => {:foo => @foo} %>
|
155
|
+
#
|
156
|
+
# These calls will render the template that is 'above' the current template according to the#
|
157
|
+
# current controller's inherit_view_paths.
|
158
|
+
def render_with_parent(*args, &block)
|
159
|
+
if args.first == :parent
|
160
|
+
args.shift
|
161
|
+
args.first[:file] = view_paths.find_parent_template(template.to_s, template.format)
|
162
|
+
end
|
163
|
+
render_without_parent(*args, &block)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
data/spec/app.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
class InheritViewsTestController < ActionController::Base
|
2
|
+
self.view_paths = [File.join(File.dirname(__FILE__), 'views_for_specs')]
|
3
|
+
end
|
4
|
+
|
5
|
+
# :a controller is a normal controller with inherit_views
|
6
|
+
# its subclasses will inherit its views
|
7
|
+
class AController < InheritViewsTestController
|
8
|
+
inherit_views
|
9
|
+
|
10
|
+
def render_non_existent_template
|
11
|
+
render :action => 'non_existent'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# :b controller is a normal controller with inherit_views 'a'
|
16
|
+
# It will inherit a's views, and its sublcasses will inherit its views ('b', then 'a')
|
17
|
+
class BController < InheritViewsTestController
|
18
|
+
inherit_views 'a'
|
19
|
+
end
|
20
|
+
|
21
|
+
# :c cotroller is a subclass of :b controller, so it inheirt's b's views ('c', 'b', then 'a')
|
22
|
+
class CController < BController
|
23
|
+
end
|
24
|
+
|
25
|
+
# :d controller is a subclass of :a controller, with inherit_views 'other', so its views == ('d', 'other', then 'a')
|
26
|
+
class DController < AController
|
27
|
+
inherit_views 'other'
|
28
|
+
end
|
29
|
+
|
30
|
+
# used to test normal rails behaviour
|
31
|
+
class NormalController < InheritViewsTestController
|
32
|
+
end
|
33
|
+
|
34
|
+
# used to test ActionMailer's use of views is not affected
|
35
|
+
class NormalMailer < ActionMailer::Base
|
36
|
+
self.template_root = File.join(File.dirname(__FILE__), 'views_for_specs')
|
37
|
+
|
38
|
+
def email
|
39
|
+
recipients 'test@test.com'
|
40
|
+
subject 'An email'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# inherits views form normal mailer
|
45
|
+
class InheritingMailer < NormalMailer
|
46
|
+
inherit_views 'normal_mailer'
|
47
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
|
2
|
+
|
3
|
+
describe AController, " < TestController; inherit_views" do
|
4
|
+
describe "(the class)" do
|
5
|
+
it { AController.should be_inherit_views }
|
6
|
+
|
7
|
+
it "should have inherit view paths == ['a']" do
|
8
|
+
AController.inherit_view_paths.should == ['a']
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "(an instance)" do
|
13
|
+
integrate_views
|
14
|
+
|
15
|
+
it { @controller.should be_inherit_views }
|
16
|
+
|
17
|
+
it "should have inherit view paths == ['a']" do
|
18
|
+
@controller.class.inherit_view_paths.should == ['a']
|
19
|
+
end
|
20
|
+
|
21
|
+
it "GET :in_abc should render a/in_abc" do
|
22
|
+
get :in_abc
|
23
|
+
response.body.should == 'a:in_abc'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "GET :in_a should render a/in_a" do
|
27
|
+
get :in_a
|
28
|
+
response.body.should == 'a:in_a'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "GET :in_ab should render a/in_ab" do
|
32
|
+
get :in_ab
|
33
|
+
response.body.should == 'a:in_ab'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "GET :render_non_existent_partial should raise ActionView::TemplateError" do
|
37
|
+
lambda { get :render_non_existent_partial }.should raise_error(ActionView::TemplateError)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "GET :render_non_existent_template should raise ActionView::MissingTemplate" do
|
41
|
+
lambda { get :render_non_existent_template }.should raise_error(ActionView::MissingTemplate)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
|
2
|
+
|
3
|
+
describe BController, " < TestController; inherit_views 'a'" do
|
4
|
+
describe "(the class)" do
|
5
|
+
it { BController.should be_inherit_views }
|
6
|
+
|
7
|
+
it "should have inherit view paths == ['b', 'a']" do
|
8
|
+
BController.inherit_view_paths.should == ['b', 'a']
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "(an instance)" do
|
13
|
+
integrate_views
|
14
|
+
|
15
|
+
it { @controller.should be_inherit_views }
|
16
|
+
|
17
|
+
it "should have inherit view paths == ['b', 'a']" do
|
18
|
+
@controller.inherit_view_paths.should == ['b', 'a']
|
19
|
+
end
|
20
|
+
|
21
|
+
it "GET :in_first should render a/in_a" do
|
22
|
+
get :in_a
|
23
|
+
response.body.should == 'a:in_a'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "GET :in_ab should render b/in_ab" do
|
27
|
+
get :in_ab
|
28
|
+
response.body.should == 'b:in_ab'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "GET :in_b should render b/in_b" do
|
32
|
+
get :in_b
|
33
|
+
response.body.should == 'b:in_b'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "GET :in_abc should render b/in_abc" do
|
37
|
+
get :in_abc
|
38
|
+
response.body.should == 'b:in_abc'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "GET :partial_in_bc should render b/partial_in_bc & b/_partial_in_bc" do
|
42
|
+
get :partial_in_bc
|
43
|
+
response.body.should == "b:partial_in_bc => b:_partial_in_bc"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "GET :partial_in_b should render b/partial_in_b & b/_partial_in_b" do
|
47
|
+
get :partial_in_b
|
48
|
+
response.body.should == "b:partial_in_b => b:_partial_in_b"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "GET :collection_in_bc should render b/collection_in_bc then b/_partial_in_bc" do
|
52
|
+
get :collection_in_bc
|
53
|
+
response.body.should == 'b:collection_in_bc => b:_partial_in_bc'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "GET :render_parent should render a/render_parent inside b/render_parent" do
|
57
|
+
get :render_parent
|
58
|
+
response.body.should == "b:render_parent(a:render_parent)"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "GET :partial_render_parent should render a/_partial_render_parent inside b/_partial_render_parent" do
|
62
|
+
get :partial_render_parent
|
63
|
+
response.body.should == "b:partial_render_parent => b:_partial_render_parent(a:_parent_render_parent)"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "GET :bad_render_parent should rasie TemplateError" do
|
67
|
+
lambda { get :bad_render_parent }.should raise_error(ActionView::TemplateError)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
|
2
|
+
|
3
|
+
describe CController, " < BController" do
|
4
|
+
describe "(the class)" do
|
5
|
+
it { CController.should be_inherit_views }
|
6
|
+
|
7
|
+
it "should have inherit view paths == ['c', 'b', 'a']" do
|
8
|
+
CController.inherit_view_paths.should == ['c', 'b', 'a']
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "(an instance)" do
|
13
|
+
integrate_views
|
14
|
+
|
15
|
+
it { @controller.should be_inherit_views }
|
16
|
+
|
17
|
+
it "should have inherit view paths == ['c', 'b', 'a']" do
|
18
|
+
@controller.inherit_view_paths.should == ['c', 'b', 'a']
|
19
|
+
end
|
20
|
+
|
21
|
+
it "GET :in_a should render a/in_a" do
|
22
|
+
get :in_a
|
23
|
+
response.body.should == 'a:in_a'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "GET :in_ab should render b/in_ab" do
|
27
|
+
get :in_ab
|
28
|
+
response.body.should == 'b:in_ab'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "GET :in_b should render b/in_b" do
|
32
|
+
get :in_b
|
33
|
+
response.body.should == 'b:in_b'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "GET :in_abc should render c/in_abc" do
|
37
|
+
get :in_abc
|
38
|
+
response.body.should == 'c:in_abc'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "GET :in_c should render c/in_c" do
|
42
|
+
get :in_c
|
43
|
+
response.body.should == 'c:in_c'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "GET :partial_in_bc should render b/partial_in_bc then c/_partial_in_bc" do
|
47
|
+
get :partial_in_bc
|
48
|
+
response.body.should == "b:partial_in_bc => c:_partial_in_bc"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "GET :partial_in_b should render b/partial_in_b & b/_partial_in_b" do
|
52
|
+
get :partial_in_b
|
53
|
+
response.body.should == "b:partial_in_b => b:_partial_in_b"
|
54
|
+
end
|
55
|
+
|
56
|
+
it "GET :collection_in_bc should render b/collection_in_bc then c/_partial_in_bc" do
|
57
|
+
get :collection_in_bc
|
58
|
+
response.body.should == 'b:collection_in_bc => c:_partial_in_bc'
|
59
|
+
end
|
60
|
+
|
61
|
+
it "GET :render_parent should render a/render_parent inside b/render_parent inside c/render_parent" do
|
62
|
+
get :render_parent
|
63
|
+
response.body.should == "c:render_parent(b:render_parent(a:render_parent))"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "GET :partial_render_parent should render b:partial_render_parent with a,b, and c partials " do
|
67
|
+
get :partial_render_parent
|
68
|
+
response.body.should == "b:partial_render_parent => c:_partial_render_parent(b:_partial_render_parent(a:_parent_render_parent))"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
|
2
|
+
|
3
|
+
describe DController, " < AController; inherit_views 'other'" do
|
4
|
+
describe "(the class)" do
|
5
|
+
it { DController.should be_inherit_views }
|
6
|
+
|
7
|
+
it "should have inherit view paths == ['d', 'other', 'a']" do
|
8
|
+
DController.inherit_view_paths.should == ['d', 'other', 'a']
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "(an instance)" do
|
13
|
+
integrate_views
|
14
|
+
|
15
|
+
it { @controller.should be_inherit_views }
|
16
|
+
|
17
|
+
it "should have inherit view paths == ['d', 'other', 'a']" do
|
18
|
+
@controller.class.inherit_view_paths.should == ['d', 'other', 'a']
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
|
2
|
+
|
3
|
+
describe NormalController do
|
4
|
+
integrate_views
|
5
|
+
|
6
|
+
it "GET :partial_from_c should render normal/partial_from_c, then c/_partial_in_bc" do
|
7
|
+
get :partial_from_c
|
8
|
+
response.body.should == 'normal:partial_from_c => c:_partial_in_bc'
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
|
2
|
+
|
3
|
+
describe 'Mailer specs' do
|
4
|
+
before :all do
|
5
|
+
ActionMailer::Base.delivery_method = :test
|
6
|
+
ActionMailer::Base.perform_deliveries = true
|
7
|
+
end
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
ActionMailer::Base.deliveries.clear
|
11
|
+
end
|
12
|
+
|
13
|
+
describe NormalMailer do
|
14
|
+
before :each do
|
15
|
+
NormalMailer.deliver_email
|
16
|
+
@deliveries = ActionMailer::Base.deliveries
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should deliver email" do
|
20
|
+
@deliveries.size.should == 1
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should render email with partial" do
|
24
|
+
@deliveries.first.body.should == "normal_mailer:email\nnormal_mailer:_partial"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe InheritingMailer do
|
29
|
+
before :each do
|
30
|
+
InheritingMailer.deliver_email
|
31
|
+
@deliveries = ActionMailer::Base.deliveries
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should deliver email" do
|
35
|
+
@deliveries.size.should == 1
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should render email with inherited partial" do
|
39
|
+
@deliveries.first.body.should == "inheriting_mailer:email\nnormal_mailer:_partial"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# This file is copied to ~/spec when you run 'ruby script/generate rspec'
|
2
|
+
# from the project root directory.
|
3
|
+
ENV["RAILS_ENV"] ||= "test"
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "../../../../config/environment"))
|
5
|
+
require 'spec/rails'
|
6
|
+
|
7
|
+
Spec::Runner.configure do |config|
|
8
|
+
end
|
9
|
+
|
10
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'app'))
|
@@ -0,0 +1 @@
|
|
1
|
+
a:_parent_render_parent
|
@@ -0,0 +1 @@
|
|
1
|
+
a:in_a
|
@@ -0,0 +1 @@
|
|
1
|
+
a:in_ab
|
@@ -0,0 +1 @@
|
|
1
|
+
a:in_abc
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :partial => 'non_existent' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
a:render_parent
|
@@ -0,0 +1 @@
|
|
1
|
+
b:_partial_in_b
|
@@ -0,0 +1 @@
|
|
1
|
+
b:_partial_in_bc
|
@@ -0,0 +1 @@
|
|
1
|
+
b:_partial_render_parent(<%= render :parent %>)
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :parent %>
|
@@ -0,0 +1 @@
|
|
1
|
+
b:collection_in_bc => <%= render :partial => 'partial_in_bc', :collection => [1] %>
|
@@ -0,0 +1 @@
|
|
1
|
+
b:in_ab
|
@@ -0,0 +1 @@
|
|
1
|
+
b:in_abc
|
@@ -0,0 +1 @@
|
|
1
|
+
b:in_b
|
@@ -0,0 +1 @@
|
|
1
|
+
b:partial_in_b => <%= render :partial => 'partial_in_b' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
b:partial_in_bc => <%= render :partial => 'partial_in_bc' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
b:partial_render_parent => <%= render :partial => 'partial_render_parent' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
b:render_parent(<%= render :parent %>)
|
@@ -0,0 +1 @@
|
|
1
|
+
c:_partial_in_bc
|
@@ -0,0 +1 @@
|
|
1
|
+
c:_partial_render_parent(<%= render :parent %>)
|
@@ -0,0 +1 @@
|
|
1
|
+
c:in_abc
|
@@ -0,0 +1 @@
|
|
1
|
+
c:in_c
|
@@ -0,0 +1 @@
|
|
1
|
+
c:render_parent(<%= render :parent %>)
|
@@ -0,0 +1 @@
|
|
1
|
+
normal:partial_from_c => <%= render :partial => 'c/partial_in_bc' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
normal_mailer:_partial
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: topherfangio-inherit_views
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ian W. White
|
8
|
+
- thedarkone
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2009-06-18 00:00:00 -07:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description: Allow rails views to inherit from each other.
|
18
|
+
email: ian.w.white@gmail.com
|
19
|
+
executables: []
|
20
|
+
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files: []
|
24
|
+
|
25
|
+
files:
|
26
|
+
- garlic.rb
|
27
|
+
- History.txt
|
28
|
+
- inherit_views.gemspec
|
29
|
+
- init.rb
|
30
|
+
- License.txt
|
31
|
+
- Rakefile
|
32
|
+
- README.rdoc
|
33
|
+
- Todo.txt
|
34
|
+
- lib/inherit_views.rb
|
35
|
+
- spec/controllers/a_controller_spec.rb
|
36
|
+
- spec/controllers/c_controller_spec.rb
|
37
|
+
- spec/controllers/b_controller_spec.rb
|
38
|
+
- spec/controllers/normal_controller_spec.rb
|
39
|
+
- spec/controllers/d_controller_spec.rb
|
40
|
+
- spec/spec_helper.rb
|
41
|
+
- spec/app.rb
|
42
|
+
- spec/mailers/mailer_spec.rb
|
43
|
+
- spec/views_for_specs/b/partial_in_b.html.erb
|
44
|
+
- spec/views_for_specs/b/bad_render_parent.html.erb
|
45
|
+
- spec/views_for_specs/b/partial_in_bc.html.erb
|
46
|
+
- spec/views_for_specs/b/in_abc.html.erb
|
47
|
+
- spec/views_for_specs/b/partial_render_parent.html.erb
|
48
|
+
- spec/views_for_specs/b/_partial_in_b.html.erb
|
49
|
+
- spec/views_for_specs/b/_partial_in_bc.html.erb
|
50
|
+
- spec/views_for_specs/b/collection_in_bc.html.erb
|
51
|
+
- spec/views_for_specs/b/in_b.html.erb
|
52
|
+
- spec/views_for_specs/b/in_ab.html.erb
|
53
|
+
- spec/views_for_specs/b/_partial_render_parent.html.erb
|
54
|
+
- spec/views_for_specs/b/render_parent.html.erb
|
55
|
+
- spec/views_for_specs/normal_mailer/email.erb
|
56
|
+
- spec/views_for_specs/normal_mailer/_partial.erb
|
57
|
+
- spec/views_for_specs/a/render_non_existent_partial.html.erb
|
58
|
+
- spec/views_for_specs/a/in_a.html.erb
|
59
|
+
- spec/views_for_specs/a/in_abc.html.erb
|
60
|
+
- spec/views_for_specs/a/in_ab.html.erb
|
61
|
+
- spec/views_for_specs/a/_partial_render_parent.html.erb
|
62
|
+
- spec/views_for_specs/a/render_parent.html.erb
|
63
|
+
- spec/views_for_specs/normal/partial_from_c.html.erb
|
64
|
+
- spec/views_for_specs/c/in_abc.html.erb
|
65
|
+
- spec/views_for_specs/c/_partial_in_bc.html.erb
|
66
|
+
- spec/views_for_specs/c/_partial_render_parent.html.erb
|
67
|
+
- spec/views_for_specs/c/in_c.html.erb
|
68
|
+
- spec/views_for_specs/c/render_parent.html.erb
|
69
|
+
- spec/views_for_specs/inheriting_mailer/email.erb
|
70
|
+
has_rdoc: true
|
71
|
+
homepage: http://github.com/topherfangio/inherit_views/tree/master
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: "0"
|
82
|
+
version:
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: "0"
|
88
|
+
version:
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.2.0
|
93
|
+
signing_key:
|
94
|
+
specification_version: 2
|
95
|
+
summary: Allow rails views to inherit from each other.
|
96
|
+
test_files: []
|
97
|
+
|