138: def run_requirement(description, spec)
139: Bacon.handle_requirement description do
140: begin
141: Counter[:depth] += 1
142: rescued = false
143: begin
144: @before.each { |block| instance_eval(&block) }
145: prev_req = Counter[:requirements]
146: instance_eval(&spec)
147: rescue Object => e
148: rescued = true
149: raise e
150: ensure
151: if Counter[:requirements] == prev_req and not rescued
152: raise Error.new(:missing,
153: "empty specification: #{@name} #{description}")
154: end
155: begin
156: @after.each { |block| instance_eval(&block) }
157: rescue Object => e
158: raise e unless rescued
159: end
160: end
161: rescue Object => e
162: ErrorLog << "#{e.class}: #{e.message}\n"
163: e.backtrace.find_all { |line| line !~ /bin\/bacon|\/bacon\.rb:\d+/ }.
164: each_with_index { |line, i|
165: ErrorLog << "\t#{line}#{i==0 ? ": #@name - #{description}" : ""}\n"
166: }
167: ErrorLog << "\n"
168:
169: if e.kind_of? Error
170: Counter[e.count_as] += 1
171: e.count_as.to_s.upcase
172: else
173: Counter[:errors] += 1
174: "ERROR: #{e.class}"
175: end
176: else
177: ""
178: ensure
179: Counter[:depth] -= 1
180: end
181: end
182: end