class NewGenerator

Public Instance Methods

gemfile_update() click to toggle source
# File lib/generators/new/new_generator.rb, line 7
  def gemfile_update
    project_name = Rails.application.class.parent_name
    project_path = Rails.root
    project_user = ENV['USER']

    
# --------------------------------------------
    remove_file "Gemfile"
    create_file 'Gemfile' do
    <<-GEMFILE
        source 'https://rubygems.org'

        # Basic needs
        gem 'rails'
        gem "pg"
        gem 'sqlite3'
        gem 'rails_init_gem'
        gem 'sass-rails'
        gem 'coffee-rails'
        gem 'jbuilder'
        gem 'jquery-rails'

        # Speedup gems
        gem 'uglifier'
        gem 'turbolinks'
        gem 'rails_serve_static_assets'
        gem 'multi_fetch_fragments'
        gem 'therubyracer'
        gem 'htmlcompressor'

        # Preitify gems
        gem 'bootstrap-sass'
        gem 'chosen-rails'
        gem 'country_select'
        gem 'friendly_id'
        gem 'high_voltage'

        # Security and Authentication gems
        gem 'cancan'
        gem 'devise', git: 'https://github.com/plataformatec/devise.git'
        gem 'devise-encryptable'
        gem 'devise_invitable'
        gem 'devise-i18n'
        gem 'devise-guests'
        gem 'rolify'

        # Forms Gem
        gem 'simple_form', git: 'https://github.com/plataformatec/simple_form.git'

        # Pagination Gem
        gem 'will_paginate'
        gem 'will_paginate-bootstrap'

        # Cache Gem
        gem 'redis-rails'
        gem 'redis-namespace'

        # Full-Text Search Gem
        gem 'elasticsearch-model'
        gem 'elasticsearch-rails'

        # Jobs Gems
        gem 'whenever'
        gem "resque"

        # Payment
        gem 'activemerchant'
        gem 'paypal-sdk-rest'

        # Email
        gem 'mandrill-api'
        gem 'mandrill_mailer'


        group :development do
            # gem 'sqlite3'
            gem 'better_errors'
            gem 'binding_of_caller'
            gem 'capistrano'
            gem 'capistrano-bundler'
            gem 'capistrano-rails'
            gem 'capistrano-rails-console'
            gem 'capistrano-rvm'
            gem 'guard-bundler'
            gem 'guard-rails'
            gem 'guard-rspec'
            gem 'quiet_assets'
            gem 'rails_layout'
            # gem 'active_reload'
            gem 'annotate'
        end
        group :development, :test do
            gem 'factory_girl_rails'
            gem 'pry-rails'
            gem 'pry-rescue'
            gem 'pry-stack_explorer'
            gem 'rspec-rails'
        end
        group :production do
            gem 'unicorn'
            gem 'yui-compressor'
        end
        group :test do
            gem 'capybara'
            gem 'database_cleaner'
            gem 'email_spec'
            gem 'colored'
            gem 'deadweight', :require => 'deadweight/hijack/rails'
        end
    GEMFILE
    end
    inside Rails.root do
      run "bundle install"
    end
# --------------------------------------------

    # Drop Database
    rake("db:drop")
    rake("db:create")

    # Install Annotate to facilitate development of Models
    generate "annotate:install"

    # Install JQuery
    generate "jquery:install"

    # Install Simple_Form with Bootstrap
    generate "simple_form:install --bootstrap"

    # Pre configure Bootstrap
    generate "layout:install"

    # Use Friendly ID to hide ID field from URLs
    generate "friendly_id"

    # Create Some Static Pages
    generate "controller StaticPages home help about contact"

    # Migrate DB
    rake("db:migrate")

    # Install Devise to manage Users
    generate "devise:install"

    # Add functionality to invite Friends
    generate "devise_invitable:install"

    # Add Necessary views to Users
    generate "devise:views"

    # Install Paypal System on the Project
    generate "paypal:sdk:install"

    # Install Testing utilities
    generate "rspec:install"

    # Create User Table
    generate "devise User"

    # Migrate DB
    rake("db:migrate")

    # Create Guest User
    generate "devise_guests User"

    # Add CanCan to manage Permissions
    generate "cancan:ability"

    # Add Rolify to Add roles to Users
    generate "rolify Role User"

    # Correct FileName Bug of Rolify
    filename = Dir.glob("db/migrate/*rolify_create_roles")[0]
    copy_file File.join(project_path, filename), filename + ".rb"
    remove_file File.join(project_path, filename)

    # Migrate
    rake("db:migrate")

    # Create Invitable User Table
    generate "devise_invitable User"

    # Migrate
    rake("db:migrate")

    # Create Devise Inviting Pages
    generate "devise_invitable:views"

    # Add Testing tools to test Emails
    generate "email_spec:steps"

    # Add slug to user to Hide ID from URLs
    generate "migration add_slug_to_users slug:string:uniq"

    # Add Some data to User (e.g CPF, CreditCard, Etc..)
    generate "migration add_name_to_users name:string cpf:string cnpj:string"
    generate "migration add_provider_to_users provider:boolean"
    generate "migration add_client_to_users client:boolean"

    # Set field default value to False (they are not clients nor providers at the beginning)
    filename = Dir.glob("db/migrate/*add_client_to_users.rb")[0]
    inject_into_file filename,", default: false",after: "boolean"
    filename = Dir.glob("db/migrate/*add_provider_to_users.rb")[0]
    inject_into_file filename,", default: false",after: "boolean"

    # Migrate
    rake("db:migrate")
    

