client_side_validations 3.0.12 → 3.0.13

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.
@@ -23,20 +23,12 @@ Gem::Specification.new do |s|
23
23
  s.add_development_dependency 'mongoid', '~> 2.0.0'
24
24
  s.add_development_dependency 'mongo_mapper','~>0.9.0'
25
25
  s.add_development_dependency 'mocha'
26
- s.add_development_dependency 'simple_form'
27
- s.add_development_dependency 'formtastic'
26
+ s.add_development_dependency 'simple_form', '~> 1.5.0'
27
+ s.add_development_dependency 'formtastic', '~> 1.2.0'
28
28
 
29
29
  # For QUnit testing
30
30
  s.add_development_dependency 'sinatra', '~> 1.0'
31
31
  s.add_development_dependency 'shotgun'
32
32
  s.add_development_dependency 'thin'
33
33
  s.add_development_dependency 'json'
34
-
35
- ruby_minor_version = RUBY_VERSION.split('.')[1].to_i
36
- if ruby_minor_version == 8
37
- s.add_development_dependency 'minitest'
38
- s.add_development_dependency 'ruby-debug'
39
- elsif ruby_minor_version == 9
40
- s.add_development_dependency 'ruby-debug19'
41
- end
42
34
  end
@@ -78,33 +78,33 @@ module ClientSideValidations::ActionView::Helpers
78
78
  private
79
79
 
80
80
  def apply_client_side_validators(method, options = {})
81
- if @options[:validate] && options[:validate] != false && validators = filter_validators(@object.client_side_validation_hash[method], options[:validate])
81
+ if @options[:validate] && options[:validate] != false && validators = filter_validators(method, options[:validate])
82
82
  options.merge!("data-validate" => true)
83
83
  @options[:validators].merge!("#{@object_name}[#{method}]#{options[:multiple] ? "[]" : nil}" => validators)
84
84
  end
85
85
  end
86
86
 
87
- def filter_validators(validators, filters)
88
- if validators
89
- filtered_validators = validators.inject({}) do |filtered_validators, validator|
90
- filtered_validators[validator.first] = validator.last
87
+ def filter_validators(method, filters)
88
+ if validators = @object.client_side_validation_hash[method]
89
+ unfiltered_validators = validators.inject({}) do |unfiltered_validators, validator|
90
+ unfiltered_validators[validator.first] = validator.last
91
91
  if has_filter_for_validator?(validator, filters)
92
92
  if filter_validator?(validator, filters)
93
- filtered_validators.delete(validator.first)
94
- elsif force_validator_despite_conditional?(validator, filters) && !can_run_validator?(validator)
95
- filtered_validators.delete(validator.first)
93
+ unfiltered_validators.delete(validator.first)
94
+ elsif force_validator_despite_conditional?(validator, filters) && !can_run_validator?(validator, method)
95
+ unfiltered_validators.delete(validator.first)
96
96
  end
97
97
  else
98
- if validator.last.key?(:if) || validator.last.key?(:unless)
99
- filtered_validators.delete(validator.first)
98
+ if (conditional = (validator.last[:if] || validator.last[:unless])) && conditional.is_a?(Symbol) && !conditional_method_is_change_method?(conditional, method)
99
+ unfiltered_validators.delete(validator.first)
100
100
  end
101
101
  end
102
- filtered_validators[validator.first].delete(:if) if filtered_validators[validator.first]
103
- filtered_validators[validator.first].delete(:unless) if filtered_validators[validator.first]
104
- filtered_validators
102
+ unfiltered_validators[validator.first].delete(:if) if unfiltered_validators[validator.first]
103
+ unfiltered_validators[validator.first].delete(:unless) if unfiltered_validators[validator.first]
104
+ unfiltered_validators
105
105
  end
106
106
 
107
- filtered_validators.empty? ? nil : filtered_validators
107
+ unfiltered_validators.empty? ? nil : unfiltered_validators
108
108
  end
109
109
  end
110
110
 
@@ -120,33 +120,38 @@ module ClientSideValidations::ActionView::Helpers
120
120
  filters == true || filters[validator.first] == true
121
121
  end
122
122
 
123
- def can_run_validator?(validator)
123
+ def can_run_validator?(validator, method)
124
124
  result = true
125
- if_result = can_run_if_validator?(validator.last[:if])
126
- unless_result = can_run_unless_validator?(validator.last[:unless])
125
+ if_result = run_if_validator(validator.last[:if], method)
126
+ unless_result = run_unless_validator(validator.last[:unless], method)
127
127
  result = result && if_result unless if_result.nil?
128
128
  result = result && unless_result unless unless_result.nil?
129
129
  result
130
130
  end
131
131
 
132
- def can_run_if_validator?(conditional)
132
+ def run_if_validator(conditional, method)
133
133
  if conditional
134
134
  if conditional.is_a?(Symbol)
135
- !!@object.send(conditional)
135
+ conditional_method_is_change_method?(conditional, method) ? true : !!@object.send(conditional)
136
136
  else
137
137
  !!conditional.call(@object)
138
138
  end
139
139
  end
140
140
  end
141
141
 
142
- def can_run_unless_validator?(conditional)
142
+ def run_unless_validator(conditional, method)
143
143
  if conditional
144
144
  if conditional.is_a?(Symbol)
145
- !@object.send(conditional)
145
+ conditional_method_is_change_method?(conditional, method) ? true : !@object.send(conditional)
146
146
  else
147
147
  !conditional.call(@object)
148
148
  end
149
149
  end
150
150
  end
151
+
152
+ def conditional_method_is_change_method?(conditional, method)
153
+ conditional.to_sym == "#{method}_changed?".to_sym
154
+ end
151
155
  end
152
156
  end
157
+
@@ -1,7 +1,10 @@
1
+ require 'debugger'
2
+
1
3
  module ClientSideValidations::ActiveRecord
2
4
  class Middleware
3
5
 
4
6
  def self.is_unique?(klass, attribute, value, params)
