require 'generators/nifty' require 'rails/generators/migration' require 'active_record' module Nifty module Generators class AuthenticationGenerator < Base include Rails::Generators::Migration argument :user_name, :type => :string, :default => 'user', :banner => 'user_name' argument :session_name, :type => :string, :default => '[[DEFAULT]]', :banner => 'sessions_controller_name' class_option :testunit, :desc => 'Use test/unit for test files.', :group => 'Test framework', :type => :boolean class_option :rspec, :desc => 'Use RSpec for test files.', :group => 'Test framework', :type => :boolean class_option :shoulda, :desc => 'Use shoulda for test files.', :group => 'Test framework', :type => :boolean class_option :haml, :desc => 'Generate HAML views instead of ERB.', :type => :boolean class_option :authlogic, :desc => 'Use Authlogic for authentication.', :type => :boolean def create_model_files template 'user.rb', "app/models/#{user_singular_name}.rb" template 'authlogic_session.rb', "app/models/#{user_singular_name}_session.rb" if options.authlogic? end def create_controller_files template 'users_controller.rb', "app/controllers/#{user_plural_name}_controller.rb" template 'sessions_controller.rb', "app/controllers/#{session_plural_name}_controller.rb" end def crete_helper_files template 'users_helper.rb', "app/helpers/#{user_plural_name}_helper.rb" template 'sessions_helper.rb', "app/helpers/#{session_plural_name}_helper.rb" end def create_view_files template "views/#{view_language}/signup.html.#{view_language}", "app/views/#{user_plural_name}/new.html.#{view_language}" template "views/#{view_language}/login.html.#{view_language}", "app/views/#{session_plural_name}/new.html.#{view_language}" end def create_lib_files template 'authentication.rb', 'lib/authentication.rb' end def create_routes route "resources #{user_plural_name.to_sym.inspect}" route "resources #{session_plural_name.to_sym.inspect}" route "match 'login' => '#{session_plural_name}#new', :as => :login" route "match 'logout' => '#{session_plural_name}#destroy', :as => :logout" route "match 'signup' => '#{user_plural_name}#new', :as => :signup" end def create_migration migration_template 'migration.rb', "db/migrate/create_#{user_plural_name}.rb" end def create_include_line inject_into_class 'app/controllers/application_controller.rb', 'ApplicationController', ' include Authentication' end def create_test_files if test_framework == :rspec template 'fixtures.yml', "spec/fixtures/#{user_plural_name}.yml" template 'tests/rspec/user.rb', "spec/models/#{user_singular_name}_spec.rb" template 'tests/rspec/users_controller.rb', "spec/controllers/#{user_plural_name}_controller_spec.rb" template 'tests/rspec/sessions_controller.rb', "spec/controllers/#{session_plural_name}_controller_spec.rb" else template 'fixtures.yml', "test/fixtures/#{user_plural_name}.yml" template "tests/#{test_framework}/user.rb", "test/unit/#{user_singular_name}_test.rb" template "tests/#{test_framework}/users_controller.rb", "test/functional/#{user_plural_name}_controller_test.rb" template "tests/#{test_framework}/sessions_controller.rb", "test/functional/#{session_plural_name}_controller_test.rb" end end no_tasks do def session_name @_session_name ||= @session_name == '[[DEFAULT]]' ? (options.authlogic? ? user_name + '_session' : 'session') : @session_name end def user_singular_name user_name.underscore end def user_plural_name user_singular_name.pluralize end def user_class_name user_name.camelize end def user_plural_class_name user_plural_name.camelize end def session_singular_name session_name.underscore end def session_plural_name session_singular_name.pluralize end def session_class_name session_name.camelize end def session_plural_class_name session_plural_name.camelize end end protected no_tasks do def view_language options.haml? ? 'haml' : 'erb' end def test_framework return @test_framework if defined?(@test_framework) if options.testunit? return @test_framework = :testunit elsif options.rspec? return @test_framework = :rspec elsif options.shoulda? return @test_framework = :shoulda else return @test_framework = File.exist?(destination_path('spec')) ? :rspec : :testunit end end def destination_path(path) File.join(destination_root, path) end # FIXME: Should be proxied to ActiveRecord::Generators::Base # Implement the required interface for Rails::Generators::Migration. def next_migration_number(dirname) #:nodoc: if ::ActiveRecord::Base.timestamped_migrations Time.now.utc.strftime("%Y%m%d%H%M%S") else "%.3d" % (current_migration_number(dirname) + 1) end end end end end end