dm-validations 0.9.11 → 0.10.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 (159) hide show
  1. data/{History.txt → History.rdoc} +10 -3
  2. data/LICENSE +1 -0
  3. data/Manifest.txt +103 -33
  4. data/README.rdoc +172 -0
  5. data/Rakefile +4 -5
  6. data/lib/dm-validations.rb +73 -75
  7. data/lib/dm-validations/auto_validate.rb +98 -56
  8. data/lib/dm-validations/contextual_validators.rb +37 -14
  9. data/lib/dm-validations/exceptions.rb +3 -0
  10. data/lib/dm-validations/formats/url.rb +3 -1
  11. data/lib/dm-validations/support/context.rb +54 -0
  12. data/lib/dm-validations/validation_errors.rb +51 -27
  13. data/lib/dm-validations/{absent_field_validator.rb → validators/absent_field_validator.rb} +2 -8
  14. data/lib/dm-validations/{acceptance_validator.rb → validators/acceptance_validator.rb} +7 -7
  15. data/lib/dm-validations/{block_validator.rb → validators/block_validator.rb} +0 -0
  16. data/lib/dm-validations/{confirmation_validator.rb → validators/confirmation_validator.rb} +7 -7
  17. data/lib/dm-validations/{format_validator.rb → validators/format_validator.rb} +10 -16
  18. data/lib/dm-validations/{generic_validator.rb → validators/generic_validator.rb} +28 -6
  19. data/lib/dm-validations/validators/length_validator.rb +214 -0
  20. data/lib/dm-validations/validators/method_validator.rb +68 -0
  21. data/lib/dm-validations/validators/numeric_validator.rb +171 -0
  22. data/lib/dm-validations/{primitive_validator.rb → validators/primitive_validator.rb} +2 -7
  23. data/lib/dm-validations/{required_field_validator.rb → validators/required_field_validator.rb} +0 -6
  24. data/lib/dm-validations/{uniqueness_validator.rb → validators/uniqueness_validator.rb} +9 -20
  25. data/lib/dm-validations/{within_validator.rb → validators/within_validator.rb} +4 -4
  26. data/lib/dm-validations/version.rb +1 -1
  27. data/spec/fixtures/barcode.rb +32 -0
  28. data/spec/fixtures/basketball_court.rb +58 -0
  29. data/spec/fixtures/basketball_player.rb +37 -0
  30. data/spec/fixtures/beta_tester_account.rb +33 -0
  31. data/spec/fixtures/bill_of_landing.rb +42 -0
  32. data/spec/fixtures/boat_dock.rb +26 -0
  33. data/spec/fixtures/city.rb +25 -0
  34. data/spec/fixtures/company.rb +95 -0
  35. data/spec/fixtures/corporate_world.rb +47 -0
  36. data/spec/fixtures/country.rb +25 -0
  37. data/spec/fixtures/currency.rb +42 -0
  38. data/spec/fixtures/ethernet_frame.rb +56 -0
  39. data/spec/fixtures/event.rb +44 -0
  40. data/spec/fixtures/g3_concert.rb +57 -0
  41. data/spec/fixtures/jabberwock.rb +27 -0
  42. data/spec/fixtures/kayak.rb +28 -0
  43. data/spec/fixtures/lernean_hydra.rb +39 -0
  44. data/spec/fixtures/mathematical_function.rb +34 -0
  45. data/spec/fixtures/memory_object.rb +30 -0
  46. data/spec/fixtures/mittelschnauzer.rb +35 -0
  47. data/spec/fixtures/motor_launch.rb +21 -0
  48. data/spec/fixtures/page.rb +32 -0
  49. data/spec/fixtures/phone_number.rb +28 -0
  50. data/spec/fixtures/pirogue.rb +28 -0
  51. data/spec/fixtures/programming_language.rb +83 -0
  52. data/spec/fixtures/reservation.rb +38 -0
  53. data/spec/fixtures/scm_operation.rb +67 -0
  54. data/spec/fixtures/sms_message.rb +22 -0
  55. data/spec/fixtures/udp_packet.rb +49 -0
  56. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +86 -0
  57. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  58. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  59. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  60. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +47 -0
  61. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +41 -0
  62. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +104 -0
  63. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +35 -0
  64. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +33 -0
  65. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +73 -0
  66. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +121 -0
  67. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +41 -0
  68. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +20 -0
  69. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +33 -0
  70. data/spec/integration/automatic_validation/spec_helper.rb +74 -0
  71. data/spec/integration/block_validator/block_validator_spec.rb +32 -0
  72. data/spec/integration/block_validator/spec_helper.rb +5 -0
  73. data/spec/integration/conditional_validation/if_condition_spec.rb +61 -0
  74. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  75. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +74 -0
  76. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  77. data/spec/integration/datamapper_models/association_validation_spec.rb +23 -0
  78. data/spec/integration/datamapper_models/inheritance_spec.rb +78 -0
  79. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +22 -0
  80. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  81. data/spec/integration/format_validator/email_format_validator_spec.rb +113 -0
  82. data/spec/integration/format_validator/format_validator_spec.rb +60 -0
  83. data/spec/integration/format_validator/regexp_validator_spec.rb +29 -0
  84. data/spec/integration/format_validator/spec_helper.rb +5 -0
  85. data/spec/integration/format_validator/url_format_validator_spec.rb +63 -0
  86. data/spec/integration/length_validator/default_value_spec.rb +12 -0
  87. data/spec/integration/length_validator/equality_spec.rb +79 -0
  88. data/spec/integration/length_validator/error_message_spec.rb +15 -18
  89. data/spec/integration/length_validator/maximum_spec.rb +40 -24
  90. data/spec/integration/length_validator/minimum_spec.rb +32 -21
  91. data/spec/integration/length_validator/range_spec.rb +50 -60
  92. data/spec/integration/length_validator/spec_helper.rb +7 -12
  93. data/spec/integration/method_validator/method_validator_spec.rb +239 -0
  94. data/spec/integration/method_validator/spec_helper.rb +5 -0
  95. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +61 -0
  96. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +37 -0
  97. data/spec/integration/numeric_validator/float_type_spec.rb +42 -56
  98. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +35 -0
  99. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +35 -0
  100. data/spec/integration/numeric_validator/integer_only_true_spec.rb +3 -6
  101. data/spec/integration/numeric_validator/integer_type_spec.rb +8 -24
  102. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +35 -0
  103. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +35 -0
  104. data/spec/integration/numeric_validator/spec_helper.rb +5 -77
  105. data/spec/integration/primitive_validator/primitive_validator_spec.rb +90 -0
  106. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  107. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  108. data/spec/integration/required_field_validator/association_spec.rb +5 -8
  109. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +4 -7
  110. data/spec/integration/required_field_validator/date_type_value_spec.rb +3 -6
  111. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +3 -6
  112. data/spec/integration/required_field_validator/float_type_value_spec.rb +3 -6
  113. data/spec/integration/required_field_validator/integer_type_value_spec.rb +2 -5
  114. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +5 -8
  115. data/spec/integration/required_field_validator/shared_examples.rb +1 -1
  116. data/spec/integration/required_field_validator/spec_helper.rb +6 -67
  117. data/spec/integration/required_field_validator/string_type_value_spec.rb +2 -5
  118. data/spec/integration/required_field_validator/text_type_value_spec.rb +2 -5
  119. data/spec/integration/shared/default_validation_context.rb +13 -0
  120. data/spec/integration/shared/valid_and_invalid_model.rb +27 -0
  121. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  122. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +114 -0
  123. data/spec/integration/within_validator/spec_helper.rb +5 -0
  124. data/spec/integration/within_validator/within_validator_spec.rb +164 -0
  125. data/spec/public/resource_spec.rb +68 -0
  126. data/spec/spec.opts +1 -0
  127. data/spec/spec_helper.rb +12 -4
  128. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  129. data/spec/unit/contextual_validators/execution_spec.rb +55 -0
  130. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  131. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  132. data/spec/unit/validation_errors/adding_spec.rb +54 -0
  133. data/spec/unit/validation_errors/emptiness_spec.rb +38 -0
  134. data/spec/unit/validation_errors/enumerable_spec.rb +32 -0
  135. data/tasks/install.rb +1 -1
  136. data/tasks/spec.rb +4 -4
  137. metadata +118 -55
  138. data/README.txt +0 -72
  139. data/lib/dm-validations/custom_validator.rb +0 -72
  140. data/lib/dm-validations/length_validator.rb +0 -113
  141. data/lib/dm-validations/method_validator.rb +0 -68
  142. data/lib/dm-validations/numeric_validator.rb +0 -83
  143. data/spec/integration/absent_field_validator_spec.rb +0 -36
  144. data/spec/integration/acceptance_validator_spec.rb +0 -87
  145. data/spec/integration/auto_validate_spec.rb +0 -342
  146. data/spec/integration/block_validator_spec.rb +0 -30
  147. data/spec/integration/confirmation_validator_spec.rb +0 -105
  148. data/spec/integration/contextual_validators_spec.rb +0 -27
  149. data/spec/integration/custom_validator_spec.rb +0 -9
  150. data/spec/integration/format_validator_spec.rb +0 -193
  151. data/spec/integration/generic_validator_spec.rb +0 -17
  152. data/spec/integration/length_validator/valid_objects_spec.rb +0 -13
  153. data/spec/integration/method_validator_spec.rb +0 -58
  154. data/spec/integration/numeric_validator_spec.rb +0 -253
  155. data/spec/integration/primitive_validator_spec.rb +0 -30
  156. data/spec/integration/uniqueness_validator_spec.rb +0 -97
  157. data/spec/integration/validation_errors_spec.rb +0 -18
  158. data/spec/integration/validation_spec.rb +0 -404
  159. data/spec/integration/within_validator_spec.rb +0 -79
