formtastic 3.0.0 → 5.0.0

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.
Files changed (175) hide show
  1. checksums.yaml +5 -13
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/test.yml +61 -0
  4. data/.gitignore +3 -2
  5. data/CHANGELOG.md +61 -0
  6. data/Gemfile.lock +140 -0
  7. data/MIT-LICENSE +1 -1
  8. data/{README.textile → README.md} +191 -168
  9. data/RELEASE_PROCESS +3 -1
  10. data/Rakefile +24 -8
  11. data/app/assets/stylesheets/formtastic.css +1 -1
  12. data/bin/appraisal +8 -0
  13. data/formtastic.gemspec +13 -17
  14. data/gemfiles/rails_6.0/Gemfile +5 -0
  15. data/gemfiles/rails_6.1/Gemfile +5 -0
  16. data/gemfiles/rails_7.0/Gemfile +5 -0
  17. data/gemfiles/rails_7.1/Gemfile +5 -0
  18. data/gemfiles/rails_edge/Gemfile +13 -0
  19. data/lib/formtastic/action_class_finder.rb +19 -0
  20. data/lib/formtastic/actions/base.rb +1 -0
  21. data/lib/formtastic/actions/button_action.rb +56 -53
  22. data/lib/formtastic/actions/buttonish.rb +1 -0
  23. data/lib/formtastic/actions/input_action.rb +60 -57
  24. data/lib/formtastic/actions/link_action.rb +69 -67
  25. data/lib/formtastic/actions.rb +7 -3
  26. data/lib/formtastic/deprecation.rb +6 -0
  27. data/lib/formtastic/engine.rb +4 -1
  28. data/lib/formtastic/form_builder.rb +32 -25
  29. data/lib/formtastic/helpers/action_helper.rb +22 -31
  30. data/lib/formtastic/helpers/actions_helper.rb +1 -0
  31. data/lib/formtastic/helpers/enum.rb +14 -0
  32. data/lib/formtastic/helpers/errors_helper.rb +3 -2
  33. data/lib/formtastic/helpers/fieldset_wrapper.rb +16 -11
  34. data/lib/formtastic/helpers/file_column_detection.rb +1 -0
  35. data/lib/formtastic/helpers/form_helper.rb +4 -3
  36. data/lib/formtastic/helpers/input_helper.rb +59 -80
  37. data/lib/formtastic/helpers/inputs_helper.rb +33 -27
  38. data/lib/formtastic/helpers/reflection.rb +5 -4
  39. data/lib/formtastic/helpers.rb +2 -2
  40. data/lib/formtastic/html_attributes.rb +13 -1
  41. data/lib/formtastic/i18n.rb +2 -1
  42. data/lib/formtastic/input_class_finder.rb +19 -0
  43. data/lib/formtastic/inputs/base/associations.rb +1 -0
  44. data/lib/formtastic/inputs/base/choices.rb +4 -3
  45. data/lib/formtastic/inputs/base/collections.rb +47 -11
  46. data/lib/formtastic/inputs/base/database.rb +8 -5
  47. data/lib/formtastic/inputs/base/datetime_pickerish.rb +1 -0
  48. data/lib/formtastic/inputs/base/errors.rb +7 -6
  49. data/lib/formtastic/inputs/base/fileish.rb +1 -0
  50. data/lib/formtastic/inputs/base/hints.rb +2 -1
  51. data/lib/formtastic/inputs/base/html.rb +12 -10
  52. data/lib/formtastic/inputs/base/labelling.rb +3 -2
  53. data/lib/formtastic/inputs/base/naming.rb +5 -4
  54. data/lib/formtastic/inputs/base/numeric.rb +1 -0
  55. data/lib/formtastic/inputs/base/options.rb +3 -3
  56. data/lib/formtastic/inputs/base/placeholder.rb +1 -0
  57. data/lib/formtastic/inputs/base/stringish.rb +1 -0
  58. data/lib/formtastic/inputs/base/timeish.rb +9 -4
  59. data/lib/formtastic/inputs/base/validations.rb +39 -12
  60. data/lib/formtastic/inputs/base/wrapping.rb +2 -3
  61. data/lib/formtastic/inputs/base.rb +17 -12
  62. data/lib/formtastic/inputs/boolean_input.rb +2 -1
  63. data/lib/formtastic/inputs/check_boxes_input.rb +16 -24
  64. data/lib/formtastic/inputs/color_input.rb +1 -1
  65. data/lib/formtastic/inputs/country_input.rb +4 -1
  66. data/lib/formtastic/inputs/datalist_input.rb +42 -0
  67. data/lib/formtastic/inputs/date_picker_input.rb +1 -0
  68. data/lib/formtastic/inputs/date_select_input.rb +1 -0
  69. data/lib/formtastic/inputs/datetime_picker_input.rb +1 -0
  70. data/lib/formtastic/inputs/datetime_select_input.rb +1 -0
  71. data/lib/formtastic/inputs/email_input.rb +1 -0
  72. data/lib/formtastic/inputs/file_input.rb +3 -2
  73. data/lib/formtastic/inputs/hidden_input.rb +3 -2
  74. data/lib/formtastic/inputs/number_input.rb +1 -0
  75. data/lib/formtastic/inputs/password_input.rb +1 -0
  76. data/lib/formtastic/inputs/phone_input.rb +1 -0
  77. data/lib/formtastic/inputs/radio_input.rb +26 -21
  78. data/lib/formtastic/inputs/range_input.rb +1 -0
  79. data/lib/formtastic/inputs/search_input.rb +1 -0
  80. data/lib/formtastic/inputs/select_input.rb +32 -10
  81. data/lib/formtastic/inputs/string_input.rb +1 -0
  82. data/lib/formtastic/inputs/text_input.rb +1 -0
  83. data/lib/formtastic/inputs/time_picker_input.rb +1 -0
  84. data/lib/formtastic/inputs/time_select_input.rb +1 -0
  85. data/lib/formtastic/inputs/time_zone_input.rb +17 -6
  86. data/lib/formtastic/inputs/url_input.rb +1 -0
  87. data/lib/formtastic/inputs.rb +33 -28
  88. data/lib/formtastic/localized_string.rb +2 -1
  89. data/lib/formtastic/localizer.rb +23 -24
  90. data/lib/formtastic/namespaced_class_finder.rb +98 -0
  91. data/lib/formtastic/version.rb +2 -1
  92. data/lib/formtastic.rb +19 -14
  93. data/lib/generators/formtastic/form/form_generator.rb +8 -2
  94. data/lib/generators/formtastic/input/input_generator.rb +47 -0
  95. data/lib/generators/formtastic/install/install_generator.rb +2 -0
  96. data/lib/generators/templates/formtastic.rb +29 -7
  97. data/lib/generators/templates/input.rb +19 -0
  98. data/sample/basic_inputs.html +1 -1
  99. data/script/integration-template.rb +73 -0
  100. data/script/integration.sh +19 -0
  101. data/spec/action_class_finder_spec.rb +13 -0
  102. data/spec/actions/button_action_spec.rb +21 -20
  103. data/spec/actions/generic_action_spec.rb +134 -133
  104. data/spec/actions/input_action_spec.rb +20 -19
  105. data/spec/actions/link_action_spec.rb +30 -29
  106. data/spec/builder/custom_builder_spec.rb +39 -22
  107. data/spec/builder/error_proc_spec.rb +6 -5
  108. data/spec/builder/semantic_fields_for_spec.rb +46 -45
  109. data/spec/fast_spec_helper.rb +13 -0
  110. data/spec/generators/formtastic/form/form_generator_spec.rb +33 -32
  111. data/spec/generators/formtastic/input/input_generator_spec.rb +125 -0
  112. data/spec/generators/formtastic/install/install_generator_spec.rb +10 -9
  113. data/spec/helpers/action_helper_spec.rb +70 -97
  114. data/spec/helpers/actions_helper_spec.rb +43 -42
  115. data/spec/helpers/form_helper_spec.rb +56 -39
  116. data/spec/helpers/input_helper_spec.rb +314 -255
  117. data/spec/helpers/inputs_helper_spec.rb +217 -202
  118. data/spec/helpers/reflection_helper_spec.rb +7 -6
  119. data/spec/helpers/semantic_errors_helper_spec.rb +26 -25
  120. data/spec/i18n_spec.rb +30 -29
  121. data/spec/input_class_finder_spec.rb +11 -0
  122. data/spec/inputs/base/collections_spec.rb +78 -0
  123. data/spec/inputs/base/validations_spec.rb +481 -0
  124. data/spec/inputs/boolean_input_spec.rb +73 -72
  125. data/spec/inputs/check_boxes_input_spec.rb +174 -123
  126. data/spec/inputs/color_input_spec.rb +53 -64
  127. data/spec/inputs/country_input_spec.rb +23 -22
  128. data/spec/inputs/custom_input_spec.rb +3 -6
  129. data/spec/inputs/datalist_input_spec.rb +62 -0
  130. data/spec/inputs/date_picker_input_spec.rb +114 -113
  131. data/spec/inputs/date_select_input_spec.rb +76 -61
  132. data/spec/inputs/datetime_picker_input_spec.rb +123 -122
  133. data/spec/inputs/datetime_select_input_spec.rb +85 -68
  134. data/spec/inputs/email_input_spec.rb +17 -16
  135. data/spec/inputs/file_input_spec.rb +18 -17
  136. data/spec/inputs/hidden_input_spec.rb +32 -31
  137. data/spec/inputs/include_blank_spec.rb +10 -9
  138. data/spec/inputs/label_spec.rb +36 -31
  139. data/spec/inputs/number_input_spec.rb +212 -211
  140. data/spec/inputs/password_input_spec.rb +17 -16
  141. data/spec/inputs/phone_input_spec.rb +17 -16
  142. data/spec/inputs/placeholder_spec.rb +18 -17
  143. data/spec/inputs/radio_input_spec.rb +92 -65
  144. data/spec/inputs/range_input_spec.rb +136 -135
  145. data/spec/inputs/readonly_spec.rb +51 -0
  146. data/spec/inputs/search_input_spec.rb +16 -15
  147. data/spec/inputs/select_input_spec.rb +209 -102
  148. data/spec/inputs/string_input_spec.rb +51 -50
  149. data/spec/inputs/text_input_spec.rb +34 -33
  150. data/spec/inputs/time_picker_input_spec.rb +115 -114
  151. data/spec/inputs/time_select_input_spec.rb +84 -70
  152. data/spec/inputs/time_zone_input_spec.rb +58 -31
  153. data/spec/inputs/url_input_spec.rb +17 -16
  154. data/spec/inputs/with_options_spec.rb +9 -8
  155. data/spec/localizer_spec.rb +18 -17
  156. data/spec/namespaced_class_finder_spec.rb +91 -0
  157. data/spec/schema.rb +22 -0
  158. data/spec/spec_helper.rb +180 -249
  159. data/spec/support/custom_macros.rb +128 -98
  160. data/spec/support/deprecation.rb +2 -1
  161. data/spec/support/shared_examples.rb +13 -0
  162. data/spec/support/specialized_class_finder_shared_example.rb +28 -0
  163. data/spec/support/test_environment.rb +25 -10
  164. metadata +95 -136
  165. data/.travis.yml +0 -28
  166. data/Appraisals +0 -25
  167. data/CHANGELOG +0 -27
  168. data/gemfiles/rails_3.2.gemfile +0 -7
  169. data/gemfiles/rails_4.0.4.gemfile +0 -7
  170. data/gemfiles/rails_4.1.gemfile +0 -7
  171. data/gemfiles/rails_4.gemfile +0 -7
  172. data/gemfiles/rails_edge.gemfile +0 -10
  173. data/lib/formtastic/util.rb +0 -53
  174. data/spec/support/deferred_garbage_collection.rb +0 -21
  175. data/spec/util_spec.rb +0 -52
