lib/dentaku/calculator.rb in dentaku-3.3.4 vs lib/dentaku/calculator.rb in dentaku-3.4.0
- old
+ new
@@ -60,11 +60,11 @@
node = expression
node = ast(node) unless node.is_a?(AST::Node)
unbound = node.dependencies - memory.keys
unless unbound.empty?
raise UnboundVariableError.new(unbound),
- "no value provided for variables: #{unbound.join(', ')}"
+ "no value provided for variables: #{unbound.uniq.join(', ')}"
end
node.value(memory)
end
end
@@ -75,17 +75,25 @@
def solve(expression_hash, &block)
BulkExpressionSolver.new(expression_hash, self).solve(&block)
end
def dependencies(expression, context = {})
- if expression.is_a? Array
- return expression.flat_map { |e| dependencies(e, context) }
+ test_context = context.nil? ? {} : store(context) { memory }
+
+ case expression
+ when Dentaku::AST::Node
+ expression.dependencies(test_context)
+ when Array
+ expression.flat_map { |e| dependencies(e, context) }
+ else
+ ast(expression).dependencies(test_context)
end
- store(context) { ast(expression).dependencies(memory) }
end
def ast(expression)
+ return expression.map { |e| ast(e) } if expression.is_a? Array
+
@ast_cache.fetch(expression) {
options = {
case_sensitive: case_sensitive,
function_registry: @function_registry,
aliases: aliases
@@ -117,10 +125,10 @@
def store(key_or_hash, value = nil)
restore = Hash[memory]
if value.nil?
- key_or_hash = FlatHash.from_hash(key_or_hash) if nested_data_support
+ key_or_hash = FlatHash.from_hash_with_intermediates(key_or_hash) if nested_data_support
key_or_hash.each do |key, val|
memory[standardize_case(key.to_s)] = val
end
else
memory[standardize_case(key_or_hash.to_s)] = value