@@ -1,8 +1,15 @@
1
- === 0.9.11 / 2009-03-29
1
+ === 0.10.0 / 2009-10-15
2
2
 
3
- * 1 bug fix:
3
+ * 3 major enhancements:
4
+
5
+ * Major spec refactoring
6
+ * dm-validations now can be used with a pure Ruby classes, not just DM models
7
+ * i18n of error messages
8
+
9
+ * 1 minor enhancement:
10
+
11
+ * allow_nil option now uses #blank? instead of #nil? to comply common a use case
4
12
 
5
- * Updated source file to force binary encoding
6
13
 
7
14
  === 0.9.10 / 2009-01-19
8
15
 
data/LICENSE CHANGED
@@ -1,4 +1,5 @@
1
1
  Copyright (c) 2007 Guy van den Berg
2
+ Copyright (c) 2008, 2009 DataMapper development team
2
3
 
3
4
  Permission is hereby granted, free of charge, to any person obtaining
4
5
  a copy of this software and associated documentation files (the
data/Manifest.txt CHANGED
@@ -1,53 +1,113 @@
1
- History.txt
1
+ History.rdoc
2
2
  LICENSE
3
3
  Manifest.txt
4
- README.txt
4
+ README.rdoc
5
5
  Rakefile
6
6
  TODO
7
7
  lib/dm-validations.rb
8
- lib/dm-validations/absent_field_validator.rb
9
- lib/dm-validations/acceptance_validator.rb
10
8
  lib/dm-validations/auto_validate.rb
11
- lib/dm-validations/block_validator.rb
12
- lib/dm-validations/confirmation_validator.rb
13
9
  lib/dm-validations/contextual_validators.rb
14
- lib/dm-validations/custom_validator.rb
15
- lib/dm-validations/format_validator.rb
10
+ lib/dm-validations/exceptions.rb
16
11
  lib/dm-validations/formats/email.rb
17
12
  lib/dm-validations/formats/url.rb
18
- lib/dm-validations/generic_validator.rb
19
- lib/dm-validations/length_validator.rb
20
- lib/dm-validations/method_validator.rb
21
- lib/dm-validations/numeric_validator.rb
22
- lib/dm-validations/primitive_validator.rb
23
- lib/dm-validations/required_field_validator.rb
13
+ lib/dm-validations/support/context.rb
24
14
  lib/dm-validations/support/object.rb
25
- lib/dm-validations/uniqueness_validator.rb
26
15
  lib/dm-validations/validation_errors.rb
16
+ lib/dm-validations/validators/absent_field_validator.rb
17
+ lib/dm-validations/validators/acceptance_validator.rb
18
+ lib/dm-validations/validators/block_validator.rb
19
+ lib/dm-validations/validators/confirmation_validator.rb
20
+ lib/dm-validations/validators/format_validator.rb
21
+ lib/dm-validations/validators/generic_validator.rb
22
+ lib/dm-validations/validators/length_validator.rb
23
+ lib/dm-validations/validators/method_validator.rb
24
+ lib/dm-validations/validators/numeric_validator.rb
25
+ lib/dm-validations/validators/primitive_validator.rb
26
+ lib/dm-validations/validators/required_field_validator.rb
27
+ lib/dm-validations/validators/uniqueness_validator.rb
28
+ lib/dm-validations/validators/within_validator.rb
27
29
  lib/dm-validations/version.rb
28
- lib/dm-validations/within_validator.rb
29
- spec/integration/absent_field_validator_spec.rb
30
- spec/integration/acceptance_validator_spec.rb
31
- spec/integration/auto_validate_spec.rb
32
- spec/integration/block_validator_spec.rb
33
- spec/integration/confirmation_validator_spec.rb
34
- spec/integration/contextual_validators_spec.rb
35
- spec/integration/custom_validator_spec.rb
36
- spec/integration/format_validator_spec.rb
37
- spec/integration/generic_validator_spec.rb
30
+ spec/fixtures/barcode.rb
31
+ spec/fixtures/basketball_court.rb
32
+ spec/fixtures/basketball_player.rb
33
+ spec/fixtures/beta_tester_account.rb
34
+ spec/fixtures/bill_of_landing.rb
35
+ spec/fixtures/boat_dock.rb
36
+ spec/fixtures/city.rb
37
+ spec/fixtures/company.rb
38
+ spec/fixtures/corporate_world.rb
39
+ spec/fixtures/country.rb
40
+ spec/fixtures/currency.rb
41
+ spec/fixtures/ethernet_frame.rb
42
+ spec/fixtures/event.rb
43
+ spec/fixtures/g3_concert.rb
44
+ spec/fixtures/jabberwock.rb
45
+ spec/fixtures/kayak.rb
46
+ spec/fixtures/lernean_hydra.rb
47
+ spec/fixtures/mathematical_function.rb
48
+ spec/fixtures/memory_object.rb
49
+ spec/fixtures/mittelschnauzer.rb
50
+ spec/fixtures/motor_launch.rb
51
+ spec/fixtures/page.rb
52
+ spec/fixtures/phone_number.rb
53
+ spec/fixtures/pirogue.rb
54
+ spec/fixtures/programming_language.rb
55
+ spec/fixtures/reservation.rb
56
+ spec/fixtures/scm_operation.rb
57
+ spec/fixtures/sms_message.rb
58
+ spec/fixtures/udp_packet.rb
59
+ spec/integration/absent_field_validator/absent_field_validator_spec.rb
60
+ spec/integration/absent_field_validator/spec_helper.rb
61
+ spec/integration/acceptance_validator/acceptance_validator_spec.rb
62
+ spec/integration/acceptance_validator/spec_helper.rb
63
+ spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb
64
+ spec/integration/automatic_validation/disabling_inferred_validation_spec.rb
65
+ spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb
66
+ spec/integration/automatic_validation/inferred_float_property_validation_spec.rb
67
+ spec/integration/automatic_validation/inferred_format_validation_spec.rb
68
+ spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb
69
+ spec/integration/automatic_validation/inferred_length_validation_spec.rb
70
+ spec/integration/automatic_validation/inferred_presence_validation_spec.rb
71
+ spec/integration/automatic_validation/inferred_primitive_validation_spec.rb
72
+ spec/integration/automatic_validation/inferred_within_validation_spec.rb
73
+ spec/integration/automatic_validation/spec_helper.rb
74
+ spec/integration/block_validator/block_validator_spec.rb
75
+ spec/integration/block_validator/spec_helper.rb
76
+ spec/integration/conditional_validation/if_condition_spec.rb
77
+ spec/integration/conditional_validation/spec_helper.rb
78
+ spec/integration/confirmation_validator/confirmation_validator_spec.rb
79
+ spec/integration/confirmation_validator/spec_helper.rb
80
+ spec/integration/datamapper_models/association_validation_spec.rb
81
+ spec/integration/datamapper_models/inheritance_spec.rb
82
+ spec/integration/duplicated_validations/duplicated_validations_spec.rb
83
+ spec/integration/duplicated_validations/spec_helper.rb
84
+ spec/integration/format_validator/email_format_validator_spec.rb
85
+ spec/integration/format_validator/format_validator_spec.rb
86
+ spec/integration/format_validator/regexp_validator_spec.rb
87
+ spec/integration/format_validator/spec_helper.rb
88
+ spec/integration/format_validator/url_format_validator_spec.rb
89
+ spec/integration/length_validator/default_value_spec.rb
90
+ spec/integration/length_validator/equality_spec.rb
38
91
  spec/integration/length_validator/error_message_spec.rb
39
92
  spec/integration/length_validator/maximum_spec.rb
40
93
  spec/integration/length_validator/minimum_spec.rb
41
94
  spec/integration/length_validator/range_spec.rb
42
95
  spec/integration/length_validator/spec_helper.rb
43
- spec/integration/length_validator/valid_objects_spec.rb
44
- spec/integration/method_validator_spec.rb
96
+ spec/integration/method_validator/method_validator_spec.rb
97
+ spec/integration/method_validator/spec_helper.rb
98
+ spec/integration/numeric_validator/equality_with_float_type_spec.rb
99
+ spec/integration/numeric_validator/equality_with_integer_type_spec.rb
45
100
  spec/integration/numeric_validator/float_type_spec.rb
101
+ spec/integration/numeric_validator/gt_with_float_type_spec.rb
102
+ spec/integration/numeric_validator/gte_with_float_type_spec.rb
46
103
  spec/integration/numeric_validator/integer_only_true_spec.rb
47
104
  spec/integration/numeric_validator/integer_type_spec.rb
105
+ spec/integration/numeric_validator/lt_with_float_type_spec.rb
106
+ spec/integration/numeric_validator/lte_with_float_type_spec.rb
48
107
  spec/integration/numeric_validator/spec_helper.rb
49
- spec/integration/numeric_validator_spec.rb
50
- spec/integration/primitive_validator_spec.rb
108
+ spec/integration/primitive_validator/primitive_validator_spec.rb
109
+ spec/integration/primitive_validator/spec_helper.rb
110
+ spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb
51
111
  spec/integration/required_field_validator/association_spec.rb
52
112
  spec/integration/required_field_validator/boolean_type_value_spec.rb
53
113
  spec/integration/required_field_validator/date_type_value_spec.rb
@@ -59,11 +119,21 @@ spec/integration/required_field_validator/shared_examples.rb
59
119
  spec/integration/required_field_validator/spec_helper.rb
60
120
  spec/integration/required_field_validator/string_type_value_spec.rb
61
121
  spec/integration/required_field_validator/text_type_value_spec.rb
62
- spec/integration/uniqueness_validator_spec.rb
63
- spec/integration/validation_errors_spec.rb
64
- spec/integration/validation_spec.rb
65
- spec/integration/within_validator_spec.rb
122
+ spec/integration/shared/default_validation_context.rb
123
+ spec/integration/shared/valid_and_invalid_model.rb
124
+ spec/integration/uniqueness_validator/spec_helper.rb
125
+ spec/integration/uniqueness_validator/uniqueness_validator_spec.rb
126
+ spec/integration/within_validator/spec_helper.rb
127
+ spec/integration/within_validator/within_validator_spec.rb
128
+ spec/public/resource_spec.rb
66
129
  spec/spec.opts
67
130
  spec/spec_helper.rb
131
+ spec/unit/contextual_validators/emptiness_spec.rb
132
+ spec/unit/contextual_validators/execution_spec.rb
133
+ spec/unit/contextual_validators/spec_helper.rb
134
+ spec/unit/generic_validator/equality_operator_spec.rb
135
+ spec/unit/validation_errors/adding_spec.rb
136
+ spec/unit/validation_errors/emptiness_spec.rb
137
+ spec/unit/validation_errors/enumerable_spec.rb
68
138
  tasks/install.rb
69
139
  tasks/spec.rb
data/README.rdoc ADDED
@@ -0,0 +1,172 @@
1
+ This is a DataMapper plugin that provides validations for DataMapper model
2
+ classes.
3
+
4
+ == Setup
5
+ DataMapper validation capabilities are automatically available for DataMapper
6
+ resources when you require dm-validations' into your application. For
7
+ pure Ruby classes, require 'dm-validations' and then include DataMapper::Validate
8
+ module like so:
9
+
10
+ class ProgrammingLanguage
11
+ #
12
+ # Behaviors
13
+ #
14
+
15
+ include ::DataMapper::Validate
16
+
17
+ #
18
+ # Accessors
19
+ #
20
+
21
+ attr_accessor :name, :allows_manual_memory_management, :allows_optional_parentheses
22
+
23
+ #
24
+ # Validations
25
+ #
26
+
27
+ validates_present :name
28
+ validates_with_method :ensure_allows_optional_parentheses, :when => [:implementing_a_dsl]
29
+ validates_with_method :ensure_allows_manual_memory_management, :when => [:doing_system_programming]
30
+ end
31
+
32
+
33
+ == Specifying Model Validations
34
+ There are two primary ways to implement validations for your models:
35
+
36
+ 1) Placing validation methods with properties as params in your class
37
+ definitions like:
38
+ - validates_length :name
39
+ - validates_length [:name, :description]
40
+
41
+ 2) Using auto-validations, please see DataMapper::Validate::AutoValidate
42
+
43
+ An example class with validations declared:
44
+
45
+ require 'dm-validations'
46
+
47
+ class Account
48
+ include DataMapper::Resource
49
+
50
+ property :name, String
51
+ validates_length :name
52
+ end
53
+
54
+ See all of the DataMapper::Validate module's XYZValidator(s) to learn about the
55
+ complete collections of validators available to you.
56
+
57
+ == Validating
58
+ DataMapper validations, when included, alter the default save/create/update
59
+ process for a model. Unless you specify a context the resource must be
60
+ valid in the :default context before saving.
61
+
62
+ You may manually validate a resource using the valid? method, which will
63
+ return true if the resource is valid, and false if it is invalid.
64
+
65
+ In addition to the valid? method, there is also an all_valid? method that
66
+ recursively walks both the current object and its associated objects and returns
67
+ its true/false result for the entire walk.
68
+
69
+ == Working with Validation Errors
70
+ If your validators find errors in your model, they will populate the
71
+ DataMapper::Validate::ValidationErrors object that is available through each of
72
+ your models via calls to your model's errors method.
73
+
74
+ For example:
75
+
76
+ my_account = Account.new(:name => "Jose")
77
+ if my_account.save
78
+ # my_account is valid and has been saved
79
+ else
80
+ my_account.errors.each do |e|
81
+ puts e
82
+ end
83
+ end
84
+
85
+ See DataMapper::Validate::ValidationErrors for all you can do with your model's
86
+ errors method.
87
+
88
+ == Contextual Validations
89
+
90
+ DataMapper Validations also provide a means of grouping your validations into
91
+ contexts. This enables you to run different sets of validations when you
92
+ need it. For instance, the same model may not only behave differently
93
+ when initially saved or saved on update, but also require special validation sets
94
+ for publishing, exporting, importing and so on.
95
+
96
+ Again, using our example for pure Ruby class validations:
97
+
98
+ class ProgrammingLanguage
99
+ #
100
+ # Behaviors
101
+ #
102
+
103
+ include ::DataMapper::Validate
104
+
105
+ #
106
+ # Accessors
107
+ #
108
+
109
+ attr_accessor :name, :allows_manual_memory_management, :allows_optional_parentheses
110
+
111
+ #
112
+ # Validations
113
+ #
114
+
115
+ validates_present :name
116
+ validates_with_method :ensure_allows_optional_parentheses, :when => [:implementing_a_dsl]
117
+ validates_with_method :ensure_allows_manual_memory_management, :when => [:doing_system_programming]
118
+ end
119
+
120
+ ProgrammingLanguage instance now use #valid? method with one of two context symbols:
121
+
122
+ @ruby.valid?(:implementing_a_dsl) # => true
123
+ @ruby.valid?(:doing_system_programming) # => false
124
+
125
+ @c.valid?(:implementing_a_dsl) # => false
126
+ @c.valid?(:doing_system_programming) # => true
127
+
128
+ Each context causes different set of validations to be triggered. If you don't
129
+ specify a context using :when, :on or :group options (they are all aliases and do
130
+ the same thing), default context name is :default. When you do model.valid? (without
131
+ specifying context explicitly), again, :default context is used. One validation
132
+ can be used in two, three or five contexts if you like:
133
+
134
+ class Book
135
+
136
+ #
137
+ # Behaviors
138
+ #
139
+
140
+ # this time it is a DM model
141
+ include ::DataMapper::Resource
142
+
143
+ #
144
+ # Accessors
145
+ #
146
+
147
+ property :id, Serial
148
+ property :name, String
149
+
150
+ property :agreed_title, String
151
+ property :finished_toc, Boolean
152
+
153
+ #
154
+ # Validations
155
+ #
156
+
157
+ # used in all contexts, including default
158
+ validates_present :name, :when => [:default, :sending_to_print]
159
+ validates_present :agreed_title, :when => [:sending_to_print]
160
+
161
+ validates_with_block :toc, :when => [:sending_to_print] do
162
+ if self.finished_toc
163
+ [true]
164
+ else
165
+ [false, "TOC must be finalized before you send a book to print"]
166
+ end
167
+ end
168
+ end
169
+
170
+ In the example above, name is validated for presence in both :default context and
171
+ :sending_to_print context, while TOC related block validation and title presence validation
172
+ only take place in :sending_to_print context.
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'pathname'
2
- require 'rubygems'
3
2
 