@@ -1,7 +1,8 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  require 'spec_helper'
3
4
 
4
- describe 'Formtastic::Localizer' do
5
+ RSpec.describe 'Formtastic::Localizer' do
5
6
  describe "Cache" do
6
7
  before do
7
8
  @cache = Formtastic::Localizer::Cache.new
@@ -11,27 +12,27 @@ describe 'Formtastic::Localizer' do
11
12
  end
12
13
 
13
14
  it "should get value" do
14
- @cache.get(@key).should == 'value'
15
- @cache.get(@undefined_key).should be_nil
15
+ expect(@cache.get(@key)).to eq('value')
16
+ expect(@cache.get(@undefined_key)).to be_nil
16
17
  end
17
18
 
18
19
  it "should check if key exists?" do
19
- @cache.has_key?(@key).should be_true
20
- @cache.has_key?(@undefined_key).should be_false
20
+ expect(@cache.has_key?(@key)).to be_truthy
21
+ expect(@cache.has_key?(@undefined_key)).to be_falsey
21
22
  end
22
23
 
23
24
  it "should set a key" do
24
25
  @cache.set(['model', 'name2'], 'value2')
25
- @cache.get(['model', 'name2']).should == 'value2'
26
+ expect(@cache.get(['model', 'name2'])).to eq('value2')
26
27
  end
