sinatra_more 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -134,6 +134,10 @@ methods should be very familiar to anyone who has used rails view helpers.
134
134
  * Creates a link element with given name, url and options
135
135
  * <tt>link_to 'click me', '/dashboard', :class => 'linky'</tt>
136
136
  * <tt>link_to('/dashboard', :class => 'blocky') { ...content... }</tt>
137
+ * <tt>mail_to(email, caption=nil, mail_options={})</tt>
138
+ * Creates a mailto link tag to the specified email_address
139
+ * <tt>mail_to "me@demo.com"</tt> # => <a href="mailto:me@demo.com">me@demo.com</a>
140
+ * <tt>mail_to "me@demo.com", "My Email"</tt> # => <a href="mailto:me@demo.com">My Email</a>
137
141
  * <tt>image_tag(url, options={})</tt>
138
142
  * Creates an image element with given url and options
139
143
  * <tt>image_tag('icons/avatar.png')</tt>
@@ -190,6 +194,9 @@ methods should be very familiar to anyone who has used rails view helpers.
190
194
  * <tt>submit_tag(caption, options={})</tt>
191
195
  * Constructs a submit button from the given options
192
196
  * <tt>submit_tag "Create", :class => 'success'</tt>
197
+ * <tt>button_tag(caption, options={})</tt>
198
+ * Constructs an input (type => 'button') from the given options
199
+ * <tt>button_tag "Cancel", :class => 'clear'</tt>
193
200
  * <tt>image_submit_tag(source, options={})</tt>
194
201
  * Constructs an image submit button from the given options
195
202
  * <tt>image_submit_tag "submit.png", :class => 'success'</tt>
@@ -221,8 +228,13 @@ A form_tag might look like:
221
228
  * Defaults to StandardFormBuilder but you can easily create your own!
222
229
  * <tt>form_for(@user, '/register', :id => 'register') { |f| ...field-elements... }</tt>
223
230
  * <tt>form_for(:user, '/register', :id => 'register') { |f| ...field-elements... }</tt>
231
+ * <tt>fields_for(object, settings={}, &block)</tt>
232
+ * Constructs fields for a given object for use in an existing form
233
+ * Defaults to StandardFormBuilder but you can easily create your own!
234
+ * <tt>fields_for @user.assignment do |assignment| ... end</tt>
235
+ * <tt>fields_for :assignment do |assigment| ... end</tt>
224
236
 
225
- The following are fields provided by AbstractFormBuilder that can be used within a form_for:
237
+ The following are fields provided by AbstractFormBuilder that can be used within a form_for or fields_for:
226
238
 
227
239
  * <tt>error_messages(options={})</tt>
228
240
  * Displays list html for the errors on form object
@@ -269,9 +281,13 @@ A form_for using these basic fields might look like:
269
281
  %p
270
282
  = f.label :is_admin, :caption => "Admin User?"
271
283
  = f.check_box :is_admin
272
- $p
284
+ %p
273
285
  = f.label :color, :caption => "Favorite Color?"
274
286
  = f.select :color, :options => ['red', 'black']
287
+ %p
288
+ - fields_for @user.location do |location|
289
+ = location.text_field :street
290
+ = location.text_field :city
275
291
  %p
276
292
  = f.submit "Create", :class => 'button'
277
293
 
@@ -454,12 +470,6 @@ In addition, the strategy used expects that you have an <tt>authenticate</tt> me
454
470
 
455
471
  Using this plugin you also do need to define your own routes for managing warden sessions. An example is below:
456
472
 
457
- get '/unauthenticated/?' do
458
- flash[:notice] = "That username and password are not correct!"
459
- status 401
460
- haml_template 'session/login'
461
- end
462
-
463
473
  get '/login/?' do
464
474
  haml_template 'session/login'
465
475
  end
@@ -468,6 +478,12 @@ Using this plugin you also do need to define your own routes for managing warden
468
478
  authenticate_user!
469
479
  redirect "/dashboard"
470
480
  end
481
+
482
+ post '/unauthenticated/?' do
483
+ flash[:notice] = "That username and password are not correct!"
484
+ status 401
485
+ haml_template 'session/login'
486
+ end
471
487
 
