client_side_validations 3.0.2 → 3.0.3

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.
@@ -54,11 +54,25 @@ module ClientSideValidations::ActionView::Helpers
54
54
  private
55
55
 
56
56
  def apply_client_side_validators(method, options = {})
57
- if @options[:validate] && options[:validate] != false && validators = @object.client_side_validation_hash[method]
57
+ if @options[:validate] && options[:validate] != false && validators = filter_validators(@object.client_side_validation_hash[method], options[:validate])
58
58
  options.merge!("data-validate" => true)
59
59
  @options[:validators].merge!("#{@object_name}[#{method}]" => validators)
60
60
  end
61
61
  end
62
62
 
63
+ def filter_validators(validators, filters)
64
+ if validators
65
+ filtered_validators = validators.inject({}) do |filtered_validators, validator|
66
+ unless filters && filters.key?(validator.first) && !filters[validator.first]
67
+ filtered_validators[validator.first] = validator.last
68
+ end
69
+
70
+ filtered_validators
71
+ end
72
+
73
+ filtered_validators.empty? ? nil : filtered_validators
74
+ end
75
+ end
76
+
63
77
  end
64
78
  end
@@ -6,10 +6,9 @@ module ClientSideValidations::ActionView::Helpers
6
6
  options = args.extract_options!
7
7
  if options[:validate]
8
8
 
9
- # Turn off SimpleForm's HTML5 Form Validations
10
- if options[:builder].to_s == 'SimpleForm::FormBuilder'
11
- options[:html][:novalidate] = true
12
- end
9
+ # Always turn off HTML5 Validations
10
+ options[:html] ||= {}
11
+ options[:html][:novalidate] = true
13
12
 
14
13
  case record_or_name_or_array
15
14
  when String, Symbol
@@ -37,7 +36,7 @@ module ClientSideValidations::ActionView::Helpers
37
36
 
38
37
  def fields_for(record_or_name_or_array, *args, &block)
39
38
  output = super
40
- @validators.merge!(args.last[:validators])
39
+ @validators.merge!(args.last[:validators]) if @validators
41
40
  output
42
41
  end
43
42
 
@@ -17,7 +17,7 @@ module ClientSideValidations::ActiveModel
17
17
 
18
18
  module Validations
19
19
  def client_side_validation_hash
20
- _validators.except(nil).inject({}) do |attr_hash, attr|
20
+ _validators.except(nil, :block).inject({}) do |attr_hash, attr|
21
21
 
22
22
  validator_hash = attr[1].inject({}) do |kind_hash, validator|
23
23
  client_side_hash = validator.client_side_hash(self, attr[0])
@@ -36,7 +36,7 @@ module ClientSideValidations::ActiveModel
36
36
  private
37
37
 
38
38
  def can_use_for_client_side_validation?(client_side_hash, validator)
39
- ((self.respond_to?(:new_record?) && client_side_hash[:on] == (self.new_record? ? :create : :update)) || client_side_hash[:on].nil?) && !validator.options.key?(:if) && !validator.options.key?(:unless)
39
+ ((self.respond_to?(:new_record?) && client_side_hash[:on] == (self.new_record? ? :create : :update)) || client_side_hash[:on].nil?) && !validator.options.key?(:if) && !validator.options.key?(:unless) && validator.kind != :block
40
40
  end
41
41
  end
42
42
  end
@@ -8,7 +8,11 @@ module ClientSideValidations::ActiveRecord
8
8
  t = klass.arel_table
9
9
 
10
10
  if params[:case_sensitive] == 'true'
11
- relation = t[attribute].eq(value)
11
+ if t.engine.connection.instance_variable_get("@config")[:adapter] == 'mysql'
12
+ relation = Arel::Nodes::SqlLiteral.new("BINARY #{t[attribute].eq(value).to_sql}")
13
+ else
14
+ relation = t[attribute].eq(value)
15
+ end
12
16
  else
13
17
  relation = t[attribute].matches(value)
14
18
  end
@@ -1,3 +1,3 @@
1
1
  module ClientSideValidations
2
- VERSION = "3.0.2"
2
+ VERSION = "3.0.3"
3
3
  end
@@ -91,7 +91,9 @@ module ActionViewTestSetup
91
91
  txt << %{ class="#{html_class}"} if html_class
92
92
  txt << %{ data-validate="true"} if validators
93
93
  txt << %{ id="#{id}"} if id
94
- txt << %{ method="post">}
94
+ txt << %{ method="post"}
95
+ txt << %{ novalidate="novalidate"} if validators
96
+ txt << %{>}
95
97
  end
96
98
 
97
99
  def whole_form(action = "http://www.example.com", id = nil, html_class = nil, options = nil)
