ardm-validations 1.2.0

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 (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