dm-validations 0.10.1 → 0.10.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.
Files changed (102) hide show
  1. data/Rakefile +23 -18
  2. data/VERSION +1 -0
  3. data/dm-validations.gemspec +188 -0
  4. data/lib/dm-validations.rb +25 -75
  5. data/lib/dm-validations/auto_validate.rb +7 -7
  6. data/lib/dm-validations/contextual_validators.rb +4 -18
  7. data/lib/dm-validations/exceptions.rb +3 -1
  8. data/lib/dm-validations/support/context.rb +40 -1
  9. data/lib/dm-validations/validation_errors.rb +2 -13
  10. data/lib/dm-validations/validators/absent_field_validator.rb +2 -2
  11. data/lib/dm-validations/validators/acceptance_validator.rb +14 -16
  12. data/lib/dm-validations/validators/confirmation_validator.rb +17 -15
  13. data/lib/dm-validations/validators/format_validator.rb +18 -11
  14. data/lib/dm-validations/validators/generic_validator.rb +45 -15
  15. data/lib/dm-validations/validators/length_validator.rb +2 -11
  16. data/lib/dm-validations/validators/method_validator.rb +2 -2
  17. data/lib/dm-validations/validators/numeric_validator.rb +8 -6
  18. data/lib/dm-validations/validators/primitive_validator.rb +1 -1
  19. data/lib/dm-validations/validators/uniqueness_validator.rb +13 -9
  20. data/lib/dm-validations/validators/within_validator.rb +4 -3
  21. data/spec/fixtures/basketball_player.rb +0 -3
  22. data/spec/fixtures/bill_of_landing.rb +1 -1
  23. data/spec/fixtures/city.rb +0 -1
  24. data/spec/fixtures/company.rb +1 -3
  25. data/spec/fixtures/corporate_world.rb +0 -6
  26. data/spec/fixtures/country.rb +0 -1
  27. data/spec/fixtures/event.rb +1 -1
  28. data/spec/fixtures/page.rb +2 -2
  29. data/spec/fixtures/reservation.rb +1 -1
  30. data/spec/fixtures/scm_operation.rb +0 -8
  31. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +6 -2
  32. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +36 -36
  33. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +2 -2
  34. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +4 -4
  35. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +2 -2
  36. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +2 -0
  37. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +3 -1
  38. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +2 -0
  39. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +6 -2
  40. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +8 -4
  41. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +3 -1
  42. data/spec/integration/automatic_validation/spec_helper.rb +6 -6
  43. data/spec/integration/block_validator/block_validator_spec.rb +1 -1
  44. data/spec/integration/conditional_validation/if_condition_spec.rb +3 -1
  45. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +3 -1
  46. data/spec/integration/datamapper_models/association_validation_spec.rb +4 -1
  47. data/spec/integration/datamapper_models/inheritance_spec.rb +6 -2
  48. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +3 -1
  49. data/spec/integration/format_validator/email_format_validator_spec.rb +5 -1
  50. data/spec/integration/format_validator/format_validator_spec.rb +5 -1
  51. data/spec/integration/format_validator/regexp_validator_spec.rb +5 -1
  52. data/spec/integration/format_validator/url_format_validator_spec.rb +8 -4
  53. data/spec/integration/length_validator/default_value_spec.rb +4 -2
  54. data/spec/integration/length_validator/equality_spec.rb +3 -1
  55. data/spec/integration/length_validator/error_message_spec.rb +3 -1
  56. data/spec/integration/length_validator/maximum_spec.rb +3 -1
  57. data/spec/integration/length_validator/minimum_spec.rb +3 -1
  58. data/spec/integration/length_validator/range_spec.rb +3 -1
  59. data/spec/integration/method_validator/method_validator_spec.rb +3 -1
  60. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +5 -1
  61. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +5 -1
  62. data/spec/integration/numeric_validator/float_type_spec.rb +3 -1
  63. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +3 -1
  64. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +3 -1
  65. data/spec/integration/numeric_validator/integer_only_true_spec.rb +11 -9
  66. data/spec/integration/numeric_validator/integer_type_spec.rb +10 -8
  67. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +3 -1
  68. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +3 -1
  69. data/spec/integration/primitive_validator/primitive_validator_spec.rb +3 -1
  70. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +6 -6
  71. data/spec/integration/required_field_validator/association_spec.rb +9 -4
  72. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +24 -18
  73. data/spec/integration/required_field_validator/date_type_value_spec.rb +21 -19
  74. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +21 -19
  75. data/spec/integration/required_field_validator/float_type_value_spec.rb +21 -19
  76. data/spec/integration/required_field_validator/integer_type_value_spec.rb +17 -15
  77. data/spec/integration/required_field_validator/shared_examples.rb +5 -3
  78. data/spec/integration/required_field_validator/string_type_value_spec.rb +20 -16
  79. data/spec/integration/required_field_validator/text_type_value_spec.rb +10 -6
  80. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +23 -25
  81. data/spec/integration/within_validator/within_validator_spec.rb +7 -3
  82. data/spec/public/resource_spec.rb +5 -6
  83. data/spec/rcov.opts +6 -0
  84. data/spec/spec.opts +2 -0
  85. data/spec/unit/contextual_validators/emptiness_spec.rb +1 -1
  86. data/spec/unit/contextual_validators/execution_spec.rb +9 -16
  87. data/spec/unit/generic_validator/equality_operator_spec.rb +3 -3
  88. data/spec/unit/validation_errors/adding_spec.rb +1 -1
  89. data/spec/unit/validation_errors/emptiness_spec.rb +1 -1
  90. data/spec/unit/validation_errors/enumerable_spec.rb +1 -1
  91. data/tasks/ci.rake +1 -0
  92. data/tasks/metrics.rake +36 -0
  93. data/tasks/spec.rake +41 -0
  94. data/tasks/yard.rake +9 -0
  95. data/tasks/yardstick.rake +19 -0
  96. metadata +36 -18
  97. data/History.rdoc +0 -45
  98. data/Manifest.txt +0 -139
  99. data/TODO +0 -16
  100. data/lib/dm-validations/version.rb +0 -5
  101. data/tasks/install.rb +0 -13
  102. data/tasks/spec.rb +0 -25