# -------- Configure Redis (cahce service) -------------------

    copy_file "redis.rb", "config/initializers/redis.rb"
    copy_file "secret_token.rb", "config/initializers/secret_token.rb"
    gsub_file("config/initializers/secret_token.rb", "Ww::Application.config.secret_key_base = secret_token", project_name+"::Application.config.secret_key_base = secret_token")
    
    # filename = Dir.glob("config/secrets.yml")[0]
    # remove_file File.join(project_path, filename)

    copy_file "secret.yml", "config/secrets.yml"
    # copy_file "i18n_backend.rb", "config/initializers/i18n_backend.rb" # Add Translation To Redis Server (quite expensive)
    
# -------- Install Unicorn (WebServer) -------------------
    copy_file "unicorn.rb", "config/unicorn.rb"
    gsub_file("config/unicorn.rb", "Ww", project_name)
    gsub_file("config/unicorn.rb", "root = \"/home/ziongh/railsProjects/current/ww\"", "root = \"#{project_path}\"")
    copy_file "unicorn_init.sh", "config/unicorn_init.sh"
    gsub_file("config/unicorn_init.sh", "APP_ROOT=\"/home/EXAMPLE_USER/railsProjects/current/ww\"", "APP_ROOT=\"#{project_path}\"" )
    gsub_file("config/unicorn_init.sh", "AS_USER=EXAMPLE_USER", "AS_USER=\"#{project_user}\"" )
    
 # ----------- Configure Pages To use Bootstrap -------------
    inject_into_file "app/assets/stylesheets/application.css.scss", "\n *= require bootstrap
 *= require chosen", after: "*= require_tree ."

 # ----------- Configure Routes ---------------------------------
    inject_into_file "config/routes.rb", "  match '/contact', to: 'static_pages#contact' , via: 'get'\n", :after => "Rails.application.routes.draw do\n"
    inject_into_file "config/routes.rb", "  match '/about', to: 'static_pages#about' , via: 'get'\n", :after => "Rails.application.routes.draw do\n"
    inject_into_file "config/routes.rb", "  match '/help', to: 'static_pages#help' , via: 'get'\n", :after => "Rails.application.routes.draw do\n"
    inject_into_file "config/routes.rb", "  root to: \"static_pages#home\"\n", :after => "Rails.application.routes.draw do\n"
    
 # ----------- Configure Translations, assets and cache store -----------------------
    inject_into_file "config/application.rb", "\n  I18n.enforce_available_locales = true\n", :before => "end\nend"
    inject_into_file "config/application.rb", "\n  config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)\n", :before => "end\nend"
    inject_into_file "config/application.rb", "\n  config.assets.initialize_on_precompile = false\n", :before => "end\nend"
    # inject_into_file "config/application.rb", "\n  config.cache_store = :redis_store, 'redis://localhost:6379/0/cache', { expires_in: 90.minutes }\n", :before => "end\nend"
    inject_into_file "config/application.rb", "\n  config.cache_store = :memory_store, { expires_in: 90.minutes }\n", :before => "end\nend"
    inject_into_file "config/application.rb", "\n  config.hosts = {
      \"development\" => \"localhost:3000\",
      \"test\"        => \"localhost:3000\",
      \"production\"  => \"#{project_name}.com\"
    }\n", :before => "end\nend"