27
28
 
28
29
  it "should return hash" do
29
- @cache.cache.should be_an_instance_of(Hash)
30
+ expect(@cache.cache).to be_an_instance_of(Hash)
30
31
  end
31
32
 
32
33
  it "should clear the cache" do
33
34
  @cache.clear!
34
- @cache.get(@key).should be_nil
35
+ expect(@cache.get(@key)).to be_nil
35
36
  end
36
37
  end
37
38
 
@@ -53,11 +54,11 @@ describe 'Formtastic::Localizer' do
53
54
  end
54
55
 
55
56
  it "should be defined" do
56
- lambda { Formtastic::Localizer }.should_not raise_error
57
+ expect { Formtastic::Localizer }.not_to raise_error
57
58
  end
58
59
 
59
60
  it "should have a cache" do
60
- Formtastic::Localizer.cache.should be_an_instance_of(Formtastic::Localizer::Cache)
61
+ expect(Formtastic::Localizer.cache).to be_an_instance_of(Formtastic::Localizer::Cache)
61
62
  end
62
63
 
63
64
  describe "localize" do
@@ -75,19 +76,19 @@ describe 'Formtastic::Localizer' do
75
76
  end
76
77
 
77
78
  it "should translate key with i18n" do
78
- @localizer.localize(:name, :name, :label).should == 'POST.NAME'
79
+ expect(@localizer.localize(:name, :name, :label)).to eq('POST.NAME')
79
80
  end