4
3
  ROOT = Pathname(__FILE__).dirname.expand_path
5
4
  JRUBY = RUBY_PLATFORM =~ /java/
@@ -8,17 +7,17 @@ SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
8
7
 
9
8
  require ROOT + 'lib/dm-validations/version'
10
9
 
11
- AUTHOR = 'Guy van den Berg'
10
+ AUTHOR = 'Guy van den Berg, DataMapper development team'
12
11
  EMAIL = 'vandenberg.guy [a] gmail [d] com'
13
12
  GEM_NAME = 'dm-validations'
14
13
  GEM_VERSION = DataMapper::Validations::VERSION
15
14
  GEM_DEPENDENCIES = [['dm-core', GEM_VERSION]]
16
15
  GEM_CLEAN = %w[ log pkg coverage ]
17
- GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.txt LICENSE TODO History.txt ] }
16
+ GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.rdoc LICENSE TODO History.rdoc ] }
18
17
 
19
18
  PROJECT_NAME = 'datamapper'
20
- PROJECT_URL = "http://github.com/sam/dm-more/tree/master/#{GEM_NAME}"
21
- PROJECT_DESCRIPTION = PROJECT_SUMMARY = 'DataMapper plugin for performing validations on data models'
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'
22
21
 
23
22
  [ ROOT, ROOT.parent ].each do |dir|