data/Rakefile CHANGED
@@ -1,24 +1,29 @@
1
- require 'pathname'
1
+ require 'rubygems'
2
+ require 'rake'
2
3
 
3
- ROOT = Pathname(__FILE__).dirname.expand_path
4
- JRUBY = RUBY_PLATFORM =~ /java/
5
- WINDOWS = Gem.win_platform?
6
- SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
4
+ begin
5
+ gem 'jeweler', '~> 1.4'
6
+ require 'jeweler'
7
7
 
8
- require ROOT + 'lib/dm-validations/version'
8
+ Jeweler::Tasks.new do |gem|
9
+ gem.name = 'dm-validations'
10
+ gem.summary = 'Library for performing validations on DM models and pure Ruby object'
11
+ gem.description = gem.summary
12
+ gem.email = 'vandenberg.guy [a] gmail [d] com'
13
+ gem.homepage = 'http://github.com/datamapper/dm-more/tree/master/%s' % gem.name
14
+ gem.authors = [ 'Guy van den Berg' ]
9
15
 
10
- AUTHOR = 'Guy van den Berg, DataMapper development team'
11
- EMAIL = 'vandenberg.guy [a] gmail [d] com'
12
- GEM_NAME = 'dm-validations'
13
- GEM_VERSION = DataMapper::Validations::VERSION
14
- GEM_DEPENDENCIES = [['dm-core', GEM_VERSION]]
15
- GEM_CLEAN = %w[ log pkg coverage ]
16
- GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.rdoc LICENSE TODO History.rdoc ] }
16
+ gem.rubyforge_project = 'datamapper'
17
17
 
18
- PROJECT_NAME = 'datamapper'
19
- PROJECT_URL = "http://github.com/datamapper/dm-more/tree/master/#{GEM_NAME}"
20
- PROJECT_DESCRIPTION = PROJECT_SUMMARY = 'Library for performing validations on DM models and pure Ruby object'
18
+ gem.add_dependency 'dm-core', '~> 0.10.2'
21
19
 