80
81
 
81
82
  describe "with caching" do
82
83
  it "should not update translation when stored translations change" do
83
84
  with_config :i18n_cache_lookups, true do
84
- @localizer.localize(:name, :name, :label).should == 'POST.NAME'
85
+ expect(@localizer.localize(:name, :name, :label)).to eq('POST.NAME')
85
86
  store_post_translations('POST.NEW_NAME')
86
87
 
87
- @localizer.localize(:name, :name, :label).should == 'POST.NAME'
88
+ expect(@localizer.localize(:name, :name, :label)).to eq('POST.NAME')
88
89
 
89
90
  Formtastic::Localizer.cache.clear!
90
- @localizer.localize(:name, :name, :label).should == 'POST.NEW_NAME'
91
+ expect(@localizer.localize(:name, :name, :label)).to eq('POST.NEW_NAME')
91
92
  end
92
93
  end
93
94
  end
@@ -95,9 +96,9 @@ describe 'Formtastic::Localizer' do
95
96
  describe "without caching" do
96
97
  it "should update translation when stored translations change" do
97
98
  with_config :i18n_cache_lookups, false do
98
- @localizer.localize(:name, :name, :label).should == 'POST.NAME'
99
+ expect(@localizer.localize(:name, :name, :label)).to eq('POST.NAME')
99
100
  store_post_translations('POST.NEW_NAME')
100
- @localizer.localize(:name, :name, :label).should == 'POST.NEW_NAME'
101
+ expect(@localizer.localize(:name, :name, :label)).to eq('POST.NEW_NAME')
101
102
  end
102
103
  end
103
104
  end
@@ -120,7 +121,7 @@ describe 'Formtastic::Localizer' do
120
121
  end