24
23
  Pathname.glob(dir.join('tasks/**/*.rb').to_s).each { |f| require f }
@@ -1,75 +1,71 @@
1
- require 'rubygems'
2
- require 'pathname'
3
-
4
- gem 'dm-core', '0.9.11'
5
- require 'dm-core'
6
-
7
- dir = Pathname(__FILE__).dirname.expand_path / 'dm-validations'
8
-
9
- require dir / 'validation_errors'
10
- require dir / 'contextual_validators'
11
- require dir / 'auto_validate'
12
-
13
- require dir / 'generic_validator'
14
- require dir / 'required_field_validator'
15
- require dir / 'primitive_validator'
16
- require dir / 'absent_field_validator'
17
- require dir / 'confirmation_validator'
18
- require dir / 'format_validator'
19
- require dir / 'length_validator'
20
- require dir / 'within_validator'
21
- require dir / 'numeric_validator'
22
- require dir / 'method_validator'
23
- require dir / 'block_validator'
24
- require dir / 'uniqueness_validator'
25
- require dir / 'acceptance_validator'
26
- require dir / 'custom_validator'
27
-
28
- require dir / 'support' / 'object'
1
+ require 'dm-validations/exceptions'
2
+ require 'dm-validations/validation_errors'
3
+ require 'dm-validations/contextual_validators'
4
+ require 'dm-validations/auto_validate'
5
+
6
+ require 'dm-validations/validators/generic_validator'
7
+ require 'dm-validations/validators/required_field_validator'
8
+ require 'dm-validations/validators/primitive_validator'
9
+ require 'dm-validations/validators/absent_field_validator'
10
+ require 'dm-validations/validators/confirmation_validator'
11
+ require 'dm-validations/validators/format_validator'
12
+ require 'dm-validations/validators/length_validator'
13
+ require 'dm-validations/validators/within_validator'
14
+ require 'dm-validations/validators/numeric_validator'
15
+ require 'dm-validations/validators/method_validator'
16
+ require 'dm-validations/validators/block_validator'
17
+ require 'dm-validations/validators/uniqueness_validator'
18
+ require 'dm-validations/validators/acceptance_validator'
19
+
20
+ require 'dm-validations/support/context'
21
+ require 'dm-validations/support/object'
29
22
 
