ardm-validations 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +51 -0
  5. data/LICENSE +21 -0
  6. data/README.rdoc +122 -0
  7. data/Rakefile +4 -0
  8. data/ardm-validations.gemspec +28 -0
  9. data/lib/ardm-validations.rb +1 -0
  10. data/lib/dm-validations.rb +169 -0
  11. data/lib/dm-validations/auto_validate.rb +252 -0
  12. data/lib/dm-validations/context.rb +66 -0
  13. data/lib/dm-validations/contextual_validators.rb +220 -0
  14. data/lib/dm-validations/exceptions.rb +5 -0
  15. data/lib/dm-validations/formats/email.rb +65 -0
  16. data/lib/dm-validations/formats/url.rb +27 -0
  17. data/lib/dm-validations/support/object.rb +18 -0
  18. data/lib/dm-validations/support/ordered_hash.rb +434 -0
  19. data/lib/dm-validations/validation_errors.rb +137 -0
  20. data/lib/dm-validations/validators/absent_field_validator.rb +58 -0
  21. data/lib/dm-validations/validators/acceptance_validator.rb +79 -0
  22. data/lib/dm-validations/validators/block_validator.rb +61 -0
  23. data/lib/dm-validations/validators/confirmation_validator.rb +92 -0
  24. data/lib/dm-validations/validators/format_validator.rb +124 -0
  25. data/lib/dm-validations/validators/generic_validator.rb +184 -0
  26. data/lib/dm-validations/validators/length_validator.rb +249 -0
  27. data/lib/dm-validations/validators/method_validator.rb +64 -0
  28. data/lib/dm-validations/validators/numeric_validator.rb +182 -0
  29. data/lib/dm-validations/validators/primitive_validator.rb +58 -0
  30. data/lib/dm-validations/validators/required_field_validator.rb +83 -0
  31. data/lib/dm-validations/validators/uniqueness_validator.rb +67 -0
  32. data/lib/dm-validations/validators/within_validator.rb +74 -0
  33. data/lib/dm-validations/version.rb +5 -0
  34. data/spec/fixtures/barcode.rb +40 -0
  35. data/spec/fixtures/basketball_court.rb +58 -0
  36. data/spec/fixtures/basketball_player.rb +34 -0
  37. data/spec/fixtures/beta_tester_account.rb +33 -0
  38. data/spec/fixtures/bill_of_landing.rb +47 -0
  39. data/spec/fixtures/boat_dock.rb +26 -0
  40. data/spec/fixtures/city.rb +24 -0
  41. data/spec/fixtures/company.rb +93 -0
  42. data/spec/fixtures/corporate_world.rb +39 -0
  43. data/spec/fixtures/country.rb +24 -0
  44. data/spec/fixtures/ethernet_frame.rb +56 -0
  45. data/spec/fixtures/event.rb +44 -0
  46. data/spec/fixtures/g3_concert.rb +57 -0
  47. data/spec/fixtures/jabberwock.rb +27 -0
  48. data/spec/fixtures/kayak.rb +28 -0
  49. data/spec/fixtures/lernean_hydra.rb +39 -0
  50. data/spec/fixtures/llama_spaceship.rb +15 -0
  51. data/spec/fixtures/mathematical_function.rb +34 -0
  52. data/spec/fixtures/memory_object.rb +30 -0
  53. data/spec/fixtures/mittelschnauzer.rb +39 -0
  54. data/spec/fixtures/motor_launch.rb +21 -0
  55. data/spec/fixtures/multibyte.rb +16 -0
  56. data/spec/fixtures/page.rb +32 -0
  57. data/spec/fixtures/phone_number.rb +28 -0
  58. data/spec/fixtures/pirogue.rb +28 -0
  59. data/spec/fixtures/programming_language.rb +83 -0
  60. data/spec/fixtures/reservation.rb +38 -0
  61. data/spec/fixtures/scm_operation.rb +56 -0
  62. data/spec/fixtures/sms_message.rb +22 -0
  63. data/spec/fixtures/udp_packet.rb +49 -0
  64. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  65. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  66. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  67. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  68. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  69. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  70. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  71. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  72. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  73. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  74. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  75. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  76. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  77. data/spec/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +52 -0
  78. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +39 -0
  79. data/spec/integration/automatic_validation/spec_helper.rb +57 -0
  80. data/spec/integration/block_validator/block_validator_spec.rb +32 -0
  81. data/spec/integration/block_validator/spec_helper.rb +5 -0
  82. data/spec/integration/conditional_validation/if_condition_spec.rb +63 -0
  83. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  84. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  85. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  86. data/spec/integration/datamapper_models/association_validation_spec.rb +29 -0
  87. data/spec/integration/datamapper_models/inheritance_spec.rb +82 -0
  88. data/spec/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  89. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  90. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  91. data/spec/integration/format_validator/email_format_validator_spec.rb +139 -0
  92. data/spec/integration/format_validator/format_validator_spec.rb +64 -0
  93. data/spec/integration/format_validator/regexp_validator_spec.rb +33 -0
  94. data/spec/integration/format_validator/spec_helper.rb +5 -0
  95. data/spec/integration/format_validator/url_format_validator_spec.rb +93 -0
  96. data/spec/integration/length_validator/default_value_spec.rb +14 -0
  97. data/spec/integration/length_validator/equality_spec.rb +87 -0
  98. data/spec/integration/length_validator/error_message_spec.rb +22 -0
  99. data/spec/integration/length_validator/maximum_spec.rb +49 -0
  100. data/spec/integration/length_validator/minimum_spec.rb +54 -0
  101. data/spec/integration/length_validator/range_spec.rb +87 -0
  102. data/spec/integration/length_validator/spec_helper.rb +7 -0
  103. data/spec/integration/method_validator/method_validator_spec.rb +241 -0
  104. data/spec/integration/method_validator/spec_helper.rb +5 -0
  105. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  106. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  107. data/spec/integration/numeric_validator/float_type_spec.rb +90 -0
  108. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  109. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  110. data/spec/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  111. data/spec/integration/numeric_validator/integer_type_spec.rb +86 -0
  112. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  113. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  114. data/spec/integration/numeric_validator/spec_helper.rb +5 -0
  115. data/spec/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  116. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  117. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  118. data/spec/integration/required_field_validator/association_spec.rb +72 -0
  119. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +155 -0
  120. data/spec/integration/required_field_validator/date_type_value_spec.rb +127 -0
  121. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  122. data/spec/integration/required_field_validator/float_type_value_spec.rb +131 -0
  123. data/spec/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  124. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  125. data/spec/integration/required_field_validator/shared_examples.rb +26 -0
  126. data/spec/integration/required_field_validator/spec_helper.rb +7 -0
  127. data/spec/integration/required_field_validator/string_type_value_spec.rb +167 -0
  128. data/spec/integration/required_field_validator/text_type_value_spec.rb +49 -0
  129. data/spec/integration/shared/default_validation_context.rb +13 -0
  130. data/spec/integration/shared/valid_and_invalid_model.rb +35 -0
  131. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  132. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  133. data/spec/integration/within_validator/spec_helper.rb +5 -0
  134. data/spec/integration/within_validator/within_validator_spec.rb +168 -0
  135. data/spec/public/resource_spec.rb +105 -0
  136. data/spec/rcov.opts +6 -0
  137. data/spec/spec.opts +4 -0
  138. data/spec/spec_helper.rb +29 -0
  139. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  140. data/spec/unit/contextual_validators/execution_spec.rb +48 -0
  141. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  142. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  143. data/spec/unit/generic_validator/optional_spec.rb +54 -0
  144. data/spec/unit/validation_errors/adding_spec.rb +54 -0
  145. data/spec/unit/validation_errors/emptiness_spec.rb +38 -0
  146. data/spec/unit/validation_errors/enumerable_spec.rb +32 -0
  147. data/spec/unit/validation_errors/reading_spec.rb +35 -0
  148. data/spec/unit/validation_errors/respond_to_spec.rb +15 -0
  149. data/spec/unit/validators/within_validator_spec.rb +23 -0
  150. data/tasks/spec.rake +38 -0
  151. data/tasks/yard.rake +9 -0
  152. data/tasks/yardstick.rake +19 -0
  153. metadata +256 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9a6e3b907d785ecb7d7391fe2b8bca97c6e3634e
