Sha256: 778ea4eed8d82fa6968079ccc0066753af9cdf92bc5f758bc14822bad9a44527

Contents?: true

Size: 1.35 KB

Versions: 3

Compression:

Stored size: 1.35 KB

Contents

# frozen_string_literal: true

module Prependers
  class Loader
    attr_reader :base_path, :options

    def initialize(base_path, options = {})
      @base_path = Pathname.new(File.expand_path(base_path))
      @options = options
    end

    def load
      Dir.glob("#{base_path}/**/*.rb").sort.each do |path|
        absolute_path = Pathname.new(File.expand_path(path))
        relative_path = absolute_path.relative_path_from(base_path)

        prepender_module_name = expected_module_for(relative_path)

        unless Object.const_defined?(prepender_module_name)
          error = <<~ERROR
            Expected #{absolute_path} to define #{prepender_module_name}, but module is not defined.

            Note that Prependers does not require files automatically - you will have to do that
            yourself before calling `#load_paths`.
          ERROR

          raise NoPrependerError, error
        end

        prepender_module = Object.const_get(prepender_module_name)
        prepender_module.include Prepender.new(options[:namespace])
      end
    end

    private

    def expected_module_for(path)
      path = path.to_s[0..-(File.extname(path).length + 1)]

      return path.camelize if path.respond_to?(:camelize)

      path.to_s.gsub('/', '::').split('::').map do |part|
        part.split('_').map(&:capitalize).join
      end.join('::')
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
prependers-0.3.0 lib/prependers/loader.rb
prependers-0.2.0 lib/prependers/loader.rb
prependers-0.1.1 lib/prependers/loader.rb