client_side_validations 3.2.0.rc.1 → 3.2.0.rc.2
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.
- data/client_side_validations.gemspec +1 -0
- data/lib/client_side_validations.rb +1 -6
- data/lib/client_side_validations/action_view/form_builder.rb +15 -4
- data/lib/client_side_validations/active_record/middleware.rb +9 -0
- data/lib/client_side_validations/config.rb +8 -0
- data/lib/client_side_validations/middleware.rb +16 -6
- data/lib/client_side_validations/version.rb +1 -1
- data/lib/generators/templates/client_side_validations/initializer.rb +3 -0
- data/vendor/assets/javascripts/rails.validations.js +172 -111
- metadata +20 -3
@@ -1,12 +1,7 @@
|
|
1
1
|
module ClientSideValidations
|
2
|
-
module Config
|
3
|
-
class << self
|
4
|
-
attr_accessor :uniqueness_validator_disabled
|
5
|
-
@uniqueness_validator_disabled = false
|
6
|
-
end
|
7
|
-
end
|
8
2
|
end
|
9
3
|
|
4
|
+
require 'client_side_validations/config'
|
10
5
|
require 'client_side_validations/active_model' if defined?(::ActiveModel)
|
11
6
|
require 'client_side_validations/active_record' if defined?(::ActiveRecord)
|
12
7
|
require 'client_side_validations/action_view' if defined?(::ActionView)
|
@@ -34,6 +34,13 @@ module ClientSideValidations::ActionView::Helpers
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
def validate(*attrs)
|
38
|
+
attrs.each do |attr|
|
39
|
+
build_validation_options(attr)
|
40
|
+
end
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
37
44
|
def initialize_with_client_side_validations(object_name, object, template, options, proc)
|
38
45
|
initialize_without_client_side_validations(object_name, object, template, options, proc)
|
39
46
|
@options[:validators] = { object => {} }
|
@@ -58,22 +65,26 @@ module ClientSideValidations::ActionView::Helpers
|
|
58
65
|
end
|
59
66
|
|
60
67
|
def select_with_client_side_validations(method, choices, options = {}, html_options = {})
|
61
|
-
build_validation_options(method, html_options.merge(:
|
68
|
+
build_validation_options(method, html_options.merge(:name => options[:name]))
|
69
|
+
html_options.delete(:validate)
|
62
70
|
select_without_client_side_validations(method, choices, options, html_options)
|
63
71
|
end
|
64
72
|
|
65
73
|
def collection_select_with_client_side_validations(method, collection, value_method, text_method, options = {}, html_options = {})
|
66
|
-
build_validation_options(method, html_options.merge(:
|
74
|
+
build_validation_options(method, html_options.merge(:name => options[:name]))
|
75
|
+
html_options.delete(:validate)
|
67
76
|
collection_select_without_client_side_validations(method, collection, value_method, text_method, options, html_options)
|
68
77
|
end
|
69
78
|
|
70
79
|
def grouped_collection_select_with_client_side_validations(method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
|
71
|
-
build_validation_options(method, html_options.merge(:
|
80
|
+
build_validation_options(method, html_options.merge(:name => options[:name]))
|
81
|
+
html_options.delete(:validate)
|
72
82
|
grouped_collection_select_without_client_side_validations(method, collection, group_method, group_label_method, option_key_method, option_value_method, options, html_options)
|
73
83
|
end
|
74
84
|
|
75
85
|
def time_zone_select_with_client_side_validations(method, priority_zones = nil, options = {}, html_options = {})
|
76
|
-
build_validation_options(method, html_options.merge(:
|
86
|
+
build_validation_options(method, html_options.merge(:name => options[:name]))
|
87
|
+
html_options.delete(:validate)
|
77
88
|
time_zone_select_without_client_side_validations(method, priority_zones = nil, options, html_options)
|
78
89
|
end
|
79
90
|
|
@@ -6,6 +6,7 @@ module ClientSideValidations::ActiveRecord
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def self.is_unique?(klass, attribute, value, params)
|
9
|
+
klass = find_topmost_superclass(klass)
|
9
10
|
value = type_cast_value(klass, attribute, value)
|
10
11
|
column = klass.columns_hash[attribute.to_s]
|
11
12
|
value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text?
|
@@ -46,5 +47,13 @@ module ClientSideValidations::ActiveRecord
|
|
46
47
|
klass.columns_hash[attribute].type_cast(value)
|
47
48
|
end
|
48
49
|
|
50
|
+
def self.find_topmost_superclass(klass)
|
51
|
+
if is_class?(klass.superclass)
|
52
|
+
find_topmost_superclass(klass.superclass)
|
53
|
+
else
|
54
|
+
klass
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
49
58
|
end
|
50
59
|
end
|
@@ -43,14 +43,20 @@ module ClientSideValidations
|
|
43
43
|
class Uniqueness < Base
|
44
44
|
IGNORE_PARAMS = %w{case_sensitive id scope}
|
45
45
|
REGISTERED_ORMS = []
|
46
|
+
class NotValidatable < StandardError; end
|
46
47
|
|
47
48
|
def response
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
begin
|
50
|
+
if is_unique?
|
51
|
+
self.status = 404
|
52
|
+
self.body = 'true'
|
53
|
+
else
|
54
|
+
self.status = 200
|
55
|
+
self.body = 'false'
|
56
|
+
end
|
57
|
+
rescue NotValidatable
|
58
|
+
self.status = 500
|
59
|
+
self.body = ''
|
54
60
|
end
|
55
61
|
super
|
56
62
|
end
|
@@ -77,6 +83,10 @@ module ClientSideValidations
|
|
77
83
|
value = request.params[resource][attribute]
|
78
84
|
middleware_class = nil
|
79
85
|
|
86
|
+
unless Array.wrap(klass._validators[attribute.to_sym]).find { |v| v.kind == :uniqueness }
|
87
|
+
raise NotValidatable
|
88
|
+
end
|
89
|
+
|
80
90
|
registered_orms.each do |orm|
|
81
91
|
if orm.is_class?(klass)
|
82
92
|
middleware_class = orm
|
@@ -1,5 +1,8 @@
|
|
1
1
|
# ClientSideValidations Initializer
|
2
2
|
|
3
|
+
# Uncomment to disable uniqueness validator, possible security issue
|
4
|
+
# ClientSideValidations::Config.uniqueness_validator_disabled = true
|
5
|
+
|
3
6
|
# Uncomment the following block if you want each input field to have the validation messages attached.
|
4
7
|
# ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
|
5
8
|
# unless html_tag =~ /^<label/
|
@@ -4,102 +4,28 @@
|
|
4
4
|
|
5
5
|
$ = jQuery;
|
6
6
|
|
7
|
+
$.fn.disableClientSideValidations = function() {
|
8
|
+
return ClientSideValidations.disable(this);
|
9
|
+
};
|
10
|
+
|
11
|
+
$.fn.enableClientSideValidations = function() {
|
12
|
+
this.filter('form[data-validate]').each(function() {
|
13
|
+
return ClientSideValidations.enablers.form(this);
|
14
|
+
});
|
15
|
+
return this.filter(':input').each(function() {
|
16
|
+
return ClientSideValidations.enablers.input(this);
|
17
|
+
});
|
18
|
+
};
|
19
|
+
|
20
|
+
$.fn.resetClientSideValidations = function() {
|
21
|
+
return this.filter('form[data-validate]').each(function() {
|
22
|
+
return ClientSideValidations.reset(this);
|
23
|
+
});
|
24
|
+
};
|
25
|
+
|
7
26
|
$.fn.validate = function() {
|
8
27
|
return this.filter('form[data-validate]').each(function() {
|
9
|
-
|
10
|
-
form = $(this);
|
11
|
-
settings = window.ClientSideValidations.forms[form.attr('id')];
|
12
|
-
addError = function(element, message) {
|
13
|
-
return ClientSideValidations.formBuilders[settings.type].add(element, settings, message);
|
14
|
-
};
|
15
|
-
removeError = function(element) {
|
16
|
-
return ClientSideValidations.formBuilders[settings.type].remove(element, settings);
|
17
|
-
};
|
18
|
-
form.submit(function(eventData) {
|
19
|
-
if (!form.isValid(settings.validators)) {
|
20
|
-
return eventData.preventDefault();
|
21
|
-
}
|
22
|
-
});
|
23
|
-
_ref = {
|
24
|
-
'ajax:beforeSend': function(eventData) {
|
25
|
-
if (eventData.target === this) {
|
26
|
-
return form.isValid(settings.validators);
|
27
|
-
}
|
28
|
-
},
|
29
|
-
'form:validate:after': function(eventData) {
|
30
|
-
return ClientSideValidations.callbacks.form.after(form, eventData);
|
31
|
-
},
|
32
|
-
'form:validate:before': function(eventData) {
|
33
|
-
return ClientSideValidations.callbacks.form.before(form, eventData);
|
34
|
-
},
|
35
|
-
'form:validate:fail': function(eventData) {
|
36
|
-
return ClientSideValidations.callbacks.form.fail(form, eventData);
|
37
|
-
},
|
38
|
-
'form:validate:pass': function(eventData) {
|
39
|
-
return ClientSideValidations.callbacks.form.pass(form, eventData);
|
40
|
-
}
|
41
|
-
};
|
42
|
-
for (event in _ref) {
|
43
|
-
binding = _ref[event];
|
44
|
-
form.bind(event, binding);
|
45
|
-
}
|
46
|
-
_ref1 = {
|
47
|
-
'focusout': function() {
|
48
|
-
return $(this).isValid(settings.validators);
|
49
|
-
},
|
50
|
-
'change': function() {
|
51
|
-
return $(this).data('changed', true);
|
52
|
-
},
|
53
|
-
'element:validate:after': function(eventData) {
|
54
|
-
return ClientSideValidations.callbacks.element.after($(this), eventData);
|
55
|
-
},
|
56
|
-
'element:validate:before': function(eventData) {
|
57
|
-
return ClientSideValidations.callbacks.element.before($(this), eventData);
|
58
|
-
},
|
59
|
-
'element:validate:fail': function(eventData, message) {
|
60
|
-
var element;
|
61
|
-
element = $(this);
|
62
|
-
return ClientSideValidations.callbacks.element.fail(element, message, function() {
|
63
|
-
return addError(element, message);
|
64
|
-
}, eventData);
|
65
|
-
},
|
66
|
-
'element:validate:pass': function(eventData) {
|
67
|
-
var element;
|
68
|
-
element = $(this);
|
69
|
-
return ClientSideValidations.callbacks.element.pass(element, function() {
|
70
|
-
return removeError(element);
|
71
|
-
}, eventData);
|
72
|
-
}
|
73
|
-
};
|
74
|
-
for (event in _ref1) {
|
75
|
-
binding = _ref1[event];
|
76
|
-
form.find(':input:enabled:not(:radio):not([id$=_confirmation])').live(event, binding);
|
77
|
-
}
|
78
|
-
form.find(':checkbox').live('click', function() {
|
79
|
-
$(this).isValid(settings.validators);
|
80
|
-
return true;
|
81
|
-
});
|
82
|
-
return form.find('[id$=_confirmation]').each(function() {
|
83
|
-
var confirmationElement, element, _ref2, _results;
|
84
|
-
confirmationElement = $(this);
|
85
|
-
element = form.find("#" + (this.id.match(/(.+)_confirmation/)[1]) + ":input");
|
86
|
-
if (element[0]) {
|
87
|
-
_ref2 = {
|
88
|
-
'focusout': function() {
|
89
|
-
return element.data('changed', true).isValid(settings.validators);
|
90
|
-
},
|
91
|
-
'keyup': function() {
|
92
|
-
return element.data('changed', true).isValid(settings.validators);
|
93
|
-
}
|
94
|
-
};
|
95
|
-
_results = [];
|
96
|
-
for (event in _ref2) {
|
97
|
-
binding = _ref2[event];
|
98
|
-
_results.push($("#" + (confirmationElement.attr('id'))).live(event, binding));
|
99
|
-
}
|
100
|
-
return _results;
|
101
|
-
}
|
102
|
-
});
|
28
|
+
return $(this).enableClientSideValidations();
|
103
29
|
});
|
104
30
|
};
|
105
31
|
|
@@ -120,35 +46,35 @@
|
|
120
46
|
|
121
47
|
validateForm = function(form, validators) {
|
122
48
|
var valid;
|
123
|
-
form.trigger('form:validate:before');
|
49
|
+
form.trigger('form:validate:before.ClientSideValidations');
|
124
50
|
valid = true;
|
125
|
-
form.find(':input:enabled').each(function() {
|
51
|
+
form.find(':input:enabled:visible[data-validate]').each(function() {
|
126
52
|
if (!$(this).isValid(validators)) {
|
127
53
|
valid = false;
|
128
54
|
}
|
129
55
|
return true;
|
130
56
|
});
|
131
57
|
if (valid) {
|
132
|
-
form.trigger('form:validate:pass');
|
58
|
+
form.trigger('form:validate:pass.ClientSideValidations');
|
133
59
|
} else {
|
134
|
-
form.trigger('form:validate:fail');
|
60
|
+
form.trigger('form:validate:fail.ClientSideValidations');
|
135
61
|
}
|
136
|
-
form.trigger('form:validate:after');
|
62
|
+
form.trigger('form:validate:after.ClientSideValidations');
|
137
63
|
return valid;
|
138
64
|
};
|
139
65
|
|
140
66
|
validateElement = function(element, validators) {
|
141
67
|
var afterValidate, destroyInputName, executeValidators, failElement, local, passElement, remote;
|
142
|
-
element.trigger('element:validate:before');
|
68
|
+
element.trigger('element:validate:before.ClientSideValidations');
|
143
69
|
passElement = function() {
|
144
|
-
return element.trigger('element:validate:pass').data('valid', null);
|
70
|
+
return element.trigger('element:validate:pass.ClientSideValidations').data('valid', null);
|
145
71
|
};
|
146
72
|
failElement = function(message) {
|
147
|
-
element.trigger('element:validate:fail', message).data('valid', false);
|
73
|
+
element.trigger('element:validate:fail.ClientSideValidations', message).data('valid', false);
|
148
74
|
return false;
|
149
75
|
};
|
150
76
|
afterValidate = function() {
|
151
|
-
return element.trigger('element:validate:after').data('valid') !== false;
|
77
|
+
return element.trigger('element:validate:after.ClientSideValidations').data('valid') !== false;
|
152
78
|
};
|
153
79
|
executeValidators = function(context) {
|
154
80
|
var fn, kind, message, valid, validator, _i, _len, _ref;
|
@@ -200,6 +126,141 @@
|
|
200
126
|
window.ClientSideValidations.forms = {};
|
201
127
|
}
|
202
128
|
|
129
|
+
window.ClientSideValidations.reset = function(form) {
|
130
|
+
var $form, key;
|
131
|
+
$form = $(form);
|
132
|
+
ClientSideValidations.disable(form);
|
133
|
+
ClientSideValidations.disable($form.find(':input'));
|
134
|
+
for (key in form.ClientSideValidations.settings.validators) {
|
135
|
+
form.ClientSideValidations.removeError($form.find("[name='" + key + "']"));
|
136
|
+
}
|
137
|
+
return ClientSideValidations.enablers.form(form);
|
138
|
+
};
|
139
|
+
|
140
|
+
window.ClientSideValidations.disable = function(target) {
|
141
|
+
var $target;
|
142
|
+
$target = $(target);
|
143
|
+
$target.off('.ClientSideValidations');
|
144
|
+
$target.removeData('valid');
|
145
|
+
$target.removeData('changed');
|
146
|
+
return $target.filter(':input').each(function() {
|
147
|
+
return $(this).removeAttr('data-validate');
|
148
|
+
});
|
149
|
+
};
|
150
|
+
|
151
|
+
window.ClientSideValidations.enablers = {
|
152
|
+
form: function(form) {
|
153
|
+
var $form, binding, event, _ref;
|
154
|
+
$form = $(form);
|
155
|
+
form.ClientSideValidations = {
|
156
|
+
settings: window.ClientSideValidations.forms[$form.attr('id')],
|
157
|
+
addError: function(element, message) {
|
158
|
+
return ClientSideValidations.formBuilders[form.ClientSideValidations.settings.type].add(element, form.ClientSideValidations.settings, message);
|
159
|
+
},
|
160
|
+
removeError: function(element) {
|
161
|
+
return ClientSideValidations.formBuilders[form.ClientSideValidations.settings.type].remove(element, form.ClientSideValidations.settings);
|
162
|
+
}
|
163
|
+
};
|
164
|
+
_ref = {
|
165
|
+
'submit.ClientSideValidations': function(eventData) {
|
166
|
+
if (!$form.isValid(form.ClientSideValidations.settings.validators)) {
|
167
|
+
eventData.preventDefault();
|
168
|
+
return eventData.stopImmediatePropagation();
|
169
|
+
}
|
170
|
+
},
|
171
|
+
'ajax:beforeSend.ClientSideValidations': function(eventData) {
|
172
|
+
if (eventData.target === this) {
|
173
|
+
return $form.isValid(form.ClientSideValidations.settings.validators);
|
174
|
+
}
|
175
|
+
},
|
176
|
+
'form:validate:after.ClientSideValidations': function(eventData) {
|
177
|
+
return ClientSideValidations.callbacks.form.after($form, eventData);
|
178
|
+
},
|
179
|
+
'form:validate:before.ClientSideValidations': function(eventData) {
|
180
|
+
return ClientSideValidations.callbacks.form.before($form, eventData);
|
181
|
+
},
|
182
|
+
'form:validate:fail.ClientSideValidations': function(eventData) {
|
183
|
+
return ClientSideValidations.callbacks.form.fail($form, eventData);
|
184
|
+
},
|
185
|
+
'form:validate:pass.ClientSideValidations': function(eventData) {
|
186
|
+
return ClientSideValidations.callbacks.form.pass($form, eventData);
|
187
|
+
}
|
188
|
+
};
|
189
|
+
for (event in _ref) {
|
190
|
+
binding = _ref[event];
|
191
|
+
$form.on(event, binding);
|
192
|
+
}
|
193
|
+
return $form.find(':input').each(function() {
|
194
|
+
return ClientSideValidations.enablers.input(this);
|
195
|
+
});
|
196
|
+
},
|
197
|
+
input: function(input) {
|
198
|
+
var $form, $input, binding, event, form, _ref;
|
199
|
+
$input = $(input);
|
200
|
+
form = input.form;
|
201
|
+
$form = $(form);
|
202
|
+
_ref = {
|
203
|
+
'focusout.ClientSideValidations': function() {
|
204
|
+
return $(this).isValid(form.ClientSideValidations.settings.validators);
|
205
|
+
},
|
206
|
+
'change.ClientSideValidations': function() {
|
207
|
+
return $(this).data('changed', true);
|
208
|
+
},
|
209
|
+
'element:validate:after.ClientSideValidations': function(eventData) {
|
210
|
+
return ClientSideValidations.callbacks.element.after($(this), eventData);
|
211
|
+
},
|
212
|
+
'element:validate:before.ClientSideValidations': function(eventData) {
|
213
|
+
return ClientSideValidations.callbacks.element.before($(this), eventData);
|
214
|
+
},
|
215
|
+
'element:validate:fail.ClientSideValidations': function(eventData, message) {
|
216
|
+
var element;
|
217
|
+
element = $(this);
|
218
|
+
return ClientSideValidations.callbacks.element.fail(element, message, function() {
|
219
|
+
return form.ClientSideValidations.addError(element, message);
|
220
|
+
}, eventData);
|
221
|
+
},
|
222
|
+
'element:validate:pass.ClientSideValidations': function(eventData) {
|
223
|
+
var element;
|
224
|
+
element = $(this);
|
225
|
+
return ClientSideValidations.callbacks.element.pass(element, function() {
|
226
|
+
return form.ClientSideValidations.removeError(element);
|
227
|
+
}, eventData);
|
228
|
+
}
|
229
|
+
};
|
230
|
+
for (event in _ref) {
|
231
|
+
binding = _ref[event];
|
232
|
+
$input.filter(':enabled:not(:radio):not([id$=_confirmation]):visible').each(function() {
|
233
|
+
return $(this).attr('data-validate', true);
|
234
|
+
}).on(event, binding);
|
235
|
+
}
|
236
|
+
$input.filter(':checkbox:visible').on('click.ClientSideValidations', function() {
|
237
|
+
$(this).isValid(form.ClientSideValidations.settings.validators);
|
238
|
+
return true;
|
239
|
+
});
|
240
|
+
return $input.filter('[id$=_confirmation]:visible').each(function() {
|
241
|
+
var confirmationElement, element, _ref1, _results;
|
242
|
+
confirmationElement = $(this);
|
243
|
+
element = $form.find("#" + (this.id.match(/(.+)_confirmation/)[1]) + ":input");
|
244
|
+
if (element[0]) {
|
245
|
+
_ref1 = {
|
246
|
+
'focusout.ClientSideValidations': function() {
|
247
|
+
return element.data('changed', true).isValid(form.ClientSideValidations.settings.validators);
|
248
|
+
},
|
249
|
+
'keyup.ClientSideValidations': function() {
|
250
|
+
return element.data('changed', true).isValid(form.ClientSideValidations.settings.validators);
|
251
|
+
}
|
252
|
+
};
|
253
|
+
_results = [];
|
254
|
+
for (event in _ref1) {
|
255
|
+
binding = _ref1[event];
|
256
|
+
_results.push($("#" + (confirmationElement.attr('id'))).on(event, binding));
|
257
|
+
}
|
258
|
+
return _results;
|
259
|
+
}
|
260
|
+
});
|
261
|
+
}
|
262
|
+
};
|
263
|
+
|
203
264
|
window.ClientSideValidations.validators = {
|
204
265
|
all: function() {
|
205
266
|
return jQuery.extend({}, ClientSideValidations.validators.local, ClientSideValidations.validators.remote);
|
@@ -314,7 +375,7 @@
|
|
314
375
|
}
|
315
376
|
},
|
316
377
|
exclusion: function(element, options) {
|
317
|
-
var lower, message,
|
378
|
+
var lower, message, option, upper, _ref;
|
318
379
|
message = this.presence(element, options);
|
319
380
|
if (message) {
|
320
381
|
if (options.allow_blank === true) {
|
@@ -328,8 +389,8 @@
|
|
328
389
|
_ref1 = options["in"];
|
329
390
|
_results = [];
|
330
391
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
331
|
-
|
332
|
-
_results.push(
|
392
|
+
option = _ref1[_i];
|
393
|
+
_results.push(option.toString());
|
333
394
|
}
|
334
395
|
return _results;
|
335
396
|
})(), _ref) >= 0) {
|
@@ -345,7 +406,7 @@
|
|
345
406
|
}
|
346
407
|
},
|
347
408
|
inclusion: function(element, options) {
|
348
|
-
var lower, message,
|
409
|
+
var lower, message, option, upper, _ref;
|
349
410
|
message = this.presence(element, options);
|
350
411
|
if (message) {
|
351
412
|
if (options.allow_blank === true) {
|
@@ -359,8 +420,8 @@
|
|
359
420
|
_ref1 = options["in"];
|
360
421
|
_results = [];
|
361
422
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
362
|
-
|
363
|
-
_results.push(
|
423
|
+
option = _ref1[_i];
|
424
|
+
_results.push(option.toString());
|
364
425
|
}
|
365
426
|
return _results;
|
366
427
|
})(), _ref) >= 0) {
|
@@ -442,8 +503,8 @@
|
|
442
503
|
if (scoped_element[0] && scoped_element.val() !== scope_value) {
|
443
504
|
data.scope[key] = scoped_element.val();
|
444
505
|
scoped_element.unbind("change." + element.id).bind("change." + element.id, function() {
|
445
|
-
element.trigger('change');
|
446
|
-
return element.trigger('focusout');
|
506
|
+
element.trigger('change.ClientSideValidations');
|
507
|
+
return element.trigger('focusout.ClientSideValidations');
|
447
508
|
});
|
448
509
|
} else {
|
449
510
|
data.scope[key] = scope_value;
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: client_side_validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.0.rc.
|
4
|
+
version: 3.2.0.rc.2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -155,6 +155,22 @@ dependencies:
|
|
155
155
|
- - ! '>='
|
156
156
|
- !ruby/object:Gem::Version
|
157
157
|
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: jquery-rails
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
158
174
|
description: Client Side Validations
|
159
175
|
email:
|
160
176
|
- bcardarella@gmail.com
|
@@ -179,6 +195,7 @@ files:
|
|
179
195
|
- lib/client_side_validations/active_record.rb
|
180
196
|
- lib/client_side_validations/active_record/middleware.rb
|
181
197
|
- lib/client_side_validations/active_record/uniqueness.rb
|
198
|
+
- lib/client_side_validations/config.rb
|
182
199
|
- lib/client_side_validations/core_ext.rb
|
183
200
|
- lib/client_side_validations/core_ext/range.rb
|
184
201
|
- lib/client_side_validations/core_ext/regexp.rb
|
@@ -206,7 +223,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
206
223
|
version: '0'
|
207
224
|
segments:
|
208
225
|
- 0
|
209
|
-
hash:
|
226
|
+
hash: -4404664315488432309
|
210
227
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
228
|
none: false
|
212
229
|
requirements:
|