formtastic 0.9.7 → 0.9.8

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.
@@ -8,37 +8,163 @@ describe 'time input' do
8
8
  before do
9
9
  @output_buffer = ''
10
10
  mock_everything
11
+ end
12
+
13
+ describe "general" do
14
+ before do
15
+ output_buffer.replace ''
16
+ end
17
+
18
+ describe "without seconds" do
19
+ before do
20
+ semantic_form_for(@new_post) do |builder|
21
+ concat(builder.input(:publish_at, :as => :time))
22
+ end
23
+ end
24
+
25
+ it_should_have_input_wrapper_with_class("time")
26
+ it_should_have_input_wrapper_with_id("post_publish_at_input")
27
+ it_should_have_a_nested_fieldset
28
+ it_should_apply_error_logic_for_input_type(:time)
29
+
30
+ it 'should have a legend and label with the label text inside the fieldset' do
31
+ output_buffer.should have_tag('form li.time fieldset legend.label label', /Publish at/)
32
+ end
33
+
34
+ it 'should associate the legend label with the first select' do
35
+ output_buffer.should have_tag('form li.time fieldset legend.label label[@for="post_publish_at_1i"]')
36
+ end
37
+
38
+ it 'should have an ordered list of two items inside the fieldset' do
39
+ output_buffer.should have_tag('form li.time fieldset ol')
40
+ output_buffer.should have_tag('form li.time fieldset ol li', :count => 2)
41
+ end
42
+
43
+ it 'should have five labels for hour and minute' do
44
+ output_buffer.should have_tag('form li.time fieldset ol li label', :count => 2)
45
+ output_buffer.should have_tag('form li.time fieldset ol li label', /hour/i)
46
+ output_buffer.should have_tag('form li.time fieldset ol li label', /minute/i)
47
+ end
11
48
 
12
- semantic_form_for(@new_post) do |builder|
13
- concat(builder.input(:publish_at, :as => :time))
49
+ it 'should have two selects for hour and minute' do
50
+ output_buffer.should have_tag('form li.time fieldset ol li', :count => 2)
51
+ end
14
52
  end
15
- end
16
-
17
- it_should_have_input_wrapper_with_class("time")
18
- it_should_have_input_wrapper_with_id("post_publish_at_input")
19
- it_should_have_a_nested_fieldset
20
- it_should_apply_error_logic_for_input_type(:time)
21
53
 
22
- it 'should have a legend - classified as a label - containing the label text inside the fieldset' do
23
- output_buffer.should have_tag('form li.time fieldset legend.label', /Publish at/)
24
- end
54
+ describe "with seconds" do
55
+ before do
56
+ semantic_form_for(@new_post) do |builder|
57
+ concat(builder.input(:publish_at, :as => :time, :include_seconds => true))
58
+ end
59
+ end
60
+
61
+ it 'should have five labels for hour and minute' do
62
+ output_buffer.should have_tag('form li.time fieldset ol li label', :count => 3)
63
+ output_buffer.should have_tag('form li.time fieldset ol li label', /hour/i)
64
+ output_buffer.should have_tag('form li.time fieldset ol li label', /minute/i)
65
+ output_buffer.should have_tag('form li.time fieldset ol li label', /second/i)
66
+ end
25
67
 
26
- it 'should have an ordered list of two items inside the fieldset' do
27
- output_buffer.should have_tag('form li.time fieldset ol')
28
- output_buffer.should have_tag('form li.time fieldset ol li', :count => 2)
29
- end
68
+ it 'should have three selects for hour, minute and seconds' do
69
+ output_buffer.should have_tag('form li.time fieldset ol li', :count => 3)
70
+ end
30
71
 
31
- it 'should have five labels for hour and minute' do
32
- output_buffer.should have_tag('form li.time fieldset ol li label', :count => 2)
33
- output_buffer.should have_tag('form li.time fieldset ol li label', /hour/i)
34
- output_buffer.should have_tag('form li.time fieldset ol li label', /minute/i)
72
+ it 'should generate a sanitized label and matching ids for attribute' do
73
+ 4.upto(6) do |i|
74
+ output_buffer.should have_tag("form li fieldset ol li label[@for='post_publish_at_#{i}i']")
75
+ output_buffer.should have_tag("form li fieldset ol li #post_publish_at_#{i}i")
76
+ end
77
+ end
78
+ end
35
79
  end
36
80
 
