html5_validators 1.2.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 63928996c2fdfa1f44d24b9b3d700a92e80f7ed2
4
- data.tar.gz: 60ec0b62245120edc8c0cf648e50a94bdab847cf
3
+ metadata.gz: dec1cf5335bfb01cad02332dbd5630bb2312f023
4
+ data.tar.gz: fc500e31d89cd2643d3b84f44b3fcd3730abb9f9
5
5
  SHA512:
6
- metadata.gz: 3dd2029d72894922add01d958671899900eb3b8cc845af472bfe5e1125d3a55a9ec65d735fb501b1fbe5852868bda55613556944d56959f3e3dcba15d5cdad2e
7
- data.tar.gz: 1121140455094da97eaec98714014ded79a9d6e54bdea1733853e3c5e8335a703d09073fdf6da32f04caecbc4311bf3d1119e427ec6a668892fc31a31475e1f5
6
+ metadata.gz: 1e5b3f52300d49e0ebbd992e60ce5b7c21192311e80ccebf555599a5942485ba853568d3b05d8c030ee1662e7be7b561d1dd2292ff1f1f591994349771b2c576
7
+ data.tar.gz: 8236980db90776ac268c598154ece5f5fff3c006cc45053d84cb2de1006769f510243d034ec79ce67bc85c233a5287b26ae92ff65877481834f611530aa4bf54
@@ -1,113 +1,67 @@
1
1
  module Html5Validators
2
2
  module ActionViewExtension
3
- def inject_required_field
4
- if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
5
- @options["required"] ||= @options[:required] || object.class.attribute_required?(@method_name)
6
- end
7
- end
8
-
9
- def inject_maxlength_field
10
- if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
11
- @options["maxlength"] ||= @options[:maxlength] || object.class.attribute_maxlength(@method_name)
12
- end
13
- end
14
- end
15
- end if ActionPack::VERSION::STRING >= '4'
16
-
17
-
18
- module ActionView
19
- module Helpers
20
3
  module FormHelper
21
- def form_for_with_auto_html5_validation_option(record, options = {}, &proc)
4
+ def form_for(record, options = {}, &block)
22
5
  if record.respond_to?(:auto_html5_validation=)
23
6
  if !Html5Validators.enabled || (options[:auto_html5_validation] == false)
24
7
  record.auto_html5_validation = false
25
8
  end
26
9
  end
27
- form_for_without_auto_html5_validation_option record, options, &proc
10
+ super
28
11
  end
29
- alias_method_chain :form_for, :auto_html5_validation_option
30
12
  end
31
13
 
32
- if ActionPack::VERSION::STRING >= '4'
33
- module Tags
34
- class Base #:nodoc:
35
- include Html5Validators::ActionViewExtension
14
+ module PresenceValidator
15
+ def render
16
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
17
+ @options["required"] ||= @options[:required] || object.class.attribute_required?(@method_name)
36
18
  end
19
+ super
20
+ end
21
+ end
37
22
 
38
- class TextField
39
- def render_with_html5_attributes
40
- inject_required_field
41
- inject_maxlength_field
23
+ module LengthValidator
24
+ def render
25
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
26
+ @options["maxlength"] ||= @options[:maxlength] || object.class.attribute_maxlength(@method_name)
27
+ @options["minlength"] ||= @options[:minlength] || object.class.attribute_minlength(@method_name)
28
+ end
29
+ super
30
+ end
31
+ end
42
32
 
43
- if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
44
- @options["max"] ||= @options["max"] || @options[:max] || object.class.attribute_max(@method_name)
45
- @options["min"] ||= @options["min"] || @options[:min] || object.class.attribute_min(@method_name)
46
- end
47
- render_without_html5_attributes
48
- end
49
- alias_method_chain :render, :html5_attributes
33
+ module NumericalityValidator
34
+ def render
35
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
36
+ @options["max"] ||= @options["max"] || @options[:max] || object.class.attribute_max(@method_name)
37
+ @options["min"] ||= @options["min"] || @options[:min] || object.class.attribute_min(@method_name)
50
38
  end
39
+ super
40
+ end
41
+ end
42
+ end
43
+ end
51
44
 
