Guest User

Untitled

a guest
Feb 20th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. require 'rubygems'
  2. require 'nakajima'
  3.  
  4. if RUBY_VERSION < "1.9"
  5. require 'builder/blankslate'
  6. BasicObject = BlankSlate
  7. end
  8.  
  9. class ContextEvaluator < BasicObject
  10. def initialize(*contexts)
  11. @contexts = contexts
  12. end
  13.  
  14. def method_missing(sym, *args, &block)
  15. @contexts.each do |context|
  16. begin
  17. return context.send(sym, *args, &block)
  18. rescue ::NoMethodError => ex
  19. # next
  20. end
  21. end
  22. super
  23. end
  24. end
  25.  
  26. class Object
  27. def context_eval(*contexts, &block)
  28. outer = eval('self', block.binding)
  29. ContextEvaluator.new(self, outer, *contexts).instance_eval(&block)
  30. end
  31.  
  32. def context_exec(*args, &block)
  33. contexts = args.first.is_a?(Array) ? args.shift : []
  34. contexts << self
  35. contexts << eval('self', block.binding)
  36. block.bind(ContextEvaluator.new(*contexts)).call(*args)
  37. end
  38. end
  39.  
  40. require 'rubygems'
  41. require 'spec'
  42.  
  43. describe "method directors" do
  44. attr_reader :context, :instance
  45.  
  46. before(:each) do
  47. %w(Foo Bar Fizz).each { |klass| Object.send(:remove_const, klass) rescue nil }
  48.  
  49. Object.const_set('Foo', Class.new {
  50. def foo(arg=:foo); arg end
  51. })
  52.  
  53. Object.const_set('Bar', Class.new {
  54. def bar(arg=:bar); arg end
  55. })
  56.  
  57. Object.const_set('Fizz', Class.new {
  58. def fizz(arg=:fizz); arg end
  59. })
  60.  
  61. @instance = Foo.new
  62. @context = Bar.new
  63. end
  64.  
  65. describe "context_eval" do
  66. it "occurs in context of instance" do
  67. instance.context_eval { self }.should == instance
  68. end
  69.  
  70. it "works with instance's methods" do
  71. instance.context_eval { [foo] }.should == [:foo]
  72. end
  73.  
  74. it "works with a context's methods" do
  75. instance.context_eval(context) { [foo, bar] }.should == [:foo, :bar]
  76. end
  77.  
  78. it "works with multiple contexts" do
  79. instance.context_eval(Bar.new, Fizz.new) { [foo, bar, fizz] }.should == [:foo, :bar, :fizz]
  80. end
  81.  
  82. it "works with block binding" do
  83. def self.buzz; :buzz end
  84. instance.context_eval { [foo, buzz] }.should == [:foo, :buzz]
  85. end
  86.  
  87. it "blows up when no method is there" do
  88. proc {
  89. instance.context_eval { cheese }
  90. }.should raise_error(NoMethodError)
  91. end
  92. end
  93.  
  94. describe "context_exec" do
  95. it "occurs in context of instance" do
  96. instance.context_exec(:execd) { self }.should == instance
  97. end
  98.  
  99. it "works with instance's methods" do
  100. instance.context_exec(:execd) { |arg| [foo(arg)] }.should == [:execd]
  101. end
  102.  
  103. it "works with a context's methods" do
  104. instance.context_exec([context], :execd) do |arg|
  105. [foo(arg), bar(arg)]
  106. end.should == [:execd, :execd]
  107. end
  108.  
  109. it "works with multiple contexts" do
  110. result = instance.context_exec([Bar.new, Fizz.new], :execd) do |arg|
  111. [foo(arg), bar(arg), fizz(arg)]
  112. end
  113. result.should == [:execd, :execd, :execd]
  114. end
  115.  
  116. it "works with block binding" do
  117. def self.buzz(arg=:buzz); arg end
  118. instance.context_exec(:execd) { |arg| [foo(arg), buzz(arg)] }.should == [:execd, :execd]
  119. end
  120.  
  121. it "blows up when no method is there" do
  122. proc {
  123. instance.context_exec { cheese }
  124. }.should raise_error(NoMethodError)
  125. end
  126. end
  127. end
Add Comment
Please, Sign In to add comment