grimen-validatious-on-rails 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@ class ValidatiousGenerator < Rails::Generator::Base
5
5
  def manifest
6
6
  record do |m|
7
7
  m.template 'v2.standalone.full.min.js', File.join('public', 'javascripts', 'v2.standalone.full.min.js')
8
- m.template 'validatious_config.js', File.join('public', 'javascripts', 'validatious.config.js')
8
+ m.template 'validatious.config.js', File.join('public', 'javascripts', 'validatious.config.js')
9
9
  end
10
10
  end
11
11
 
@@ -11,7 +11,7 @@ module ActionView
11
11
  # Add validation class names to: text-fields.
12
12
  #
13
13
  def text_field_with_validation(object_name, method, options = {})
14
- options = Validatious::RailsValidation.options_for(object_name, method, options)
14
+ options = ::Validatious::RailsValidation.options_for(object_name, method, options)
15
15
  text_field_without_validation(object_name, method, options)
16
16
  end
17
17
  alias_method_chain :text_field, :validation
@@ -20,7 +20,7 @@ module ActionView
20
20
  # Add validation class names to: password-fields.
21
21
  #
22
22
  def password_field_with_validation(object_name, method, options = {})
23
- options = Validatious::RailsValidation.options_for(object_name, method, options)
23
+ options = ::Validatious::RailsValidation.options_for(object_name, method, options)
24
24
  password_field_without_validation(object_name, method, options)
25
25
  end
26
26
  alias_method_chain :password_field, :validation
@@ -29,7 +29,7 @@ module ActionView
29
29
  # Add validation class names to: text-areas.
30
30
  #
31
31
  def text_area_with_validation(object_name, method, options = {})
32
- options = Validatious::RailsValidation.options_for(object_name, method, options)
32
+ options = ::Validatious::RailsValidation.options_for(object_name, method, options)
33
33
  text_area_without_validation(object_name, method, options)
34
34
  end
35
35
  alias_method_chain :text_area, :validation
@@ -38,7 +38,7 @@ module ActionView
38
38
  # Add validation class names to: check-boxes.
39
39
  #
40
40
  def check_box_with_validation(object_name, method, options = {}, checked_value = '1', unchecked_value = '0')
41
- options = Validatious::RailsValidation.options_for(object_name, method, options)
41
+ options = ::Validatious::RailsValidation.options_for(object_name, method, options)
42
42
  check_box_without_validation(object_name, method, options)
43
43
  end
44
44
  alias_method_chain :check_box, :validation
@@ -47,7 +47,7 @@ module ActionView
47
47
  # Add validation class names to: radio-buttons.
48
48
  #
49
49
  def radio_button_with_validation(object_name, method, tag_value, options = {})
50
- options = Validatious::RailsValidation.options_for(object_name, method, options)
50
+ options = ::Validatious::RailsValidation.options_for(object_name, method, options)
51
51
  radio_button_without_validation(object_name, method, tag_value, options)
52
52
  end
53
53
  alias_method_chain :radio_button, :validation
@@ -31,16 +31,15 @@ module Validatious
31
31
  # Input may be an ActiveRecord class, a class name (string), or an object
32
32
  # name along with a method/field.
33
33
  #
34
- def options_for(object_name, method, options = {})
35
- validation = self.from_active_record(object_name, method)
34
+ def options_for(object_name, attribute_method, options = {})
35
+ validation = self.from_active_record(object_name, attribute_method)
36
36
 
37
37
  # Loop validation and add/append pairs to options.
38
- validation.each_pair do |attr, value|
39
- options[attr] ||= ''
40
- options[attr] << value
41
-
38
+ validation.each_pair do |attribute, value|
39
+ options[attribute] ||= ''
40
+ options[attribute] << value
42
41
  # Shake out duplicates.
43
- options[attr] = options[attr].split.uniq.join(' ').strip
42
+ options[attribute] = options[attribute].split.uniq.join(' ').strip
44
43
  end
45
44
  options
46
45
  end
@@ -55,17 +54,39 @@ module Validatious
55
54
  # Returns a string that will be recognized by Validatious as a class name in
56
55
  # form markup.
57
56
  #
58
- def from_active_record(object_or_class, method)
57
+ def from_active_record(object_or_class, attribute_method)
59
58
  klass = object_or_class.to_s.classify.constantize
60
59
  options = {:class => ''}
61
60
  validation_classes = []
62
-
61
+
63
62
  # Iterate thorugh the validations for the current class,
64
63
  # and collect validation options.
