client_side_validations 3.0.3 → 3.1.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 (73) hide show
  1. data/client_side_validations.gemspec +4 -7
  2. data/lib/client_side_validations/action_view/form_builder.rb +85 -11
  3. data/lib/client_side_validations/action_view/form_helper.rb +21 -3
  4. data/lib/client_side_validations/action_view.rb +4 -3
  5. data/lib/client_side_validations/active_model/length.rb +12 -10
  6. data/lib/client_side_validations/active_model/numericality.rb +14 -9
  7. data/lib/client_side_validations/active_model.rb +21 -13
  8. data/lib/client_side_validations/active_record/middleware.rb +5 -1
  9. data/lib/client_side_validations/active_record/uniqueness.rb +10 -8
  10. data/lib/client_side_validations/engine.rb +6 -0
  11. data/lib/client_side_validations/files.rb +8 -0
  12. data/lib/client_side_validations/formtastic.rb +3 -3
  13. data/lib/client_side_validations/middleware.rb +5 -7
  14. data/lib/client_side_validations/mongo_mapper/middleware.rb +20 -0
  15. data/lib/client_side_validations/mongo_mapper/uniqueness.rb +28 -0
  16. data/lib/client_side_validations/mongo_mapper.rb +9 -0
  17. data/lib/client_side_validations/mongoid/uniqueness.rb +10 -8
  18. data/lib/client_side_validations/version.rb +1 -1
  19. data/lib/client_side_validations.rb +8 -3
  20. data/lib/generators/client_side_validations/copy_asset_generator.rb +23 -0
  21. data/lib/generators/client_side_validations/install_generator.rb +18 -6
  22. data/lib/generators/templates/client_side_validations/README.rails.3.0 +6 -0
  23. data/lib/generators/templates/client_side_validations/README.rails.3.1 +7 -0
  24. data/lib/generators/templates/{client_side_validations.rb → client_side_validations/initializer.rb} +1 -1
  25. data/test/action_view/cases/helper.rb +34 -12
  26. data/test/action_view/cases/test_helpers.rb +314 -1
  27. data/test/action_view/cases/test_legacy_helpers.rb +58 -1
  28. data/test/active_model/cases/test_validations.rb +21 -8
  29. data/test/active_record/cases/test_middleware.rb +41 -16
  30. data/test/active_record/cases/test_uniqueness_validator.rb +5 -0
  31. data/test/active_record/models/user.rb +4 -0
  32. data/test/base_helper.rb +2 -0
  33. data/test/core_ext/cases/test_core_ext.rb +1 -0
  34. data/test/formtastic/cases/helper.rb +5 -0
  35. data/test/formtastic/cases/test_form_builder.rb +3 -3
  36. data/test/formtastic/cases/test_form_helper.rb +3 -4
  37. data/test/generators/cases/test_generators.rb +31 -0
  38. data/test/javascript/public/test/callbacks/elementAfter.js +1 -1
  39. data/test/javascript/public/test/callbacks/elementBefore.js +1 -1
  40. data/test/javascript/public/test/callbacks/elementFail.js +1 -1
  41. data/test/javascript/public/test/callbacks/elementPass.js +1 -1
  42. data/test/javascript/public/test/callbacks/formAfter.js +1 -1
  43. data/test/javascript/public/test/callbacks/formBefore.js +1 -1
  44. data/test/javascript/public/test/callbacks/formFail.js +1 -1
  45. data/test/javascript/public/test/callbacks/formPass.js +1 -1
  46. data/test/javascript/public/test/form_builders/validateForm.js +1 -1
  47. data/test/javascript/public/test/form_builders/validateFormtastic.js +2 -2
  48. data/test/javascript/public/test/form_builders/validateNestedForm.js +66 -0
  49. data/test/javascript/public/test/form_builders/validateSimpleForm.js +1 -1
  50. data/test/javascript/public/test/validateElement.js +36 -1
  51. data/test/javascript/public/test/validators/length.js +7 -1
  52. data/test/javascript/public/test/validators/numericality.js +7 -0
  53. data/test/javascript/public/test/validators/presence.js +6 -0
  54. data/test/javascript/public/test/validators/uniqueness.js +8 -1
  55. data/test/javascript/server.rb +9 -3
  56. data/test/javascript/views/index.erb +1 -1
  57. data/test/javascript/views/layout.erb +1 -1
  58. data/test/middleware/cases/helper.rb +3 -0
  59. data/test/mongo_mapper/cases/helper.rb +9 -0
  60. data/test/mongo_mapper/cases/test_base.rb +15 -0
  61. data/test/mongo_mapper/cases/test_middleware.rb +77 -0
  62. data/test/mongo_mapper/cases/test_uniqueness_validator.rb +50 -0
  63. data/test/mongo_mapper/models/magazine.rb +11 -0
  64. data/test/mongoid/cases/test_middleware.rb +15 -6
  65. data/test/mongoid/cases/test_uniqueness_validator.rb +5 -0
  66. data/test/mongoid/models/book.rb +4 -0
  67. data/test/simple_form/cases/helper.rb +3 -0
  68. data/test/simple_form/cases/test_form_helper.rb +3 -1
  69. data/test/test_loader.rb +6 -0
  70. data/{javascript → vendor/assets/javascripts}/rails.validations.js +32 -17
  71. metadata +44 -23
  72. data/lib/generators/templates/README +0 -7
  73. data/test/generators/cases/test_install_generator.rb +0 -15
