moduleRspecmoduleCoreclassExampleGroupincludeExampleGroupSubjectattr_accessor:running_example,:reporterdefself.inherited(klass)superRspec::Core.configuration.autorun!Rspec::Core.world.behaviours<<klassenddefself.extended_modules#:nodoc:ancestors=class<<self;ancestorsendancestors.select{|mod|mod.class==Module}-[Object,Kernel]enddefself.befores@_befores||={:all=>[],:each=>[]}enddefself.before_eachsbefores[:each]enddefself.before_allsbefores[:all]enddefself.before(type=:each,&block)befores[type]<<blockenddefself.afters@_afters||={:all=>[],:each=>[]}enddefself.after_eachsafters[:each]enddefself.after_allsafters[:all]enddefself.after(type=:each,&block)afters[type]<<blockenddefself.example(desc=nil,options={},&block)examples<<Rspec::Core::Example.new(self,desc,options.update(:caller=>caller[0]),block)enddefself.alias_example_to(new_alias,extra_options={})new_alias=<<-END_RUBY
def self.#{new_alias}(desc=nil, options={}, &block)
updated_options = options.update(:caller => caller[0])
updated_options.update(#{extra_options.inspect})
block = nil if updated_options[:pending] == true || updated_options[:disabled] == true
examples << Rspec::Core::Example.new(self, desc, updated_options, block)
end
END_RUBYmodule_eval(new_alias,__FILE__,__LINE__)endalias_example_to:italias_example_to:specifyalias_example_to:focused,:focused=>truealias_example_to:disabled,:disabled=>truealias_example_to:pending,:pending=>truedefself.it_should_behave_like(*names)Rspec::Core.world.shared_behaviours.eachdo|name,block|module_eval(&block)ifnames.include?(name)endenddefself.examples@_examples||=[]enddefself.examples_to_run@_examples_to_run||=[]enddefself.generate_name(options,metadata)ifsuperclass.metadata[:behaviour][:name]metadata[:behaviour][:name]="#{self.superclass.metadata[:behaviour][:name]}#{description} "elsemetadata[:behaviour][:name]="#{describes}#{description} "endmetadata[:behaviour][:name].strip!enddefself.set_it_up(*args)@metadata={}extra_metadata=args.last.is_a?(Hash)?args.pop:{}extra_metadata.delete(:behaviour)# Remove it when present to prevent it clobbering the one we setup@metadata.update(self.superclass.metadata)@metadata[:behaviour]={}@metadata[:behaviour][:describes]=args.shiftunlessargs.first.is_a?(String)@metadata[:behaviour][:describes]||=self.superclass.metadata&&self.superclass.metadata[:behaviour][:describes]@metadata[:behaviour][:description]=args.shift||''@metadata[:behaviour][:name]=generate_name(args,metadata)@metadata[:behaviour][:block]=extra_metadata.delete(:behaviour_block)@metadata[:behaviour][:caller]=extra_metadata.delete(:caller)||caller(1)@metadata[:behaviour][:file_path]=extra_metadata.delete(:file_path)||@metadata[:behaviour][:caller][4].split(":")[0].strip@metadata[:behaviour][:line_number]=extra_metadata.delete(:line_number)||@metadata[:behaviour][:caller][4].split(":")[1].to_i@metadata.update(extra_metadata)Rspec::Core.configuration.find_modules(self).eachdo|include_or_extend,mod,opts|ifinclude_or_extend==:extendsend(:extend,mod)unlessextended_modules.include?(mod)elsesend(:include,mod)unlessincluded_modules.include?(mod)endendenddefself.metadata@metadata||={:behaviour=>{}}enddefself.name(friendly=true)friendly?metadata[:behaviour][:name]:superenddefself.describesmetadata[:behaviour][:describes]enddefself.described_classdescribes||descriptionenddefself.descriptionmetadata[:behaviour][:description]enddefself.file_pathmetadata[:behaviour][:file_path]enddefself.describe(*args,&behaviour_block)raise(ArgumentError,"No arguments given. You must a least supply a type or description")ifargs.empty?raise(ArgumentError,"You must supply a block when calling describe")ifbehaviour_block.nil?# TODO: Pull out the below into a metadata object, that we can defer the subclassing if necessary# describe 'foo', :shared => true will need this to be completed firstsubclass('NestedLevel')doargs<<{}unlessargs.last.is_a?(Hash)args.last.update(:behaviour_block=>behaviour_block)set_it_up(*args)module_eval(&behaviour_block)endenddefself.ancestors(superclass_last=false)classes=[]current_class=selfwhilecurrent_class<Rspec::Core::ExampleGroupsuperclass_last?classes<<current_class:classes.unshift(current_class)current_class=current_class.superclassendclassesenddefself.before_ancestors@_before_ancestors||=ancestorsenddefself.after_ancestors@_after_ancestors||=ancestors(true)enddefself.before_all_ivars@before_all_ivars||={}enddefself.eval_before_alls(running_behaviour)superclass.before_all_ivars.each{|ivar,val|running_behaviour.instance_variable_set(ivar,val)}Rspec::Core.configuration.find_before_or_after(:before,:all,self).each{|blk|running_behaviour.instance_eval(&blk)}before_alls.each{|blk|running_behaviour.instance_eval(&blk)}running_behaviour.instance_variables.each{|ivar|before_all_ivars[ivar]=running_behaviour.instance_variable_get(ivar)}enddefself.eval_before_eachs(running_behaviour)Rspec::Core.configuration.find_before_or_after(:before,:each,self).each{|blk|running_behaviour.instance_eval(&blk)}before_ancestors.each{|ancestor|ancestor.before_eachs.each{|blk|running_behaviour.instance_eval(&blk)}}enddefself.eval_after_alls(running_behaviour)after_alls.each{|blk|running_behaviour.instance_eval(&blk)}Rspec::Core.configuration.find_before_or_after(:after,:all,self).each{|blk|running_behaviour.instance_eval(&blk)}before_all_ivars.keys.each{|ivar|before_all_ivars[ivar]=running_behaviour.instance_variable_get(ivar)}enddefself.eval_after_eachs(running_behaviour)after_ancestors.each{|ancestor|ancestor.after_eachs.each{|blk|running_behaviour.instance_eval(&blk)}}Rspec::Core.configuration.find_before_or_after(:after,:each,self).each{|blk|running_behaviour.instance_eval(&blk)}enddefself.run(reporter)behaviour_instance=newreporter.add_behaviour(self)eval_before_alls(behaviour_instance)success=run_examples(behaviour_instance,reporter)eval_after_alls(behaviour_instance)successend# Runs all examples, returning true only if all of them passdefself.run_examples(behaviour_instance,reporter)examples_to_run.map{|ex|ex.run(behaviour_instance)}.all?enddefself.subclass(base_name,&body)# :nodoc:@_sub_class_count||=0@_sub_class_count+=1klass=Class.new(self)class_name="#{base_name}_#{@_sub_class_count}"const_set(class_name,klass)klass.instance_eval(&body)klassenddefself.to_sself==Rspec::Core::ExampleGroup?'Rspec::Core::ExampleGroup':nameendendendend