121
122
 
122
123
  it "should translate custom key with i18n" do
123
- @localizer.localize(:name, :name, :label).should == 'MESSAGE.NAME'
124
+ expect(@localizer.localize(:name, :name, :label)).to eq('MESSAGE.NAME')
124
125
  end
125
126
  end
126
127
  end
@@ -0,0 +1,91 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+ require 'spec_helper'
4
+ require 'formtastic/namespaced_class_finder'
5
+
6
+ RSpec.describe Formtastic::NamespacedClassFinder do
7
+ include FormtasticSpecHelper
8
+
9
+ before do
10
+ stub_const('SearchPath', Module.new)
11
+ end
12
+
13
+ let(:search_path) { [ SearchPath ] }
14
+ subject(:finder) { Formtastic::NamespacedClassFinder.new(search_path) }
15
+
16
+ shared_examples 'Namespaced Class Finder' do
17
+ subject(:found_class) { finder.find(:custom_class) }
18
+
19
+ context 'Input defined in the Object scope' do
20
+ before do
21
+ stub_const('CustomClass', Class.new)
22
+ end
23
+
24
+ it { expect(found_class).to be(CustomClass) }
25
+ end
26
+
27
+ context 'Input defined in the search path' do
28
+ before do
29
+ stub_const('SearchPath::CustomClass', Class.new)
30
+ end
31
+
32
+ it { expect(found_class).to be(SearchPath::CustomClass) }
33
+ end
34
+
35
+ context 'Input defined both in the Object scope and the search path' do
36
+ before do
37
+ stub_const('CustomClass', Class.new)
38
+ stub_const('SearchPath::CustomClass', Class.new)
39
+ end
40
+
41
+ it { expect(found_class).to be(SearchPath::CustomClass) }
42
+ end
43
+
44
+ context 'Input defined outside the search path' do
45
+ before do
46
+ stub_const('Foo', Module.new)
47
+ stub_const('Foo::CustomClass', Class.new)
48
+ end
49
+
50
+ let(:error) { Formtastic::NamespacedClassFinder::NotFoundError }
51
+
52
+ it { expect { found_class }.to raise_error(error) }
53
+ end
54
+ end
55
+
56
+ context '#finder' do
57
+ before do
58
+ allow(Rails.application.config).to receive(:eager_load).and_return(eager_load)
59
+ end
60
+
61
+ context 'when eager_load is on' do
62
+ let(:eager_load) { true }
63
+
64
+ it "finder_method is :find_with_const_defined" do
65
+ expect(described_class.finder_method).to eq(:find_with_const_defined)
66
+ end
67
+
68
+ it_behaves_like 'Namespaced Class Finder'
69
+ end
70
+
71
+ context 'when eager_load is off' do
72
+ let(:eager_load) { false }
73
+
74
+ it "finder_method is :find_by_trying" do
75
+ described_class.instance_variable_set(:@finder_method, nil) # clear cache
76
+ expect(described_class.finder_method).to eq(:find_by_trying)
77
+ end
78
+
79
+ it_behaves_like 'Namespaced Class Finder'
80
+ end
81
+ end
82
+
83
+ context '#find' do
84
+ it 'caches calls' do
85
+ expect(subject).to receive(:resolve).once.and_call_original
86
+ subject.find(:object)
87
+ subject.find(:object)
88
+ end
89
+ end
90
+
91
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ ActiveRecord::Schema.define(version: 20170208011723) do
3
+
4
+ create_table "posts", force: :cascade do |t|
5
+ t.integer "author_id", limit: 4, null: false
6
+ end
7
+
8
+ create_table "authors", force: :cascade do |t|
9
+ t.integer "age", limit: 4, null: false
10
+ t.string "name", limit: 255, null: false
11
+ t.string "surname", limit: 255, null: false
12
+ t.string "login", limit: 255
13
+ t.datetime "created_at"
14
+ t.datetime "updated_at"
15
+ end
16
+
17
+ #non-rails foreign id convention
18
+ create_table "legacy_posts", force: :cascade do |t|
19
+ t.integer "post_author", limit: 4, null: false
20
+ end
21
+
22
+ end