30
23
  module DataMapper
31
24
  module Validate
25
+ Model.append_inclusions self
26
+
27
+ extend Chainable
32
28
 
33
29
  def self.included(model)
34
- model.class_eval <<-EOS, __FILE__, __LINE__
35
- if method_defined?(:save)
36
- before :save, :check_validations
30
+ model.class_eval <<-RUBY, __FILE__, __LINE__ + 1
31
+ def self.create(attributes = {}, *args)
32
+ resource = new(attributes)
33
+ resource.save(*args)
34
+ resource
37
35
  end
36
+ RUBY
38
37
 
39
- class << self
40
- def create(attributes = {}, context = :default)
41
- resource = new(attributes)
42
- return resource unless resource.valid?(context)
43
- resource.save!
44
- resource
45
- end
46
-
47
- def create!(attributes = {})
48
- resource = new(attributes)
49
- resource.save!
50
- resource
51
- end
52
- end
53
- EOS
38
+ # models that are non DM resources must get .validators
39
+ # and other methods, too
40
+ model.extend ClassMethods
54
41
  end
55
42
 
56
43
  # Ensures the object is valid for the context provided, and otherwise
57
44
  # throws :halt and returns false.
58
45
  #
59
- def check_validations(context = :default)
60
- throw(:halt, false) unless context.nil? || valid?(context)
46
+ chainable do
47
+ def save(context = default_validation_context)
48
+ validation_context(context) { super() }
49
+ end
61
50
  end