22
- [ ROOT, ROOT.parent ].each do |dir|
23
- Pathname.glob(dir.join('tasks/**/*.rb').to_s).each { |f| require f }
20
+ gem.add_development_dependency 'rspec', '~> 1.2.9'
21
+ gem.add_development_dependency 'yard', '~> 0.4.0'
22
+ end
23
+
24
+ Jeweler::GemcutterTasks.new
25
+
26
+ FileList['tasks/**/*.rake'].each { |task| import task }
27
+ rescue LoadError
28
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
24
29
  end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.10.2
@@ -0,0 +1,188 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{dm-validations}
8
+ s.version = "0.10.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Guy van den Berg"]
12
+ s.date = %q{2009-12-11}
13
+ s.description = %q{Library for performing validations on DM models and pure Ruby object}
14
+ s.email = %q{vandenberg.guy [a] gmail [d] com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ "LICENSE",
21
+ "README.rdoc",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "dm-validations.gemspec",
25
+ "lib/dm-validations.rb",
26
+ "lib/dm-validations/auto_validate.rb",
27
+ "lib/dm-validations/contextual_validators.rb",
28
+ "lib/dm-validations/exceptions.rb",
29
+ "lib/dm-validations/formats/email.rb",
30
+ "lib/dm-validations/formats/url.rb",
31
+ "lib/dm-validations/support/context.rb",
32
+ "lib/dm-validations/support/object.rb",
33
+ "lib/dm-validations/validation_errors.rb",
34
+ "lib/dm-validations/validators/absent_field_validator.rb",
35
+ "lib/dm-validations/validators/acceptance_validator.rb",
36
+ "lib/dm-validations/validators/block_validator.rb",
37
+ "lib/dm-validations/validators/confirmation_validator.rb",
38
+ "lib/dm-validations/validators/format_validator.rb",
39
+ "lib/dm-validations/validators/generic_validator.rb",
40
+ "lib/dm-validations/validators/length_validator.rb",
41
+ "lib/dm-validations/validators/method_validator.rb",
42
+ "lib/dm-validations/validators/numeric_validator.rb",
43
+ "lib/dm-validations/validators/primitive_validator.rb",
44
+ "lib/dm-validations/validators/required_field_validator.rb",
45
+ "lib/dm-validations/validators/uniqueness_validator.rb",
46
+ "lib/dm-validations/validators/within_validator.rb",
47
+ "spec/fixtures/barcode.rb",
48
+ "spec/fixtures/basketball_court.rb",
49
+ "spec/fixtures/basketball_player.rb",
50
+ "spec/fixtures/beta_tester_account.rb",
51
+ "spec/fixtures/bill_of_landing.rb",
52
+ "spec/fixtures/boat_dock.rb",
53
+ "spec/fixtures/city.rb",
54
+ "spec/fixtures/company.rb",
55
+ "spec/fixtures/corporate_world.rb",
56
+ "spec/fixtures/country.rb",
57
+ "spec/fixtures/currency.rb",
58
+ "spec/fixtures/ethernet_frame.rb",
59
+ "spec/fixtures/event.rb",
60
+ "spec/fixtures/g3_concert.rb",
61
+ "spec/fixtures/jabberwock.rb",
62
+ "spec/fixtures/kayak.rb",
63
+ "spec/fixtures/lernean_hydra.rb",
64
+ "spec/fixtures/mathematical_function.rb",
65
+ "spec/fixtures/memory_object.rb",
66
+ "spec/fixtures/mittelschnauzer.rb",
67
+ "spec/fixtures/motor_launch.rb",
68
+ "spec/fixtures/page.rb",
69
+ "spec/fixtures/phone_number.rb",
70
+ "spec/fixtures/pirogue.rb",
71
+ "spec/fixtures/programming_language.rb",
72
+ "spec/fixtures/reservation.rb",
73
+ "spec/fixtures/scm_operation.rb",
74
+ "spec/fixtures/sms_message.rb",
75
+ "spec/fixtures/udp_packet.rb",
76
+ "spec/integration/absent_field_validator/absent_field_validator_spec.rb",
77
+ "spec/integration/absent_field_validator/spec_helper.rb",
78
+ "spec/integration/acceptance_validator/acceptance_validator_spec.rb",
79
+ "spec/integration/acceptance_validator/spec_helper.rb",
80
+ "spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb",
81
+ "spec/integration/automatic_validation/disabling_inferred_validation_spec.rb",
82
+ "spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb",
83
+ "spec/integration/automatic_validation/inferred_float_property_validation_spec.rb",
84
+ "spec/integration/automatic_validation/inferred_format_validation_spec.rb",
85
+ "spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb",
86
+ "spec/integration/automatic_validation/inferred_length_validation_spec.rb",
87
+ "spec/integration/automatic_validation/inferred_presence_validation_spec.rb",
88
+ "spec/integration/automatic_validation/inferred_primitive_validation_spec.rb",
89
+ "spec/integration/automatic_validation/inferred_within_validation_spec.rb",
90
+ "spec/integration/automatic_validation/spec_helper.rb",
91
+ "spec/integration/block_validator/block_validator_spec.rb",
92
+ "spec/integration/block_validator/spec_helper.rb",
93
+ "spec/integration/conditional_validation/if_condition_spec.rb",
94
+ "spec/integration/conditional_validation/spec_helper.rb",
95
+ "spec/integration/confirmation_validator/confirmation_validator_spec.rb",
96
+ "spec/integration/confirmation_validator/spec_helper.rb",
97
+ "spec/integration/datamapper_models/association_validation_spec.rb",
98
+ "spec/integration/datamapper_models/inheritance_spec.rb",
99
+ "spec/integration/duplicated_validations/duplicated_validations_spec.rb",
100
+ "spec/integration/duplicated_validations/spec_helper.rb",
101
+ "spec/integration/format_validator/email_format_validator_spec.rb",
102
+ "spec/integration/format_validator/format_validator_spec.rb",
103
+ "spec/integration/format_validator/regexp_validator_spec.rb",
104
+ "spec/integration/format_validator/spec_helper.rb",
105
+ "spec/integration/format_validator/url_format_validator_spec.rb",
106
+ "spec/integration/length_validator/default_value_spec.rb",
107
+ "spec/integration/length_validator/equality_spec.rb",
108
+ "spec/integration/length_validator/error_message_spec.rb",
109
+ "spec/integration/length_validator/maximum_spec.rb",
110
+ "spec/integration/length_validator/minimum_spec.rb",
111
+ "spec/integration/length_validator/range_spec.rb",
112
+ "spec/integration/length_validator/spec_helper.rb",
113
+ "spec/integration/method_validator/method_validator_spec.rb",
114
+ "spec/integration/method_validator/spec_helper.rb",
115
+ "spec/integration/numeric_validator/equality_with_float_type_spec.rb",
116
+ "spec/integration/numeric_validator/equality_with_integer_type_spec.rb",
117
+ "spec/integration/numeric_validator/float_type_spec.rb",
118
+ "spec/integration/numeric_validator/gt_with_float_type_spec.rb",
119
+ "spec/integration/numeric_validator/gte_with_float_type_spec.rb",
120
+ "spec/integration/numeric_validator/integer_only_true_spec.rb",
121
+ "spec/integration/numeric_validator/integer_type_spec.rb",
122
+ "spec/integration/numeric_validator/lt_with_float_type_spec.rb",
123
+ "spec/integration/numeric_validator/lte_with_float_type_spec.rb",
124
+ "spec/integration/numeric_validator/spec_helper.rb",
125
+ "spec/integration/primitive_validator/primitive_validator_spec.rb",
126
+ "spec/integration/primitive_validator/spec_helper.rb",
127
+ "spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb",
128
+ "spec/integration/required_field_validator/association_spec.rb",
129
+ "spec/integration/required_field_validator/boolean_type_value_spec.rb",
130
+ "spec/integration/required_field_validator/date_type_value_spec.rb",
131
+ "spec/integration/required_field_validator/datetime_type_value_spec.rb",
132
+ "spec/integration/required_field_validator/float_type_value_spec.rb",
133
+ "spec/integration/required_field_validator/integer_type_value_spec.rb",
134
+ "spec/integration/required_field_validator/plain_old_ruby_object_spec.rb",
135
+ "spec/integration/required_field_validator/shared_examples.rb",
136
+ "spec/integration/required_field_validator/spec_helper.rb",
137
+ "spec/integration/required_field_validator/string_type_value_spec.rb",
138
+ "spec/integration/required_field_validator/text_type_value_spec.rb",
139
+ "spec/integration/shared/default_validation_context.rb",
140
+ "spec/integration/shared/valid_and_invalid_model.rb",
141
+ "spec/integration/uniqueness_validator/spec_helper.rb",
142
+ "spec/integration/uniqueness_validator/uniqueness_validator_spec.rb",
143
+ "spec/integration/within_validator/spec_helper.rb",
144
+ "spec/integration/within_validator/within_validator_spec.rb",
145
+ "spec/public/resource_spec.rb",
146
+ "spec/rcov.opts",
147
+ "spec/spec.opts",
148
+ "spec/spec_helper.rb",
149
+ "spec/unit/contextual_validators/emptiness_spec.rb",
150
+ "spec/unit/contextual_validators/execution_spec.rb",
151
+ "spec/unit/contextual_validators/spec_helper.rb",
152
+ "spec/unit/generic_validator/equality_operator_spec.rb",
153
+ "spec/unit/validation_errors/adding_spec.rb",
154
+ "spec/unit/validation_errors/emptiness_spec.rb",
155
+ "spec/unit/validation_errors/enumerable_spec.rb",
156
+ "tasks/ci.rake",
157
+ "tasks/metrics.rake",
158
+ "tasks/spec.rake",
159
+ "tasks/yard.rake",
160
+ "tasks/yardstick.rake"
161
+ ]
162
+ s.homepage = %q{http://github.com/datamapper/dm-more/tree/master/dm-validations}
163
+ s.rdoc_options = ["--charset=UTF-8"]
164
+ s.require_paths = ["lib"]
165
+ s.rubyforge_project = %q{datamapper}
166
+ s.rubygems_version = %q{1.3.5}
167
+ s.summary = %q{Library for performing validations on DM models and pure Ruby object}
168
+
169
+ if s.respond_to? :specification_version then
170
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
171
+ s.specification_version = 3
172
+
173
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
174
+ s.add_runtime_dependency(%q<dm-core>, ["~> 0.10.2"])
175
+ s.add_development_dependency(%q<rspec>, ["~> 1.2.9"])
176
+ s.add_development_dependency(%q<yard>, ["~> 0.4.0"])
177
+ else
178
+ s.add_dependency(%q<dm-core>, ["~> 0.10.2"])
179
+ s.add_dependency(%q<rspec>, ["~> 1.2.9"])
180
+ s.add_dependency(%q<yard>, ["~> 0.4.0"])
181
+ end
182
+ else
183
+ s.add_dependency(%q<dm-core>, ["~> 0.10.2"])
184
+ s.add_dependency(%q<rspec>, ["~> 1.2.9"])
185
+ s.add_dependency(%q<yard>, ["~> 0.4.0"])
186
+ end
187
+ end
188
+
@@ -50,15 +50,15 @@ module DataMapper
50
50
  end
51
51
 
52
52
  chainable do
53
- def save_self(*)
54
- return false unless validation_context_stack.empty? || valid?(current_validation_context)
55
- super
53
+ def update(attributes = {}, context = default_validation_context)
54
+ validation_context(context) { super(attributes) }
56
55
  end
57
56
  end
58
57
 
59
58
  chainable do
60
- def update(attributes = {}, context = default_validation_context)
61
- validation_context(context) { super(attributes) }
59
+ def save_self(*)
60
+ return false unless validation_context_stack.empty? || valid?(current_validation_context)
61
+ super
62
62
  end
63
63
  end
64
64
 
@@ -89,33 +89,8 @@ module DataMapper
89
89
  klass.validators.execute(context, self)
90
90
  end
91
91
 
92
- # Begin a recursive walk of the model checking validity
93
- #
94
- def all_valid?(context = :default)
95
- recursive_valid?(self, context, true)
96
- end
97
-
98
- # Do recursive validity checking
99
- #
100
- def recursive_valid?(target, context, state)
101
- valid = state
102
- target.instance_variables.each do |ivar|
103
- ivar_value = target.instance_variable_get(ivar)
104
- if ivar_value.validatable?
105
- valid = valid && recursive_valid?(ivar_value, context, valid)
106
- elsif ivar_value.respond_to?(:each)
107
- ivar_value.each do |item|
108
- if item.validatable?
109
- valid = valid && recursive_valid?(item, context, valid)
110
- end
111
- end
112
- end
113
- end
114
- return valid && target.valid?
115
- end
116
-
117
92
  def validation_property_value(name)
118
- respond_to?(name, true) ? send(name) : nil
93
+ __send__(name) if respond_to?(name, true)
119
94
  end
120
95
 
121
96
  # Get the corresponding Resource property, if it exists.
@@ -128,18 +103,6 @@ module DataMapper
128
103
  end
129
104
  end
130
105
 
131
- def validation_association_keys(name)
132
- if model.relationships.has_key?(name)
133
- result = []
134
- relation = model.relationships[name]
135
- relation.child_key.each do |key|
136
- result << key.name
137
- end
138
- return result
139
- end
140
- nil
141
- end
142
-
143
106
  module ClassMethods
144
107
  include DataMapper::Validate::ValidatesPresent
145
108
  include DataMapper::Validate::ValidatesAbsent
@@ -158,18 +121,20 @@ module DataMapper
158
121
  # Return the set of contextual validators or create a new one
159
122
  #
160
123
  def validators
161
- @validations ||= ContextualValidators.new
124
+ @validators ||= ContextualValidators.new
162
125
  end
163
126
 
127
+ private
128
+
164
129
  # Clean up the argument list and return a opts hash, including the
165
130
  # merging of any default opts. Set the context to default if none is
166
131
  # provided. Also allow :context to be aliased to :on, :when & group
167
132
  #
168
133
  def opts_from_validator_args(args, defaults = nil)
169
- opts = args.last.kind_of?(Hash) ? args.pop : {}
134
+ opts = args.last.kind_of?(Hash) ? args.pop.dup : {}
170
135
  context = opts.delete(:group) || opts.delete(:on) || opts.delete(:when) || opts.delete(:context) || :default
171
- opts[:context] = context
172
- opts.merge!(defaults) unless defaults.nil?
136
+ opts[:context] = Array(context)
137
+ opts.update(defaults) unless defaults.nil?
173
138
  opts
174
139
  end
175
140
 
@@ -178,21 +143,12 @@ module DataMapper
178
143
  # if it does not already exist
179
144
  #
180
145
  def create_context_instance_methods(context)
181
- name = "valid_for_#{context.to_s}?" # valid_for_signup?
182
- if !instance_methods.include?(name)
146
+ name = "valid_for_#{context.to_s}?"
147
+ unless respond_to?(:resource_method_defined) ? resource_method_defined?(name) : instance_methods.include?(name)
183
148
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
184
- def #{name} # def valid_for_signup?
185
- valid?(#{context.to_sym.inspect}) # valid?(:signup)
186
- end # end
187
- RUBY
188
- end
189
-
190
- all = "all_valid_for_#{context.to_s}?" # all_valid_for_signup?
191
- if !instance_methods.include?(all)
192
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
193
- def #{all} # def all_valid_for_signup?
194
- all_valid?(#{context.to_sym.inspect}) # all_valid?(:signup)
195
- end # end
149
+ def #{name} # def valid_for_signup?
150
+ valid?(#{context.to_sym.inspect}) # valid?(:signup)
151
+ end # end
196
152
  RUBY
197
153
  end
198
154
  end
@@ -209,21 +165,15 @@ module DataMapper
209
165
  #
210
166
  # @param [Class] klazz
211
167
  # Validator class, example: DataMapper::Validate::LengthValidator
212
- def add_validator_to_context(opts, fields, klazz)
168
+ def add_validator_to_context(opts, fields, validator_class)
213
169
  fields.each do |field|
214
- validator = klazz.new(field, opts.dup)
215
- if opts[:context].is_a?(Symbol)
216
- unless validators.context(opts[:context]).include?(validator)
217
- validators.context(opts[:context]) << validator
218
- create_context_instance_methods(opts[:context])
219
- end
220
- elsif opts[:context].is_a?(Array)
221
- opts[:context].each do |c|
222
- unless validators.context(c).include?(validator)
223
- validators.context(c) << validator
224
- create_context_instance_methods(c)
225
- end
226
- end
170
+ validator = validator_class.new(field, opts.dup)
171
+
172
+ opts[:context].each do |context|
173
+ validator_contexts = validators.context(context)
174
+ next if validator_contexts.include?(validator)
175
+ validator_contexts << validator
176
+ create_context_instance_methods(context)
227
177
  end
228
178
  end
229
179
  end
@@ -39,9 +39,9 @@ module DataMapper
39
39
  # @details [Triggers]
40
40
  # Triggers that generate validator creation
41
41
  #
42
- # :nullable => false
43
- # Setting the option :nullable to false causes a
44
- # validates_presence_of validator to be automatically created on
42
+ # :required => true
43
+ # Setting the option :required to true causes a
44
+ # validates_present validator to be automatically created on
45
45
  # the property
46
46
  #
47
47
  # :length => 20
@@ -111,8 +111,8 @@ module DataMapper
111
111
  def disabled_auto_validations?
112
112
  @disable_auto_validations || false
113
113
  end
114
- alias auto_validations_disabled? disabled_auto_validations?
115
114
 
115
+ alias auto_validations_disabled? disabled_auto_validations?
116
116
 
117
117
  # Checks whether or not property should be auto validated.
118
118
  # It is the case for properties with :auto_validation option
@@ -125,7 +125,7 @@ module DataMapper
125
125
  end
126
126
 
127
127
  def infer_presence_validation_for(property, options)
128
- return if allow_nil?(property)
128
+ return if skip_presence_validation?(property)
129
129
 
130
130
  validates_present property.name, options_with_message(options, property, :presence)
131
131
  end
@@ -193,8 +193,8 @@ module DataMapper
193
193
 
194
194
  private
195
195
 
196
- def allow_nil?(property)
197
- property.nullable? || property.serial?
196
+ def skip_presence_validation?(property)
197
+ property.allow_blank? || property.serial?
198
198
  end
199
199
  end # module AutoValidate
200
200
  end # module Validate
@@ -1,4 +1,4 @@
1
- require "forwardable"
1
+ require 'forwardable'
2
2
 
3
3
  module DataMapper
4
4
  module Validate
@@ -27,13 +27,6 @@ module DataMapper
27
27
  # API
28
28
  #
29
29
 
30
- def dump
31
- contexts.each_pair do |key, context|
32
- puts "Key=#{key} Context: #{context}"
33
- end
34
- end
35
- alias_method :inspect, :dump
36
-
37
30
  # Return an array of validators for a named context
38
31
  #
39
32
  # @param [String]
@@ -59,18 +52,11 @@ module DataMapper
59
52
  # @return [Boolean]
60
53
  # true if all are valid, otherwise false
61
54
  def execute(named_context, target)
62
- raise(ArgumentError, "validation context #{named_context} doesn't seem to be defined. Known contexts are #{contexts.keys.inspect}") if !named_context || (contexts.length > 0 && !contexts[named_context])
63
55
  target.errors.clear!
64
- result = true
65
- # note that all? and any? stop iteration on first negative or positive result,
66
- # so we really have to use each here to make sure all validators are
67
- # executed
68
- context(named_context).select { |validator| validator.execute?(target) }.each do |validator|
69
- result = false unless validator.call(target)
70
- end
71
-
72
56
 
73
- result
57
+ context(named_context).map do |validator|
58
+ validator.execute?(target) ? validator.call(target) : true
59
+ end.all?
74
60
  end
75
61
 
76
62
  end # module ContextualValidators