# ----------- Configure production properties and mailing system (Mandrill) ----------------------
    inject_into_file "config/environments/production.rb", "  config.static_cache_control = \"public, max-age=3600000\"\n", :after => "pplication.configure do\n"
    inject_into_file "config/environments/production.rb", "  config.assets.css_compressor = :yui\n", :after => "pplication.configure do\n"
    gsub_file("config/environments/production.rb",'config.assets.compile = false','config.assets.compile = true')
    
    inject_into_file "config/environments/production.rb", "\n\n  config.action_mailer.default_url_options = { :host => config.hosts[Rails.env] }
  # ActionMailer Config
  # Setup for production - deliveries, no errors raised
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.default :charset => \"utf-8\"

  # Mandrill Connectivity
  config.action_mailer.smtp_settings = {
    :address   => \"smtp.mandrillapp.com\",
    :port      => 587, # ports 587 and 2525 are also supported with STARTTLS
    :enable_starttls_auto => true, # detects and uses STARTTLS
    :user_name => \"example@example.com\",
    :password  => \"PASSWORD_EXAMPLE\", # SMTP password is any valid API key
    :authentication => 'plain', # Mandrill supports 'plain' or 'login'
    :domain => config.hosts[Rails.env]
  }\n\n", :after => "pplication.configure do\n"

    


# ------------- Configure Mailing service for development (testing) -------------------------------
    inject_into_file "config/environments/development.rb", "\n\n   config.action_mailer.default_url_options = { :host => config.hosts[Rails.env] }
  config.action_mailer.delivery_method = :smtp
  # change to true to allow email to be sent during development
  config.action_mailer.perform_deliveries = false
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default :charset => \"utf-8\"
\n\n", after: "pplication.configure do\n"

    inject_into_file "config/environments/test.rb", "# ActionMailer Config
  config.action_mailer.default_url_options = { :host => config.hosts[Rails.env] }
\n", before: "end"


# ------------- Configure HTML Compressor -------------------------------
    inject_into_file "config/environments/production.rb", "\n  options = {
    :enabled => true,
    :remove_multi_spaces => true,
    :remove_comments => true,
    :remove_intertag_spaces => false,
    :remove_quotes => false,
    :compress_css => false,
    :compress_javascript => false,
    :simple_doctype => false,
    :remove_script_attributes => false,
    :remove_style_attributes => false,
    :remove_link_attributes => false,
    :remove_form_attributes => false,
    :remove_input_attributes => false,
    :remove_javascript_protocol => false,
    :remove_http_protocol => false,
    :remove_https_protocol => false,
    :preserve_line_breaks => false,
    :simple_boolean_attributes => false
  }\n
  config.middleware.use HtmlCompressor::Rack, options", :before => "\nend"

# ------------- Create Secret for APP -------------------------------

    # filename = Dir.glob(".secret")[0]
    # remove_file File.join(project_path, filename)


    create_file (".secret")
    prepend_file(".secret", %x[rake secret])

# ---------- Configure Simple_form to be fast and compatible ------------------
    # gsub_file("config/initializers/session_store.rb", "Rails.application.config.session_store :cookie_store", "Rails.application.config.session_store :redis_store")
    gsub_file("config/initializers/simple_form.rb", "b.optional :pattern", "#b.optional :pattern")
    gsub_file("config/initializers/simple_form.rb", "# config.collection_wrapper_class = nil", "config.collection_wrapper_class = nil")
    gsub_file("config/initializers/simple_form.rb", "# config.form_class = :simple_form", "config.form_class = nil")
    gsub_file("config/initializers/simple_form.rb", "config.browser_validations = false", "config.browser_validations = true")
    gsub_file("config/initializers/simple_form.rb", "# config.translate_labels = true", "config.translate_labels = true")
    gsub_file("config/initializers/simple_form.rb", "# config.input_class = nil", "config.input_class = nil")
    gsub_file("config/initializers/simple_form.rb", "# config.cache_discovery = !Rails.env.development?", "config.cache_discovery = !Rails.env.development?")

# ----------- Fix Simple_form Integration with Bootstrap---------------------------------
    inject_into_file "config/initializers/simple_form_bootstrap.rb", "\n    # b.use :pattern\n", after:"b.use :placeholder"

# ------------ Change APP Title --------------------------------
    inject_into_file "app/helpers/application_helper.rb", "\n   def title
        base_title = \"#{project_name}\"
        if @title.nil?
            base_title
        else
            \"#\{base_title} | #\{@title}\"
        end
    end
    ", :after => "module ApplicationHelper"

# ------------ Configure Static Pages Title --------------------------------
    inject_into_file "app/controllers/static_pages_controller.rb", "\n    @title = nil\n", after: "def home"
    inject_into_file "app/controllers/static_pages_controller.rb", "\n    @title = \"About\"\n", after: "def about"
    inject_into_file "app/controllers/static_pages_controller.rb", "\n    @title = \"Help\"\n", after: "def help"
    inject_into_file "app/controllers/static_pages_controller.rb", "\n    @title = \"Contact\"\n", after: "def contact"



# ------------- Authenticate Users -------------------------------
    inject_into_file "app/controllers/application_controller.rb", "\n    # before_action :authenticate_user!
    before_action :configure_permitted_parameters, if: :devise_controller?

    rescue_from CanCan::AccessDenied do |exception|
        redirect_to root_path, :alert => exception.message
    end

