Added monkey_patch to patcher, as well as defaults to import_patched. With tests.

This commit is contained in:
Ryan Williams
2010-02-05 21:55:46 -08:00
parent 715b2ced52
commit f21d0a97aa
2 changed files with 87 additions and 1 deletions

View File

@@ -5,6 +5,14 @@ __exclude = set(('__builtins__', '__file__', '__name__'))
def inject(module_name, new_globals, *additional_modules):
if not additional_modules:
# supply some defaults
additional_modules = (
_green_os_modules() +
_green_select_modules() +
_green_socket_modules() +
_green_thread_modules())
## Put the specified modules in sys.modules for the duration of the import
saved = {}
for name, mod in additional_modules:
@@ -47,6 +55,7 @@ def import_patched(module_name, *additional_modules, **kw_additional_modules):
None,
*additional_modules + tuple(kw_additional_modules.items()))
def patch_function(func, *additional_modules):
"""Huge hack here -- patches the specified modules for the
duration of the function call."""
@@ -66,3 +75,38 @@ def patch_function(func, *additional_modules):
del sys.modules[name]
return patched
def monkey_patch(os=True, select=True, socket=True, thread=True):
modules_to_patch = []
if os:
modules_to_patch += _green_os_modules()
if select:
modules_to_patch += _green_select_modules()
if socket:
modules_to_patch += _green_socket_modules()
if thread:
modules_to_patch += _green_thread_modules()
for name, mod in modules_to_patch:
sys.modules[name] = mod
def _green_os_modules():
from eventlet.green import os
return [('os', os)]
def _green_select_modules():
from eventlet.green import select
return [('select', select)]
def _green_socket_modules():
from eventlet.green import socket
try:
from eventlet.green import ssl
return [('socket', socket), ('ssl', ssl)]
except ImportError:
return [('socket', socket)]
def _green_thread_modules():
from eventlet.green import Queue
from eventlet.green import thread
return [('Queue', Queue), ('thread', thread)]

View File

@@ -63,4 +63,46 @@ class Patcher(LimitedTestCase):
self.assert_('eventlet.green.urllib' in lines[1])
self.assert_('eventlet.green.socket' in lines[2])
self.assert_('eventlet.green.urllib' in lines[2])
self.assert_('eventlet.green.httplib' not in lines[2])
self.assert_('eventlet.green.httplib' not in lines[2])
def test_import_patched_defaults(self):
self.write_to_tempfile("base", base_module_contents)
new_mod = """
from eventlet import patcher
base = patcher.import_patched('base')
print "newmod", base, base.socket, base.urllib.socket.socket
"""
self.write_to_tempfile("newmod", new_mod)
python_path = os.pathsep.join(sys.path + [self.tempdir])
new_env = os.environ.copy()
new_env['PYTHONPATH'] = python_path
p = subprocess.Popen([sys.executable,
os.path.join(self.tempdir, "newmod.py")],
stdout=subprocess.PIPE, env=new_env)
output = p.communicate()
lines = output[0].split("\n")
self.assert_(lines[0].startswith('base'))
self.assert_(lines[1].startswith('newmod'))
self.assert_('eventlet.green.socket' in lines[1])
self.assert_('GreenSocket' in lines[1])
def test_monkey_patch(self):
new_mod = """
from eventlet import patcher
patcher.monkey_patch()
import socket
import urllib
print "newmod", socket, urllib.socket.socket
"""
self.write_to_tempfile("newmod", new_mod)
python_path = os.pathsep.join(sys.path + [self.tempdir])
new_env = os.environ.copy()
new_env['PYTHONPATH'] = python_path
p = subprocess.Popen([sys.executable,
os.path.join(self.tempdir, "newmod.py")],
stdout=subprocess.PIPE, env=new_env)
output = p.communicate()
lines = output[0].split("\n")
self.assert_(lines[0].startswith('newmod'))
self.assert_('eventlet.green.socket' in lines[0])
self.assert_('GreenSocket' in lines[0])