validates_existence 0.8.0 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,86 @@
1
- if Rails::VERSION::MAJOR >= 3
2
- require 'rails3'
3
- ActiveRecord::Base.send(:include, Perfectline::ValidatesExistence::Rails3)
4
- else
5
- require 'rails2'
6
- ActiveRecord::Base.send(:extend, Perfectline::ValidatesExistence::Rails2)
1
+ require "active_record"
2
+
3
+ module Perfectline
4
+ module ValidatesExistence
5
+ module Validator
6
+ class ExistenceValidator < ActiveModel::EachValidator
7
+
8
+ def initialize(options)
9
+ # set the default message if its unspecified
10
+ options[:message] ||= :existence
11
+ options[:both] = true unless options.key?(:both)
12
+ options[:allow_new] = false unless options.key?(:allow_new)
13
+ super(options)
14
+ end
15
+
16
+ def validate(record)
17
+ attributes.each do |attribute|
18
+ value = record.read_attribute_for_validation(attribute)
19
+ target_id = if !attribute.match(/_id$/) && options[:allow_nil]
20
+ association = record.class.reflect_on_association(attribute)
21
+ association.respond_to?(:foreign_key) ? record[association.foreign_key] : record[association.association_foreign_key]
22
+ else
23
+ value
24
+ end
25
+ next if (target_id.nil? && value.nil? && options[:allow_nil]) || (value.blank? && options[:allow_blank])
26
+ validate_each(record, attribute, value)
27
+ end
28
+ end
29
+
30
+ def validate_each(record, attribute, value)
31
+ normalized = attribute.to_s.sub(/_id$/, "").to_sym
32
+ association = record.class.reflect_on_association(normalized)
33
+
34
+ if association.nil? || !association.belongs_to?
35
+ raise ArgumentError, "Cannot validate existence on #{normalized}, not a :belongs_to association"
36
+ end
37
+
38
+ target_class = nil
39
+
40
+ # dealing with polymorphic belongs_to
41
+ if association.options[:polymorphic]
42
+ foreign_type = record.send(association.options[:foreign_type] || association.foreign_type)
43
+ target_class = foreign_type.constantize unless foreign_type.nil?
44
+ else
45
+ target_class = association.klass
46
+ end
47
+
48
+ if value.nil? || target_class.nil? || !exists?(target_class, value)
49
+ errors = [attribute]
50
+
51
+ # add the error on both :relation and :relation_id
52
+ if options[:both]
53
+ if ActiveRecord::VERSION::MAJOR > 3 || (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR >= 1)
54
+ foreign_key = association.foreign_key
55
+ else
56
+ foreign_key = association.primary_key_name
57
+ end
58
+
59
+ errors << (attribute.to_s.ends_with?("_id") ? normalized : foreign_key)
60
+ end
61
+
62
+ messages = [:"#{record.class.i18n_scope}.errors.messages.existence", "does not exist"]
63
+
64
+ errors.each do |error|
65
+ record.errors.add(error, options[:message], :message => messages)
66
+ end
67
+ end
68
+ end
69
+
70
+ def exists?(target_class, value)
71
+ (options[:allow_new] && value.new_record?) || target_class.exists?(value)
72
+ end
73
+ end
74
+ end
75
+
76
+ module ClassMethods
77
+ def validates_existence_of(*attr_names)
78
+ validates_with ActiveRecord::Base::ExistenceValidator, _merge_attributes(attr_names)
79
+ end
80
+ end
81
+
82
+ end
7
83
  end
84
+
85
+ ActiveRecord::Base.send(:include, Perfectline::ValidatesExistence::Validator)
86
+ ActiveRecord::Base.send(:extend, Perfectline::ValidatesExistence::ClassMethods)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_existence
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,8 +10,24 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-08 00:00:00.000000000 Z
14
- dependencies: []
13
+ date: 2013-09-05 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activerecord
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
15
31
  description: A library for validating model association existence.
16
32
  email:
17
33
  - tanel.suurhans@perfectline.ee
@@ -23,8 +39,6 @@ extra_rdoc_files:
23
39
  files:
24
40
  - README.markdown
25
41
  - install.rb
26
- - lib/rails2.rb
27
- - lib/rails3.rb
28
42
  - lib/validates_existence.rb
29
43
  - rails/init.rb
30
44
  homepage: http://github.com/perfectline/validates_existence/tree/master
@@ -47,8 +61,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
61
  version: '0'
48
62
  requirements: []
