Show More
@@ -39,7 +39,7 b' class FakeShell:' | |||
|
39 | 39 | |
|
40 | 40 | def __init__(self): |
|
41 | 41 | self.ns = {} |
|
42 |
self.user_ns = |
|
|
42 | self.user_ns = self.ns | |
|
43 | 43 | self.user_ns_hidden = {} |
|
44 | 44 | self.events = EventManager(self, {'pre_run_cell', pre_run_cell}) |
|
45 | 45 | self.auto_magics = AutoreloadMagics(shell=self) |
@@ -49,7 +49,7 b' class FakeShell:' | |||
|
49 | 49 | |
|
50 | 50 | def run_code(self, code): |
|
51 | 51 | self.events.trigger('pre_run_cell') |
|
52 | exec(code, self.ns) | |
|
52 | exec(code, self.user_ns) | |
|
53 | 53 | self.auto_magics.post_execute_hook() |
|
54 | 54 | |
|
55 | 55 | def push(self, items): |
@@ -106,7 +106,7 b' class Fixture(object):' | |||
|
106 | 106 | (because that is stored in the file). The only reliable way |
|
107 | 107 | to achieve this seems to be to sleep. |
|
108 | 108 | """ |
|
109 | ||
|
109 | content = textwrap.dedent(content) | |
|
110 | 110 | # Sleep one second + eps |
|
111 | 111 | time.sleep(1.05) |
|
112 | 112 | |
@@ -115,6 +115,7 b' class Fixture(object):' | |||
|
115 | 115 | f.write(content) |
|
116 | 116 | |
|
117 | 117 | def new_module(self, code): |
|
118 | code = textwrap.dedent(code) | |
|
118 | 119 | mod_name, mod_fn = self.get_module() |
|
119 | 120 | with open(mod_fn, 'w') as f: |
|
120 | 121 | f.write(code) |
@@ -124,6 +125,17 b' class Fixture(object):' | |||
|
124 | 125 | # Test automatic reloading |
|
125 | 126 | #----------------------------------------------------------------------------- |
|
126 | 127 | |
|
128 | def pickle_get_current_class(obj): | |
|
129 | """ | |
|
130 | Original issue comes from pickle; hence the name. | |
|
131 | """ | |
|
132 | name = obj.__class__.__name__ | |
|
133 | module_name = getattr(obj, "__module__", None) | |
|
134 | obj2 = sys.modules[module_name] | |
|
135 | for subpath in name.split("."): | |
|
136 | obj2 = getattr(obj2, subpath) | |
|
137 | return obj2 | |
|
138 | ||
|
127 | 139 | class TestAutoreload(Fixture): |
|
128 | 140 | |
|
129 | 141 | @skipif(sys.version_info < (3, 6)) |
@@ -147,6 +159,42 b' class TestAutoreload(Fixture):' | |||
|
147 | 159 | with tt.AssertNotPrints(('[autoreload of %s failed:' % mod_name), channel='stderr'): |
|
148 | 160 | self.shell.run_code("pass") # trigger another reload |
|
149 | 161 | |
|
162 | def test_reload_class_type(self): | |
|
163 | self.shell.magic_autoreload("2") | |
|
164 | mod_name, mod_fn = self.new_module( | |
|
165 | """ | |
|
166 | class Test(): | |
|
167 | def meth(self): | |
|
168 | return "old" | |
|
169 | """ | |
|
170 | ) | |
|
171 | assert "test" not in self.shell.ns | |
|
172 | assert "result" not in self.shell.ns | |
|
173 | ||
|
174 | self.shell.run_code("from %s import Test" % mod_name) | |
|
175 | self.shell.run_code("test = Test()") | |
|
176 | ||
|
177 | self.write_file( | |
|
178 | mod_fn, | |
|
179 | """ | |
|
180 | class Test(): | |
|
181 | def meth(self): | |
|
182 | return "new" | |
|
183 | """, | |
|
184 | ) | |
|
185 | ||
|
186 | test_object = self.shell.ns["test"] | |
|
187 | ||
|
188 | # important to trigger autoreload logic ! | |
|
189 | self.shell.run_code("pass") | |
|
190 | ||
|
191 | test_class = pickle_get_current_class(test_object) | |
|
192 | assert isinstance(test_object, test_class) | |
|
193 | ||
|
194 | # extra check. | |
|
195 | self.shell.run_code("import pickle") | |
|
196 | self.shell.run_code("p = pickle.dumps(test)") | |
|
197 | ||
|
150 | 198 | def test_reload_class_attributes(self): |
|
151 | 199 | self.shell.magic_autoreload("2") |
|
152 | 200 | mod_name, mod_fn = self.new_module(textwrap.dedent(""" |
@@ -398,3 +446,4 b' x = -99' | |||
|
398 | 446 | |
|
399 | 447 | |
|
400 | 448 | |
|
449 |
General Comments 0
You need to be logged in to leave comments.
Login now