65
- klass.reflect_on_validations_for(method).each do |validation|
66
- validation_options = self.send(validation.macro.to_s.sub(/^validates_/, ''), validation)
67
- validation_classes << validation_options[:class]
64
+ klass.reflect_on_validations_for(attribute_method.to_sym).each do |validation|
65
+ validates_type = validation.macro.to_s.sub(/^validates_/, '')
66
+
67
+ # Skip "confirmation_of"-validation info for the attribute that
68
+ # needs to be confirmed. Validatious expects this validation rule
69
+ # on the confirmation field. *
70
+ unless validates_type =~ /^confirmation_of$/
71
+ validation_options = self.send(validates_type, validation)
72
+ validation_classes << validation_options[:class]
73
+ end
74
+ end
75
+
76
+ # Special case for "confirmation_of"-validation (see * above).
77
+ if attribute_method.to_s =~ /(.+)_confirmation$/
78
+ confirm_attribute_method = $1
79
+ # Check if validates_confirmation_of(:hello) actually exists,
80
+ # if :hello_confirmation field exists - just to be safe.
81
+ klass.reflect_on_validations_for(confirm_attribute_method.to_sym).each do |validation|
82
+ if validation.macro.to_s =~ /^validates_confirmation_of$/
83
+ validation_options = self.confirmation_of(validation)
84
+ validation_classes << validation_options[:class]
85
+ break
86
+ end
87
+ end
68
88
  end
89
+
69
90
  options[:class] = [options[:class], validation_classes].flatten.compact.join(' ')
70
91
  options
71
92
  end
@@ -82,17 +103,25 @@ module Validatious
82
103
  #
83
104
  # Resolve validation from validates_associated.
84
105
  #
106
+ # Note: Most probably too hard to implement.
107
+ #
85
108
  def associated(validation)
86
109
  {:class => ''}
87
110
  end
88
111
 
89
112
  #
90
- # TODO: Resolve validation from validates_confirmation_of.
113
+ # Resolve validation from validates_confirmation_of.
91
114
  #
92
- # Note: Should be added to "#{field}_confirmation" instead of "#{field}", i.e. non-standard approach.
115
+ # Note: This validation needed to be treated a bit differently in compare
116
+ # to the other validations. See "from_active_record".
93
117
  #
94
118
  def confirmation_of(validation)
95
- {:class => ''}
119
+ field_id_to_confirm = unless validation.active_record.present?
120
+ "#{validation.active_record.name.tableize.singularize.gsub('/', '_')}_#{validation.name}"
121
+ else
122
+ "#{validation.name}"
123
+ end
124
+ {:class => "confirmation-of_#{field_id_to_confirm}"}
96
125
  end
97
126
 
98
127
  #
data/test/test_helper.rb CHANGED
@@ -42,6 +42,7 @@ build_model :bogus_items do
42
42
  boolean :signed
43
43
 
44
44
  validates_presence_of :name, :body
45
+ validates_confirmation_of :name
45
46
  validates_acceptance_of :signed
46
47
  validates_format_of :url,
47
48
  :with => /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i,
@@ -45,6 +45,12 @@ class FormHelperTest < Test::Unit::TestCase
45
45
  # TODO
46
46
  end
47
47
 
48
+ def test_confirmation_field
49
+ # TODO: Add form-builder-test as well
50
+ assert_has_class "confirmation-of_name", text_field(:bogus_item, :name_confirmation)
51
+ assert_has_class "confirmation-of_name text", text_field(:bogus_item, :name_confirmation, :class => "text")
52
+ end
53
+
48
54
  def test_normal_label
49
55
  assert_equal "<label for=\"bogus_item_name\">Name</label>", label(:bogus_item, :name)
50
56
  end
@@ -5,8 +5,15 @@ class RailsValidationTest < Test::Unit::TestCase
5
5
 
6
6
  include ActionView::Helpers::FormHelper
7
7
 
8
+ #
9
+ # Simulate a validation
10
+ #
11
+ def validation(macro, options = {})
12
+ ActiveRecord::Reflection::MacroReflection.new(macro, :name, options, BogusItem.new)
13
+ end
14
+
8
15
  def test_acceptance_of
9
- validation = Validatious::RailsValidation.presence_of(validation(:validates_acceptance_of))
16
+ validation = Validatious::RailsValidation.acceptance_of(validation(:validates_acceptance_of))
10
17
  assert_equal 'required', validation[:class]
11
18
  end
12
19
 
@@ -15,7 +22,8 @@ class RailsValidationTest < Test::Unit::TestCase
15
22
  end
16
23
 
17
24
  def test_confirmation_of
18
- # TODO: not implemented
25
+ validation = Validatious::RailsValidation.confirmation_of(validation(:validates_confirmation_of))
26
+ assert_equal 'confirmation-of_name', validation[:class]
19
27
  end
20
28
 
21
29
  def test_exclusion_of
@@ -78,11 +86,4 @@ class RailsValidationTest < Test::Unit::TestCase
78
86
  # TODO: not implemented
79
87
  end
80
88
 
81
- #
82
- # Simulate a validation
83
- #
84
- def validation(macro, options = {})
85
- ActiveRecord::Reflection::MacroReflection.new(macro, :name, options, nil)
86
- end
87
-
88
89
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grimen-validatious-on-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Johansen