52
- class TextArea
53
- def render_with_html5_attributes
54
- inject_required_field
55
- inject_maxlength_field
56
45
 
57
- render_without_html5_attributes
58
- end
59
- alias_method_chain :render, :html5_attributes
60
- end
46
+ module ActionView
47
+ Base.send :prepend, Html5Validators::ActionViewExtension::FormHelper
61
48
 
62
- #TODO probably I have to add some more classes here
63
- [RadioButton, CheckBox, Select, DateSelect, TimeZoneSelect].each do |kls|
64
- kls.class_eval do
65
- def render_with_html5_attributes
66
- inject_required_field
67
- render_without_html5_attributes
68
- end
69
- alias_method_chain :render, :html5_attributes
70
- end
71
- end
49
+ module Helpers
50
+ module Tags
51
+ class TextField
52
+ prepend Html5Validators::ActionViewExtension::NumericalityValidator
53
+ prepend Html5Validators::ActionViewExtension::LengthValidator
54
+ prepend Html5Validators::ActionViewExtension::PresenceValidator
72
55
  end
73
- # ActionPack::VERSION::STRING == '3'
74
- else
75
- class InstanceTag
76
- def to_input_field_tag_with_html5_attributes(field_type, options = {})
77
- if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
78
- options["required"] ||= object.class.attribute_required?(method_name)
79
- options["maxlength"] ||= object.class.attribute_maxlength(method_name)
80
- options["max"] ||= object.class.attribute_max(method_name)
81
- options["min"] ||= object.class.attribute_min(method_name)
82
- end
83
- to_input_field_tag_without_html5_attributes field_type, options
84
- end
85
- alias_method_chain :to_input_field_tag, :html5_attributes
86
56
 
87
- def to_text_area_tag_with_html5_attributes(options = {})
88
- if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
89
- options["required"] ||= object.class.attribute_required?(method_name)
90
- options["maxlength"] ||= object.class.attribute_maxlength(method_name)
91
- end
92
- to_text_area_tag_without_html5_attributes options
93
- end
94
- alias_method_chain :to_text_area_tag, :html5_attributes
95
-
96
- def to_radio_button_tag_with_html5_attributes(tag_value, options = {})
97
- if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
98
- options["required"] ||= object.class.attribute_required?(method_name)
99
- end
100
- to_radio_button_tag_without_html5_attributes tag_value, options
101
- end
102
- alias_method_chain :to_radio_button_tag, :html5_attributes
57
+ class TextArea
58
+ prepend Html5Validators::ActionViewExtension::LengthValidator
59
+ prepend Html5Validators::ActionViewExtension::PresenceValidator
60
+ end
103
61
 
104
- def to_check_box_tag_with_html5_attributes(options = {}, checked_value = "1", unchecked_value = "0")
105
- if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
106
- options["required"] ||= object.class.attribute_required?(method_name)
107
- end
108
- to_check_box_tag_without_html5_attributes options, checked_value, unchecked_value
109
- end
110
- alias_method_chain :to_check_box_tag, :html5_attributes
62
+ #TODO probably I have to add some more classes here
63
+ [RadioButton, CheckBox, Select, DateSelect, TimeZoneSelect].each do |kls|
64
+ kls.send :prepend, Html5Validators::ActionViewExtension::PresenceValidator
111
65
  end
112
66
  end
113
67
  end