62
51
 
63
- # Calls save with a context of nil, thus skipping validations.
64
- #
65
- def save!
66
- save(nil)
52
+ chainable do
53
+ def save_self(*)
54
+ return false unless validation_context_stack.empty? || valid?(current_validation_context)
55
+ super
56
+ end
57
+ end
58
+
59
+ chainable do
60
+ def update(attributes = {}, context = default_validation_context)
61
+ validation_context(context) { super(attributes) }
62
+ end
67
63
  end
68
64
 
69
65
  # Return the ValidationErrors
70
66
  #
71
67
  def errors
72
- @errors ||= ValidationErrors.new
68
+ @errors ||= ValidationErrors.new(self)
73
69
  end
74
70
 
75
71
  # Mark this resource as validatable. When we validate associations of a
@@ -89,7 +85,8 @@ module DataMapper
89
85
  # Check if a resource is valid in a given context
90
86
  #
91
87
  def valid?(context = :default)
92
- self.class.validators.execute(context, self)
88
+ klass = respond_to?(:model) ? model : self.class
89
+ klass.validators.execute(context, self)
93
90
  end
94
91
 
95
92
  # Begin a recursive walk of the model checking validity
@@ -117,9 +114,8 @@ module DataMapper
117
114
  return valid && target.valid?