@@ -0,0 +1,15 @@
1
+ require 'mongo_mapper/cases/helper'
2
+
3
+ class ClientSideValidations::MongoMapperTestBase < Test::Unit::TestCase
4
+ include MongoMapper::Plugins::Validations
5
+
6
+ def setup
7
+ @magazine = Magazine.new
8
+ end
9
+
10
+ def test_uniqueness_client_side_hash
11
+ expected_hash = { :message => "has already been taken", :case_sensitive => true}
12
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name]).client_side_hash(@magazine, :age)
13
+ end
14
+ end
15
+
@@ -0,0 +1,77 @@
1
+ require 'middleware/cases/helper'
2
+ require 'mongo_mapper/cases/helper'
3
+
4
+ class ClientSideValidationsMongoMapperMiddlewareTest < Test::Unit::TestCase
5
+ include Rack::Test::Methods
6
+
7
+ def setup
8
+ # I've been burned enough times with not having the db clear
9
+ # I should probably use a db cleaner instead of this
10
+ Magazine.delete_all
11
+ end
12
+
13
+ def teardown
14
+ Magazine.delete_all
15
+ end
16
+
17
+ def app
18
+ app = Proc.new { |env| [200, {}, ['success']] }
19
+ ClientSideValidations::Middleware::Validators.new(app)
20
+ end
21
+
22
+ def test_uniqueness_when_resource_exists
23
+ Magazine.create(:author_email => 'magazine@test.com')
24
+ get '/validators/uniqueness', { 'magazine[author_email]' => 'magazine@test.com' }
25
+
26
+ assert_equal 'false', last_response.body
27
+ assert last_response.ok?
28
+ end
29
+
30
+ def test_uniqueness_when_resource_does_not_exist
31
+ get '/validators/uniqueness', { 'magazine[author_email]' => 'magazine@test.com' }
32
+
33
+ assert_equal 'true', last_response.body
34
+ assert last_response.not_found?
35
+ end
36
+
37
+ def test_uniqueness_when_id_is_given
38
+ magazine = Magazine.create(:author_email => 'magazine@test.com')
39
+ get '/validators/uniqueness', { 'magazine[author_email]' => 'magazine@test.com', 'id' => magazine.id }
40
+
41
+ assert_equal 'true', last_response.body
42
+ assert last_response.not_found?
43
+ end
44
+
45
+ def test_uniqueness_when_scope_is_given
46
+ Magazine.create(:author_email => 'magazine@test.com', :age => 25)
47
+ get '/validators/uniqueness', { 'magazine[author_email]' => 'magazine@test.com', 'scope' => { 'age' => 30 } }
48
+
49
+ assert_equal 'true', last_response.body
50
+ assert last_response.not_found?
51
+ end
52
+
53
+ def test_uniqueness_when_multiple_scopes_are_given
54
+ Magazine.create(:author_email => 'magazine@test.com', :age => 30, :author_name => 'Brian')
55
+ get '/validators/uniqueness', { 'magazine[author_email]' => 'magazine@test.com', 'scope' => { 'age' => 30, 'author_name' => 'Robert' } }
56
+
57
+ assert_equal 'true', last_response.body
58
+ assert last_response.not_found?
59
+ end
60
+
61
+ def test_uniqueness_when_case_insensitive
62
+ Magazine.create(:author_name => 'Brian')
63
+ get '/validators/uniqueness', { 'magazine[author_name]' => 'BRIAN', 'case_sensitive' => false }
64
+
65
+ assert_equal 'false', last_response.body
66
+ assert last_response.ok?
67
+ end
68
+
69
+ def test_uniqueness_when_resource_exists
70
+ MongoMapperTestModule::Magazine2.create(:author_email => 'magazine@test.com')
71
+ get '/validators/uniqueness', { 'mongo_mapper_test_module/magazine2[author_email]' => 'magazine@test.com' }
72
+
73
+ assert_equal 'false', last_response.body
74
+ assert last_response.ok?
75
+ end
76
+ end
77
+
@@ -0,0 +1,50 @@
1
+ require 'mongo_mapper/cases/test_base'
2
+
3
+ class MongoMapper::UniqunessValidatorTest < ClientSideValidations::MongoMapperTestBase
4
+
5
+ def test_uniqueness_client_side_hash
6
+ expected_hash = { :message => "has already been taken" }
7
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name]).client_side_hash(@magazine, :age)
8
+ end
9
+
10
+ def test_uniqueness_client_side_hash_with_custom_message
11
+ expected_hash = { :message => "is not available" , :case_sensitive => true }
12
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name], :message => "is not available").client_side_hash(@magazine, :age)
13
+ end
14
+
15
+ def test_uniqueness_client_side_hash
16
+ @magazine.stubs(:new_record?).returns(false)
17
+ @magazine.stubs(:id).returns(1)
18
+ expected_hash = { :message => "has already been taken", :case_sensitive => true , :id => 1 }
19
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name]).client_side_hash(@magazine, :age)
20
+ end
21
+
22
+ def test_uniqueness_client_side_hash_with_single_scope_item
23
+ @magazine.stubs(:author_email).returns("test@test.com")
24
+ expected_hash = { :message => "has already been taken", :case_sensitive => true , :scope => {:author_email => "test@test.com"} }
25
+ result_hash = UniquenessValidator.new(:attributes => [:author_name], :scope => :author_email).client_side_hash(@magazine, :author_name)
26
+ assert_equal expected_hash, result_hash
27
+ end
28
+
29
+ def test_uniqueness_client_side_hash_with_multiple_scope_items
30
+ @magazine.stubs(:age).returns(30)
31
+ @magazine.stubs(:author_email).returns("test@test.com")
32
+ expected_hash = { :message => "has already been taken", :case_sensitive => true , :scope => {:age => 30, :author_email => "test@test.com"} }
33
+ result_hash = UniquenessValidator.new(:attributes => [:author_name], :scope => [:age, :author_email]).client_side_hash(@magazine, :author_name)
34
+ assert_equal expected_hash, result_hash
35
+ end
36
+
37
+ def test_uniqueness_client_side_hash_with_empty_scope_array
38
+ expected_hash = { :message => "has already been taken" , :case_sensitive => true }
39
+ result_hash = UniquenessValidator.new(:attributes => [:author_name], :scope => []).client_side_hash(@magazine, :author_name)
40
+ assert_equal expected_hash, result_hash
41
+ end
42
+
43
+ def test_uniqueness_client_side_hash_when_nested_module
44
+ @magazine = MongoMapperTestModule::Magazine2.new
45
+ expected_hash = { :message => "has already been taken", :case_sensitive => true, :class => 'mongo_mapper_test_module/magazine2' }
46
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name]).client_side_hash(@magazine, :age)
47
+ end
48
+
49
+ end
50
+
@@ -0,0 +1,11 @@
1
+ class Magazine
2
+ include MongoMapper::Document
3
+
4
+ key :age, Integer
5
+ key :author_name, String
6
+ key :author_email, String
7
+ end
8
+
9
+ module MongoMapperTestModule
10
+ class Magazine2 < Magazine; end
11
+ end
@@ -21,14 +21,14 @@ class ClientSideValidationsMongoidMiddlewareTest < Test::Unit::TestCase
21
21
 