4
+ data.tar.gz: 16609fac5103d7fcd7bfa76d2a1fc03f57a3940d
5
+ SHA512:
6
+ metadata.gz: 21b19deb551d6a604fb7cef0aea03725c92754d07a11f28c1d2d19c77869736b2a032f092745c7ef32dd2a4b0db1d8ea443eb025e80ce39e80faa86d8d539ec9
7
+ data.tar.gz: 6e24b74280d713ec077723b54dc30b775f3932495e186008266e2c2f73bd7dc7d630bc45b7dd9dc9ca135b00b83312993ff1b25706ad43e3c96f53b068f92795
@@ -0,0 +1,35 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## Rubinius
17
+ *.rbc
18
+
19
+ ## PROJECT::GENERAL
20
+ *.gem
21
+ coverage
22
+ rdoc
23
+ pkg
24
+ tmp
25
+ doc
26
+ log
27
+ .yardoc
28
+ measurements
29
+
30
+ ## BUNDLER
31
+ .bundle
32
+ Gemfile.*
33
+
34
+ ## PROJECT::SPECIFIC
35
+ spec/db/
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.5
7
+ - 2.2.0
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: 2.1.5
11
+ - rvm: 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,51 @@
1
+ require 'pathname'
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ SOURCE = ENV.fetch('SOURCE', :git).to_sym
8
+ REPO_POSTFIX = SOURCE == :path ? '' : '.git'
9
+ DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/ar-dm'
10
+ DM_VERSION = '~> 1.2.0'
11
+ DO_VERSION = '~> 0.10.4'
12
+ DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
13
+ CURRENT_BRANCH = ENV.fetch('GIT_BRANCH', 'master')
14
+
15
+ gem 'ardm-core', DM_VERSION, SOURCE => "#{DATAMAPPER}/ardm-core#{REPO_POSTFIX}", :branch => CURRENT_BRANCH
16
+
17
+ group :development do
18
+ gem 'ardm-types', DM_VERSION, SOURCE => "#{DATAMAPPER}/ardm-types#{REPO_POSTFIX}", :branch => CURRENT_BRANCH
19
+ end
20
+
21
+ group :datamapper do
22
+
23
+ adapters = ENV['ADAPTER'] || ENV['ADAPTERS']
24
+ adapters = adapters.to_s.tr(',', ' ').split.uniq - %w[ in_memory ]
25
+
26
+ if (do_adapters = DM_DO_ADAPTERS & adapters).any?
27
+ do_options = {}
28
+ do_options[:git] = "#{DATAMAPPER}/do#{REPO_POSTFIX}" if ENV['DO_GIT'] == 'true'
29
+
30
+ gem 'data_objects', DO_VERSION, do_options.dup
31
+
32
+ do_adapters.each do |adapter|
33
+ adapter = 'sqlite3' if adapter == 'sqlite'
34
+ gem "do_#{adapter}", DO_VERSION, do_options.dup
35
+ end
36
+
37
+ gem 'ardm-do-adapter', DM_VERSION, SOURCE => "#{DATAMAPPER}/ardm-do-adapter#{REPO_POSTFIX}", :branch => CURRENT_BRANCH
38
+ end
39
+
40
+ adapters.each do |adapter|
41
+ gem "ardm-#{adapter}-adapter", DM_VERSION, SOURCE => "#{DATAMAPPER}/ardm-#{adapter}-adapter#{REPO_POSTFIX}", :branch => CURRENT_BRANCH
42
+ end
43
+
44
+ plugins = ENV['PLUGINS'] || ENV['PLUGIN']
45
+ plugins = plugins.to_s.tr(',', ' ').split.push('ardm-migrations').uniq
46
+
47
+ plugins.each do |plugin|
48
+ gem plugin, DM_VERSION, SOURCE => "#{DATAMAPPER}/#{plugin}#{REPO_POSTFIX}", :branch => CURRENT_BRANCH
49
+ end
50
+
51
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2007 Guy van den Berg
2
+ Copyright (c) 2011 DataMapper development team
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,122 @@
1
+ This is a DataMapper plugin that provides validations for DataMapper model classes.
2
+
3
+ == Setup
4
+ DataMapper validation capabilities are automatically available for DataMapper resources when you require dm-validations' in your application. There is no need to manually include anything, every DataMapper::Resource will be able to handle validations once this gem got required.
5
+
6
+ == Specifying Model Validations
7
+
8
+ There are two primary ways to implement validations for your models
9
+
10
+ 1) Placing validation methods with properties as params in your class
11
+
12
+ require 'dm-core'
13
+ require 'dm-validations'
14
+
15
+ class ProgrammingLanguage
16
+ include DataMapper::Resource
17
+ property :name, String
18
+ validates_presence_of :name
19
+ end
20
+
21
+ 2) Using auto-validations, please see DataMapper::Validations::AutoValidations. Note that not all validations that are provided via validation methods, are also available as autovalidation options. If they are available, they're functionally equivalent though.
22
+
23
+ class ProgrammingLanguage
24
+ include DataMapper::Resource
25
+ property :name, String, :required => true
26
+ end
27
+
28
+ See all of the DataMapper::Validate module's XYZValidator(s) to learn about the complete collections of validators available to you.
29
+
30
+ == Validating
31
+
32
+ DataMapper validations, when included, alter the default save/create/update process for a model. Unless you specify a context the resource must be valid in the :default context before saving.
33
+
34
+ You may manually validate a resource using the valid? method, which will return true if the resource is valid, and false if it is invalid.
35
+
36
+ == Working with Validation Errors
37
+
38
+ If your validators find errors in your model, they will populate the DataMapper::Validations::ValidationErrors object that is available through each of your models via calls to your model's errors method.
39
+
40
+ For example:
41
+
42
+ my_account = Account.new(:name => "Jose")
43
+ if my_account.save
44
+ # my_account is valid and has been saved
45
+ else
46
+ my_account.errors.each do |e|
47
+ puts e
48
+ end
49
+ end
50
+
51
+ See DataMapper::Validations::ValidationErrors for all you can do with your model's
52
+ errors method.
53
+
54
+ == Contextual Validations
55
+
56
+ DataMapper Validations also provide a means of grouping your validations into
57
+ contexts. This enables you to run different sets of validations when you
58
+ need it. For instance, the same model may not only behave differently
59
+ when initially saved or saved on update, but also require special validation sets
60
+ for publishing, exporting, importing and so on.
61
+
62
+ Again, using our example for pure Ruby class validations:
63
+
64
+ class ProgrammingLanguage
65
+
66
+ include DataMapper::Resource
67
+
68
+ property :name, String
69
+
70
+ def ensure_allows_manual_memory_management
71
+ # ...
72
+ end
73
+
74
+ def ensure_allows_optional_parentheses
75
+ # ...
76
+ end
77
+
78
+ validates_presence_of :name
79
+ validates_with_method :ensure_allows_optional_parentheses, :when => [:implementing_a_dsl]
80
+ validates_with_method :ensure_allows_manual_memory_management, :when => [:doing_system_programming]
81
+ end
82
+
83
+ ProgrammingLanguage instance now use #valid? method with one of two context symbols:
84
+
85
+ @ruby.valid?(:implementing_a_dsl) # => true
86
+ @ruby.valid?(:doing_system_programming) # => false
87
+
88
+ @c.valid?(:implementing_a_dsl) # => false
89
+ @c.valid?(:doing_system_programming) # => true
90
+
91
+ Each context causes different set of validations to be triggered. If you don't
92
+ specify a context using :when, :on or :group options (they are all aliases and do
93
+ the same thing), default context name is :default. When you do model.valid? (without
94
+ specifying context explicitly), again, :default context is used. One validation
95
+ can be used in two, three or five contexts if you like:
96
+
97
+ class Book
98
+
99
+ include ::DataMapper::Resource
100
+
101
+ property :id, Serial
102
+ property :name, String
103
+
104
+ property :agreed_title, String
105
+ property :finished_toc, Boolean
106
+
107
+ # used in all contexts, including default
108
+ validates_presence_of :name, :when => [:default, :sending_to_print]
109
+ validates_presence_of :agreed_title, :when => [:sending_to_print]
110
+
111
+ validates_with_block :toc, :when => [:sending_to_print] do
112
+ if self.finished_toc
113
+ [true]
114
+ else
115
+ [false, "TOC must be finalized before you send a book to print"]
116
+ end
117
+ end
118
+ end
119
+
120
+ In the example above, name is validated for presence in both :default context and
121
+ :sending_to_print context, while TOC related block validation and title presence validation
122
+ only take place in :sending_to_print context.
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ FileList['tasks/**/*.rake'].each { |task| import task }
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dm-validations/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "ardm-validations"
6
+ gem.version = DataMapper::Validations::VERSION
7
+
8
+ gem.authors = ['Martin Emde', "Guy van den Berg"]
9
+ gem.email = ['me@martinemde.com', "vandenberg.guy [a] gmail [d] com"]
10
+ gem.description = "Ardm fork of dm-validations"
11
+ gem.summary = gem.description
12
+ gem.license = "MIT"
13
+
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {spec}/*`.split("\n")
16
+ gem.extra_rdoc_files = %w[LICENSE README.rdoc]
17
+
18
+ gem.homepage = "http://github.com/ar-dm/ardm-validations"
19
+ gem.require_paths = ["lib"]
20
+ gem.rubygems_version = "1.8.11"
21
+
22
+ gem.add_runtime_dependency 'ardm-core', '~> 1.2'
23
+
24
+ gem.add_development_dependency 'ardm-types', '~> 1.2'
25
+ gem.add_development_dependency 'rake', '~> 0.9'
26
+ gem.add_development_dependency 'rspec', '~> 1.3'
27
+ end
28
+
@@ -0,0 +1 @@
1
+ require 'dm-validations'
@@ -0,0 +1,169 @@
1
+ require 'dm-core'
2
+ require 'dm-validations/support/ordered_hash'
3
+ require 'dm-validations/support/object'
4
+
5
+ require 'dm-validations/exceptions'
6
+ require 'dm-validations/validation_errors'
7
+ require 'dm-validations/contextual_validators'
8
+ require 'dm-validations/auto_validate'
9
+ require 'dm-validations/context'
10
+
11
+ require 'dm-validations/validators/generic_validator'
12
+ require 'dm-validations/validators/required_field_validator'
13
+ require 'dm-validations/validators/primitive_validator'
14
+ require 'dm-validations/validators/absent_field_validator'
15
+ require 'dm-validations/validators/confirmation_validator'
16
+ require 'dm-validations/validators/format_validator'
17
+ require 'dm-validations/validators/length_validator'
18
+ require 'dm-validations/validators/within_validator'
19
+ require 'dm-validations/validators/numeric_validator'
20
+ require 'dm-validations/validators/method_validator'
21
+ require 'dm-validations/validators/block_validator'
22
+ require 'dm-validations/validators/uniqueness_validator'
23
+ require 'dm-validations/validators/acceptance_validator'
24
+
25
+ module DataMapper
26
+ module Validations
27
+
28
+ Model.append_inclusions self
29
+
30
+ def self.included(model)
31
+ model.extend ClassMethods
32
+ end
33
+
34
+ # Ensures the object is valid for the context provided, and otherwise
35
+ # throws :halt and returns false.
36
+ #
37
+ # @api public
38
+ def save(context = default_validation_context)
39
+ model.validators.assert_valid(context)
40
+ Validations::Context.in_context(context) { super() }
41
+ end
42
+
43
+ # @api public
44
+ def update(attributes = {}, context = default_validation_context)
45
+ model.validators.assert_valid(context)
46
+ Validations::Context.in_context(context) { super(attributes) }
47
+ end
48
+
49
+ # @api private
50
+ def save_self(*)
51
+ if Validations::Context.any? && !valid?(model.validators.current_context)
52
+ false
53
+ else
54
+ super
55
+ end
56
+ end
57
+
58
+ # Return the ValidationErrors
59
+ #
60
+ # @api public
61
+ def errors
62
+ @errors ||= ValidationErrors.new(self)
63
+ end
64
+
65
+ # Mark this resource as validatable. When we validate associations of a
66
+ # resource we can check if they respond to validatable? before trying to
67
+ # recursively validate them
68
+ #
69
+ # @api semipublic
70
+ def validatable?
71
+ true
72
+ end
73
+
74
+ # Alias for valid?(:default)
75
+ #
76
+ # TODO: deprecate
77
+ def valid_for_default?
78
+ valid?(:default)
79
+ end
80
+
81
+ # Check if a resource is valid in a given context
82
+ #
83
+ # @api public
84
+ def valid?(context = :default)
85
+ model = respond_to?(:model) ? self.model : self.class
86
+ model.validators.execute(context, self)
87
+ end
88
+
89
+ # @api semipublic
90
+ def validation_property_value(name)
91
+ __send__(name) if respond_to?(name, true)
92
+ end
93
+
94
+ module ClassMethods
95
+ include DataMapper::Validations::ValidatesPresence
96
+ include DataMapper::Validations::ValidatesAbsence
97
+ include DataMapper::Validations::ValidatesConfirmation
98
+ include DataMapper::Validations::ValidatesPrimitiveType
99
+ include DataMapper::Validations::ValidatesAcceptance
100
+ include DataMapper::Validations::ValidatesFormat
101
+ include DataMapper::Validations::ValidatesLength
102
+ include DataMapper::Validations::ValidatesWithin
103
+ include DataMapper::Validations::ValidatesNumericality
104
+ include DataMapper::Validations::ValidatesWithMethod
105
+ include DataMapper::Validations::ValidatesWithBlock
106
+ include DataMapper::Validations::ValidatesUniqueness
107
+ include DataMapper::Validations::AutoValidations
108
+
109
+ # Return the set of contextual validators or create a new one
110
+ #
111
+ # @api public
112
+ def validators
113
+ @validators ||= ContextualValidators.new(self)
114
+ end
115
+
116
+ # @api private
117
+ def inherited(base)
118
+ super
119
+ self.validators.contexts.each do |context, validators|
120
+ validators.each do |v|
121
+ options = v.options.merge(:context => context)
122
+ base.validators.add(v.class, v.field_name, options)
123
+ end
124
+ end
125
+ end
126
+
127
+ # @api public
128
+ def create(attributes = {}, *args)
129
+ resource = new(attributes)
130
+ resource.save(*args)
131
+ resource
132
+ end
133
+
134
+ private
135
+
136
+ # Given a new context create an instance method of
137
+ # valid_for_<context>? which simply calls valid?(context)
138
+ # if it does not already exist
139
+ #
140
+ # @api private
141
+ def self.create_context_instance_methods(model, context)
142
+ # TODO: deprecate `valid_for_#{context}?`
143
+ # what's wrong with requiring the caller to pass the context as an arg?
144
+ # eg, `valid?(:context)`
145
+ # these methods are handy for symbol-based callbacks,
146
+ # eg. `:if => :valid_for_context?`
147
+ # but these methods are so trivial to add where needed, making it
148
+ # overkill to do this for all contexts on all validated objects.
149
+ context = context.to_sym
150
+
151
+ name = "valid_for_#{context}?"
152
+ present = model.respond_to?(:resource_method_defined) ? model.resource_method_defined?(name) : model.instance_methods.include?(name)
153
+ unless present
154
+ model.class_eval <<-RUBY, __FILE__, __LINE__ + 1
155
+ def #{name} # def valid_for_signup?
156
+ valid?(#{context.inspect}) # valid?(:signup)
157
+ end # end
158
+ RUBY
159
+ end
160
+ end
161
+
162
+ end # module ClassMethods
163
+ end # module Validations
164
+
165
+ # Provide a const alias for backward compatibility with plugins
166
+ # This is scheduled to go away though, definitely before 1.0
167
+ Validate = Validations
168
+
169
+ end # module DataMapper