carry_out 1.3.0 → 1.3.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93f80c00a226b8751663d149943b30aeb5c2dd35
4
- data.tar.gz: 4561dba1b6110b7dbc1a4712ba4fde4204910608
3
+ metadata.gz: c9a566c008472e7b69aa21de4ce6c6948a272281
4
+ data.tar.gz: 854adbd99187223c1570e1a3413d1078188ba424
5
5
  SHA512:
6
- metadata.gz: 3f5521e863a205ae3345357df363613e5ef14c29974a31e08f67367aab963c0c7303caa2a43fa78db1dab3d8b8890fe18825dbf4273e1a7f7f27b538ca4f84bc
7
- data.tar.gz: a390316064acff75e07c46dbb9124278bdcc27baa9584a1f75de23cf4be38a894dd27adb7a27759c6edbafe9c3353222d5c0d85832199f16b88426104dbc46ea
6
+ metadata.gz: 021eabede07162f55d58da20cd46026c1c1a0bc13b8a9b01c299144a6707b4b1176c3745ed9bf9b20873979a4a3abe30183b01dbd25fc7cf3217fe957ef112ef
7
+ data.tar.gz: d5737328744baa7c38dc633a93586c204ddce4d88ff7e68e84eaa805456c8e47a9c6c8cbcef773ce5d9922119fe743328b7f8c3050e9c92893d049bb94492626
@@ -0,0 +1,32 @@
1
+ # A Closure Is Not Always A Closure In Ruby - Alan Skorkin
2
+ # http://www.skorks.com/2013/03/a-closure-is-not-always-a-closure-in-ruby/
3
+
4
+ module CarryOut
5
+ module Cloaker
6
+ def cloaker(binding = nil, &b)
7
+ meth = self.class.class_eval do
8
+ define_method :cloaker_, &b
9
+ meth = instance_method :cloaker_
10
+ remove_method :cloaker_
11
+ meth
12
+ end
13
+
14
+ with_previous_context(binding || b.binding) { meth.bind(self).call }
15
+ end
16
+
17
+ def with_previous_context(binding, &block)
18
+ @previous_context = binding.eval('self')
19
+ result = block.call
20
+ @previous_context = nil
21
+ result
22
+ end
23
+
24
+ def method_missing(method, *args, &block)
25
+ if @previous_context && @previous_context.respond_to?(method)
26
+ @previous_context.send(method, *args, &block)
27
+ else
28
+ super
29
+ end
30
+ end
31
+ end
32
+ end
@@ -53,8 +53,6 @@ module CarryOut
53
53
  def method_missing(method, *args, &block)
54
54
  if respond_to?(method)
55
55
  @messages.push({ method: method, source: block || (args.length == 0 ? true : args.first) })
56
- else
57
- raise NoMethodError, "undefined method `#{method}' for #{@action}"
58
56
  end
59
57
  end
60
58
 
@@ -1,6 +1,10 @@
1
+ require "carry_out/cloaker"
2
+
1
3
  module CarryOut
2
4
  module Plan
3
5
  class NodeContext
6
+ include CarryOut::Cloaker
7
+
4
8
  def initialize(node)
5
9
  @node = node
6
10
  end
@@ -10,7 +14,7 @@ module CarryOut
10
14
  end
11
15
 
12
16
  def context(*args)
13
- -> (context) do
17
+ Proc.new do |context|
14
18
  args.inject(context) { |c, k| c.nil? ? nil : c[k] }
15
19
  end
16
20
  end
@@ -24,7 +28,11 @@ module CarryOut
24
28
  end
25
29
 
26
30
  def method_missing(method, *args, &block)
27
- @node.send(method, *args, &block)
31
+ if @node.respond_to?(method)
32
+ @node.send(method, *args, &block)
33
+ else
34
+ super
35
+ end
28
36
  end
29
37
 
30
38
  def respond_to?(method)
@@ -3,19 +3,26 @@ require "carry_out/plan/node_context"
3
3
 
4
4
  module CarryOut
5
5
  class PlanBuilder
6
+ include Cloaker
7
+
8
+ attr_reader :plan
9
+
6
10
  def initialize(options = {}, &block)