22
22
  def test_uniqueness_when_resource_exists
23
23
  Book.create(:author_email => 'book@test.com')
24
- get '/validators/uniqueness.json', { 'book[author_email]' => 'book@test.com' }
24
+ get '/validators/uniqueness', { 'book[author_email]' => 'book@test.com' }
25
25
 
26
26
  assert_equal 'false', last_response.body
27
27
  assert last_response.ok?
28
28
  end
29
29
 
30
30
  def test_uniqueness_when_resource_does_not_exist
31
- get '/validators/uniqueness.json', { 'book[author_email]' => 'book@test.com' }
31
+ get '/validators/uniqueness', { 'book[author_email]' => 'book@test.com' }
32
32
 
33
33
  assert_equal 'true', last_response.body
34
34
  assert last_response.not_found?
@@ -36,7 +36,7 @@ class ClientSideValidationsMongoidMiddlewareTest < Test::Unit::TestCase
36
36
 
37
37
  def test_uniqueness_when_id_is_given
38
38
  book = Book.create(:author_email => 'book@test.com')
39
- get '/validators/uniqueness.json', { 'book[author_email]' => 'book@test.com', 'id' => book.id }
39
+ get '/validators/uniqueness', { 'book[author_email]' => 'book@test.com', 'id' => book.id }
40
40
 
