Sha256: 325799844a7f66d97b1b4966ba2805fbb467e4baa75ba3b7720df651526e6291

Contents?: true

Size: 1.98 KB

Versions: 2

Compression:

Stored size: 1.98 KB

Contents

module Bumbler
  module Hooks
    # Inject our custom handling of require into the Kernel.
    def self.hook_require!
      @hooking_require = true
      
      # There are two independent require methods.  Joy!
      ::Kernel.module_eval do
        class << self
          orig_public_require = Kernel.public_method(:require)
          define_method(:require) do |path, *args|
            ::Bumbler::Hooks.handle_require(path) do
              orig_public_require.call(path, *args)
            end
          end
        end
        
        orig_instance_require = self.instance_method(:require)
        define_method(:require) do |path, *args|
          ::Bumbler::Hooks.handle_require(path) do
            orig_instance_require.bind(self).call(path, *args)
          end
        end
      end
      
      @hooking_require = nil
    end
    
    # Even better: Other gems hook require as well.  The instance method one at least.
    def self.watch_require!
      ::Kernel.module_eval do
        # It isn't previously defined in Kernel.  This could be a bit dangerous, though.
        def self.method_added(method_name, *args)
          if method_name == :require && !::Bumbler::Hooks.hooking_require?
            # Fix those hooks.
            ::Bumbler::Hooks.hook_require!
          end
        end
      end
    end
    
  private
    def self.hooking_require?
      @hooking_require
    end
    
    # Actually do something about a require here.
    def self.handle_require(path)
      # break out early if we're already handling this
      return yield if path == @previous_require
      @previous_require = path
      
      # Shortcut unless we're tracking the gem
      gem_name = Bumbler::Bundler.gem_for_require(path)
      return yield unless gem_name
      
      # Let's time them
      start = Time.now.to_f
      result = yield
      require_time = (Time.now.to_f - start) * 1000 # ms
      
      Bumbler::Bundler.require_finished(path, require_time) if result
      
      return result
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
bumbler-0.1.1 lib/bumbler/hooks.rb
bumbler-0.1.0 lib/bumbler/hooks.rb