topherfangio-inherit_views 1.0.1
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/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
|
+
|