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,5 @@
1
+ module DataMapper
2
+ module Validations
3
+ VERSION = "1.2.0"
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ module DataMapper
2
+ module Validations
3
+ module Fixtures
4
+ class Barcode
5
+ attr_accessor :valid_hook_call_count
6
+
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ without_auto_validations do
18
+ property :code, String, :key => true
19
+ end
20
+
21
+ #
22
+ # Validations
23
+ #
24
+
25
+ validates_length_of :code, :max => 10
26
+
27
+ def self.valid_instance
28
+ new(:code => "3600029145")
29
+ end
30
+
31
+ # measure the number of times #valid? is executed
32
+ before :valid? do
33
+ @valid_hook_call_count ||= 0
34
+ @valid_hook_call_count += 1
35
+ end
36
+
37
+ end # Barcode
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validations
5
+ module Fixtures
6
+ class BasketballCourt
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+
19
+ without_auto_validations do
20
+ property :name, String
21
+
22
+ property :length, Float
23
+ property :width, Float
24
+
25
+ property :three_point_line_distance, Float
26
+ property :free_throw_line_distance, Float
27
+ property :rim_height, Float
28
+ end
29
+
30
+ #
31
+ # Validations
32
+ #
33
+
34
+ # obviously these are all metrics
35
+ validates_numericality_of :length, :gte => 15.0, :lte => 15.24
36
+ validates_numericality_of :width, :gte => 25.28, :lte => 28.65
37
+
38
+ # 3 pt line distance may use :gte and :lte, but for
39
+ # sake of spec example we make it up a little
40
+ validates_numericality_of :three_point_line_distance, :gt => 6.7, :lt => 7.24
41
+ validates_numericality_of :free_throw_line_distance, :equals => 4.57
42
+ validates_numericality_of :rim_height, :eq => 3.05
43
+
44
+ def self.valid_instance(overrides = {})
45
+ defaults = {
46
+ :length => 15.24,
47
+ :width => 28.65,
48
+ :free_throw_line_distance => 4.57,
49
+ :rim_height => 3.05,
50
+ :three_point_line_distance => 6.9
51
+ }
52
+
53
+ new(defaults.merge(overrides))
54
+ end
55
+ end
56
+ end # Fixtures
57
+ end # Validations
58
+ end # DataMapper
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validations
5
+ module Fixtures
6
+ class BasketballPlayer
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+
19
+ without_auto_validations do
20
+ property :name, String
21
+ property :height, Float
22
+ property :weight, Float
23
+ end
24
+
25
+ #
26
+ # Validations
27
+ #
28
+
29
+ # precision and scale need to be defined for length to be validated
30
+ validates_numericality_of :height, :weight, :precision => 10
31
+ end
32
+ end # Fixtures
33
+ end # Validations
34
+ end # DataMapper
@@ -0,0 +1,33 @@
1
+ module DataMapper
2
+ module Validations
3
+ module Fixtures
4
+ class BetaTesterAccount
5
+ #
6
+ # Behaviors
7
+ #
8
+
9
+ include ::DataMapper::Resource
10
+
11
+ #
12
+ # Properties
13
+ #
14
+
15
+ property :id, Serial
16
+ property :full_name, String, :auto_validation => false
17
+ property :email, String, :auto_validation => false
18
+
19
+ property :user_agreement, Boolean, :auto_validation => false
20
+ property :newsletter_signup, String, :auto_validation => false
21
+ property :privacy_agreement, String, :auto_validation => false
22
+
23
+ #
24
+ # Validations
25
+ #
26
+
27
+ validates_acceptance_of :user_agreement, :allow_nil => false
28
+ validates_acceptance_of :newsletter_signup
29
+ validates_acceptance_of :privacy_agreement, :accept => %w(agreed accept), :message => "You must accept this agreement in order to proceed"
30
+ end # BetaTesterAccount
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,47 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validations
5
+ module Fixtures
6
+ class BillOfLading
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+
19
+ property :doc_no, String, :auto_validation => false
20
+ property :email, String, :auto_validation => false
21
+ property :username, String, :auto_validation => false
22
+ property :url, String, :auto_validation => false
23
+ property :bank_url, URI, :auto_validation => false
24
+ property :code, String, :auto_validation => false, :default => "123456"
25
+
26
+ #
27
+ # Validations
28
+ #
29
+
30
+ # this is a trivial example
31
+ validates_format_of :doc_no, :with => lambda { |code|
32
+ code =~ /\AA\d{4}\z/ || code =~ /\A[B-Z]\d{6}X12\z/
33
+ }
34
+
35
+ validates_format_of :email, :as => :email_address
36
+ validates_format_of :url, :as => :url, :allow_nil => false, :allow_blank => false
37
+
38
+ validates_format_of :username, :with => /[a-z]/, :message => 'Username must have at least one letter', :allow_nil => true
39
+ validates_format_of :code, :with => /\d{5,6}/, :message => 'Code format is invalid'
40
+ end
41
+
42
+ class SurrenderBillOfLading < BillOfLading
43
+ validates_format_of :bank_url, :as => :url, :allow_nil => false, :allow_blank => false
44
+ end
45
+ end # Fixtures
46
+ end # Validations
47
+ end # DataMapper
@@ -0,0 +1,26 @@
1
+ module DataMapper
2
+ module Validations
3
+ module Fixtures
4
+ class BoatDock
5
+ #
6
+ # Behaviors
7
+ #
8
+
9
+ include DataMapper::Resource
10
+
11
+ #
12
+ # Properties
13
+ #
14
+
15
+ property :id, Serial
16
+ property :name, String, :auto_validation => false, :default => "I'm a long string"
17
+
18
+ #
19
+ # Validations
20
+ #
21
+
22
+ validates_length_of :name, :min => 3
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class City
4
+ #
5
+ # Behaviors
6
+ #
7
+
8
+ include DataMapper::Resource
9
+
10
+ #
11
+ # Properties
12
+ #
13
+
14
+ property :id, Serial
15
+ property :name, String
16
+
17
+ property :founded_in, Integer, :auto_validation => false
18
+
19
+ #
20
+ # Validations
21
+ #
22
+
23
+ validates_numericality_of :founded_in, :message => "Foundation year must be an integer"
24
+ end
@@ -0,0 +1,93 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validations
5
+ module Fixtures
6
+ class Company
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+ property :title, String
19
+ property :type, Discriminator
20
+
21
+
22
+ #
23
+ # Validations
24
+ #
25
+
26
+ validates_presence_of :title, :message => "Company name is a required field"
27
+
28
+ end
29
+
30
+ class ServiceCompany < Company
31
+
32
+ #
33
+ # Properties
34
+ #
35
+
36
+ without_auto_validations do
37
+ property :area_of_expertise, String, :length => (1..60)
38
+ end
39
+
40
+ #
41
+ # Validations
42
+ #
43
+
44
+ validates_presence_of :area_of_expertise
45
+ end
46
+
47
+ class ProductCompany < Company
48
+
49
+ #
50
+ # Properties
51
+ #
52
+
53
+ without_auto_validations do
54
+ property :flagship_product, String, :length => (1..60)
55
+ end
56
+
57
+ #
58
+ # Validations
59
+ #
60
+
61
+ validates_presence_of :title, :message => "Product company must have a name"
62
+ validates_presence_of :flagship_product
63
+ end
64
+
65
+ class Product
66
+ #
67
+ # Behaviors
68
+ #
69
+
70
+ include DataMapper::Resource
71
+
72
+ #
73
+ # Properties
74
+ #
75
+
76
+ property :id, Serial
77
+ property :name, String, :required => true
78
+
79
+ #
80
+ # Associations
81
+ #
82
+
83
+ belongs_to :company, :model => DataMapper::Validations::Fixtures::ProductCompany
84
+
85
+ #
86
+ # Validations
87
+ #
88
+
89
+ validates_presence_of :company
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validations
5
+ module Fixtures
6
+ class Organisation
7
+ include DataMapper::Resource
8
+
9
+ property :id, Serial
10
+ property :name, String
11
+ property :domain, String, :unique_index => true
12
+
13
+ validates_uniqueness_of :domain, :allow_nil => true
14
+ end
15
+
16
+ class Department
17
+ include DataMapper::Resource
18
+
19
+ property :id, Serial
20
+ property :name, String, :unique_index => true
21
+
22
+ validates_uniqueness_of :name
23
+ end
24
+
25
+ class User
26
+ include DataMapper::Resource
27
+
28
+ property :id, Serial
29
+ property :user_name, String
30
+
31
+ belongs_to :organisation
32
+ belongs_to :department
33
+
34
+ validates_uniqueness_of :user_name, :when => :signing_up_for_department_account, :scope => [:department]
35
+ validates_uniqueness_of :user_name, :when => :signing_up_for_organization_account, :scope => [:organisation]
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Country
4
+ #
5
+ # Behaviors
6
+ #
7
+
8
+ include DataMapper::Resource
9
+
10
+ #
11
+ # Properties
12
+ #
13
+
14
+ property :id, Serial
15
+ property :name, String
16
+
17
+ property :area, Integer
18
+
19
+ #
20
+ # Validations
21
+ #
22
+
23
+ validates_numericality_of :area, :message => "Please use integers to specify area"
24
+ end
@@ -0,0 +1,56 @@
1
+ module DataMapper
2
+ module Validations
3
+ module Fixtures
4
+
5
+ # for pedants: we refer to DIX Ethernet here
6
+ class EthernetFrame
7
+
8
+ #
9
+ # Behaviors
10
+ #
11
+
12
+ include DataMapper::Resource
13
+
14
+ #
15
+ # Properties
16
+ #
17
+
18
+ attr_accessor :link_support_fragmentation
19
+
20
+ # we have to have a key in a DM resource
21
+ property :id, Serial
22
+
23
+ without_auto_validations do
24
+ property :destination_mac, String
25
+ property :source_mac, String
26
+ property :ether_type, String
27
+ property :payload, Text
28
+ property :crc, String
29
+ end
30
+
31
+ #
32
+ # Validations
33
+ #
34
+
35
+ validates_length_of :destination_mac, :source_mac, :equals => 6
36
+ validates_length_of :ether_type, :equals => 2
37
+ validates_length_of :payload, :min => 46, :max => 1500, :unless => :link_support_fragmentation
38
+ # :is is alias for :equal
39
+ validates_length_of :crc, :is => 4
40
+
41
+ def self.valid_instance
42
+ # these are obvisouly not bits, and not in hexadecimal
43
+ # format either, but give fixture models some slack
44
+ attributes = {
45
+ :destination_mac => "7b7d93",
46
+ :source_mac => "abe763",
47
+ :ether_type => "88",
48
+ :payload => "Imagine yourself a beautiful bag full of bits here",
49
+ :crc => "4132"
50
+ }
51
+ new(attributes)
52
+ end
53
+ end # EthernetFrame
54
+ end
55
+ end
56
+ end