7
+ value = type_cast_value(klass, attribute, value)
5
8
  column = klass.columns_hash[attribute.to_s]
6
9
  value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text?
7
10
 
@@ -23,11 +26,18 @@ module ClientSideValidations::ActiveRecord
23
26
  relation = relation.and(t.primary_key.not_eq(params[:id])) if params[:id]
24
27
  end
25
28
 
26
- (params[:scope] || {}).each do |key, value|
27
- relation = relation.and(t[key].eq(value))
29
+ (params[:scope] || {}).each do |attribute, value|
30
+ value = type_cast_value(klass, attribute, value)
31
+ relation = relation.and(t[attribute].eq(value))
28
32
  end
29
33
 
30
34
  !klass.where(relation).exists?
31
35
  end
36
+
37
+ private
38
+
39
+ def self.type_cast_value(klass, attribute, value)
40
+ klass.columns_hash[attribute].type_cast(value)
41
+ end
32
42
  end
33
43
  end
@@ -1,3 +1,3 @@
1
1
  module ClientSideValidations
2
- VERSION = '3.0.12'
2
+ VERSION = '3.0.13'
3
3
  end
@@ -346,7 +346,7 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
346
346
  assert_equal expected, output_buffer
347
347
  end
348
348
 
349
- def test_conditional_validator_filters
349
+ def test_conditional_validators_should_be_filtered
350
350
  hash = {
351
351
  :cost => {
352
352
  :presence => {
@@ -379,7 +379,7 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
379
379
  assert_equal expected, output_buffer
380
380
  end
381
381
 
382
- def test_conditional_validators_should_be_filtered
382
+ def test_conditional_validator_filters_being_forced
383
383
  hash = {
384
384
  :cost => {
385
385
  :presence => {
@@ -400,8 +400,44 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
400
400
  @post.stubs(:can_validate?).returns(true)
401
401
  @post.stubs(:client_side_validation_hash).returns(hash)
402
402
  form_for(@post, :validate => true) do |f|
403
- concat f.text_field(:cost)
404
- concat f.text_field(:title)
403
+ concat f.text_field(:cost, :validate => true)
404
+ concat f.text_field(:title, :validate => true)
405
+ end
406
+
407
+ validators = {
408
+ 'post[cost]' => {:presence => {:message => "can't be blank"}},
409
+ 'post[title]' => {:presence => {:message => "can't be blank"}}
410
+ }
411
+ expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
412
+ %{<input data-validate="true" id="post_cost" name="post[cost]" size="30" type="text" />} +
413
+ %{<input data-validate="true" id="post_title" name="post[title]" size="30" type="text" />}
414
+ end
415
+ assert_equal expected, output_buffer
416
+ end
417
+
418
+ def test_conditional_validator_filters_being_forced_and_not_meeting_condition
419
+ hash = {
420
+ :cost => {
421
+ :presence => {
422
+ :message => "can't be blank",
423
+ :unless => :cannot_validate?
424
+ }
425
+ },
426
+ :title => {
427
+ :presence => {
428
+ :message => "can't be blank",
429
+ :if => :can_validate?
430
+ }
431
+ }
432
+ }
433
+
434
+ @post.title = nil
435
+ @post.stubs(:cannot_validate?).returns(true)
436
+ @post.stubs(:can_validate?).returns(false)
437
+ @post.stubs(:client_side_validation_hash).returns(hash)
438
+ form_for(@post, :validate => true) do |f|
439
+ concat f.text_field(:cost, :validate => true)
440
+ concat f.text_field(:title, :validate => true)
405
441
  end
406
442
 
407
443
  validators = {}
@@ -412,7 +448,7 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
412
448
  assert_equal expected, output_buffer
413
449
  end
414
450
 
415
- def test_conditional_validator_filters_being_forced
451
+ def test_conditional_validator_filters_being_forced_individually
416
452
  hash = {
417
453
  :cost => {
418
454
  :presence => {
@@ -433,8 +469,8 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
433
469
  @post.stubs(:can_validate?).returns(true)
434
470
  @post.stubs(:client_side_validation_hash).returns(hash)
435
471
  form_for(@post, :validate => true) do |f|
436
- concat f.text_field(:cost, :validate => true)
437
- concat f.text_field(:title, :validate => true)
472
+ concat f.text_field(:cost, :validate => { :presence => true })
473
+ concat f.text_field(:title, :validate => { :presence => true })
438
474
  end
439
475
 
440
476
  validators = {
@@ -448,7 +484,7 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
448
484
  assert_equal expected, output_buffer
449
485
  end
450
486
 
451
- def test_conditional_validator_filters_being_forced_and_not_meeting_condition
487
+ def test_conditional_validator_filters_being_forced_and_not_meeting_condition_individually
452
488
  hash = {
453
489
  :cost => {
454
490
  :presence => {
@@ -469,8 +505,8 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
469
505
  @post.stubs(:can_validate?).returns(false)
470
506
  @post.stubs(:client_side_validation_hash).returns(hash)
471
507
  form_for(@post, :validate => true) do |f|
472
- concat f.text_field(:cost, :validate => true)
473
- concat f.text_field(:title, :validate => true)
508
+ concat f.text_field(:cost, :validate => { :presence => true })
509
+ concat f.text_field(:title, :validate => { :presence => true })
474
510
  end
475
511
 
476
512
  validators = {}
@@ -481,18 +517,18 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
481
517
  assert_equal expected, output_buffer
482
518
  end
483
519
 
484
- def test_conditional_validator_filters_being_forced_individually
520
+ def test_conditional_validator_filters_being_forced_with_procs
485
521
  hash = {
486
522
  :cost => {
487
523
  :presence => {
488
524
  :message => "can't be blank",
489
- :unless => :cannot_validate?
525
+ :unless => Proc.new { |post| post.cannot_validate? }
490
526
  }
491
527
  },
492
528
  :title => {
493
529
  :presence => {
494
530
  :message => "can't be blank",
495
- :if => :can_validate?
531
+ :if => Proc.new { |post| post.can_validate? }
496
532
  }
497
533
  }
498
534
  }
@@ -502,8 +538,8 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
502
538
  @post.stubs(:can_validate?).returns(true)
503
539
  @post.stubs(:client_side_validation_hash).returns(hash)
504
540
  form_for(@post, :validate => true) do |f|
505
- concat f.text_field(:cost, :validate => { :presence => true })
506
- concat f.text_field(:title, :validate => { :presence => true })
541
+ concat f.text_field(:cost, :validate => true)
542
+ concat f.text_field(:title, :validate => true)
507
543
  end
508
544
 
509
545
  validators = {
@@ -517,58 +553,57 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
517
553
  assert_equal expected, output_buffer
518
554
  end
519
555
 
520
- def test_conditional_validator_filters_being_forced_and_not_meeting_condition_individually
556
+ def test_conditional_validator_ignored_when_using_changed_helpers
521
557
  hash = {
522
558
  :cost => {
523
559
  :presence => {
524
560
  :message => "can't be blank",
525
- :unless => :cannot_validate?
561
+ :unless => :cost_changed?
526
562
  }
527
563
  },
528
564
  :title => {
529
565
  :presence => {
530
566
  :message => "can't be blank",
531
- :if => :can_validate?
567
+ :if => :title_changed?
532
568
  }
533
569
  }
534
570
  }
535
571
 
536
572
  @post.title = nil
537
- @post.stubs(:cannot_validate?).returns(true)
538
- @post.stubs(:can_validate?).returns(false)
539
573
  @post.stubs(:client_side_validation_hash).returns(hash)
540
574
  form_for(@post, :validate => true) do |f|
541
- concat f.text_field(:cost, :validate => { :presence => true })
542
- concat f.text_field(:title, :validate => { :presence => true })
575
+ concat f.text_field(:cost)
576
+ concat f.text_field(:title)
543
577
  end
544
578
 
545
- validators = {}
579
+ validators = {
580
+ 'post[cost]' => {:presence => {:message => "can't be blank"}},
581
+ 'post[title]' => {:presence => {:message => "can't be blank"}}
582
+ }
546
583
  expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
547
- %{<input id="post_cost" name="post[cost]" size="30" type="text" />} +
548
- %{<input id="post_title" name="post[title]" size="30" type="text" />}
584
+ %{<input data-validate="true" id="post_cost" name="post[cost]" size="30" type="text" />} +
585
+ %{<input data-validate="true" id="post_title" name="post[title]" size="30" type="text" />}
549
586
  end
550
587
  assert_equal expected, output_buffer
551
588
  end
552
589
 
553
- def test_conditional_validator_filters_being_forced_with_procs
590
+ def test_conditional_validator_ignored_when_using_changed_helpers_and_forcing_validators
554
591
  hash = {
555
592
  :cost => {
556
593
  :presence => {
557
594
  :message => "can't be blank",
558
- :unless => Proc.new { |post| post.cannot_validate? }
595
+ :unless => :cost_changed?
559
596
  }
560
597
  },
561
598
  :title => {
562
599
  :presence => {
563
600
  :message => "can't be blank",
564
- :if => Proc.new { |post| post.can_validate? }
601
+ :if => :title_changed?
565
602
  }
566
603
  }
567
604
  }
568
605
 
569
606
  @post.title = nil
570
- @post.stubs(:cannot_validate?).returns(false)
571
- @post.stubs(:can_validate?).returns(true)
572
607
  @post.stubs(:client_side_validation_hash).returns(hash)
573
608
  form_for(@post, :validate => true) do |f|
574
609
  concat f.text_field(:cost, :validate => true)
@@ -171,5 +171,20 @@ class ClientSideValidationsActiveRecordMiddlewareTest < Test::Unit::TestCase
171
171
  assert_equal 'false', last_response.body
172
172
  assert last_response.ok?
173
173
  end
174
- end
175
174
 
175
+ def test_uniqueness_when_value_must_be_typecast
176
+ User.create(:active => false)
177
+ get '/validators/uniqueness.json', { 'user[active]' => 'false', 'case_sensitive' => true }
178
+
179
+ assert_equal 'false', last_response.body
180
+ assert last_response.ok?
181
+ end
182
+
183
+ def test_uniqueness_when_scope_is_given_and_value_must_be_typecast
184
+ User.create(:email => 'user@test.com', :active => true)
185
+ get '/validators/uniqueness.json', { 'user[email]' => 'user@test.com', 'scope' => { 'active' => 'true' }, 'case_sensitive' => true }
186
+
187
+ assert_equal 'false', last_response.body
188
+ assert last_response.ok?
189
+ end
190
+ end
@@ -1,4 +1,4 @@
1
- users_table = %{CREATE TABLE users (id INTEGER PRIMARY KEY, age INTEGER, name TEXT, email TEXT, title VARCHAR(5));}
1
+ users_table = %{CREATE TABLE users (id INTEGER PRIMARY KEY, age INTEGER, name TEXT, email TEXT, title VARCHAR(5), active BOOLEAN);}
2
2
  ActiveRecord::Base.connection.execute(users_table)
3
3
 
4
4
  class User < ActiveRecord::Base
data/test/base_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler.setup
4
- require 'ruby-debug'
5
4
  require 'test/unit'
6
5
  require 'mocha'
7
6
 
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Rails 3 Client Side Validations - v3.0.12
2
+ * Rails 3 Client Side Validations - v3.0.13
3
3
  * https://github.com/bcardarlela/client_side_validations
4
4
  *
5
5
  * Copyright (c) 2011 Brian Cardarella
@@ -7,77 +7,76 @@
7
7
  * http://www.opensource.org/licenses/mit-license.php
8
8
  */
9
9
 
10
- (function($) {
11
- $.fn.validate = function() {
12
- return this.filter('form[data-validate]').each(function() {
13
- var form = $(this);
14
- var settings = window[form.attr('id')];
10
+ (function ($) {
11
+ $.fn.validate = function () {
12
+ return this.filter('form[data-validate]').each(function () {
13
+ var form = $(this),
14
+ settings = window[form.attr('id')],
15
+ addError = function (element, message) {
16
+ clientSideValidations.formBuilders[settings.type].add(element, settings, message);
17
+ },
18
+ removeError = function (element) {
19
+ clientSideValidations.formBuilders[settings.type].remove(element, settings);
20
+ };
15
21
 
16
22
  // Set up the events for the form
17
23
  form
18
- .submit(function() { return form.isValid(settings.validators); })
19
- .bind('ajax:beforeSend', function() { return form.isValid(settings.validators); })
24
+ .submit(function () { return form.isValid(settings.validators); })
25
+ .bind('ajax:beforeSend', function () { return form.isValid(settings.validators); } )
20
26
  // Callbacks
21
- .bind('form:validate:after', function(eventData) { clientSideValidations.callbacks.form.after( form, eventData); })
22
- .bind('form:validate:before', function(eventData) { clientSideValidations.callbacks.form.before(form, eventData); })
23
- .bind('form:validate:fail', function(eventData) { clientSideValidations.callbacks.form.fail( form, eventData); })
24
- .bind('form:validate:pass', function(eventData) { clientSideValidations.callbacks.form.pass( form, eventData); })
27
+ .bind('form:validate:after', function (eventData) { clientSideValidations.callbacks.form.after( form, eventData); } )
28
+ .bind('form:validate:before', function (eventData) { clientSideValidations.callbacks.form.before(form, eventData); } )
29
+ .bind('form:validate:fail', function (eventData) { clientSideValidations.callbacks.form.fail( form, eventData); } )
30
+ .bind('form:validate:pass', function (eventData) { clientSideValidations.callbacks.form.pass( form, eventData); } )
25
31
 
26
32
  // Set up the events for each validatable form element
27
33
  .find('[data-validate]:input:not(:radio)')
28
- .live('focusout', function() { $(this).isValid(settings.validators); })
29
- .live('change', function() { $(this).data('changed', true); })
34
+ .live('focusout', function () { $(this).isValid(settings.validators); })
35
+ .live('change', function () { $(this).data('changed', true); })
30
36
  // Callbacks
31
- .live('element:validate:after', function(eventData) { clientSideValidations.callbacks.element.after( $(this), eventData); })
32
- .live('element:validate:before', function(eventData) { clientSideValidations.callbacks.element.before($(this), eventData); })
33
- .live('element:validate:fail', function(eventData, message) {
37
+ .live('element:validate:after', function (eventData) { clientSideValidations.callbacks.element.after( $(this), eventData); })
38
+ .live('element:validate:before', function (eventData) { clientSideValidations.callbacks.element.before($(this), eventData); })
39
+ .live('element:validate:fail', function (eventData, message) {
34
40
  var element = $(this);
35
- clientSideValidations.callbacks.element.fail(element, message, function() {
41
+ clientSideValidations.callbacks.element.fail(element, message, function () {
36
42
  addError(element, message);
37
- }, eventData) })
38
- .live('element:validate:pass', function(eventData) {
43
+ }, eventData); })
44
+ .live('element:validate:pass', function (eventData) {
39
45
  var element = $(this);
40
- clientSideValidations.callbacks.element.pass(element, function() {
46
+ clientSideValidations.callbacks.element.pass(element, function () {
41
47
  removeError(element);
42
- }, eventData) })
48
+ }, eventData); })
43
49
  // Checkboxes - Live events don't support filter
44
50
  .end().find('[data-validate]:checkbox')
45
- .live('click', function() { $(this).isValid(settings.validators); })
51
+ .live('click', function () { $(this).isValid(settings.validators); })
46
52
  // Inputs for confirmations
47
- .end().find('[id*=_confirmation]').each(function() {
53
+ .end().find('[id*=_confirmation]').each(function () {
48
54
  var confirmationElement = $(this),
49
55
  element = form.find('#' + this.id.match(/(.+)_confirmation/)[1] + '[data-validate]:input');
50
56
 
51
57
  if (element[0]) {
52
58
  $('#' + confirmationElement.attr('id'))
53
- .live('focusout', function() {
59
+ .live('focusout', function () {
54
60
  element.data('changed', true).isValid(settings.validators);
55
61
  })
56
- .live('keyup', function() {
62
+ .live('keyup', function () {
57
63
  element.data('changed', true).isValid(settings.validators);
58
- })
64
+ });
59
65
  }
60
66
  });
61
67
 
62
- var addError = function(element, message) {
63
- clientSideValidations.formBuilders[settings.type].add(element, settings, message);
64
- }
65
-
66
- var removeError = function(element) {
67
- clientSideValidations.formBuilders[settings.type].remove(element, settings);
68
- }
69
68
  });
70
- }
69
+ };
71
70
 
72
- $.fn.isValid = function(validators) {
71
+ $.fn.isValid = function (validators) {
73
72
  if ($(this[0]).is('form')) {
74
73
  return validateForm($(this[0]), validators);
75
74
  } else {
76
75
  return validateElement($(this[0]), validators[this[0].name]);
77
76
  }
78
- }
77
+ };
79
78
 
80
- var validateForm = function(form, validators) {
79
+ var validateForm = function (form, validators) {
81
80
  var valid = true;
82
81
 
83
82
  form.trigger('form:validate:before').find('[data-validate]:input').each(function() {
@@ -92,48 +91,47 @@
92
91
 
93
92
  form.trigger('form:validate:after');
94
93
  return valid;
95
- }
96
-
97
- var validateElement = function(element, validators) {
98
- element.trigger('element:validate:before');
99
-
100
- if (element.data('changed') !== false) {
101
- var valid = true;
102
- element.data('changed', false);
103
-
104
- // Because 'length' is defined on the list of validators we cannot call jQuery.each on
105
- // the clientSideValidations.validators.all() object
106
- for (kind in clientSideValidations.validators.all()) {
107
- if (validators[kind] && (message = clientSideValidations.validators.all()[kind](element, validators[kind]))) {
108
- element.trigger('element:validate:fail', message).data('valid', false);
109
- valid = false;
110
- break;
94
+ },
95
+ validateElement = function (element, validators) {
96
+ element.trigger('element:validate:before');
97
+
98
+ if (element.data('changed') !== false) {
99
+ var valid = true;
100
+ element.data('changed', false);
101
+
102
+ // Because 'length' is defined on the list of validators we cannot call jQuery.each on
103
+ // the clientSideValidations.validators.all() object
104
+ for (kind in clientSideValidations.validators.all()) {
105
+ if (validators[kind] && (message = clientSideValidations.validators.all()[kind](element, validators[kind]))) {
106
+ element.trigger('element:validate:fail', message).data('valid', false);
107
+ valid = false;
108
+ break;
109
+ }
111
110
  }
112
- }
113
111
 
114
- if (valid) { element.data('valid', null); element.trigger('element:validate:pass'); }
115
- }
112
+ if (valid) { element.data('valid', null); element.trigger('element:validate:pass'); }
113
+ }
116
114
 
117
- element.trigger('element:validate:after');
118
- return element.data('valid') === false ? false : true;
119
- }
115
+ element.trigger('element:validate:after');
116
+ return element.data('valid') === false ? false : true;
117
+ };
120
118
 
121
119
  // Main hook
122
120
  // If new forms are dynamically introduced into the DOM the .validate() method
123
121
  // must be invoked on that form
124
- $(function() { $('form[data-validate]').validate(); })
122
+ $(function () { $('form[data-validate]').validate(); });
125
123
  })(jQuery);
126
124
 
127
125
  var clientSideValidations = {
128
126
  validators: {
129
- all: function() { return jQuery.extend({}, clientSideValidations.validators.local, clientSideValidations.validators.remote) },
127
+ all: function() { return jQuery.extend({}, clientSideValidations.validators.local, clientSideValidations.validators.remote); },
130
128
  local: {
131
- presence: function(element, options) {
129
+ presence: function (element, options) {
132
130
  if (/^\s*$/.test(element.val() || "")) {
133
131
  return options.message;
134
132
  }
135
133
  },
136
- acceptance: function(element, options) {
134
+ acceptance: function (element, options) {
137
135
  switch (element.attr('type')) {
138
136
  case 'checkbox':
139
137
  if (!element.attr('checked')) {
@@ -147,8 +145,8 @@ var clientSideValidations = {
147
145
  break;
148
146
  }
149
147
  },
150
- format: function(element, options) {
151
- if ((message = this.presence(element, options)) && options.allow_blank == true) {
148
+ format: function (element, options) {
149
+ if ((message = this.presence(element, options)) && options.allow_blank === true) {
152
150
  return;
153
151
  } else if (message) {
154
152
  return message;
@@ -160,7 +158,7 @@ var clientSideValidations = {
160
158
  }
161
159
  }
162
160
  },
163
- numericality: function(element, options) {
161
+ numericality: function (element, options) {
164
162
  if (!/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d*)?$/.test(element.val())) {
165
163
  return options.messages.numericality;
166
164
  }
@@ -170,82 +168,83 @@ var clientSideValidations = {
170
168
  }
171
169
 
172
170
  var CHECKS = { greater_than: '>', greater_than_or_equal_to: '>=',
173
- equal_to: '==', less_than: '<', less_than_or_equal_to: '<=' }
171
+ equal_to: '==', less_than: '<', less_than_or_equal_to: '<=' };
174
172
 
175
- for (var check in CHECKS) {
176
- if (options[check] != undefined && !(new Function("return " + element.val() + CHECKS[check] + options[check])())) {
173
+ for (check in CHECKS) {
174
+ if (options[check] !== undefined && !(new Function("return " + element.val() + CHECKS[check] + options[check])())) {
177
175
  return options.messages[check];
178
176
  }
179
177
  }
180
178
 
181
- if (options.odd && !(parseInt(element.val()) % 2)) {
179
+ if (options.odd && !(parseInt(element.val(), 10) % 2)) {
182
180
  return options.messages.odd;
183
181
  }
184
182
 
185
- if (options.even && (parseInt(element.val()) % 2)) {
183
+ if (options.even && (parseInt(element.val(), 10) % 2)) {
186
184
  return options.messages.even;
187
185
  }
188
186
  },
189
- length: function(element, options) {
190
- var blankOptions = {};
187
+ length: function (element, options) {
188
+ var blankOptions = {},
189
+ CHECKS = { is: '==', minimum: '>=', maximum: '<=' },
190
+ tokenizer = options.js_tokenizer || "split('')",
191
+ tokenized_length = new Function("element", "return (element.val()." + tokenizer + " || '').length;")(element);
191
192
  if (options.is) {
192
193
  blankOptions.message = options.messages.is;
193
194
  } else if (options.minimum) {
194
195
  blankOptions.message = options.messages.minimum;
195
196
  }
196
- if ((message = this.presence(element, blankOptions)) && options.allow_blank == true) {
197
+ if ((message = this.presence(element, blankOptions)) && options.allow_blank === true) {
197
198
  return;
198
199
  } else if (message) {
199
200
  return message;
200
201
  } else {
201
- var CHECKS = { is: '==', minimum: '>=', maximum: '<=' }
202
- var tokenizer = options.js_tokenizer || "split('')";
203
- var tokenized_length = new Function("element", "return (element.val()." + tokenizer + " || '').length;")(element);
204
-
205
- for (var check in CHECKS) {
202
+ for (check in CHECKS) {
206
203
  if (options[check] && !(new Function("return " + tokenized_length + CHECKS[check] + options[check])())) {
207
204
  return options.messages[check];
208
205
  }
209
206
  }
210
207
  }
211
208
  },
212
- exclusion: function(element, options) {
213
- if ((message = this.presence(element, options)) && options.allow_blank == true) {
209
+ exclusion: function (element, options) {
210
+ var lower = null, upper = null;
211
+ if ((message = this.presence(element, options)) && options.allow_blank === true) {
214
212
  return;
215
213
  } else if (message) {
216
214
  return message;
217
215
  } else {
218
216
  if (options['in']) {
219
- for (var i = 0; i < options['in'].length; i++) {
217
+ for (i = 0; i < options['in'].length; i = i + 1) {
220
218
  if (options['in'][i] == element.val()) {
221
219
  return options.message;
222
220
  }
223
221
  }
224
- } else if (options['range']) {
225
- var lower = options['range'][0],
226
- upper = options['range'][1];
222
+ } else if (options.range) {
223
+ lower = options.range[0];
224
+ upper = options.range[1];
227
225
  if (element.val() >= lower && element.val() <= upper) {
228
226
  return options.message;
229
227
  }
230
228
  }
231
229
  }
232
230
  },
233
- inclusion: function(element, options) {
234
- if ((message = this.presence(element, options)) && options.allow_blank == true) {
231
+ inclusion: function (element, options) {
232
+ var lower = null, upper = null;
233
+ if ((message = this.presence(element, options)) && options.allow_blank === true) {
235
234
  return;
236
235
  } else if (message) {
237
236
  return message;
238
237
  } else {
239
238
  if (options['in']) {
240
- for (var i = 0; i < options['in'].length; i++) {
239
+ for (i = 0; i < options['in'].length; i = i + 1) {
241
240
  if (options['in'][i] == element.val()) {
242
241
  return;
243
242
  }
244
243
  }
245
244
  return options.message;
246
- } else if (options['range']) {
247
- var lower = options['range'][0],
248
- upper = options['range'][1];
245
+ } else if (options.range) {
246
+ lower = options.range[0];
247
+ upper = options.range[1];
249
248
 
250
249
  if (element.val() >= lower && element.val() <= upper) {
251
250
  return;
@@ -255,25 +254,26 @@ var clientSideValidations = {
255
254
  }
256
255
  }
257
256
  },
258
- confirmation: function(element, options) {
259
- if (element.val() != jQuery('#' + element.attr('id') + '_confirmation').val()) {
257
+ confirmation: function (element, options) {
258
+ if (element.val() !== jQuery('#' + element.attr('id') + '_confirmation').val()) {
260
259
  return options.message;
261
260
  }
262
261
  }
263
262
  },
264
263
  remote: {
265
- uniqueness: function(element, options) {
266
- var data = {};
267
- data['case_sensitive'] = !!options.case_sensitive;
264
+ uniqueness: function (element, options) {
265
+ var data = {},
266
+ name = null;
267
+ data.case_sensitive = !!options.case_sensitive;
268
268
  if (options.id) {
269
- data['id'] = options.id;
269
+ data.id = options.id;
270
270
  }
271
271
 
272
272
  if (options.scope) {
273
- data.scope = {}
273
+ data.scope = {};
274
274
  for (key in options.scope) {
275
- var scoped_element = jQuery('[name="' + element.attr('name').replace(/\[\w+]$/, '[' + key + ']' + '"]'));
276
- if (scoped_element[0] && scoped_element.val() != options.scope[key]) {
275
+ var scoped_element = jQuery('[name="' + element.attr('name').replace(/\[\w+\]$/, '[' + key + ']' + '"]'));
276
+ if (scoped_element[0] && scoped_element.val() !== options.scope[key]) {
277
277
  data.scope[key] = scoped_element.val();
278
278
  scoped_element.unbind('change.' + element.id).bind('change.' + element.id, function() { element.trigger('change'); element.trigger('focusout'); });
279
279
  } else {
@@ -286,16 +286,16 @@ var clientSideValidations = {
286
286
  // e.g. user[records_attributes][0][title] => records[title]
287
287
  // e.g. user[record_attributes][title] => record[title]
288
288
  // Server side handles classifying the resource properly
289
- if (/_attributes]/.test(element.attr('name'))) {
290
- var name = element.attr('name').match(/\[\w+_attributes]/g).pop().match(/\[(\w+)_attributes]/).pop();
291
- name += /(\[\w+])$/.exec(element.attr('name'))[1];
289
+ if (/_attributes\]/.test(element.attr('name'))) {
290
+ name = element.attr('name').match(/\[\w+_attributes\]/g).pop().match(/\[(\w+)_attributes\]/).pop();
291
+ name += /(\[\w+\])$/.exec(element.attr('name'))[1];
292
292
  } else {
293
- var name = element.attr('name');
293
+ name = element.attr('name');
294
294
  }
295
295
 
296
296
  // Override the name if a nested module class is passed
297
297
  if (options['class']) {
298
- name = options['class'] + '[' + name.split('[')[1]
298
+ name = options['class'] + '[' + name.split('[')[1];
299
299
  }
300
300
  data[name] = element.val();
301
301
 
@@ -303,7 +303,7 @@ var clientSideValidations = {
303
303
  url: '/validators/uniqueness.json',
304
304
  data: data,
305
305
  async: false
306
- }).status == 200) {
306
+ }).status === 200) {
307
307
  return options.message;
308
308
  }
309
309
  }
@@ -311,13 +311,13 @@ var clientSideValidations = {
311
311
  },
312
312
  formBuilders: {
313
313
  'ActionView::Helpers::FormBuilder': {
314
- add: function(element, settings, message) {
315
- if (element.data('valid') !== false && jQuery('label.message[for="' + element.attr('id') + '"]')[0] == undefined) {
314
+ add: function (element, settings, message) {
315
+ if (element.data('valid') !== false && jQuery('label.message[for="' + element.attr('id') + '"]')[0] === undefined) {
316
316
  var inputErrorField = jQuery(settings.input_tag),
317
317
  labelErrorField = jQuery(settings.label_tag),
318
318
  label = jQuery('label[for="' + element.attr('id') + '"]:not(.message)');
319
319
 
320
- if (element.attr('autofocus')) { element.attr('autofocus', false) };
320
+ if (element.attr('autofocus')) { element.attr('autofocus', false); }
321
321
  element.before(inputErrorField);
322
322
  inputErrorField.find('span#input_tag').replaceWith(element);
323
323
  inputErrorField.find('label.message').attr('for', element.attr('id'));
@@ -327,7 +327,7 @@ var clientSideValidations = {
327
327
  }
328
328
  jQuery('label.message[for="' + element.attr('id') + '"]').text(message);
329
329
  },
330
- remove: function(element, settings) {
330
+ remove: function (element, settings) {
331
331
  var errorFieldClass = jQuery(settings.input_tag).attr('class'),
332
332
  inputErrorField = element.closest('.' + errorFieldClass),
333
333
  label = jQuery('label[for="' + element.attr('id') + '"]:not(.message)'),
@@ -342,63 +342,64 @@ var clientSideValidations = {
342
342
  }
343
343
  },
344
344
  'SimpleForm::FormBuilder': {
345
- add: function(element, settings, message) {
345
+ add: function (element, settings, message) {
346
346
  if (element.data('valid') !== false) {
347
- var wrapper = element.closest(settings.wrapper_tag);
347
+ var wrapper = element.closest(settings.wrapper_tag),
348
+ errorElement = $('<' + settings.error_tag + ' class="' + settings.error_class + '">' + message + '</' + settings.error_tag + '>');
348
349
  wrapper.addClass(settings.wrapper_error_class);
349
- var errorElement = $('<' + settings.error_tag + ' class="' + settings.error_class + '">' + message + '</' + settings.error_tag + '>');
350
350
  wrapper.append(errorElement);
351
351
  } else {
352
352
  element.parent().find(settings.error_tag + '.' + settings.error_class).text(message);
353
353
  }
354
354
  },
355
- remove: function(element, settings) {
356
- var wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_error_class);
355
+ remove: function (element, settings) {
356
+ var wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_error_class),
357
+ errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class);
357
358
  wrapper.removeClass(settings.wrapper_error_class);
358
- var errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class);
359
359
  errorElement.remove();
360
360
  }
361
361
 
362
362
  },
363
363
  'Formtastic::SemanticFormBuilder': {
364
- add: function(element, settings, message) {
364
+ add: function (element, settings, message) {
365
365
  if (element.data('valid') !== false) {
366
- var wrapper = element.closest('li');
366
+ var wrapper = element.closest('li'),
367
+ errorElement = jQuery('<p class="' + settings.inline_error_class + '">' + message + '</p>');
367
368
  wrapper.addClass('error');
368
- var errorElement = $('<p class="' + settings.inline_error_class + '">' + message + '</p>');
369
369
  wrapper.append(errorElement);
370
370
  } else {
371
371
  element.parent().find('p.' + settings.inline_error_class).text(message);
372
372
  }
373
373
  },
374
- remove: function(element, settings) {
375
- var wrapper = element.closest('li.error');
374
+ remove: function (element, settings) {
375
+ var wrapper = element.closest('li.error'),
376
+ errorElement = wrapper.find('p.' + settings.inline_error_class);
376
377
  wrapper.removeClass('error');
377
- var errorElement = wrapper.find('p.' + settings.inline_error_class);
378
378
  errorElement.remove();
379
379
  }
380
380
  },
381
381
  'NestedForm::Builder': {
382
- add: function(element, settings, message) {
382
+ add: function (element, settings, message) {
383
383
  clientSideValidations.formBuilders['ActionView::Helpers::FormBuilder'].add(element, settings, message);
384
384
  },
385
- remove: function(element, settings, message) {
385
+ remove: function (element, settings, message) {
386
386
  clientSideValidations.formBuilders['ActionView::Helpers::FormBuilder'].remove(element, settings, message);
387
387
  }
388
388
  }
389
389
  },
390
390
  callbacks: {
391
391
  element: {
392
- after: function(element, eventData) { },
393
- before: function(element, eventData) { },
394
- fail: function(element, message, addError, eventData) { addError() },
395
- pass: function(element, removeError, eventData) { removeError() }
392
+ after: function (element, eventData) { },
393
+ before: function (element, eventData) { },
394
+ fail: function (element, message, addError, eventData) { addError(); },
395
+ pass: function (element, removeError, eventData) { removeError(); }
396
396
  },
397
397
  form: {
398
- after: function(form, eventData) { },
399
- before: function(form, eventData) { },
400
- fail: function(form, eventData) { },
401
- pass: function(form, eventData) { }
398
+ after: function (form, eventData) { },
399
+ before: function (form, eventData) { },
400
+ fail: function (form, eventData) { },
401
+ pass: function (form, eventData) { }
402
402
  }
403
403
  }
404
- }
404
+ };
405
+
metadata CHANGED
@@ -1,171 +1,215 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: client_side_validations
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.13
4
5
  prerelease:
5
- version: 3.0.12
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Brian Cardarella
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-06-23 00:00:00 -04:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2012-07-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: rails
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
18
+ requirements:
22
19
  - - ~>
23
- - !ruby/object:Gem::Version
20
+ - !ruby/object:Gem::Version
24
21
  version: 3.0.0
25
22
  type: :development
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: sqlite3
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: sqlite3
32
+ requirement: !ruby/object:Gem::Requirement
31
33
  none: false
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
36
38
  type: :development
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: bson_ext
40
39
  prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bson_ext
48
+ requirement: !ruby/object:Gem::Requirement
42
49
  none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: "0"
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
47
54
  type: :development
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: mongoid
51
55
  prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: mongoid
64
+ requirement: !ruby/object:Gem::Requirement
53
65
  none: false
54
- requirements:
66
+ requirements:
55
67
  - - ~>
56
- - !ruby/object:Gem::Version
68
+ - !ruby/object:Gem::Version
57
69
  version: 2.0.0
58
70
  type: :development
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
61
- name: mongo_mapper
62
71
  prerelease: false
63
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.0.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: mongo_mapper
80
+ requirement: !ruby/object:Gem::Requirement
64
81
  none: false
65
- requirements:
82
+ requirements:
66
83
  - - ~>
67
- - !ruby/object:Gem::Version
84
+ - !ruby/object:Gem::Version
68
85
  version: 0.9.0
69
86
  type: :development
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
72
- name: mocha
73
87
  prerelease: false
74
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
75
89
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- version: "0"
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.9.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: mocha
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
80
102
  type: :development
81
- version_requirements: *id006
82
- - !ruby/object:Gem::Dependency
83
- name: simple_form
84
103
  prerelease: false
85
- requirement: &id007 !ruby/object:Gem::Requirement
104
+ version_requirements: !ruby/object:Gem::Requirement
86
105
  none: false
87
- requirements:
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- version: "0"
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: simple_form
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 1.5.0
91
118
  type: :development
92
- version_requirements: *id007
93
- - !ruby/object:Gem::Dependency
94
- name: formtastic
95
119
  prerelease: false
96
- requirement: &id008 !ruby/object:Gem::Requirement
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 1.5.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: formtastic
128
+ requirement: !ruby/object:Gem::Requirement
97
129
  none: false
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: "0"
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.2.0
102
134
  type: :development
103
- version_requirements: *id008
104
- - !ruby/object:Gem::Dependency
105
- name: sinatra
106
135
  prerelease: false
107
- requirement: &id009 !ruby/object:Gem::Requirement
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 1.2.0
142
+ - !ruby/object:Gem::Dependency
143
+ name: sinatra
144
+ requirement: !ruby/object:Gem::Requirement
108
145
  none: false
109
- requirements:
146
+ requirements:
110
147
  - - ~>
111
- - !ruby/object:Gem::Version
112
- version: "1.0"
148
+ - !ruby/object:Gem::Version
149
+ version: '1.0'
113
150
  type: :development
114
- version_requirements: *id009
115
- - !ruby/object:Gem::Dependency
116
- name: shotgun
117
151
  prerelease: false
118
- requirement: &id010 !ruby/object:Gem::Requirement
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: '1.0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: shotgun
160
+ requirement: !ruby/object:Gem::Requirement
119
161
  none: false
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: "0"
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
124
166
  type: :development
125
- version_requirements: *id010
126
- - !ruby/object:Gem::Dependency
127
- name: thin
128
167
  prerelease: false
129
- requirement: &id011 !ruby/object:Gem::Requirement
168
+ version_requirements: !ruby/object:Gem::Requirement
130
169
  none: false
131
- requirements:
132
- - - ">="
133
- - !ruby/object:Gem::Version
134
- version: "0"
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: thin
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
135
182
  type: :development
136
- version_requirements: *id011
137
- - !ruby/object:Gem::Dependency
138
- name: json
139
183
  prerelease: false
140
- requirement: &id012 !ruby/object:Gem::Requirement
184
+ version_requirements: !ruby/object:Gem::Requirement
141
185
  none: false
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: "0"
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: json
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
146
198
  type: :development
147
- version_requirements: *id012
148
- - !ruby/object:Gem::Dependency
149
- name: ruby-debug19
150
199
  prerelease: false
151
- requirement: &id013 !ruby/object:Gem::Requirement
200
+ version_requirements: !ruby/object:Gem::Requirement
152
201
  none: false
153
- requirements:
154
- - - ">="
155
- - !ruby/object:Gem::Version
156
- version: "0"
157
- type: :development
158
- version_requirements: *id013
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
159
206
  description: Client Side Validations
160
- email:
207
+ email:
161
208
  - bcardarella@gmail.com
162
209
  executables: []
163
-
164
210
  extensions: []
165
-
166
211
  extra_rdoc_files: []
167
-
168
- files:
212
+ files:
169
213
  - client_side_validations.gemspec
170
214
  - lib/client_side_validations.rb
171
215
  - lib/client_side_validations/action_view.rb
@@ -277,35 +321,37 @@ files:
277
321
  - test/simple_form/cases/helper.rb
278
322
  - test/simple_form/cases/test_form_builder.rb
279
323
  - test/simple_form/cases/test_form_helper.rb
280
- has_rdoc: true
281
324
  homepage: https://github.com/bcardarella/client_side_validations
282
325
  licenses: []
283
-
284
326
  post_install_message:
285
327
  rdoc_options: []
286
-
287
- require_paths:
328
+ require_paths:
288
329
  - lib
289
- required_ruby_version: !ruby/object:Gem::Requirement
330
+ required_ruby_version: !ruby/object:Gem::Requirement
290
331
  none: false
291
- requirements:
292
- - - ">="
293
- - !ruby/object:Gem::Version
294
- version: "0"
295
- required_rubygems_version: !ruby/object:Gem::Requirement
332
+ requirements:
333
+ - - ! '>='
334
+ - !ruby/object:Gem::Version
335
+ version: '0'
336
+ segments:
337
+ - 0
338
+ hash: 1590299980694445321
339
+ required_rubygems_version: !ruby/object:Gem::Requirement
296
340
  none: false
297
- requirements:
298
- - - ">="
299
- - !ruby/object:Gem::Version
300
- version: "0"
341
+ requirements:
342
+ - - ! '>='
343
+ - !ruby/object:Gem::Version
344
+ version: '0'
345
+ segments:
346
+ - 0
347
+ hash: 1590299980694445321
301
348
  requirements: []
302
-
303
349
  rubyforge_project:
304
- rubygems_version: 1.5.3
350
+ rubygems_version: 1.8.23
305
351
  signing_key:
306
352
  specification_version: 3
307
353
  summary: Client Side Validations
308
- test_files:
354
+ test_files:
309
355
  - test/action_view/cases/helper.rb
310
356
  - test/action_view/cases/test_helpers.rb
311
357
  - test/action_view/cases/test_legacy_helpers.rb