37
- it 'should have two selects for hour and minute' do
38
- output_buffer.should have_tag('form li.time fieldset ol li', :count => 2)
81
+ describe ':selected option' do
82
+
83
+ describe "when the object has a value" do
84
+ it "should select the object value (ignoring :selected)" do
85
+ output_buffer.replace ''
86
+ @new_post.stub!(:created_at => Time.mktime(2012, 11, 30, 21, 45))
87
+ with_deprecation_silenced do
88
+ semantic_form_for(@new_post) do |builder|
89
+ concat(builder.input(:created_at, :as => :time, :selected => Time.mktime(1999, 12, 31, 22, 59)))
90
+ end
91
+ end
92
+ output_buffer.should have_tag("form li ol li select#post_created_at_4i option[@selected]", :count => 1)
93
+ output_buffer.should have_tag("form li ol li select#post_created_at_4i option[@value='21'][@selected]", :count => 1)
94
+ end
95
+ end
96
+
97
+ describe 'when the object has no value' do
98
+ it "should select the :selected if provided as a Time" do
99
+ output_buffer.replace ''
100
+ @new_post.stub!(:created_at => nil)
101
+ with_deprecation_silenced do
102
+ semantic_form_for(@new_post) do |builder|
103
+ concat(builder.input(:created_at, :as => :time, :selected => Time.mktime(1999, 12, 31, 22, 59)))
104
+ end
105
+ end
106
+ output_buffer.should have_tag("form li ol li select#post_created_at_4i option[@selected]", :count => 1)
107
+ output_buffer.should have_tag("form li ol li select#post_created_at_4i option[@value='22'][@selected]", :count => 1)
108
+ end
109
+
110
+ it "should not select an option if the :selected is provided as nil" do
111
+ output_buffer.replace ''
112
+ @new_post.stub!(:created_at => nil)
113
+ with_deprecation_silenced do
114
+ semantic_form_for(@new_post) do |builder|
115
+ concat(builder.input(:created_at, :as => :time, :selected => nil))
116
+ end
117
+ end
118
+ output_buffer.should_not have_tag("form li ol li select#post_created_at_4i option[@selected]")
119
+ end
120
+
121
+ it "should select Time.now if a :selected is not provided" do
122
+ output_buffer.replace ''
123
+ @new_post.stub!(:created_at => nil)
124
+ semantic_form_for(@new_post) do |builder|
125
+ concat(builder.input(:created_at, :as => :time))
126
+ end
127
+ output_buffer.should have_tag("form li ol li select#post_created_at_4i option[@selected]", :count => 1)
128
+ output_buffer.should have_tag("form li ol li select#post_created_at_4i option[@value='#{Time.now.hour.to_s.rjust(2,'0')}'][@selected]", :count => 1)
129
+ end
130
+ end
131
+
39
132
  end