472
488
  get '/logout/?' do
473
489
  logout_user!
data/TODO CHANGED
@@ -1,8 +1,7 @@
1
1
  = UNFINISHED
2
2
 
3
3
  * Add support for model, routes, migration generator types based on components
4
- * Add support for fields_for tag in formbuilder
5
- * Add support for button tag method, mail_to helper
4
+ * Add support for form.fields_for (one-to-one, nested and many associations like in rails)
6
5
  * Add support for check_box_group, radio_button_group which create a set of checkboxes or radio buttons
7
6
  * Become total warden solution (basically just require warden gem installed, do everything else)
8
7
  * Look into removing overlapping methods and simply leverage sinatra_warden
@@ -19,6 +18,8 @@
19
18
 
20
19
  = COMPLETED
21
20
 
21
+ * Add support for button tag method, mail_to helper
22
+ * Add support for simple fields_for tag helper
22
23
  * Add content_for / yield tags similar to rails
23
24
  * Created application generator using thor
24
25
  * Add support for a MailerPlugin which will make sending emails a breeze (http://github.com/hiroshi/pony)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.9
1
+ 0.3.10
@@ -28,6 +28,16 @@ module SinatraMore
28
28
  end
29
29
  end
30
30
 
31
+ # Creates a mail link element with given name and caption
32
+ # mail_to "me@demo.com" => <a href="mailto:me@demo.com">me@demo.com</a>
33
+ # mail_to "me@demo.com", "My Email" => <a href="mailto:me@demo.com">My Email</a>
34
+ def mail_to(email, caption=nil, mail_options={})
35
+ html_options = mail_options.slice!(:cc, :bcc, :subject, :body)
36
+ mail_query = Rack::Utils.build_query(mail_options).gsub(/\+/, '%20').gsub('%40', '@')
37
+ mail_href = "mailto:#{email}"; mail_href << "?#{mail_query}" if mail_query.present?
38
+ link_to (caption || email), mail_href, html_options
39
+ end
40
+
31
41
  # Creates an image element with given url and options
32
42
  # image_tag('icons/avatar.png')
33
43
  def image_tag(url, options={})
@@ -53,7 +53,7 @@ class AbstractFormBuilder
53
53
  # f.check_box :remember_me, :value => 'true', :uncheck_value => '0'
54
54
  def check_box(field, options={})
55
55
  unchecked_value = options.delete(:uncheck_value) || '0'
56
- options.reverse_merge!(:id => field_id(field))
56
+ options.reverse_merge!(:id => field_id(field), :value => '1')
57
57
  options.merge!(:checked => true) if values_matches_field?(field, options[:value])
58
58
  html = @template.check_box_tag field_name(field), options
59
59
  html << hidden_field(field, :value => unchecked_value, :id => nil)
@@ -98,7 +98,7 @@ class AbstractFormBuilder
98
98
  # Returns true if the value matches the value in the field
99
99
  # field_has_value?(:gender, 'male')
100
100
  def values_matches_field?(field, value)
101
- value.present? && field_value(field).to_s == value.to_s
101
+ value.present? && (field_value(field).to_s == value.to_s || field_value(field).to_s == 'true')
102
102
  end
103
103
 
104
104
  # Returns the value for the object's field
@@ -1,6 +1,7 @@
1
1
  module SinatraMore
2
2
  module FormHelpers
3
3
  # Constructs a form for object using given or default form_builder
4
+ # form_for :user, '/register' do |f| ... end
4
5
  # form_for @user, '/register', :id => 'register' do |f| ... end
5
6
  def form_for(object, url, settings={}, &block)
6
7
  builder_class = configured_form_builder_class(settings[:builder])
@@ -8,6 +9,16 @@ module SinatraMore
8
9
  form_tag(url, settings) { form_html }
9
10
  end
10
11
 
12
+ # Constructs form fields for an object using given or default form_builder
13
+ # Used within an existing form to allow alternate objects within one form
14
+ # fields_for @user.assignment do |assignment| ... end
15
+ # fields_for :assignment do |assigment| ... end
16
+ def fields_for(object, settings={}, &block)
17
+ builder_class = configured_form_builder_class(settings[:builder])
18
+ fields_html = capture_html(builder_class.new(self, object), &block)
19
+ concat_content fields_html
20
+ end
21
+
11
22
  # Constructs a form without object based on options
12
23
  # form_tag '/register' do ... end
13
24
  def form_tag(url, options={}, &block)
@@ -125,6 +136,13 @@ module SinatraMore
125
136
  input_tag(:submit, options)
126
137
  end
127
138
 
139
+ # Constructs a button input from the given options
140
+ # button_tag "Cancel", :class => 'clear'
141
+ def button_tag(caption, options = {})
142
+ options.reverse_merge!(:value => caption)
143
+ input_tag(:button, options)
144
+ end
145
+
128
146
  # Constructs a submit button from the given options
129
147
  # submit_tag "Create", :class => 'success'
130
148
  def image_submit_tag(source, options={})
@@ -1,43 +1,9 @@
1
1
  # This is for adding specific methods that are required by sinatra_more if activesupport isn't required
2
2
 
3
- unless String.method_defined?(:titleize)
3
+ unless String.method_defined?(:titleize) && Hash.method_defined?(:slice)
4
4
  require 'active_support/inflector'
5
5
  require 'active_support/core_ext/blank'
6
6
  require 'active_support/core_ext/class/attribute_accessors'
7
+ require 'active_support/core_ext/hash'
8
+ require 'active_support/core_ext/array'
7
9
  end
8
-
9
- unless Hash.method_defined?(:reverse_merge!)
10
- module HashExtensions
11
- def reverse_merge(other_hash)
12
- other_hash.merge(self)
13
- end
14
- def reverse_merge!(other_hash)
15
- replace(reverse_merge(other_hash))
16
- end
17
- end
18
- end
19
-
20
- unless Hash.method_defined?(:symbolize_keys!)
21
- module HashExtensions
22
- def symbolize_keys
23
- inject({}) do |options, (key, value)|
24
- options[(key.to_sym rescue key) || key] = value
25
- options
26
- end
27
- end
28
- def symbolize_keys!
29
- self.replace(self.symbolize_keys)
30
- end
31
- end
32
- end
33
-
34
- unless Array.method_defined?(:extract_options!)
35
- module ArrayExtensions
36
- def extract_options!
37
- last.is_a?(::Hash) ? pop : {}
38
- end
39
- end
40
- end
41
-
42
- Hash.send(:include, HashExtensions) if defined?(HashExtensions)
43
- Array.send(:include, ArrayExtensions) if defined?(ArrayExtensions)
data/sinatra_more.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sinatra_more}
8
- s.version = "0.3.9"
8
+ s.version = "0.3.10"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nathan Esquenazi"]
12
- s.date = %q{2009-11-10}
12
+ s.date = %q{2009-11-11}
13
13
  s.default_executable = %q{sinatra_gen}
