dm-validations 0.9.11 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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