Class: XlsFunction::Evaluators::FunctionEvaluator
Direct Known Subclasses
BinaryOperationEvaluator, XlsFunction::Evaluators::Functions::Abs, XlsFunction::Evaluators::Functions::And, XlsFunction::Evaluators::Functions::Asc, XlsFunction::Evaluators::Functions::Char, XlsFunction::Evaluators::Functions::Clean, XlsFunction::Evaluators::Functions::Code, XlsFunction::Evaluators::Functions::Concat, XlsFunction::Evaluators::Functions::DateFn, XlsFunction::Evaluators::Functions::Datevalue, XlsFunction::Evaluators::Functions::Day, XlsFunction::Evaluators::Functions::Dbcs, XlsFunction::Evaluators::Functions::EDate, XlsFunction::Evaluators::Functions::EOMonth, XlsFunction::Evaluators::Functions::Exact, XlsFunction::Evaluators::Functions::Find, XlsFunction::Evaluators::Functions::Fixed, XlsFunction::Evaluators::Functions::Hour, XlsFunction::Evaluators::Functions::If, XlsFunction::Evaluators::Functions::Ifs, XlsFunction::Evaluators::Functions::Int, XlsFunction::Evaluators::Functions::Iserror, XlsFunction::Evaluators::Functions::Isnumber, XlsFunction::Evaluators::Functions::Lambda, XlsFunction::Evaluators::Functions::Lambda::Function, XlsFunction::Evaluators::Functions::Left, XlsFunction::Evaluators::Functions::Len, XlsFunction::Evaluators::Functions::Let, XlsFunction::Evaluators::Functions::Lower, XlsFunction::Evaluators::Functions::Mid, XlsFunction::Evaluators::Functions::Minute, XlsFunction::Evaluators::Functions::Month, XlsFunction::Evaluators::Functions::Not, XlsFunction::Evaluators::Functions::Now, XlsFunction::Evaluators::Functions::Or, XlsFunction::Evaluators::Functions::POWER, XlsFunction::Evaluators::Functions::Proper, XlsFunction::Evaluators::Functions::Replace, XlsFunction::Evaluators::Functions::Rept, XlsFunction::Evaluators::Functions::Right, XlsFunction::Evaluators::Functions::Round, XlsFunction::Evaluators::Functions::RoundDown, XlsFunction::Evaluators::Functions::RoundUp, XlsFunction::Evaluators::Functions::Second, XlsFunction::Evaluators::Functions::Sign, XlsFunction::Evaluators::Functions::Sqrt, XlsFunction::Evaluators::Functions::Substitute, XlsFunction::Evaluators::Functions::Switch, XlsFunction::Evaluators::Functions::Text, XlsFunction::Evaluators::Functions::TimeFn, XlsFunction::Evaluators::Functions::Timevalue, XlsFunction::Evaluators::Functions::Today, XlsFunction::Evaluators::Functions::Trim, XlsFunction::Evaluators::Functions::Trunc, XlsFunction::Evaluators::Functions::Unichar, XlsFunction::Evaluators::Functions::Unicode, XlsFunction::Evaluators::Functions::Upper, XlsFunction::Evaluators::Functions::Value, XlsFunction::Evaluators::Functions::Year, UserDefinedFunctionFactory::ProcFunction
Class Method Summary
collapse
Instance Method Summary
collapse
included
#class_info, #class_name, included, #rescue_with
included
Methods included from Evaluable
included
Constructor Details
Returns a new instance of FunctionEvaluator.
12
13
14
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 12
def initialize(context)
@context = context
end
|
Class Method Details
.create(context) ⇒ Object
105
106
107
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 105
def create(context)
new(context)
end
|
.to_h ⇒ Object
109
110
111
112
113
114
115
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 109
def to_h
{
class: name,
proc: to_proc,
description: translated_description
}
end
|
.to_proc(context = {}) ⇒ Object
121
122
123
124
125
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 121
def to_proc(context = {})
proc do |*arglist|
new(arglist, context).evaluate
end
end
|
.translated_description ⇒ Object
117
118
119
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 117
def translated_description
I18n.t("xls_function.descriptions.#{@register_key}", default: @description)
end
|
Instance Method Details
#arg_list ⇒ Object
16
17
18
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 16
def arg_list
@arg_list ||= Array(context[:arglist])
end
|
#before_eval ⇒ Object
33
34
35
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 33
def before_eval
eval_arglist
end
|
#convert_to(value, type) ⇒ Object
#detect_error(value) ⇒ Object
80
81
82
83
84
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 80
def detect_error(value)
return unless value.is_a?(XlsFunction::ErrorValue)
@error_value = value
end
|
#error? ⇒ Boolean
86
87
88
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 86
def error?
!!error_value
end
|
#error_message(key, **placeholders) ⇒ Object
98
99
100
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 98
def error_message(key, **placeholders)
I18n.t("xls_function.errors.#{key}", **placeholders)
end
|
#eval_arglist ⇒ Object
37
38
39
40
41
42
43
44
45
46
47
48
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 37
def eval_arglist
definitions = self.class.arg_definitions
return if definitions.empty?
definitions.zip(arg_list).each do |(name, default, type), arg|
value = arg ? evaluate_or_self(arg) : default
value = convert_to(value, type)
instance_variable_set(:"@#{name}", value)
detect_error(value)
break if error?
end
end
|
#eval_or_map_eval ⇒ Object
61
62
63
64
65
66
67
68
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 61
def eval_or_map_eval
args = defined_args
if args.any? { |arg| arg.is_a?(Array) }
map_eval(args)
else
eval
end
end
|
#evaluate(runtime_context = nil) ⇒ Object
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 21
def evaluate(runtime_context = nil)
rescue_with StandardError do
merge_context(runtime_context) do
before_eval
return error_value if error?
eval_or_map_eval
end
end
end
|
#evaluate_or_self(arg) ⇒ Object
50
51
52
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 50
def evaluate_or_self(arg)
arg.respond_to?(:evaluate) ? arg.evaluate(context) : arg
end
|
#map_eval(args) ⇒ Object
70
71
72
73
74
75
76
77
78
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 70
def map_eval(args)
arg_array = args.map { |x| Array(x) }
.then { |xs| xs.length == 1 ? xs : xs[0].product(*xs[1..]) }
return XlsFunction::ErrorValue.na(class_info(error_message(:invalid_value_for_function))) if arg_array.max_depth > 2
arg_array.map do |arg|
to_proc.call(*arg) end
end
|
#to_proc ⇒ Object
94
95
96
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 94
def to_proc
self.class.to_proc(context)
end
|
#variant_context ⇒ Object
90
91
92
|
# File 'lib/xls_function/evaluators/function_evaluator.rb', line 90
def variant_context
context[:variants]
end
|