require 'rails/generators' require 'rails/generators/rails/app/app_generator' module Slining class AppGenerator < Rails::Generators::AppGenerator class_option :database, type: :string, aliases: "-d", default: "postgresql", desc: "Configure for selected database (options: #{DATABASES.join("/")})" class_option :heroku, type: :boolean, aliases: "-H", default: false, desc: "Create staging and production Heroku apps" class_option :heroku_flags, type: :string, default: "", desc: "Set extra Heroku flags" 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 :skip_turbolinks, type: :boolean, default: true, desc: "Skip turbolinks gem" class_option :skip_bundle, type: :boolean, aliases: "-B", default: true, desc: "Don't run bundle install" def finish_template invoke :slining_customization super end def slining_customization 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_slining_views invoke :configure_app invoke :setup_stylesheets invoke :copy_miscellaneous_files invoke :customize_error_pages invoke :remove_config_comment_lines invoke :remove_routes_comment_lines invoke :setup_git invoke :setup_database invoke :setup_dotfiles invoke :create_heroku_apps invoke :create_github_repo invoke :setup_segment invoke :setup_bundler_audit invoke :setup_spring invoke :outro end def customize_gemfile build :set_ruby_to_version_being_used if options[:heroku] build :set_up_heroku_specific_gems end bundle_command 'install' build :configure_simple_form 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_missing_assets_in_test build :raise_on_delivery_errors build :set_test_delivery_method build :add_bullet_gem_configuration build :raise_on_unpermitted_parameters build :provide_setup_script build :provide_dev_prime_task build :configure_generators build :configure_i18n_for_missing_translations build :configure_quiet_assets end def setup_test_environment say 'Setting up the test environment' build :set_up_factory_girl_for_rspec build :generate_factories_file build :set_up_hound build :generate_rspec build :configure_rspec build :configure_background_jobs_for_rspec build :enable_database_cleaner build :provide_shoulda_matchers_config build :configure_spec_support_features build :configure_ci build :configure_i18n_for_test_environment build :configure_action_mailer_in_specs build :configure_capybara_webkit end def setup_production_environment say 'Setting up the production environment' build :configure_newrelic build :configure_smtp build :configure_rack_timeout build :enable_rack_canonical_host 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_slining_views say 'Creating slining views' build :create_partials_directory build :create_shared_flashes build :create_shared_javascripts build :create_application_layout end def configure_app say 'Configuring app' build :configure_action_mailer build :configure_active_job build :configure_time_formats build :disable_xml_params build :setup_default_rake_task build :configure_puma build :set_up_forego build :setup_rack_mini_profiler end def setup_stylesheets say 'Set up stylesheets' build :setup_stylesheets end def setup_git if !options[:skip_git] say "Initializing git" invoke :setup_default_directories invoke :init_git end end def create_heroku_apps if options[:heroku] say "Creating Heroku apps" build :create_heroku_apps, options[:heroku_flags] build :provide_review_apps_setup_script build :set_heroku_serve_static_files build :set_heroku_remotes build :set_heroku_rails_secrets build :create_heroku_pipelines_config_file build :create_heroku_pipeline build :provide_deploy_script build :configure_automatic_deployment 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 say 'Setting up Segment' build :setup_segment end def setup_dotfiles build :copy_dotfiles end def setup_default_directories build :setup_default_directories end def setup_bundler_audit say "Setting up bundler-audit" build :setup_bundler_audit end def setup_spring say "Springifying binstubs" build :setup_spring 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_config_comment_lines build :remove_config_comment_lines end def remove_routes_comment_lines build :remove_routes_comment_lines end def outro say 'Congratulations! You just found the silver lining.' say honeybadger_outro end protected def get_builder_class Slining::AppBuilder end def using_active_record? !options[:skip_active_record] end private def honeybadger_outro "Run 'bundle exec honeybadger heroku install' with your API key#{honeybadger_message_suffix}." end def honeybadger_message_suffix if options[:heroku] " unless you're using the Heroku Honeybadger add-on" end end end end