@@ -0,0 +1,56 @@
1
+ # Legacy Rails 3.x support
2
+ module ActionView
3
+ module Helpers
4
+ module FormHelper
5
+ def form_for_with_auto_html5_validation_option(record, options = {}, &proc)
6
+ if record.respond_to?(:auto_html5_validation=)
7
+ if !Html5Validators.enabled || (options[:auto_html5_validation] == false)
8
+ record.auto_html5_validation = false
9
+ end
10
+ end
11
+ form_for_without_auto_html5_validation_option record, options, &proc
12
+ end
13
+ alias_method_chain :form_for, :auto_html5_validation_option
14
+ end
15
+
16
+ class InstanceTag
17
+ def to_input_field_tag_with_html5_attributes(field_type, options = {})
18
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
19
+ options["required"] ||= object.class.attribute_required?(method_name)
20
+ options["maxlength"] ||= object.class.attribute_maxlength(method_name)
21
+ options["minlength"] ||= object.class.attribute_minlength(method_name)
22
+ options["max"] ||= object.class.attribute_max(method_name)
23
+ options["min"] ||= object.class.attribute_min(method_name)
24
+ end
25
+ to_input_field_tag_without_html5_attributes field_type, options
26
+ end
27
+ alias_method_chain :to_input_field_tag, :html5_attributes
28
+
29
+ def to_text_area_tag_with_html5_attributes(options = {})
30
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
31
+ options["required"] ||= object.class.attribute_required?(method_name)
32
+ options["maxlength"] ||= object.class.attribute_maxlength(method_name)
33
+ options["minlength"] ||= object.class.attribute_minlength(method_name)
34
+ end
35
+ to_text_area_tag_without_html5_attributes options
36
+ end
37
+ alias_method_chain :to_text_area_tag, :html5_attributes
38
+
39
+ def to_radio_button_tag_with_html5_attributes(tag_value, options = {})
40
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
41
+ options["required"] ||= object.class.attribute_required?(method_name)
42
+ end
43
+ to_radio_button_tag_without_html5_attributes tag_value, options
44
+ end
45
+ alias_method_chain :to_radio_button_tag, :html5_attributes
46
+
47
+ def to_check_box_tag_with_html5_attributes(options = {}, checked_value = "1", unchecked_value = "0")
48
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
49
+ options["required"] ||= object.class.attribute_required?(method_name)
50
+ end
51
+ to_check_box_tag_without_html5_attributes options, checked_value, unchecked_value
52
+ end
53
+ alias_method_chain :to_check_box_tag, :html5_attributes
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,79 @@
1
+ # Legacy Ruby 1.x on Rails 4.x support
2
+ module Html5Validators
3
+ module ActionViewExtension
4
+ def inject_required_attribute
5
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
6
+ @options["required"] ||= @options[:required] || object.class.attribute_required?(@method_name)
7
+ end
8
+ end
9
+
10
+ def inject_maxlength_attribute
11
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
12
+ @options["maxlength"] ||= @options[:maxlength] || object.class.attribute_maxlength(@method_name)
13
+ @options["minlength"] ||= @options[:minlength] || object.class.attribute_minlength(@method_name)
14
+ end
15
+ end
16
+
17
+ def inject_numericality_attributes
18
+ if object.class.ancestors.include?(ActiveModel::Validations) && (object.auto_html5_validation != false) && (object.class.auto_html5_validation != false)
19
+ @options["max"] ||= @options["max"] || @options[:max] || object.class.attribute_max(@method_name)
20
+ @options["min"] ||= @options["min"] || @options[:min] || object.class.attribute_min(@method_name)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+
27
+ module ActionView
28
+ module Helpers
29
+ module FormHelper
30
+ def form_for_with_auto_html5_validation_option(record, options = {}, &proc)
31
+ if record.respond_to?(:auto_html5_validation=)
32
+ if !Html5Validators.enabled || (options[:auto_html5_validation] == false)
33
+ record.auto_html5_validation = false
34
+ end
35
+ end
36
+ form_for_without_auto_html5_validation_option record, options, &proc
37
+ end
38
+ alias_method_chain :form_for, :auto_html5_validation_option
39
+ end
40
+
41
+ module Tags
42
+ class Base #:nodoc:
43
+ include Html5Validators::ActionViewExtension
44
+ end
45
+
46
+ class TextField
47
+ def render_with_html5_attributes
48
+ inject_required_attribute
49
+ inject_maxlength_attribute
50
+ inject_numericality_attributes
51
+
52
+ render_without_html5_attributes
53
+ end
54
+ alias_method_chain :render, :html5_attributes
55
+ end
56
+
57
+ class TextArea
58
+ def render_with_html5_attributes
59
+ inject_required_attribute
60
+ inject_maxlength_attribute
61
+
62
+ render_without_html5_attributes
63
+ end
64
+ alias_method_chain :render, :html5_attributes
65
+ end
66
+
67
+ #TODO probably I have to add some more classes here
68
+ [RadioButton, CheckBox, Select, DateSelect, TimeZoneSelect].each do |kls|
69
+ kls.class_eval do
70
+ def render_with_html5_attributes
71
+ inject_required_attribute
72
+ render_without_html5_attributes
73
+ end
74
+ alias_method_chain :render, :html5_attributes
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -13,6 +13,12 @@ module ActiveModel
13
13
  }.map {|v| v.options.slice(:maximum, :is)}.map(&:values).flatten.max