40
-
41
- it_should_select_existing_datetime_else_current(:hour, :minute, :second)
42
- it_should_select_explicit_default_value_if_set(:hour, :minute, :second)
43
-
133
+
134
+ describe ':labels option' do
135
+ fields = [:hour, :minute, :second]
136
+ fields.each do |field|
137
+ it "should replace the #{field} label with the specified text if :labels[:#{field}] is set" do
138
+ output_buffer.replace ''
139
+ semantic_form_for(@new_post) do |builder|
140
+ concat(builder.input(:created_at, :as => :time, :include_seconds => true, :labels => { field => "another #{field} label" }))
141
+ end
142
+ output_buffer.should have_tag('form li.time fieldset ol li label', :count => fields.length)
143
+ fields.each do |f|
144
+ output_buffer.should have_tag('form li.time fieldset ol li label', f == field ? /another #{f} label/i : /#{f}/i)
145
+ end
146
+ end
147
+
148
+ it "should not display the label for the #{field} field when :labels[:#{field}] is blank" do
149
+ output_buffer.replace ''
150
+ semantic_form_for(@new_post) do |builder|
151
+ concat(builder.input(:created_at, :as => :time, :include_seconds => true, :labels => { field => "" }))
152
+ end
153
+ output_buffer.should have_tag('form li.time fieldset ol li label', :count => fields.length-1)
154
+ fields.each do |f|
155
+ output_buffer.should have_tag('form li.time fieldset ol li label', /#{f}/i) unless field == f
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ it 'should warn about :selected deprecation' do
162
+ with_deprecation_silenced do
163
+ ::ActiveSupport::Deprecation.should_receive(:warn).any_number_of_times
164
+ semantic_form_for(@new_post) do |builder|
165
+ concat(builder.input(:created_at, :as => :time, :selected => Time.mktime(1999)))
166
+ end
167
+ end
168
+ end
169
+
44
170
  end
@@ -85,8 +85,10 @@ describe 'time_zone input' do
85
85
  # @new_post.stub!(:time_zone).and_return('Stockholm')
86
86
  @new_post.stub!(:time_zone).and_return(nil)
87
87
 
88
- semantic_form_for(@new_post) do |builder|
89
- concat(builder.input(:time_zone, :as => :time_zone, :selected => 'Melbourne'))
88
+ with_deprecation_silenced do
89
+ semantic_form_for(@new_post) do |builder|
90
+ concat(builder.input(:time_zone, :as => :time_zone, :selected => 'Melbourne'))
91
+ end
90
92
  end
91
93
  end
92
94
 
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ require File.dirname(__FILE__) + '/spec_helper'
3
+
4
+ describe 'LayoutHelper' do
5
+
6
+ include FormtasticSpecHelper
7
+ include Formtastic::LayoutHelper
8
+
9
+ before do
10
+ @output_buffer = ''
11
+ end
12
+
13
+ describe '#formtastic_stylesheet_link_tag' do
14
+
15
+ before do
16
+ concat(formtastic_stylesheet_link_tag())
17
+ end
18
+
19
+ it 'should render a link to formtastic.css' do
20
+ output_buffer.should have_tag("link[@href='/stylesheets/formtastic.css']")
21
+ end
22
+
23
+ it 'should render a link to formtastic_changes.css' do
24
+ output_buffer.should have_tag("link[@href='/stylesheets/formtastic_changes.css']")
25
+ end
26
+
27
+ end
28
+ end
29
+
@@ -0,0 +1,98 @@
1
+ # coding: utf-8
2
+ require File.dirname(__FILE__) + '/spec_helper'
3
+
4
+ describe 'SemanticFormBuilder#semantic_errors' do
5
+
6
+ include FormtasticSpecHelper
7
+
8
+ before do
9
+ @output_buffer = ''
10
+ mock_everything
11
+ @title_errors = ['must not be blank', 'must be awesome']
12
+ @base_errors = ['base error message', 'nasty error']
13
+ @base_error = 'one base error'
14
+ @errors = mock('errors')
15
+ @new_post.stub!(:errors).and_return(@errors)
16
+ end
17
+
18
+ describe 'when there is only one error on base' do
19
+ before do
20
+ @errors.stub!(:on_base).and_return(@base_error)
21
+ end
22
+
23
+ it 'should render an unordered list' do
24
+ semantic_form_for(@new_post) do |builder|
25
+ builder.semantic_errors.should have_tag('ul.errors li', @base_error)
26
+ end
27
+ end
28
+ end
29
+
30
+ describe 'when there is more than one error on base' do
31
+ before do
32
+ @errors.stub!(:on_base).and_return(@base_errors)
33
+ end
34
+
35
+ it 'should render an unordered list' do
36
+ semantic_form_for(@new_post) do |builder|
37
+ builder.semantic_errors.should have_tag('ul.errors')
38
+ @base_errors.each do |error|
39
+ builder.semantic_errors.should have_tag('ul.errors li', error)
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ describe 'when there are errors on title' do
46
+ before do
47
+ @errors.stub!(:[]).with(:title).and_return(@title_errors)
48
+ @errors.stub!(:on_base).and_return([])
49
+ end
50
+
51
+ it 'should render an unordered list' do
52
+ semantic_form_for(@new_post) do |builder|
53
+ title_name = builder.send(:localized_string, :title, :title, :label) || builder.send(:humanized_attribute_name, :title)
54
+ builder.semantic_errors(:title).should have_tag('ul.errors li', title_name << " " << @title_errors.to_sentence)
55
+ end
56
+ end
57
+ end
58
+
59
+ describe 'when there are errors on title and base' do
60
+ before do
61
+ @errors.stub!(:[]).with(:title).and_return(@title_errors)
62
+ @errors.stub!(:on_base).and_return(@base_error)
63
+ end
64
+
65
+ it 'should render an unordered list' do
66
+ semantic_form_for(@new_post) do |builder|
67
+ title_name = builder.send(:localized_string, :title, :title, :label) || builder.send(:humanized_attribute_name, :title)
68
+ builder.semantic_errors(:title).should have_tag('ul.errors li', title_name << " " << @title_errors.to_sentence)
69
+ builder.semantic_errors(:title).should have_tag('ul.errors li', @base_error)
70
+ end
71
+ end
72
+ end
73
+
74
+ describe 'when there are no errors' do
75
+ before do
76
+ @errors.stub!(:[]).with(:title).and_return(nil)
77
+ @errors.stub!(:on_base).and_return(nil)
78
+ end
79
+
80
+ it 'should return nil' do
81
+ semantic_form_for(@new_post) do |builder|
82
+ builder.semantic_errors(:title).should be_nil
83
+ end
84
+ end
85
+ end
86
+
87
+ describe 'when there is one error on base and options with class is passed' do
88
+ before do
89
+ @errors.stub!(:on_base).and_return(@base_error)
90
+ end
91
+
92
+ it 'should render an unordered list with given class' do
93
+ semantic_form_for(@new_post) do |builder|
94
+ builder.semantic_errors(:class => "awesome").should have_tag('ul.awesome li', @base_error)
95
+ end
96
+ end
97
+ end
98
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,24 +1,18 @@
1
1
  # coding: utf-8
2
2
  require 'rubygems'
3
3
 
4
- def smart_require(lib_name, gem_name, gem_version = '>= 0.0.0')
5
- begin
6
- require lib_name if lib_name
7
- rescue LoadError
8
- if gem_name
9
- gem gem_name, gem_version
10
- require lib_name if lib_name
11
- end
12
- end
13
- end
14
-
15
- smart_require 'spec', 'spec', '>= 1.2.6'
16
- smart_require false, 'rspec-rails', '>= 1.2.6'
17
- smart_require 'hpricot', 'hpricot', '>= 0.6.1'
18
- smart_require 'rspec_tag_matchers', 'rspec_tag_matchers', '>= 1.0.0'
19
- smart_require 'active_support', 'activesupport', '>= 2.3.4'
20
- smart_require 'action_controller', 'actionpack', '>= 2.3.4'
21
- smart_require 'action_view', 'actionpack', '>= 2.3.4'
4
+ gem 'activesupport', '2.3.5'
5
+ gem 'actionpack', '2.3.5'
6
+ require 'active_support'
7
+ require 'action_pack'
8
+ require 'action_view'
9
+ require 'action_controller'
10
+
11
+ gem 'rspec', '>= 1.2.6'
12
+ gem 'rspec-rails', '>= 1.2.6'
13
+ gem 'hpricot', '>= 0.6.1'
14
+ gem 'rspec_tag_matchers', '>= 1.0.0'
15
+ require 'rspec_tag_matchers'
22
16
 
23
17
  require 'custom_macros'
24
18
 
@@ -28,6 +22,7 @@ Spec::Runner.configure do |config|
28
22
  end
29
23
 
30
24
  require File.expand_path(File.join(File.dirname(__FILE__), '../lib/formtastic'))
25
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/formtastic/layout_helper'))
31
26
 
32
27
 
33
28
  module FormtasticSpecHelper
@@ -41,6 +36,7 @@ module FormtasticSpecHelper
41
36
  include ActionView::Helpers::RecordIdentificationHelper
42
37
  include ActionView::Helpers::DateHelper
43
38
  include ActionView::Helpers::CaptureHelper
39
+ include ActionView::Helpers::AssetTagHelper
44
40
  include ActiveSupport
45
41
  include ActionController::PolymorphicRoutes
46
42
 
@@ -61,6 +57,12 @@ module FormtasticSpecHelper
61
57
  def id
62
58
  end
63
59
  end
60
+ module ::Namespaced
61
+ class Post
62
+ def id
63
+ end
64
+ end
65
+ end
64
66
  class ::Author
65
67
  def to_label
66
68
  end
@@ -207,6 +209,12 @@ module FormtasticSpecHelper
207
209
  ::Formtastic::SemanticFormBuilder.send(:"#{config_method_name}=", old_value)
208
210
  end
209
211
 
212
+ def with_deprecation_silenced(&block)
213
+ ::ActiveSupport::Deprecation.silenced = true
214
+ yield
215
+ ::ActiveSupport::Deprecation.silenced = false
216
+ end
217
+
210
218
  end
211
219
 
212
220
  ::ActiveSupport::Deprecation.silenced = false
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formtastic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 9
8
+ - 8
9
+ version: 0.9.8
5
10
  platform: ruby
6
11
  authors:
7
12
  - Justin French
@@ -9,49 +14,65 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-12-04 00:00:00 +11:00
17
+ date: 2010-03-31 00:00:00 +11:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: activesupport
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 3
30
+ - 0
23
31
  version: 2.3.0
24
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: actionpack
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - ">="
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 2
43
+ - 3
44
+ - 0
33
45
  version: 2.3.0
34
- version:
46
+ type: :runtime
47
+ version_requirements: *id002
35
48
  - !ruby/object:Gem::Dependency
36
49
  name: rspec-rails
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
40
52
  requirements:
41
53
  - - ">="
42
54
  - !ruby/object:Gem::Version
55
+ segments:
56
+ - 1
57
+ - 2
58
+ - 6
43
59
  version: 1.2.6
44
- version:
60
+ type: :development
61
+ version_requirements: *id003
45
62
  - !ruby/object:Gem::Dependency
46
63
  name: rspec_tag_matchers
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
50
66
  requirements:
51
67
  - - ">="
52
68
  - !ruby/object:Gem::Version
69
+ segments:
70
+ - 1
71
+ - 0
72
+ - 0
53
73
  version: 1.0.0
54
- version:
74
+ type: :development
75
+ version_requirements: *id004
55
76
  description: A Rails form builder plugin/gem with semantically rich and accessible markup
56
77
  email: justin@indent.com.au
57
78
  executables: []
@@ -75,6 +96,7 @@ files:
75
96
  - generators/formtastic_stylesheets/formtastic_stylesheets_generator.rb
76
97
  - lib/formtastic.rb
77
98
  - lib/formtastic/i18n.rb
99
+ - lib/formtastic/layout_helper.rb
78
100
  - lib/locale/en.yml
79
101
  - rails/init.rb
80
102
  - spec/buttons_spec.rb
@@ -105,6 +127,8 @@ files:
105
127
  - spec/inputs/time_zone_input_spec.rb
106
128
  - spec/inputs_spec.rb
107
129
  - spec/label_spec.rb
130
+ - spec/layout_helper_spec.rb
131
+ - spec/semantic_errors_spec.rb
108
132
  - spec/semantic_fields_for_spec.rb
109
133
  - spec/spec.opts
110
134
  - spec/spec_helper.rb
@@ -112,7 +136,7 @@ has_rdoc: true
112
136
  homepage: http://github.com/justinfrench/formtastic/tree/master
113
137
  licenses: []
114
138
 
115
- post_install_message: "\n ========================================================================\n Thanks for installing Formtastic!\n ------------------------------------------------------------------------\n You can now (optionally) run the generator to copy some stylesheets and\n a config initializer into your application:\n ./script/generate formtastic\n\n To generate some semantic form markup for your exisiting models, just run:\n ./script/generate form MODEL_NAME\n\n Find out more and get involved:\n http://github.com/justinfrench/formtastic\n http://groups.google.com.au/group/formtastic\n ========================================================================\n "
139
+ post_install_message: "\n ========================================================================\n Thanks for installing Formtastic!\n ------------------------------------------------------------------------\n You can now (optionally) run the generator to copy some stylesheets and\n a config initializer into your application:\n ./script/generate formtastic\n\n To generate some semantic form markup for your existing models, just run:\n ./script/generate form MODEL_NAME\n\n Find out more and get involved:\n http://github.com/justinfrench/formtastic\n http://groups.google.com.au/group/formtastic\n ========================================================================\n "
116
140
  rdoc_options:
117
141
  - --charset=UTF-8
118
142
  require_paths:
@@ -121,18 +145,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
145
  requirements:
122
146
  - - ">="
123
147
  - !ruby/object:Gem::Version
148
+ segments:
149
+ - 0
124
150
  version: "0"
125
- version:
126
151
  required_rubygems_version: !ruby/object:Gem::Requirement
127
152
  requirements:
128
153
  - - ">="
129
154
  - !ruby/object:Gem::Version
155
+ segments:
156
+ - 0
130
157
  version: "0"
131
- version:
132
158
  requirements: []
133
159
 
134
160
  rubyforge_project:
135
- rubygems_version: 1.3.5
161
+ rubygems_version: 1.3.6
136
162
  signing_key:
137
163
  specification_version: 3
138
164
  summary: A Rails form builder plugin/gem with semantically rich and accessible markup
@@ -165,5 +191,7 @@ test_files:
165
191
  - spec/inputs/time_zone_input_spec.rb
166
192
  - spec/inputs_spec.rb
167
193
  - spec/label_spec.rb
194
+ - spec/layout_helper_spec.rb
195
+ - spec/semantic_errors_spec.rb
168
196
  - spec/semantic_fields_for_spec.rb
169
197
  - spec/spec_helper.rb