Skip to content

Commit 2589671

Browse files
Test custom reload function
1 parent bf955bc commit 2589671

File tree

2 files changed

+51
-3
lines changed

2 files changed

+51
-3
lines changed

bpython/curtsiesfrontend/sitefix.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import sys
21
import functools
2+
import imp
3+
import sys
34

45
from six.moves import builtins
56

@@ -25,6 +26,8 @@ def monkeypatch_quit():
2526
import importlib
2627
if hasattr(importlib, 'reload'):
2728
orig_reload = importlib.reload
29+
elif hasattr(imp, 'reload'):
30+
orig_reload = imp.reload
2831
else:
2932
orig_reload = builtins.reload
3033

@@ -34,18 +37,21 @@ def reload(module):
3437
orig_stdout = sys.stdout
3538
orig_stderr = sys.stderr
3639
orig_stdin = sys.stdin
37-
orig_reload(sys)
40+
r = orig_reload(sys)
3841
sys.stdout = orig_stdout
3942
sys.stderr = orig_stderr
4043
sys.stdin = orig_stdin
44+
return r
4145
else:
42-
orig_reload(sys)
46+
return orig_reload(module)
4347

4448
functools.update_wrapper(reload, orig_reload)
4549

4650

4751
def monkeypatch_reload():
4852
if py3 and hasattr(importlib, 'reload'):
4953
importlib.reload = reload
54+
elif py3 and hasattr(imp, 'reload'):
55+
imp.reload = reload
5056
else:
5157
builtins.reload = reload

bpython/test/test_sitefix.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import sys
2+
import optparse
3+
4+
from bpython.test import FixLanguageTestCase as TestCase
5+
6+
from bpython.curtsiesfrontend import sitefix
7+
8+
9+
class AttrReplaced(object):
10+
def __init__(self, module, attr, replacement):
11+
self.module = module
12+
self.attr = attr
13+
self.replacement = replacement
14+
15+
def __enter__(self):
16+
if hasattr(self.module, self.attr):
17+
self.orig_value = getattr(self.module, self.attr)
18+
setattr(self.module, self.attr, self.replacement)
19+
20+
def __exit__(self, exc_type, exc_value, traceback):
21+
if hasattr(self, 'orig_value'):
22+
setattr(self.module, self.attr, self.replacement)
23+
else:
24+
delattr(self.module, self.attr)
25+
26+
27+
class TestCurtsiesReevaluateWithImport(TestCase):
28+
def test_reload_works(self):
29+
orig = optparse.SUPPRESS_HELP
30+
with AttrReplaced(optparse, 'SUPPRESS_HELP', 1):
31+
# reload(optparse)
32+
sitefix.reload(optparse)
33+
self.assertEqual(optparse.SUPPRESS_HELP, orig)
34+
35+
def test_reload_sys(self):
36+
with AttrReplaced(sys, 'stdin', 1):
37+
with AttrReplaced(sys, 'a', 2):
38+
with AttrReplaced(sys, 'version', 3):
39+
sitefix.reload(sys)
40+
self.assertEqual(sys.a, 2) # new attrs stick around
41+
self.assertEqual(sys.stdin, 1) # stdin stays
42+
self.assertNotEqual(sys.version, 3) # others replaced

0 commit comments

Comments
 (0)