14
14
  end
15
15
 
16
+ def attribute_minlength(attribute)
17
+ self.validators.grep(LengthValidator).select {|v|
18
+ v.attributes.include?(attribute.to_sym) && (v.options.keys & [:minimum, :is]).any? && (v.options.keys & [:if, :unless, :allow_nil, :allow_blank, :tokenizer]).empty?
19
+ }.map {|v| v.options.slice(:minimum, :is)}.map(&:values).flatten.min
20
+ end
21
+
16
22
  def attribute_max(attribute)
17
23
  self.validators.grep(NumericalityValidator).select {|v|
18
24
  v.attributes.include?(attribute.to_sym) && (v.options.keys & [:less_than, :less_than_or_equal_to]).any? && (v.options.keys & [:if, :unless, :allow_nil, :allow_blank]).empty?
@@ -1,3 +1,3 @@
1
1
  module Html5Validators
2
- VERSION = '1.2.2'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -22,7 +22,15 @@ module Html5Validators
22
22
  require 'html5_validators/active_record/base'
23
23
  end
24
24
  ActiveSupport.on_load(:action_view) do
25
- require 'html5_validators/action_view/form_helpers'
25
+ if ActionPack::VERSION::STRING >= '4'
26
+ if RUBY_VERSION > '2'
27
+ require 'html5_validators/action_view/form_helpers'
28
+ else
29
+ require 'html5_validators/action_view/form_helpers_ruby1'
30
+ end
31
+ else
32
+ require 'html5_validators/action_view/form_helpers_rails3'
33
+ end
26
34
  end
27
35
  end
28
36
  end
@@ -86,6 +86,20 @@ feature 'person#new' do
86
86
  find('textarea#person_bio')[:maxlength].should == '100'
87
87
  end
88
88
  end
89
+
90
+ context 'with minlength validation' do
91
+ background do
92
+ Person.validates_length_of :name, {:minimum => 3}
93
+ Person.validates_length_of :bio, {:minimum => 10}
94
+ end
95
+
96
+ scenario 'new form' do
97
+ visit '/people/new'
98
+
99
+ find('input#person_name')[:minlength].should == '3'
100
+ find('textarea#person_bio')[:minlength].should == '10'
101
+ end
102
+ end
89
103
  end
90
104
 
91
105
  feature 'item#new' do
@@ -174,4 +188,18 @@ feature 'item#new' do
174
188
  find('textarea#item_description')[:maxlength].should == '100'
175
189
  end
176
190
  end
191
+
192
+ context 'with minlength validation' do
193
+ background do
194
+ Item.validates_length_of :name, {:minimum => 3}
195
+ Item.validates_length_of :description, {:minimum => 10}
196
+ end
197
+
198
+ scenario 'new form' do
199
+ visit '/items/new'
200
+
201
+ find('input#item_name')[:minlength].should == '3'
202
+ find('textarea#item_description')[:minlength].should == '10'
203
+ end
204
+ end
177
205
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html5_validators
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Matsuda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-01 00:00:00.000000000 Z
11
+ date: 2015-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-rails
@@ -91,6 +91,8 @@ files:
91
91
  - html5_validators.gemspec
92
92
  - lib/html5_validators.rb
93
93
  - lib/html5_validators/action_view/form_helpers.rb
94
+ - lib/html5_validators/action_view/form_helpers_rails3.rb
95
+ - lib/html5_validators/action_view/form_helpers_ruby1.rb
94
96
  - lib/html5_validators/active_model/helper_methods.rb
95
97
  - lib/html5_validators/active_model/initializer_monkey_patches.rb
96
98
  - lib/html5_validators/active_model/validations.rb