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