action_logic 0.2.2 → 0.2.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb908cdf21b4822673902f5b19eed95206101d34
4
- data.tar.gz: 88acebe974c5bdfc84a0f063b3de6167aaf8d089
3
+ metadata.gz: 583858aebac317fb33f490775442ecad7a40577d
4
+ data.tar.gz: 839af981a8f86ad9da7de704738dddde65609007
5
5
  SHA512:
6
- metadata.gz: 91b207eff368d0401c5b3110bd62de42929198aae35993fd80f72746e8628e6d8dffd0283aa04bd26d103445ac0c091c843915ac83e8f3e0c2285dc1fd99c40f
7
- data.tar.gz: 061f6bc8f7ae853638320cf79d0c6a2e154d110c322482887e9e74719978d5e4dd71e1c9f8b17342a4901bbef6d055cf047cd7cb2ccacab56410128b6f7ba894
6
+ metadata.gz: 4c039cabbcfac0378afb5d30e9fd942d9ae9fee064c30f6e691526f455f29617a8c24ea7e765deb2edfb2878a153347b0ba762836a40a6ed89a3eb5404b6fc75
7
+ data.tar.gz: a0cd7c262dc94adcd317db9d624621a3065bb0ac74c5a460a8ed331f29548f2b3aac2ad1649f1e2c6e8cbc74e67080413ae1ac244bf1c053fb99f6d4a0bd12c6
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- action_logic (0.2.1)
4
+ action_logic (0.2.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,17 +1,11 @@
1
- require 'action_logic/action_core'
2
- require 'action_logic/action_validation'
3
- require 'action_logic/action_benchmark'
1
+ require 'action_logic/action_includes'
4
2
 
5
3
  module ActionLogic
6
4
  module ActionCoordinator
7
- include ActionLogic::ActionValidation
8
- include ActionLogic::ActionCore
9
5
 
10
6
  def self.included(klass)
7
+ klass.extend ActionLogic::ActionIncludes
11
8
  klass.extend ClassMethods
12
- klass.extend ActionLogic::ActionCore::ClassMethods
13
- klass.extend ActionLogic::ActionValidation::ClassMethods
14
- klass.extend ActionLogic::ActionBenchmark::ClassMethods
15
9
  end
16
10
 
17
11
  module ClassMethods
@@ -0,0 +1,15 @@
1
+ require 'action_logic/action_core'
2
+ require 'action_logic/action_validation'
3
+ require 'action_logic/action_benchmark'
4
+
5
+ module ActionLogic
6
+ module ActionIncludes
7
+ def self.extended(klass)
8
+ klass.include ActionLogic::ActionCore
9
+ klass.include ActionLogic::ActionValidation
10
+ klass.extend ActionLogic::ActionCore::ClassMethods
11
+ klass.extend ActionLogic::ActionValidation::ClassMethods
12
+ klass.extend ActionLogic::ActionBenchmark::ClassMethods
13
+ end
14
+ end
15
+ end
@@ -1,17 +1,11 @@
1
- require 'action_logic/action_core'
2
- require 'action_logic/action_validation'
3
- require 'action_logic/action_benchmark'
1
+ require 'action_logic/action_includes'
4
2
 
5
3
  module ActionLogic
6
4
  module ActionTask
7
- include ActionLogic::ActionValidation
8
- include ActionLogic::ActionCore
9
5
 
10
6
  def self.included(klass)
7
+ klass.extend ActionLogic::ActionIncludes
11
8
  klass.extend ClassMethods
12
- klass.extend ActionLogic::ActionCore::ClassMethods
13
- klass.extend ActionLogic::ActionValidation::ClassMethods
14
- klass.extend ActionLogic::ActionBenchmark::ClassMethods
15
9
  end
16
10
 
17
11
  module ClassMethods
@@ -1,17 +1,11 @@
1
- require 'action_logic/action_core'
2
- require 'action_logic/action_validation'
3
- require 'action_logic/action_benchmark'
1
+ require 'action_logic/action_includes'
4
2
 
5
3
  module ActionLogic
6
4
  module ActionUseCase
7
- include ActionLogic::ActionValidation
8
- include ActionLogic::ActionCore
9
5
 
10
6
  def self.included(klass)
7
+ klass.extend ActionLogic::ActionIncludes
11
8
  klass.extend ClassMethods
12
- klass.extend ActionLogic::ActionCore::ClassMethods
13
- klass.extend ActionLogic::ActionValidation::ClassMethods
14
- klass.extend ActionLogic::ActionBenchmark::ClassMethods
15
9
  end
16
10
 
17
11
  module ClassMethods
@@ -0,0 +1,17 @@
1
+ require 'action_logic/errors'
2
+ require 'action_logic/action_validation/base_validation'
3
+
4
+ module ActionLogic
5
+ module ActionValidation
6
+ class AttributeValidation < BaseValidation
7
+
8
+ def self.validate!(validation_rules, context)
9
+ existing_attributes = context.to_h.keys
10
+ expected_attributes = validation_rules.keys || []
11
+ missing_attributes = expected_attributes - existing_attributes
12
+
13
+ raise ActionLogic::MissingAttributeError.new(error_message_format(missing_attributes.join(", ") + " attributes are missing")) if missing_attributes.any?
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module ActionLogic
2
+ module ActionValidation
3
+ class BaseValidation
4
+ def self.error_message_format(error_string)
5
+ "context: #{self.class} message: #{error_string}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,32 @@
1
+ require 'action_logic/errors'
2
+ require 'action_logic/action_validation/base_validation'
3
+
4
+ module ActionLogic
5
+ module ActionValidation
6
+ class PresenceValidation < BaseValidation
7
+
8
+ def self.validate!(validation_rules, context)
9
+ return unless validation_rules.values.find { |expected_validation| expected_validation[:presence] }
10
+ errors = presence_errors(validation_rules, context)
11
+ raise ActionLogic::PresenceError.new(errors) if errors.any?
12
+ end
13
+
14
+ def self.presence_errors(validation_rules, context)
15
+ validation_rules.reduce([]) do |error_collection, (expected_attribute, expected_validation)|
16
+ next unless expected_validation[:presence]
17
+ error_collection << error_message(expected_attribute, expected_validation, context)
18
+ error_collection
19
+ end || []
20
+ end
21
+
22
+ def self.error_message(expected_attribute, expected_validation, context)
23
+ case expected_validation[:presence]
24
+ when TrueClass then "Attribute: #{expected_attribute} is missing value in context but presence validation was specified" unless context[expected_attribute]
25
+ when Proc then "Attribute: #{expected_attribute} is missing value in context but custom presence validation was specified" unless expected_validation[:presence].call(context[expected_attribute])
26
+ else
27
+ raise ActionLogic::UnrecognizablePresenceValidatorError.new(error_message_format("Presence validator: #{expected_validation[:presence]} is not a supported format"))
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ require 'action_logic/errors'
2
+ require 'action_logic/action_validation/base_validation'
3
+
4
+ module ActionLogic
5
+ module ActionValidation
6
+ class TypeValidation < BaseValidation
7
+
8
+ def self.validate!(validation_rules, context)
9
+ return unless validation_rules.values.find { |expected_validation| expected_validation[:type] }
10
+
11
+ type_errors = validation_rules.reduce([]) do |collection, (expected_attribute, expected_validation)|
12
+ next unless expected_validation[:type]
13
+
14
+ if context.to_h[expected_attribute].class != expected_validation[:type]
15
+ collection << "Attribute: #{expected_attribute} with value: #{context.to_h[expected_attribute]} was expected to be of type #{expected_validation[:type]} but is #{context.to_h[expected_attribute].class}"
16
+ end
17
+ collection
18
+ end
19
+
20
+ raise ActionLogic::AttributeTypeError.new(error_message_format(type_errors.join(", "))) if type_errors.any?
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,8 +1,9 @@
1
- require 'action_logic/errors'
1
+ require 'action_logic/action_validation/attribute_validation'
2
+ require 'action_logic/action_validation/presence_validation'
3
+ require 'action_logic/action_validation/type_validation'
2
4
 
3
5
  module ActionLogic
4
6
  module ActionValidation
5
-
6
7
  module ClassMethods
7
8
  def validates_before(args)
8
9
  @validates_before = args
@@ -30,14 +31,14 @@ module ActionLogic
30
31
  end
31
32
 
32
33
  def validations
33
- [:validate_attributes!,
34
- :validate_types!,
35
- :validate_presence!]
34
+ [AttributeValidation,
35
+ TypeValidation,
36
+ PresenceValidation]
36
37
  end
37
38
 
38
39
  def validate!(validation, validation_rules)
39
40
  return if validation_rules.empty?
40
- send(validation, validation_rules)
41
+ validation.validate!(validation_rules, context)
41
42
  end
42
43
 
43
44
  def validations!(validation_order)
@@ -53,52 +54,5 @@ module ActionLogic
53
54
  @after_validation_rules ||= self.class.get_validates_after
54
55
  @around_validation_rules ||= self.class.get_validates_around
55
56
  end
56
-
57
- def validate_attributes!(validations)
58
- existing_attributes = context.to_h.keys
59
- expected_attributes = validations.keys || []
60
- missing_attributes = expected_attributes - existing_attributes
61
-
62
- raise ActionLogic::MissingAttributeError.new(error_message_format(missing_attributes.join(", ") + " attributes are missing")) if missing_attributes.any?
63
- end
64
-
65
- def validate_types!(validations)
66
- return unless validations.values.find { |expected_validation| expected_validation[:type] }
67
-
68
- type_errors = validations.reduce([]) do |collection, (expected_attribute, expected_validation)|
69
- next unless expected_validation[:type]
70
-
71
- if context.to_h[expected_attribute].class != expected_validation[:type]
72
- collection << "Attribute: #{expected_attribute} with value: #{context.to_h[expected_attribute]} was expected to be of type #{expected_validation[:type]} but is #{context.to_h[expected_attribute].class}"
73
- end
74
- collection
75
- end
76
-
77
- raise ActionLogic::AttributeTypeError.new(error_message_format(type_errors.join(", "))) if type_errors.any?
78
- end
79
-
80
- def validate_presence!(validations)
81
- return unless validations.values.find { |expected_validation| expected_validation[:presence] }
82
-
83
- presence_errors = validations.reduce([]) do |collection, (expected_attribute, expected_validation)|
84
- next unless expected_validation[:presence]
85
-
86
- if expected_validation[:presence] == true
87
- collection << "Attribute: #{expected_attribute} is missing value in context but presence validation was specified" unless context[expected_attribute]
88
- elsif expected_validation[:presence].class == Proc
89
- collection << "Attribute: #{expected_attribute} is missing value in context but custom presence validation was specified" unless expected_validation[:presence].call(context[expected_attribute])
90
- else
91
- raise ActionLogic::UnrecognizablePresenceValidatorError.new(error_message_format("Presence validator: #{expected_validation[:presence]} is not a supported format"))
92
- end
93
-
94
- collection
95
- end || []
96
-
97
- raise ActionLogic::PresenceError.new(presence_errors) if presence_errors.any?
98
- end
99
-
100
- def error_message_format(error_string)
101
- "context: #{self.class} message: #{error_string}"
102
- end
103
57
  end
104
58
  end
@@ -1,3 +1,3 @@
1
1
  module ActionLogic
2
- VERSION = '0.2.2'
2
+ VERSION = '0.2.3'
3
3
  end
@@ -5,7 +5,7 @@ module ActionLogic
5
5
  describe ActionConfiguration do
6
6
  subject { described_class }
7
7
 
8
- before do
8
+ after do
9
9
  described_class.reset!
10
10
  end
11
11
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_logic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rick Winfrey
@@ -84,9 +84,14 @@ files:
84
84
  - lib/action_logic/action_context.rb
85
85
  - lib/action_logic/action_coordinator.rb
86
86
  - lib/action_logic/action_core.rb
87
+ - lib/action_logic/action_includes.rb
87
88
  - lib/action_logic/action_task.rb
88
89
  - lib/action_logic/action_use_case.rb
89
90
  - lib/action_logic/action_validation.rb
91
+ - lib/action_logic/action_validation/attribute_validation.rb
92
+ - lib/action_logic/action_validation/base_validation.rb
93
+ - lib/action_logic/action_validation/presence_validation.rb
94
+ - lib/action_logic/action_validation/type_validation.rb
90
95
  - lib/action_logic/errors.rb
91
96
  - lib/action_logic/version.rb
92
97
  - resources/action_coordinator_diagram.png