1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
module Spec
module Runner
module ContextEval
module ModuleMethods
def inherit(klass)
@context_superclass = klass
derive_execution_context_class_from_context_superclass
end
def include(mod)
context_modules << mod
mod.send :included, self
end
def context_setup(&block)
context_setup_parts << block
end
def context_teardown(&block)
context_teardown_parts << block
end
def setup(&block)
setup_parts << block
end
def teardown(&block)
teardown_parts << block
end
def specify(spec_name=:__generate_description, opts={}, &block)
specifications << Specification.new(spec_name, opts, &block)
end
def methods
my_methods = super
my_methods |= context_superclass.methods
my_methods
end
protected
def method_missing(method_name, *args)
if context_superclass.respond_to?(method_name)
return execution_context_class.send(method_name, *args)
end
super
end
private
def context_setup_block
parts = context_setup_parts.dup
add_context_superclass_method(:context_setup, parts)
create_block_from_parts(parts)
end
def context_teardown_block
parts = context_teardown_parts.dup
add_context_superclass_method(:context_teardown, parts)
create_block_from_parts(parts)
end
def setup_block
parts = setup_parts.dup
add_context_superclass_method(:setup, parts)
create_block_from_parts(parts)
end
def teardown_block
parts = teardown_parts.dup
add_context_superclass_method(:teardown, parts)
create_block_from_parts(parts)
end
def execution_context_class
@execution_context_class ||= derive_execution_context_class_from_context_superclass
end
def derive_execution_context_class_from_context_superclass
@execution_context_class = Class.new(context_superclass)
@execution_context_class.class_eval do
include ::Spec::Runner::ExecutionContext::InstanceMethods
end
end
def context_superclass
@context_superclass ||= Object
end
def context_modules
@context_modules ||= [Spec::Matchers, Spec::Mocks]
end
def specifications
@specifications ||= []
end
def context_setup_parts
@context_setup_parts ||= []
end
def context_teardown_parts
@context_teardown_parts ||= []
end
def setup_parts
@setup_parts ||= []
end
def teardown_parts
@teardown_parts ||= []
end
def add_context_superclass_method sym, parts
superclass_method = begin
context_superclass.instance_method(sym)
rescue
nil
end
parts.unshift superclass_method if superclass_method
end
def create_block_from_parts(parts)
proc do
parts.each do |part|
if part.is_a?(UnboundMethod)
part.bind(self).call
else
instance_eval(&part)
end
end
end
end
end
module InstanceMethods
end
end
end
end
|