class AutoAutoloader

Public Class Methods

autoload_sub_classes(base, path) click to toggle source
# File lib/auto_autoloader.rb, line 4
def self.autoload_sub_classes(base, path)
  loader = ::AutoAutoloader.new(base: base, path: path)

  if loader.rails?
    loader.autoload_by_active_support_and_file_scan
  else
    loader.autoload_with_sub_class_autoloader
  end
end
new(args) click to toggle source
# File lib/auto_autoloader.rb, line 14
def initialize(args)
  @base = args.fetch(:base)
  @path = args.fetch(:path)
end

Public Instance Methods

autoload_by_active_support_and_file_scan() click to toggle source
# File lib/auto_autoloader.rb, line 29
def autoload_by_active_support_and_file_scan
  dir_path = "#{::File.dirname(@path)}/#{::StringCases.camel_to_snake(@base.name.split("::").last)}"

  ::Dir.foreach(dir_path) do |file|
    next unless (match = file.match(/\A(.+)\.rb\Z/))
    const_snake_case = match[1]
    const_camel_case = ::StringCases.snake_to_camel(const_snake_case)

    @base.autoload(const_camel_case, "#{dir_path}/#{file}")
  end
rescue Errno::ENOENT # rubocop:disable Lint/HandleExceptions
  # The directory doesn't exist. Don't autoload it.
end
autoload_with_sub_class_autoloader() click to toggle source
# File lib/auto_autoloader.rb, line 19
def autoload_with_sub_class_autoloader
  require_relative "auto_autoloader/sub_class_autoloader"
  @base.extend ::AutoAutoloader::SubClassAutoloader::ClassMethods
  path = @path

  @base.class_eval do
    @autoload_path = ::File.dirname(path)
  end
end
rails?() click to toggle source
# File lib/auto_autoloader.rb, line 43
def rails?
  @rails ||= ::Object.const_defined?("Rails")
end