bootstrap_forms 2.0.2 → 2.0.3
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/.gitignore +1 -0
- data/bootstrap_forms.gemspec +1 -1
- data/lib/bootstrap_forms.rb +2 -0
- data/lib/bootstrap_forms/form_builder.rb +24 -19
- data/lib/bootstrap_forms/helpers/form_helper.rb +2 -2
- data/lib/bootstrap_forms/helpers/wrappers.rb +7 -9
- data/spec/dummy/app/helpers/my_custom_form_builder.rb +5 -0
- data/spec/dummy/app/models/project.rb +1 -0
- data/spec/dummy/config/application.rb +2 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20120828002121_add_project_owner.rb +9 -0
- data/spec/dummy/db/schema.rb +3 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/lib/bootstrap_forms/bootstrap_form_for_spec.rb +35 -0
- data/spec/lib/bootstrap_forms/form_builder_spec.rb +22 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/shared_context.rb +19 -5
- metadata +10 -4
data/.gitignore
CHANGED
data/bootstrap_forms.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "bootstrap_forms"
|
6
|
-
s.version = "2.0.
|
6
|
+
s.version = "2.0.3"
|
7
7
|
s.author = "Seth Vargo"
|
8
8
|
s.email = "sethvargo@gmail.com"
|
9
9
|
s.homepage = "https://github.com/sethvargo/bootstrap_forms"
|
data/lib/bootstrap_forms.rb
CHANGED
@@ -19,7 +19,7 @@ module BootstrapForms
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
%w(collection_select select country_select time_zone_select email_field file_field number_field password_field phone_field range_field search_field telephone_field text_area text_field url_field).each do |method_name|
|
22
|
+
%w(collection_select select country_select time_zone_select email_field file_field number_field password_field phone_field range_field search_field telephone_field text_area text_field url_field datetime_select date_select time_select).each do |method_name|
|
23
23
|
define_method(method_name) do |name, *args|
|
24
24
|
@name = name
|
25
25
|
@field_options = args.extract_options!
|
@@ -27,7 +27,7 @@ module BootstrapForms
|
|
27
27
|
|
28
28
|
control_group_div do
|
29
29
|
label_field + input_div do
|
30
|
-
extras { super(name, *(@args << @field_options)) }
|
30
|
+
extras { super(name, *(@args << @field_options.merge(required_attribute))) }
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -40,10 +40,11 @@ module BootstrapForms
|
|
40
40
|
|
41
41
|
control_group_div do
|
42
42
|
input_div do
|
43
|
+
@field_options.merge!(required_attribute)
|
43
44
|
if @field_options[:label] == false || @field_options[:label] == ''
|
44
45
|
extras { super(name, *(@args << @field_options)) }
|
45
46
|
else
|
46
|
-
label(@name, :class =>
|
47
|
+
label(@name, :class => 'checkbox') do
|
47
48
|
extras { super(name, *(@args << @field_options)) + (@field_options[:label].blank? ? human_attribute_name : @field_options[:label])}
|
48
49
|
end
|
49
50
|
end
|
@@ -53,14 +54,14 @@ module BootstrapForms
|
|
53
54
|
|
54
55
|
def radio_buttons(name, values = {}, opts = {})
|
55
56
|
@name = name
|
56
|
-
@field_options = opts
|
57
|
+
@field_options = opts.merge(required_attribute)
|
57
58
|
control_group_div do
|
58
59
|
label_field + input_div do
|
59
|
-
values.map do |text, value|
|
60
|
+
values.map do |text, value|
|
60
61
|
if @field_options[:label] == '' || @field_options[:label] == false
|
61
62
|
extras { radio_button(name, value, @field_options) + text }
|
62
63
|
else
|
63
|
-
label("#{@name}_#{value}", :class =>
|
64
|
+
label("#{@name}_#{value}", :class => 'radio') do
|
64
65
|
extras { radio_button(name, value, @field_options) + text }
|
65
66
|
end
|
66
67
|
end
|
@@ -77,11 +78,12 @@ module BootstrapForms
|
|
77
78
|
control_group_div do
|
78
79
|
label_field + extras do
|
79
80
|
content_tag(:div, :class => 'controls') do
|
81
|
+
options = @field_options.merge(required_attribute)
|
80
82
|
records.collect do |record|
|
81
|
-
|
82
|
-
checkbox = check_box_tag("#{object_name}[#{attribute}][]", record.send(record_id), [object.send(attribute)].flatten.include?(record.send(record_id)),
|
83
|
+
options[:id] = "#{object_name}_#{attribute}_#{record.send(record_id)}"
|
84
|
+
checkbox = check_box_tag("#{object_name}[#{attribute}][]", record.send(record_id), [object.send(attribute)].flatten.include?(record.send(record_id)), options)
|
83
85
|
|
84
|
-
content_tag(:label, :class => ['checkbox', ('inline' if @field_options[:inline])].compact
|
86
|
+
content_tag(:label, :class => ['checkbox', ('inline' if @field_options[:inline])].compact) do
|
85
87
|
checkbox + content_tag(:span, record.send(record_name))
|
86
88
|
end
|
87
89
|
end.join('').html_safe
|
@@ -98,11 +100,12 @@ module BootstrapForms
|
|
98
100
|
control_group_div do
|
99
101
|
label_field + extras do
|
100
102
|
content_tag(:div, :class => 'controls') do
|
103
|
+
options = @field_options.merge(required_attribute)
|
101
104
|
records.collect do |record|
|
102
|
-
|
103
|
-
radiobutton = radio_button_tag("#{object_name}[#{attribute}]", record.send(record_id), object.send(attribute) == record.send(record_id),
|
105
|
+
options[:id] = "#{object_name}_#{attribute}_#{record.send(record_id)}"
|
106
|
+
radiobutton = radio_button_tag("#{object_name}[#{attribute}]", record.send(record_id), object.send(attribute) == record.send(record_id), options)
|
104
107
|
|
105
|
-
content_tag(:label, :class => ['radio', ('inline' if @field_options[:inline])].compact
|
108
|
+
content_tag(:label, :class => ['radio', ('inline' if @field_options[:inline])].compact) do
|
106
109
|
radiobutton + content_tag(:span, record.send(record_name))
|
107
110
|
end
|
108
111
|
end.join('').html_safe
|
@@ -119,10 +122,11 @@ module BootstrapForms
|
|
119
122
|
control_group_div do
|
120
123
|
label_field + input_div do
|
121
124
|
extras do
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
125
|
+
value = @field_options.delete(:value)
|
126
|
+
@field_options[:class] = [@field_options[:class], 'uneditable-input'].compact
|
127
|
+
|
128
|
+
content_tag(:span, @field_options) do
|
129
|
+
value || object.send(@name.to_sym) rescue nil
|
126
130
|
end
|
127
131
|
end
|
128
132
|
end
|
@@ -134,7 +138,7 @@ module BootstrapForms
|
|
134
138
|
@field_options = args.extract_options!
|
135
139
|
@args = args
|
136
140
|
|
137
|
-
@field_options[:class]
|
141
|
+
@field_options[:class] ||= 'btn btn-primary'
|
138
142
|
super(name, *(args << @field_options))
|
139
143
|
end
|
140
144
|
|
@@ -143,13 +147,14 @@ module BootstrapForms
|
|
143
147
|
@field_options = args.extract_options!
|
144
148
|
@args = args
|
145
149
|
|
146
|
-
@field_options[:class]
|
150
|
+
@field_options[:class] ||= 'btn btn-primary'
|
147
151
|
super(name, *(args << @field_options))
|
148
152
|
end
|
149
153
|
|
150
154
|
def cancel(*args)
|
151
155
|
@field_options = args.extract_options!
|
152
|
-
|
156
|
+
@field_options[:class] ||= 'btn cancel'
|
157
|
+
link_to(I18n.t('bootstrap_forms.buttons.cancel'), (@field_options[:back] || :back), :class => @field_options[:class])
|
153
158
|
end
|
154
159
|
|
155
160
|
def actions(&block)
|
@@ -2,7 +2,7 @@ module BootstrapForms
|
|
2
2
|
module Helpers
|
3
3
|
module FormHelper
|
4
4
|
def bootstrap_form_for(record, options = {}, &block)
|
5
|
-
options[:builder] = BootstrapForms
|
5
|
+
options[:builder] = options[:builder] || BootstrapForms.default_form_builder
|
6
6
|
form_for(record, options) do |f|
|
7
7
|
if f.object.respond_to?(:errors)
|
8
8
|
f.error_messages.html_safe + capture(f, &block).html_safe
|
@@ -13,7 +13,7 @@ module BootstrapForms
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def bootstrap_fields_for(record, options = {}, &block)
|
16
|
-
options[:builder] = BootstrapForms
|
16
|
+
options[:builder] = options[:builder] || BootstrapForms.default_form_builder
|
17
17
|
fields_for(record, nil, options, &block)
|
18
18
|
end
|
19
19
|
end
|
@@ -14,9 +14,8 @@ module BootstrapForms
|
|
14
14
|
klasses << 'error' if @field_options[:error]
|
15
15
|
klasses << 'success' if @field_options[:success]
|
16
16
|
klasses << 'warning' if @field_options[:warning]
|
17
|
-
klass = klasses.join(' ')
|
18
17
|
|
19
|
-
content_tag(:div, :class =>
|
18
|
+
content_tag(:div, :class => klasses, &block)
|
20
19
|
end
|
21
20
|
|
22
21
|
def error_string
|
@@ -52,19 +51,18 @@ module BootstrapForms
|
|
52
51
|
return ''.html_safe
|
53
52
|
else
|
54
53
|
if respond_to?(:object)
|
55
|
-
label(@name, block_given? ? block : @field_options[:label], :class =>
|
54
|
+
label(@name, block_given? ? block : @field_options[:label], :class => 'control-label')
|
56
55
|
else
|
57
|
-
label_tag(@name, block_given? ? block : @field_options[:label], :class =>
|
56
|
+
label_tag(@name, block_given? ? block : @field_options[:label], :class => 'control-label')
|
58
57
|
end
|
59
58
|
end
|
60
59
|
end
|
61
60
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
65
|
-
return 'required' if object.class.validators_on(@name).any? { |v| v.kind_of? ActiveModel::Validations::PresenceValidator }
|
61
|
+
def required_attribute
|
62
|
+
if respond_to?(:object) and object.respond_to?(:errors) and object.class.respond_to?('validators_on')
|
63
|
+
return { :required => true } if object.class.validators_on(@name).any? { |v| v.kind_of? ActiveModel::Validations::PresenceValidator }
|
66
64
|
end
|
67
|
-
|
65
|
+
{}
|
68
66
|
end
|
69
67
|
|
70
68
|
%w(help_inline error success warning help_block append prepend).each do |method_name|
|
Binary file
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
# This file is auto-generated from the current state of the database. Instead
|
2
3
|
# of editing this file, please use the migrations feature of Active Record to
|
3
4
|
# incrementally modify your database, and then regenerate this schema definition.
|
@@ -10,7 +11,7 @@
|
|
10
11
|
#
|
11
12
|
# It's strongly recommended to check this file into your version control system.
|
12
13
|
|
13
|
-
ActiveRecord::Schema.define(:version =>
|
14
|
+
ActiveRecord::Schema.define(:version => 20120828002121) do
|
14
15
|
|
15
16
|
create_table "milestones", :force => true do |t|
|
16
17
|
t.integer "task_id"
|
@@ -19,6 +20,7 @@ ActiveRecord::Schema.define(:version => 20110710143903) do
|
|
19
20
|
|
20
21
|
create_table "projects", :force => true do |t|
|
21
22
|
t.string "name"
|
23
|
+
t.string "owner"
|
22
24
|
end
|
23
25
|
|
24
26
|
create_table "tasks", :force => true do |t|
|
data/spec/dummy/db/test.sqlite3
CHANGED
Binary file
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "bootstrap_form_for" do
|
4
|
+
describe "default_form_builder" do
|
5
|
+
it "should be accessible" do
|
6
|
+
BootstrapForms.should respond_to(:default_form_builder)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be the BootstrapForms form_builder by default" do
|
10
|
+
BootstrapForms.default_form_builder.should == BootstrapForms::FormBuilder
|
11
|
+
end
|
12
|
+
|
13
|
+
context "when set to something else" do
|
14
|
+
before do
|
15
|
+
BootstrapForms.default_form_builder = MyCustomFormBuilder
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be that other thing" do
|
19
|
+
BootstrapForms.default_form_builder.should == MyCustomFormBuilder
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "projects/new.html.erb", :type => :view do
|
23
|
+
before do
|
24
|
+
assign :project, Project.new
|
25
|
+
render :file => "projects/new.html.erb", :layout => "layouts/application.html.erb"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should render with the other form builder" do
|
29
|
+
# in other words, it shouldn't be wrapped with the bootstrap stuff
|
30
|
+
rendered.should_not match /<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name<\/label><div class=\"controls\">.*<\/div><\/div>/
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -73,6 +73,12 @@ describe "BootstrapForms::FormBuilder" do
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
context "an attribute with a PresenceValidator" do
|
77
|
+
it "adds the required attribute" do
|
78
|
+
@builder.text_field("owner").should match /<input .*required="required"/
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
76
82
|
context 'submit' do
|
77
83
|
it 'checks persistence of object' do
|
78
84
|
@builder.submit.should match('Create Project')
|
@@ -96,3 +102,19 @@ describe "BootstrapForms::FormBuilder" do
|
|
96
102
|
it_behaves_like 'a bootstrap form'
|
97
103
|
end
|
98
104
|
end
|
105
|
+
|
106
|
+
describe 'BootstrapForms::Helpers::FormTagHelper' do
|
107
|
+
describe '#bootstrap_text_field_tag' do
|
108
|
+
context 'with no method "validators_on"' do
|
109
|
+
before(:each) do
|
110
|
+
@non_active_record_object = {:attributes => [:id, :name]}
|
111
|
+
@template = ActionView::Base.new
|
112
|
+
@template.output_buffer = ""
|
113
|
+
@builder = BootstrapForms::FormBuilder.new(:item, @non_active_record_object, @template, {}, proc {})
|
114
|
+
end
|
115
|
+
it 'returns an empty string with no errors' do
|
116
|
+
@template.bootstrap_text_field_tag(@builder.object[:name]).should match /<div class="control-group">.*/
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -19,6 +19,7 @@ RSpec.configure do |config|
|
|
19
19
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
20
20
|
config.run_all_when_everything_filtered = true
|
21
21
|
config.filter_run :focus
|
22
|
+
config.include RSpec::Rails::ViewExampleGroup, :type => :view
|
22
23
|
end
|
23
24
|
|
24
|
-
Rails.backtrace_cleaner.remove_silencers!
|
25
|
+
Rails.backtrace_cleaner.remove_silencers!
|
@@ -139,9 +139,10 @@ shared_examples "a bootstrap form" do
|
|
139
139
|
@builder.text_field(:name, :append => '@', :prepend => '#').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><div class=\"input-prepend input-append\"><span class=\"add-on\">\#</span><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"add-on\">@</span></div></div></div>"
|
140
140
|
end
|
141
141
|
end
|
142
|
-
context "label option" do
|
143
|
-
%w(select email_field file_field number_field password_field search_field text_area text_field url_field).each do |method_name|
|
144
142
|
|
143
|
+
context "label option" do
|
144
|
+
%w(select email_field file_field number_field password_field search_field text_area text_field url_field).each do |method_name|
|
145
|
+
|
145
146
|
it "should not add a label when ''" do
|
146
147
|
@builder.send(method_name.to_sym, 'name', :label => '').should_not match /<\/label>/
|
147
148
|
end
|
@@ -163,22 +164,35 @@ shared_examples "a bootstrap form" do
|
|
163
164
|
end
|
164
165
|
|
165
166
|
context "submit" do
|
166
|
-
it "adds btn primary class" do
|
167
|
+
it "adds btn primary class if no class is defined" do
|
167
168
|
@builder.submit.should match /class=\"btn btn-primary\"/
|
168
169
|
end
|
170
|
+
|
171
|
+
it "allows for custom classes" do
|
172
|
+
@builder.submit(:class => 'btn btn-large btn-success').should match /class=\"btn btn-large btn-success\"/
|
173
|
+
end
|
169
174
|
end
|
170
175
|
|
171
176
|
context "button" do
|
172
|
-
it "adds btn primary class" do
|
177
|
+
it "adds btn primary class if no class is defined" do
|
173
178
|
@builder.button.should match /class=\"btn btn-primary\"/
|
174
179
|
end
|
180
|
+
|
181
|
+
it "allows for custom classes" do
|
182
|
+
@builder.button(:class => 'btn btn-large btn-success').should match /class=\"btn btn-large btn-success\"/
|
183
|
+
end
|
175
184
|
end
|
176
185
|
|
177
186
|
context "cancel" do
|
178
|
-
it "creates link with
|
187
|
+
it "creates a link with cancel btn class if no class is defined" do
|
179
188
|
@builder.should_receive(:link_to).with(I18n.t('bootstrap_forms.buttons.cancel'), :back, :class => 'btn cancel').and_return("")
|
180
189
|
@builder.cancel
|
181
190
|
end
|
191
|
+
|
192
|
+
it "creates a link with custom classes when defined" do
|
193
|
+
@builder.should_receive(:link_to).with(I18n.t('bootstrap_forms.buttons.cancel'), :back, :class => 'btn btn-large my-cancel').and_return("")
|
194
|
+
@builder.cancel(:class => 'btn btn-large my-cancel')
|
195
|
+
end
|
182
196
|
end
|
183
197
|
end # actions
|
184
198
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootstrap_forms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec-rails
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- spec/dummy/app/controllers/application_controller.rb
|
140
140
|
- spec/dummy/app/controllers/projects_controller.rb
|
141
141
|
- spec/dummy/app/helpers/application_helper.rb
|
142
|
+
- spec/dummy/app/helpers/my_custom_form_builder.rb
|
142
143
|
- spec/dummy/app/helpers/projects_helper.rb
|
143
144
|
- spec/dummy/app/mailers/.gitkeep
|
144
145
|
- spec/dummy/app/models/.gitkeep
|
@@ -165,6 +166,7 @@ files:
|
|
165
166
|
- spec/dummy/config/routes.rb
|
166
167
|
- spec/dummy/db/development.sqlite3
|
167
168
|
- spec/dummy/db/migrate/20110710143903_initial_tables.rb
|
169
|
+
- spec/dummy/db/migrate/20120828002121_add_project_owner.rb
|
168
170
|
- spec/dummy/db/schema.rb
|
169
171
|
- spec/dummy/db/test.sqlite3
|
170
172
|
- spec/dummy/public/404.html
|
@@ -175,6 +177,7 @@ files:
|
|
175
177
|
- spec/dummy/test/functional/projects_controller_test.rb
|
176
178
|
- spec/dummy/test/unit/helpers/projects_helper_test.rb
|
177
179
|
- spec/dummy/tmp/cache/.gitkeep
|
180
|
+
- spec/lib/bootstrap_forms/bootstrap_form_for_spec.rb
|
178
181
|
- spec/lib/bootstrap_forms/form_builder_spec.rb
|
179
182
|
- spec/spec_helper.rb
|
180
183
|
- spec/support/shared_context.rb
|
@@ -192,7 +195,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
192
195
|
version: '0'
|
193
196
|
segments:
|
194
197
|
- 0
|
195
|
-
hash:
|
198
|
+
hash: -2577927973588577500
|
196
199
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
200
|
none: false
|
198
201
|
requirements:
|
@@ -201,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
201
204
|
version: '0'
|
202
205
|
segments:
|
203
206
|
- 0
|
204
|
-
hash:
|
207
|
+
hash: -2577927973588577500
|
205
208
|
requirements: []
|
206
209
|
rubyforge_project:
|
207
210
|
rubygems_version: 1.8.24
|
@@ -215,6 +218,7 @@ test_files:
|
|
215
218
|
- spec/dummy/app/controllers/application_controller.rb
|
216
219
|
- spec/dummy/app/controllers/projects_controller.rb
|
217
220
|
- spec/dummy/app/helpers/application_helper.rb
|
221
|
+
- spec/dummy/app/helpers/my_custom_form_builder.rb
|
218
222
|
- spec/dummy/app/helpers/projects_helper.rb
|
219
223
|
- spec/dummy/app/mailers/.gitkeep
|
220
224
|
- spec/dummy/app/models/.gitkeep
|
@@ -241,6 +245,7 @@ test_files:
|
|
241
245
|
- spec/dummy/config/routes.rb
|
242
246
|
- spec/dummy/db/development.sqlite3
|
243
247
|
- spec/dummy/db/migrate/20110710143903_initial_tables.rb
|
248
|
+
- spec/dummy/db/migrate/20120828002121_add_project_owner.rb
|
244
249
|
- spec/dummy/db/schema.rb
|
245
250
|
- spec/dummy/db/test.sqlite3
|
246
251
|
- spec/dummy/public/404.html
|
@@ -251,6 +256,7 @@ test_files:
|
|
251
256
|
- spec/dummy/test/functional/projects_controller_test.rb
|
252
257
|
- spec/dummy/test/unit/helpers/projects_helper_test.rb
|
253
258
|
- spec/dummy/tmp/cache/.gitkeep
|
259
|
+
- spec/lib/bootstrap_forms/bootstrap_form_for_spec.rb
|
254
260
|
- spec/lib/bootstrap_forms/form_builder_spec.rb
|
255
261
|
- spec/spec_helper.rb
|
256
262
|
- spec/support/shared_context.rb
|