client_side_validations 2.4.2 → 2.5.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/README.markdown +8 -0
- data/generators/client_side_validations/client_side_validations_generator.rb +1 -0
- data/javascript/lib/client_side_validations.js +58 -6
- data/javascript/lib/jquery.validate.js +1146 -0
- data/lib/client_side_validations/adapters/active_model.rb +35 -79
- data/lib/client_side_validations/adapters/active_record_2.rb +38 -82
- data/lib/client_side_validations/adapters/orm_base.rb +88 -0
- data/lib/client_side_validations/orm.rb +2 -2
- data/lib/generators/client_side_validations_generator.rb +2 -0
- metadata +5 -3
@@ -1,40 +1,14 @@
|
|
1
|
+
require 'client_side_validations/adapters/orm_base'
|
2
|
+
|
1
3
|
module DNCLabs
|
2
4
|
module ClientSideValidations
|
3
5
|
module Adapters
|
4
|
-
class ActiveModel
|
5
|
-
attr_accessor :base
|
6
|
-
|
7
|
-
def initialize(base)
|
8
|
-
self.base = base
|
9
|
-
end
|
10
|
-
|
11
|
-
def validation_to_hash(_attr, _options = {})
|
12
|
-
validation_hash = {}
|
13
|
-
base._validators[_attr.to_sym].each do |validation|
|
14
|
-
if can_validate?(validation) && supported_validation?(validation)
|
15
|
-
message = get_validation_message(validation, _options[:locale])
|
16
|
-
validation.options.delete(:message)
|
17
|
-
options = get_validation_options(validation.options)
|
18
|
-
method = get_validation_method(validation.kind)
|
19
|
-
if conditional_method = remove_reserved_conditionals(options[:if])
|
20
|
-
if base.instance_eval(conditional_method.to_s)
|
21
|
-
options.delete(:if)
|
22
|
-
validation_hash[method] = { 'message' => message }.merge(options.stringify_keys)
|
23
|
-
end
|
24
|
-
elsif conditional_method = options[:unless]
|
25
|
-
unless base.instance_eval(conditional_method.to_s)
|
26
|
-
options.delete(:unless)
|
27
|
-
validation_hash[method] = { 'message' => message }.merge(options.stringify_keys)
|
28
|
-
end
|
29
|
-
else
|
30
|
-
options.delete(:if)
|
31
|
-
options.delete(:unless)
|
32
|
-
validation_hash[method] = { 'message' => message }.merge(options.stringify_keys)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
6
|
+
class ActiveModel < ORMBase
|
36
7
|
|
37
|
-
|
8
|
+
def validation_to_hash(attr)
|
9
|
+
base._validators[attr.to_sym].inject({}) do |hash, validation|
|
10
|
+
hash.merge!(build_validation_hash(validation.clone))
|
11
|
+
end
|
38
12
|
end
|
39
13
|
|
40
14
|
def validation_fields
|
@@ -42,80 +16,62 @@ module DNCLabs
|
|
42
16
|
end
|
43
17
|
|
44
18
|
private
|
45
|
-
|
46
|
-
def
|
47
|
-
|
48
|
-
:
|
49
|
-
end
|
50
|
-
|
51
|
-
def can_validate?(validation)
|
52
|
-
if on = validation.options[:on]
|
53
|
-
on = on.to_sym
|
54
|
-
(on == :save) ||
|
55
|
-
(on == :create && base.new_record?) ||
|
56
|
-
(on == :update && !base.new_record?)
|
57
|
-
else
|
58
|
-
true
|
19
|
+
|
20
|
+
def build_validation_hash(validation, message_key = 'message')
|
21
|
+
if validation.kind == :inclusion || validation.kind == :exclusion
|
22
|
+
validation.options[:in] = validation.options[:in].to_a
|
59
23
|
end
|
24
|
+
super
|
60
25
|
end
|
61
26
|
|
62
|
-
def
|
27
|
+
def supported_validation?(validation)
|
28
|
+
SupportedValidations.include?(validation.kind.to_sym)
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_validation_message(validation)
|
63
32
|
default = case validation.kind
|
64
33
|
when :presence
|
65
|
-
I18n.translate('errors.messages.blank'
|
34
|
+
I18n.translate('errors.messages.blank')
|
66
35
|
when :format
|
67
|
-
I18n.translate('errors.messages.invalid'
|
36
|
+
I18n.translate('errors.messages.invalid')
|
68
37
|
when :length
|
69
38
|
if count = validation.options[:minimum]
|
70
|
-
I18n.translate('errors.messages.too_short'
|
39
|
+
I18n.translate('errors.messages.too_short').sub('%{count}', count.to_s)
|
71
40
|
elsif count = validation.options[:maximum]
|
72
|
-
I18n.translate('errors.messages.too_long'
|
41
|
+
I18n.translate('errors.messages.too_long').sub('%{count}', count.to_s)
|
73
42
|
end
|
74
43
|
when :numericality
|
75
|
-
I18n.translate('errors.messages.not_a_number'
|
44
|
+
I18n.translate('errors.messages.not_a_number')
|
76
45
|
when :uniqueness
|
77
46
|
if defined?(ActiveRecord) && base.kind_of?(ActiveRecord::Base)
|
78
|
-
I18n.translate('activerecord.errors.messages.taken'
|
47
|
+
I18n.translate('activerecord.errors.messages.taken')
|
79
48
|
elsif defined?(Mongoid) && base.class.included_modules.include?(Mongoid::Document)
|
80
|
-
I18n.translate('errors.messages.taken'
|
49
|
+
I18n.translate('errors.messages.taken')
|
81
50
|
end
|
82
51
|
when :confirmation
|
83
|
-
I18n.translate('errors.messages.confirmation'
|
52
|
+
I18n.translate('errors.messages.confirmation')
|
53
|
+
when :acceptance
|
54
|
+
I18n.translate('errors.messages.accepted')
|
55
|
+
when :inclusion
|
56
|
+
I18n.translate('errors.messages.inclusion')
|
57
|
+
when :exclusion
|
58
|
+
I18n.translate('errors.messages.exclusion')
|
84
59
|
end
|
85
60
|
|
86
|
-
message = validation.options
|
61
|
+
message = validation.options.delete(:message)
|
87
62
|
if message.kind_of?(String)
|
88
63
|
message
|
89
64
|
elsif message.kind_of?(Symbol)
|
90
|
-
I18n.translate("errors.models.#{base.class.to_s.downcase}.attributes.#{validation.attributes.first}.#{message}"
|
65
|
+
I18n.translate("errors.models.#{base.class.to_s.downcase}.attributes.#{validation.attributes.first}.#{message}")
|
91
66
|
else
|
92
67
|
default
|
93
68
|
end
|
94
69
|
end
|
95
70
|
|
96
|
-
def
|
97
|
-
|
98
|
-
options.delete(:on) == :create
|
99
|
-
options.delete(:tokenizer)
|
100
|
-
options.delete(:only_integer)
|
101
|
-
options.delete(:allow_nil)
|
102
|
-
options.delete(:case_sensitive)
|
103
|
-
if options[:with].kind_of?(Regexp)
|
104
|
-
options[:with] = options[:with].inspect.to_s.sub("\\A","^").sub("\\Z","$").sub(%r{^/},"").sub(%r{/i?$}, "")
|
105
|
-
end
|
106
|
-
options
|
71
|
+
def get_validation_method(validation)
|
72
|
+
validation.kind.to_s
|
107
73
|
end
|
108
74
|
|
109
|
-
def get_validation_method(kind)
|
110
|
-
kind.to_s
|
111
|
-
end
|
112
|
-
|
113
|
-
def remove_reserved_conditionals(*conditionals)
|
114
|
-
conditionals.flatten!
|
115
|
-
conditionals.delete_if { |conditional| conditional =~ /@_/ }
|
116
|
-
conditionals.delete_if { |conditional| conditional =~ /validation_context/ }
|
117
|
-
conditionals.first
|
118
|
-
end
|
119
75
|
end
|
120
76
|
end
|
121
77
|
end
|
@@ -1,40 +1,15 @@
|
|
1
1
|
require 'validation_reflection'
|
2
|
+
require 'client_side_validations/adapters/orm_base'
|
2
3
|
|
3
4
|
module DNCLabs
|
4
5
|
module ClientSideValidations
|
5
6
|
module Adapters
|
6
|
-
class ActiveRecord2
|
7
|
-
attr_accessor :base
|
8
|
-
|
9
|
-
def initialize(base)
|
10
|
-
self.base = base
|
11
|
-
end
|
12
|
-
|
13
|
-
def validation_to_hash(attr, options = {})
|
14
|
-
validation_hash = {}
|
15
|
-
base.class.reflect_on_validations_for(attr).each do |validation|
|
16
|
-
if can_validate?(validation) && supported_validation?(validation)
|
17
|
-
message = get_validation_message(validation, options[:locale])
|
18
|
-
validation.options.delete(:message)
|
19
|
-
options = get_validationoptions(validation.options)
|
20
|
-
method = get_validation_method(validation.macro)
|
21
|
-
if conditional_method = options[:if]
|
22
|
-
if base.instance_eval(conditional_method.to_s)
|
23
|
-
options.delete(:if)
|
24
|
-
validation_hash[method] = { 'message' => message }.merge(options.stringify_keys)
|
25
|
-
end
|
26
|
-
elsif conditional_method = options[:unless]
|
27
|
-
unless base.instance_eval(conditional_method.to_s)
|
28
|
-
options.delete(:unless)
|
29
|
-
validation_hash[method] = { 'message' => message }.merge(options.stringify_keys)
|
30
|
-
end
|
31
|
-
else
|
32
|
-
validation_hash[method] = { 'message' => message }.merge(options.stringify_keys)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
7
|
+
class ActiveRecord2 < ORMBase
|
36
8
|
|
37
|
-
|
9
|
+
def validation_to_hash(attr)
|
10
|
+
base.class.reflect_on_validations_for(attr).inject({}) do |hash, validation|
|
11
|
+
hash.merge!(build_validation_hash(validation.clone))
|
12
|
+
end
|
38
13
|
end
|
39
14
|
|
40
15
|
def validation_fields
|
@@ -43,79 +18,60 @@ module DNCLabs
|
|
43
18
|
|
44
19
|
private
|
45
20
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
|
21
|
+
def build_validation_hash(validation, message_key = 'message')
|
22
|
+
if validation.macro == :validates_length_of &&
|
23
|
+
(range = (validation.options.delete(:within) || validation.options.delete(:in)))
|
24
|
+
validation.options[:minimum] = range.first
|
25
|
+
validation.options[:maximum] = range.last
|
26
|
+
elsif validation.macro == :validates_inclusion_of || validation.macro == :validates_exclusion_of
|
27
|
+
validation.options[:in] = validation.options[:in].to_a
|
28
|
+
end
|
29
|
+
super
|
50
30
|
end
|
51
31
|
|
52
|
-
def
|
53
|
-
|
54
|
-
on = on.to_sym
|
55
|
-
(on == :save) ||
|
56
|
-
(on == :create && base.new_record?) ||
|
57
|
-
(on == :update && !base.new_record?)
|
58
|
-
else
|
59
|
-
true
|
60
|
-
end
|
32
|
+
def supported_validation?(validation)
|
33
|
+
SupportedValidations.include?(validation.macro.to_s.match(/\w+_(\w+)_\w+/)[1].to_sym)
|
61
34
|
end
|
62
|
-
|
63
|
-
def get_validation_message(validation
|
35
|
+
|
36
|
+
def get_validation_message(validation)
|
64
37
|
default = case validation.macro.to_sym
|
65
38
|
when :validates_presence_of
|
66
|
-
I18n.translate('activerecord.errors.messages.blank'
|
39
|
+
I18n.translate('activerecord.errors.messages.blank')
|
67
40
|
when :validates_format_of
|
68
|
-
I18n.translate('activerecord.errors.messages.invalid'
|
41
|
+
I18n.translate('activerecord.errors.messages.invalid')
|
69
42
|
when :validates_length_of
|
70
43
|
if count = validation.options[:minimum]
|
71
|
-
I18n.translate('activerecord.errors.messages.too_short'
|
44
|
+
I18n.translate('activerecord.errors.messages.too_short').sub('{{count}}', count.to_s)
|
72
45
|
elsif count = validation.options[:maximum]
|
73
|
-
I18n.translate('activerecord.errors.messages.too_long'
|
46
|
+
I18n.translate('activerecord.errors.messages.too_long').sub('{{count}}', count.to_s)
|
74
47
|
end
|
75
48
|
when :validates_numericality_of
|
76
|
-
I18n.translate('activerecord.errors.messages.not_a_number'
|
49
|
+
I18n.translate('activerecord.errors.messages.not_a_number')
|
77
50
|
when :validates_uniqueness_of
|
78
|
-
I18n.translate('activerecord.errors.messages.taken'
|
51
|
+
I18n.translate('activerecord.errors.messages.taken')
|
79
52
|
when :validates_confirmation_of
|
80
|
-
I18n.translate('activerecord.errors.messages.confirmation'
|
53
|
+
I18n.translate('activerecord.errors.messages.confirmation')
|
54
|
+
when :validates_acceptance_of
|
55
|
+
I18n.translate('activerecord.errors.messages.accepted')
|
56
|
+
when :validates_inclusion_of
|
57
|
+
I18n.translate('activerecord.errors.messages.inclusion')
|
58
|
+
when :validates_exclusion_of
|
59
|
+
I18n.translate('activerecord.errors.messages.exclusion')
|
81
60
|
end
|
82
|
-
|
83
|
-
message = validation.options
|
61
|
+
|
62
|
+
message = validation.options.delete(:message)
|
84
63
|
if message.kind_of?(String)
|
85
64
|
message
|
86
65
|
elsif message.kind_of?(Symbol)
|
87
|
-
I18n.translate("activerecord.errors.models.#{base.class.to_s.downcase}.attributes.#{validation.name}.#{message}"
|
66
|
+
I18n.translate("activerecord.errors.models.#{base.class.to_s.downcase}.attributes.#{validation.name}.#{message}")
|
88
67
|
else
|
89
68
|
default
|
90
69
|
end
|
91
70
|
end
|
92
71
|
|
93
|
-
def
|
94
|
-
|
95
|
-
|
96
|
-
if options[:with].kind_of?(Regexp)
|
97
|
-
options[:with] = options[:with].inspect.to_s.sub("\\A","^").sub("\\Z","$").sub(%r{^/},"").sub(%r{/i?$}, "")
|
98
|
-
end
|
99
|
-
options
|
100
|
-
end
|
101
|
-
|
102
|
-
def get_validation_method(method)
|
103
|
-
method = case method.to_sym
|
104
|
-
when :validates_presence_of
|
105
|
-
:presence
|
106
|
-
when :validates_format_of
|
107
|
-
:format
|
108
|
-
when :validates_numericality_of
|
109
|
-
:numericality
|
110
|
-
when :validates_length_of
|
111
|
-
:length
|
112
|
-
when :validates_uniqueness_of
|
113
|
-
:uniqueness
|
114
|
-
when :validates_confirmation_of
|
115
|
-
:confirmation
|
116
|
-
end
|
117
|
-
|
118
|
-
method.to_s
|
72
|
+
def get_validation_method(validation)
|
73
|
+
method = validation.macro.to_s
|
74
|
+
method.match(/\w+_(\w+)_\w+/)[1]
|
119
75
|
end
|
120
76
|
end
|
121
77
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module DNCLabs
|
2
|
+
module ClientSideValidations
|
3
|
+
module Adapters
|
4
|
+
class ORMBase
|
5
|
+
attr_accessor :base
|
6
|
+
|
7
|
+
def initialize(base)
|
8
|
+
self.base = base
|
9
|
+
end
|
10
|
+
|
11
|
+
def validation_to_hash(attr)
|
12
|
+
end
|
13
|
+
|
14
|
+
def validation_fields
|
15
|
+
[]
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
SupportedValidations = [:presence, :format, :length, :numericality, :uniqueness,
|
21
|
+
:confirmation, :acceptance, :inclusion, :exclusion]
|
22
|
+
|
23
|
+
def build_validation_hash(validation, message_key = 'message')
|
24
|
+
if can_validate?(validation)
|
25
|
+
validation_hash = {}
|
26
|
+
message = get_validation_message(validation)
|
27
|
+
options = get_validation_options(validation)
|
28
|
+
method = get_validation_method(validation)
|
29
|
+
|
30
|
+
if validation.options.has_key?(:minimum) && validation.options.has_key?(:maximum)
|
31
|
+
message_key = 'message_min'
|
32
|
+
cloned_validation = validation.clone
|
33
|
+
cloned_validation.options.delete(:minimum)
|
34
|
+
validation_hash.merge!(build_validation_hash(cloned_validation, 'message_max'))
|
35
|
+
end
|
36
|
+
|
37
|
+
new_validation_hash = { method => { message_key => message }.merge(options.stringify_keys) }
|
38
|
+
|
39
|
+
unless validation_hash.empty?
|
40
|
+
validation_hash["length"].merge!(new_validation_hash["length"])
|
41
|
+
validation_hash
|
42
|
+
else
|
43
|
+
new_validation_hash
|
44
|
+
end
|
45
|
+
else
|
46
|
+
{}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def can_validate?(validation)
|
51
|
+
if supported_validation?(validation)
|
52
|
+
if on = validation.options[:on]
|
53
|
+
on = on.to_sym
|
54
|
+
(on == :save) ||
|
55
|
+
(on == :create && base.new_record?) ||
|
56
|
+
(on == :update && !base.new_record?)
|
57
|
+
elsif if_condition = validation.options[:if]
|
58
|
+
base.instance_eval(if_condition.to_s)
|
59
|
+
elsif unless_condition = validation.options[:unless]
|
60
|
+
!base.instance_eval(unless_condition.to_s)
|
61
|
+
else
|
62
|
+
true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_validation_message(validation)
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_validation_options(validation)
|
71
|
+
options = validation.options.clone
|
72
|
+
options.symbolize_keys!
|
73
|
+
deleteable_keys = [:on, :tokenizer, :only_integer, :allow_nil, :case_sensitive, :accept, :if, :unless]
|
74
|
+
options.delete(:maximum) if options.has_key?(:minimum)
|
75
|
+
options.delete_if { |k, v| deleteable_keys.include?(k) }
|
76
|
+
if options[:with].kind_of?(Regexp)
|
77
|
+
options[:with] = options[:with].inspect.to_s.sub("\\A","^").sub("\\Z","$").sub(%r{^/},"").sub(%r{/i?$}, "")
|
78
|
+
end
|
79
|
+
options
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_validation_method(validation)
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -9,5 +9,7 @@ class ClientSideValidationsGenerator < Rails::Generators::Base
|
|
9
9
|
def install_client_side_validations
|
10
10
|
copy_file('../../javascript/lib/client_side_validations.js',
|
11
11
|
'public/javascripts/client_side_validations.js')
|
12
|
+
copy_file('../../javascript/lib/jquery.validate.js',
|
13
|
+
'public/javascripts/jquery.validate.js')
|
12
14
|
end
|
13
15
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 2
|
7
|
-
-
|
7
|
+
- 5
|
8
8
|
- 2
|
9
|
-
version: 2.
|
9
|
+
version: 2.5.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brian Cardarella
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-07-
|
17
|
+
date: 2010-07-12 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -60,10 +60,12 @@ files:
|
|
60
60
|
- README.markdown
|
61
61
|
- generators/client_side_validations/client_side_validations_generator.rb
|
62
62
|
- javascript/lib/client_side_validations.js
|
63
|
+
- javascript/lib/jquery.validate.js
|
63
64
|
- lib/client_side_validations.rb
|
64
65
|
- lib/client_side_validations/adapters/action_view.rb
|
65
66
|
- lib/client_side_validations/adapters/active_model.rb
|
66
67
|
- lib/client_side_validations/adapters/active_record_2.rb
|
68
|
+
- lib/client_side_validations/adapters/orm_base.rb
|
67
69
|
- lib/client_side_validations/orm.rb
|
68
70
|
- lib/client_side_validations/template.rb
|
69
71
|
- lib/generators/client_side_validations_generator.rb
|