import sys import optparse from bpython.test import FixLanguageTestCase as TestCase from bpython._py3compat import py3 from bpython.curtsiesfrontend import sitefix class AttrReplaced(object): def __init__(self, module, attr, replacement): self.module = module self.attr = attr self.replacement = replacement def __enter__(self): if hasattr(self.module, self.attr): self.orig_value = getattr(self.module, self.attr) setattr(self.module, self.attr, self.replacement) def __exit__(self, exc_type, exc_value, traceback): if hasattr(self, 'orig_value'): setattr(self.module, self.attr, self.replacement) else: delattr(self.module, self.attr) class TestCurtsiesReevaluateWithImport(TestCase): def test_reload_works(self): orig = optparse.SUPPRESS_HELP with AttrReplaced(optparse, 'SUPPRESS_HELP', 1): # reload(optparse) sitefix.reload(optparse) self.assertEqual(optparse.SUPPRESS_HELP, orig) def test_reload_sys(self): with AttrReplaced(sys, 'stdin', 1): with AttrReplaced(sys, 'a', 2): with AttrReplaced(sys, 'version', 3): sitefix.reload(sys) self.assertEqual(sys.a, 2) # new attrs stick around self.assertEqual(sys.stdin, 1) # stdin stays if not py3: # In Python 3 sys attributes are not replaced on reload self.assertNotEqual(sys.version, 3) # in Python 2