moduleRSpecmoduleCoremoduleHooksincludeMetadataHashBuilder::WithConfigWarningclassHookattr_reader:optionsdefinitialize(options,&block)@options=optionsraise"no block given for #{display_name}"unlessblock@block=blockenddefoptions_apply?(example_or_group)!example_or_group||example_or_group.apply?(:all?,options)enddefto_proc@blockenddefcall@block.callenddefdisplay_nameself.class.name.split('::').last.gsub('Hook','').downcase<<" hook"endendclassBeforeHook<Hookdefrun_in(example_group_instance)ifexample_group_instanceexample_group_instance.instance_eval(&self)elsecallendendendclassAfterHook<Hookdefrun_in(example_group_instance)ifexample_group_instanceexample_group_instance.instance_eval_with_rescue(&self)elsecallendendendclassAroundHook<Hookdefcall(wrapped_example)@block.call(wrapped_example)endendclassHookCollection<Arraydeffind_hooks_for(example_or_group)self.class.new(select{|hook|hook.options_apply?(example_or_group)})enddefwithout_hooks_for(example_or_group)self.class.new(reject{|hook|hook.options_apply?(example_or_group)})endendclassBeforeHooks<HookCollectiondefrun_all(example_group_instance)each{|h|h.run_in(example_group_instance)}unlessempty?enddefrun_all!(example_group_instance)shift.run_in(example_group_instance)untilempty?endendclassAfterHooks<HookCollectiondefrun_all(example_group_instance)reverse.each{|h|h.run_in(example_group_instance)}unlessempty?enddefrun_all!(example_group_instance)pop.run_in(example_group_instance)untilempty?endendclassAroundHooks<HookCollection;enddefhooks@hooks||={:around=>{:each=>AroundHooks.new},:before=>{:each=>BeforeHooks.new,:all=>BeforeHooks.new,:suite=>BeforeHooks.new},:after=>{:each=>AfterHooks.new,:all=>AfterHooks.new,:suite=>AfterHooks.new}}enddefbefore(*args,&block)scope,options=scope_and_options_from(*args)hooks[:before][scope]<<BeforeHook.new(options,&block)enddefafter(*args,&block)scope,options=scope_and_options_from(*args)hooks[:after][scope]<<AfterHook.new(options,&block)enddefaround(*args,&block)scope,options=scope_and_options_from(*args)hooks[:around][scope]<<AroundHook.new(options,&block)end# Runs all of the blocks stored with the hook in the context of the# example. If no example is provided, just calls the hook directly.defrun_hook(hook,scope,example_group_instance=nil)hooks[hook][scope].run_all(example_group_instance)end# Just like run_hook, except it removes the blocks as it evalutes them,# ensuring that they will only be run once.defrun_hook!(hook,scope,example_group_instance)hooks[hook][scope].run_all!(example_group_instance)enddefrun_hook_filtered(hook,scope,group,example_group_instance,example=nil)find_hook(hook,scope,group,example).run_all(example_group_instance)enddeffind_hook(hook,scope,example_group_class,example=nil)found_hooks=hooks[hook][scope].find_hooks_for(example||example_group_class)# ensure we don't re-run :all hooks that were applied to any of the parent groupsifscope==:allsuper_klass=example_group_class.superclasswhilesuper_klass!=RSpec::Core::ExampleGroupfound_hooks=found_hooks.without_hooks_for(super_klass)super_klass=super_klass.superclassendendfound_hooksendprivatedefscope_and_options_from(*args)scope=if[:each,:all,:suite].include?(args.first)args.shiftelsifargs.any?{|a|a.is_a?(Symbol)}raiseArgumentError.new("You must explicitly give a scope (:each, :all, or :suite) when using symbols as metadata for a hook.")else:eachendoptions=build_metadata_hash_from(args)returnscope,optionsendendendend