strategize 0.0.3 → 0.0.4
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 +4 -4
- data/lib/strategize.rb +45 -11
- data/lib/strategize/configuration.rb +62 -0
- data/lib/strategize/evaluators/policy_evaluator.rb +17 -0
- data/lib/strategize/evaluators/rule_evaluator.rb +16 -0
- data/lib/strategize/exceptions.rb +12 -1
- data/lib/strategize/operations/operation.rb +4 -0
- data/lib/strategize/operations/operation_group.rb +1 -3
- data/lib/strategize/policies/policy.rb +11 -10
- data/lib/strategize/policies/policy_evaluation.rb +26 -0
- data/lib/strategize/policies/policy_evaluation_digest.rb +40 -0
- data/lib/strategize/policies/policy_group.rb +1 -14
- data/lib/strategize/rules/rule.rb +5 -1
- data/lib/strategize/rules/rule_evaluation.rb +10 -0
- data/lib/strategize/rules/rule_evaluation_digest.rb +30 -0
- data/lib/strategize/rules/rule_group.rb +4 -12
- data/test/configuration_test.rb +42 -0
- metadata +11 -7
- data/lib/strategize/policies/policy_result.rb +0 -33
- data/lib/strategize/policies/policy_result_collection.rb +0 -33
- data/lib/strategize/rules/rule_result.rb +0 -18
- data/lib/strategize/rules/rule_result_collection.rb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0c40c7d4e864ff616e141efe128f8a6f8f083cd
|
4
|
+
data.tar.gz: d63ed781fda44b7d40c094f76a8fc11fcda7b2e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e58b4dfaffbd76b72bf1a611e94a7fb09d163d8d36050db150f9113bf64d10c718d2d3d530c768cca975d6189da4ba84ff62b5043087eb62dbb9552e341bf47e
|
7
|
+
data.tar.gz: 0b7c23d50adc27568b82ae98034ce230fc57df357bf671bd9f917744a73ab3d35ca3efef31709a31ea1c0420ad8232851666d22107c1370a38e15075e15f6f87
|
data/lib/strategize.rb
CHANGED
@@ -1,20 +1,54 @@
|
|
1
1
|
module Strategize
|
2
2
|
# Rules
|
3
|
-
autoload :Rule,
|
4
|
-
autoload :RuleGroup,
|
5
|
-
autoload :
|
6
|
-
autoload :
|
3
|
+
autoload :Rule, 'strategize/rules/rule'
|
4
|
+
autoload :RuleGroup, 'strategize/rules/rule_group'
|
5
|
+
autoload :RuleEvaluation, 'strategize/rules/rule_evaluation'
|
6
|
+
autoload :RuleEvaluationDigest, 'strategize/rules/rule_evaluation_digest'
|
7
7
|
|
8
8
|
# Policies
|
9
|
-
autoload :Policy,
|
10
|
-
autoload :PolicyGroup,
|
11
|
-
autoload :
|
12
|
-
autoload :
|
9
|
+
autoload :Policy, 'strategize/policies/policy'
|
10
|
+
autoload :PolicyGroup, 'strategize/policies/policy_group'
|
11
|
+
autoload :PolicyEvaluation, 'strategize/policies/policy_evaluation'
|
12
|
+
autoload :PolicyEvaluationDigest, 'strategize/policies/policy_evaluation_digest'
|
13
|
+
|
14
|
+
# Evaluators
|
15
|
+
autoload :RuleEvaluator, 'strategize/evaluators/rule_evaluator'
|
16
|
+
autoload :PolicyEvaluator, 'strategize/evaluators/policy_evaluator'
|
13
17
|
|
14
18
|
# Operations
|
15
|
-
autoload :Operation,
|
16
|
-
autoload :OperationGroup,
|
19
|
+
autoload :Operation, 'strategize/operations/operation'
|
20
|
+
autoload :OperationGroup, 'strategize/operations/operation_group'
|
17
21
|
|
18
22
|
# Exceptions
|
19
|
-
autoload :NotPolicyError,
|
23
|
+
autoload :NotPolicyError, 'strategize/exceptions'
|
24
|
+
autoload :InvalidPredicateError, 'strategize/exceptions'
|
25
|
+
autoload :InvalidFunctionError, 'strategize/exceptions'
|
26
|
+
autoload :InvalidRuleEvaluator, 'strategize/exceptions'
|
27
|
+
autoload :InvalidPolicyEvaluator, 'strategize/exceptions'
|
28
|
+
|
29
|
+
# Configuration
|
30
|
+
autoload :Configuration, 'strategize/configuration'
|
31
|
+
|
32
|
+
class << self
|
33
|
+
# Get the configuration object for Strategize
|
34
|
+
#
|
35
|
+
# @return [Configuration]
|
36
|
+
def configuration
|
37
|
+
@configuration ||= Configuration.new
|
38
|
+
end
|
39
|
+
|
40
|
+
# Overwrite the current [Configuration] object
|
41
|
+
# with a new [Configuration] instance, which
|
42
|
+
# returns everything to default
|
43
|
+
def reset_configuration
|
44
|
+
@configuration = Configuration.new
|
45
|
+
end
|
46
|
+
|
47
|
+
# Pass a block of code that is executed against the
|
48
|
+
# [Configuration] instance
|
49
|
+
def configure
|
50
|
+
configuration = self.configuration
|
51
|
+
yield(configuration)
|
52
|
+
end
|
53
|
+
end
|
20
54
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Strategize
|
2
|
+
class Configuration
|
3
|
+
attr_reader :rule_evaluator, :policy_evaluator
|
4
|
+
|
5
|
+
# Create a new instance of [Configuration] class.
|
6
|
+
def initialize
|
7
|
+
@rule_evaluator = Strategize::RuleEvaluator
|
8
|
+
@policy_evaluator = Strategize::PolicyEvaluator
|
9
|
+
end
|
10
|
+
|
11
|
+
# Set the default class that is responsible for evaluating
|
12
|
+
# a [Rule]. The class must implement a method named evaluate
|
13
|
+
# that takes a subject and an array of rules.
|
14
|
+
#
|
15
|
+
# @param evaluator [Object] implements evaluate method
|
16
|
+
def rule_evaluator=(evaluator)
|
17
|
+
unless evaluator.new.respond_to?(:evaluate)
|
18
|
+
raise Strategize::InvalidRuleEvaluator, 'no evaluate method found'
|
19
|
+
end
|
20
|
+
|
21
|
+
@rule_evaluator = evaluator
|
22
|
+
end
|
23
|
+
|
24
|
+
# Set the default class that is responsible for evaluating
|
25
|
+
# a [Policy]. The class must implement a method named evaluate
|
26
|
+
# that takes a subject and an array of policies.
|
27
|
+
#
|
28
|
+
# @param evaluator [Object] implements evaluate method
|
29
|
+
def policy_evaluator=(evaluator)
|
30
|
+
unless evaluator.new(rule_evaluator).respond_to?(:evaluate)
|
31
|
+
raise Strategize::InvalidPolicyEvaluator, 'no evaluate method found'
|
32
|
+
end
|
33
|
+
|
34
|
+
@policy_evaluator = evaluator
|
35
|
+
end
|
36
|
+
|
37
|
+
# Get a hash of all the policies groups that have been defined
|
38
|
+
#
|
39
|
+
# @return [Hash]
|
40
|
+
def policy_groups
|
41
|
+
@policy_groups ||= {}
|
42
|
+
end
|
43
|
+
|
44
|
+
# Add a policy group to the policy_groups hash
|
45
|
+
#
|
46
|
+
# @param name [Symbol] a descriptive name for the [PolicyGroup]
|
47
|
+
# @param [Proc] the block of code detailing which [Policy] to add
|
48
|
+
def add_policy_group(name)
|
49
|
+
policy_groups[name] = PolicyGroup.new unless policy_groups.key?(name)
|
50
|
+
policy_group = policy_groups[name]
|
51
|
+
yield(policy_group)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get a specific [PolicyGroup] that has been defined in [Configuration]
|
55
|
+
#
|
56
|
+
# @param name [Symbol] the name of the policy-group that you want
|
57
|
+
# @return [PolicyGroup]
|
58
|
+
def policy_group(name)
|
59
|
+
policy_groups[name]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Strategize
|
2
|
+
class PolicyEvaluator
|
3
|
+
def initialize(rule_evaluator)
|
4
|
+
@rule_evaluator = rule_evaluator
|
5
|
+
end
|
6
|
+
|
7
|
+
def evaluate(*policies, subject)
|
8
|
+
policies.flatten!
|
9
|
+
results = policies.map do |policy|
|
10
|
+
rules = policy.rule_group.rules
|
11
|
+
rule_digest = @rule_evaluator.evaluate(subject, rules)
|
12
|
+
PolicyEvaluation.new(policy, rule_digest)
|
13
|
+
end
|
14
|
+
PolicyEvaluationDigest.new(results, subject)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Strategize
|
2
|
+
class RuleEvaluator
|
3
|
+
# Given an array of rules, evaluates each rule and returns
|
4
|
+
# the results
|
5
|
+
#
|
6
|
+
# @param rules [Array<Rule>] rules to be evaluated
|
7
|
+
# @param subject [Object] the object to evaluate rules against
|
8
|
+
def evaluate(subject, *rules)
|
9
|
+
rules.flatten!
|
10
|
+
results = rules.map do |rule|
|
11
|
+
RuleEvaluation.new(rule, rule.evaluate(subject))
|
12
|
+
end
|
13
|
+
RuleEvaluationDigest.new(results, subject)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,5 +1,16 @@
|
|
1
1
|
module Strategize
|
2
2
|
# Raised when a class does not include
|
3
|
-
# the Stategize::Policy module.
|
3
|
+
# the Stategize::Policy module.
|
4
4
|
NotPolicyError = Class.new(RuntimeError)
|
5
|
+
|
6
|
+
# Raised when an object that does not respond to
|
7
|
+
# call is provided in [Rule] initialization.
|
8
|
+
InvalidPredicateError = Class.new(RuntimeError)
|
9
|
+
|
10
|
+
# Raised when an object that does not respond to
|
11
|
+
# call is provided in [Operation] initialization.
|
12
|
+
InvalidFunctionError = Class.new(RuntimeError)
|
13
|
+
|
14
|
+
InvalidRuleEvaluator = Class.new(RuntimeError)
|
15
|
+
InvalidPolicyEvaluator = Class.new(RuntimeError)
|
5
16
|
end
|
@@ -18,6 +18,10 @@ module Strategize
|
|
18
18
|
# @param function [Proc] the code to be executed
|
19
19
|
# @return [Operation]
|
20
20
|
def initialize(name, function)
|
21
|
+
unless function.respond_to?(:call)
|
22
|
+
raise InvalidFunctionError, 'Invalid function in Operation'
|
23
|
+
end
|
24
|
+
|
21
25
|
@name = name
|
22
26
|
@function = function
|
23
27
|
end
|
@@ -25,10 +25,8 @@ module Strategize
|
|
25
25
|
# @param subject [Hash] a hash of operation names and subjects
|
26
26
|
def run(subjects)
|
27
27
|
the_subjects = subjects
|
28
|
+
the_subjects = build_subjects_hash(subjects) unless subjects.is_a?(Hash)
|
28
29
|
|
29
|
-
if !subjects.is_a?(Hash)
|
30
|
-
the_subjects = build_subjects_hash(subjects)
|
31
|
-
end
|
32
30
|
|
33
31
|
@operations.each do |operation|
|
34
32
|
subject = the_subjects[operation.name]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Strategize
|
2
|
-
# The policy module allows you to define rules and
|
3
|
-
# any class that it is included on
|
2
|
+
# The policy module allows you to define rules and operations on
|
3
|
+
# any class that it is included on
|
4
4
|
module Policy
|
5
5
|
def self.included(base)
|
6
6
|
base.extend(ClassMethods)
|
@@ -10,31 +10,32 @@ module Strategize
|
|
10
10
|
# These methods will be placed on the class that includes
|
11
11
|
# the Policy module.
|
12
12
|
module ClassMethods
|
13
|
-
# Get
|
13
|
+
# Get the [RuleGroup] container that has all the
|
14
|
+
# rules defined on the policy
|
14
15
|
#
|
15
16
|
# @return [RuleGroup]
|
16
|
-
def
|
17
|
-
@
|
17
|
+
def rule_group
|
18
|
+
@rule_group ||= RuleGroup.new
|
18
19
|
end
|
19
20
|
|
20
|
-
# Get
|
21
|
+
# Get the [OperationGroup] container that has all the
|
22
|
+
# operations defined on the policy
|
21
23
|
#
|
22
24
|
# @return [OperationGroup]
|
23
25
|
def operations
|
24
26
|
@operations ||= OperationGroup.new
|
25
27
|
end
|
26
28
|
|
27
|
-
# Define a
|
29
|
+
# Define and add a [Rule] to the [RuleGroup] container
|
28
30
|
#
|
29
31
|
# @param name [Symbol] descriptive name for the rule
|
30
32
|
# @param predicate [Proc] code to execute
|
31
33
|
# @return [void]
|
32
34
|
def rule(name, predicate)
|
33
|
-
|
35
|
+
rule_group.add(name, predicate)
|
34
36
|
end
|
35
37
|
|
36
|
-
# Define
|
37
|
-
# method
|
38
|
+
# Define and add an [Operation] to the [OperationGroup] container
|
38
39
|
#
|
39
40
|
# @param name [Symbol] the name of the context for the operation
|
40
41
|
# @param block [Proc] the code block to execute
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Strategize
|
2
|
+
# Provides information on a single policy evaluation.
|
3
|
+
# This includes the policy that was evaluated and
|
4
|
+
# the evaluation digest for the rules defined on
|
5
|
+
# the policy.
|
6
|
+
class PolicyEvaluation
|
7
|
+
attr_reader :policy, :rule_digest
|
8
|
+
|
9
|
+
# Create a new PolicyEvaluation
|
10
|
+
#
|
11
|
+
# @param policy [Policy]
|
12
|
+
# @param rule_result_collection [RuleEvaluationDigest]
|
13
|
+
# @return [PolicyResult]
|
14
|
+
def initialize(policy, rule_digest)
|
15
|
+
@policy = policy
|
16
|
+
@rule_digest = rule_digest
|
17
|
+
end
|
18
|
+
|
19
|
+
# Determine if all the rules defined on the policy
|
20
|
+
# evaluated to true.
|
21
|
+
# @return [Boolean]
|
22
|
+
def result
|
23
|
+
@rule_digest.result
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Strategize
|
2
|
+
# Represents a container for evaluations performed against each
|
3
|
+
# policy provided in the initializer
|
4
|
+
class PolicyEvaluationDigest
|
5
|
+
# @return [Array<PolicyEvaluation>] the evaluation for each policy
|
6
|
+
attr_reader :evaluations
|
7
|
+
|
8
|
+
# @return [Object] the subject the policy was executed against
|
9
|
+
attr_reader :subject
|
10
|
+
|
11
|
+
# Create a new PolicyEvaluationDigest
|
12
|
+
#
|
13
|
+
# @param evaluations [Array<PolicyEvaluation>]
|
14
|
+
# @param subject [Object] the subject the policies were executed against
|
15
|
+
def initialize(evaluations, subject)
|
16
|
+
@evaluations = evaluations
|
17
|
+
@subject = subject
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return all the policies where all the rules defined on the
|
21
|
+
# policy evaluated to true
|
22
|
+
#
|
23
|
+
# @return [Array<Policy>]
|
24
|
+
def passed
|
25
|
+
@evaluations
|
26
|
+
.select { |evaluation| evaluation.result == true }
|
27
|
+
.map(&:policy)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return all the policies where one or more rules defined on the
|
31
|
+
# policy evaluated to false.
|
32
|
+
#
|
33
|
+
# @return [Array<Policy>]
|
34
|
+
def failed
|
35
|
+
@evaluations
|
36
|
+
.select { |evaluation| evaluation.result == false }
|
37
|
+
.map(&:policy)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Strategize
|
2
|
-
#
|
3
|
-
# multiple policies.
|
2
|
+
# A collection of policies.
|
4
3
|
class PolicyGroup
|
5
4
|
attr_reader :policies
|
6
5
|
|
@@ -18,18 +17,6 @@ module Strategize
|
|
18
17
|
@policies.push(policy)
|
19
18
|
end
|
20
19
|
|
21
|
-
# Evaluate each policy against a given subject.
|
22
|
-
#
|
23
|
-
# @param subject [Object]
|
24
|
-
# @return [PolicyResultCollection]
|
25
|
-
def evaluate(subject)
|
26
|
-
results = @policies.map do |policy|
|
27
|
-
result_collection = policy.rules.evaluate(subject)
|
28
|
-
PolicyResult.new(policy, result_collection)
|
29
|
-
end
|
30
|
-
PolicyResultCollection.new(results, subject)
|
31
|
-
end
|
32
|
-
|
33
20
|
private
|
34
21
|
|
35
22
|
# Check if a policy includes the Policy module
|
@@ -7,7 +7,7 @@ module Strategize
|
|
7
7
|
#
|
8
8
|
# Evaluate a rule
|
9
9
|
# rule = Rule.new :rule_name, -> { true }
|
10
|
-
# rule.evaluate(nil) #=> true
|
10
|
+
# rule.evaluate(nil) #=> true
|
11
11
|
class Rule
|
12
12
|
attr_reader :name, :predicate
|
13
13
|
|
@@ -16,6 +16,10 @@ module Strategize
|
|
16
16
|
# @param name [Symbol] a descriptive name for the rule
|
17
17
|
# @param predicate [Proc] code block to be executed
|
18
18
|
def initialize(name, predicate)
|
19
|
+
unless predicate.respond_to?(:call)
|
20
|
+
raise InvalidPredicateError, 'Invalid predicate function passed'
|
21
|
+
end
|
22
|
+
|
19
23
|
@name = name
|
20
24
|
@predicate = predicate
|
21
25
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Strategize
|
2
|
+
class RuleEvaluationDigest
|
3
|
+
attr_reader :evaluations, :subject
|
4
|
+
|
5
|
+
def initialize(evaluations, subject)
|
6
|
+
@evaluations = evaluations
|
7
|
+
@subject = subject
|
8
|
+
end
|
9
|
+
|
10
|
+
def result
|
11
|
+
@evaluations.all?(&:result)
|
12
|
+
end
|
13
|
+
|
14
|
+
def rules
|
15
|
+
@evaluations.map(&:rule)
|
16
|
+
end
|
17
|
+
|
18
|
+
def passed
|
19
|
+
@evaluations
|
20
|
+
.select { |evaluation| evaluation.result == true }
|
21
|
+
.map(&:rule)
|
22
|
+
end
|
23
|
+
|
24
|
+
def failed
|
25
|
+
@evaluations
|
26
|
+
.select { |evaluation| evaluation.result == false }
|
27
|
+
.map(&:rule)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Strategize
|
2
|
-
#
|
2
|
+
# A wrapper around an array of rules
|
3
3
|
class RuleGroup
|
4
4
|
attr_reader :rules
|
5
5
|
|
@@ -10,7 +10,7 @@ module Strategize
|
|
10
10
|
@rules = rules
|
11
11
|
end
|
12
12
|
|
13
|
-
# Add [Rule] to
|
13
|
+
# Add [Rule] to the group
|
14
14
|
#
|
15
15
|
# @param name [Symbol] a descriptive name for the rule
|
16
16
|
# @param predicate [Lambda] a function that returns true or false
|
@@ -18,16 +18,8 @@ module Strategize
|
|
18
18
|
@rules.push(Rule.new(name, predicate))
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
#
|
24
|
-
# @param subject [Object] object to evaluate rules against
|
25
|
-
# @return [RuleResultCollection] evaluation results
|
26
|
-
def evaluate(subject)
|
27
|
-
results = @rules.map do |rule|
|
28
|
-
RuleResult.new(rule, rule.evaluate(subject))
|
29
|
-
end
|
30
|
-
RuleResultCollection.new(results, subject)
|
21
|
+
def <<(name, predicate)
|
22
|
+
add(name, predicate)
|
31
23
|
end
|
32
24
|
end
|
33
25
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ConfigurationTest < Minitest::Test
|
4
|
+
def test_configuration_is_available
|
5
|
+
config = Strategize.configuration
|
6
|
+
refute config.nil?
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_can_configure_from_block
|
10
|
+
Strategize.configure do |config|
|
11
|
+
config.rule_evaluator = TestRuleEvaluator
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_can_add_policy_group
|
16
|
+
Strategize.configure do |config|
|
17
|
+
config.add_policy_group(:omniauth) do |group|
|
18
|
+
group.add DummyPolicy
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
refute Strategize.configuration.policy_groups.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_can_get_policy_group
|
26
|
+
Strategize.configure do |config|
|
27
|
+
config.add_policy_group(:omniauth) do |group|
|
28
|
+
group.add DummyPolicy
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
policy_group = Strategize.configuration.policy_group(:omniauth)
|
33
|
+
policies = policy_group.policies
|
34
|
+
|
35
|
+
assert policy_group.is_a?(Strategize::PolicyGroup)
|
36
|
+
assert policies.include?(DummyPolicy)
|
37
|
+
end
|
38
|
+
|
39
|
+
def teardown
|
40
|
+
Strategize.reset_configuration
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strategize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jdmorlan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest-reporters
|
@@ -45,17 +45,21 @@ extensions: []
|
|
45
45
|
extra_rdoc_files: []
|
46
46
|
files:
|
47
47
|
- lib/strategize.rb
|
48
|
+
- lib/strategize/configuration.rb
|
49
|
+
- lib/strategize/evaluators/policy_evaluator.rb
|
50
|
+
- lib/strategize/evaluators/rule_evaluator.rb
|
48
51
|
- lib/strategize/exceptions.rb
|
49
52
|
- lib/strategize/operations/operation.rb
|
50
53
|
- lib/strategize/operations/operation_group.rb
|
51
54
|
- lib/strategize/policies/policy.rb
|
55
|
+
- lib/strategize/policies/policy_evaluation.rb
|
56
|
+
- lib/strategize/policies/policy_evaluation_digest.rb
|
52
57
|
- lib/strategize/policies/policy_group.rb
|
53
|
-
- lib/strategize/policies/policy_result.rb
|
54
|
-
- lib/strategize/policies/policy_result_collection.rb
|
55
58
|
- lib/strategize/rules/rule.rb
|
59
|
+
- lib/strategize/rules/rule_evaluation.rb
|
60
|
+
- lib/strategize/rules/rule_evaluation_digest.rb
|
56
61
|
- lib/strategize/rules/rule_group.rb
|
57
|
-
-
|
58
|
-
- lib/strategize/rules/rule_result_collection.rb
|
62
|
+
- test/configuration_test.rb
|
59
63
|
- test/test_helper.rb
|
60
64
|
homepage: https://github.com/jdmorlan/strategize
|
61
65
|
licenses:
|
@@ -82,5 +86,5 @@ signing_key:
|
|
82
86
|
specification_version: 4
|
83
87
|
summary: Validate rules and perform operations
|
84
88
|
test_files:
|
89
|
+
- test/configuration_test.rb
|
85
90
|
- test/test_helper.rb
|
86
|
-
has_rdoc:
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Strategize
|
2
|
-
# A PolicyResult is returned when you evaluate
|
3
|
-
# a PolicyGroup and allows you to view the
|
4
|
-
# RuleResultCollection and whether the policy
|
5
|
-
# was valid (all rules returned true)
|
6
|
-
class PolicyResult
|
7
|
-
attr_reader :policy, :rule_group, :subject
|
8
|
-
|
9
|
-
# Create a new PolicyEvaluation
|
10
|
-
#
|
11
|
-
# @param policy [Policy]
|
12
|
-
# @param rule_result_collection [RuleResultCollection]
|
13
|
-
# @return [PolicyResult]
|
14
|
-
def initialize(policy, rule_result_collection)
|
15
|
-
@policy = policy
|
16
|
-
@rule_result_collection = rule_result_collection
|
17
|
-
end
|
18
|
-
|
19
|
-
# Check if all the rules for the policy evaluated to true
|
20
|
-
#
|
21
|
-
# @return [Boolean]
|
22
|
-
def valid?
|
23
|
-
@rule_result_collection.all_valid?
|
24
|
-
end
|
25
|
-
|
26
|
-
# Get the results for rules on the policy
|
27
|
-
#
|
28
|
-
# @return [RuleResultCollection]
|
29
|
-
def rules
|
30
|
-
@rule_result_collection
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Strategize
|
2
|
-
# A wrapper for an array of PolicyResult instances.
|
3
|
-
class PolicyResultCollection
|
4
|
-
# @return [Array<PolicyResult>] the policy results for each policy
|
5
|
-
attr_reader :items
|
6
|
-
|
7
|
-
# @return [Object] the subject the policy was executed against
|
8
|
-
attr_reader :subject
|
9
|
-
|
10
|
-
# Create a new PolicyResultCollection
|
11
|
-
#
|
12
|
-
# @param policy_results [Array<PolicyResult]
|
13
|
-
# @param subject [Object] the subject the policies were executed against
|
14
|
-
def initialize(policy_results, subject)
|
15
|
-
@items = policy_results
|
16
|
-
@subject = subject
|
17
|
-
end
|
18
|
-
|
19
|
-
# Get an array of the PolicyResults that are valid, or return true
|
20
|
-
#
|
21
|
-
# @return [Array<PolicyResult>]
|
22
|
-
def passed
|
23
|
-
@items.select(&:valid)
|
24
|
-
end
|
25
|
-
|
26
|
-
# Get an array of the PolicyResults that are invalid, or return false
|
27
|
-
#
|
28
|
-
# @return [Array<PolicyResult>]
|
29
|
-
def failed
|
30
|
-
@items.select { |rule| !rule.valid? }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Strategize
|
2
|
-
# A RuleResult represents the evaluation result, which gives
|
3
|
-
# you access to the Rule and whether it was valid or not.
|
4
|
-
class RuleResult
|
5
|
-
attr_reader :rule, :valid
|
6
|
-
|
7
|
-
# Create a new RuleResult which provides details on
|
8
|
-
# the evaluation of a rule.
|
9
|
-
#
|
10
|
-
# @param rule [Rule] the evaluated rule
|
11
|
-
# @param valid [Boolean] the result of the executed rule
|
12
|
-
# @return [RuleResult]
|
13
|
-
def initialize(rule, valid)
|
14
|
-
@rule = rule
|
15
|
-
@valid = valid
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Strategize
|
2
|
-
# Represents a collection of RuleResults, which lets you see
|
3
|
-
# what rules passed, failed, etc.
|
4
|
-
class RuleResultCollection
|
5
|
-
attr_reader :items, :subject
|
6
|
-
|
7
|
-
# Create a new RuleResultCollection
|
8
|
-
#
|
9
|
-
# @param rule_results [Array<RuleResult>]
|
10
|
-
# @param subject [Object]
|
11
|
-
# @return [RuleResultCollection]
|
12
|
-
def initialize(rule_results, subject)
|
13
|
-
@items = rule_results
|
14
|
-
@subject = subject
|
15
|
-
end
|
16
|
-
|
17
|
-
# Iterate over each [RuleResult] in the items Array.
|
18
|
-
#
|
19
|
-
# @param block [Proc]
|
20
|
-
def each(&block)
|
21
|
-
@items.each { |item| block.call(item) }
|
22
|
-
end
|
23
|
-
|
24
|
-
# Returns if all rules evaluated to true
|
25
|
-
#
|
26
|
-
# @return [Boolean]
|
27
|
-
def all_valid?
|
28
|
-
@items.all?(&:valid)
|
29
|
-
end
|
30
|
-
|
31
|
-
# Returns all rules that evaluated to true
|
32
|
-
#
|
33
|
-
# @return [Array<RuleResult>]
|
34
|
-
def passed
|
35
|
-
@items.select(&:valid)
|
36
|
-
end
|
37
|
-
|
38
|
-
# Returns all rules that evaluated to false
|
39
|
-
#
|
40
|
-
# @return [Array<RuleResult>]
|
41
|
-
def failed
|
42
|
-
@items.select { |rule| !rule.valid }
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|