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.
- data/.gitignore +4 -0
- data/.rvmrc +1 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.rdoc +125 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/aequitas.gemspec +20 -0
- data/lib/aequitas.rb +80 -0
- data/lib/aequitas/class_methods.rb +26 -0
- data/lib/aequitas/context.rb +53 -0
- data/lib/aequitas/contextual_rule_set.rb +221 -0
- data/lib/aequitas/exceptions.rb +10 -0
- data/lib/aequitas/macros.rb +466 -0
- data/lib/aequitas/message_transformer.rb +127 -0
- data/lib/aequitas/rule.rb +153 -0
- data/lib/aequitas/rule/absence.rb +14 -0
- data/lib/aequitas/rule/absence/blank.rb +21 -0
- data/lib/aequitas/rule/absence/nil.rb +21 -0
- data/lib/aequitas/rule/acceptance.rb +36 -0
- data/lib/aequitas/rule/block.rb +33 -0
- data/lib/aequitas/rule/confirmation.rb +41 -0
- data/lib/aequitas/rule/format.rb +81 -0
- data/lib/aequitas/rule/format/proc.rb +28 -0
- data/lib/aequitas/rule/format/regexp.rb +44 -0
- data/lib/aequitas/rule/formats/email.rb +52 -0
- data/lib/aequitas/rule/formats/url.rb +14 -0
- data/lib/aequitas/rule/guard.rb +51 -0
- data/lib/aequitas/rule/length.rb +87 -0
- data/lib/aequitas/rule/length/equal.rb +46 -0
- data/lib/aequitas/rule/length/maximum.rb +46 -0
- data/lib/aequitas/rule/length/minimum.rb +46 -0
- data/lib/aequitas/rule/length/range.rb +46 -0
- data/lib/aequitas/rule/method.rb +31 -0
- data/lib/aequitas/rule/numericalness.rb +85 -0
- data/lib/aequitas/rule/numericalness/equal.rb +30 -0
- data/lib/aequitas/rule/numericalness/greater_than.rb +30 -0
- data/lib/aequitas/rule/numericalness/greater_than_or_equal.rb +30 -0
- data/lib/aequitas/rule/numericalness/integer.rb +37 -0
- data/lib/aequitas/rule/numericalness/less_than.rb +30 -0
- data/lib/aequitas/rule/numericalness/less_than_or_equal.rb +30 -0
- data/lib/aequitas/rule/numericalness/non_integer.rb +64 -0
- data/lib/aequitas/rule/numericalness/not_equal.rb +30 -0
- data/lib/aequitas/rule/presence.rb +14 -0
- data/lib/aequitas/rule/presence/not_blank.rb +21 -0
- data/lib/aequitas/rule/presence/not_nil.rb +21 -0
- data/lib/aequitas/rule/primitive_type.rb +28 -0
- data/lib/aequitas/rule/skip_condition.rb +104 -0
- data/lib/aequitas/rule/within.rb +28 -0
- data/lib/aequitas/rule/within/range.rb +53 -0
- data/lib/aequitas/rule/within/range/bounded.rb +25 -0
- data/lib/aequitas/rule/within/range/unbounded_begin.rb +25 -0
- data/lib/aequitas/rule/within/range/unbounded_end.rb +25 -0
- data/lib/aequitas/rule/within/set.rb +39 -0
- data/lib/aequitas/rule_set.rb +80 -0
- data/lib/aequitas/support/blank.rb +22 -0
- data/lib/aequitas/support/equalizable.rb +113 -0
- data/lib/aequitas/support/ordered_hash.rb +438 -0
- data/lib/aequitas/version.rb +5 -0
- data/lib/aequitas/violation.rb +116 -0
- data/lib/aequitas/violation_set.rb +123 -0
- data/lib/aequitas/virtus.rb +29 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor.rb +41 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor/boolean.rb +17 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor/object.rb +25 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor/string.rb +27 -0
- data/spec/integration/aequitas/macros/validates_absence_of_spec.rb +19 -0
- data/spec/integration/aequitas/macros/validates_acceptance_of_spec.rb +19 -0
- data/spec/integration/aequitas/macros/validates_confirmation_of_spec.rb +25 -0
- data/spec/integration/aequitas/macros/validates_format_of_spec.rb +87 -0
- data/spec/integration/aequitas/macros/validates_length_of.rb +77 -0
- data/spec/integration/aequitas/macros/validates_numericalness_of_spec.rb +221 -0
- data/spec/integration/aequitas/macros/validates_presence_of_spec.rb +19 -0
- data/spec/integration/aequitas/macros/validates_with_block.rb +23 -0
- data/spec/integration/aequitas/macros/validates_with_method.rb +19 -0
- data/spec/integration/aequitas/macros/validates_within.rb +87 -0
- data/spec/integration/shared/macros/integration_spec.rb +67 -0
- data/spec/integration/virtus/boolean/presence_spec.rb +49 -0
- data/spec/integration/virtus/string/format/email_address_spec.rb +55 -0
- data/spec/integration/virtus/string/format/regexp_spec.rb +55 -0
- data/spec/integration/virtus/string/format/url_spec.rb +55 -0
- data/spec/integration/virtus/string/length/equal_spec.rb +49 -0
- data/spec/integration/virtus/string/length/range_spec.rb +49 -0
- data/spec/integration/virtus/string/presence_spec.rb +49 -0
- data/spec/rcov.opts +6 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/suite.rb +5 -0
- data/spec/unit/aequitas/rule/absence/blank_spec.rb +45 -0
- data/spec/unit/aequitas/rule/acceptance_spec.rb +71 -0
- data/spec/unit/aequitas/rule/confirmation_spec.rb +80 -0
- data/spec/unit/aequitas/rule/guard_spec.rb +120 -0
- data/spec/unit/aequitas/rule/skip_condition_spec.rb +170 -0
- data/spec/unit/aequitas/rule_spec.rb +40 -0
- data/spec/unit/aequitas/support/blank_spec.rb +83 -0
- data/spec/unit/aequitas/support/equalizable/equalizer_spec.rb +21 -0
- data/spec/unit/aequitas/support/equalizable_spec.rb +67 -0
- data/spec/unit/aequitas/violation_set_spec.rb +154 -0
- data/spec_legacy/fixtures/barcode.rb +40 -0
- data/spec_legacy/fixtures/basketball_court.rb +58 -0
- data/spec_legacy/fixtures/basketball_player.rb +34 -0
- data/spec_legacy/fixtures/beta_tester_account.rb +33 -0
- data/spec_legacy/fixtures/bill_of_landing.rb +47 -0
- data/spec_legacy/fixtures/boat_dock.rb +26 -0
- data/spec_legacy/fixtures/city.rb +24 -0
- data/spec_legacy/fixtures/company.rb +93 -0
- data/spec_legacy/fixtures/corporate_world.rb +39 -0
- data/spec_legacy/fixtures/country.rb +24 -0
- data/spec_legacy/fixtures/ethernet_frame.rb +56 -0
- data/spec_legacy/fixtures/event.rb +44 -0
- data/spec_legacy/fixtures/g3_concert.rb +57 -0
- data/spec_legacy/fixtures/jabberwock.rb +27 -0
- data/spec_legacy/fixtures/kayak.rb +28 -0
- data/spec_legacy/fixtures/lernean_hydra.rb +39 -0
- data/spec_legacy/fixtures/llama_spaceship.rb +15 -0
- data/spec_legacy/fixtures/mathematical_function.rb +34 -0
- data/spec_legacy/fixtures/memory_object.rb +30 -0
- data/spec_legacy/fixtures/mittelschnauzer.rb +39 -0
- data/spec_legacy/fixtures/motor_launch.rb +21 -0
- data/spec_legacy/fixtures/multibyte.rb +16 -0
- data/spec_legacy/fixtures/page.rb +32 -0
- data/spec_legacy/fixtures/phone_number.rb +28 -0
- data/spec_legacy/fixtures/pirogue.rb +28 -0
- data/spec_legacy/fixtures/programming_language.rb +83 -0
- data/spec_legacy/fixtures/reservation.rb +38 -0
- data/spec_legacy/fixtures/scm_operation.rb +56 -0
- data/spec_legacy/fixtures/sms_message.rb +22 -0
- data/spec_legacy/fixtures/udp_packet.rb +49 -0
- data/spec_legacy/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
- data/spec_legacy/integration/absent_field_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
- data/spec_legacy/integration/acceptance_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
- data/spec_legacy/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
- data/spec_legacy/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
- data/spec_legacy/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
- data/spec_legacy/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
- data/spec_legacy/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
- data/spec_legacy/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
- data/spec_legacy/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
- data/spec_legacy/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
- data/spec_legacy/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +48 -0
- data/spec_legacy/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
- data/spec_legacy/integration/automatic_validation/spec_helper.rb +57 -0
- data/spec_legacy/integration/block_validator/block_validator_spec.rb +32 -0
- data/spec_legacy/integration/block_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/conditional_validation/if_condition_spec.rb +63 -0
- data/spec_legacy/integration/conditional_validation/spec_helper.rb +5 -0
- data/spec_legacy/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
- data/spec_legacy/integration/confirmation_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/datamapper_models/association_validation_spec.rb +29 -0
- data/spec_legacy/integration/datamapper_models/inheritance_spec.rb +82 -0
- data/spec_legacy/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
- data/spec_legacy/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
- data/spec_legacy/integration/duplicated_validations/spec_helper.rb +5 -0
- data/spec_legacy/integration/format_validator/email_format_validator_spec.rb +139 -0
- data/spec_legacy/integration/format_validator/format_validator_spec.rb +64 -0
- data/spec_legacy/integration/format_validator/regexp_validator_spec.rb +33 -0
- data/spec_legacy/integration/format_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/format_validator/url_format_validator_spec.rb +93 -0
- data/spec_legacy/integration/length_validator/default_value_spec.rb +14 -0
- data/spec_legacy/integration/length_validator/equality_spec.rb +87 -0
- data/spec_legacy/integration/length_validator/error_message_spec.rb +22 -0
- data/spec_legacy/integration/length_validator/maximum_spec.rb +49 -0
- data/spec_legacy/integration/length_validator/minimum_spec.rb +54 -0
- data/spec_legacy/integration/length_validator/range_spec.rb +87 -0
- data/spec_legacy/integration/length_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/method_validator/method_validator_spec.rb +242 -0
- data/spec_legacy/integration/method_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
- data/spec_legacy/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
- data/spec_legacy/integration/numeric_validator/float_type_spec.rb +90 -0
- data/spec_legacy/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/integer_only_true_spec.rb +91 -0
- data/spec_legacy/integration/numeric_validator/integer_type_spec.rb +86 -0
- data/spec_legacy/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/primitive_validator/primitive_validator_spec.rb +92 -0
- data/spec_legacy/integration/primitive_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
- data/spec_legacy/integration/required_field_validator/association_spec.rb +69 -0
- data/spec_legacy/integration/required_field_validator/boolean_type_value_spec.rb +164 -0
- data/spec_legacy/integration/required_field_validator/date_type_value_spec.rb +127 -0
- data/spec_legacy/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
- data/spec_legacy/integration/required_field_validator/float_type_value_spec.rb +131 -0
- data/spec_legacy/integration/required_field_validator/integer_type_value_spec.rb +99 -0
- data/spec_legacy/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
- data/spec_legacy/integration/required_field_validator/shared_examples.rb +26 -0
- data/spec_legacy/integration/required_field_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/required_field_validator/string_type_value_spec.rb +167 -0
- data/spec_legacy/integration/required_field_validator/text_type_value_spec.rb +49 -0
- data/spec_legacy/integration/shared/default_validation_context.rb +13 -0
- data/spec_legacy/integration/shared/valid_and_invalid_model.rb +35 -0
- data/spec_legacy/integration/uniqueness_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
- data/spec_legacy/integration/within_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/within_validator/within_validator_spec.rb +168 -0
- data/spec_legacy/public/resource_spec.rb +105 -0
- data/spec_legacy/spec.opts +4 -0
- data/spec_legacy/spec_helper.rb +29 -0
- data/spec_legacy/unit/contextual_validators/emptiness_spec.rb +50 -0
- data/spec_legacy/unit/contextual_validators/execution_spec.rb +48 -0
- data/spec_legacy/unit/contextual_validators/spec_helper.rb +37 -0
- data/spec_legacy/unit/generic_validator/equality_operator_spec.rb +26 -0
- data/spec_legacy/unit/generic_validator/optional_spec.rb +54 -0
- data/spec_legacy/unit/validators/within_validator_spec.rb +23 -0
- data/spec_legacy/unit/violation_set/adding_spec.rb +54 -0
- data/spec_legacy/unit/violation_set/emptiness_spec.rb +38 -0
- data/spec_legacy/unit/violation_set/enumerable_spec.rb +32 -0
- data/spec_legacy/unit/violation_set/reading_spec.rb +35 -0
- data/spec_legacy/unit/violation_set/respond_to_spec.rb +15 -0
- data/tasks/spec.rake +38 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- 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
|