Sha256: e65b7275c6e2e68b7301f259476b9f0a150315e87af41f920191975e28087940

Contents?: true

Size: 843 Bytes

Versions: 4

Compression:

Stored size: 843 Bytes

Contents

# frozen_string_literal: true

module Leftovers
  # zero dependency zeitwerk
  module Autoloader
    ALL_CAPS_NAMES = %w{ast cli version erb json yaml}.freeze

    def self.included(klass)
      ::Dir[glob_children(klass)].each_entry do |path|
        klass.autoload(class_from_path(path), path)
      end
    end

    def self.class_from_path(path)
      name = ::File.basename(path).delete_suffix('.rb')
      if ALL_CAPS_NAMES.include?(name)
        name.upcase
      else
        name.gsub(/(?:^|_)(\w)/, &:upcase).delete('_')
      end
    end

    def self.dir_path_from_class(klass)
      klass.name.gsub(/::/, '/')
        .gsub(/(?<=[a-z])([A-Z])/, '_\1').downcase
    end

    def self.glob_children(klass)
      "#{root}/#{dir_path_from_class(klass)}/*.rb"
    end

    def self.root
      ::File.dirname(__dir__)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
leftovers-0.12.2 lib/leftovers/autoloader.rb
leftovers-0.12.1 lib/leftovers/autoloader.rb
leftovers-0.12.0 lib/leftovers/autoloader.rb
leftovers-0.11.2 lib/leftovers/autoloader.rb