7
11
  @plan = Plan::Node.new
8
- @wrapper = nil
9
12
  @constant_resolver = [ options[:search] ].flatten(1)
13
+ @block_binding = options[:block_binding]
10
14
 
11
15
  configure_node(@plan, &block) if block
12
16
  end
13
17
 
14
- attr_reader :plan
15
-
16
18
  def self.build(options = {}, &block)
19
+ options = {
20
+ block_binding: block.binding
21
+ }.merge(options)
22
+
17
23
  builder = PlanBuilder.new(options)
18
- builder.instance_eval(&block)
24
+
25
+ builder.cloaker(&block)
19
26
  builder.plan
20
27
  end
21
28
 
@@ -36,7 +43,7 @@ module CarryOut
36
43
  obj = find_object(method)
37
44
 
38
45
  if obj
39
- call(method, &block)
46
+ call(obj, &block)
40
47
  else
41
48
  super
42
49
  end
@@ -46,7 +53,7 @@ module CarryOut
46
53
  attr_writer :current_node
47
54
 
48
55
  def configure_node(node, &block)
49
- Plan::NodeContext.new(node).instance_eval(&block)
56
+ Plan::NodeContext.new(node).cloaker(@block_binding, &block)
50
57
  end
51
58
 
52
59
  def current_node
@@ -13,8 +13,7 @@ module CarryOut
13
13
  if node_result.kind_of?(Plan::NodeResult)
14
14
  plan_result.add(node.returns_as, node_result.value)
15
15
  end
16
- rescue StandardError => error
17
- error = CarryOut::Error.new(error.message, error) unless error.kind_of?(CarryOut::Error)
16
+ rescue CarryOut::Error => error
18
17
  plan_result.add node.returns_as, error
19
18
  end
20
19
 
@@ -26,7 +25,7 @@ module CarryOut
26
25
 
27
26
  def self.call_unit(unit, context = {}, &block)
28
27
  node = Plan::Node.new(unit)
29
- Plan::NodeContext.new(node).instance_eval(&block) unless block.nil?
28
+ Plan::NodeContext.new(node).cloaker(&block) unless block.nil?
30
29
 
31
30
  call(node, context)
32
31
  end
@@ -5,6 +5,12 @@ module CarryOut
5
5
  raise "Expected #{self.class} to define #{self.class}#call" unless self.class == Unit
6
6
  end
7
7
 
8
+ def initialize
9
+ self.class.parameter_defaults.each do |p, d|
10
+ instance_variable_set("@#{p}", d)
11
+ end
12
+ end
13
+
8
14
  def self.call(&block)
9
15
  unit = self.new
10
16
  yield unit if block
@@ -31,13 +37,24 @@ module CarryOut
31
37
  end
32
38
  end
33
39
 
34
- def self.parameter(method_name, var = nil)
40
+ def self.parameter(method_name, var = nil, options = {})
41
+ if var.kind_of?(Hash)
42
+ options = var
43
+ var = nil
44
+ end
45
+
35
46
  var ||= method_name
36
47
 
37
48
  define_method(method_name.to_sym) do |*args|
38
49
  instance_variable_set("@#{var}", args.length == 0 ? true : args.first)
39
50
  self
40
51
  end
52
+
53
+ parameter_defaults[var] = options[:default] unless options[:default].nil?
54
+ end
55
+
56
+ def self.parameter_defaults
57
+ @parameter_defaults ||= {}
41
58
  end
42
59
  end
43
60
  end
@@ -1,3 +1,3 @@
1
1
  module CarryOut
2
- VERSION = "1.3.0"
2
+ VERSION = "1.3.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carry_out
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Fields
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-14 00:00:00.000000000 Z
11
+ date: 2017-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -102,6 +102,7 @@ files:
102
102
  - bin/setup
103
103
  - carry_out.gemspec
104
104
  - lib/carry_out.rb
105
+ - lib/carry_out/cloaker.rb
105
106
  - lib/carry_out/configurator.rb
106
107
  - lib/carry_out/error.rb
107
108
  - lib/carry_out/plan/guard.rb