effigy 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +33 -40
- data/TODO.textile +0 -2
- data/VERSION +1 -1
- data/lib/effigy/rails.rb +57 -0
- data/lib/effigy/rails/template_handler.rb +63 -2
- data/lib/effigy/rails/view.rb +39 -2
- data/spec/effigy/rails/template_handler_spec.rb +93 -36
- data/spec/rails/generators/effigy_view_spec.rb +82 -23
- metadata +2 -2
data/Rakefile
CHANGED
@@ -2,35 +2,25 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'rake/gempackagetask'
|
4
4
|
|
5
|
-
require 'spec/rake/spectask'
|
6
|
-
|
7
5
|
desc 'Default: run the specs and metrics.'
|
8
6
|
task :default => [:spec, :metrics]
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
t.libs = %w(spec)
|
13
|
-
t.ruby_opts = ['-rrubygems']
|
14
|
-
end
|
8
|
+
begin
|
9
|
+
require 'spec/rake/spectask'
|
15
10
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
command = "rails #{rails_root}"
|
21
|
-
output = `#{command} 2>&1`
|
22
|
-
if $? == 0
|
23
|
-
FileUtils.ln_s(FileUtils.pwd, File.join(rails_root, 'vendor', 'plugins'))
|
24
|
-
else
|
25
|
-
$stderr.puts "Command failed with status #{$?}:"
|
26
|
-
$stderr.puts command
|
27
|
-
$stderr.puts output
|
28
|
-
end
|
11
|
+
Spec::Rake::SpecTask.new do |t|
|
12
|
+
t.spec_opts = ['--color', '--format', 'progress']
|
13
|
+
t.libs = %w(spec)
|
14
|
+
t.ruby_opts = ['-rrubygems']
|
29
15
|
end
|
30
|
-
end
|
31
|
-
|
32
16
|
|
33
|
-
task :spec => :rails_root
|
17
|
+
task :spec => :rails_root
|
18
|
+
rescue LoadError => exception
|
19
|
+
puts "Missing dependencies for specs"
|
20
|
+
task :spec do
|
21
|
+
raise exception
|
22
|
+
end
|
23
|
+
end
|
34
24
|
|
35
25
|
desc "Remove build files"
|
36
26
|
task :clean do
|
@@ -60,34 +50,37 @@ begin
|
|
60
50
|
end
|
61
51
|
Jeweler::GemcutterTasks.new
|
62
52
|
rescue LoadError
|
63
|
-
puts "
|
53
|
+
puts "Missing dependencies for jeweler"
|
64
54
|
end
|
65
55
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
56
|
+
namespace :metrics do
|
57
|
+
desc "Run reek"
|
58
|
+
begin
|
59
|
+
require 'reek/adapters/rake_task'
|
60
|
+
task :reek do
|
61
|
+
files = FileList['lib/**/*.rb', 'rails/**/*.rb'].to_a.join(' ')
|
62
|
+
system("reek -q #{files}")
|
63
|
+
end
|
64
|
+
rescue LoadError => exception
|
65
|
+
puts "Missing dependencies for metrics."
|
66
|
+
task :reek do
|
67
|
+
puts exception.inspect
|
74
68
|
end
|
75
69
|
end
|
76
|
-
|
77
|
-
desc "Run all metrics"
|
78
|
-
task :metrics => ['metrics:reek']
|
79
|
-
rescue LoadError => e
|
80
|
-
puts e.inspect
|
81
|
-
puts "Missing dependencies for metrics."
|
82
70
|
end
|
83
71
|
|
72
|
+
desc "Run all metrics"
|
73
|
+
task :metrics => ['metrics:reek']
|
74
|
+
|
84
75
|
begin
|
85
76
|
require 'yard'
|
86
77
|
|
87
78
|
YARD::Rake::YardocTask.new do |t|
|
88
79
|
t.files = ['lib/**/*.rb', 'rails/**/*.rb']
|
89
80
|
end
|
90
|
-
rescue LoadError =>
|
91
|
-
puts e.inspect
|
81
|
+
rescue LoadError => exception
|
92
82
|
puts "Missing dependencies for yard."
|
83
|
+
task :yard do
|
84
|
+
raise exception
|
85
|
+
end
|
93
86
|
end
|
data/TODO.textile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/effigy/rails.rb
CHANGED
@@ -3,4 +3,61 @@ require 'effigy/view'
|
|
3
3
|
require 'effigy/rails/view'
|
4
4
|
require 'effigy/rails/template_handler'
|
5
5
|
|
6
|
+
module Effigy
|
7
|
+
# Rails-specific functionality.
|
8
|
+
#
|
9
|
+
# Effigy includes Rails generators for generating effigy view and template
|
10
|
+
# files within Rails projects, as well as a Rails-specific view superclass
|
11
|
+
# that provides functionality like assigns, layouts, and partials.
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
#
|
15
|
+
# <pre>
|
16
|
+
# # app/controllers/magic_controller.rb
|
17
|
+
# class MagicController < ApplicationController
|
18
|
+
# def index
|
19
|
+
# @spell = 'hocus pocus'
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# </pre>
|
23
|
+
#
|
24
|
+
# <pre>
|
25
|
+
# # app/views/magic/index.html.effigy
|
26
|
+
# class MagicIndexView < Effigy::Rails::View
|
27
|
+
# def transform
|
28
|
+
# text('h1', @spell)
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
# </pre>
|
32
|
+
#
|
33
|
+
# <pre>
|
34
|
+
# # app/templates/magic/index.html
|
35
|
+
# <h1>Spell name goes here</h1>
|
36
|
+
# </pre>
|
37
|
+
#
|
38
|
+
# View this example in your browser and you'll see "hocus pocus."
|
39
|
+
#
|
40
|
+
# == Generators
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
# ./script/generate effigy_view users new edit index
|
44
|
+
#
|
45
|
+
# This will generate Effigy views and templates for the "new," "edit," and
|
46
|
+
# "index," actions of UsersController, such as
|
47
|
+
# app/views/users/new.html.effigy, and app/templates/users/new.html.
|
48
|
+
#
|
49
|
+
# == Rendering Effigy views from Rails
|
50
|
+
#
|
51
|
+
# Effigy includes a Rails template handler, so you can render effigy views as normal.
|
52
|
+
# Rendering the "index" action from "UsersController" will look for a
|
53
|
+
# UsersIndexView class in app/views/users/index.html.effigy, and use it to
|
54
|
+
# transform app/templates/users/index.html.
|
55
|
+
#
|
56
|
+
# == Effigy Rails views
|
57
|
+
#
|
58
|
+
# See {Effigy::Rails::View} for extra methods available to Rails views.
|
59
|
+
module Rails
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
6
63
|
ActionView::Template.register_template_handler :effigy, Effigy::Rails::TemplateHandler
|
@@ -1,8 +1,24 @@
|
|
1
1
|
module Effigy
|
2
2
|
module Rails
|
3
|
+
# Adds hooks to Rails to discover Effigy views and templates.
|
4
|
+
#
|
5
|
+
# View files should be added to the app/views/<controller> directory with
|
6
|
+
# an .effigy suffix. Template files should be added to
|
7
|
+
# app/templates/<controller> with no suffix.
|
8
|
+
#
|
9
|
+
# For example, the view and template for PostsController#new would be
|
10
|
+
# app/views/posts/new.html.effigy and app/templates/posts/new.html,
|
11
|
+
# respectively.
|
12
|
+
#
|
13
|
+
# You can use the packaged generators to create these files.
|
14
|
+
#
|
15
|
+
# See {Effigy::Rails} for more information about generators.
|
3
16
|
class TemplateHandler < ActionView::TemplateHandler
|
4
17
|
include ActionView::TemplateHandlers::Compilable
|
5
18
|
|
19
|
+
# Compiles the given view. Calls by ActionView when loading the view.
|
20
|
+
# @return [String] Ruby code that can be evaluated to get the rendered
|
21
|
+
# contents of this view
|
6
22
|
def compile(view)
|
7
23
|
@view = view
|
8
24
|
load_view_class
|
@@ -13,28 +29,73 @@ module Effigy
|
|
13
29
|
assigns = variables.inject({}) do |hash, name|
|
14
30
|
hash.update(name => @controller.instance_variable_get(name))
|
15
31
|
end
|
32
|
+
local_assigns.each do |name, value|
|
33
|
+
assigns.update("@\#{name}" => value)
|
34
|
+
end
|
16
35
|
end
|
17
|
-
view = #{view_class_name}.new(assigns) { |*names| yield(*names) }
|
36
|
+
view = #{view_class_name}.new(self, assigns) { |*names| yield(*names) }
|
18
37
|
view.render(#{template_source.inspect})
|
19
38
|
RUBY
|
20
39
|
end
|
21
40
|
|
41
|
+
# @return [String] the name of the view, such as "index"
|
22
42
|
def view_name
|
23
43
|
@view.name
|
24
44
|
end
|
25
45
|
|
46
|
+
# @return [String] the path from the view root to the view file. For
|
47
|
+
# example, "RAILS_ROOT/app/views/users/index.html.effigy" would be
|
48
|
+
# "users."
|
26
49
|
def base_path
|
27
50
|
@view.base_path
|
28
51
|
end
|
29
52
|
|
53
|
+
# Loads the view class from the discovered view file. View classes should
|
54
|
+
# be named after the controller and action, such as UsersIndexView.
|
55
|
+
#
|
56
|
+
# See {#view_class_name} for more information about class names.
|
30
57
|
def load_view_class
|
31
58
|
load(@view.filename)
|
32
59
|
end
|
33
60
|
|
61
|
+
# Generates a class name for this view. Normal views are prefixed with
|
62
|
+
# the controller namd and suffixed with "View," such as "PostsEditView"
|
63
|
+
# for app/views/posts/edit.html.effigy. Partials are prefixed with the
|
64
|
+
# controller and suffixed with "Partial," such as "PostsPostPartial" for
|
65
|
+
# app/views/posts/_post.html.effigy. Layouts are suffixed with "Layout,"
|
66
|
+
# such as "ApplicationLayout" for
|
67
|
+
# app/views/layouts/application.html.effigy.
|
34
68
|
def view_class_name
|
35
|
-
|
69
|
+
view_class_components.join('_').camelize.sub(/^Layouts/, '')
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [Array] the components that make up the class name for this view
|
73
|
+
def view_class_components
|
74
|
+
[base_path, view_name.sub(/^_/, ''), view_class_suffix]
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [String] the suffix for this view based on the type of view
|
78
|
+
def view_class_suffix
|
79
|
+
if layout?
|
80
|
+
'layout'
|
81
|
+
elsif partial?
|
82
|
+
'partial'
|
83
|
+
else
|
84
|
+
'view'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# @return [Boolean] true-ish if this view is a layout, false-ish otherwise
|
89
|
+
def layout?
|
90
|
+
base_path =~ /^layouts/
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [Boolean] true-ish if this view is a partial, false-ish otherwise
|
94
|
+
def partial?
|
95
|
+
@view.name =~ /^_/
|
36
96
|
end
|
37
97
|
|
98
|
+
# @return [String] the contents of the template file for this view
|
38
99
|
def template_source
|
39
100
|
template_path = @view.load_path.path.sub(/\/views$/, '/templates')
|
40
101
|
template_file_name = File.join(template_path, base_path, "#{view_name}.#{@view.format}")
|
data/lib/effigy/rails/view.rb
CHANGED
@@ -1,15 +1,52 @@
|
|
1
1
|
module Effigy
|
2
2
|
module Rails
|
3
|
+
# Provides Rails-specific methods to Effigy views. Rather than
|
4
|
+
# instantiating this class directly, it is recommended that you create view
|
5
|
+
# and template files and allow {Effigy::Rails::TemplateHandler} to discover
|
6
|
+
# and compile views.
|
7
|
+
#
|
8
|
+
# Instance variables from controller actions will be copied to the view.
|
3
9
|
class View < ::Effigy::View
|
4
|
-
|
10
|
+
|
11
|
+
# [ActionView::Base] the instance that is rendering this view. This
|
12
|
+
# instance is used to render partials and access other information about
|
13
|
+
# the action being rendered.
|
14
|
+
attr_reader :action_view
|
15
|
+
|
16
|
+
# The passed block will be called to access content captured by
|
17
|
+
# content_for, such as layout contents.
|
18
|
+
#
|
19
|
+
# @param [ActionView::Base] action_view the instance that is rendering
|
20
|
+
# this view. See the action_view attribute.
|
21
|
+
# @param [Hash] assigns a hash of instance variables to be copied. Names
|
22
|
+
# should include the "@" prefix.
|
23
|
+
def initialize(action_view, assigns, &layout_block)
|
24
|
+
|
25
|
+
@action_view = action_view
|
5
26
|
assigns.each do |name, value|
|
6
27
|
instance_variable_set(name, value)
|
7
28
|
end
|
8
29
|
@layout_block = layout_block
|
9
30
|
end
|
10
31
|
|
11
|
-
|
32
|
+
# Renders the given partial and returns the generated markup.
|
33
|
+
#
|
34
|
+
# @param [String] name the name of the partial to render, as given to
|
35
|
+
# ActionView::Base#render
|
36
|
+
# @param [Hash] options
|
37
|
+
# @option options [Hash] :locals a hash of extra variables to be assigned
|
38
|
+
# on the partial view
|
39
|
+
# @return [String] the rendered contents from the partial
|
40
|
+
def partial(name, options = {})
|
41
|
+
options[:partial] = name
|
42
|
+
action_view.render(options)
|
43
|
+
end
|
12
44
|
|
45
|
+
# Returns the captured content of the given name. Use "layout" as a name
|
46
|
+
# to access the contents for the layout.
|
47
|
+
#
|
48
|
+
# @param [Symbol] capture the name of the captured content to return
|
49
|
+
# @return [String] the captured content of the given name
|
13
50
|
def content_for(capture)
|
14
51
|
@layout_block.call(capture)
|
15
52
|
end
|
@@ -8,10 +8,42 @@ require 'nokogiri'
|
|
8
8
|
describe "a controller with an effigy view and template" do
|
9
9
|
before do
|
10
10
|
@files = []
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
@files.each do |file|
|
15
|
+
FileUtils.rm(file)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_rails_file(relative_path, contents)
|
20
|
+
absolute_path = File.join(RAILS_ROOT, relative_path)
|
21
|
+
FileUtils.mkdir_p(File.dirname(absolute_path))
|
22
|
+
File.open(absolute_path, 'w') { |file| file.write(contents) }
|
23
|
+
@files << absolute_path
|
24
|
+
absolute_path
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_rails_source_file(relative_path, contents)
|
28
|
+
load create_rails_file(relative_path, contents)
|
29
|
+
end
|
30
|
+
|
31
|
+
def render(controller, action = :index)
|
32
|
+
@controller = controller
|
33
|
+
class << @controller
|
34
|
+
include ActionController::TestCase::RaiseActionExceptions
|
35
|
+
end
|
36
|
+
@request ||= ActionController::TestRequest.new
|
37
|
+
@response ||= ActionController::TestResponse.new
|
38
|
+
get :index
|
39
|
+
@response
|
40
|
+
end
|
41
|
+
|
42
|
+
include ActionController::TestProcess
|
43
|
+
|
44
|
+
it "should use the view to render the template" do
|
11
45
|
create_rails_source_file 'app/controllers/magic_controller.rb', <<-RUBY
|
12
46
|
class MagicController < ApplicationController
|
13
|
-
layout 'application'
|
14
|
-
include ActionController::TestCase::RaiseActionExceptions
|
15
47
|
def index
|
16
48
|
@spell = 'hocus pocus'
|
17
49
|
render
|
@@ -31,8 +63,32 @@ describe "a controller with an effigy view and template" do
|
|
31
63
|
<h1 class="success">placeholder title</h1>
|
32
64
|
HTML
|
33
65
|
|
66
|
+
response = render(MagicController.new)
|
67
|
+
|
68
|
+
response.should be_success
|
69
|
+
response.rendered[:template].to_s.should == 'magic/index.html.effigy'
|
70
|
+
assigns(:spell).should_not be_nil
|
71
|
+
response.body.should have_selector('h1.success', :contents => assigns(:spell))
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should render an effigy layout" do
|
75
|
+
create_rails_source_file 'app/controllers/magic_controller.rb', <<-RUBY
|
76
|
+
class MagicController < ApplicationController
|
77
|
+
layout 'application'
|
78
|
+
end
|
79
|
+
RUBY
|
80
|
+
|
81
|
+
create_rails_file 'app/views/magic/index.html.effigy', <<-RUBY
|
82
|
+
class MagicIndexView < Effigy::Rails::View
|
83
|
+
end
|
84
|
+
RUBY
|
85
|
+
|
86
|
+
create_rails_file 'app/templates/magic/index.html', <<-HTML
|
87
|
+
<h1 class="success">title</h1>
|
88
|
+
HTML
|
89
|
+
|
34
90
|
create_rails_file 'app/views/layouts/application.html.effigy', <<-RUBY
|
35
|
-
class
|
91
|
+
class ApplicationLayout < Effigy::Rails::View
|
36
92
|
def transform
|
37
93
|
html('body', content_for(:layout))
|
38
94
|
end
|
@@ -43,47 +99,48 @@ describe "a controller with an effigy view and template" do
|
|
43
99
|
<html><body></body></html>
|
44
100
|
HTML
|
45
101
|
|
46
|
-
|
47
|
-
@request = ActionController::TestRequest.new
|
48
|
-
@response = ActionController::TestResponse.new
|
49
|
-
end
|
102
|
+
response = render(MagicController.new)
|
50
103
|
|
51
|
-
|
52
|
-
|
53
|
-
FileUtils.rm(file)
|
54
|
-
end
|
104
|
+
response.should be_success
|
105
|
+
response.body.should have_selector('html body h1.success')
|
55
106
|
end
|
56
107
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
absolute_path
|
63
|
-
end
|
108
|
+
it "should render an effigy partial" do
|
109
|
+
create_rails_source_file 'app/controllers/magic_controller.rb', <<-RUBY
|
110
|
+
class WandController < ApplicationController
|
111
|
+
end
|
112
|
+
RUBY
|
64
113
|
|
65
|
-
|
66
|
-
|
67
|
-
|
114
|
+
create_rails_file 'app/views/wand/index.html.effigy', <<-RUBY
|
115
|
+
class WandIndexView < Effigy::Rails::View
|
116
|
+
def transform
|
117
|
+
replace_with('p', partial('spell', :locals => { :name => 'hocus pocus' }))
|
118
|
+
end
|
119
|
+
end
|
120
|
+
RUBY
|
68
121
|
|
69
|
-
|
70
|
-
|
71
|
-
|
122
|
+
create_rails_file 'app/templates/wand/index.html', <<-HTML
|
123
|
+
<html><body>
|
124
|
+
<h1 class="success">spell</h1>
|
125
|
+
<p>placeholder</p>
|
126
|
+
</body></html>
|
127
|
+
HTML
|
72
128
|
|
73
|
-
|
129
|
+
create_rails_file 'app/views/wand/_spell.html.effigy', <<-RUBY
|
130
|
+
class WandSpellPartial < Effigy::Rails::View
|
131
|
+
def transform
|
132
|
+
text('p', @name)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
RUBY
|
74
136
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
@response.rendered[:template].to_s.should == 'magic/index.html.effigy'
|
79
|
-
assigns(:spell).should_not be_nil
|
80
|
-
@response.body.should have_selector('h1.success', :contents => assigns(:spell))
|
81
|
-
end
|
137
|
+
create_rails_file 'app/templates/wand/_spell.html', <<-HTML
|
138
|
+
<p>put a spell on me</p>
|
139
|
+
HTML
|
82
140
|
|
83
|
-
|
84
|
-
render
|
141
|
+
response = render(WandController.new)
|
85
142
|
|
86
|
-
|
87
|
-
|
143
|
+
response.should be_success
|
144
|
+
response.body.should have_selector('html body p', :contents => 'hocus pocus')
|
88
145
|
end
|
89
146
|
end
|
@@ -1,18 +1,44 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module TemplateMatchers
|
4
|
+
def contain(expected_text)
|
5
|
+
simple_matcher("contain the following lines:\n#{expected_text}") do |path, matcher|
|
6
|
+
if File.exist?(path)
|
7
|
+
actual_text = IO.read(path)
|
8
|
+
if actual_text.include?(expected_text)
|
9
|
+
true
|
10
|
+
else
|
11
|
+
matcher.failure_message =
|
12
|
+
"Expected to get the following text:\n#{expected_text}\nBut got:\n#{actual_text}"
|
13
|
+
false
|
14
|
+
end
|
15
|
+
else
|
16
|
+
matcher.failure_message = "File does not exist"
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def rails_command(command)
|
8
23
|
FileUtils.cd RAILS_ROOT do
|
9
|
-
|
10
|
-
output = `#{command}`
|
24
|
+
output = `#{command} 2>&1`
|
11
25
|
unless $? == 0
|
12
26
|
violated "Command failed: #{command}\n#{output}"
|
13
27
|
end
|
14
28
|
end
|
15
29
|
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "script/generate effigy_view users create" do
|
33
|
+
|
34
|
+
include TemplateMatchers
|
35
|
+
|
36
|
+
before do
|
37
|
+
@controller_name = 'users'
|
38
|
+
@view_name = 'create'
|
39
|
+
@view_class_name = 'UsersCreateView'
|
40
|
+
rails_command "script/generate effigy_view --backtrace #{@controller_name} #{@view_name} 2>&1"
|
41
|
+
end
|
16
42
|
|
17
43
|
after do
|
18
44
|
FileUtils.rm_f(view_path)
|
@@ -49,22 +75,55 @@ describe "script/generate effigy_view users create" do
|
|
49
75
|
File.join('app', 'templates', @controller_name, "#{@view_name}.html")
|
50
76
|
end
|
51
77
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "script/generate effigy_view layouts narrow" do
|
81
|
+
|
82
|
+
include TemplateMatchers
|
83
|
+
|
84
|
+
before do
|
85
|
+
@layout_name = 'narrow'
|
86
|
+
@layout_class_name = 'NarrowLayout'
|
87
|
+
rails_command "script/generate effigy_view --backtrace layouts #{@layout_name} 2>&1"
|
88
|
+
end
|
89
|
+
|
90
|
+
after do
|
91
|
+
FileUtils.rm_f(view_path)
|
92
|
+
FileUtils.rm_f(template_path)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should create a view file" do
|
96
|
+
view_path.should contain("class #{@layout_class_name} < Rails::Effigy::View")
|
97
|
+
view_path.should contain("private")
|
98
|
+
view_path.should contain("def transform")
|
99
|
+
view_path.should contain("html('body', content_for(:layout))")
|
100
|
+
view_path.should contain(relative_template_path)
|
101
|
+
view_path.should contain("end\nend")
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should create a template file" do
|
105
|
+
template_path.should contain("<html>")
|
106
|
+
template_path.should contain("<body>")
|
107
|
+
template_path.should contain("<p>Edit me at #{relative_template_path}</p>")
|
108
|
+
template_path.should contain("<p>Edit my view at #{relative_view_path}</p>")
|
109
|
+
template_path.should contain("</body>")
|
110
|
+
template_path.should contain("</html>")
|
111
|
+
end
|
112
|
+
|
113
|
+
def view_path
|
114
|
+
File.join(RAILS_ROOT, relative_view_path)
|
115
|
+
end
|
116
|
+
|
117
|
+
def relative_view_path
|
118
|
+
File.join('app', 'views', 'layouts', "#{@layout_name}.html.effigy")
|
119
|
+
end
|
120
|
+
|
121
|
+
def template_path
|
122
|
+
File.join(RAILS_ROOT, relative_template_path)
|
123
|
+
end
|
124
|
+
|
125
|
+
def relative_template_path
|
126
|
+
File.join('app', 'templates', 'layouts', "#{@layout_name}.html")
|
68
127
|
end
|
69
128
|
|
70
129
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effigy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Ferris
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-01 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|