14
14
  s.description = %q{Expands sinatra with standard helpers and tools to allow for complex applications}
15
15
  s.email = %q{nesquena@gmail.com}
@@ -98,12 +98,16 @@ Gem::Specification.new do |s|
98
98
  "test/fixtures/markup_app/views/content_for.haml",
99
99
  "test/fixtures/markup_app/views/content_tag.erb",
100
100
  "test/fixtures/markup_app/views/content_tag.haml",
101
+ "test/fixtures/markup_app/views/fields_for.erb",
102
+ "test/fixtures/markup_app/views/fields_for.haml",
101
103
  "test/fixtures/markup_app/views/form_for.erb",
102
104
  "test/fixtures/markup_app/views/form_for.haml",
103
105
  "test/fixtures/markup_app/views/form_tag.erb",
104
106
  "test/fixtures/markup_app/views/form_tag.haml",
105
107
  "test/fixtures/markup_app/views/link_to.erb",
106
108
  "test/fixtures/markup_app/views/link_to.haml",
109
+ "test/fixtures/markup_app/views/mail_to.erb",
110
+ "test/fixtures/markup_app/views/mail_to.haml",
107
111
  "test/fixtures/render_app/app.rb",
108
112
  "test/fixtures/render_app/views/erb/test.erb",
109
113
  "test/fixtures/render_app/views/haml/test.haml",
