checkoff 0.58.1 → 0.60.0

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.
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Checkoff
4
+ # Base class to evaluate Asana resource selectors against an Asana resource
5
+ class SelectorEvaluator
6
+ # @param selector [Array]
7
+ # @return [Boolean, Object, nil]
8
+ def evaluate(selector)
9
+ return true if selector.empty?
10
+
11
+ function_evaluators.each do |evaluator_class|
12
+ # @type [SelectorClasses::FunctionEvaluator]
13
+ # @sg-ignore
14
+ evaluator = evaluator_class.new(selector: selector,
15
+ **initializer_kwargs)
16
+
17
+ next unless evaluator.matches?
18
+
19
+ return try_this_evaluator(selector, evaluator)
20
+ end
21
+
22
+ raise "Syntax issue trying to handle #{selector.inspect}"
23
+ end
24
+
25
+ private
26
+
27
+ # @return [Hash]
28
+ def initializer_kwargs
29
+ {}
30
+ end
31
+
32
+ # @return [Array<Class<FunctionEvaluator>>]
33
+ # @sg-ignore
34
+ def function_evaluators
35
+ raise 'Implement me!'
36
+ end
37
+
38
+ # @param selector [Array]
39
+ # @param evaluator [SelectorClasses::FunctionEvaluator]
40
+ # @return [Array]
41
+ def evaluate_args(selector, evaluator)
42
+ return [] unless selector.is_a?(Array)
43
+
44
+ selector[1..].map.with_index do |item, index|
45
+ if evaluator.evaluate_arg?(index)
46
+ evaluate(item)
47
+ else
48
+ item
49
+ end
50
+ end
51
+ end
52
+
53
+ # @param selector [Array]
54
+ # @param evaluator [SelectorClasses::FunctionEvaluator]
55
+ # @return [Boolean, Object, nil]
56
+ def try_this_evaluator(selector, evaluator)
57
+ # if selector is an array
58
+ evaluated_args = evaluate_args(selector, evaluator)
59
+
60
+ evaluator.evaluate(item, *evaluated_args)
61
+ end
62
+
63
+ # @return [Asana::Resources::Resource]
64
+ attr_reader :item
65
+ end
66
+ end