formtastic 1.1.0 → 1.2.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/MIT-LICENSE +1 -1
  2. data/README.textile +80 -66
  3. data/generators/form/form_generator.rb +37 -46
  4. data/generators/formtastic/formtastic_generator.rb +10 -8
  5. data/lib/formtastic.rb +318 -227
  6. data/lib/formtastic/i18n.rb +8 -6
  7. data/lib/formtastic/layout_helper.rb +6 -4
  8. data/lib/formtastic/railtie.rb +3 -1
  9. data/lib/formtastic/util.rb +2 -0
  10. data/lib/generators/formtastic/form/form_generator.rb +5 -7
  11. data/lib/generators/formtastic/install/install_generator.rb +2 -9
  12. data/lib/generators/templates/_form.html.erb +5 -0
  13. data/lib/generators/templates/_form.html.haml +4 -0
  14. data/{generators/formtastic → lib/generators}/templates/formtastic.css +25 -11
  15. data/{generators/formtastic → lib/generators}/templates/formtastic.rb +19 -2
  16. data/{generators/formtastic → lib/generators}/templates/formtastic_changes.css +0 -0
  17. metadata +58 -98
  18. data/Rakefile +0 -127
  19. data/generators/form/templates/view__form.html.erb +0 -5
  20. data/generators/form/templates/view__form.html.haml +0 -4
  21. data/generators/formtastic_stylesheets/formtastic_stylesheets_generator.rb +0 -16
  22. data/init.rb +0 -5
  23. data/rails/init.rb +0 -2
  24. data/spec/buttons_spec.rb +0 -166
  25. data/spec/commit_button_spec.rb +0 -401
  26. data/spec/custom_builder_spec.rb +0 -98
  27. data/spec/defaults_spec.rb +0 -20
  28. data/spec/error_proc_spec.rb +0 -27
  29. data/spec/errors_spec.rb +0 -105
  30. data/spec/form_helper_spec.rb +0 -142
  31. data/spec/helpers/layout_helper_spec.rb +0 -21
  32. data/spec/i18n_spec.rb +0 -152
  33. data/spec/include_blank_spec.rb +0 -74
  34. data/spec/input_spec.rb +0 -786
  35. data/spec/inputs/boolean_input_spec.rb +0 -104
  36. data/spec/inputs/check_boxes_input_spec.rb +0 -426
  37. data/spec/inputs/country_input_spec.rb +0 -118
  38. data/spec/inputs/date_input_spec.rb +0 -168
  39. data/spec/inputs/datetime_input_spec.rb +0 -310
  40. data/spec/inputs/file_input_spec.rb +0 -34
  41. data/spec/inputs/hidden_input_spec.rb +0 -78
  42. data/spec/inputs/numeric_input_spec.rb +0 -44
  43. data/spec/inputs/password_input_spec.rb +0 -46
  44. data/spec/inputs/radio_input_spec.rb +0 -243
  45. data/spec/inputs/select_input_spec.rb +0 -546
  46. data/spec/inputs/string_input_spec.rb +0 -64
  47. data/spec/inputs/text_input_spec.rb +0 -34
  48. data/spec/inputs/time_input_spec.rb +0 -206
  49. data/spec/inputs/time_zone_input_spec.rb +0 -110
  50. data/spec/inputs_spec.rb +0 -476
  51. data/spec/label_spec.rb +0 -89
  52. data/spec/semantic_errors_spec.rb +0 -98
  53. data/spec/semantic_fields_for_spec.rb +0 -45
  54. data/spec/spec.opts +0 -2
  55. data/spec/spec_helper.rb +0 -289
  56. data/spec/support/custom_macros.rb +0 -494
  57. data/spec/support/output_buffer.rb +0 -4
  58. data/spec/support/test_environment.rb +0 -45
