require 'rails/generators' require 'rails/generators/rails/app/app_generator' module Shoelaces class AppGenerator < Rails::Generators::AppGenerator class_option :database, :type => :string, :aliases => '-d', :default => 'postgresql', :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})" class_option :heroku, :type => :boolean, :aliases => '-H', :default => false, :desc => 'Create staging and production Heroku apps' class_option :github, :type => :string, :aliases => '-G', :default => nil, :desc => 'Create Github repository and add remote origin pointed to repo' class_option :skip_test_unit, :type => :boolean, :aliases => '-T', :default => true, :desc => 'Skip Test::Unit files' class_option :port, :type => :string, :aliases => '-P', :default => nil, :desc => 'port number' def finish_template invoke :shoelaces_customization super end def shoelaces_customization invoke :set_custom_port_number invoke :customize_gemfile invoke :setup_development_environment invoke :setup_test_environment invoke :setup_production_environment invoke :setup_staging_environment invoke :setup_secret_token invoke :create_shoelaces_views invoke :create_image_assets invoke :create_static_pages invoke :setup_coffeescript invoke :configure_app invoke :setup_stylesheets invoke :copy_miscellaneous_files invoke :customize_error_pages invoke :remove_routes_comment_lines invoke :setup_git invoke :setup_database invoke :create_heroku_apps invoke :create_github_repo invoke :setup_segment_io invoke :outro end def set_custom_port_number if options[:port] get_builder_class.set_port_number(options[:port].to_i) end end def customize_gemfile build :replace_gemfile build :set_ruby_to_version_being_used if options[:heroku] build :setup_heroku_specific_gems end bundle_command 'install' end def setup_database say 'Setting up database' if 'postgresql' == options[:database] build :use_postgres_config_template end build :create_database end def setup_development_environment say 'Setting up the development environment' build :raise_on_delivery_errors build :raise_on_unpermitted_parameters build :provide_setup_script build :provide_dev_prime_task build :configure_generators build :configure_i18n_for_development_environment end def setup_test_environment say 'Setting up the test environment' build :set_up_factory_girl_for_rspec build :generate_rspec build :configure_rspec build :configure_background_jobs_for_rspec build :enable_database_cleaner build :configure_spec_support_features build :configure_travis build :configure_i18n_for_test_environment build :configure_action_mailer_in_specs end def setup_production_environment say 'Setting up the production environment' build :configure_newrelic build :configure_smtp build :enable_rack_deflater build :setup_asset_host end def setup_staging_environment say 'Setting up the staging environment' build :setup_staging_environment end def setup_secret_token say 'Moving secret token out of version control' build :setup_secret_token end def create_shoelaces_views say 'Creating shoelaces views' build :create_partials_directory build :create_shared_flashes build :create_application_layout end def create_image_assets say 'Creating image assets' build :add_images end def create_static_pages say 'Creating static pages' build :add_static_pages end def setup_coffeescript say 'Setting up CoffeeScript defaults' build :remove_turbolinks build :setup_bootstrap_javascript end def configure_app say 'Configuring app' build :configure_action_mailer build :configure_time_zone build :configure_time_formats build :configure_rack_timeout build :disable_xml_params build :fix_i18n_deprecation_warning build :setup_default_rake_task build :configure_unicorn build :setup_foreman build :setup_guard build :generate_simple_form build :use_high_voltage_config_template end def setup_stylesheets say 'Set up stylesheets' build :setup_stylesheets end def setup_git if !options[:skip_git] say 'Initializing git' invoke :setup_gitignore invoke :init_git end end def create_heroku_apps if options[:heroku] say 'Creating Heroku apps' build :create_heroku_apps build :set_heroku_remotes build :set_heroku_rails_secrets end end def create_github_repo if !options[:skip_git] && options[:github] say 'Creating Github repo' build :create_github_repo, options[:github] end end def setup_segment_io say 'Setting up Segment.io' build :setup_segment_io end def setup_gitignore build :gitignore_files end def init_git build :init_git end def copy_miscellaneous_files say 'Copying miscellaneous support files' build :copy_miscellaneous_files end def customize_error_pages say 'Customizing the 500/404/422 pages' build :customize_error_pages end def remove_routes_comment_lines build :remove_routes_comment_lines end def outro say 'Congratulations! You just pulled our shoelaces.' say "Remember to run 'rails generate airbrake' with your API key." end def run_bundle # Let's not: We'll bundle manually at the right spot end protected def get_builder_class Shoelaces::AppBuilder end def using_active_record? !options[:skip_active_record] end end end