aequitas 0.0.1

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 (216) hide show
  1. data/.gitignore +4 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE +21 -0
  5. data/README.rdoc +125 -0
  6. data/Rakefile +25 -0
  7. data/VERSION +1 -0
  8. data/aequitas.gemspec +20 -0
  9. data/lib/aequitas.rb +80 -0
  10. data/lib/aequitas/class_methods.rb +26 -0
  11. data/lib/aequitas/context.rb +53 -0
  12. data/lib/aequitas/contextual_rule_set.rb +221 -0
  13. data/lib/aequitas/exceptions.rb +10 -0
  14. data/lib/aequitas/macros.rb +466 -0
  15. data/lib/aequitas/message_transformer.rb +127 -0
  16. data/lib/aequitas/rule.rb +153 -0
  17. data/lib/aequitas/rule/absence.rb +14 -0
  18. data/lib/aequitas/rule/absence/blank.rb +21 -0
  19. data/lib/aequitas/rule/absence/nil.rb +21 -0
  20. data/lib/aequitas/rule/acceptance.rb +36 -0
  21. data/lib/aequitas/rule/block.rb +33 -0
  22. data/lib/aequitas/rule/confirmation.rb +41 -0
  23. data/lib/aequitas/rule/format.rb +81 -0
  24. data/lib/aequitas/rule/format/proc.rb +28 -0
  25. data/lib/aequitas/rule/format/regexp.rb +44 -0
  26. data/lib/aequitas/rule/formats/email.rb +52 -0
  27. data/lib/aequitas/rule/formats/url.rb +14 -0
  28. data/lib/aequitas/rule/guard.rb +51 -0
  29. data/lib/aequitas/rule/length.rb +87 -0
  30. data/lib/aequitas/rule/length/equal.rb +46 -0
  31. data/lib/aequitas/rule/length/maximum.rb +46 -0
  32. data/lib/aequitas/rule/length/minimum.rb +46 -0
  33. data/lib/aequitas/rule/length/range.rb +46 -0
  34. data/lib/aequitas/rule/method.rb +31 -0
  35. data/lib/aequitas/rule/numericalness.rb +85 -0
  36. data/lib/aequitas/rule/numericalness/equal.rb +30 -0
  37. data/lib/aequitas/rule/numericalness/greater_than.rb +30 -0
  38. data/lib/aequitas/rule/numericalness/greater_than_or_equal.rb +30 -0
  39. data/lib/aequitas/rule/numericalness/integer.rb +37 -0
  40. data/lib/aequitas/rule/numericalness/less_than.rb +30 -0
  41. data/lib/aequitas/rule/numericalness/less_than_or_equal.rb +30 -0
  42. data/lib/aequitas/rule/numericalness/non_integer.rb +64 -0
  43. data/lib/aequitas/rule/numericalness/not_equal.rb +30 -0
  44. data/lib/aequitas/rule/presence.rb +14 -0
  45. data/lib/aequitas/rule/presence/not_blank.rb +21 -0
  46. data/lib/aequitas/rule/presence/not_nil.rb +21 -0
  47. data/lib/aequitas/rule/primitive_type.rb +28 -0
  48. data/lib/aequitas/rule/skip_condition.rb +104 -0
  49. data/lib/aequitas/rule/within.rb +28 -0
  50. data/lib/aequitas/rule/within/range.rb +53 -0
  51. data/lib/aequitas/rule/within/range/bounded.rb +25 -0
  52. data/lib/aequitas/rule/within/range/unbounded_begin.rb +25 -0
  53. data/lib/aequitas/rule/within/range/unbounded_end.rb +25 -0
  54. data/lib/aequitas/rule/within/set.rb +39 -0
  55. data/lib/aequitas/rule_set.rb +80 -0
  56. data/lib/aequitas/support/blank.rb +22 -0
  57. data/lib/aequitas/support/equalizable.rb +113 -0
  58. data/lib/aequitas/support/ordered_hash.rb +438 -0
  59. data/lib/aequitas/version.rb +5 -0
  60. data/lib/aequitas/violation.rb +116 -0
  61. data/lib/aequitas/violation_set.rb +123 -0
  62. data/lib/aequitas/virtus.rb +29 -0
  63. data/lib/aequitas/virtus/inline_attribute_rule_extractor.rb +41 -0
  64. data/lib/aequitas/virtus/inline_attribute_rule_extractor/boolean.rb +17 -0
  65. data/lib/aequitas/virtus/inline_attribute_rule_extractor/object.rb +25 -0
  66. data/lib/aequitas/virtus/inline_attribute_rule_extractor/string.rb +27 -0
  67. data/spec/integration/aequitas/macros/validates_absence_of_spec.rb +19 -0
  68. data/spec/integration/aequitas/macros/validates_acceptance_of_spec.rb +19 -0
  69. data/spec/integration/aequitas/macros/validates_confirmation_of_spec.rb +25 -0
  70. data/spec/integration/aequitas/macros/validates_format_of_spec.rb +87 -0
  71. data/spec/integration/aequitas/macros/validates_length_of.rb +77 -0
  72. data/spec/integration/aequitas/macros/validates_numericalness_of_spec.rb +221 -0
  73. data/spec/integration/aequitas/macros/validates_presence_of_spec.rb +19 -0
  74. data/spec/integration/aequitas/macros/validates_with_block.rb +23 -0
  75. data/spec/integration/aequitas/macros/validates_with_method.rb +19 -0
  76. data/spec/integration/aequitas/macros/validates_within.rb +87 -0
  77. data/spec/integration/shared/macros/integration_spec.rb +67 -0
  78. data/spec/integration/virtus/boolean/presence_spec.rb +49 -0
  79. data/spec/integration/virtus/string/format/email_address_spec.rb +55 -0
  80. data/spec/integration/virtus/string/format/regexp_spec.rb +55 -0
  81. data/spec/integration/virtus/string/format/url_spec.rb +55 -0
  82. data/spec/integration/virtus/string/length/equal_spec.rb +49 -0
  83. data/spec/integration/virtus/string/length/range_spec.rb +49 -0
  84. data/spec/integration/virtus/string/presence_spec.rb +49 -0
  85. data/spec/rcov.opts +6 -0
  86. data/spec/spec_helper.rb +5 -0
  87. data/spec/suite.rb +5 -0
  88. data/spec/unit/aequitas/rule/absence/blank_spec.rb +45 -0
  89. data/spec/unit/aequitas/rule/acceptance_spec.rb +71 -0
  90. data/spec/unit/aequitas/rule/confirmation_spec.rb +80 -0
  91. data/spec/unit/aequitas/rule/guard_spec.rb +120 -0
  92. data/spec/unit/aequitas/rule/skip_condition_spec.rb +170 -0
  93. data/spec/unit/aequitas/rule_spec.rb +40 -0
  94. data/spec/unit/aequitas/support/blank_spec.rb +83 -0
  95. data/spec/unit/aequitas/support/equalizable/equalizer_spec.rb +21 -0
  96. data/spec/unit/aequitas/support/equalizable_spec.rb +67 -0
  97. data/spec/unit/aequitas/violation_set_spec.rb +154 -0
  98. data/spec_legacy/fixtures/barcode.rb +40 -0
  99. data/spec_legacy/fixtures/basketball_court.rb +58 -0
  100. data/spec_legacy/fixtures/basketball_player.rb +34 -0
  101. data/spec_legacy/fixtures/beta_tester_account.rb +33 -0
  102. data/spec_legacy/fixtures/bill_of_landing.rb +47 -0
  103. data/spec_legacy/fixtures/boat_dock.rb +26 -0
  104. data/spec_legacy/fixtures/city.rb +24 -0
  105. data/spec_legacy/fixtures/company.rb +93 -0
  106. data/spec_legacy/fixtures/corporate_world.rb +39 -0
  107. data/spec_legacy/fixtures/country.rb +24 -0
  108. data/spec_legacy/fixtures/ethernet_frame.rb +56 -0
  109. data/spec_legacy/fixtures/event.rb +44 -0
  110. data/spec_legacy/fixtures/g3_concert.rb +57 -0
  111. data/spec_legacy/fixtures/jabberwock.rb +27 -0
  112. data/spec_legacy/fixtures/kayak.rb +28 -0
  113. data/spec_legacy/fixtures/lernean_hydra.rb +39 -0
  114. data/spec_legacy/fixtures/llama_spaceship.rb +15 -0
  115. data/spec_legacy/fixtures/mathematical_function.rb +34 -0
  116. data/spec_legacy/fixtures/memory_object.rb +30 -0
  117. data/spec_legacy/fixtures/mittelschnauzer.rb +39 -0
  118. data/spec_legacy/fixtures/motor_launch.rb +21 -0
  119. data/spec_legacy/fixtures/multibyte.rb +16 -0
  120. data/spec_legacy/fixtures/page.rb +32 -0
  121. data/spec_legacy/fixtures/phone_number.rb +28 -0
  122. data/spec_legacy/fixtures/pirogue.rb +28 -0
  123. data/spec_legacy/fixtures/programming_language.rb +83 -0
  124. data/spec_legacy/fixtures/reservation.rb +38 -0
  125. data/spec_legacy/fixtures/scm_operation.rb +56 -0
  126. data/spec_legacy/fixtures/sms_message.rb +22 -0
  127. data/spec_legacy/fixtures/udp_packet.rb +49 -0
  128. data/spec_legacy/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  129. data/spec_legacy/integration/absent_field_validator/spec_helper.rb +7 -0
  130. data/spec_legacy/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  131. data/spec_legacy/integration/acceptance_validator/spec_helper.rb +7 -0
  132. data/spec_legacy/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  133. data/spec_legacy/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  134. data/spec_legacy/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  135. data/spec_legacy/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  136. data/spec_legacy/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  137. data/spec_legacy/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  138. data/spec_legacy/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  139. data/spec_legacy/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  140. data/spec_legacy/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  141. data/spec_legacy/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +48 -0
  142. data/spec_legacy/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
  143. data/spec_legacy/integration/automatic_validation/spec_helper.rb +57 -0
  144. data/spec_legacy/integration/block_validator/block_validator_spec.rb +32 -0
  145. data/spec_legacy/integration/block_validator/spec_helper.rb +5 -0
  146. data/spec_legacy/integration/conditional_validation/if_condition_spec.rb +63 -0
  147. data/spec_legacy/integration/conditional_validation/spec_helper.rb +5 -0
  148. data/spec_legacy/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  149. data/spec_legacy/integration/confirmation_validator/spec_helper.rb +5 -0
  150. data/spec_legacy/integration/datamapper_models/association_validation_spec.rb +29 -0
  151. data/spec_legacy/integration/datamapper_models/inheritance_spec.rb +82 -0
  152. data/spec_legacy/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  153. data/spec_legacy/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  154. data/spec_legacy/integration/duplicated_validations/spec_helper.rb +5 -0
  155. data/spec_legacy/integration/format_validator/email_format_validator_spec.rb +139 -0
  156. data/spec_legacy/integration/format_validator/format_validator_spec.rb +64 -0
  157. data/spec_legacy/integration/format_validator/regexp_validator_spec.rb +33 -0
  158. data/spec_legacy/integration/format_validator/spec_helper.rb +5 -0
  159. data/spec_legacy/integration/format_validator/url_format_validator_spec.rb +93 -0
  160. data/spec_legacy/integration/length_validator/default_value_spec.rb +14 -0
  161. data/spec_legacy/integration/length_validator/equality_spec.rb +87 -0
  162. data/spec_legacy/integration/length_validator/error_message_spec.rb +22 -0
  163. data/spec_legacy/integration/length_validator/maximum_spec.rb +49 -0
  164. data/spec_legacy/integration/length_validator/minimum_spec.rb +54 -0
  165. data/spec_legacy/integration/length_validator/range_spec.rb +87 -0
  166. data/spec_legacy/integration/length_validator/spec_helper.rb +7 -0
  167. data/spec_legacy/integration/method_validator/method_validator_spec.rb +242 -0
  168. data/spec_legacy/integration/method_validator/spec_helper.rb +5 -0
  169. data/spec_legacy/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  170. data/spec_legacy/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  171. data/spec_legacy/integration/numeric_validator/float_type_spec.rb +90 -0
  172. data/spec_legacy/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  173. data/spec_legacy/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  174. data/spec_legacy/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  175. data/spec_legacy/integration/numeric_validator/integer_type_spec.rb +86 -0
  176. data/spec_legacy/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  177. data/spec_legacy/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  178. data/spec_legacy/integration/numeric_validator/spec_helper.rb +5 -0
  179. data/spec_legacy/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  180. data/spec_legacy/integration/primitive_validator/spec_helper.rb +5 -0
  181. data/spec_legacy/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  182. data/spec_legacy/integration/required_field_validator/association_spec.rb +69 -0
  183. data/spec_legacy/integration/required_field_validator/boolean_type_value_spec.rb +164 -0
  184. data/spec_legacy/integration/required_field_validator/date_type_value_spec.rb +127 -0
  185. data/spec_legacy/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  186. data/spec_legacy/integration/required_field_validator/float_type_value_spec.rb +131 -0
  187. data/spec_legacy/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  188. data/spec_legacy/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  189. data/spec_legacy/integration/required_field_validator/shared_examples.rb +26 -0
  190. data/spec_legacy/integration/required_field_validator/spec_helper.rb +7 -0
  191. data/spec_legacy/integration/required_field_validator/string_type_value_spec.rb +167 -0
  192. data/spec_legacy/integration/required_field_validator/text_type_value_spec.rb +49 -0
  193. data/spec_legacy/integration/shared/default_validation_context.rb +13 -0
  194. data/spec_legacy/integration/shared/valid_and_invalid_model.rb +35 -0
  195. data/spec_legacy/integration/uniqueness_validator/spec_helper.rb +5 -0
  196. data/spec_legacy/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  197. data/spec_legacy/integration/within_validator/spec_helper.rb +5 -0
  198. data/spec_legacy/integration/within_validator/within_validator_spec.rb +168 -0
  199. data/spec_legacy/public/resource_spec.rb +105 -0
  200. data/spec_legacy/spec.opts +4 -0
  201. data/spec_legacy/spec_helper.rb +29 -0
  202. data/spec_legacy/unit/contextual_validators/emptiness_spec.rb +50 -0
  203. data/spec_legacy/unit/contextual_validators/execution_spec.rb +48 -0
  204. data/spec_legacy/unit/contextual_validators/spec_helper.rb +37 -0
  205. data/spec_legacy/unit/generic_validator/equality_operator_spec.rb +26 -0
  206. data/spec_legacy/unit/generic_validator/optional_spec.rb +54 -0
  207. data/spec_legacy/unit/validators/within_validator_spec.rb +23 -0
  208. data/spec_legacy/unit/violation_set/adding_spec.rb +54 -0
  209. data/spec_legacy/unit/violation_set/emptiness_spec.rb +38 -0
  210. data/spec_legacy/unit/violation_set/enumerable_spec.rb +32 -0
  211. data/spec_legacy/unit/violation_set/reading_spec.rb +35 -0
  212. data/spec_legacy/unit/violation_set/respond_to_spec.rb +15 -0
  213. data/tasks/spec.rake +38 -0
  214. data/tasks/yard.rake +9 -0
  215. data/tasks/yardstick.rake +19 -0
  216. metadata +302 -0
