class RailsRouteChecker::LoadedApp

Attributes

app[R]

Public Class Methods

new() click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 5
def initialize
  app_base_path = Dir.pwd
  suppress_output do
    require_relative "#{app_base_path}/config/boot"
  end

  begin
    suppress_output do
      require_relative "#{Dir.pwd}/config/environment"
    end
  rescue Exception => e
    puts "Requiring your config/environment.rb file failed."
    puts "This means that something raised while trying to start Rails."
    puts ""
    puts e.backtrace
    raise(e)
  end

  suppress_output do
    @app = Rails.application
    @app.eager_load!
    attempt_to_load_default_controllers
    @app.reload_routes!
    Rails::Engine.subclasses.each(&:eager_load!)
  end
end

Public Instance Methods

all_route_names() click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 48
def all_route_names
  @all_route_names ||= app.routes.routes.map(&:name).compact
end
controller_information() click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 52
def controller_information
  @controller_information ||= ActionController::Base.descendants.map do |controller|
    next if controller.controller_path.nil? || controller.controller_path.start_with?('rails/')

    [
      controller.controller_path,
      {
        helpers: controller.helpers.methods.map(&:to_s),
        actions: controller.action_methods.to_a,
        instance_methods: instance_methods(controller),
        lookup_context: lookup_context(controller)
      }
    ]
  end.compact.to_h
end
routes() click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 32
def routes
  return @routes if defined?(@routes)

  @routes = app.routes.routes.reject do |r|
    reject_route?(r)
  end.uniq

  return @routes unless app.config.respond_to?(:assets)

  use_spec = defined?(ActionDispatch::Journey::Route) || defined?(Journey::Route)
  @routes.reject do |route|
    path = use_spec ? route.path.spec.to_s : route.path
    path =~ /^#{app.config.assets.prefix}/
  end
end

Private Instance Methods

attempt_to_load_default_controllers() click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 100
def attempt_to_load_default_controllers
  # rubocop:disable Lint/SuppressedException
  begin
    ::Rails::InfoController
  rescue NameError # ignored
  end
  begin
    ::Rails::WelcomeController
  rescue NameError # ignored
  end
  begin
    ::Rails::MailersController
  rescue NameError # ignored
  end
  # rubocop:enable Lint/SuppressedException
end
instance_methods(controller) click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 78
def instance_methods(controller)
  (controller.instance_methods.map(&:to_s) + controller.private_instance_methods.map(&:to_s)).compact.uniq
end
lookup_context(controller) click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 72
def lookup_context(controller)
  return nil unless controller.instance_methods.include?(:default_render)

  ActionView::LookupContext.new(controller._view_paths, {}, controller._prefixes)
end
reject_route?(route) click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 117
def reject_route?(route)
  return true if route.name.nil? && route.requirements.blank?
  return true if route.app.is_a?(ActionDispatch::Routing::Mapper::Constraints) &&
                 route.app.app.respond_to?(:call)
  return true if route.app.is_a?(ActionDispatch::Routing::Redirect)

  controller = route.requirements[:controller]
  action = route.requirements[:action]
  return true unless controller && action
  return true if controller.start_with?('rails/')

  false
end
suppress_output() { || ... } click to toggle source
# File lib/rails-route-checker/loaded_app.rb, line 82
def suppress_output
  begin
    original_stderr = $stderr.clone
    original_stdout = $stdout.clone
    $stderr.reopen(File.new('/dev/null', 'w'))
    $stdout.reopen(File.new('/dev/null', 'w'))
    retval = yield
  rescue Exception => e # rubocop:disable Lint/RescueException
    $stdout.reopen(original_stdout)
    $stderr.reopen(original_stderr)
    raise e
  ensure
    $stdout.reopen(original_stdout)
    $stderr.reopen(original_stderr)
  end
  retval
end