class Rockstart::Authorization::DeviseGenerator

Public Instance Methods

add_devise_controllers() click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 33
def add_devise_controllers
  Dir.mktmpdir do |dir|
    generate_devise_controllers(dir)
    add_pundit_support(dir) if pundit?
    devise_controllers.each do |controller|
      copy_file File.join(dir, controller_path(controller)), controller_path(controller)
    end
  end
rescue LoadError
  abort("Please install devise gem!!!") if behavior == :invoke
end
add_rspec_coverage() click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 55
def add_rspec_coverage
  directory "spec"
end
add_user_model() click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 18
def add_user_model
  directory "models", "app/models"
  migration_template "create_user_migration.rb.tt", "db/migrate/create_users.rb"
  migration_template "add_devise_to_users_migration.rb.tt", "db/migrate/add_devise_to_users.rb"
end
generate_routes() click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 45
    def generate_routes
      route <<~USER_ROUTE
        devise_for :users, controllers: {
          sessions: "users/sessions",
          passwords: "users/passwords",
          registrations: "users/registrations"
        }
      USER_ROUTE
    end
install_devise() click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 24
def install_devise
  Dir.mktmpdir do |dir|
    generate_devise_install(dir)
    directory File.join(dir, "config"), "config"
  end
rescue LoadError
  abort("Please install devise gem!!!") if behavior == :invoke
end
update_application_url_concerns() click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 59
def update_application_url_concerns
  change_application_url("url_for_authentication", "new_user_session_path")
end

Private Instance Methods

add_layout_to_controller(dir, controller) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 152
def add_layout_to_controller(dir, controller)
  inject_into_file File.join(dir, controller_path(controller)), after: /< Devise::.*$/ do
    "\n  layout \"#{options[:devise_layout]}\"\n"
  end

  # Replace Generic resource routes with users
  gsub_file File.join(dir, controller_path(controller)), "/resource", "/users"
end
add_pudit_authorize_current_user_callback(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 187
def add_pudit_authorize_current_user_callback(dir)
  inject_into_file File.join(dir, controller_path("registrations")),
                   after: /before_action :configure_account_update_params.*$/ do
    "\n  before_action :authorize_current_user, only: %i[edit update destroy]"
  end
end
add_pudit_authorize_current_user_method(dir) click to toggle source

rubocop:enable Layout/LineLength

# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 176
    def add_pudit_authorize_current_user_method(dir)
      inject_into_file File.join(dir, controller_path("registrations")), after: "protected\n" do
        "\n" + <<~'METHOD'.gsub(/([^\n]*)\n/, "  \\1\n")
          # Ensure the logged in user is able to update or destroy their account
          def authorize_current_user
            authorize current_user
          end
        METHOD
      end
    end
add_pudit_error_handling_concern(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 194
def add_pudit_error_handling_concern(dir)
  inject_into_file File.join(dir, controller_path("registrations")), after: /< Devise::.*$/ do
    "\n  include PunditErrorHandling\n"
  end
end
add_pundit_support(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 161
def add_pundit_support(dir)
  use_pundit_for_update_user_details(dir)
  add_pudit_authorize_current_user_method(dir)
  add_pudit_authorize_current_user_callback(dir)
  add_pudit_error_handling_concern(dir)
end
add_translations(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 120
def add_translations(dir)
  inject_into_file File.join(dir, "config/locales/devise.en.yml"), after: /failure:$/ do
    "\n      deleted_account: " \
      "\"You've deleted your account. Please contact support if you want to recover it!\""
  end
end
build_devise_controllers_generator(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 143
def build_devise_controllers_generator(dir)
  initializer = ::Devise::Generators::ControllersGenerator.new(
    report_stream: StringIO.new
  )
  initializer.destination_root = dir
  initializer.source_paths.insert(1, File.join(self.class.source_root, "controllers"))
  initializer
end
build_devise_install_generator(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 76
def build_devise_install_generator(dir)
  require "generators/devise/install_generator"

  initializer = ::Devise::Generators::InstallGenerator.new(
    report_stream: StringIO.new
  )
  initializer.destination_root = dir
  initializer
end
controller_path(controller) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 200
def controller_path(controller)
  File.join("app", "controllers", "users", "#{controller}_controller.rb")
end
devise_controllers() click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 204
def devise_controllers
  %w[sessions passwords registrations]
end
devise_initializer(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 127
def devise_initializer(dir)
  File.join(dir, "config", "initializers", "devise.rb")
end
generate_devise_controllers(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 131
def generate_devise_controllers(dir)
  require "generators/devise/controllers_generator"

  initializer = build_devise_controllers_generator(dir)
  initializer.scope = "users"
  initializer.invoke_all

  devise_controllers.each do |controller|
    add_layout_to_controller(dir, controller)
  end
end
generate_devise_install(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 65
def generate_devise_install(dir)
  initializer = build_devise_install_generator(dir)
  initializer.invoke_all

  update_initializer(dir)
  make_devise_paranoid(dir)
  send_email_on_email_change(dir)
  send_email_on_password_change(dir)
  add_translations(dir)
end
make_devise_paranoid(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 99
def make_devise_paranoid(dir)
  gsub_file devise_initializer(dir),
            /config\.paranoid = (true|false)/,
            "config.paranoid = true"
  uncomment_lines devise_initializer(dir), /config\.paranoid = true/
end
send_email_on_email_change(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 106
def send_email_on_email_change(dir)
  gsub_file devise_initializer(dir),
            /config\.send_email_changed_notification = (true|false)/,
            "config.send_email_changed_notification = true"
  uncomment_lines devise_initializer(dir), /config\.send_email_changed_notification = true/
end
send_email_on_password_change(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 113
def send_email_on_password_change(dir)
  gsub_file devise_initializer(dir),
            /config\.send_password_change_notification = (true|false)/,
            "config.send_password_change_notification = true"
  uncomment_lines devise_initializer(dir), /config\.send_password_change_notification = true/
end
update_initializer(dir) click to toggle source
# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 86
def update_initializer(dir)
  gsub_file devise_initializer(dir),
            /config\.mailer_sender = ['"][^'"]+['']/,
            'config.mailer_sender = ENV.fetch("DEVISE_MAILER_SENDER",' \
            " Rails.application.credentials.devise_mailer_sender)"
  gsub_file devise_initializer(dir),
            /config\.secret_key = ['"][^'"]+['']/,
            'config.secret_key = ENV.fetch("DEVISE_SECRET_KEY")'
  gsub_file devise_initializer(dir),
            /config\.pepper = ['"][^'"]+['']/,
            'config.pepper = ENV.fetch("DEVISE_PEPPER")'
end
use_pundit_for_update_user_details(dir) click to toggle source

rubocop:disable Layout/LineLength

# File lib/generators/rockstart/authorization/devise/devise_generator.rb, line 169
def use_pundit_for_update_user_details(dir)
  gsub_file File.join(dir, controller_path("registrations")),
            /\.permit\(:account_update.*\)/,
            ".permit(:account_update, keys: policy(current_user).permitted_attributes_for_update)"
end