validation_reflection 0.3.3 → 0.3.4
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/.gitignore +4 -0
- data/CHANGELOG +3 -0
- data/Rakefile +7 -1
- data/VERSION.yml +2 -2
- data/lib/validation_reflection.rb +75 -59
- data/rails/init.rb +1 -0
- data/test/test_helper.rb +16 -3
- data/test/validation_reflection_test.rb +38 -37
- data/validation_reflection.gemspec +4 -3
- metadata +3 -2
data/.gitignore
ADDED
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'rake'
|
2
3
|
require 'rake/testtask'
|
3
4
|
require 'rake/rdoctask'
|
@@ -22,7 +23,12 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
22
23
|
end
|
23
24
|
|
24
25
|
begin
|
25
|
-
|
26
|
+
begin
|
27
|
+
require 'jeweler'
|
28
|
+
rescue LoadError
|
29
|
+
gem 'technicalpickles-jeweler', '>= 1.0.0'
|
30
|
+
require 'jeweler'
|
31
|
+
end
|
26
32
|
Jeweler::Tasks.new do |gemspec|
|
27
33
|
gemspec.name = "validation_reflection"
|
28
34
|
gemspec.summary = "Adds reflective access to validations"
|
data/VERSION.yml
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
#--
|
2
3
|
# Copyright (c) 2006-2008, Michael Schuerig, michael@schuerig.de
|
3
4
|
#
|
@@ -20,59 +21,70 @@
|
|
20
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
23
|
#++
|
23
|
-
|
24
|
-
|
25
24
|
require 'active_record/reflection'
|
26
25
|
require 'ostruct'
|
27
26
|
|
28
27
|
# Based on code by Sebastian Kanthak
|
29
28
|
# See http://dev.rubyonrails.org/ticket/861
|
29
|
+
#
|
30
30
|
module ActiveRecordExtensions # :nodoc:
|
31
31
|
module ValidationReflection # :nodoc:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
32
|
+
|
33
|
+
extend self
|
34
|
+
|
35
|
+
# Look for config/initalizer here in:
|
36
|
+
CONFIG_PATH = ::Dir.glob((::File.join(RAILS_ROOT, 'config', '**', 'validation_reflection.rb').to_s rescue '')).first || ''
|
37
|
+
CORE_VALIDATONS = [
|
38
|
+
:validates_acceptance_of,
|
39
|
+
:validates_associated,
|
40
|
+
:validates_confirmation_of,
|
41
|
+
:validates_exclusion_of,
|
42
|
+
:validates_format_of,
|
43
|
+
:validates_inclusion_of,
|
44
|
+
:validates_length_of,
|
45
|
+
:validates_numericality_of,
|
46
|
+
:validates_presence_of,
|
47
|
+
:validates_uniqueness_of,
|
48
|
+
].freeze
|
49
|
+
|
50
|
+
@@reflected_validations = CORE_VALIDATONS.dup
|
51
|
+
@@in_ignored_subvalidation = false
|
52
|
+
|
53
|
+
mattr_accessor :reflected_validations,
|
54
|
+
:in_ignored_subvalidation
|
55
|
+
|
56
|
+
def included(base) # :nodoc:
|
57
|
+
return if base.kind_of?(::ActiveRecordExtensions::ValidationReflection::ClassMethods)
|
53
58
|
base.extend(ClassMethods)
|
54
59
|
end
|
55
60
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
61
|
+
# Load config/initializer on load, where ValidationReflection defaults
|
62
|
+
# (such as which validations to reflect upon) cane be overridden/extended.
|
63
|
+
#
|
64
|
+
def load_config
|
65
|
+
if ::File.file?(CONFIG_PATH)
|
66
|
+
config = ::OpenStruct.new
|
67
|
+
config.reflected_validations = @@reflected_validations
|
60
68
|
silence_warnings do
|
61
|
-
eval(IO.read(CONFIG_PATH), binding, CONFIG_PATH)
|
69
|
+
eval(::IO.read(CONFIG_PATH), binding, CONFIG_PATH)
|
62
70
|
end
|
63
71
|
end
|
64
72
|
end
|
65
73
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
74
|
+
# Iterate through all validations and store/cache the info
|
75
|
+
# for later easy access.
|
76
|
+
#
|
77
|
+
def install(base)
|
78
|
+
@@reflected_validations.each do |validation_type|
|
79
|
+
next if base.respond_to?(:"#{validation_type}_with_reflection")
|
70
80
|
ignore_subvalidations = false
|
71
|
-
|
81
|
+
|
82
|
+
if validation_type.kind_of?(::Hash)
|
72
83
|
ignore_subvalidations = validation_type[:ignore_subvalidations]
|
73
84
|
validation_type = validation_type[:method]
|
74
85
|
end
|
75
|
-
|
86
|
+
|
87
|
+
base.class_eval %{
|
76
88
|
class << self
|
77
89
|
def #{validation_type}_with_reflection(*attr_names)
|
78
90
|
ignoring_subvalidations(#{ignore_subvalidations}) do
|
@@ -80,53 +92,57 @@ module ActiveRecordExtensions # :nodoc:
|
|
80
92
|
remember_validation_metadata(:#{validation_type}, *attr_names)
|
81
93
|
end
|
82
94
|
end
|
83
|
-
|
84
95
|
alias_method_chain :#{validation_type}, :reflection
|
85
96
|
end
|
86
|
-
|
97
|
+
}, __FILE__, __LINE__
|
87
98
|
end
|
88
99
|
end
|
100
|
+
alias :reload :install
|
89
101
|
|
90
102
|
module ClassMethods
|
91
103
|
|
104
|
+
include ::ActiveRecordExtensions::ValidationReflection
|
105
|
+
|
92
106
|
# Returns an array of MacroReflection objects for all validations in the class
|
93
107
|
def reflect_on_all_validations
|
94
|
-
read_inheritable_attribute(:validations) || []
|
108
|
+
self.read_inheritable_attribute(:validations) || []
|
95
109
|
end
|
96
110
|
|
97
111
|
# Returns an array of MacroReflection objects for all validations defined for the field +attr_name+.
|
98
112
|
def reflect_on_validations_for(attr_name)
|
99
|
-
|
100
|
-
|
101
|
-
reflection.name == attr_name
|
113
|
+
self.reflect_on_all_validations.select do |reflection|
|
114
|
+
reflection.name == attr_name.to_sym
|
102
115
|
end
|
103
116
|
end
|
104
117
|
|
105
118
|
private
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
119
|
+
|
120
|
+
# Store validation info for easy and fast access.
|
121
|
+
#
|
122
|
+
def remember_validation_metadata(validation_type, *attr_names)
|
123
|
+
configuration = attr_names.last.is_a?(::Hash) ? attr_names.pop : {}
|
124
|
+
attr_names.each do |attr_name|
|
125
|
+
self.write_inheritable_array :validations,
|
126
|
+
[::ActiveRecord::Reflection::MacroReflection.new(validation_type, attr_name.to_sym, configuration, self)]
|
127
|
+
end
|
112
128
|
end
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
129
|
+
|
130
|
+
def ignoring_subvalidations(ignore)
|
131
|
+
save_ignore = self.in_ignored_subvalidation
|
132
|
+
unless self.in_ignored_subvalidation
|
133
|
+
self.in_ignored_subvalidation = ignore
|
134
|
+
yield
|
135
|
+
end
|
136
|
+
ensure
|
137
|
+
self.in_ignored_subvalidation = save_ignore
|
120
138
|
end
|
121
|
-
|
122
|
-
ActiveRecordExtensions::ValidationReflection.in_ignored_subvalidation = save_ignore
|
123
|
-
end
|
139
|
+
|
124
140
|
end
|
125
141
|
end
|
126
142
|
end
|
127
143
|
|
128
144
|
ActiveRecord::Base.class_eval do
|
129
|
-
include ActiveRecordExtensions::ValidationReflection
|
130
|
-
ActiveRecordExtensions::ValidationReflection.load_config
|
131
|
-
ActiveRecordExtensions::ValidationReflection.install(self)
|
145
|
+
include ::ActiveRecordExtensions::ValidationReflection
|
146
|
+
::ActiveRecordExtensions::ValidationReflection.load_config
|
147
|
+
::ActiveRecordExtensions::ValidationReflection.install(self)
|
132
148
|
end
|
data/rails/init.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
ENV['RAILS_ENV'] = 'test'
|
2
3
|
RAILS_ROOT = File.join(File.dirname(__FILE__))
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
|
-
|
6
|
-
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'active_record'
|
9
|
+
rescue LoadError
|
10
|
+
gem 'activerecord', '>= 1.2.3'
|
11
|
+
require 'active_record'
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
require 'test/unit'
|
16
|
+
rescue LoadError
|
17
|
+
gem 'test-unit', '>= 1.2.3'
|
18
|
+
require 'test/unit'
|
19
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
3
|
|
3
4
|
ActiveRecord::Base.class_eval do
|
4
5
|
def self.validates_something_weird(*cols)
|
@@ -16,13 +17,13 @@ end
|
|
16
17
|
require 'validation_reflection'
|
17
18
|
|
18
19
|
ActiveRecord::Base.class_eval do
|
19
|
-
include ActiveRecordExtensions::ValidationReflection
|
20
|
-
ActiveRecordExtensions::ValidationReflection.reflected_validations << :validates_something_weird
|
21
|
-
ActiveRecordExtensions::ValidationReflection.reflected_validations << {
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
ActiveRecordExtensions::ValidationReflection.install(self)
|
20
|
+
include ::ActiveRecordExtensions::ValidationReflection
|
21
|
+
::ActiveRecordExtensions::ValidationReflection.reflected_validations << :validates_something_weird
|
22
|
+
::ActiveRecordExtensions::ValidationReflection.reflected_validations << {
|
23
|
+
:method => :validates_something_selfcontained,
|
24
|
+
:ignore_subvalidations => true
|
25
|
+
}
|
26
|
+
::ActiveRecordExtensions::ValidationReflection.install(self)
|
26
27
|
end
|
27
28
|
|
28
29
|
|
@@ -30,13 +31,13 @@ class ValidationReflectionTest < Test::Unit::TestCase
|
|
30
31
|
|
31
32
|
class Dummy < ActiveRecord::Base
|
32
33
|
class << self
|
33
|
-
|
34
|
+
|
34
35
|
def create_fake_column(name, null = true, limit = nil)
|
35
36
|
sql_type = limit ? "varchar (#{limit})" : nil
|
36
37
|
col = ActiveRecord::ConnectionAdapters::Column.new(name, nil, sql_type, null)
|
37
38
|
col
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
def columns
|
41
42
|
[
|
42
43
|
create_fake_column('col0'),
|
@@ -50,9 +51,9 @@ class ValidationReflectionTest < Test::Unit::TestCase
|
|
50
51
|
]
|
51
52
|
end
|
52
53
|
end
|
53
|
-
|
54
|
+
|
54
55
|
has_one :nothing
|
55
|
-
|
56
|
+
|
56
57
|
validates_presence_of :col1
|
57
58
|
validates_length_of :col2, :maximum => 100
|
58
59
|
validates_format_of :col3, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
|
@@ -62,61 +63,61 @@ class ValidationReflectionTest < Test::Unit::TestCase
|
|
62
63
|
validates_something_selfcontained :col7
|
63
64
|
end
|
64
65
|
|
65
|
-
|
66
66
|
def test_sanity
|
67
67
|
assert_equal [], Dummy.reflect_on_validations_for(:col0)
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_validates_presence_of_is_reflected
|
71
|
-
|
72
|
-
assert
|
73
|
-
assert
|
71
|
+
reflections = Dummy.reflect_on_validations_for(:col1)
|
72
|
+
assert reflections.all? { |r| r.name.to_s == 'col1' }
|
73
|
+
assert reflections.find { |r| r.macro == :validates_presence_of }
|
74
74
|
end
|
75
75
|
|
76
76
|
def test_string_limit_is_reflected
|
77
|
-
|
78
|
-
assert
|
77
|
+
reflections = Dummy.reflect_on_validations_for(:col2)
|
78
|
+
assert reflections.any? { |r| r.macro == :validates_length_of && r.options[:maximum] == 100 }
|
79
79
|
end
|
80
80
|
|
81
81
|
def test_format_is_reflected
|
82
|
-
|
83
|
-
assert
|
82
|
+
reflections = Dummy.reflect_on_validations_for(:col3)
|
83
|
+
assert reflections.any? { |r| r.macro == :validates_format_of && r.options[:with] == /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i }
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_numeric_integer_is_reflected
|
87
|
-
|
88
|
-
assert
|
87
|
+
reflections = Dummy.reflect_on_validations_for(:col4)
|
88
|
+
assert reflections.any? { |r| r.macro == :validates_numericality_of && r.options[:only_integer] }
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
def test_numeric_is_reflected
|
92
|
-
|
93
|
-
assert
|
92
|
+
reflections = Dummy.reflect_on_validations_for(:col5)
|
93
|
+
assert reflections.any? { |r| r.macro == :validates_numericality_of }
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
def test_validation_options_are_reflected
|
97
|
-
|
98
|
-
refl =
|
97
|
+
reflections = Dummy.reflect_on_validations_for(:col5)
|
98
|
+
refl = reflections[0]
|
99
99
|
assert_equal 5, refl.options[:less_than]
|
100
100
|
end
|
101
101
|
|
102
102
|
def test_custom_validations_are_reflected
|
103
|
-
|
104
|
-
assert
|
105
|
-
assert
|
103
|
+
reflections = Dummy.reflect_on_validations_for(:col6)
|
104
|
+
assert reflections.any? { |r| r.macro == :validates_something_weird }
|
105
|
+
assert reflections.any? { |r| r.macro == :validates_format_of }
|
106
106
|
end
|
107
107
|
|
108
108
|
def test_custom_validations_with_options_are_reflected
|
109
|
-
|
110
|
-
assert
|
109
|
+
reflections = Dummy.reflect_on_validations_for(:col7)
|
110
|
+
assert reflections.any? { |r| r.macro == :validates_something_selfcontained }
|
111
111
|
end
|
112
112
|
|
113
113
|
def test_subvalidations_are_reflected
|
114
|
-
|
115
|
-
assert_equal 2,
|
114
|
+
reflections = Dummy.reflect_on_validations_for(:col6)
|
115
|
+
assert_equal 2, reflections.size
|
116
116
|
end
|
117
117
|
|
118
118
|
def test_ignored_subvalidations_are_not_reflected
|
119
|
-
|
120
|
-
assert_equal 1,
|
119
|
+
reflections = Dummy.reflect_on_validations_for(:col7)
|
120
|
+
assert_equal 1, reflections.size
|
121
121
|
end
|
122
|
+
|
122
123
|
end
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{validation_reflection}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Christopher Redinger"]
|
12
|
-
s.date = %q{2009-09
|
12
|
+
s.date = %q{2009-10-09}
|
13
13
|
s.description = %q{Adds reflective access to validations}
|
14
14
|
s.email = %q{redinger@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -17,7 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
"README"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
|
-
"
|
20
|
+
".gitignore",
|
21
|
+
"CHANGELOG",
|
21
22
|
"LICENSE",
|
22
23
|
"README",
|
23
24
|
"Rakefile",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validation_reflection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Redinger
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09
|
12
|
+
date: 2009-10-09 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,6 +23,7 @@ extra_rdoc_files:
|
|
23
23
|
- LICENSE
|
24
24
|
- README
|
25
25
|
files:
|
26
|
+
- .gitignore
|
26
27
|
- CHANGELOG
|
27
28
|
- LICENSE
|
28
29
|
- README
|