Sha256: 111729eebd1426750ce85ad2a69de0aa240ccb3e8378e753d096d6364c08075a

Contents?: true

Size: 1.34 KB

Versions: 5

Compression:

Stored size: 1.34 KB

Contents

require 'alki/support'

module Alki
  module Reload
    class Unloader
      def initialize(handlers,whitelist=[])
        @handlers = handlers
        @whitelist = whitelist
      end

      def find_unloadable
        files = []
        consts = []
        $LOADED_FEATURES.each do |path|
          if path.end_with?('.rb')
            result = @handlers.lazy.map{|h| h.handle_path path }.find{|r| r != nil}
            if result
              if add_const consts, result
                files << path
              end
            end
          end
        end
        unless files.empty?
          {files: files, consts: consts}
        end
      end

      def unload(files:, consts:)
        $LOADED_FEATURES.delete_if {|f| files.include? f}
        consts.each {|(parent,const)| parent.send :remove_const, const}
      end

      private

      def add_const(consts,name)
        unless @whitelist.include? name
          md = name.match(%r{(.*)/(.*)})
          if md
            parent = Alki::Support.constantize Alki::Support.classify md[1]
            name = md[2]
          else
            parent = Object
          end
          name = Alki::Support.classify(name).to_sym
          if parent && parent.is_a?(Module) && parent.const_defined?(name,false)
            consts << [parent,name]
            true
          end
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
alki-reload-0.3.4 lib/alki/reload/unloader.rb
alki-reload-0.3.3 lib/alki/reload/unloader.rb
alki-reload-0.3.2 lib/alki/reload/unloader.rb
alki-reload-0.3.1 lib/alki/reload/unloader.rb
alki-reload-0.2.0 lib/alki/reload/unloader.rb