lib/scope.rb in expressive-0.0.3 vs lib/scope.rb in expressive-0.0.5

- old
+ new

@@ -1,74 +1,133 @@ -class Scope - def initialize(parent = {}) - @parent = parent - @symbols = {} - end +module Expressive + class Scope + def initialize(parent = {}) + @parent = parent + @symbols = {} + end - def [](name) - @symbols[name] || @parent[name] - end + def [](name) + @symbols[name] || @parent[name] + end - def []=(name, value) - @symbols[name] = value - end + def []=(name, value) + @symbols[name] = value + end - def merge(scope) - @symbols.merge!(scope) - end + def merge(scope) + @symbols.merge!(scope) + end - def override_scope(scope) - scope.merge!(@symbols) - @symbols = scope - end + def override_scope(scope) + scope.merge!(@symbols) + @symbols = scope + end - def retrieve_scope - @symbols - end + def retrieve_scope + @symbols + end - def define(name, &block) - self[name] = Function.new(&block) - end + def define(name, &block) + self[name] = Function.new(&block) + end - def syntax(name, &block) - self[name] = Syntax.new(&block) + def syntax(name, &block) + self[name] = Syntax.new(&block) + end end -end -class TopLevel < Scope - def initialize - super + class Webhook - syntax('set') do |scope, cells| - scope[cells.first.text_value] = cells[1].eval(scope) + def initialize(verb, url, params) + @verb, @url, @params = verb, url, params end - syntax('post') do |scope, cells| - uri = cells.shift.text_value.gsub('"', '') - payload = {} - cells.each do |key| - payload[key.text_value] = scope[key.text_value] + def execute + self.send(@verb) + end + + private + + def post + RestClient.post(@url, @params) end + + def get + RestClient.get(@url, {params: @params}) + end + + def put + RestClient.put(@url, @params) + end + + end + + class TopLevel < Scope + + def initialize + super + + syntax('set') do |scope, cells| + scope[cells.first.text_value] = cells[1].eval(scope) + end + + syntax('post') do |scope, cells| + perform_webhook(:post, scope, cells) + end + + syntax('put') do |scope, cells| + perform_webhook(:put, scope, cells) + end + + syntax('get') do |scope, cells| + perform_webhook(:get, scope, cells) + end + + define('+') {|a,b| a.to_f + b.to_f } + define('-') {|a,b| a.to_f - b.to_f } + define('*') {|a,b| a.to_f * b.to_f } + define('/') {|a,b| a.to_f / b.to_f } + define('=') {|a,b| a == b } + define('>') {|a,b| a.to_f > b.to_f } + define('<') {|a,b| a.to_f < b.to_f } + define('>=') {|a,b| a.to_f >= b.to_f } + define('<=') {|a,b| a.to_f <= b.to_f } + define('and') {|a,b| !!a && !!b } + define('or') {|a,b| !!a || !!b } + define('sum') { |*args| args.flatten.map(&:to_f).reduce(:+) } + define('if') { |*args| args.compact!; args[0] ? args[1] : args[2] } + end + + def to_hash + h = self.retrieve_scope.dup + h.delete_if{|k, v| v.kind_of?(Expressive::Function)} + end + + private + + #(post "http://example.com" name age other) + #(get "http://example.com" "*") + + def perform_webhook(verb, scope, cells) + url = cells.shift.text_value.gsub('"', '') + params = create_webhook_parameters(scope, cells) begin - response = RestClient.post uri, payload + response = Webhook.new(verb, url, params).execute scope = scope.merge(response) if response.is_a?(Hash) rescue RestClient::Exception => e scope['_errors'] = e.message end scope end - define('+') {|a,b| a.to_f + b.to_f } - define('-') {|a,b| a.to_f - b.to_f } - define('*') {|a,b| a.to_f * b.to_f } - define('/') {|a,b| a.to_f / b.to_f } - define('=') {|a,b| a == b } - define('>') {|a,b| a.to_f > b.to_f } - define('<') {|a,b| a.to_f < b.to_f } - define('>=') {|a,b| a.to_f >= b.to_f } - define('<=') {|a,b| a.to_f <= b.to_f } - define('and') {|a,b| !!a && !!b } - define('or') {|a,b| !!a || !!b } - define('sum') { |*args| args.flatten.map(&:to_f).reduce(:+) } - define('if') { |*args| args.compact!; args[0] ? args[1] : args[2] } + def create_webhook_parameters(scope, cells) + if cells.first && cells.first.text_value.gsub('"', '') == '*' + scope.to_hash + else + cells.inject({}) do |params, key| + params[key.text_value] = scope[key.text_value] + params + end + end + end end end