foundation_rails_helper 0.4 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +17 -2
- data/README.md +125 -6
- data/foundation_rails_helper.gemspec +9 -4
- data/lib/foundation_rails_helper.rb +3 -0
- data/lib/foundation_rails_helper/action_view_extension.rb +6 -3
- data/lib/foundation_rails_helper/flash_helper.rb +3 -1
- data/lib/foundation_rails_helper/form_builder.rb +54 -23
- data/lib/foundation_rails_helper/version.rb +1 -1
- data/spec/foundation_rails_helper/form_builder_spec.rb +268 -7
- data/spec/spec_helper.rb +5 -1
- data/spec/support/mock_rails.rb +49 -3
- metadata +113 -43
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b91634e14b82386a58ec5123c79bbf9a7cc00e2c
|
4
|
+
data.tar.gz: f668d1586441afb62f4308352eeb81cc8e1a1526
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d2d484df58203229b48594064fdf2ca2977924620e4c6c36bc8a9a4fb3b1ec3721a3b295f1599242fd872f94d6712408c130d407a744b6395b371729179bba7b
|
7
|
+
data.tar.gz: e50a0e0e2ff994a6d3f11b73af3655c9bc4ae8f85518c9b1d43ddcc92f5d619636215cdc157d46f8256d4333424a83ff84a4f05aef6097249edb7009440d8578
|
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,23 @@
|
|
1
|
-
## Version 0.
|
1
|
+
## Version 0.5.0
|
2
2
|
|
3
|
-
*
|
3
|
+
* Released Oct 10th 2014
|
4
|
+
* Bugfixes
|
5
|
+
|
6
|
+
## Version 0.4
|
7
|
+
|
8
|
+
* Not released
|
9
|
+
* Compatibility with Rails 4
|
10
|
+
* Bugfixes
|
11
|
+
|
12
|
+
## Version 0.3
|
13
|
+
|
14
|
+
* Not released
|
15
|
+
* Mostly bugfixes
|
4
16
|
|
5
17
|
## Version 0.2.1
|
6
18
|
|
7
19
|
* First production release (Jan 14th, 2012)
|
8
20
|
|
21
|
+
## Version 0.1.rc
|
22
|
+
|
23
|
+
* initial release candidate (Jan 14th, 2012)
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# FoundationRailsHelper [![Build Status](https://secure.travis-ci.org/sgruhier/foundation_rails_helper.png)](http://travis-ci.org/sgruhier/foundation_rails_helper)
|
2
2
|
|
3
|
-
Gem for Rails
|
3
|
+
Gem for Rails 4.1.x applications that use the excellent Zurb Foundation framework.
|
4
4
|
|
5
5
|
* [Zurb Foundation](https://github.com/zurb/foundation)
|
6
6
|
* [Zurb Foundation Rails](https://github.com/zurb/foundation-rails)
|
@@ -11,7 +11,12 @@ So far it includes:
|
|
11
11
|
|
12
12
|
* A `display_flash_messages` helper method that uses Zurb Foundation Alerts UI.
|
13
13
|
|
14
|
-
|
14
|
+
#### Compatibility
|
15
|
+
|
16
|
+
* Only Rails 4.1 and Foundation 4 and 5 are fully supported
|
17
|
+
* Some features may work with Foundation 3 and older, but results may vary, and markup which exists only for those versions will be gradually removed
|
18
|
+
* Legacy branches exist for Rails 3 and 4.0 (see the rails3 and rails4.0 branches). These are not actively supported, and fixes are not retroactively applied, but pull requests are welcomed.
|
19
|
+
|
15
20
|
|
16
21
|
## Screenshots
|
17
22
|
|
@@ -58,9 +63,7 @@ And then execute:
|
|
58
63
|
$ bundle
|
59
64
|
```
|
60
65
|
|
61
|
-
|
62
|
-
|
63
|
-
There is nothing additional to do for form helpers.
|
66
|
+
### Flash Messages
|
64
67
|
|
65
68
|
To get access to `display_flash_messages` in your views, add
|
66
69
|
|
@@ -70,6 +73,119 @@ include FoundationRailsHelper::FlashHelper
|
|
70
73
|
|
71
74
|
to `app/helpers/application_helper.rb`
|
72
75
|
|
76
|
+
## Usage
|
77
|
+
|
78
|
+
### form_for
|
79
|
+
|
80
|
+
Form_for wraps the standard rails form_for helper and adds a 'nice' class by default.
|
81
|
+
|
82
|
+
```erb
|
83
|
+
<%= form_for @user do |f| %>
|
84
|
+
...
|
85
|
+
<% end %>
|
86
|
+
```
|
87
|
+
|
88
|
+
generates:
|
89
|
+
|
90
|
+
```html
|
91
|
+
<form accept-charset="UTF-8" action="/users" class="nice" id="new_user" method="post">
|
92
|
+
...
|
93
|
+
```
|
94
|
+
|
95
|
+
Override the default class like so:
|
96
|
+
|
97
|
+
```erb
|
98
|
+
<%= form_for(@user, html: {class: 'mean'}) do |f| %>
|
99
|
+
...
|
100
|
+
```
|
101
|
+
|
102
|
+
### text_field and Field Helpers
|
103
|
+
|
104
|
+
Field helpers add a label element and an input of the proper type.
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
f.text_field :name
|
108
|
+
```
|
109
|
+
|
110
|
+
generates:
|
111
|
+
|
112
|
+
```html
|
113
|
+
<label for="user_email">Name</label>
|
114
|
+
<input class="medium input-text" id="user_name" name="user[name]" type="text">
|
115
|
+
```
|
116
|
+
|
117
|
+
The 'input-text' class will always be added to the input element, but the 'medium' class can be replaced.
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
f.text_field :name, class: 'large'
|
121
|
+
```
|
122
|
+
|
123
|
+
generates:
|
124
|
+
|
125
|
+
```html
|
126
|
+
<input class="large input-text" ... >
|
127
|
+
```
|
128
|
+
|
129
|
+
Prevent the generation of a label:
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
f.text_field :name, label: false
|
133
|
+
```
|
134
|
+
|
135
|
+
Change the label text and add a class on the label:
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
f.text_field :name, label: 'Nombre', label_options: { class: 'large' }
|
139
|
+
```
|
140
|
+
|
141
|
+
If the hint option is specified
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
f.text_field :name, hint: "I'm a text field"
|
145
|
+
```
|
146
|
+
|
147
|
+
an additional span element will be added after the input element:
|
148
|
+
|
149
|
+
```html
|
150
|
+
<span class="hint">I'm a text field</span>
|
151
|
+
```
|
152
|
+
|
153
|
+
### Submit Button
|
154
|
+
|
155
|
+
The 'submit' helper wraps the rails helper and sets the class attribute to "small radius success button" by default.
|
156
|
+
|
157
|
+
```ruby
|
158
|
+
f.submit
|
159
|
+
```
|
160
|
+
|
161
|
+
generates:
|
162
|
+
|
163
|
+
```html
|
164
|
+
<input class="small radius success button" name="commit" type="submit" value="Create User">
|
165
|
+
```
|
166
|
+
|
167
|
+
Specify the class option to override the default classes.
|
168
|
+
|
169
|
+
### Errors
|
170
|
+
|
171
|
+
On error,
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
f.email_field :email
|
175
|
+
```
|
176
|
+
|
177
|
+
generates:
|
178
|
+
|
179
|
+
```html
|
180
|
+
<label class=" error" for="user_email">Email</label>
|
181
|
+
<input class="medium input-text error" id="user_email" name="user[email]" type="email" value="">
|
182
|
+
<small class="error medium input-text error">can't be blank</small>
|
183
|
+
```
|
184
|
+
|
185
|
+
The class attribute of the 'small' element will mirror the class attribute of the 'input' element.
|
186
|
+
|
187
|
+
If the `html_safe_errors: true` option is specified on a field, then any HTML you may have embedded in a custom error string will be displayed with the html_safe option.
|
188
|
+
|
73
189
|
## TODO
|
74
190
|
|
75
191
|
* Handle more UI components
|
@@ -85,4 +201,7 @@ to `app/helpers/application_helper.rb`
|
|
85
201
|
|
86
202
|
## Copyright
|
87
203
|
|
88
|
-
Sébastien Gruhier (http://xilinus.com, http://v2.maptimize.com) - MIT LICENSE - 2012
|
204
|
+
Sébastien Gruhier (http://xilinus.com, http://v2.maptimize.com) - MIT LICENSE - 2012
|
205
|
+
|
206
|
+
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/sgruhier/foundation_rails_helper/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
|
207
|
+
|
@@ -14,9 +14,14 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.name = "foundation_rails_helper"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = FoundationRailsHelper::VERSION
|
17
|
+
gem.license = 'MIT'
|
17
18
|
|
18
|
-
gem.add_dependency 'railties', '>=
|
19
|
-
gem.add_dependency
|
20
|
-
gem.
|
21
|
-
gem.
|
19
|
+
gem.add_dependency 'railties', '~> 4.1', '>= 4.1.1'
|
20
|
+
gem.add_dependency 'actionpack', '~> 4.1', '>= 4.1.1'
|
21
|
+
gem.add_dependency 'activemodel', '~> 4.1', '>= 4.1.1'
|
22
|
+
gem.add_dependency 'activesupport', '~> 4.1', '>= 4.1.1'
|
23
|
+
gem.add_dependency 'tzinfo', '~> 1.2', '>= 1.2.2'
|
24
|
+
|
25
|
+
gem.add_development_dependency 'rspec-rails', '~> 2.8', '>= 2.8.1'
|
26
|
+
gem.add_development_dependency 'capybara', '~> 2.4', '>= 2.4.3'
|
22
27
|
end
|
@@ -2,3 +2,6 @@ require "foundation_rails_helper/version"
|
|
2
2
|
require "foundation_rails_helper/form_builder"
|
3
3
|
require "foundation_rails_helper/flash_helper"
|
4
4
|
require "foundation_rails_helper/action_view_extension"
|
5
|
+
ActiveSupport.on_load(:action_view) do
|
6
|
+
include FoundationRailsHelper::FlashHelper
|
7
|
+
end
|
@@ -5,16 +5,19 @@ module ActionView
|
|
5
5
|
options[:builder] ||= FoundationRailsHelper::FormBuilder
|
6
6
|
options[:html] ||= {}
|
7
7
|
options[:html][:class] ||= 'nice'
|
8
|
-
|
8
|
+
options[:auto_labels] = true unless options.has_key? :auto_labels
|
9
|
+
form_for_without_foundation(record, options, &block)
|
9
10
|
end
|
10
|
-
|
11
|
+
|
11
12
|
def fields_for_with_foundation(record_name, record_object = nil, options = {}, &block)
|
12
13
|
options[:builder] ||= FoundationRailsHelper::FormBuilder
|
13
14
|
options[:html] ||= {}
|
14
15
|
options[:html][:class] ||= 'nice'
|
16
|
+
options[:html][:attached_labels] = options[:attached_labels]
|
17
|
+
options[:auto_labels] = true unless options.has_key? :auto_labels
|
15
18
|
fields_for_without_foundation(record_name, record_object, options, &block)
|
16
19
|
end
|
17
|
-
|
20
|
+
|
18
21
|
alias_method_chain :form_for, :foundation
|
19
22
|
alias_method_chain :fields_for, :foundation
|
20
23
|
end
|
@@ -11,12 +11,14 @@ module FoundationRailsHelper
|
|
11
11
|
:notice => :success,
|
12
12
|
:info => :standard,
|
13
13
|
:secondary => :secondary,
|
14
|
+
:success => :success,
|
15
|
+
:error => :alert
|
14
16
|
}
|
15
17
|
def display_flash_messages(key_matching = {})
|
16
18
|
key_matching = DEFAULT_KEY_MATCHING.merge(key_matching)
|
17
19
|
|
18
20
|
flash.inject "" do |message, (key, value)|
|
19
|
-
message += content_tag :div, :data => { :alert => "" }, :class => "alert-box #{key_matching[key] || :standard}" do
|
21
|
+
message += content_tag :div, :data => { :alert => "" }, :class => "alert-box #{key_matching[key.to_sym] || :standard}" do
|
20
22
|
(value + link_to("×".html_safe, "#", :class => :close)).html_safe
|
21
23
|
end
|
22
24
|
end.html_safe
|
@@ -3,7 +3,9 @@ require 'action_view/helpers'
|
|
3
3
|
module FoundationRailsHelper
|
4
4
|
class FormBuilder < ActionView::Helpers::FormBuilder
|
5
5
|
include ActionView::Helpers::TagHelper
|
6
|
-
%w(file_field email_field text_field text_area telephone_field phone_field
|
6
|
+
%w(file_field email_field text_field text_area telephone_field phone_field
|
7
|
+
url_field number_field date_field datetime_field datetime_local_field
|
8
|
+
month_field week_field time_field range_field search_field color_field ).each do |method_name|
|
7
9
|
define_method(method_name) do |*args|
|
8
10
|
attribute = args[0]
|
9
11
|
options = args[1] || {}
|
@@ -13,6 +15,13 @@ module FoundationRailsHelper
|
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
18
|
+
def label(attribute, text = nil, options = {})
|
19
|
+
options[:class] ||= ""
|
20
|
+
options[:class] += " error" if has_error?(attribute)
|
21
|
+
super(attribute, (text || "").html_safe, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
16
25
|
def check_box(attribute, options = {}, checked_value = "1", unchecked_value = "0")
|
17
26
|
custom_label(attribute, options[:label], options[:label_options]) do
|
18
27
|
options.delete(:label)
|
@@ -22,7 +31,7 @@ module FoundationRailsHelper
|
|
22
31
|
end
|
23
32
|
|
24
33
|
def radio_button(attribute, tag_value, options = {})
|
25
|
-
options[:for] ||= "#{
|
34
|
+
options[:for] ||= "#{@object_name}_#{attribute}_#{tag_value}"
|
26
35
|
c = super(attribute, tag_value, options)
|
27
36
|
l = label(attribute, options.delete(:text), options)
|
28
37
|
l.gsub(/(for=\"\w*\"\>)/, "\\1#{c} ").html_safe
|
@@ -34,31 +43,45 @@ module FoundationRailsHelper
|
|
34
43
|
end
|
35
44
|
end
|
36
45
|
|
37
|
-
def datetime_select(attribute, options = {})
|
38
|
-
field attribute, options do |
|
39
|
-
super(attribute,
|
46
|
+
def datetime_select(attribute, options = {}, html_options = {})
|
47
|
+
field attribute, options, html_options do |html_options|
|
48
|
+
super(attribute, options, html_options.merge(:autocomplete => :off))
|
40
49
|
end
|
41
50
|
end
|
42
51
|
|
43
52
|
def date_select(attribute, options = {}, html_options = {})
|
44
|
-
field attribute, html_options do |html_options|
|
53
|
+
field attribute, options, html_options do |html_options|
|
45
54
|
super(attribute, options, html_options.merge(:autocomplete => :off))
|
46
55
|
end
|
47
56
|
end
|
48
57
|
|
49
|
-
def time_zone_select(attribute, options = {})
|
50
|
-
field attribute, options do |
|
51
|
-
super(attribute,
|
58
|
+
def time_zone_select(attribute, priorities = nil, options = {}, html_options = {})
|
59
|
+
field attribute, options, html_options do |html_options|
|
60
|
+
super(attribute, priorities, options, html_options.merge(:autocomplete => :off))
|
52
61
|
end
|
53
62
|
end
|
54
63
|
|
55
64
|
def select(attribute, choices, options = {}, html_options = {})
|
56
|
-
field attribute, options do |
|
65
|
+
field attribute, options, html_options do |html_options|
|
57
66
|
html_options[:autocomplete] ||= :off
|
58
67
|
super(attribute, choices, options, html_options)
|
59
68
|
end
|
60
69
|
end
|
61
70
|
|
71
|
+
def collection_select(attribute, collection, value_method, text_method, options = {}, html_options = {})
|
72
|
+
field attribute, options, html_options do |html_options|
|
73
|
+
html_options[:autocomplete] ||= :off
|
74
|
+
super(attribute, collection, value_method, text_method, options, html_options)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def grouped_collection_select(attribute, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
|
79
|
+
field attribute, options, html_options do |html_options|
|
80
|
+
html_options[:autocomplete] ||= :off
|
81
|
+
super(attribute, collection, group_method, group_label_method, option_key_method, option_value_method, options, html_options)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
62
85
|
def autocomplete(attribute, url, options = {})
|
63
86
|
field attribute, options do |options|
|
64
87
|
autocomplete_field(attribute, url, options.merge(:update_elements => options[:update_elements],
|
@@ -74,22 +97,29 @@ module FoundationRailsHelper
|
|
74
97
|
|
75
98
|
private
|
76
99
|
def has_error?(attribute)
|
77
|
-
!object.errors[attribute].blank?
|
100
|
+
object.respond_to?(:errors) && !object.errors[attribute].blank?
|
78
101
|
end
|
79
102
|
|
80
103
|
def error_for(attribute, options = {})
|
81
104
|
class_name = "error"
|
82
105
|
class_name += " #{options[:class]}" if options[:class]
|
83
|
-
|
106
|
+
if has_error?(attribute)
|
107
|
+
error_messages = object.errors[attribute].join(', ')
|
108
|
+
error_messages = error_messages.html_safe if options[:html_safe_errors]
|
109
|
+
content_tag(:small, error_messages, :class => class_name)
|
110
|
+
end
|
84
111
|
end
|
85
112
|
|
86
113
|
def custom_label(attribute, text, options, &block)
|
87
|
-
if text == false
|
88
|
-
|
89
|
-
|
90
|
-
|
114
|
+
return block_given? ? block.call.html_safe : "".html_safe if text == false
|
115
|
+
if text.nil? || text == true
|
116
|
+
text = if object.class.respond_to?(:human_attribute_name)
|
117
|
+
object.class.human_attribute_name(attribute)
|
118
|
+
else
|
119
|
+
attribute.to_s.humanize
|
120
|
+
end
|
91
121
|
end
|
92
|
-
text = block.call.html_safe + text if block_given?
|
122
|
+
text = block.call.html_safe + " #{text}" if block_given?
|
93
123
|
options ||= {}
|
94
124
|
options[:class] ||= ""
|
95
125
|
options[:class] += " error" if has_error?(attribute)
|
@@ -103,15 +133,16 @@ module FoundationRailsHelper
|
|
103
133
|
html.html_safe
|
104
134
|
end
|
105
135
|
|
106
|
-
def field(attribute, options, &block)
|
136
|
+
def field(attribute, options, html_options=nil, &block)
|
107
137
|
html = ''.html_safe
|
108
|
-
html = custom_label(attribute, options[:label], options[:label_options]) if
|
109
|
-
|
110
|
-
|
111
|
-
|
138
|
+
html = custom_label(attribute, options[:label], options[:label_options]) if @options[:auto_labels] || options[:label]
|
139
|
+
class_options = html_options || options
|
140
|
+
class_options[:class] ||= "medium"
|
141
|
+
class_options[:class] = "#{class_options[:class]} input-text"
|
142
|
+
class_options[:class] += " error" if has_error?(attribute)
|
112
143
|
options.delete(:label)
|
113
144
|
options.delete(:label_options)
|
114
|
-
html += yield(
|
145
|
+
html += yield(class_options)
|
115
146
|
html += error_and_hint(attribute, options)
|
116
147
|
end
|
117
148
|
end
|
@@ -13,6 +13,27 @@ describe "FoundationRailsHelper::FormHelper" do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
it "should display labels by default" do
|
17
|
+
form_for(@author) do |builder|
|
18
|
+
node = Capybara.string builder.text_field(:login)
|
19
|
+
node.should have_css('label[for="author_login"]', :text => "Login")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should not display labels by if there are options without auto_labels: false" do
|
24
|
+
form_for(@author, {html: {class: 'myclass'}}) do |builder|
|
25
|
+
node = Capybara.string builder.text_field(:login)
|
26
|
+
node.should have_css('label[for="author_login"]', :text => "Login")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not display labels by if there are options without auto_labels: false" do
|
31
|
+
form_for(@author, {html: {class: 'myclass'}, auto_labels: false}) do |builder|
|
32
|
+
node = Capybara.string builder.text_field(:login)
|
33
|
+
node.should_not have_css('label[for="author_login"]', :text => "Login")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
16
37
|
describe "input generators" do
|
17
38
|
it "should generate text_field input" do
|
18
39
|
form_for(@author) do |builder|
|
@@ -49,14 +70,14 @@ describe "FoundationRailsHelper::FormHelper" do
|
|
49
70
|
node.find_field('author_email').value.should == @author.email
|
50
71
|
end
|
51
72
|
end
|
52
|
-
|
73
|
+
|
53
74
|
it "should generate url_field input" do
|
54
75
|
form_for(@author) do |builder|
|
55
76
|
node = Capybara.string builder.url_field(:url)
|
56
77
|
node.should have_css('label[for="author_url"]', :text => "Url")
|
57
78
|
node.should have_css('input.medium.input-text[type="url"][name="author[url]"]')
|
58
79
|
node.find_field('author_url').value.should == @author.url
|
59
|
-
end
|
80
|
+
end
|
60
81
|
end
|
61
82
|
|
62
83
|
it "should generate phone_field input" do
|
@@ -65,7 +86,7 @@ describe "FoundationRailsHelper::FormHelper" do
|
|
65
86
|
node.should have_css('label[for="author_phone"]', :text => "Phone")
|
66
87
|
node.should have_css('input.medium.input-text[type="tel"][name="author[phone]"]')
|
67
88
|
node.find_field('author_phone').value.should == @author.phone
|
68
|
-
end
|
89
|
+
end
|
69
90
|
end
|
70
91
|
|
71
92
|
it "should generate number_field input" do
|
@@ -74,7 +95,7 @@ describe "FoundationRailsHelper::FormHelper" do
|
|
74
95
|
node.should have_css('label[for="author_some_number"]', :text => "Some number")
|
75
96
|
node.should have_css('input.medium.input-text[type="number"][name="author[some_number]"]')
|
76
97
|
node.find_field('author_some_number').value.should == @author.some_number
|
77
|
-
end
|
98
|
+
end
|
78
99
|
end
|
79
100
|
|
80
101
|
it "should generate text_area input" do
|
@@ -116,9 +137,9 @@ describe "FoundationRailsHelper::FormHelper" do
|
|
116
137
|
it "should generate check_box input without a label" do
|
117
138
|
form_for(@author) do |builder|
|
118
139
|
node = Capybara.string builder.check_box(:active, :label => false)
|
119
|
-
node.should have_css('
|
120
|
-
node.should have_css('
|
121
|
-
node.
|
140
|
+
node.should have_css('input[type="hidden"][name="author[active]"][value="0"]')
|
141
|
+
node.should have_css('input[type="checkbox"][name="author[active]"]')
|
142
|
+
node.should_not have_css('label[for="author_active"]')
|
122
143
|
end
|
123
144
|
end
|
124
145
|
|
@@ -161,6 +182,143 @@ describe "FoundationRailsHelper::FormHelper" do
|
|
161
182
|
end
|
162
183
|
end
|
163
184
|
|
185
|
+
it "should generate datetime_select input" do
|
186
|
+
form_for(@author) do |builder|
|
187
|
+
node = Capybara.string builder.label(:birthdate) + builder.datetime_select(:birthdate)
|
188
|
+
node.should have_css('label[for="author_birthdate"]', :text => "Birthdate")
|
189
|
+
%w(1 2 3 4 5).each {|i| node.should have_css("select.medium.input-text[name='author[birthdate(#{i}i)]']") }
|
190
|
+
node.should have_css('select#author_birthdate_1i option[selected="selected"][value="1969"]')
|
191
|
+
node.should have_css('select#author_birthdate_2i option[selected="selected"][value="6"]')
|
192
|
+
node.should have_css('select#author_birthdate_3i option[selected="selected"][value="18"]')
|
193
|
+
node.should have_css('select#author_birthdate_4i option[selected="selected"][value="20"]')
|
194
|
+
node.should have_css('select#author_birthdate_5i option[selected="selected"][value="30"]')
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should generate datetime_select input with :discard_year => true" do
|
199
|
+
form_for(@author) do |builder|
|
200
|
+
node = Capybara.string builder.label(:birthdate) + builder.datetime_select(:birthdate, :discard_year => true)
|
201
|
+
node.should have_css('label[for="author_birthdate"]', :text => "Birthdate")
|
202
|
+
%w(2 3 4 5).each {|i| node.should have_css("select.medium.input-text[name='author[birthdate(#{i}i)]']") }
|
203
|
+
node.should_not have_css('select#author_birthdate_1i option[selected="selected"][value="1969"]')
|
204
|
+
node.should have_css('select#author_birthdate_2i option[selected="selected"][value="6"]')
|
205
|
+
node.should have_css('select#author_birthdate_3i option[selected="selected"][value="18"]')
|
206
|
+
node.should have_css('select#author_birthdate_4i option[selected="selected"][value="20"]')
|
207
|
+
node.should have_css('select#author_birthdate_5i option[selected="selected"][value="30"]')
|
208
|
+
%w(1).each {|i| node.should_not have_css("select.medium.input-text[name='author[birthdate(#{i}i)]']") }
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should generate time_zone_select input" do
|
213
|
+
form_for(@author) do |builder|
|
214
|
+
node = Capybara.string builder.label(:time_zone) + builder.time_zone_select(:time_zone)
|
215
|
+
node.should have_css('label[for="author_time_zone"]', :text => "Time zone")
|
216
|
+
node.should have_css('select[name="author[time_zone]"]')
|
217
|
+
node.should have_css('select[name="author[time_zone]"] option[value="Perth"]', :text => "(GMT+08:00) Perth")
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should generate date_field input" do
|
222
|
+
form_for(@author) do |builder|
|
223
|
+
node = Capybara.string builder.date_field(:publish_date)
|
224
|
+
node.should have_css('label[for="author_publish_date"]', :text => "date")
|
225
|
+
node.should have_css('input.medium.input-text[type="date"][name="author[publish_date]"]')
|
226
|
+
node.find_field('author_publish_date').value.should == @author.publish_date.to_s
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should generate datetime_field input" do
|
231
|
+
form_for(@author) do |builder|
|
232
|
+
node = Capybara.string builder.datetime_field(:forty_two)
|
233
|
+
node.should have_css('label[for="author_forty_two"]', :text => "Forty two")
|
234
|
+
node.should have_css('input.medium.input-text[type="datetime"][name="author[forty_two]"]')
|
235
|
+
value = DateTime.parse( node.find_field('author_forty_two').value)
|
236
|
+
value.should == @author.forty_two.to_s
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should generate datetime_local_field" do
|
241
|
+
form_for(@author) do |builder|
|
242
|
+
node = Capybara.string builder.datetime_local_field(:forty_two)
|
243
|
+
node.should have_css('label[for="author_forty_two"]', :text => "Forty two")
|
244
|
+
node.should have_css('input.medium.input-text[type="datetime-local"][name="author[forty_two]"]')
|
245
|
+
node.find_field('author_forty_two').value.should == @author.forty_two.strftime("%Y-%m-%dT%H:%M:%S")
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should generate month_field input" do
|
250
|
+
form_for(@author) do |builder|
|
251
|
+
node = Capybara.string builder.month_field(:forty_two)
|
252
|
+
node.should have_css('label[for="author_forty_two"]', :text => "Forty two")
|
253
|
+
node.should have_css('input.medium.input-text[type="month"][name="author[forty_two]"]')
|
254
|
+
node.find_field('author_forty_two').value.should == @author.forty_two.strftime("%Y-%m")
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should generate week_field" do
|
259
|
+
form_for(@author) do |builder|
|
260
|
+
node = Capybara.string builder.week_field(:forty_two)
|
261
|
+
node.should have_css('label[for="author_forty_two"]', :text => "Forty two")
|
262
|
+
node.should have_css('input.medium.input-text[type="week"][name="author[forty_two]"]')
|
263
|
+
node.find_field('author_forty_two').value.should == @author.forty_two.strftime("%Y-W%V")
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should generate time_field" do
|
268
|
+
form_for(@author) do |builder|
|
269
|
+
node = Capybara.string builder.time_field(:forty_two)
|
270
|
+
node.should have_css('label[for="author_forty_two"]', :text => "Forty two")
|
271
|
+
node.should have_css('input.medium.input-text[type="time"][name="author[forty_two]"]')
|
272
|
+
node.find_field('author_forty_two').value.should == @author.forty_two.strftime("%H:%M:%S.%L")
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should generate range_field" do
|
277
|
+
form_for(@author) do |builder|
|
278
|
+
node = Capybara.string builder.range_field(:some_number)
|
279
|
+
node.should have_css('label[for="author_some_number"]', :text => "Some number")
|
280
|
+
node.should have_css('input.medium.input-text[type="range"][name="author[some_number]"]')
|
281
|
+
node.find_field('author_some_number').value.should == @author.some_number
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
it "should generate search_field" do
|
286
|
+
form_for(@author) do |builder|
|
287
|
+
node = Capybara.string builder.search_field(:description)
|
288
|
+
node.should have_css('label[for="author_description"]', :text => "Description")
|
289
|
+
node.should have_css('input.medium.input-text[type="search"][name="author[description]"]')
|
290
|
+
node.find_field('author_description').value.should == @author.description
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should generate color_field" do
|
295
|
+
form_for(@author) do |builder|
|
296
|
+
node = Capybara.string builder.color_field(:favorite_color)
|
297
|
+
node.should have_css('label[for="author_favorite_color"]', :text => "Favorite color")
|
298
|
+
node.should have_css('input.medium.input-text[type="color"][name="author[favorite_color]"]')
|
299
|
+
node.find_field('author_favorite_color').value.should == @author.favorite_color
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
it "should generate collection_select input" do
|
304
|
+
form_for(@author) do |builder|
|
305
|
+
node = Capybara.string builder.collection_select(:favorite_book, Book.all, :id, :title)
|
306
|
+
node.should have_css('label[for="author_favorite_book"]', :text => "Favorite book")
|
307
|
+
node.should have_css('select[name="author[favorite_book]"]')
|
308
|
+
node.should have_css('select[name="author[favorite_book]"] option[value="78"]', :text => "Gulliver's Travels")
|
309
|
+
node.should have_css('select[name="author[favorite_book]"] option[value="133"]', :text => "Treasure Island")
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
it "should generate grouped_collection_select input" do
|
314
|
+
form_for(@author) do |builder|
|
315
|
+
node = Capybara.string builder.grouped_collection_select(:favorite_book, Genre.all, :books, :name, :id, :title)
|
316
|
+
node.should have_css('label[for="author_favorite_book"]', :text => "Favorite book")
|
317
|
+
node.should have_css('select[name="author[favorite_book]"]')
|
318
|
+
node.should have_css('select[name="author[favorite_book]"] optgroup[label="Exploration"] option[value="78"]', :text => "Gulliver's Travels")
|
319
|
+
node.should have_css('select[name="author[favorite_book]"] optgroup[label="Pirate Exploits"] option[value="133"]', :text => "Treasure Island")
|
320
|
+
end
|
321
|
+
end
|
164
322
|
end
|
165
323
|
|
166
324
|
describe "errors generator" do
|
@@ -177,5 +335,108 @@ describe "FoundationRailsHelper::FormHelper" do
|
|
177
335
|
node.should have_css('small.error', :text => "required")
|
178
336
|
end
|
179
337
|
end
|
338
|
+
%w(file_field email_field text_field telephone_field phone_field
|
339
|
+
url_field number_field date_field datetime_field datetime_local_field
|
340
|
+
month_field week_field time_field range_field search_field color_field
|
341
|
+
|
342
|
+
password_field
|
343
|
+
).each do |field|
|
344
|
+
it "should display errors on #{field} inputs" do
|
345
|
+
form_for(@author) do |builder|
|
346
|
+
@author.stub!(:errors).and_return({:description => ['required']})
|
347
|
+
node = Capybara.string builder.public_send(field, :description)
|
348
|
+
node.should have_css('label.error[for="author_description"]')
|
349
|
+
node.should have_css('input.error[name="author[description]"]')
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
it "should display errors on text_area inputs" do
|
354
|
+
form_for(@author) do |builder|
|
355
|
+
@author.stub!(:errors).and_return({:description => ['required']})
|
356
|
+
node = Capybara.string builder.text_area(:description)
|
357
|
+
node.should have_css('label.error[for="author_description"]')
|
358
|
+
node.should have_css('textarea.error[name="author[description]"]')
|
359
|
+
end
|
360
|
+
end
|
361
|
+
it "should display errors on select inputs" do
|
362
|
+
form_for(@author) do |builder|
|
363
|
+
@author.stub!(:errors).and_return({:favorite_book => ['required']})
|
364
|
+
node = Capybara.string builder.select(:favorite_book, [["Choice #1", :a], ["Choice #2", :b]])
|
365
|
+
node.should have_css('label.error[for="author_favorite_book"]')
|
366
|
+
node.should have_css('select.error[name="author[favorite_book]"]')
|
367
|
+
end
|
368
|
+
end
|
369
|
+
it "should display errors on date_select inputs" do
|
370
|
+
form_for(@author) do |builder|
|
371
|
+
@author.stub!(:errors).and_return({:birthdate => ['required']})
|
372
|
+
node = Capybara.string builder.date_select(:birthdate)
|
373
|
+
node.should have_css('label.error[for="author_birthdate"]')
|
374
|
+
%w(1 2 3).each {|i| node.should have_css("select.error[name='author[birthdate(#{i}i)]']") }
|
375
|
+
end
|
376
|
+
end
|
377
|
+
it "should display errors on datetime_select inputs" do
|
378
|
+
form_for(@author) do |builder|
|
379
|
+
@author.stub!(:errors).and_return({:birthdate => ['required']})
|
380
|
+
node = Capybara.string builder.datetime_select(:birthdate)
|
381
|
+
node.should have_css('label.error[for="author_birthdate"]')
|
382
|
+
%w(1 2 3 4 5).each {|i| node.should have_css("select.error[name='author[birthdate(#{i}i)]']") }
|
383
|
+
end
|
384
|
+
end
|
385
|
+
it "should display errors on time_zone_select inputs" do
|
386
|
+
form_for(@author) do |builder|
|
387
|
+
@author.stub!(:errors).and_return({:time_zone => ['required']})
|
388
|
+
node = Capybara.string builder.time_zone_select(:time_zone)
|
389
|
+
node.should have_css('label.error[for="author_time_zone"]')
|
390
|
+
node.should have_css('select.error[name="author[time_zone]"]')
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
it "should display errors on collection_select inputs" do
|
395
|
+
form_for(@author) do |builder|
|
396
|
+
@author.stub!(:errors).and_return({:favorite_book => ['required']})
|
397
|
+
node = Capybara.string builder.collection_select(:favorite_book, Book.all, :id, :title)
|
398
|
+
node.should have_css('label.error[for="author_favorite_book"]')
|
399
|
+
node.should have_css('select.error[name="author[favorite_book]"]')
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
it "should display errors on grouped_collection_select inputs" do
|
404
|
+
form_for(@author) do |builder|
|
405
|
+
@author.stub!(:errors).and_return({:favorite_book => ['required']})
|
406
|
+
node = Capybara.string builder.grouped_collection_select(:favorite_book, Genre.all, :books, :name, :id, :title)
|
407
|
+
node.should have_css('label.error[for="author_favorite_book"]')
|
408
|
+
node.should have_css('select.error[name="author[favorite_book]"]')
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
# N.B. check_box and radio_button inputs don't have the error class applied
|
413
|
+
|
414
|
+
it "should display HTML errors when the option is specified" do
|
415
|
+
form_for(@author) do |builder|
|
416
|
+
@author.stub!(:errors).and_return({:login => ['required <a href="link_target">link</a>']})
|
417
|
+
node = Capybara.string builder.text_field(:login, html_safe_errors: true)
|
418
|
+
node.should have_link('link', href: 'link_target')
|
419
|
+
end
|
420
|
+
end
|
421
|
+
it "should not display HTML errors when the option is not specified" do
|
422
|
+
form_for(@author) do |builder|
|
423
|
+
@author.stub!(:errors).and_return({:login => ['required <a href="link_target">link</a>']})
|
424
|
+
node = Capybara.string builder.text_field(:login)
|
425
|
+
node.should_not have_link('link', href: 'link')
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
it "should not display labels unless specified in the builder method" do
|
430
|
+
form_for(@author, auto_labels: false) do |builder|
|
431
|
+
node = Capybara.string builder.text_field(:login) +
|
432
|
+
builder.check_box(:active, label: true) +
|
433
|
+
builder.text_field(:description, label: 'Tell me about you')
|
434
|
+
|
435
|
+
node.should_not have_css('label[for="author_login"]')
|
436
|
+
node.should have_css('label[for="author_active"]', text: 'Active')
|
437
|
+
node.should have_css('label[for="author_description"]', text: 'Tell me about you')
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
180
441
|
end
|
181
442
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/mock_rails.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
|
-
require '
|
1
|
+
require 'bundler/setup'
|
2
2
|
require 'active_support'
|
3
3
|
require 'action_pack'
|
4
4
|
require 'action_view'
|
5
5
|
require 'action_controller'
|
6
6
|
require 'action_dispatch'
|
7
|
+
require 'active_model'
|
8
|
+
require 'active_support/core_ext'
|
7
9
|
|
8
10
|
# Thanks to Justin French for formtastic spec
|
9
11
|
module FoundationRailsSpecHelper
|
10
12
|
include ActionPack
|
11
13
|
include ActionView::Context if defined?(ActionView::Context)
|
12
|
-
include
|
14
|
+
include ActionView::RecordIdentifier
|
13
15
|
include ActionView::Helpers::FormHelper
|
14
16
|
include ActionView::Helpers::FormTagHelper
|
15
17
|
include ActionView::Helpers::FormOptionsHelper
|
@@ -23,6 +25,7 @@ module FoundationRailsSpecHelper
|
|
23
25
|
include ActionView::Helpers::AssetTagHelper
|
24
26
|
include ActiveSupport
|
25
27
|
include ActionController::PolymorphicRoutes if defined?(ActionController::PolymorphicRoutes)
|
28
|
+
include ActionDispatch::Routing::UrlFor
|
26
29
|
|
27
30
|
def active_model_validator(kind, attributes, options = {})
|
28
31
|
validator = mock("ActiveModel::Validations::#{kind.to_s.titlecase}Validator", :attributes => attributes, :options => options)
|
@@ -57,6 +60,28 @@ module FoundationRailsSpecHelper
|
|
57
60
|
end
|
58
61
|
end
|
59
62
|
|
63
|
+
class ::Book
|
64
|
+
extend ActiveModel::Naming if defined?(ActiveModel::Naming)
|
65
|
+
include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
|
66
|
+
|
67
|
+
def to_label
|
68
|
+
end
|
69
|
+
|
70
|
+
def persisted?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class ::Genre
|
75
|
+
extend ActiveModel::Naming if defined?(ActiveModel::Naming)
|
76
|
+
include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
|
77
|
+
|
78
|
+
def to_label
|
79
|
+
end
|
80
|
+
|
81
|
+
def persisted?
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
60
85
|
def mock_everything
|
61
86
|
# Resource-oriented styles like form_for(@post) will expect a path method for the object,
|
62
87
|
# so we're defining some here.
|
@@ -76,12 +101,30 @@ module FoundationRailsSpecHelper
|
|
76
101
|
@author.stub!(:active).and_return(true)
|
77
102
|
@author.stub!(:description).and_return('bla bla bla')
|
78
103
|
@author.stub!(:avatar).and_return('avatar.png')
|
79
|
-
@author.stub!(:birthdate).and_return(
|
104
|
+
@author.stub!(:birthdate).and_return(DateTime.parse("1969-06-18 20:30"))
|
80
105
|
@author.stub!(:id).and_return(37)
|
81
106
|
@author.stub!(:new_record?).and_return(false)
|
82
107
|
@author.stub!(:errors).and_return(mock('errors', :[] => nil))
|
83
108
|
@author.stub!(:to_key).and_return(nil)
|
84
109
|
@author.stub!(:persisted?).and_return(nil)
|
110
|
+
@author.stub!(:time_zone).and_return("Perth")
|
111
|
+
@author.stub!(:publish_date).and_return(Date.new( 2000, 1, 1 ))
|
112
|
+
@author.stub!(:forty_two).and_return(@author.birthdate + 42.years)
|
113
|
+
@author.stub!(:favorite_color).and_return("#424242")
|
114
|
+
@author.stub!(:favorite_book).and_return()
|
115
|
+
|
116
|
+
@book_0 = ::Book.new
|
117
|
+
@book_0.stub!(:id).and_return("78")
|
118
|
+
@book_0.stub!(:title).and_return("Gulliver's Travels")
|
119
|
+
@book_1 = ::Book.new
|
120
|
+
@book_1.stub!(:id).and_return("133")
|
121
|
+
@book_1.stub!(:title).and_return("Treasure Island")
|
122
|
+
@genre_0 = ::Genre.new
|
123
|
+
@genre_0.stub!(:name).and_return("Exploration")
|
124
|
+
@genre_0.stub!(:books).and_return([@book_0])
|
125
|
+
@genre_1 = ::Genre.new
|
126
|
+
@genre_1.stub!(:name).and_return("Pirate Exploits")
|
127
|
+
@genre_1.stub!(:books).and_return([@book_1])
|
85
128
|
|
86
129
|
::Author.stub!(:scoped).and_return(::Author)
|
87
130
|
::Author.stub!(:find).and_return([@author])
|
@@ -92,6 +135,9 @@ module FoundationRailsSpecHelper
|
|
92
135
|
::Author.stub!(:content_columns).and_return([mock('column', :name => 'login'), mock('column', :name => 'created_at')])
|
93
136
|
::Author.stub!(:to_key).and_return(nil)
|
94
137
|
::Author.stub!(:persisted?).and_return(nil)
|
138
|
+
|
139
|
+
::Book.stub!(:all).and_return([@book_0, @book_1])
|
140
|
+
::Genre.stub!(:all).and_return([@genre_0, @genre_1])
|
95
141
|
end
|
96
142
|
|
97
143
|
def self.included(base)
|
metadata
CHANGED
@@ -1,80 +1,155 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foundation_rails_helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Sebastien Gruhier
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-10-10 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: railties
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
19
|
+
version: '4.1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 4.1.1
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
25
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '4.1'
|
30
|
+
- - ">="
|
28
31
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
32
|
+
version: 4.1.1
|
30
33
|
- !ruby/object:Gem::Dependency
|
31
34
|
name: actionpack
|
32
35
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
36
|
requirements:
|
35
|
-
- -
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '4.1'
|
40
|
+
- - ">="
|
36
41
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
42
|
+
version: 4.1.1
|
38
43
|
type: :runtime
|
39
44
|
prerelease: false
|
40
45
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
46
|
requirements:
|
43
|
-
- -
|
47
|
+
- - "~>"
|
44
48
|
- !ruby/object:Gem::Version
|
45
|
-
version: '
|
49
|
+
version: '4.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 4.1.1
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: activemodel
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '4.1'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 4.1.1
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '4.1'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 4.1.1
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: activesupport
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '4.1'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.1.1
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '4.1'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 4.1.1
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: tzinfo
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.2'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.2.2
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.2'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 1.2.2
|
46
113
|
- !ruby/object:Gem::Dependency
|
47
114
|
name: rspec-rails
|
48
115
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
116
|
requirements:
|
51
|
-
- -
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '2.8'
|
120
|
+
- - ">="
|
52
121
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
122
|
+
version: 2.8.1
|
54
123
|
type: :development
|
55
124
|
prerelease: false
|
56
125
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
126
|
requirements:
|
59
|
-
- -
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '2.8'
|
130
|
+
- - ">="
|
60
131
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
132
|
+
version: 2.8.1
|
62
133
|
- !ruby/object:Gem::Dependency
|
63
134
|
name: capybara
|
64
135
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
136
|
requirements:
|
67
|
-
- -
|
137
|
+
- - "~>"
|
68
138
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
139
|
+
version: '2.4'
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 2.4.3
|
70
143
|
type: :development
|
71
144
|
prerelease: false
|
72
145
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
146
|
requirements:
|
75
|
-
- -
|
147
|
+
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '2.4'
|
150
|
+
- - ">="
|
76
151
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
152
|
+
version: 2.4.3
|
78
153
|
description: Rails for zurb foundation CSS framework. Form builder, flash message,
|
79
154
|
...
|
80
155
|
email:
|
@@ -83,9 +158,9 @@ executables: []
|
|
83
158
|
extensions: []
|
84
159
|
extra_rdoc_files: []
|
85
160
|
files:
|
86
|
-
- .gitignore
|
87
|
-
- .rspec
|
88
|
-
- .travis.yml
|
161
|
+
- ".gitignore"
|
162
|
+
- ".rspec"
|
163
|
+
- ".travis.yml"
|
89
164
|
- CHANGELOG.md
|
90
165
|
- Gemfile
|
91
166
|
- LICENSE
|
@@ -103,37 +178,32 @@ files:
|
|
103
178
|
- spec/spec_helper.rb
|
104
179
|
- spec/support/mock_rails.rb
|
105
180
|
homepage: http://github.com/sgruhier/foundation_rails_helper
|
106
|
-
licenses:
|
181
|
+
licenses:
|
182
|
+
- MIT
|
183
|
+
metadata: {}
|
107
184
|
post_install_message:
|
108
185
|
rdoc_options: []
|
109
186
|
require_paths:
|
110
187
|
- lib
|
111
188
|
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
-
none: false
|
113
189
|
requirements:
|
114
|
-
- -
|
190
|
+
- - ">="
|
115
191
|
- !ruby/object:Gem::Version
|
116
192
|
version: '0'
|
117
|
-
segments:
|
118
|
-
- 0
|
119
|
-
hash: -422087938175981355
|
120
193
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
194
|
requirements:
|
123
|
-
- -
|
195
|
+
- - ">="
|
124
196
|
- !ruby/object:Gem::Version
|
125
197
|
version: '0'
|
126
|
-
segments:
|
127
|
-
- 0
|
128
|
-
hash: -422087938175981355
|
129
198
|
requirements: []
|
130
199
|
rubyforge_project:
|
131
|
-
rubygems_version:
|
200
|
+
rubygems_version: 2.2.2
|
132
201
|
signing_key:
|
133
|
-
specification_version:
|
202
|
+
specification_version: 4
|
134
203
|
summary: Rails helpers for zurb foundation CSS framework
|
135
204
|
test_files:
|
136
205
|
- spec/foundation_rails_helper/flash_helper_spec.rb
|
137
206
|
- spec/foundation_rails_helper/form_builder_spec.rb
|
138
207
|
- spec/spec_helper.rb
|
139
208
|
- spec/support/mock_rails.rb
|
209
|
+
has_rdoc:
|