41
41
  assert_equal 'true', last_response.body
42
42
  assert last_response.not_found?
@@ -44,7 +44,7 @@ class ClientSideValidationsMongoidMiddlewareTest < Test::Unit::TestCase
44
44
 
45
45
  def test_uniqueness_when_scope_is_given
46
46
  Book.create(:author_email => 'book@test.com', :age => 25)
47
- get '/validators/uniqueness.json', { 'book[author_email]' => 'book@test.com', 'scope' => { 'age' => 30 } }
47
+ get '/validators/uniqueness', { 'book[author_email]' => 'book@test.com', 'scope' => { 'age' => 30 } }
48
48
 
49
49
  assert_equal 'true', last_response.body
50
50
  assert last_response.not_found?
@@ -52,7 +52,7 @@ class ClientSideValidationsMongoidMiddlewareTest < Test::Unit::TestCase
52
52
 
53
53
  def test_uniqueness_when_multiple_scopes_are_given
54
54
  Book.create(:author_email => 'book@test.com', :age => 30, :author_name => 'Brian')
55
- get '/validators/uniqueness.json', { 'book[author_email]' => 'book@test.com', 'scope' => { 'age' => 30, 'author_name' => 'Robert' } }
55
+ get '/validators/uniqueness', { 'book[author_email]' => 'book@test.com', 'scope' => { 'age' => 30, 'author_name' => 'Robert' } }
56
56
 
57
57
  assert_equal 'true', last_response.body
58
58
  assert last_response.not_found?
@@ -60,9 +60,18 @@ class ClientSideValidationsMongoidMiddlewareTest < Test::Unit::TestCase
60
60
 
61
61
  def test_uniqueness_when_case_insensitive
62
62
  Book.create(:author_name => 'Brian')
63
- get '/validators/uniqueness.json', { 'book[author_name]' => 'BRIAN', 'case_sensitive' => false }
63
+ get '/validators/uniqueness', { 'book[author_name]' => 'BRIAN', 'case_sensitive' => false }
64
+
65
+ assert_equal 'false', last_response.body
66
+ assert last_response.ok?
67
+ end
68
+
69
+ def test_uniqueness_when_resource_is_a_nested_module
70
+ MongoidTestModule::Book2.create(:author_email => 'book@test.com')
71
+ get '/validators/uniqueness', { 'mongoid_test_module/book2[author_email]' => 'book@test.com' }
64
72
 
65
73
  assert_equal 'false', last_response.body
66
74
  assert last_response.ok?
67
75
  end
68
76
  end
77
+
@@ -40,5 +40,10 @@ class Mongoid::UniqunessValidatorTest < ClientSideValidations::MongoidTestBase
40
40
  assert_equal expected_hash, result_hash
41
41
  end
42
42
 
43
+ def test_uniqueness_client_side_hash_when_nested_module
44
+ @book = MongoidTestModule::Book2.new
45
+ expected_hash = { :message => "is already taken", :class => 'mongoid_test_module/book2' }
46
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name]).client_side_hash(@book, :age)
47
+ end
43
48
  end
44
49
 
@@ -6,3 +6,7 @@ class Book
6
6
  field :author_email, :type => String
7
7
  end
8
8
 
9
+ module MongoidTestModule
10
+ class Book2 < Book; end
11
+ end
12
+
@@ -1,2 +1,5 @@
1
+ require 'action_view'
2
+ require 'action_controller/railtie'
3
+ require 'rails'
1
4
  require 'simple_form'
2
5
  require 'client_side_validations/simple_form'
@@ -1,4 +1,5 @@
1
1
  require 'action_view/cases/helper'
2
+ require 'middleware/cases/helper'
2
3
  require 'simple_form/cases/helper'
3
4
 
