Sha256: 831d9ff312798e14982344c54499764c1337bc11fb4d6798f8f2eface6ac9bbf

Contents?: true

Size: 1.97 KB

Versions: 66

Compression:

Stored size: 1.97 KB

Contents

module Skylight
  # @api private
  module Probes
    class ProbeRegistration
      attr_reader :klass_name, :require_paths, :probe

      def initialize(klass_name, require_paths, probe)
        @klass_name = klass_name
        @require_paths = Array(require_paths)
        @probe = probe
      end

      def install
        probe.install
      end
    end

    def self.require_hooks
      @require_hooks ||= {}
    end

    def self.installed
      @installed ||= {}
    end

    def self.is_available?(klass_name)
      !!Skylight::Util::Inflector.safe_constantize(klass_name)
    end

    def self.register(*args)
      registration = ProbeRegistration.new(*args)

      if is_available?(registration.klass_name)
        installed[registration.klass_name] = registration
        registration.install
      else
        register_require_hook(registration)
      end
    end

    def self.require_hook(require_path)
      return unless Skylight.native?

      registration = lookup_by_require_path(require_path)
      return unless registration

      # Double check constant is available
      if is_available?(registration.klass_name)
        installed[registration.klass_name] = registration
        registration.install

        # Don't need this to be called again
        unregister_require_hook(registration)
      end
    end

    def self.register_require_hook(registration)
      registration.require_paths.each do |p|
        require_hooks[p] = registration
      end
    end

    def self.unregister_require_hook(registration)
      registration.require_paths.each do |p|
        require_hooks.delete(p)
      end
    end

    def self.lookup_by_require_path(require_path)
      require_hooks[require_path]
    end
  end
end

# Allow hooking require
# @api private
module ::Kernel
  alias require_without_sk require

  def require(name)
    ret = require_without_sk(name)

    begin
      Skylight::Probes.require_hook(name)
    rescue Exception
      # FIXME: Log these errors
    end

    ret
  end
end

Version data entries

66 entries across 66 versions & 2 rubygems

Version Path
skylight-1.6.0 lib/skylight/probes.rb
skylight-1.5.1 lib/skylight/probes.rb
skylight-1.5.0 lib/skylight/probes.rb
skylight-1.4.4 lib/skylight/probes.rb
skylight-1.4.3 lib/skylight/probes.rb
skylight-1.4.2 lib/skylight/probes.rb
skylight-1.4.1 lib/skylight/probes.rb
skylight-1.4.0 lib/skylight/probes.rb
skylight-1.4.0.beta.2 lib/skylight/probes.rb
skylight-1.4.0.beta lib/skylight/probes.rb
skylight-1.3.1 lib/skylight/probes.rb
skylight-1.3.0 lib/skylight/probes.rb
skylight-1.2.2 lib/skylight/probes.rb
skylight-1.2.1 lib/skylight/probes.rb
skylight-1.2.0 lib/skylight/probes.rb
skylight-1.1.0 lib/skylight/probes.rb
skylight-1.0.1 lib/skylight/probes.rb
skylight-1.0.0 lib/skylight/probes.rb
skylight-0.10.6 lib/skylight/probes.rb
skylight-1.0.0.beta5 lib/skylight/probes.rb