lib/soroban/sheet.rb in soroban-0.7.2 vs lib/soroban/sheet.rb in soroban-0.7.3
- old
+ new
@@ -1,10 +1,9 @@
require 'soroban/helpers'
require 'soroban/functions'
require 'soroban/label_walker'
require 'soroban/value_walker'
-require 'soroban/tabulator'
require 'soroban/cell'
require 'set'
module Soroban
@@ -15,66 +14,14 @@
# Creates a new sheet.
def initialize(logger=nil)
@logger = logger
@cells = {}
- @compiled = {}
@changes = Hash.new{ |h, k| h[k] = Set.new }
@bindings = {}
end
- def factory(name)
- eval(self.to_ruby(name), TOPLEVEL_BINDING)
- Object::const_get('Soroban').const_get('Model').const_get(name).new
- end
-
- # Return a string containing a ruby class that implements the sheet. You can
- # call eval() on this string to create the class, which you can then
- # instantiate. Set inputs on the instance and read outputs off.
- def to_ruby(class_name)
- data = []
- data << "module Soroban"
- data << "module Model"
- data << "class #{class_name}"
- data << " def initialize"
- data << " @binds = {"
- data << bindings.map do |name, cell|
- " '#{name}' => :#{cell}"
- end.join(",\n")
- data << " }"
- data << " @cache = {}"
- data << " @cells = {"
- data << @compiled.map do |label, cell|
- " :#{label} => lambda { @cache[:#{label}] ||= #{cell.to_compiled_ruby} }"
- end.join(",\n")
- data << " }"
- data << " end"
- data << " def clear"
- data << " @cache.clear"
- data << " end"
- data << " def get(name)"
- data << " @cells[@binds[name]].call"
- data << " end"
- data << " def set(name, value)"
- data << " self.clear"
- data << " @cells[@binds[name]] = lambda { @cache[@binds[name]] ||= value }"
- data << " end"
- bindings.each do |name, cell|
- data << " def #{name}"
- data << " get('#{name}')"
- data << " end"
- data << " def #{name}=(value)"
- data << " set('#{name}', value)"
- data << " end"
- end
- data << "end"
- data << "end"
- data << "end"
- puts data.join("\n")
- data.join("\n")
- end
-
# Used for calling dynamically defined functions, and for creating new
# cells (via `label=`).
def method_missing(method, *args, &block)
if match = /^func_(.*)$/i.match(method.to_s)
return Soroban::call(self, match[1], *args)
@@ -178,10 +125,9 @@
return
end
internal = "@#{label}"
_expose(internal, label)
cell = Cell.new(binding)
- @compiled[label] = cell
_set(label, cell, contents)
instance_variable_set(internal, cell)
end
def _set(label_or_name, cell, contents)