lib/lightio/monkey.rb in lightio-0.4.0.pre vs lib/lightio/monkey.rb in lightio-0.4.0
- old
+ new
@@ -1,66 +1,86 @@
module LightIO
module Monkey
class PatchError < StandardError
end
- IO_PATCH_CONSTANTS = %w{IO File Socket Socket::Ifaddr TCPServer TCPSocket BasicSocket Addrinfo IPSocket UDPSocket UNIXSocket UNIXServer}.freeze
+ IO_PATCH_CONSTANTS = %w{IO File Socket Socket::Ifaddr TCPServer TCPSocket BasicSocket Addrinfo IPSocket UDPSocket UNIXSocket UNIXServer OpenSSL::SSL::SSLSocket}.freeze
THREAD_PATCH_CONSTANTS = %w{Thread ThreadGroup Queue SizedQueue ConditionVariable Mutex ThreadsWait}.freeze
@patched
class << self
def patch_all!
patch_thread!
patch_io!
patch_kernel!
+ nil
end
def unpatch_all!
unpatch_thread!
unpatch_io!
unpatch_kernel!
+ nil
end
def patched?(obj)
patched.key?(obj) && !patched[obj]&.empty?
end
def patch_thread!
require 'thread'
THREAD_PATCH_CONSTANTS.each {|klass_name| patch!(klass_name)}
patch_method!(Timeout, :timeout, LightIO::Timeout.method(:timeout))
+ nil
end
def unpatch_thread!
require 'thread'
THREAD_PATCH_CONSTANTS.each {|klass_name| unpatch!(klass_name)}
unpatch_method!(Timeout, :timeout)
+ nil
end
def patch_io!
require 'socket'
IO_PATCH_CONSTANTS.each {|klass_name| patch!(klass_name)}
+ patch_method!(Process, :spawn, LightIO.method(:spawn).to_proc)
+ nil
end
def unpatch_io!
require 'socket'
IO_PATCH_CONSTANTS.each {|klass_name| unpatch!(klass_name)}
+ unpatch_method!(Process, :spawn)
+ nil
end
def patch_kernel!
- patch_method!(Kernel, :sleep, LightIO.method(:sleep))
- patch_method!(Kernel, :select, LightIO::Library::IO.method(:select))
- patch_instance_method!(Kernel, :sleep, LightIO.method(:sleep))
- patch_instance_method!(Kernel, :select, LightIO::Library::IO.method(:select))
+ patch_kernel_method!(:sleep, LightIO.method(:sleep))
+ patch_kernel_method!(:select, LightIO::Library::IO.method(:select))
+ patch_kernel_method!(:open, LightIO::Library::File.method(:open).to_proc)
+ patch_kernel_method!(:spawn, LightIO.method(:spawn).to_proc)
+ patch_kernel_method!(:`, LightIO.method(:`).to_proc)
+ patch_kernel_method!(:system, LightIO.method(:system).to_proc)
+ %w{gets readline readlines}.each do |method|
+ patch_kernel_method!(method.to_sym, LightIO.method(method.to_sym).to_proc)
+ end
+ nil
end
def unpatch_kernel!
- unpatch_method!(Kernel, :sleep, LightIO.method(:sleep))
- unpatch_method!(Kernel, :select, LightIO::Library::IO.method(:select))
- unpatch_instance_method!(Kernel, :sleep, LightIO.method(:sleep))
- unpatch_instance_method!(Kernel, :select, LightIO::Library::IO.method(:select))
+ unpatch_kernel_method!(:sleep)
+ unpatch_kernel_method!(:select)
+ unpatch_kernel_method!(:open)
+ unpatch_kernel_method!(:spawn)
+ unpatch_kernel_method!(:`)
+ unpatch_kernel_method!(:system)
+ %w{gets readline readlines}.each do |method|
+ unpatch_kernel_method!(method.to_sym, LightIO.method(method.to_sym).to_proc)
+ end
+ nil
end
private
def patch!(klass_name)
klass = Object.const_get(klass_name)
@@ -84,9 +104,19 @@
unpatch_method!(klass, :new)
find_monkey_patch_class_methods(klass_name).each do |method_name|
unpatch_method!(klass, method_name)
end
patched.delete(klass)
+ end
+
+ def patch_kernel_method!(method_name, method)
+ patch_method!(Kernel, method_name, method)
+ patch_instance_method!(Kernel, method_name, method)
+ end
+
+ def unpatch_kernel_method!(method_name)
+ unpatch_method!(Kernel, method_name)
+ unpatch_instance_method!(Kernel, method_name)
end
def find_class_methods_module(klass_name)
LightIO::Module.const_get("#{klass_name}::ClassMethods", false)
rescue NameError
\ No newline at end of file