Sha256: f3d77d4616635fd640e5f2c03535e4e1d7f0c9bc6f73a80613fa55cd4ebc9783

Contents?: true

Size: 1.1 KB

Versions: 1

Compression:

Stored size: 1.1 KB

Contents

class AutoAutoloader
  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

  def initialize(args)
    @base = args.fetch(:base)
    @path = args.fetch(:path)
  end

  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

  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
  end

  def rails?
    @rails ||= ::Object.const_defined?("Rails")
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
auto_autoloader-0.0.2 lib/auto_autoloader.rb