Sha256: d7ad97c74d50057247241bbda609edbf0bd72ab8b5867aa6c57a11e99325adaa

Contents?: true

Size: 1.9 KB

Versions: 45

Compression:

Stored size: 1.9 KB

Contents

# frozen_string_literal: true

module Mutant
  # Zombifier namespace
  class Zombifier
    include Anima.new(
      :includes,
      :load_path,
      :kernel,
      :namespace,
      :pathname,
      :require_highjack,
      :root_require
    )

    private(*anima.attribute_names)

    include AST::Sexp

    # rubocop:disable Lint/InheritException
    LoadError = Class.new(::LoadError)
    # rubocop:enable Lint/InheritException

    # Initialize object
    #
    # @param [Symbol] namespace
    #
    # @return [undefined]
    def initialize(*)
      super
      @includes = %r{\A#{Regexp.union(includes)}(?:/.*)?\z}
      @zombified = Set.new
    end

    # Call zombifier
    #
    # @return [self]
    def self.call(*args)
      new(*args).__send__(:call)
      self
    end

  private

    attr_reader :original
    private :original
    #
    # @return [Method]

    def call
      @original = require_highjack.call(method(:require))
      require(root_require)
    end

    def include?(logical_name)
      !@zombified.include?(logical_name) && includes =~ logical_name
    end

    def require(logical_name)
      logical_name = logical_name.to_s
      loaded = original.call(logical_name)
      return loaded unless include?(logical_name)
      @zombified << logical_name
      zombify(find(logical_name))
      true
    end

    def find(logical_name)
      file_name = "#{logical_name}.rb"

      load_path.each do |path|
        path = pathname.new(path).join(file_name)
        return path if path.file?
      end

      fail LoadError, "Cannot find file #{file_name.inspect} in load path"
    end

    def zombify(source_path)
      kernel.eval(
        Unparser.unparse(namespaced_node(source_path)),
        TOPLEVEL_BINDING,
        source_path.to_s
      )
    end

    def namespaced_node(source_path)
      s(:module, s(:const, nil, namespace), Unparser.parse(source_path.read))
    end

  end # Zombifier
end # Mutant

Version data entries

45 entries across 45 versions & 1 rubygems

Version Path
mutant-0.11.4 lib/mutant/zombifier.rb
mutant-0.11.3 lib/mutant/zombifier.rb
mutant-0.11.2 lib/mutant/zombifier.rb
mutant-0.11.1 lib/mutant/zombifier.rb
mutant-0.11.0 lib/mutant/zombifier.rb
mutant-0.10.35 lib/mutant/zombifier.rb
mutant-0.10.34 lib/mutant/zombifier.rb
mutant-0.10.33 lib/mutant/zombifier.rb
mutant-0.10.32 lib/mutant/zombifier.rb
mutant-0.10.31 lib/mutant/zombifier.rb
mutant-0.10.30 lib/mutant/zombifier.rb
mutant-0.10.29 lib/mutant/zombifier.rb
mutant-0.10.28 lib/mutant/zombifier.rb
mutant-0.10.27 lib/mutant/zombifier.rb
mutant-0.10.26 lib/mutant/zombifier.rb
mutant-0.10.25 lib/mutant/zombifier.rb
mutant-0.10.24 lib/mutant/zombifier.rb
mutant-0.10.23 lib/mutant/zombifier.rb
mutant-0.10.22 lib/mutant/zombifier.rb
mutant-0.10.21 lib/mutant/zombifier.rb