118
115
  end
119
116
 
120
-
121
117
  def validation_property_value(name)
122
- self.respond_to?(name, true) ? self.send(name) : nil
118
+ respond_to?(name, true) ? send(name) : nil
123
119
  end
124
120
 
125
121
  # Get the corresponding Resource property, if it exists.
@@ -127,7 +123,7 @@ module DataMapper
127
123
  # Note: DataMapper validations can be used on non-DataMapper resources.
128
124
  # In such cases, the return value will be nil.
129
125
  def validation_property(field_name)
130
- if respond_to?(:model) && (properties = model.properties(self.repository.name)) && properties.has_property?(field_name)
126
+ if respond_to?(:model) && (properties = model.properties(repository.name)) && properties.named?(field_name)
131
127
  properties[field_name]
132
128
  end
133
129
  end
@@ -171,13 +167,9 @@ module DataMapper
171
167
  #
172
168
  def opts_from_validator_args(args, defaults = nil)
173
169
  opts = args.last.kind_of?(Hash) ? args.pop : {}
174
- context = :default
175
- context = opts[:context] if opts.has_key?(:context)
176
- context = opts.delete(:on) if opts.has_key?(:on)
177
- context = opts.delete(:when) if opts.has_key?(:when)
178
- context = opts.delete(:group) if opts.has_key?(:group)
170
+ context = opts.delete(:group) || opts.delete(:on) || opts.delete(:when) || opts.delete(:context) || :default
179
171
  opts[:context] = context