@@ -46,6 +46,12 @@ class MarkupUser
46
46
  def session_id; 45; end
47
47
  def gender; 'male'; end
48
48
  def remember_me; '1'; end
49
+ def permission; Permission.new; end
50
+ end
51
+
52
+ class Permission
53
+ def can_edit; true; end
54
+ def can_delete; false; end
49
55
  end
50
56
 
51
57
  class Errors < Array
@@ -0,0 +1,8 @@
1
+ <% @user = MarkupUser.new %>
2
+ <% form_for @user , '/demo1', :id => 'demo-fields-for' do |f| %>
3
+ <%= f.text_field :gender %>
4
+ <% fields_for @user.permission do |permission| %>
5
+ <%= permission.check_box :can_edit %>
6
+ <%= permission.check_box :can_delete %>
7
+ <% end %>
8
+ <% end %>
@@ -0,0 +1,6 @@
1
+ - @user = MarkupUser.new
2
+ - form_for @user , '/demo1', :id => 'demo-fields-for' do |f|
3
+ = f.text_field :gender
4
+ - fields_for @user.permission do |permission|
5
+ = permission.check_box :can_edit
6
+ = permission.check_box :can_delete
@@ -51,6 +51,7 @@
51
51
  <% end %>
52
52
  <% field_set_tag(:class => 'buttons') do %>
53
53
  <%= submit_tag "Login" %>
54
+ <%= button_tag "Cancel" %>
54
55
  <%= image_submit_tag "buttons/submit.png" %>
55
56
  <% end %>
56
57
  <% end %>
@@ -41,4 +41,5 @@
41
41
  = check_box_tag :remember_me, :value => "1", :checked => true
42
42
  - field_set_tag(:class => 'buttons') do
43
43
  = submit_tag "Login"
44
+ = button_tag "Cancel"
44
45
  = image_submit_tag "buttons/submit.png"
@@ -0,0 +1,3 @@
1
+ <p class='simple'><%= mail_to 'test@demo.com' %></p>
2
+
3
+ <p class='captioned'><%= mail_to 'test@demo.com', "Click my Email" %></p>
@@ -0,0 +1,3 @@
1
+ %p.simple= mail_to 'test@demo.com'
2
+
3
+ %p.captioned= mail_to 'test@demo.com', "Click my Email"
@@ -59,6 +59,11 @@ class WardenDemo < Sinatra::Base
59
59
  must_be_authorized!('/login')
60
60
  "<h1>Valid Authorized Page</h1>"
61
61
  end
62
+
63
+ post '/unauthenticated/?' do
64
+ status 401
65
+ '<h2>Unauthenticated</h2>'
66
+ end
62
67
 
63
68
  get '/current_user' do
64
69
  if current_user
@@ -46,6 +46,38 @@ class TestAssetTagHelpers < Test::Unit::TestCase
46
46
  end
47
47
  end
48
48
 
49
+ context 'for #mail_to method' do
50
+ should "display link element for mail to no caption" do
51
+ actual_html = mail_to('test@demo.com')
52
+ assert_has_tag(:a, :href => "mailto:test@demo.com", :content => 'test@demo.com') { actual_html }
53
+ end
54
+
55
+ should "display link element for mail to with caption" do
56
+ actual_html = mail_to('test@demo.com', "My Email", :class => 'demo')
57
+ assert_has_tag(:a, :href => "mailto:test@demo.com", :content => 'My Email', :class => 'demo') { actual_html }
58
+ end
59
+
60
+ should "display link element for mail to with caption and mail options" do
61
+ actual_html = mail_to('test@demo.com', "My Email", :subject => 'demo test', :class => 'demo', :cc => 'foo@test.com')
62
+ assert_has_tag(:a, :class => 'demo') { actual_html }
63
+ assert_match /mailto\:test\@demo.com\?/, actual_html
64
+ assert_match /cc=foo\@test\.com/, actual_html
65
+ assert_match /subject\=demo\%20test/, actual_html
66
+ end
67
+
68
+ should "display mail link element in haml" do
69
+ visit '/haml/mail_to'
70
+ assert_have_selector 'p.simple a', :href => 'mailto:test@demo.com', :content => 'test@demo.com'
71
+ assert_have_selector 'p.captioned a', :href => 'mailto:test@demo.com', :content => 'Click my Email'
72
+ end
73
+
74
+ should "display mail link element in erb" do
75
+ visit '/erb/mail_to'
76
+ assert_have_selector 'p.simple a', :href => 'mailto:test@demo.com', :content => 'test@demo.com'
77
+ assert_have_selector 'p.captioned a', :href => 'mailto:test@demo.com', :content => 'Click my Email'
78
+ end
79
+ end
80
+
49
81
  context 'for #image_tag method' do
