Class: Karafka::Core::Contractable::Contract
- Inherits:
-
Object
- Object
- Karafka::Core::Contractable::Contract
- Extended by:
- Karafka::Core::Configurable
- Defined in:
- lib/karafka/core/contractable/contract.rb
Overview
Note:
This contract does NOT support rules inheritance as it was never needed in Karafka
Base contract for all the contracts that check data format
Class Attribute Summary collapse
-
.rules ⇒ Array<Rule>
readonly
All the validation rules defined for a given contract.
Class Method Summary collapse
-
.nested(path, &block) ⇒ Object
Allows for definition of a scope/namespace for nested validations.
- .optional(*keys, &block) ⇒ Object
-
.required(*keys, &block) ⇒ Object
Defines a rule for a required field (required means, that will automatically create an error if missing).
- .virtual(&block) ⇒ Object
Instance Method Summary collapse
-
#call(data) ⇒ Result
Runs the validation.
-
#validate!(data, error_class) ⇒ Boolean
True.
Methods included from Karafka::Core::Configurable
Class Attribute Details
.rules ⇒ Array<Rule> (readonly)
Returns all the validation rules defined for a given contract.
18 19 20 |
# File 'lib/karafka/core/contractable/contract.rb', line 18 def rules @rules end |
Class Method Details
.nested(path, &block) ⇒ Object
Allows for definition of a scope/namespace for nested validations
29 30 31 32 33 34 |
# File 'lib/karafka/core/contractable/contract.rb', line 29 def nested(path, &block) init_accu @nested << path instance_eval(&block) @nested.pop end |
.optional(*keys, &block) ⇒ Object
48 49 50 51 |
# File 'lib/karafka/core/contractable/contract.rb', line 48 def optional(*keys, &block) init_accu @rules << Rule.new(@nested + keys, :optional, block).freeze end |
.required(*keys, &block) ⇒ Object
Defines a rule for a required field (required means, that will automatically create an error if missing)
41 42 43 44 |
# File 'lib/karafka/core/contractable/contract.rb', line 41 def required(*keys, &block) init_accu @rules << Rule.new(@nested + keys, :required, block).freeze end |
.virtual(&block) ⇒ Object
Note:
Virtual rules have different result expectations. Please see contracts or specs for details.
57 58 59 60 |
# File 'lib/karafka/core/contractable/contract.rb', line 57 def virtual(&block) init_accu @rules << Rule.new([], :virtual, block).freeze end |
Instance Method Details
#call(data) ⇒ Result
Runs the validation
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/karafka/core/contractable/contract.rb', line 75 def call(data) errors = [] self.class.rules.map do |rule| case rule.type when :required validate_required(data, rule, errors) when :optional validate_optional(data, rule, errors) when :virtual validate_virtual(data, rule, errors) end end Result.new(errors, self) end |
#validate!(data, error_class) ⇒ Boolean
Returns true.
97 98 99 100 101 102 103 |
# File 'lib/karafka/core/contractable/contract.rb', line 97 def validate!(data, error_class) result = call(data) return true if result.success? raise error_class, result.errors end |