Show More
@@ -0,0 +1,37 b'' | |||
|
1 | """Tests for the key interactiveshell module. | |
|
2 | ||
|
3 | Historically the main classes in interactiveshell have been under-tested. This | |
|
4 | module should grow as many single-method tests as possible to trap many of the | |
|
5 | recurring bugs we seem to encounter with high-level interaction. | |
|
6 | ||
|
7 | Authors | |
|
8 | ------- | |
|
9 | * Fernando Perez | |
|
10 | """ | |
|
11 | #----------------------------------------------------------------------------- | |
|
12 | # Copyright (C) 2011 The IPython Development Team | |
|
13 | # | |
|
14 | # Distributed under the terms of the BSD License. The full license is in | |
|
15 | # the file COPYING, distributed as part of this software. | |
|
16 | #----------------------------------------------------------------------------- | |
|
17 | ||
|
18 | #----------------------------------------------------------------------------- | |
|
19 | # Imports | |
|
20 | #----------------------------------------------------------------------------- | |
|
21 | # stdlib | |
|
22 | import unittest | |
|
23 | ||
|
24 | #----------------------------------------------------------------------------- | |
|
25 | # Tests | |
|
26 | #----------------------------------------------------------------------------- | |
|
27 | ||
|
28 | class InteractiveShellTestCase(unittest.TestCase): | |
|
29 | def test_naked_string_cells(self): | |
|
30 | """Test that cells with only naked strings are fully executed""" | |
|
31 | ip = get_ipython() | |
|
32 | # First, single-line inputs | |
|
33 | ip.run_cell('"a"\n') | |
|
34 | self.assertEquals(ip.user_ns['_'], 'a') | |
|
35 | # And also multi-line cells | |
|
36 | ip.run_cell('"""a\nb"""\n') | |
|
37 | self.assertEquals(ip.user_ns['_'], 'a\nb') |
@@ -260,11 +260,14 b' class DisplayHook(Configurable):' | |||
|
260 | 260 | self.flush() |
|
261 | 261 | # Don't overwrite '_' and friends if '_' is in __builtin__ (otherwise |
|
262 | 262 | # we cause buggy behavior for things like gettext). |
|
263 | ||
|
263 | 264 | if '_' not in __builtin__.__dict__: |
|
264 | 265 | self.___ = self.__ |
|
265 | 266 | self.__ = self._ |
|
266 | 267 | self._ = result |
|
267 |
self.shell.user_ns.update({'_':self._, |
|
|
268 | self.shell.user_ns.update({'_':self._, | |
|
269 | '__':self.__, | |
|
270 | '___':self.___}) | |
|
268 | 271 | |
|
269 | 272 | # hackish access to top-level namespace to create _1,_2... dynamically |
|
270 | 273 | to_main = {} |
@@ -4,7 +4,7 b'' | |||
|
4 | 4 | #----------------------------------------------------------------------------- |
|
5 | 5 | # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> |
|
6 | 6 | # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu> |
|
7 |
# Copyright (C) 2008-201 |
|
|
7 | # Copyright (C) 2008-2011 The IPython Development Team | |
|
8 | 8 | # |
|
9 | 9 | # Distributed under the terms of the BSD License. The full license is in |
|
10 | 10 | # the file COPYING, distributed as part of this software. |
@@ -2113,19 +2113,6 b' class InteractiveShell(Configurable, Magic):' | |||
|
2113 | 2113 | self.history_manager.store_inputs(ipy_cell, cell) |
|
2114 | 2114 | |
|
2115 | 2115 | self.logger.log(ipy_cell, cell) |
|
2116 | # dbg code!!! | |
|
2117 | if 0: | |
|
2118 | def myapp(self, val): # dbg | |
|
2119 | import traceback as tb | |
|
2120 | stack = ''.join(tb.format_stack()) | |
|
2121 | print 'Value:', val | |
|
2122 | print 'Stack:\n', stack | |
|
2123 | list.append(self, val) | |
|
2124 | ||
|
2125 | import new | |
|
2126 | self.history_manager.input_hist_parsed.append = types.MethodType(myapp, | |
|
2127 | self.history_manager.input_hist_parsed) | |
|
2128 | # End dbg | |
|
2129 | 2116 | |
|
2130 | 2117 | # All user code execution must happen with our context managers active |
|
2131 | 2118 | with nested(self.builtin_trap, self.display_trap): |
@@ -2167,15 +2154,31 b' class InteractiveShell(Configurable, Magic):' | |||
|
2167 | 2154 | self.execution_count += 1 |
|
2168 | 2155 | |
|
2169 | 2156 | def run_one_block(self, block): |
|
2170 | """Run a single interactive block. | |
|
2157 | """Run a single interactive block of source code. | |
|
2171 | 2158 | |
|
2172 | 2159 | If the block is single-line, dynamic transformations are applied to it |
|
2173 | 2160 | (like automagics, autocall and alias recognition). |
|
2161 | ||
|
2162 | If the block is multi-line, it must consist of valid Python code only. | |
|
2163 | ||
|
2164 | Parameters | |
|
2165 | ---------- | |
|
2166 | block : string | |
|
2167 | A (possibly multiline) string of code to be executed. | |
|
2168 | ||
|
2169 | Returns | |
|
2170 | ------- | |
|
2171 | The output of the underlying execution method used, be it | |
|
2172 | :meth:`run_source` or :meth:`run_single_line`. | |
|
2174 | 2173 | """ |
|
2175 | 2174 | if len(block.splitlines()) <= 1: |
|
2176 | 2175 | out = self.run_single_line(block) |
|
2177 | 2176 | else: |
|
2178 | out = self.run_code(block) | |
|
2177 | # Call run_source, which correctly compiles the input cell. | |
|
2178 | # run_code must only be called when we know we have a code object, | |
|
2179 | # as it does a naked exec and the compilation mode may not be what | |
|
2180 | # we wanted. | |
|
2181 | out = self.run_source(block) | |
|
2179 | 2182 | return out |
|
2180 | 2183 | |
|
2181 | 2184 | def run_single_line(self, line): |
@@ -2329,7 +2332,7 b' class InteractiveShell(Configurable, Magic):' | |||
|
2329 | 2332 | try: |
|
2330 | 2333 | try: |
|
2331 | 2334 | self.hooks.pre_run_code_hook() |
|
2332 | #rprint('Running code') # dbg | |
|
2335 | #rprint('Running code', repr(code_obj)) # dbg | |
|
2333 | 2336 | exec code_obj in self.user_global_ns, self.user_ns |
|
2334 | 2337 | finally: |
|
2335 | 2338 | # Reset our crash handler in place |
@@ -1,5 +1,10 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | """Tests for the inputsplitter module. |
|
3 | ||
|
4 | Authors | |
|
5 | ------- | |
|
6 | * Fernando Perez | |
|
7 | * Robert Kern | |
|
3 | 8 | """ |
|
4 | 9 | #----------------------------------------------------------------------------- |
|
5 | 10 | # Copyright (C) 2010 The IPython Development Team |
@@ -68,11 +68,19 b' class ipnsdict(dict):' | |||
|
68 | 68 | This subclass adds a simple checkpointing capability so that when testing |
|
69 | 69 | machinery clears it (we use it as the test execution context), it doesn't |
|
70 | 70 | get completely destroyed. |
|
71 | ||
|
72 | In addition, it can handle the presence of the '_' key in a special manner, | |
|
73 | which is needed because of how Python's doctest machinery operates with | |
|
74 | '_'. See constructor and :meth:`update` for details. | |
|
71 | 75 | """ |
|
72 | 76 | |
|
73 | 77 | def __init__(self,*a): |
|
74 | 78 | dict.__init__(self,*a) |
|
75 | 79 | self._savedict = {} |
|
80 | # If this flag is True, the .update() method will unconditionally | |
|
81 | # remove a key named '_'. This is so that such a dict can be used as a | |
|
82 | # namespace in doctests that call '_'. | |
|
83 | self.protect_underscore = False | |
|
76 | 84 | |
|
77 | 85 | def clear(self): |
|
78 | 86 | dict.clear(self) |
@@ -86,10 +94,15 b' class ipnsdict(dict):' | |||
|
86 | 94 | self._checkpoint() |
|
87 | 95 | dict.update(self,other) |
|
88 | 96 | |
|
89 | # If '_' is in the namespace, python won't set it when executing code, | |
|
90 | # and we have examples that test it. So we ensure that the namespace | |
|
91 | # is always 'clean' of it before it's used for test code execution. | |
|
92 | self.pop('_',None) | |
|
97 | if self.protect_underscore: | |
|
98 | # If '_' is in the namespace, python won't set it when executing | |
|
99 | # code *in doctests*, and we have multiple doctests that use '_'. | |
|
100 | # So we ensure that the namespace is always 'clean' of it before | |
|
101 | # it's used for test code execution. | |
|
102 | # This flag is only turned on by the doctest machinery, so that | |
|
103 | # normal test code can assume the _ key is updated like any other | |
|
104 | # key and can test for its presence after cell executions. | |
|
105 | self.pop('_', None) | |
|
93 | 106 | |
|
94 | 107 | # The builtins namespace must *always* be the real __builtin__ module, |
|
95 | 108 | # else weird stuff happens. The main ipython code does have provisions |
@@ -39,11 +39,7 b' from __future__ import absolute_import' | |||
|
39 | 39 | import re |
|
40 | 40 | import sys |
|
41 | 41 | import unittest |
|
42 | from doctest import DocTestFinder, DocTestRunner | |
|
43 | try: | |
|
44 | from doctest import TestResults | |
|
45 | except: | |
|
46 | from ._doctest26 import TestResults | |
|
42 | from doctest import DocTestFinder, DocTestRunner, TestResults | |
|
47 | 43 | |
|
48 | 44 | # We already have python3-compliant code for parametric tests |
|
49 | 45 | if sys.version[0]=='2': |
@@ -273,6 +273,10 b' class DocTestCase(doctests.DocTestCase):' | |||
|
273 | 273 | # fills with the necessary info from the module being tested). |
|
274 | 274 | _ip.user_ns.update(self._dt_test.globs) |
|
275 | 275 | self._dt_test.globs = _ip.user_ns |
|
276 | # IPython must protect the _ key in the namespace (it can't exist) | |
|
277 | # so that Python's doctest code sets it naturally, so we enable | |
|
278 | # this feature of our testing namespace. | |
|
279 | _ip.user_ns.protect_underscore = True | |
|
276 | 280 | |
|
277 | 281 | super(DocTestCase, self).setUp() |
|
278 | 282 | |
@@ -282,6 +286,9 b' class DocTestCase(doctests.DocTestCase):' | |||
|
282 | 286 | # teardown doesn't destroy the ipython namespace |
|
283 | 287 | if isinstance(self._dt_test.examples[0],IPExample): |
|
284 | 288 | self._dt_test.globs = self._dt_test_globs_ori |
|
289 | # Restore the behavior of the '_' key in the user namespace to | |
|
290 | # normal after each doctest, so that unittests behave normally | |
|
291 | _ip.user_ns.protect_underscore = False | |
|
285 | 292 | |
|
286 | 293 | # XXX - fperez: I am not sure if this is truly a bug in nose 0.11, but |
|
287 | 294 | # it does look like one to me: its tearDown method tries to run |
|
1 | NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now