50
82
  should "display image tag absolute link with no options" do
51
83
  assert_has_tag('img', :src => "/absolute/pic.gif") { image_tag('/absolute/pic.gif') }
@@ -34,7 +34,7 @@ class TestFormBuilder < Test::Unit::TestCase
34
34
  assert_has_tag('form input[type=hidden]', :name => '_method', :count => 0) { actual_html } # no method action field
35
35
  end
36
36
 
37
- should "display correct form html with method :post" do
37
+ should "display correct form html with method :put" do
38
38
  actual_html = form_for(@user, '/update', :method => 'put') { "Demo" }
39
39
  assert_has_tag('form', :action => '/update', :method => 'post') { actual_html }
40
40
  assert_has_tag('form input', :type => 'hidden', :name => "_method", :value => 'put') { actual_html }
@@ -61,7 +61,7 @@ class TestFormBuilder < Test::Unit::TestCase
61
61
  assert_has_tag('form p input[type=text]') { actual_html }
62
62
  end
63
63
 
64
- should "display fail for form with no object" do
64
+ should "display fail for form with nil object" do
65
65
  assert_raises(RuntimeError) { form_for(@not_real, '/register', :id => 'register', :method => 'post') { "Demo" } }
66
66
  end
67
67
 
@@ -80,6 +80,38 @@ class TestFormBuilder < Test::Unit::TestCase
80
80
  end
81
81
  end
82
82
 
83
+ context 'for #fields_for method' do
84
+ should 'display correct fields html' do
85
+ actual_html = fields_for(@user) { |f| f.text_field(:first_name) }
86
+ assert_has_tag(:input, :type => 'text', :name => 'user[first_name]', :id => 'user_first_name') { actual_html }
87
+ end
88
+
89
+ should 'display correct fields html with symbol object' do
90
+ actual_html = fields_for(:markup_user) { |f| f.text_field(:first_name) }
91
+ assert_has_tag(:input, :type => 'text', :name => 'markup_user[first_name]', :id => 'markup_user_first_name') { actual_html }
92
+ end
93
+
94
+ should "display fail for nil object" do
95
+ assert_raises(RuntimeError) { fields_for(@not_real) { |f| "Demo" } }
96
+ end
97
+
98
+ should 'display correct simple fields in haml' do
99
+ visit '/haml/fields_for'
100
+ assert_have_selector :form, :action => '/demo1', :id => 'demo-fields-for'
101
+ assert_have_selector '#demo-fields-for input', :type => 'text', :name => 'markup_user[gender]', :value => 'male'
102
+ assert_have_selector '#demo-fields-for input', :type => 'checkbox', :name => 'permission[can_edit]', :value => '1', :checked => 'checked'
103
+ assert_have_selector '#demo-fields-for input', :type => 'checkbox', :name => 'permission[can_delete]'
104
+ end
105
+
106
+ should "display correct simple fields in erb" do
107
+ visit '/erb/fields_for'
108
+ assert_have_selector :form, :action => '/demo1', :id => 'demo-fields-for'
109
+ assert_have_selector '#demo-fields-for input', :type => 'text', :name => 'markup_user[gender]', :value => 'male'
110
+ assert_have_selector '#demo-fields-for input', :type => 'checkbox', :name => 'permission[can_edit]', :value => '1', :checked => 'checked'
111
+ assert_have_selector '#demo-fields-for input', :type => 'checkbox', :name => 'permission[can_delete]'
112
+ end
113
+ end
114
+
83
115
  # ===========================
84
116
  # AbstractFormBuilder