180
- opts.mergs!(defaults) unless defaults.nil?
172
+ opts.merge!(defaults) unless defaults.nil?
181
173
  opts
182
174
  end
183
175
 
@@ -187,30 +179,39 @@ module DataMapper
187
179
  #
188
180
  def create_context_instance_methods(context)
189
181
  name = "valid_for_#{context.to_s}?" # valid_for_signup?
190
- if !self.instance_methods.include?(name)
191
- class_eval <<-EOS, __FILE__, __LINE__
182
+ if !instance_methods.include?(name)
183
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
192
184
  def #{name} # def valid_for_signup?
193
- valid?('#{context.to_s}'.to_sym) # valid?('signup'.to_sym)
185
+ valid?(#{context.to_sym.inspect}) # valid?(:signup)
194
186
  end # end
195
- EOS
187
+ RUBY
196
188
  end
197
189
 
198
190
  all = "all_valid_for_#{context.to_s}?" # all_valid_for_signup?
199
- if !self.instance_methods.include?(all)
200
- class_eval <<-EOS, __FILE__, __LINE__
191
+ if !instance_methods.include?(all)
192
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
201
193
  def #{all} # def all_valid_for_signup?
202
- all_valid?('#{context.to_s}'.to_sym) # all_valid?('signup'.to_sym)
194
+ all_valid?(#{context.to_sym.inspect}) # all_valid?(:signup)
203
195
  end # end
204
- EOS
196
+ RUBY
205
197
  end
206
198
  end
207
199
 
208
200
  # Create a new validator of the given klazz and push it onto the
209
201
  # requested context for each of the attributes in the fields list
202
+ # @param [Hash] opts
203
+ # Options supplied to validation macro, example:
204
+ # {:context=>:default, :maximum=>50, :allow_nil=>true, :message=>nil}
205
+ #
206
+ # @param [Array<Symbol>] fields
207
+ # Fields given to validation macro, example:
208
+ # [:first_name, :last_name] in validates_present :first_name, :last_name
210
209
  #
210
+ # @param [Class] klazz
211
+ # Validator class, example: DataMapper::Validate::LengthValidator
211
212
  def add_validator_to_context(opts, fields, klazz)
212
213
  fields.each do |field|
213
- validator = klazz.new(field, opts)
214
+ validator = klazz.new(field, opts.dup)
214
215
  if opts[:context].is_a?(Symbol)
215
216
  unless validators.context(opts[:context]).include?(validator)
216
217
  validators.context(opts[:context]) << validator
@@ -228,7 +229,4 @@ module DataMapper
228
229
  end
229
230
  end # module ClassMethods
230
231
  end # module Validate
231
-
232
- Resource.append_inclusions Validate
233
- Model.append_extensions Validate::ClassMethods
234
232
  end # module DataMapper