Class: AutoAutoloader

Inherits:
Object
  • Object
show all
Defined in:
lib/auto_autoloader.rb

Defined Under Namespace

Classes: SubClassAutoloader

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ AutoAutoloader

Returns a new instance of AutoAutoloader.



14
15
16
17
# File 'lib/auto_autoloader.rb', line 14

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

Class Method Details

.autoload_sub_classes(base, path) ⇒ Object



4
5
6
7
8
9
10
11
12
# 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

Instance Method Details

#autoload_by_active_support_and_file_scanObject



29
30
31
32
33
34
35
36
37
38
39
40
41
# 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_autoloaderObject



19
20
21
22
23
24
25
26
27
# 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?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/auto_autoloader.rb', line 43

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