4
5
  class ClientSideValidations::SimpleForm::FormHelperTest < ActionView::TestCase
@@ -10,11 +11,12 @@ class ClientSideValidations::SimpleForm::FormHelperTest < ActionView::TestCase
10
11
  end
11
12
 
12
13
  def test_simple_form_for
14
+ ActionView::TestCase::TestController.any_instance.stubs(:action_name).returns('edit')
13
15
  simple_form_for(@post, :validate => true) do |f|
14
16
  concat f.input(:cost)
15
17
  end
16
18
 
17
- expected = %{<form accept-charset="UTF-8" action="/posts/123" class="simple_form 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><div class="input string required"><label class="string required" for="post_cost"><abbr title="required">*</abbr> Cost</label><input class="string required" data-validate="true" id="post_cost" name="post[cost]" required="required" size="50" type="text" /></div></form><script>var edit_post_123 = {"type":"SimpleForm::FormBuilder","error_class":"error","error_tag":"span","wrapper_error_class":"field_with_errors","wrapper_tag":"div","validators":{"post[cost]":{"presence":{"message":"can't be blank"}}}};</script>}
19
+ expected = %{<form accept-charset="UTF-8" action="/posts/123" class="simple_form 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><div class="input string required"><label class="string required" for="post_cost"><abbr title="required">*</abbr> Cost</label><input class="string required" data-validate="true" id="post_cost" name="post[cost]" required="required" size="50" type="text" /></div></form><script>window['edit_post_123'] = {"type":"SimpleForm::FormBuilder","error_class":"error","error_tag":"span","wrapper_error_class":"field_with_errors","wrapper_tag":"div","validators":{"post[cost]":{"presence":{"message":"can't be blank"}}}};</script>}
18
20
  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
21
  end
20
22
 
@@ -0,0 +1,6 @@
1
+ # Sanity check to make sure the entire library loads OK
2
+
3
+ require 'base_helper'
4
+ require 'client_side_validations'
5
+ require 'client_side_validations/files'
6
+ require 'client_side_validations/version'
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Rails 3 Client Side Validations - v3.0.1
2
+ * Rails 3 Client Side Validations - v3.1.0
3
3
  * https://github.com/bcardarlela/client_side_validations
4
4
  *
5
5
  * Copyright (c) 2011 Brian Cardarella
@@ -24,7 +24,7 @@
24
24
  .bind('form:validate:pass', function(eventData) { clientSideValidations.callbacks.form.pass( form, eventData); })
25
25
 
26
26
  // Set up the events for each validatable form element
27
- .find('[data-validate]:input')
27
+ .find('[data-validate]:input:not(:radio)')
28
28
  .live('focusout', function() { $(this).isValid(settings.validators); })
29
29
  .live('change', function() { $(this).data('changed', true); })
30
30
  // Callbacks
@@ -48,13 +48,15 @@
48
48
  var confirmationElement = $(this),
49
49
  element = form.find('#' + this.id.match(/(.+)_confirmation/)[1] + '[data-validate]:input');
50
50
 
51
- $('#' + confirmationElement.attr('id'))
52
- .live('focusout', function() {
53
- element.data('changed', true).isValid(settings.validators);
54
- })
55
- .live('keyup', function() {
56
- element.data('changed', true).isValid(settings.validators);
57
- })
51
+ if (element[0]) {
52
+ $('#' + confirmationElement.attr('id'))
53
+ .live('focusout', function() {
54
+ element.data('changed', true).isValid(settings.validators);
55
+ })
56
+ .live('keyup', function() {
57
+ element.data('changed', true).isValid(settings.validators);
58
+ })
59
+ }
58
60
  });
59
61
 
