require'generators/rspec'require'rails/generators/resource_helpers'moduleRspecmoduleGeneratorsclassScaffoldGenerator<BaseincludeRails::Generators::ResourceHelpersargument:attributes,:type=>:array,:default=>[],:banner=>"field:type field:type"class_option:orm,:desc=>"ORM used to generate the controller"class_option:template_engine,:desc=>"Template engine to generate view files"class_option:singleton,:type=>:boolean,:desc=>"Supply to create a singleton controller"class_option:controller_specs,:type=>:boolean,:default=>true,:desc=>"Generate controller specs"class_option:view_specs,:type=>:boolean,:default=>true,:desc=>"Generate view specs"class_option:helper_specs,:type=>:boolean,:default=>true,:desc=>"Generate helper specs"class_option:routing_specs,:type=>:boolean,:default=>false,:desc=>"Generate routing specs"defcopy_controller_filesreturnunlessoptions[:controller_specs]template'controller_spec.rb',File.join('spec/controllers',controller_class_path,"#{controller_file_name}_controller_spec.rb")enddefcopy_view_filesreturnunlessoptions[:view_specs]copy_view:editcopy_view:indexunlessoptions[:singleton]copy_view:newcopy_view:showenddefcopy_routing_filesreturnunlessoptions[:routing_specs]template'routing_spec.rb',File.join('spec/routing',controller_class_path,"#{controller_file_name}_routing_spec.rb")endhook_for:integration_tool,:as=>:integrationprotecteddefcopy_view(view)template"#{view}_spec.rb",File.join("spec/views",controller_file_path,"#{view}.html.#{options[:template_engine]}_spec.rb")enddefparams"{'these' => 'params'}"end# Returns the name of the mock. For example, if the file name is user,# it returns mock_user.## If a hash is given, it uses the hash key as the ORM method and the# value as response. So, for ActiveRecord and file name "User":## mock_file_name(:save => true)# #=> mock_user(:save => true)## If another ORM is being used and another method instead of save is# called, it will be the one used.#defmock_file_name(hash=nil)ifhashmethod,and_return=hash.to_a.firstmethod=orm_instance.send(method).split('.').last.gsub(/\(.*?\)/,'')"mock_#{file_name}(:#{method} => #{and_return})"else"mock_#{file_name}"endend# Receives the ORM chain and convert to expects. For ActiveRecord:## should! orm_class.find(User, "37")# #=> User.should_receive(:find).with(37)## For Datamapper:## should! orm_class.find(User, "37")# #=> User.should_receive(:get).with(37)#defshould_receive!(chain)stub_or_should_chain(:should_receive,chain)end# Receives the ORM chain and convert to stub. For ActiveRecord:## stub! orm_class.find(User, "37")# #=> User.stub!(:find).with(37)## For Datamapper:## stub! orm_class.find(User, "37")# #=> User.stub!(:get).with(37)#defstub!(chain)stub_or_should_chain(:stub,chain)enddefstub_or_should_chain(mode,chain)receiver,method=chain.split(".")method.gsub!(/\((.*?)\)/,'')response="#{receiver}.#{mode}(:#{method})"response<<".with(#{$1})"unless$1.blank?responseendendendend