foundation_rails_helper_mod 1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZGM1N2E0ZWM1MTkzMzdiOTUxNzRlNGM2ZjU2MjU3NTYzNzZlYWUwMA==
5
+ data.tar.gz: !binary |-
6
+ NGI5NGM2MTk2Yjg2ZDgzZWI1ZGEyODRlYzFiN2UwZjM3ZDcxODE3Yg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ N2RlNGE5NWM5NDdjMmMyYWVkYTRmOGQ2ZjIzYjQ1NjdjZWU2MWZmOTQyNDEz
10
+ OGFlNjAyNjczNTUxZDc1Nzk0MWI0YTVjNDhmMDQxNmQwMjk2YzkxMTY1M2Ni
11
+ ZDI2OTBmNzMzYTdlODg2ZGM2YzY1YjgyYzZiM2MyMmEwM2Y2MmI=
12
+ data.tar.gz: !binary |-
13
+ ZGZiZmM5M2FiMTdlYmFkZGYxZmE5MzRmNjM3YWNmMDJiNzM2N2Q5YzA5ZGZh
14
+ MDQzMjkwYjRiODljYTNmNmI5Y2QxNjU2OTNiMGNjNDAyYTVmOTM5ZjkyZWY4
15
+ ZjY0N2NhMzkzODRiZjk1NmQ0ODBkYWM1ZGJhNzVkZDQ2YmIwMjc=
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .rbenv-gemsets
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ rvm:
2
+ - 1.9.2
3
+ - 1.8.7
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ ## Version 0.1.rc
2
+
3
+ * initial release candidate (Jan 14th, 2012)
4
+
5
+ ## Version 0.2.1
6
+
7
+ * First production release (Jan 14th, 2012)
8
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in foundation_rails_helper_mod.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Sébastien Gruhier
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # FoundationRailsHelperMod [![Build Status](https://secure.travis-ci.org/sgruhier/foundation_rails_helper.png)](http://travis-ci.org/sgruhier/foundation_rails_helper)
2
+
3
+ Based on foundation_rails_helper repo. But fixed.
4
+ _______
5
+
6
+ Gem for Rails 3 applications that use the excellent Zurb Foundation framework.
7
+
8
+ * [Zurb Foundation](https://github.com/zurb/foundation)
9
+ * [Zurb Foundation Rails](https://github.com/zurb/foundation-rails)
10
+
11
+ So far it includes:
12
+
13
+ * A custom FormBuilder that generates a form using the Foundation framework. It replaces the current `form_for` so you don't have to change your Rails code. Error messages are properly displayed.
14
+
15
+ * A `display_flash_messages` helper method that uses Zurb Foundation Alerts UI.
16
+
17
+ This gem has been used with Rails 3.1, 3.2 and ruby 1.9.2, 1.9.3. It should work for Rails 3.0.
18
+
19
+ ## Screenshots
20
+
21
+ ### Forms
22
+ A classic devise sign up view will look like this:
23
+
24
+ ```erb
25
+ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
26
+ <%= f.email_field :email %>
27
+ <%= f.password_field :password %>
28
+ <%= f.password_field :password_confirmation %>
29
+
30
+ <%= f.submit %>
31
+ <% end %>
32
+ ```
33
+
34
+ <table>
35
+ <tr>
36
+ <th>Form</th>
37
+ <th>Form with errors</th>
38
+ </tr>
39
+ <tr>
40
+ <td valign='top'> <img src="http://dl.dropbox.com/u/517768/sign-up.png"/></td>
41
+ <td valign='top'> <img src="http://dl.dropbox.com/u/517768/sign-up-with-errors.png"/></td>
42
+ </tr>
43
+ </table>
44
+
45
+ ### Flash messages
46
+
47
+ ![Flash-message](http://dl.dropbox.com/u/517768/flash.png "Flash-message")
48
+
49
+ ## Installation
50
+
51
+ Add this line to your application's Gemfile:
52
+
53
+ ```ruby
54
+ gem 'zurb-foundation'
55
+ gem 'foundation_rails_helper_mod'
56
+ ```
57
+
58
+ And then execute:
59
+
60
+ ```bash
61
+ $ bundle
62
+ ```
63
+
64
+ ## Usage
65
+
66
+ There is nothing additional to do for form helpers.
67
+
68
+ To get access to `display_flash_messages` in your views, add
69
+
70
+ ```ruby
71
+ include FoundationRailsHelperMod::FlashHelper
72
+ ```
73
+
74
+ to `app/helpers/application_helper.rb`
75
+
76
+ ## TODO
77
+
78
+ * Handle more UI components
79
+ * Make something for ajax forms
80
+
81
+ ## Contributing
82
+
83
+ 1. Fork it
84
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
85
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
86
+ 4. Push to the branch (`git push origin my-new-feature`)
87
+ 5. Create a new Pull Request
88
+
89
+ ## Copyright
90
+
91
+ Sébastien Gruhier (http://xilinus.com, http://v2.maptimize.com) - MIT LICENSE - 2012
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ task :default => :spec
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/foundation_rails_helper_mod/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Alex Zanardo", "Sebastien Gruhier"]
6
+ gem.email = ["info@alexzanardo.com", "sebastien.gruhier@xilinus.com"]
7
+ gem.description = %q{Rails 3 for zurb foundation CSS framework. Form builder, flash message, ...}
8
+ gem.summary = %q{Rails 3 helpers for zurb foundation CSS framework}
9
+ gem.homepage = "https://github.com/responsa/foundation_rails_helper_mod"
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "foundation_rails_helper_mod"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = FoundationRailsHelperMod::VERSION
17
+
18
+ gem.add_dependency 'railties', '~> 3.0'
19
+ gem.add_dependency "actionpack", '~> 3.0'
20
+ gem.add_development_dependency "rspec-rails"
21
+ gem.add_development_dependency "capybara"
22
+ end
@@ -0,0 +1,4 @@
1
+ require "foundation_rails_helper_mod/version"
2
+ require "foundation_rails_helper_mod/form_builder"
3
+ require "foundation_rails_helper_mod/flash_helper"
4
+ require "foundation_rails_helper_mod/action_view_extension"
@@ -0,0 +1,25 @@
1
+ module ActionView
2
+ module Helpers
3
+ module FormHelper
4
+ def form_for_with_foundation(record, options = {}, &block)
5
+ options[:builder] ||= FoundationRailsHelperMod::FormBuilder
6
+ options[:html] ||= {}
7
+ options[:html][:class] ||= 'nice'
8
+ form_for_without_foundation(record, options, &block)
9
+ end
10
+
11
+ def fields_for_with_foundation(record_name, record_object = nil, options = {}, &block)
12
+ options[:builder] ||= FoundationRailsHelperMod::FormBuilder
13
+ options[:html] ||= {}
14
+ options[:html][:class] ||= 'nice'
15
+ fields_for_without_foundation(record_name, record_object, options, &block)
16
+ end
17
+
18
+ alias_method_chain :form_for, :foundation
19
+ alias_method_chain :fields_for, :foundation
20
+ end
21
+ end
22
+ end
23
+ ActionView::Base.field_error_proc = Proc.new do |html_tag, instance_tag|
24
+ html_tag
25
+ end
@@ -0,0 +1,25 @@
1
+ require 'action_view/helpers'
2
+
3
+ module FoundationRailsHelperMod
4
+ module FlashHelper
5
+ # <div class="alert-box [success alert secondary]">
6
+ # This is an alert box.
7
+ # <a href="" class="close">&times;</a>
8
+ # </div>
9
+ DEFAULT_KEY_MATCHING = {
10
+ :alert => :alert,
11
+ :notice => :success,
12
+ :info => :standard,
13
+ :secondary => :secondary,
14
+ }
15
+ def display_flash_messages(key_matching = {})
16
+ key_matching = DEFAULT_KEY_MATCHING.merge(key_matching)
17
+
18
+ flash.inject "" do |message, (key, value)|
19
+ message += content_tag :div, :class => "alert-box #{key_matching[key] || :standard}" do
20
+ (value + link_to("&times;".html_safe, "#", :class => :close)).html_safe
21
+ end
22
+ end.html_safe
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,140 @@
1
+ require 'action_view/helpers'
2
+
3
+ module FoundationRailsHelperMod
4
+ class FormBuilder < ActionView::Helpers::FormBuilder
5
+ include ActionView::Helpers::TagHelper
6
+ %w(file_field email_field text_area telephone_field phone_field url_field number_field).each do |method_name|
7
+ define_method(method_name) do |*args|
8
+ attribute = args[0]
9
+ options = args[1] || {}
10
+ field(attribute, options) do |options|
11
+ super(attribute, options)
12
+ end
13
+ end
14
+ end
15
+
16
+ def text_field(attribute, options = {})
17
+ html = ''.html_safe
18
+
19
+ if options[:label].present?
20
+ html = custom_label(attribute, options[:label], options[:label_options]) do
21
+ options.delete(:label)
22
+ options.delete(:label_options)
23
+ super(attribute, options)
24
+ end
25
+ end
26
+
27
+ html += content_tag(:p, options[:description], :class => 'description') if options[:description].present?
28
+ html += error_and_hint(attribute, options)
29
+ html += Tags::TextField.new(object_name, method, self, options).render
30
+ end
31
+
32
+ def check_box(attribute, options = {})
33
+ html = custom_label(attribute, options[:label], options[:label_options]) do
34
+ options.delete(:label)
35
+ options.delete(:label_options)
36
+ super(attribute, options)
37
+ end
38
+
39
+ html += content_tag(:p, options[:description], :class => 'description') if options[:description].present?
40
+ html += error_and_hint(attribute, options)
41
+ end
42
+
43
+ def radio_button(attribute, tag_value, options = {})
44
+ options[:for] ||= "#{object.class.to_s.downcase}_#{attribute}_#{tag_value}"
45
+ l = label(attribute, options)
46
+ c = super(attribute, tag_value, options)
47
+ l.gsub(/(for=\"\w*\"\>)/, "\\1#{c} ").html_safe
48
+ end
49
+
50
+ def password_field(attribute, options = {})
51
+ field attribute, options do |options|
52
+ super(attribute, options.merge(:autocomplete => :off))
53
+ end
54
+ end
55
+
56
+ def datetime_select(attribute, options = {})
57
+ field attribute, options do |options|
58
+ super(attribute, {}, options.merge(:autocomplete => :off))
59
+ end
60
+ end
61
+
62
+ def date_select(attribute, options = {}, html_options = {})
63
+ field attribute, html_options do |html_options|
64
+ super(attribute, options, html_options.merge(:autocomplete => :off))
65
+ end
66
+ end
67
+
68
+ def time_zone_select(attribute, options = {})
69
+ field attribute, options do |options|
70
+ super(attribute, {}, options.merge(:autocomplete => :off))
71
+ end
72
+ end
73
+
74
+ def select(attribute, choices, options = {}, html_options = {})
75
+ field attribute, options do |options|
76
+ html_options[:autocomplete] ||= :off
77
+ super(attribute, choices, options, html_options)
78
+ end
79
+ end
80
+
81
+ def autocomplete(attribute, url, options = {})
82
+ field attribute, options do |options|
83
+ autocomplete_field(attribute, url, options.merge(:update_elements => options[:update_elements],
84
+ :min_length => 0,
85
+ :value => object.send(attribute)))
86
+ end
87
+ end
88
+
89
+ def submit(value=nil, options={})
90
+ options[:class] ||= "small radius success button"
91
+ super(value, options)
92
+ end
93
+
94
+ private
95
+ def has_error?(attribute)
96
+ object && !object.errors[attribute].blank?
97
+ end
98
+
99
+ def error_for(attribute, options = {})
100
+ class_name = "error"
101
+ class_name += " #{options[:class]}" if options[:class]
102
+ content_tag(:small, object.errors[attribute].join(', '), :class => class_name) if has_error?(attribute)
103
+ end
104
+
105
+ def custom_label(attribute, text, options, &block)
106
+ if text == false
107
+ text = ""
108
+ elsif text.nil?
109
+ text = object.class.human_attribute_name(attribute)
110
+ end
111
+ text = block.call.html_safe + text if block_given?
112
+ options ||= {}
113
+ options[:class] ||= ""
114
+ options[:class] += " error" if has_error?(attribute)
115
+ label(attribute, text, options)
116
+ end
117
+
118
+ def error_and_hint(attribute, options = {})
119
+ html = ""
120
+ html += content_tag(:span, options[:hint], :class => :hint) if options[:hint]
121
+ html += error_for(attribute, options) || ""
122
+ html.html_safe
123
+ end
124
+
125
+ def field(attribute, options, &block)
126
+ html = ''.html_safe
127
+ html = custom_label(attribute, options[:label], options[:label_options]) if false != options[:label]
128
+ options[:class] ||= "medium"
129
+ options[:class] = "#{options[:class]} input-text"
130
+ options[:class] += " error" if has_error?(attribute)
131
+ options.delete(:label)
132
+ options.delete(:label_options)
133
+ html += '<div class="input-wrapper">'.html_safe
134
+ html += yield(options)
135
+ html += content_tag(:p, options[:description], :class => 'description') if options[:description].present?
136
+ html += error_and_hint(attribute, options)
137
+ html += '</div>'.html_safe
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,3 @@
1
+ module FoundationRailsHelperMod
2
+ VERSION = "1.0"
3
+ end
data/lib/railtie.rb ADDED
@@ -0,0 +1,8 @@
1
+ module Railtie
2
+ class Railtie < Rails::Railtie
3
+ # initializer 'setup foundation form builder' do
4
+ #
5
+ # end
6
+ end
7
+
8
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe FoundationRailsHelperMod::FlashHelper do
6
+ include ActionView::Context if defined?(ActionView::Context)
7
+ include ActionView::Helpers::UrlHelper
8
+ include ActionView::Helpers::TagHelper
9
+ include FoundationRailsHelperMod::FlashHelper
10
+
11
+ FoundationRailsHelperMod::FlashHelper::DEFAULT_KEY_MATCHING.each do |message_type, foundation_type|
12
+ it "displays flash message with #{foundation_type} class for #{message_type} message" do
13
+ self.stub!(:flash).and_return({message_type => "Flash message"})
14
+ node = Capybara.string display_flash_messages
15
+ node.should have_css("div.alert-box.#{foundation_type}", :text => "Flash message")
16
+ node.should have_css("div.alert-box a.close", :text => "×")
17
+ end
18
+ end
19
+
20
+ it "displays flash message with overridden key matching" do
21
+ self.stub!(:flash).and_return({:notice => "Flash message"})
22
+ node = Capybara.string display_flash_messages({:notice => :alert})
23
+ node.should have_css("div.alert-box.alert")
24
+ end
25
+
26
+ it "displays flash message with custom key matching" do
27
+ self.stub!(:flash).and_return({:custom_type => "Flash message"})
28
+ node = Capybara.string display_flash_messages({:custom_type => :custom_class})
29
+ node.should have_css("div.alert-box.custom_class")
30
+ end
31
+
32
+ it "displays flash message with standard class if key doesn't match" do
33
+ self.stub!(:flash).and_return({:custom_type => "Flash message"})
34
+ node = Capybara.string display_flash_messages
35
+ node.should have_css("div.alert-box.standard")
36
+ end
37
+ end
@@ -0,0 +1,173 @@
1
+ require "spec_helper"
2
+
3
+ describe "FoundationRailsHelperMod::FormHelper" do
4
+ include FoundationRailsSpecHelper
5
+
6
+ before do
7
+ mock_everything
8
+ end
9
+
10
+ it 'should have FoundationRailsHelperMod::FormHelper as default buidler' do
11
+ form_for(@author) do |builder|
12
+ builder.class.should == FoundationRailsHelperMod::FormBuilder
13
+ end
14
+ end
15
+
16
+ describe "input generators" do
17
+ it "should generate text_field input" do
18
+ form_for(@author) do |builder|
19
+ node = Capybara.string builder.text_field(:login)
20
+ node.should have_css('label[for="author_login"]', :text => "Login")
21
+ node.should have_css('input.medium.input-text[type="text"][name="author[login]"]')
22
+ node.find_field('author_login').value.should == @author.login
23
+ end
24
+ end
25
+
26
+ it "should generate text_field input without label" do
27
+ form_for(@author) do |builder|
28
+ node = Capybara.string builder.text_field(:login, :label => false)
29
+ node.should_not have_css('label[for="author_login"]', :text => "Login")
30
+ node.should have_css('input.medium.input-text[type="text"][name="author[login]"]')
31
+ node.find_field('author_login').value.should == @author.login
32
+ end
33
+ end
34
+
35
+ it "should generate password_field input" do
36
+ form_for(@author) do |builder|
37
+ node = Capybara.string builder.password_field(:password)
38
+ node.should have_css('label[for="author_password"]', :text => "Password")
39
+ node.should have_css('input.medium.input-text[type="password"][name="author[password]"]')
40
+ node.find_field('author_password').value.should be_nil
41
+ end
42
+ end
43
+
44
+ it "should generate email_field input" do
45
+ form_for(@author) do |builder|
46
+ node = Capybara.string builder.email_field(:email)
47
+ node.should have_css('label[for="author_email"]', :text => "Email")
48
+ node.should have_css('input.medium.input-text[type="email"][name="author[email]"]')
49
+ node.find_field('author_email').value.should == @author.email
50
+ end
51
+ end
52
+
53
+ it "should generate url_field input" do
54
+ form_for(@author) do |builder|
55
+ node = Capybara.string builder.url_field(:url)
56
+ node.should have_css('label[for="author_url"]', :text => "Url")
57
+ node.should have_css('input.medium.input-text[type="url"][name="author[url]"]')
58
+ node.find_field('author_url').value.should == @author.url
59
+ end
60
+ end
61
+
62
+ it "should generate phone_field input" do
63
+ form_for(@author) do |builder|
64
+ node = Capybara.string builder.phone_field(:phone)
65
+ node.should have_css('label[for="author_phone"]', :text => "Phone")
66
+ node.should have_css('input.medium.input-text[type="tel"][name="author[phone]"]')
67
+ node.find_field('author_phone').value.should == @author.phone
68
+ end
69
+ end
70
+
71
+ it "should generate number_field input" do
72
+ form_for(@author) do |builder|
73
+ node = Capybara.string builder.number_field(:some_number)
74
+ node.should have_css('label[for="author_some_number"]', :text => "Some number")
75
+ node.should have_css('input.medium.input-text[type="number"][name="author[some_number]"]')
76
+ node.find_field('author_some_number').value.should == @author.some_number
77
+ end
78
+ end
79
+
80
+ it "should generate text_area input" do
81
+ form_for(@author) do |builder|
82
+ node = Capybara.string builder.text_area(:description)
83
+ node.should have_css('label[for="author_description"]', :text => "Description")
84
+ node.should have_css('textarea.medium.input-text[name="author[description]"]')
85
+ node.find_field('author_description').value.strip.should == @author.description
86
+ end
87
+ end
88
+
89
+ it "should generate file_field input" do
90
+ form_for(@author) do |builder|
91
+ node = Capybara.string builder.file_field(:avatar)
92
+ node.should have_css('label[for="author_avatar"]', :text => "Avatar")
93
+ node.should have_css('input.medium.input-text[type="file"][name="author[avatar]"]')
94
+ node.find_field('author_avatar').value.should be_nil
95
+ end
96
+ end
97
+
98
+ it "should generate select input" do
99
+ form_for(@author) do |builder|
100
+ node = Capybara.string builder.select(:description, [["Choice #1", :a], ["Choice #2", :b]])
101
+ node.should have_css('label[for="author_description"]', :text => "Description")
102
+ node.should have_css('select[name="author[description]"]')
103
+ node.should have_css('select[name="author[description]"] option[value="a"]', :text => "Choice #1")
104
+ node.should have_css('select[name="author[description]"] option[value="b"]', :text => "Choice #2")
105
+ end
106
+ end
107
+
108
+ it "should generate check_box input" do
109
+ form_for(@author) do |builder|
110
+ node = Capybara.string builder.check_box(:active)
111
+ node.should have_css('label[for="author_active"] input[type="hidden"][name="author[active]"][value="0"]')
112
+ node.should have_css('label[for="author_active"] input[type="checkbox"][name="author[active]"]')
113
+ node.should have_css('label[for="author_active"]', :text => "Active")
114
+ end
115
+ end
116
+ it "should generate check_box input without a label" do
117
+ form_for(@author) do |builder|
118
+ node = Capybara.string builder.check_box(:active, :label => false)
119
+ node.should have_css('label[for="author_active"] input[type="hidden"][name="author[active]"][value="0"]')
120
+ node.should have_css('label[for="author_active"] input[type="checkbox"][name="author[active]"]')
121
+ node.should have_css('label[for="author_active"]', :text => "")
122
+ end
123
+ end
124
+
125
+ it "should generate radio_button input" do
126
+ form_for(@author) do |builder|
127
+ node = Capybara.string builder.label(:active) + builder.radio_button(:active, "ok")
128
+ node.should have_css('label[for="author_active_ok"] input[type="radio"][name="author[active]"]')
129
+ end
130
+ end
131
+
132
+ it "should generate date_select input" do
133
+ form_for(@author) do |builder|
134
+ node = Capybara.string builder.label(:birthdate) + builder.date_select(:birthdate)
135
+ node.should have_css('label[for="author_birthdate"]', :text => "Birthdate")
136
+ %w(1 2 3).each {|i| node.should have_css("select.medium.input-text[name='author[birthdate(#{i}i)]']") }
137
+ node.should have_css('select#author_birthdate_1i option[selected="selected"][value="1969"]')
138
+ node.should have_css('select#author_birthdate_2i option[selected="selected"][value="6"]')
139
+ node.should have_css('select#author_birthdate_3i option[selected="selected"][value="18"]')
140
+ %w(4 5).each {|i| node.should_not have_css("select.medium.input-text[name='author[birthdate(#{i}i)]']") }
141
+ end
142
+ end
143
+
144
+ it "should generate date_select input with :discard_year => true" do
145
+ form_for(@author) do |builder|
146
+ node = Capybara.string builder.label(:birthdate) + builder.date_select(:birthdate, :discard_year => true)
147
+ node.should have_css('label[for="author_birthdate"]', :text => "Birthdate")
148
+ %w(2 3).each {|i| node.should have_css("select.medium.input-text[name='author[birthdate(#{i}i)]']") }
149
+ node.should_not have_css('select#author_birthdate_1i option[selected="selected"][value="1969"]')
150
+ node.should have_css('select#author_birthdate_2i option[selected="selected"][value="6"]')
151
+ node.should have_css('select#author_birthdate_3i option[selected="selected"][value="18"]')
152
+ %w(1 4 5).each {|i| node.should_not have_css("select.medium.input-text[name='author[birthdate(#{i}i)]']") }
153
+ end
154
+ end
155
+
156
+ end
157
+
158
+ describe "errors generator" do
159
+ it "should not display errors" do
160
+ form_for(@author) do |builder|
161
+ node = Capybara.string builder.text_field(:login)
162
+ node.should_not have_css('small.error')
163
+ end
164
+ end
165
+ it "should display errors" do
166
+ form_for(@author) do |builder|
167
+ @author.stub!(:errors).and_return({:login => ['required']})
168
+ node = Capybara.string builder.text_field(:login)
169
+ node.should have_css('small.error', :text => "required")
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
2
+ require "foundation_rails_helper_mod"
3
+ require "capybara"
@@ -0,0 +1,107 @@
1
+ require 'rails'
2
+ require 'active_support'
3
+ require 'action_pack'
4
+ require 'action_view'
5
+ require 'action_controller'
6
+ require 'action_dispatch'
7
+
8
+ # Thanks to Justin French for formtastic spec
9
+ module FoundationRailsSpecHelper
10
+ include ActionPack
11
+ include ActionView::Context if defined?(ActionView::Context)
12
+ include ActionController::RecordIdentifier
13
+ include ActionView::Helpers::FormHelper
14
+ include ActionView::Helpers::FormTagHelper
15
+ include ActionView::Helpers::FormOptionsHelper
16
+ include ActionView::Helpers::UrlHelper
17
+ include ActionView::Helpers::TagHelper
18
+ include ActionView::Helpers::TextHelper
19
+ include ActionView::Helpers::ActiveRecordHelper if defined?(ActionView::Helpers::ActiveRecordHelper)
20
+ include ActionView::Helpers::ActiveModelHelper if defined?(ActionView::Helpers::ActiveModelHelper)
21
+ include ActionView::Helpers::DateHelper
22
+ include ActionView::Helpers::CaptureHelper
23
+ include ActionView::Helpers::AssetTagHelper
24
+ include ActiveSupport
25
+ include ActionController::PolymorphicRoutes if defined?(ActionController::PolymorphicRoutes)
26
+
27
+ def active_model_validator(kind, attributes, options = {})
28
+ validator = mock("ActiveModel::Validations::#{kind.to_s.titlecase}Validator", :attributes => attributes, :options => options)
29
+ validator.stub!(:kind).and_return(kind)
30
+ validator
31
+ end
32
+
33
+ def active_model_presence_validator(attributes, options = {})
34
+ active_model_validator(:presence, attributes, options)
35
+ end
36
+
37
+ def active_model_length_validator(attributes, options = {})
38
+ active_model_validator(:length, attributes, options)
39
+ end
40
+
41
+ def active_model_inclusion_validator(attributes, options = {})
42
+ active_model_validator(:inclusion, attributes, options)
43
+ end
44
+
45
+ def active_model_numericality_validator(attributes, options = {})
46
+ active_model_validator(:numericality, attributes, options)
47
+ end
48
+
49
+ class ::Author
50
+ extend ActiveModel::Naming if defined?(ActiveModel::Naming)
51
+ include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
52
+
53
+ def to_label
54
+ end
55
+
56
+ def persisted?
57
+ end
58
+ end
59
+
60
+ def mock_everything
61
+ # Resource-oriented styles like form_for(@post) will expect a path method for the object,
62
+ # so we're defining some here.
63
+ def author_path(*args); "/authors/1"; end
64
+ def authors_path(*args); "/authors"; end
65
+ def new_author_path(*args); "/authors/new"; end
66
+
67
+ @author = ::Author.new
68
+ @author.stub!(:class).and_return(::Author)
69
+ @author.stub!(:to_label).and_return('Fred Smith')
70
+ @author.stub!(:login).and_return('fred_smith')
71
+ @author.stub!(:email).and_return('fred@foo.com')
72
+ @author.stub!(:url).and_return('http://example.com')
73
+ @author.stub!(:some_number).and_return('42')
74
+ @author.stub!(:phone).and_return('317 456 2564')
75
+ @author.stub!(:password).and_return('secret')
76
+ @author.stub!(:active).and_return(true)
77
+ @author.stub!(:description).and_return('bla bla bla')
78
+ @author.stub!(:avatar).and_return('avatar.png')
79
+ @author.stub!(:birthdate).and_return(Date.parse("1969-06-18 20:30"))
80
+ @author.stub!(:id).and_return(37)
81
+ @author.stub!(:new_record?).and_return(false)
82
+ @author.stub!(:errors).and_return(mock('errors', :[] => nil))
83
+ @author.stub!(:to_key).and_return(nil)
84
+ @author.stub!(:persisted?).and_return(nil)
85
+
86
+ ::Author.stub!(:scoped).and_return(::Author)
87
+ ::Author.stub!(:find).and_return([@author])
88
+ ::Author.stub!(:all).and_return([@author])
89
+ ::Author.stub!(:where).and_return([@author])
90
+ ::Author.stub!(:human_attribute_name).and_return { |column_name| column_name.to_s.humanize }
91
+ ::Author.stub!(:human_name).and_return('::Author')
92
+ ::Author.stub!(:content_columns).and_return([mock('column', :name => 'login'), mock('column', :name => 'created_at')])
93
+ ::Author.stub!(:to_key).and_return(nil)
94
+ ::Author.stub!(:persisted?).and_return(nil)
95
+ end
96
+
97
+ def self.included(base)
98
+ base.class_eval do
99
+ attr_accessor :output_buffer
100
+
101
+ def protect_against_forgery?
102
+ false
103
+ end
104
+
105
+ end
106
+ end
107
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: foundation_rails_helper_mod
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Alex Zanardo
8
+ - Sebastien Gruhier
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-11-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: railties
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '3.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '3.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: actionpack
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: '3.0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec-rails
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: capybara
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: Rails 3 for zurb foundation CSS framework. Form builder, flash message,
71
+ ...
72
+ email:
73
+ - info@alexzanardo.com
74
+ - sebastien.gruhier@xilinus.com
75
+ executables: []
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - .gitignore
80
+ - .rspec
81
+ - .travis.yml
82
+ - CHANGELOG.md
83
+ - Gemfile
84
+ - LICENSE
85
+ - README.md
86
+ - Rakefile
87
+ - foundation_rails_helper_mod.gemspec
88
+ - lib/foundation_rails_helper_mod.rb
89
+ - lib/foundation_rails_helper_mod/action_view_extension.rb
90
+ - lib/foundation_rails_helper_mod/flash_helper.rb
91
+ - lib/foundation_rails_helper_mod/form_builder.rb
92
+ - lib/foundation_rails_helper_mod/version.rb
93
+ - lib/railtie.rb
94
+ - spec/foundation_rails_helper_mod/flash_helper_spec.rb
95
+ - spec/foundation_rails_helper_mod/form_builder_spec.rb
96
+ - spec/spec_helper.rb
97
+ - spec/support/mock_rails.rb
98
+ homepage: https://github.com/responsa/foundation_rails_helper_mod
99
+ licenses: []
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.5.0
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Rails 3 helpers for zurb foundation CSS framework
121
+ test_files:
122
+ - spec/foundation_rails_helper_mod/flash_helper_spec.rb
123
+ - spec/foundation_rails_helper_mod/form_builder_spec.rb
124
+ - spec/spec_helper.rb
125
+ - spec/support/mock_rails.rb