60
62
  var addError = function(element, message) {
@@ -127,7 +129,7 @@ var clientSideValidations = {
127
129
  all: function() { return jQuery.extend({}, clientSideValidations.validators.local, clientSideValidations.validators.remote) },
128
130
  local: {
129
131
  presence: function(element, options) {
130
- if (/^\s*$/.test(element.val())) {
132
+ if (/^\s*$/.test(element.val() || "")) {
131
133
  return options.message;
132
134
  }
133
135
  },
@@ -171,7 +173,7 @@ var clientSideValidations = {
171
173
  equal_to: '==', less_than: '<', less_than_or_equal_to: '<=' }
172
174
 
173
175
  for (var check in CHECKS) {
174
- if (options[check] && !(new Function("return " + element.val() + CHECKS[check] + options[check])())) {
176
+ if (options[check] != undefined && !(new Function("return " + element.val() + CHECKS[check] + options[check])())) {
175
177
  return options.messages[check];
176
178
  }
177
179
  }
@@ -191,7 +193,7 @@ var clientSideValidations = {
191
193
  } else if (options.minimum) {
192
194
  blankOptions.message = options.messages.minimum;
193
195
  }
194
- if ((message = this.presence(element, blankOptions)) && options.allow_blank == true && !options.maximum) {
196
+ if ((message = this.presence(element, blankOptions)) && options.allow_blank == true) {
195
197
  return;
196
198
  } else if (message) {
197
199
  return message;
@@ -290,10 +292,15 @@ var clientSideValidations = {
290
292
  } else {
291
293
  var name = element.attr('name');
292
294
  }
295
+
296
+ // Override the name if a nested module class is passed
297
+ if (options['class']) {
298
+ name = options['class'] + '[' + name.split('[')[1]
299
+ }
293
300
  data[name] = element.val();
294
301
 
295
302
  if (jQuery.ajax({
296
- url: '/validators/uniqueness.json',
303
+ url: '/validators/uniqueness',
297
304
  data: data,
298
305
  async: false
299
306
  }).status == 200) {
@@ -305,7 +312,7 @@ var clientSideValidations = {
305
312
  formBuilders: {
306
313
  'ActionView::Helpers::FormBuilder': {
307
314
  add: function(element, settings, message) {
308
- if (element.data('valid') !== false) {
315
+ if (element.data('valid') !== false && jQuery('label.message[for="' + element.attr('id') + '"]')[0] == undefined) {
309
316
  var inputErrorField = jQuery(settings.input_tag),
310
317
  labelErrorField = jQuery(settings.label_tag),
311
318
  label = jQuery('label[for="' + element.attr('id') + '"]:not(.message)');
@@ -314,6 +321,7 @@ var clientSideValidations = {
314
321
  element.before(inputErrorField);
315
322
  inputErrorField.find('span#input_tag').replaceWith(element);
316
323
  inputErrorField.find('label.message').attr('for', element.attr('id'));
324
+ labelErrorField.find('label.message').attr('for', element.attr('id'));
317
325
  label.replaceWith(labelErrorField);
318
326
  labelErrorField.find('label#label_tag').replaceWith(label);
319
327
  }
@@ -352,7 +360,7 @@ var clientSideValidations = {
352
360
  }
353
361
 
354
362
  },
355
- 'Formtastic::SemanticFormBuilder': {
363
+ 'Formtastic::FormBuilder': {
356
364
  add: function(element, settings, message) {
357
365
  if (element.data('valid') !== false) {
358
366
  var wrapper = element.closest('li');
@@ -369,7 +377,14 @@ var clientSideValidations = {
369
377
  var errorElement = wrapper.find('p.' + settings.inline_error_class);
370
378
  errorElement.remove();
371
379
  }
372
-
380
+ },
381
+ 'NestedForm::Builder': {
382
+ add: function(element, settings, message) {
383
+ clientSideValidations.formBuilders['ActionView::Helpers::FormBuilder'].add(element, settings, message);
384
+ },
385
+ remove: function(element, settings, message) {
386
+ clientSideValidations.formBuilders['ActionView::Helpers::FormBuilder'].remove(element, settings, message);
387
+ }
373
388
  }
374
389
  },
375
390
  callbacks: {
@@ -386,4 +401,4 @@ var clientSideValidations = {
386
401
  pass: function(form, eventData) { }
387
402
  }
388
403
  }
389
- }
404
+ };
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.3
5
+ version: 3.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Brian Cardarella
@@ -10,33 +10,33 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-18 00:00:00 -04:00
13
+ date: 2011-06-20 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: activesupport
17
+ name: rails
18
18
  prerelease: false
19
19
  requirement: &id001 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
- - - ~>
22
+ - - "="
23
23
  - !ruby/object:Gem::Version
24
- version: 3.0.0
25
- type: :runtime
24
+ version: 3.1.0.rc4
25
+ type: :development
26
26
  version_requirements: *id001
27
27
  - !ruby/object:Gem::Dependency
28
- name: rails
28
+ name: sqlite3
29
29
  prerelease: false
30
30
  requirement: &id002 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
- - - ~>
33
+ - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: 3.0.0
35
+ version: "0"
36
36
  type: :development
37
37
  version_requirements: *id002
38
38
  - !ruby/object:Gem::Dependency
39
- name: sqlite3
39
+ name: bson_ext
40
40
  prerelease: false
41
41
  requirement: &id003 !ruby/object:Gem::Requirement
42
42
  none: false
@@ -47,25 +47,25 @@ dependencies:
47
47
  type: :development
48
48
  version_requirements: *id003
49
49
  - !ruby/object:Gem::Dependency
50
- name: bson_ext
50
+ name: mongoid
51
51
  prerelease: false
52
52
  requirement: &id004 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
- - - ">="
55
+ - - ~>
56
56
  - !ruby/object:Gem::Version
57
- version: "0"
57
+ version: 2.0.0
58
58
  type: :development
59
59
  version_requirements: *id004
60
60
  - !ruby/object:Gem::Dependency
61
- name: mongoid
61
+ name: mongo_mapper
62
62
  prerelease: false
63
63
  requirement: &id005 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 2.0.0
68
+ version: 0.9.0
69
69
  type: :development
70
70
  version_requirements: *id005
71
71
  - !ruby/object:Gem::Dependency
@@ -96,9 +96,9 @@ dependencies:
96
96
  requirement: &id008 !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
99
- - - ">="
99
+ - - ~>
100
100
  - !ruby/object:Gem::Version
101
- version: "0"
101
+ version: 2.0.0.rc3
102
102
  type: :development
103
103
  version_requirements: *id008
104
104
  - !ruby/object:Gem::Dependency
@@ -167,7 +167,6 @@ extra_rdoc_files: []
167
167
 
168
168
  files:
169
169
  - client_side_validations.gemspec
170
- - javascript/rails.validations.js
171
170
  - lib/client_side_validations.rb
172
171
  - lib/client_side_validations/action_view.rb
173
172
  - lib/client_side_validations/action_view/form_builder.rb
@@ -187,16 +186,24 @@ files:
187
186
  - lib/client_side_validations/core_ext.rb
188
187
  - lib/client_side_validations/core_ext/range.rb
189
188
  - lib/client_side_validations/core_ext/regexp.rb
189
+ - lib/client_side_validations/engine.rb
190
+ - lib/client_side_validations/files.rb
190
191
  - lib/client_side_validations/formtastic.rb
191
192
  - lib/client_side_validations/middleware.rb
193
+ - lib/client_side_validations/mongo_mapper.rb
194
+ - lib/client_side_validations/mongo_mapper/middleware.rb
195
+ - lib/client_side_validations/mongo_mapper/uniqueness.rb
192
196
  - lib/client_side_validations/mongoid.rb
193
197
  - lib/client_side_validations/mongoid/middleware.rb
194
198
  - lib/client_side_validations/mongoid/uniqueness.rb
195
199
  - lib/client_side_validations/simple_form.rb
196
200
  - lib/client_side_validations/version.rb
201
+ - lib/generators/client_side_validations/copy_asset_generator.rb
197
202
  - lib/generators/client_side_validations/install_generator.rb
198
- - lib/generators/templates/README
199
- - lib/generators/templates/client_side_validations.rb
203
+ - lib/generators/templates/client_side_validations/README.rails.3.0
204
+ - lib/generators/templates/client_side_validations/README.rails.3.1
205
+ - lib/generators/templates/client_side_validations/initializer.rb
206
+ - vendor/assets/javascripts/rails.validations.js
200
207
  - test/action_view/cases/helper.rb
201
208
  - test/action_view/cases/test_helpers.rb
202
209
  - test/action_view/cases/test_legacy_helpers.rb
@@ -226,7 +233,7 @@ files:
226
233
  - test/formtastic/cases/helper.rb
227
234
  - test/formtastic/cases/test_form_builder.rb
228
235
  - test/formtastic/cases/test_form_helper.rb
229
- - test/generators/cases/test_install_generator.rb
236
+ - test/generators/cases/test_generators.rb
230
237
  - test/javascript/config.ru
231
238
  - test/javascript/public/test/callbacks/elementAfter.js
232
239
  - test/javascript/public/test/callbacks/elementBefore.js
@@ -238,6 +245,7 @@ files:
238
245
  - test/javascript/public/test/callbacks/formPass.js
239
246
  - test/javascript/public/test/form_builders/validateForm.js
240
247
  - test/javascript/public/test/form_builders/validateFormtastic.js
248
+ - test/javascript/public/test/form_builders/validateNestedForm.js
241
249
  - test/javascript/public/test/form_builders/validateSimpleForm.js
242
250
  - test/javascript/public/test/settings.js
243
251
  - test/javascript/public/test/validateElement.js
@@ -258,6 +266,11 @@ files:
258
266
  - test/javascript/views/layout.erb
259
267
  - test/middleware/cases/helper.rb
260
268
  - test/middleware/cases/test_middleware.rb
269
+ - test/mongo_mapper/cases/helper.rb
270
+ - test/mongo_mapper/cases/test_base.rb
271
+ - test/mongo_mapper/cases/test_middleware.rb
272
+ - test/mongo_mapper/cases/test_uniqueness_validator.rb
273
+ - test/mongo_mapper/models/magazine.rb
261
274
  - test/mongoid/cases/helper.rb
262
275
  - test/mongoid/cases/test_base.rb
263
276
  - test/mongoid/cases/test_middleware.rb
@@ -266,6 +279,7 @@ files:
266
279
  - test/simple_form/cases/helper.rb
267
280
  - test/simple_form/cases/test_form_builder.rb
268
281
  - test/simple_form/cases/test_form_helper.rb
282
+ - test/test_loader.rb
269
283
  has_rdoc: true
270
284
  homepage: https://github.com/bcardarella/client_side_validations
271
285
  licenses: []
@@ -289,7 +303,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
289
303
  version: "0"
290
304
  requirements: []
291
305
 
292
- rubyforge_project: client_side_validations
306
+ rubyforge_project:
293
307
  rubygems_version: 1.5.3
294
308
  signing_key:
295
309
  specification_version: 3
@@ -324,7 +338,7 @@ test_files:
324
338
  - test/formtastic/cases/helper.rb
325
339
  - test/formtastic/cases/test_form_builder.rb
326
340
  - test/formtastic/cases/test_form_helper.rb
327
- - test/generators/cases/test_install_generator.rb
341
+ - test/generators/cases/test_generators.rb
328
342
  - test/javascript/config.ru
329
343
  - test/javascript/public/test/callbacks/elementAfter.js
330
344
  - test/javascript/public/test/callbacks/elementBefore.js
@@ -336,6 +350,7 @@ test_files:
336
350
  - test/javascript/public/test/callbacks/formPass.js
337
351
  - test/javascript/public/test/form_builders/validateForm.js
338
352
  - test/javascript/public/test/form_builders/validateFormtastic.js
353
+ - test/javascript/public/test/form_builders/validateNestedForm.js
339
354
  - test/javascript/public/test/form_builders/validateSimpleForm.js
340
355
  - test/javascript/public/test/settings.js
341
356
  - test/javascript/public/test/validateElement.js
@@ -356,6 +371,11 @@ test_files:
356
371
  - test/javascript/views/layout.erb
357
372
  - test/middleware/cases/helper.rb
358
373
  - test/middleware/cases/test_middleware.rb
374
+ - test/mongo_mapper/cases/helper.rb
375
+ - test/mongo_mapper/cases/test_base.rb
376
+ - test/mongo_mapper/cases/test_middleware.rb
377
+ - test/mongo_mapper/cases/test_uniqueness_validator.rb
378
+ - test/mongo_mapper/models/magazine.rb
359
379
  - test/mongoid/cases/helper.rb
360
380
  - test/mongoid/cases/test_base.rb
361
381
  - test/mongoid/cases/test_middleware.rb
@@ -364,3 +384,4 @@ test_files:
364
384
  - test/simple_form/cases/helper.rb
365
385
  - test/simple_form/cases/test_form_builder.rb
366
386
  - test/simple_form/cases/test_form_helper.rb
387
+ - test/test_loader.rb
@@ -1,7 +0,0 @@
1
- **************************************
2
- Client Side Validations
3
-
4
- Currently Client Side Validations only
5
- works with jQuery. You'll need to require
6
- jQuery in your layout file before you
7
- require 'rails.validations.js'
@@ -1,15 +0,0 @@
1
- require 'rails/generators/test_case'
2
- require 'generators/client_side_validations/install_generator'
3
-
4
- class InstallGeneratorTest < Rails::Generators::TestCase
5
- tests ClientSideValidations::Generators::InstallGenerator
6
- destination File.expand_path('../../tmp', __FILE__)
7
- setup :prepare_destination
8
-
9
- test 'Assert all files are properly created' do
10
- run_generator
11
- assert_file 'config/initializers/client_side_validations.rb'
12
- assert_file 'public/javascripts/rails.validations.js'
13
- end
14
- end
15
-