@@ -1,98 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
-
4
- describe 'Formtastic::SemanticFormHelper.builder' do
5
-
6
- include FormtasticSpecHelper
7
-
8
- class MyCustomFormBuilder < ::Formtastic::SemanticFormBuilder
9
- def awesome_input(method, options)
10
- self.text_field(method)
11
- end
12
- end
13
-
14
- before do
15
- @output_buffer = ''
16
- mock_everything
17
- end
18
-
19
- it 'is the Formtastic::SemanticFormBuilder by default' do
20
- ::Formtastic::SemanticFormHelper.builder.should == ::Formtastic::SemanticFormBuilder
21
- end
22
-
23
- it 'can be configured to use your own custom form builder' do
24
- # Set it to a custom builder class
25
- ::Formtastic::SemanticFormHelper.builder = MyCustomFormBuilder
26
- ::Formtastic::SemanticFormHelper.builder.should == MyCustomFormBuilder
27
-
28
- # Reset it to the default
29
- ::Formtastic::SemanticFormHelper.builder = ::Formtastic::SemanticFormBuilder
30
- ::Formtastic::SemanticFormHelper.builder.should == ::Formtastic::SemanticFormBuilder
31
- end
32
-
33
- it 'should allow custom settings per form builder subclass' do
34
- with_config(:all_fields_required_by_default, true) do
35
- MyCustomFormBuilder.all_fields_required_by_default = false
36
-
37
- MyCustomFormBuilder.all_fields_required_by_default.should be_false
38
- ::Formtastic::SemanticFormBuilder.all_fields_required_by_default.should be_true
39
- end
40
- end
41
-
42
- describe "when using a custom builder" do
43
-
44
- before do
45
- @new_post.stub!(:title)
46
- ::Formtastic::SemanticFormHelper.builder = MyCustomFormBuilder
47
- end
48
-
49
- after do
50
- ::Formtastic::SemanticFormHelper.builder = ::Formtastic::SemanticFormBuilder
51
- end
52
-
53
- describe "semantic_form_for" do
54
-
55
- it "should yield an instance of the custom builder" do
56
- semantic_form_for(@new_post) do |builder|
57
- builder.class.should == MyCustomFormBuilder
58
- end
59
- end
60
-
61
- it "should allow me to call my custom input" do
62
- semantic_form_for(@new_post) do |builder|
63
- concat(builder.input(:title, :as => :awesome))
64
- end
65
- end
66
-
67
- end
68
-
69
- describe "semantic_fields_for" do
70
-
71
- it "should yield an instance of the parent form builder" do
72
- semantic_form_for(@new_post) do |builder|
73
- builder.semantic_fields_for(:author) do |nested_builder|
74
- nested_builder.class.should == MyCustomFormBuilder
75
- end
76
- end
77
- end
78
-
79
- end
80
-
81
- end
82
-
83
- describe "when using a builder passed to form options" do
84
-
85
- describe "semantic_fields_for" do
86
-
87
- it "should yield an instance of the parent form builder" do
88
- semantic_form_for(@new_post, :builder => MyCustomFormBuilder) do |builder|
89
- builder.semantic_fields_for(:author) do |nested_builder|
90
- nested_builder.class.should == MyCustomFormBuilder
91
- end
92
- end
93
- end
94
-
95
- end
96
-
97
- end
98
- end
@@ -1,20 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
-
4
- describe 'Formtastic::SemanticFormBuilder-defaults' do
5
-
6
- # Note: This spec might make better sense somewhere else. Just temporary.
7
-
8
- describe "required string" do
9
-
10
- it "should render proc with I18n correctly" do
11
- ::I18n.backend.store_translations :en, :formtastic => {:required => 'Haha!'}
12
-
13
- required_string = Formtastic::SemanticFormBuilder.required_string
14
- required_string = required_string.is_a?(::Proc) ? required_string.call : required_string.to_s
15
- required_string.should == %{<abbr title="Haha!">*</abbr>}
16
- end
17
-
18
- end
19
-
20
- end
@@ -1,27 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
-
4
- describe 'Rails field_error_proc' do
5
-
6
- include FormtasticSpecHelper
7
-
8
- before do
9
- @output_buffer = ''
10
- mock_everything
11
- end
12
-
13
- it "should not be overridden globally for all form builders" do
14
- current_field_error_proc = ::ActionView::Base.field_error_proc
15
-
16
- semantic_form_for(@new_post) do |builder|
17
- ::ActionView::Base.field_error_proc.should_not == current_field_error_proc
18
- end
19
-
20
- ::ActionView::Base.field_error_proc.should == current_field_error_proc
21
-
22
- form_for(@new_post) do |builder|
23
- ::ActionView::Base.field_error_proc.should == current_field_error_proc
24
- end
25
- end
26
-
27
- end
data/spec/errors_spec.rb DELETED
@@ -1,105 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
-
4
- describe 'SemanticFormBuilder#errors_on' do
5
-
6
- include FormtasticSpecHelper
7
-
8
- before do
9
- @output_buffer = ''
10
- mock_everything
11
- @title_errors = ['must not be blank', 'must be longer than 10 characters', 'must be awesome']
12
- @errors = mock('errors')
13
- @new_post.stub!(:errors).and_return(@errors)
14
- end
15
-
16
- describe 'when there are errors' do
17
- before do
18
- @errors.stub!(:[]).with(:title).and_return(@title_errors)
19
- end
20
-
21
- it 'should render a paragraph with the errors joined into a sentence when inline_errors config is :sentence' do
22
- ::Formtastic::SemanticFormBuilder.inline_errors = :sentence
23
- semantic_form_for(@new_post) do |builder|
24
- builder.errors_on(:title).should have_tag('p.inline-errors', @title_errors.to_sentence)
25
- end
26
- end
27
-
28
- it 'should render an unordered list with the class errors when inline_errors config is :list' do
29
- ::Formtastic::SemanticFormBuilder.inline_errors = :list
30
- semantic_form_for(@new_post) do |builder|
31
- builder.errors_on(:title).should have_tag('ul.errors')
32
- @title_errors.each do |error|
33
- builder.errors_on(:title).should have_tag('ul.errors li', error)
34
- end
35
- end
36
- end
37
-
38
- it 'should render a paragraph with the first error when inline_errors config is :first' do
39
- ::Formtastic::SemanticFormBuilder.inline_errors = :first
40
- semantic_form_for(@new_post) do |builder|
41
- builder.errors_on(:title).should have_tag('p.inline-errors', @title_errors.first)
42
- end
43
- end
44
-
45
- it 'should return nil when inline_errors config is :none' do
46
- ::Formtastic::SemanticFormBuilder.inline_errors = :none
47
- semantic_form_for(@new_post) do |builder|
48
- builder.errors_on(:title).should be_nil
49
- end
50
- end
51
-
52
- end
53
-
54
- describe 'when there are no errors (nil)' do
55
- before do
56
- @errors.stub!(:[]).with(:title).and_return(nil)
57
- end
58
-
59
- it 'should return nil when inline_errors config is :sentence, :list or :none' do
60
- [:sentence, :list, :none].each do |config|
61
- ::Formtastic::SemanticFormBuilder.inline_errors = config
62
- semantic_form_for(@new_post) do |builder|
63
- builder.errors_on(:title).should be_nil
64
- end
65
- end
66
- end
67
- end
68
-
69
- describe 'when there are no errors (empty array)' do
70
- before do
71
- @errors.stub!(:[]).with(:title).and_return([])
72
- end
73
-
74
- it 'should return nil when inline_errors config is :sentence, :list or :none' do
75
- [:sentence, :list, :none].each do |config|
76
- ::Formtastic::SemanticFormBuilder.inline_errors = config
77
- semantic_form_for(@new_post) do |builder|
78
- builder.errors_on(:title).should be_nil
79
- end
80
- end
81
- end
82
- end
83
-
84
-
85
- describe 'when there are errors on the association and column' do
86
-
87
- it "should list all unique errors" do
88
- ::Formtastic::SemanticFormBuilder.inline_errors = :list
89
- ::Post.stub!(:reflections).and_return({:author => mock('reflection', :options => {}, :macro => :belongs_to)})
90
-
91
- @errors.stub!(:[]).with(:author).and_return(['must not be blank'])
92
- @errors.stub!(:[]).with(:author_id).and_return(['is already taken', 'must not be blank']) # note the duplicate of association
93
-
94
- form = semantic_form_for(@new_post) do |builder|
95
- concat(builder.input(:author))
96
- end
97
- output_buffer.concat(form) if Formtastic::Util.rails3?
98
- output_buffer.should have_tag("ul.errors li", /must not be blank/, :count => 1)
99
- output_buffer.should have_tag("ul.errors li", /is already taken/, :count => 1)
100
- end
101
-
102
- end
103
-
104
- end
105
-
@@ -1,142 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
-
4
- describe 'SemanticFormHelper' do
5
-
6
- include FormtasticSpecHelper
7
-
8
- before do
9
- @output_buffer = ''
10
- mock_everything
11
- end
12
-
13
- describe '#semantic_form_for' do
14
-
15
- it 'yields an instance of SemanticFormBuilder' do
16
- semantic_form_for(@new_post, :url => '/hello') do |builder|
17
- builder.class.should == ::Formtastic::SemanticFormBuilder
18
- end
19
- end
20
-
21
- it 'adds a class of "formtastic" to the generated form' do
22
- form = semantic_form_for(@new_post, :url => '/hello') do |builder|
23
- end
24
- output_buffer.concat(form) if Formtastic::Util.rails3?
25
- output_buffer.should have_tag("form.formtastic")
26
- end
27
-
28
- it 'adds class matching the object name to the generated form when a symbol is provided' do
29
- form = semantic_form_for(@new_post, :url => '/hello') do |builder|
30
- end
31
- output_buffer.concat(form) if Formtastic::Util.rails3?
32
- output_buffer.should have_tag("form.post")
33
-
34
- form = semantic_form_for(:project, :url => '/hello') do |builder|
35
- end
36
- output_buffer.concat(form) if Formtastic::Util.rails3?
37
- output_buffer.should have_tag("form.project")
38
- end
39
-
40
- it 'adds class matching the object\'s class to the generated form when an object is provided' do
41
- form = semantic_form_for(@new_post) do |builder|
42
- end
43
- output_buffer.concat(form) if Formtastic::Util.rails3?
44
- output_buffer.should have_tag("form.post")
45
- end
46
-
47
- it 'adds a namespaced class to the generated form' do
48
- form = semantic_form_for(::Namespaced::Post.new, :url => '/hello') do |builder|
49
- end
50
- output_buffer.concat(form) if Formtastic::Util.rails3?
51
- output_buffer.should have_tag("form.namespaced_post")
52
- end
53
-
54
- describe 'allows :html options' do
55
- before(:each) do
56
- @form = semantic_form_for(@new_post, :url => '/hello', :html => { :id => "something-special", :class => "something-extra", :multipart => true }) do |builder|
57
- end
58
- end
59
-
60
- it 'to add a id of "something-special" to generated form' do
61
- output_buffer.concat(@form) if Formtastic::Util.rails3?
62
- output_buffer.should have_tag("form#something-special")
63
- end
64
-
65
- it 'to add a class of "something-extra" to generated form' do
66
- output_buffer.concat(@form) if Formtastic::Util.rails3?
67
- output_buffer.should have_tag("form.something-extra")
68
- end
69
-
70
- it 'to add enctype="multipart/form-data"' do
71
- output_buffer.concat(@form) if Formtastic::Util.rails3?
72
- output_buffer.should have_tag('form[@enctype="multipart/form-data"]')
73
- end
74
- end
75
-
76
- it 'can be called with a resource-oriented style' do
77
- semantic_form_for(@new_post) do |builder|
78
- builder.object.class.should == ::Post
79
- builder.object_name.should == "post"
80
- end
81
- end
82
-
83
- it 'can be called with a generic style and instance variable' do
84
- if rails3?
85
- semantic_form_for(@new_post, :as => :post, :url => new_post_path) do |builder|
86
- builder.object.class.should == ::Post
87
- builder.object_name.to_s.should == "post" # TODO: is this forced .to_s a bad assumption somewhere?
88
- end
89
- end
90
- if rails2?
91
- semantic_form_for(:post, @new_post, :url => new_post_path) do |builder|
92
- builder.object.class.should == ::Post
93
- builder.object_name.to_s.should == "post" # TODO: is this forced .to_s a bad assumption somewhere?
94
- end
95
- end
96
- end
97
-
98
- it 'can be called with a generic style and inline object' do
99
- semantic_form_for(@new_post, :url => new_post_path) do |builder|
100
- builder.object.class.should == ::Post
101
- builder.object_name.to_s.should == "post" # TODO: is this forced .to_s a bad assumption somewhere?
102
- end
103
- end
104
-
105
- describe "with :builder option" do
106
- it "yields an instance of the given builder" do
107
- class MyAwesomeCustomBuilder < ::Formtastic::SemanticFormBuilder
108
- end
109
- semantic_form_for(@new_post, :url => '/hello', :builder => MyAwesomeCustomBuilder) do |builder|
110
- builder.class.should == MyAwesomeCustomBuilder
111
- end
112
- end
113
- end
114
-
115
- end
116
-
117
- describe '#semantic_fields_for' do
118
- it 'yields an instance of SemanticFormBuilder' do
119
- semantic_fields_for(@new_post, :url => '/hello') do |builder|
120
- builder.class.should == ::Formtastic::SemanticFormBuilder
121
- end
122
- end
123
- end
124
-
125
- describe '#semantic_form_remote_for' do
126
- it 'yields an instance of SemanticFormBuilder' do
127
- semantic_form_remote_for(@new_post, :url => '/hello') do |builder|
128
- builder.class.should == ::Formtastic::SemanticFormBuilder
129
- end
130
- end
131
- end
132
-
133
- describe '#semantic_form_for_remote' do
134
- it 'yields an instance of SemanticFormBuilder' do
135
- semantic_remote_form_for(@new_post, :url => '/hello') do |builder|
136
- builder.class.should == ::Formtastic::SemanticFormBuilder
137
- end
138
- end
139
- end
140
-
141
- end
142
-
@@ -1,21 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
-
4
- describe Formtastic::LayoutHelper do
5
-
6
- include FormtasticSpecHelper
7
- include Formtastic::LayoutHelper
8
-
9
- describe '#formtastic_stylesheet_link_tag' do
10
-
11
- it 'should render a link to formtastic.css' do
12
- formtastic_stylesheet_link_tag.should have_tag("link[@href='/stylesheets/formtastic.css']")
13
- end
14
-
15
- it 'should render a link to formtastic_changes.css' do
16
- formtastic_stylesheet_link_tag.should have_tag("link[@href='/stylesheets/formtastic_changes.css']")
17
- end
18
-
19
- end
20
- end
21
-
data/spec/i18n_spec.rb DELETED
@@ -1,152 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
-
4
- describe 'Formtastic::I18n' do
5
-
6
- FORMTASTIC_KEYS = [:required, :yes, :no, :create, :update].freeze
7
-
8
- it "should be defined" do
9
- lambda { ::Formtastic::I18n }.should_not raise_error(::NameError)
10
- end
11
-
12
- describe "default translations" do
13
- it "should be defined" do
14
- lambda { ::Formtastic::I18n::DEFAULT_VALUES }.should_not raise_error(::NameError)
15
- ::Formtastic::I18n::DEFAULT_VALUES.is_a?(::Hash).should == true
16
- end
17
-
18
- it "should exists for the core I18n lookup keys" do
19
- (::Formtastic::I18n::DEFAULT_VALUES.keys & FORMTASTIC_KEYS).size.should == FORMTASTIC_KEYS.size
20
- end
21
- end
22
-
23
- describe "when I18n locales are available" do
24
-
25
- before do
26
- @formtastic_strings = {
27
- :yes => 'Default Yes',
28
- :no => 'Default No',
29
- :create => 'Default Create %{model}',
30
- :update => 'Default Update %{model}',
31
- :custom_scope => {
32
- :duck => 'Duck',
33
- :duck_pond => '%{ducks} ducks in a pond'
34
- }
35
- }
36
- ::I18n.backend.store_translations :en, :formtastic => @formtastic_strings
37
- end
38
-
39
- after do
40
- ::I18n.backend.reload!
41
- end
42
-
43
- it "should translate core strings correctly" do
44
- ::I18n.backend.store_translations :en, {:formtastic => {:required => 'Default Required'}}
45
- ::Formtastic::I18n.t(:required).should == "Default Required"
46
- ::Formtastic::I18n.t(:yes).should == "Default Yes"
47
- ::Formtastic::I18n.t(:no).should == "Default No"
48
- ::Formtastic::I18n.t(:create, :model => 'Post').should == "Default Create Post"
49
- ::Formtastic::I18n.t(:update, :model => 'Post').should == "Default Update Post"
50
- end
51
-
52
- it "should all belong to scope 'formtastic'" do
53
- ::Formtastic::I18n.t(:duck, :scope => [:custom_scope]).should == 'Duck'
54
- end
55
-
56
- it "should override default I18n lookup args if these are specified" do
57
- ::Formtastic::I18n.t(:duck_pond, :scope => [:custom_scope], :ducks => 15).should == '15 ducks in a pond'
58
- end
59
-
60
- it "should be possible to override default values" do
61
- ::Formtastic::I18n.t(:required, :default => 'Nothing found!').should == 'Nothing found!'
62
- end
63
-
64
- end
65
-
66
- describe "when no I18n locales are available" do
67
-
68
- before do
69
- ::I18n.backend.reload!
70
- end
71
-
72
- it "should use default strings" do
73
- (::Formtastic::I18n::DEFAULT_VALUES.keys).each do |key|
74
- ::Formtastic::I18n.t(key, :model => '%{model}').should == ::Formtastic::I18n::DEFAULT_VALUES[key]
75
- end
76
- end
77
-
78
- end
79
-
80
- describe "I18n string lookups" do
81
-
82
- include FormtasticSpecHelper
83
-
84
- before do
85
- @output_buffer = ''
86
- mock_everything
87
-
88
- ::I18n.backend.store_translations :en, :formtastic => {
89
- :labels => {
90
- :title => "Hello world!",
91
- :post => {:title => "Hello post!"},
92
- :project => {:title => "Hello project!", :task => {:name => "Hello task name!"}},
93
- :line_item => {:name => "Hello line item name!"}
94
- }
95
- }
96
- ::Formtastic::SemanticFormBuilder.i18n_lookups_by_default = true
97
-
98
- @new_post.stub!(:title)
99
- @new_post.stub!(:column_for_attribute).with(:title).and_return(mock('column', :type => :string, :limit => 255))
100
- end
101
-
102
- after do
103
- ::I18n.backend.reload!
104
- ::Formtastic::SemanticFormBuilder.i18n_lookups_by_default = false
105
- end
106
-
107
- it "lookup scopes should be defined" do
108
- lambda { ::Formtastic::I18n::SCOPES }.should_not raise_error(::NameError)
109
- end
110
-
111
- it "should be able to translate with namespaced object" do
112
- form = semantic_form_for(@new_post) do |builder|
113
- concat(builder.input(:title))
114
- end
115
- output_buffer.concat(form) if Formtastic::Util.rails3?
116
- output_buffer.should have_tag("form label", /Hello post!/)
117
- end
118
-
119
- it "should be able to translate without form-object" do
120
- form = semantic_form_for(:project, :url => 'http://test.host') do |builder|
121
- concat(builder.input(:title))
122
- end
123
- output_buffer.concat(form) if Formtastic::Util.rails3?
124
- output_buffer.should have_tag("form label", /Hello project!/)
125
- end
126
-
127
- it 'should be able to translate nested objects with nested translations' do
128
- form = semantic_form_for(:project, :url => 'http://test.host') do |builder|
129
- builder.semantic_fields_for(:task) do |f|
130
- concat(f.input(:name))
131
- end
132
- end
133
- output_buffer.concat(form) if Formtastic::Util.rails3?
134
- output_buffer.should have_tag("form label", /Hello task name!/)
135
- end
136
-
137
- it 'should be able to translated nested objects with top level translations' do
138
- form = semantic_form_for(:order, :url => 'http://test.host') do |builder|
139
- builder.semantic_fields_for(:line_item) do |f|
140
- concat(f.input(:name))
141
- end
142
- end
143
- output_buffer.concat(form) if Formtastic::Util.rails3?
144
- output_buffer.should have_tag("form label", /Hello line item name!/)
145
- end
146
-
147
-
148
- # TODO: Add spec for namespaced models?
149
-
150
- end
151
-
152
- end