protected

    def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :name, :cpf, :cnpj, :client, :provider) }
        devise_parameter_sanitizer.for(:account_update) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :current_password, :name,:cpf, :cnpj, :client, :provider) }
    end\n", after: "protect_from_forgery with: :exception"

# ------------- Adds Navigation Bar to WebSite -------------------------------

    # filename = Dir.glob("app/views/layouts/_navigation.html.erb")[0]
    # remove_file File.join(project_path, filename)

    copy_file "_navigation.html.erb" , "app/views/layouts/_navigation.html.erb"

    # filename = Dir.glob("app/views/layouts/_navigation_links.html.erb")[0]
    # remove_file File.join(project_path, filename)

    copy_file "_navigation_links.html.erb" , "app/views/layouts/_navigation_links.html.erb"

    # filename = Dir.glob("app/views/layouts/application.html.erb")[0]
    # remove_file File.join(project_path, filename)

    copy_file "application.html.erb" , "app/views/layouts/application.html.erb"

# ------------- Create Views -------------------------------

    # filename = Dir.glob("app/views/static_pages/about.html.erb")[0]
    # remove_file File.join(project_path, filename)

    copy_file "about.html.erb" , "app/views/static_pages/about.html.erb"

    # filename = Dir.glob("app/views/static_pages/contact.html.erb")[0]
    # remove_file File.join(project_path, filename)
    copy_file "about.html.erb" , "app/views/static_pages/contact.html.erb"

    # filename = Dir.glob("app/views/static_pages/help.html.erb")[0]
    # remove_file File.join(project_path, filename)
    copy_file "about.html.erb" , "app/views/static_pages/help.html.erb"
    
    gsub_file("app/views/static_pages/help.html.erb", "<h1>About</h1>", "<h1>Help</h1>") 
    gsub_file("app/views/static_pages/contact.html.erb", "<h1>About</h1>", "<h1>Contact</h1>")

    # filename = Dir.glob("app/views/static_pages/home.html.erb")[0]
    # remove_file File.join(project_path, filename)
    copy_file "home.html.erb" , "app/views/static_pages/home.html.erb"
    
# ------------- Add some Styling to WebSite -------------------------------
#

    copy_file "docs.css" , "app/assets/stylesheets/docs.css"
    copy_file "custom.js" , "app/assets/javascripts/custom.js"

# ------------- Configure Friendly ID TO hide ID from URL-------------------------------
    gsub_file("config/initializers/devise.rb","# config.scoped_views = false","config.scoped_views = true")
    inject_into_file "app/models/user.rb","\nextend FriendlyId
  friendly_id :name, use: :slugged
", after: "ActiveRecord::Base"

# ------------- Configure Mail address of Mandrill -------------------------------
    gsub_file("config/initializers/devise.rb","# config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'","config.mailer_sender = 'info@#{project_name}.com'")
    #inject_into_file "app/models/user.rb","\n    config.mailer_sender = 'info@#{project_name}.com'", after: "ActiveRecord::Base"

# ------------- Adds abilities to Users -------------------------------
    

inject_into_file "app/models/ability.rb","\n    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
    else
      can :read, :all
    end
    ", after: "def initialize(user)"

# ------------ Configure Stylesheets --------------------------------

    gsub_file("app/assets/stylesheets/application.css.scss", "*= require_tree .
 *= require bootstrap
 *= require chosen
 *= require_self", "*= require bootstrap
 *= require chosen
 *= require_tree .
 *= require_self")
    remove_file "app/assets/stylesheets/simple.css"
    copy_file "simple.css", "app/assets/stylesheets/simple.css"

    inject_into_file "app/assets/javascripts/application.js", "//= require bootstrap\n", before: "//= require_tree ."

# ------------ Config Database Pass and User to NULL --------------------------------
#
    gsub_file("config/database.yml", "username:", "# username:" )
    gsub_file("config/database.yml", "password:", "# password:" )


# ----------- Recreate app in all environments ---------------------------------
#
    rake("db:drop")
    rake("db:schema:cache:clear")
    rake("db:create")
    rake("db:migrate")
    rake("db:schema:cache:dump ")
    rake("assets:clean")
    rake("assets:precompile")
    rake("cache_digests:dependencies")
    rake("cache_digests:nested_dependencies")


    inside Rails.root do
        run "rake db:drop RAILS_ENV=production"
        run "rake db:schema:cache:clear RAILS_ENV=production"
        run "rake db:create RAILS_ENV=production"
        run "rake db:migrate RAILS_ENV=production"
        run "rake db:schema:cache:dump RAILS_ENV=production"
        run "rake assets:clean RAILS_ENV=production"
        run "rake assets:precompile RAILS_ENV=production"
        run "mkdir ./tmp/pids"
    end

  end