85
117
  # ===========================
@@ -186,14 +218,26 @@ class TestFormBuilder < Test::Unit::TestCase
186
218
  end
187
219
 
188
220
  should "display correct checkbox html as checked when object value matches" do
189
- @user.stubs(:show_favorites => '1')
221
+ @user.stubs(:show_favorites => 'human')
222
+ actual_html = standard_builder.check_box(:show_favorites, :value => 'human')
223
+ assert_has_tag('input[type=checkbox]', :checked => 'checked', :name => 'user[show_favorites]') { actual_html }
224
+ end
225
+
226
+ should "display correct checkbox html as checked when object value is true" do
227
+ @user.stubs(:show_favorites => true)
190
228
  actual_html = standard_builder.check_box(:show_favorites, :value => '1')
191
229
  assert_has_tag('input[type=checkbox]', :checked => 'checked', :name => 'user[show_favorites]') { actual_html }
192
230
  end
193
231
 
194
232
  should "display correct checkbox html as unchecked when object value doesn't match" do
195
- @user.stubs(:show_favories => '0')
196
- actual_html = standard_builder.check_box(:show_favorites, :value => 'female')
233
+ @user.stubs(:show_favorites => 'alien')
234
+ actual_html = standard_builder.check_box(:show_favorites, :value => 'human')
235
+ assert_has_no_tag('input[type=checkbox]', :checked => 'checked') { actual_html }
236
+ end
237
+
238
+ should "display correct checkbox html as unchecked when object value is false" do
239
+ @user.stubs(:show_favorites => false)
240
+ actual_html = standard_builder.check_box(:show_favorites, :value => '1')
197
241
  assert_has_no_tag('input[type=checkbox]', :checked => 'checked') { actual_html }
198
242
  end
199
243
 
@@ -364,6 +364,23 @@ class TestFormHelpers < Test::Unit::TestCase
364
364
  end
365
365
  end
366
366
 
367
+ context 'for #button_tag method' do
368
+ should "display submit tag in ruby" do
369
+ actual_html = button_tag("Cancel", :class => 'clear')
370
+ assert_has_tag(:input, :type => 'button', :class => "clear", :value => 'Cancel') { actual_html }
371
+ end
372
+
373
+ should "display submit tag in erb" do
374
+ visit '/erb/form_tag'
375
+ assert_have_selector 'form.advanced-form input[type=button]', :count => 1, :value => "Cancel"
376
+ end
377
+
378
+ should "display submit tag in haml" do
379
+ visit '/haml/form_tag'
380
+ assert_have_selector 'form.advanced-form input[type=button]', :count => 1, :value => "Cancel"
381
+ end
382
+ end
383
+
367
384
  context 'for #image_submit_tag method' do
368
385
  should "display image submit tag in ruby with relative path" do
369
386
  actual_html = image_submit_tag('buttons/ok.png', :class => 'success')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra_more
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Esquenazi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-10 00:00:00 -08:00
12
+ date: 2009-11-11 00:00:00 -08:00
13
13
  default_executable: sinatra_gen
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -191,12 +191,16 @@ files:
191
191
  - test/fixtures/markup_app/views/content_for.haml
192
192
  - test/fixtures/markup_app/views/content_tag.erb
193
193
  - test/fixtures/markup_app/views/content_tag.haml
194
+ - test/fixtures/markup_app/views/fields_for.erb
195
+ - test/fixtures/markup_app/views/fields_for.haml
194
196
  - test/fixtures/markup_app/views/form_for.erb
195
197
  - test/fixtures/markup_app/views/form_for.haml
196
198
  - test/fixtures/markup_app/views/form_tag.erb
197
199
  - test/fixtures/markup_app/views/form_tag.haml
198
200
  - test/fixtures/markup_app/views/link_to.erb
199
201
  - test/fixtures/markup_app/views/link_to.haml
202
+ - test/fixtures/markup_app/views/mail_to.erb
203
+ - test/fixtures/markup_app/views/mail_to.haml
200
204
  - test/fixtures/render_app/app.rb
201
205
  - test/fixtures/render_app/views/erb/test.erb
202
206
  - test/fixtures/render_app/views/haml/test.haml