##// END OF EJS Templates
Fix tests in IPython.core
Thomas Kluyver -
Show More
@@ -1,135 +1,135
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Color schemes for exception handling code in IPython.
4 4 """
5 5
6 6 #*****************************************************************************
7 7 # Copyright (C) 2005-2006 Fernando Perez <fperez@colorado.edu>
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.
11 11 #*****************************************************************************
12 12
13 13 from IPython.utils.coloransi import ColorSchemeTable, TermColors, ColorScheme
14 14
15 15 def exception_colors():
16 16 """Return a color table with fields for exception reporting.
17 17
18 18 The table is an instance of ColorSchemeTable with schemes added for
19 19 'Linux', 'LightBG' and 'NoColor' and fields for exception handling filled
20 20 in.
21 21
22 22 Examples:
23 23
24 24 >>> ec = exception_colors()
25 25 >>> ec.active_scheme_name
26 26 ''
27 >>> print ec.active_colors
27 >>> print(ec.active_colors)
28 28 None
29 29
30 30 Now we activate a color scheme:
31 31 >>> ec.set_active_scheme('NoColor')
32 32 >>> ec.active_scheme_name
33 33 'NoColor'
34 34 >>> sorted(ec.active_colors.keys())
35 35 ['Normal', 'caret', 'em', 'excName', 'filename', 'filenameEm', 'line',
36 36 'lineno', 'linenoEm', 'name', 'nameEm', 'normalEm', 'topline', 'vName',
37 37 'val', 'valEm']
38 38 """
39 39
40 40 ex_colors = ColorSchemeTable()
41 41
42 42 # Populate it with color schemes
43 43 C = TermColors # shorthand and local lookup
44 44 ex_colors.add_scheme(ColorScheme(
45 45 'NoColor',
46 46 # The color to be used for the top line
47 47 topline = C.NoColor,
48 48
49 49 # The colors to be used in the traceback
50 50 filename = C.NoColor,
51 51 lineno = C.NoColor,
52 52 name = C.NoColor,
53 53 vName = C.NoColor,
54 54 val = C.NoColor,
55 55 em = C.NoColor,
56 56
57 57 # Emphasized colors for the last frame of the traceback
58 58 normalEm = C.NoColor,
59 59 filenameEm = C.NoColor,
60 60 linenoEm = C.NoColor,
61 61 nameEm = C.NoColor,
62 62 valEm = C.NoColor,
63 63
64 64 # Colors for printing the exception
65 65 excName = C.NoColor,
66 66 line = C.NoColor,
67 67 caret = C.NoColor,
68 68 Normal = C.NoColor
69 69 ))
70 70
71 71 # make some schemes as instances so we can copy them for modification easily
72 72 ex_colors.add_scheme(ColorScheme(
73 73 'Linux',
74 74 # The color to be used for the top line
75 75 topline = C.LightRed,
76 76
77 77 # The colors to be used in the traceback
78 78 filename = C.Green,
79 79 lineno = C.Green,
80 80 name = C.Purple,
81 81 vName = C.Cyan,
82 82 val = C.Green,
83 83 em = C.LightCyan,
84 84
85 85 # Emphasized colors for the last frame of the traceback
86 86 normalEm = C.LightCyan,
87 87 filenameEm = C.LightGreen,
88 88 linenoEm = C.LightGreen,
89 89 nameEm = C.LightPurple,
90 90 valEm = C.LightBlue,
91 91
92 92 # Colors for printing the exception
93 93 excName = C.LightRed,
94 94 line = C.Yellow,
95 95 caret = C.White,
96 96 Normal = C.Normal
97 97 ))
98 98
99 99 # For light backgrounds, swap dark/light colors
100 100 ex_colors.add_scheme(ColorScheme(
101 101 'LightBG',
102 102 # The color to be used for the top line
103 103 topline = C.Red,
104 104
105 105 # The colors to be used in the traceback
106 106 filename = C.LightGreen,
107 107 lineno = C.LightGreen,
108 108 name = C.LightPurple,
109 109 vName = C.Cyan,
110 110 val = C.LightGreen,
111 111 em = C.Cyan,
112 112
113 113 # Emphasized colors for the last frame of the traceback
114 114 normalEm = C.Cyan,
115 115 filenameEm = C.Green,
116 116 linenoEm = C.Green,
117 117 nameEm = C.Purple,
118 118 valEm = C.Blue,
119 119
120 120 # Colors for printing the exception
121 121 excName = C.Red,
122 122 #line = C.Brown, # brown often is displayed as yellow
123 123 line = C.Red,
124 124 caret = C.Normal,
125 125 Normal = C.Normal,
126 126 ))
127 127
128 128 return ex_colors
129 129
130 130
131 131 # For backwards compatibility, keep around a single global object. Note that
132 132 # this should NOT be used, the factory function should be used instead, since
133 133 # these objects are stateful and it's very easy to get strange bugs if any code
134 134 # modifies the module-level object's state.
135 135 ExceptionColors = exception_colors()
@@ -1,183 +1,183
1 1 # coding: utf-8
2 2 """Tests for the IPython tab-completion machinery.
3 3 """
4 4 #-----------------------------------------------------------------------------
5 5 # Module imports
6 6 #-----------------------------------------------------------------------------
7 7
8 8 # stdlib
9 9 import os
10 10 import sys
11 11 import tempfile
12 12 from datetime import datetime
13 13
14 14 # third party
15 15 import nose.tools as nt
16 16
17 17 # our own packages
18 18 from IPython.config.loader import Config
19 19 from IPython.utils.tempdir import TemporaryDirectory
20 20 from IPython.core.history import HistoryManager, extract_hist_ranges
21 21 from IPython.utils import py3compat
22 22
23 23 def setUp():
24 24 nt.assert_equal(sys.getdefaultencoding(), "utf-8" if py3compat.PY3 else "ascii")
25 25
26 26 def test_history():
27 27 ip = get_ipython()
28 28 with TemporaryDirectory() as tmpdir:
29 29 hist_manager_ori = ip.history_manager
30 30 hist_file = os.path.join(tmpdir, 'history.sqlite')
31 31 try:
32 32 ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file)
33 33 hist = [u'a=1', u'def f():\n test = 1\n return test', u"b='β‚¬Γ†ΒΎΓ·ΓŸ'"]
34 34 for i, h in enumerate(hist, start=1):
35 35 ip.history_manager.store_inputs(i, h)
36 36
37 37 ip.history_manager.db_log_output = True
38 38 # Doesn't match the input, but we'll just check it's stored.
39 39 ip.history_manager.output_hist_reprs[3] = "spam"
40 40 ip.history_manager.store_output(3)
41 41
42 42 nt.assert_equal(ip.history_manager.input_hist_raw, [''] + hist)
43 43
44 44 # Detailed tests for _get_range_session
45 45 grs = ip.history_manager._get_range_session
46 nt.assert_equal(list(grs(start=2,stop=-1)), zip([0], [2], hist[1:-1]))
47 nt.assert_equal(list(grs(start=-2)), zip([0,0], [2,3], hist[-2:]))
48 nt.assert_equal(list(grs(output=True)), zip([0,0,0], [1,2,3], zip(hist, [None,None,'spam'])))
46 nt.assert_equal(list(grs(start=2,stop=-1)), list(zip([0], [2], hist[1:-1])))
47 nt.assert_equal(list(grs(start=-2)), list(zip([0,0], [2,3], hist[-2:])))
48 nt.assert_equal(list(grs(output=True)), list(zip([0,0,0], [1,2,3], zip(hist, [None,None,'spam']))))
49 49
50 50 # Check whether specifying a range beyond the end of the current
51 51 # session results in an error (gh-804)
52 52 ip.magic('%hist 2-500')
53 53
54 54 # Check that we can write non-ascii characters to a file
55 55 ip.magic("%%hist -f %s" % os.path.join(tmpdir, "test1"))
56 56 ip.magic("%%hist -pf %s" % os.path.join(tmpdir, "test2"))
57 57 ip.magic("%%hist -nf %s" % os.path.join(tmpdir, "test3"))
58 58 ip.magic("%%save %s 1-10" % os.path.join(tmpdir, "test4"))
59 59
60 60 # New session
61 61 ip.history_manager.reset()
62 62 newcmds = [u"z=5",
63 63 u"class X(object):\n pass",
64 64 u"k='p'",
65 65 u"z=5"]
66 66 for i, cmd in enumerate(newcmds, start=1):
67 67 ip.history_manager.store_inputs(i, cmd)
68 68 gothist = ip.history_manager.get_range(start=1, stop=4)
69 nt.assert_equal(list(gothist), zip([0,0,0],[1,2,3], newcmds))
69 nt.assert_equal(list(gothist), list(zip([0,0,0],[1,2,3], newcmds)))
70 70 # Previous session:
71 71 gothist = ip.history_manager.get_range(-1, 1, 4)
72 nt.assert_equal(list(gothist), zip([1,1,1],[1,2,3], hist))
72 nt.assert_equal(list(gothist), list(zip([1,1,1],[1,2,3], hist)))
73 73
74 74 newhist = [(2, i, c) for (i, c) in enumerate(newcmds, 1)]
75 75
76 76 # Check get_hist_tail
77 77 gothist = ip.history_manager.get_tail(5, output=True,
78 78 include_latest=True)
79 79 expected = [(1, 3, (hist[-1], "spam"))] \
80 80 + [(s, n, (c, None)) for (s, n, c) in newhist]
81 81 nt.assert_equal(list(gothist), expected)
82 82
83 83 gothist = ip.history_manager.get_tail(2)
84 84 expected = newhist[-3:-1]
85 85 nt.assert_equal(list(gothist), expected)
86 86
87 87 # Check get_hist_search
88 88 gothist = ip.history_manager.search("*test*")
89 89 nt.assert_equal(list(gothist), [(1,2,hist[1])] )
90 90
91 91 gothist = ip.history_manager.search("*=*")
92 92 nt.assert_equal(list(gothist),
93 93 [(1, 1, hist[0]),
94 94 (1, 2, hist[1]),
95 95 (1, 3, hist[2]),
96 96 newhist[0],
97 97 newhist[2],
98 98 newhist[3]])
99 99
100 100 gothist = ip.history_manager.search("*=*", n=4)
101 101 nt.assert_equal(list(gothist),
102 102 [(1, 3, hist[2]),
103 103 newhist[0],
104 104 newhist[2],
105 105 newhist[3]])
106 106
107 107 gothist = ip.history_manager.search("*=*", unique=True)
108 108 nt.assert_equal(list(gothist),
109 109 [(1, 1, hist[0]),
110 110 (1, 2, hist[1]),
111 111 (1, 3, hist[2]),
112 112 newhist[2],
113 113 newhist[3]])
114 114
115 115 gothist = ip.history_manager.search("*=*", unique=True, n=3)
116 116 nt.assert_equal(list(gothist),
117 117 [(1, 3, hist[2]),
118 118 newhist[2],
119 119 newhist[3]])
120 120
121 121 gothist = ip.history_manager.search("b*", output=True)
122 122 nt.assert_equal(list(gothist), [(1,3,(hist[2],"spam"))] )
123 123
124 124 # Cross testing: check that magic %save can get previous session.
125 125 testfilename = os.path.realpath(os.path.join(tmpdir, "test.py"))
126 126 ip.magic("save " + testfilename + " ~1/1-3")
127 127 with py3compat.open(testfilename, encoding='utf-8') as testfile:
128 128 nt.assert_equal(testfile.read(),
129 129 u"# coding: utf-8\n" + u"\n".join(hist)+u"\n")
130 130
131 131 # Duplicate line numbers - check that it doesn't crash, and
132 132 # gets a new session
133 133 ip.history_manager.store_inputs(1, "rogue")
134 134 ip.history_manager.writeout_cache()
135 135 nt.assert_equal(ip.history_manager.session_number, 3)
136 136 finally:
137 137 # Restore history manager
138 138 ip.history_manager = hist_manager_ori
139 139
140 140
141 141 def test_extract_hist_ranges():
142 142 instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5 ~10/"
143 143 expected = [(0, 1, 2), # 0 == current session
144 144 (2, 3, 4),
145 145 (-4, 5, 7),
146 146 (-4, 7, 10),
147 147 (-9, 2, None), # None == to end
148 148 (-8, 1, None),
149 149 (-7, 1, 6),
150 150 (-10, 1, None)]
151 151 actual = list(extract_hist_ranges(instr))
152 152 nt.assert_equal(actual, expected)
153 153
154 154 def test_magic_rerun():
155 155 """Simple test for %rerun (no args -> rerun last line)"""
156 156 ip = get_ipython()
157 157 ip.run_cell("a = 10", store_history=True)
158 158 ip.run_cell("a += 1", store_history=True)
159 159 nt.assert_equal(ip.user_ns["a"], 11)
160 160 ip.run_cell("%rerun", store_history=True)
161 161 nt.assert_equal(ip.user_ns["a"], 12)
162 162
163 163 def test_timestamp_type():
164 164 ip = get_ipython()
165 165 info = ip.history_manager.get_session_info()
166 166 nt.assert_true(isinstance(info[1], datetime))
167 167
168 168 def test_hist_file_config():
169 169 cfg = Config()
170 170 tfile = tempfile.NamedTemporaryFile(delete=False)
171 171 cfg.HistoryManager.hist_file = tfile.name
172 172 try:
173 173 hm = HistoryManager(shell=get_ipython(), config=cfg)
174 174 nt.assert_equal(hm.hist_file, cfg.HistoryManager.hist_file)
175 175 finally:
176 176 try:
177 177 os.remove(tfile.name)
178 178 except OSError:
179 179 # same catch as in testing.tools.TempFileMixin
180 180 # On Windows, even though we close the file, we still can't
181 181 # delete it. I have no clue why
182 182 pass
183 183
General Comments 0
You need to be logged in to leave comments. Login now