49
63
  rubyforge_project:
50
- rubygems_version: 1.8.24
64
+ rubygems_version: 1.8.25
51
65
  signing_key:
52
- specification_version: 3
66
+ specification_version: 4
53
67
  summary: Validates Rails model belongs_to association existence.
54
68
  test_files: []
@@ -1,52 +0,0 @@
1
- module Perfectline
2
- module ValidatesExistence
3
-
4
- module Rails2
5
- def validates_existence_of(*attribute_names)
6
- options = attribute_names.extract_options!.symbolize_keys
7
- options[:message] ||= :existence
8
- options[:both] = true unless options.key?(:both)
9
- options[:allow_new] = false unless options.key?(:allow_new)
10
-
11
- validates_each(attribute_names, options) do |record, attribute, value|
12
- normalized = attribute.to_s.sub(/_id$/, "").to_sym
13
- association = record.class.reflect_on_association(normalized)
14
-
15
- if association.nil? or !association.belongs_to?
16
- raise ArgumentError, "Cannot validate existence on #{normalized}, not a :belongs_to association"
17
- end
18
-
19
- target_class = nil
20
-
21
- # dealing with polymorphic belongs_to
22
- if association.options.has_key?(:foreign_type)
23
- foreign_type = record.send(association.options.fetch(:foreign_type))
24
- target_class = foreign_type.constantize unless foreign_type.nil?
25
- else
26
- target_class = association.klass
27
- end
28
-
29
- if options[:allow_new]
30
- exists = value.new_record? or target_class.exists?(value)
31
- else
32
- exists = target_class.exists?(value)
33
- end
34
-
35
- if target_class.nil? or !exists
36
- errors = [attribute]
37
-
38
- # add the error on both :relation and :relation_id
39
- if options[:both]
40
- errors.push(attribute.to_s.ends_with?("_id") ? normalized : association.primary_key_name)
41
- end
42
-
43
- errors.each do |error|
44
- record.errors.add(error, options[:message], :default => "does not exist")
45
- end
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end
52
-
@@ -1,74 +0,0 @@
1
- require 'active_support/concern'
2
- require 'active_model'
3
-
4
- module Perfectline
5
- module ValidatesExistence
6
-
7
- module Rails3
8
- extend ActiveSupport::Concern
9
-
10
- class ExistenceValidator < ActiveModel::EachValidator
11
-
12
- def initialize(options)
13
- # set the default message if its unspecified
14
- options[:message] ||= :existence
15
- options[:both] = true unless options.key?(:both)
16
- options[:allow_new] = false unless options.key?(:allow_new)
17
- super(options)
18
- end
19
-
20
- def validate_each(record, attribute, value)
21
- normalized = attribute.to_s.sub(/_id$/, "").to_sym
22
- association = record.class.reflect_on_association(normalized)
23
-
24
- if association.nil? || !association.belongs_to?
25
- raise ArgumentError, "Cannot validate existence on #{normalized}, not a :belongs_to association"
26
- end
27
-
28
- target_class = nil
29
-
30
- # dealing with polymorphic belongs_to
31
- if association.options[:polymorphic]
32
- foreign_type = record.send(association.options[:foreign_type] || association.foreign_type)
33
- target_class = foreign_type.constantize unless foreign_type.nil?
34
- else
35
- target_class = association.klass
36
- end
37
-
38
- if value.nil? || target_class.nil? || !exists?(target_class, value)
39
- errors = [attribute]
40
-
41
- # add the error on both :relation and :relation_id
42
- if options[:both]
43
- if Rails::VERSION::MINOR >= 1
44
- foreign_key = association.foreign_key
45
- else
46
- foreign_key = association.primary_key_name
47
- end
48
-
49
- errors << (attribute.to_s.ends_with?("_id") ? normalized : foreign_key)
50
- end
51
-
52
- messages = [:"#{record.class.i18n_scope}.errors.messages.existence", "does not exist"]
53
-
54
- errors.each do |error|
55
- record.errors.add(error, options[:message], :message => messages)
56
- end
57
- end
58
- end
59
-
60
- def exists?(target_class, value)
61
- (options[:allow_new] && value.new_record?) || target_class.exists?(value)
62
- end
63
- end
64
-
65
- module ClassMethods
66
- def validates_existence_of(*attr_names)
67
- validates_with ExistenceValidator, _merge_attributes(attr_names)
68
- end
69
- end
70
-
71
- end
72
- end
73
- end
74
-