@@ -0,0 +1,46 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/length'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Length
8
+ class Minimum < Rule
9
+
10
+ include Length
11
+
12
+ attr_reader :bound
13
+
14
+ def initialize(attribute_name, options)
15
+ super
16
+
17
+ @bound = options.fetch(:bound)
18
+ end
19
+
20
+ def violation_type(resource)
21
+ :too_short
22
+ end
23
+
24
+ def violation_data(resource)
25
+ [ [ :minimum, bound ] ]
26
+ end
27
+
28
+ private
29
+
30
+ # Validate the value length is greater than or equal to the bound
31
+ #
32
+ # @param [Integer] length
33
+ # the value length
34
+ #
35
+ # @return [String, NilClass]
36
+ # the error message if invalid, nil if valid
37
+ #
38
+ # @api private
39
+ def valid_length?(length)
40
+ bound <= length
41
+ end
42
+
43
+ end # class Minimum
44
+ end # module Length
45
+ end # class Rule
46
+ end # module Aequitas
@@ -0,0 +1,46 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/length'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Length
8
+ class Range < Rule
9
+
10
+ include Length
11
+
12
+ attr_reader :range
13
+
14
+ def initialize(attribute_name, options)
15
+ super
16
+
17
+ @range = options.fetch(:range)
18
+ end
19
+
20
+ def violation_type(resource)
21
+ :length_between
22
+ end
23
+
24
+ def violation_data(resource)
25
+ [ [ :min, range.begin ], [ :max, range.end ] ]
26
+ end
27
+
28
+ private
29
+
30
+ # Validate the value length is within expected range
31
+ #
32
+ # @param [Integer] length
33
+ # the value length
34
+ #
35
+ # @return [String, NilClass]
36
+ # the error message if invalid, nil if valid
37
+ #
38
+ # @api private
39
+ def valid_length?(length)
40
+ range.include?(length)
41
+ end
42
+
43
+ end # class Range
44
+ end # module Length
45
+ end # class Rule
46
+ end # module Aequitas
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ class Method < Rule
8
+
9
+ equalize_on *(superclass.equalizer.keys + [:method])
10
+
11
+ attr_reader :method
12
+
13
+ def initialize(attribute_name, options={})
14
+ super
15
+
16
+ @method = options.fetch(:method, attribute_name)
17
+ end
18
+
19
+ def validate(resource)
20
+ result, error_message = resource.__send__(method)
21
+
22
+ if result
23
+ nil
24
+ else
25
+ Violation.new(resource, error_message, self)
26
+ end
27
+ end
28
+
29
+ end # class Method
30
+ end # class Rule
31
+ end # module Aequitas
@@ -0,0 +1,85 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'bigdecimal'
4
+ require 'bigdecimal/util'
5
+ require 'aequitas/rule'
6
+
7
+ module Aequitas
8
+ class Rule
9
+ module Numericalness
10
+
11
+ def self.included(validator)
12
+ validator.equalize_on *(validator.superclass.equalizer.keys + [:expected])
13
+ end
14
+
15
+ # TODO: move options normalization into the validator macros?
16
+ def self.rules_for(attribute_name, options)
17
+ options = options.dup
18
+
19
+ int = scour_options_of_keys(options, [:only_integer, :integer_only])
20
+
21
+ gt = scour_options_of_keys(options, [:gt, :greater_than])
22
+ lt = scour_options_of_keys(options, [:lt, :less_than])
23
+ gte = scour_options_of_keys(options, [:gte, :greater_than_or_equal_to])
24
+ lte = scour_options_of_keys(options, [:lte, :less_than_or_equal_to])
25
+ eq = scour_options_of_keys(options, [:eq, :equal, :equals, :exactly, :equal_to])
26
+ ne = scour_options_of_keys(options, [:ne, :not_equal_to])
27
+
28
+ rules = []
29
+ rules << Integer.new(attribute_name, options) if int
30
+ rules << NonInteger.new(attribute_name, options) if !int
31
+ rules << GreaterThan.new(attribute_name, options.merge(:expected => gt)) if gt
32
+ rules << LessThan.new(attribute_name, options.merge(:expected => lt)) if lt
33
+ rules << GreaterThanOrEqual.new(attribute_name, options.merge(:expected => gte)) if gte
34
+ rules << LessThanOrEqual.new(attribute_name, options.merge(:expected => lte)) if lte
35
+ rules << Equal.new(attribute_name, options.merge(:expected => eq)) if eq
36
+ rules << NotEqual.new(attribute_name, options.merge(:expected => ne)) if ne
37
+ rules
38
+ end
39
+
40
+ def self.scour_options_of_keys(options, keys)
41
+ keys.map { |key| options.delete(key) }.compact.first
42
+ end
43
+
44
+ attr_reader :expected
45
+
46
+ def initialize(attribute_name, options)
47
+ super
48
+
49
+ @expected = options[:expected]
50
+ end
51
+
52
+ def valid?(resource)
53
+ # TODO: is it even possible for expected to be nil?
54
+ # if so, return a dummy validator when expected is nil
55
+ return true if expected.nil?
56
+
57
+ value = attribute_value(resource)
58
+
59
+ skip?(value) || valid_numericalness?(value)
60
+ end
61
+
62
+ private
63
+
64
+ def value_as_string(value)
65
+ case value
66
+ # Avoid Scientific Notation in Float to_s
67
+ when Float then value.to_d.to_s('F')
68
+ when BigDecimal then value.to_s('F')
69
+ else value.to_s
70
+ end
71
+ end
72
+
73
+ end # class Numericalness
74
+ end # class Rule
75
+ end # module Aequitas
76
+
77
+ require 'aequitas/rule/numericalness/integer'
78
+ require 'aequitas/rule/numericalness/non_integer'
79
+
80
+ require 'aequitas/rule/numericalness/equal'
81
+ require 'aequitas/rule/numericalness/greater_than'
82
+ require 'aequitas/rule/numericalness/greater_than_or_equal'
83
+ require 'aequitas/rule/numericalness/less_than'
84
+ require 'aequitas/rule/numericalness/less_than_or_equal'
85
+ require 'aequitas/rule/numericalness/not_equal'
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/numericalness'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Numericalness
8
+ class Equal < Rule
9
+
10
+ include Numericalness
11
+
12
+ def valid_numericalness?(value)
13
+ value == expected
14
+ rescue ArgumentError
15
+ # TODO: figure out better solution for: can't compare String with Integer
16
+ true
17
+ end
18
+
19
+ def violation_type(resource)
20
+ :equal_to
21
+ end
22
+
23
+ def violation_data(resource)
24
+ [ [ :expected, expected ] ]
25
+ end
26
+
27
+ end # class Equal
28
+ end # module Numericalness
29
+ end # class Rule
30
+ end # module Aequitas
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/numericalness'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Numericalness
8
+ class GreaterThan < Rule
9
+
10
+ include Numericalness
11
+
12
+ def valid_numericalness?(value)
13
+ value > expected
14
+ rescue ArgumentError
15
+ # TODO: figure out better solution for: can't compare String with Integer
16
+ true
17
+ end
18
+
19
+ def violation_type(resource)
20
+ :greater_than
21
+ end
22
+
23
+ def violation_data(resource)
24
+ [ [ :minimum, expected ] ]
25
+ end
26
+
27
+ end # class GreaterThan
28
+ end # module Numericalness
29
+ end # class Rule
30
+ end # module Aequitas
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/numericalness'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Numericalness
8
+ class GreaterThanOrEqual < Rule
9
+
10
+ include Numericalness
11
+
12
+ def valid_numericalness?(value)
13
+ value >= expected
14
+ rescue ArgumentError
15
+ # TODO: figure out better solution for: can't compare String with Integer
16
+ true
17
+ end
18
+
19
+ def violation_type(resource)
20
+ :greater_than_or_equal_to
21
+ end
22
+
23
+ def violation_data(resource)
24
+ [ [ :minimum, expected ] ]
25
+ end
26
+
27
+ end # class GreaterThanOrEqual
28
+ end # module Numericalness
29
+ end # class Rule
30
+ end # module Aequitas
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/numericalness'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Numericalness
8
+ class Integer < Rule
9
+
10
+ include Numericalness
11
+
12
+ def expected
13
+ /\A[+-]?\d+\z/
14
+ end
15
+
16
+ def valid_numericalness?(value)
17
+ # XXX: workaround for jruby. This is needed because the jruby
18
+ # compiler optimizes a bit too far with magic variables like $~.
19
+ # the value.send line sends $~. Inserting this line makes sure the
20
+ # jruby compiler does not optimise here.
21
+ # see http://jira.codehaus.org/browse/JRUBY-3765
22
+ $~ = nil if RUBY_PLATFORM[/java/]
23
+
24
+ value_as_string(value) =~ expected
25
+ rescue ArgumentError
26
+ # TODO: figure out better solution for: can't compare String with Integer
27
+ true
28
+ end
29
+
30
+ def violation_type(resource)
31
+ :not_an_integer
32
+ end
33
+
34
+ end # class Equal
35
+ end # module Numericalness
36
+ end # class Rule
37
+ end # module Aequitas
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/numericalness'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Numericalness
8
+ class LessThan < Rule
9
+
10
+ include Numericalness
11
+
12
+ def valid_numericalness?(value)
13
+ value < expected
14
+ rescue ArgumentError
15
+ # TODO: figure out better solution for: can't compare String with Integer
16
+ true
17
+ end
18
+
19
+ def violation_type(resource)
20
+ :less_than
21
+ end
22
+
23
+ def violation_data(resource)
24
+ [ [ :maximum, expected ] ]
25
+ end
26
+
27
+ end # class LessThan
28
+ end # module Numericalness
29
+ end # class Rule
30
+ end # module Aequitas
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/numericalness'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Numericalness
8
+ class LessThanOrEqual < Rule
9
+
10
+ include Numericalness
11
+
12
+ def valid_numericalness?(value)
13
+ value <= expected
14
+ rescue ArgumentError
15
+ # TODO: figure out better solution for: can't compare String with Integer
16
+ true
17
+ end
18
+
19
+ def violation_type(resource)
20
+ :less_than_or_equal_to
21
+ end
22
+
23
+ def violation_data(resource)
24
+ [ [ :maximum, expected ] ]
25
+ end
26
+
27
+ end # class LessThanOrEqual
28
+ end # module Numericalness
29
+ end # class Rule
30
+ end # module Aequitas
@@ -0,0 +1,64 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'aequitas/rule/numericalness'
4
+
5
+ module Aequitas
6
+ class Rule
7
+ module Numericalness
8
+ class NonInteger < Rule
9
+
10
+ include Numericalness
11
+
12
+ attr_reader :precision
13
+ attr_reader :scale
14
+
15
+ def initialize(attribute_name, options)
16
+ super
17
+
18
+ @precision = options.fetch(:precision, nil)
19
+ @scale = options.fetch(:scale, nil)
20
+
21
+ unless expected # validate precision and scale attrs
22
+ raise ArgumentError, "Invalid precision #{precision.inspect} and scale #{scale.inspect} for #{attribute_name}"
23
+ end
24
+ end
25
+
26
+ def expected(precision = @precision, scale = @scale)
27
+ if precision && scale
28
+ if precision > scale && scale == 0
29
+ /\A[+-]?(?:\d{1,#{precision}}(?:\.0)?)\z/
30
+ elsif precision > scale
31
+ delta = precision - scale
32
+ /\A[+-]?(?:\d{1,#{delta}}|\d{0,#{delta}}\.\d{1,#{scale}})\z/
33
+ elsif precision == scale
34
+ /\A[+-]?(?:0(?:\.\d{1,#{scale}})?)\z/
35
+ else
36
+ nil
37
+ end
38
+ else
39
+ /\A[+-]?(?:\d+|\d*\.\d+)\z/
40
+ end
41
+ end
42
+
43
+ def valid_numericalness?(value)
44
+ # XXX: workaround for jruby. This is needed because the jruby
45
+ # compiler optimizes a bit too far with magic variables like $~.
46
+ # the value.send line sends $~. Inserting this line makes sure the
47
+ # jruby compiler does not optimise here.
48
+ # see http://jira.codehaus.org/browse/JRUBY-3765
49
+ $~ = nil if RUBY_PLATFORM[/java/]
50
+
51
+ value_as_string(value) =~ expected
52
+ rescue ArgumentError
53
+ # TODO: figure out better solution for: can't compare String with Integer
54
+ true
55
+ end
56
+
57
+ def violation_type(resource)
58
+ :not_a_number
59
+ end
60
+
61
+ end # class NonInteger
62
+ end # module Numericalness
63
+ end # class Rule
64
+ end # module Aequitas