@@ -233,5 +233,55 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
233
233
  end
234
234
  assert_equal expected, output_buffer
235
235
  end
236
+
237
+ def test_ignore_an_individual_validator
238
+ hash = {
239
+ :cost => {
240
+ :presence => {
241
+ :message => "can't be blank"
242
+ },
243
+ :format => {
244
+ :with => /.+/,
245
+ :message => "is invalid"
246
+ }
247
+ }
248
+ }
249
+ @post.stubs(:client_side_validation_hash).returns(hash)
250
+ validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
251
+ form_for(@post, :validate => true) do |f|
252
+ concat f.text_field(:cost, :validate => { :format => false })
253
+ end
254
+
255
+ validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
256
+ expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
257
+ %{<input data-validate="true" id="post_cost" name="post[cost]" size="30" type="text" />}
258
+ end
259
+ assert_equal expected, output_buffer
260
+ end
261
+
262
+ def test_ignore_many_validators
263
+ hash = {
264
+ :cost => {
265
+ :presence => {
266
+ :message => "can't be blank"
267
+ },
268
+ :format => {
269
+ :with => /.+/,
270
+ :message => "is invalid"
271
+ }
272
+ }
273
+ }
274
+ @post.stubs(:client_side_validation_hash).returns(hash)
275
+ validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
276
+ form_for(@post, :validate => true) do |f|
277
+ concat f.text_field(:cost, :validate => { :presence => false, :format => false })
278
+ end
279
+
280
+ validators = {}
281
+ expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
282
+ %{<input id="post_cost" name="post[cost]" size="30" type="text" />}
283
+ end
284
+ assert_equal expected, output_buffer
285
+ end
236
286
  end
237
287
 
@@ -147,4 +147,14 @@ class ClientSideValidations::LegacyActionViewHelpersTest < ActionView::TestCase
147
147
  assert_equal expected, output_buffer
148
148
  end
149
149
 
150
+ def test_fields_for
151
+ result = fields_for(@comment) do |c|
152
+ c.text_field(:title)
153
+ end
154
+
155
+ expected = %{<input id="comment_title" name="comment[title]" size="30" type="text" />}
156
+
157
+ assert_equal expected, result
158
+ end
159
+
150
160
  end
@@ -147,5 +147,16 @@ class ActiveModel::ValidationsTest < ClientSideValidations::ActiveModelTestBase
147
147
  expected_hash = {}
148
148
  assert_equal expected_hash, person.client_side_validation_hash
149
149
  end
150
+
151
+ def test_generic_block_validators_should_be_ignored
152
+ person = new_person do |p|
153
+ p.validates_each(:first_name) do |record, attr, value|
154
+ record.errors.add(:first_name, "failed")
155
+ end
156
+ end
157
+
158
+ expected_hash = {}
159
+ assert_equal expected_hash, person.client_side_validation_hash
160
+ end
150
161
  end
151
162
 
@@ -14,7 +14,7 @@ class ClientSideValidations::Formtastic::FormHelperTest < ActionView::TestCase
14
14
  concat f.input(:cost)
15
15
  end
16
16
 
17
- expected = %{<form accept-charset="UTF-8" action="/posts/123" class="formtastic post" data-validate="true" id="edit_post_123" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="put" /></div><li class="string required" id="post_cost_input"><label for="post_cost">Cost<abbr title="required">*</abbr></label><input data-validate="true" id="post_cost" name="post[cost]" type="text" /></li></form><script>var edit_post_123 = {"type":"Formtastic::SemanticFormBuilder","inline_error_class":"inline-errors","validators":{"post[cost]":{"presence":{"message":"can't be blank"}}}};</script>}
17
+ expected = %{<form accept-charset="UTF-8" action="/posts/123" class="formtastic post" data-validate="true" id="edit_post_123" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="put" /></div><li class="string required" id="post_cost_input"><label for="post_cost">Cost<abbr title="required">*</abbr></label><input data-validate="true" id="post_cost" name="post[cost]" type="text" /></li></form><script>var edit_post_123 = {"type":"Formtastic::SemanticFormBuilder","inline_error_class":"inline-errors","validators":{"post[cost]":{"presence":{"message":"can't be blank"}}}};</script>}
18
18
  assert_equal expected, output_buffer, "\n\n *** If you're running Ruby 1.8 and this test fails is is most likely due to 1.8's lack of insertion order persistence with Hashes ***\n"
19
19
  end
20
20
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: client_side_validations
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 3.0.2
5
+ version: 3.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Brian Cardarella
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-05 00:00:00 -04:00
13
+ date: 2011-04-18 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency