##// END OF EJS Templates
Add a test for history search with unique=True
Takafumi Arakaki -
Show More
@@ -1,167 +1,178 b''
1 # coding: utf-8
1 # coding: utf-8
2 """Tests for the IPython tab-completion machinery.
2 """Tests for the IPython tab-completion machinery.
3 """
3 """
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Module imports
5 # Module imports
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7
7
8 # stdlib
8 # stdlib
9 import os
9 import os
10 import shutil
10 import shutil
11 import sys
11 import sys
12 import tempfile
12 import tempfile
13 import unittest
13 import unittest
14 from datetime import datetime
14 from datetime import datetime
15
15
16 # third party
16 # third party
17 import nose.tools as nt
17 import nose.tools as nt
18
18
19 # our own packages
19 # our own packages
20 from IPython.config.loader import Config
20 from IPython.config.loader import Config
21 from IPython.utils.tempdir import TemporaryDirectory
21 from IPython.utils.tempdir import TemporaryDirectory
22 from IPython.core.history import HistoryManager, extract_hist_ranges
22 from IPython.core.history import HistoryManager, extract_hist_ranges
23 from IPython.utils import py3compat
23 from IPython.utils import py3compat
24
24
25 def setUp():
25 def setUp():
26 nt.assert_equal(sys.getdefaultencoding(), "utf-8" if py3compat.PY3 else "ascii")
26 nt.assert_equal(sys.getdefaultencoding(), "utf-8" if py3compat.PY3 else "ascii")
27
27
28 def test_history():
28 def test_history():
29 ip = get_ipython()
29 ip = get_ipython()
30 with TemporaryDirectory() as tmpdir:
30 with TemporaryDirectory() as tmpdir:
31 hist_manager_ori = ip.history_manager
31 hist_manager_ori = ip.history_manager
32 hist_file = os.path.join(tmpdir, 'history.sqlite')
32 hist_file = os.path.join(tmpdir, 'history.sqlite')
33 try:
33 try:
34 ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file)
34 ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file)
35 hist = [u'a=1', u'def f():\n test = 1\n return test', u"b='β‚¬Γ†ΒΎΓ·ΓŸ'"]
35 hist = [u'a=1', u'def f():\n test = 1\n return test', u"b='β‚¬Γ†ΒΎΓ·ΓŸ'"]
36 for i, h in enumerate(hist, start=1):
36 for i, h in enumerate(hist, start=1):
37 ip.history_manager.store_inputs(i, h)
37 ip.history_manager.store_inputs(i, h)
38
38
39 ip.history_manager.db_log_output = True
39 ip.history_manager.db_log_output = True
40 # Doesn't match the input, but we'll just check it's stored.
40 # Doesn't match the input, but we'll just check it's stored.
41 ip.history_manager.output_hist_reprs[3] = "spam"
41 ip.history_manager.output_hist_reprs[3] = "spam"
42 ip.history_manager.store_output(3)
42 ip.history_manager.store_output(3)
43
43
44 nt.assert_equal(ip.history_manager.input_hist_raw, [''] + hist)
44 nt.assert_equal(ip.history_manager.input_hist_raw, [''] + hist)
45
45
46 # Detailed tests for _get_range_session
46 # Detailed tests for _get_range_session
47 grs = ip.history_manager._get_range_session
47 grs = ip.history_manager._get_range_session
48 nt.assert_equal(list(grs(start=2,stop=-1)), zip([0], [2], hist[1:-1]))
48 nt.assert_equal(list(grs(start=2,stop=-1)), zip([0], [2], hist[1:-1]))
49 nt.assert_equal(list(grs(start=-2)), zip([0,0], [2,3], hist[-2:]))
49 nt.assert_equal(list(grs(start=-2)), zip([0,0], [2,3], hist[-2:]))
50 nt.assert_equal(list(grs(output=True)), zip([0,0,0], [1,2,3], zip(hist, [None,None,'spam'])))
50 nt.assert_equal(list(grs(output=True)), zip([0,0,0], [1,2,3], zip(hist, [None,None,'spam'])))
51
51
52 # Check whether specifying a range beyond the end of the current
52 # Check whether specifying a range beyond the end of the current
53 # session results in an error (gh-804)
53 # session results in an error (gh-804)
54 ip.magic('%hist 2-500')
54 ip.magic('%hist 2-500')
55
55
56 # Check that we can write non-ascii characters to a file
56 # Check that we can write non-ascii characters to a file
57 ip.magic("%%hist -f %s" % os.path.join(tmpdir, "test1"))
57 ip.magic("%%hist -f %s" % os.path.join(tmpdir, "test1"))
58 ip.magic("%%hist -pf %s" % os.path.join(tmpdir, "test2"))
58 ip.magic("%%hist -pf %s" % os.path.join(tmpdir, "test2"))
59 ip.magic("%%hist -nf %s" % os.path.join(tmpdir, "test3"))
59 ip.magic("%%hist -nf %s" % os.path.join(tmpdir, "test3"))
60 ip.magic("%%save %s 1-10" % os.path.join(tmpdir, "test4"))
60 ip.magic("%%save %s 1-10" % os.path.join(tmpdir, "test4"))
61
61
62 # New session
62 # New session
63 ip.history_manager.reset()
63 ip.history_manager.reset()
64 newcmds = [u"z=5",
64 newcmds = [u"z=5",
65 u"class X(object):\n pass",
65 u"class X(object):\n pass",
66 u"k='p'",
66 u"k='p'",
67 u"z=5"]
67 u"z=5"]
68 for i, cmd in enumerate(newcmds, start=1):
68 for i, cmd in enumerate(newcmds, start=1):
69 ip.history_manager.store_inputs(i, cmd)
69 ip.history_manager.store_inputs(i, cmd)
70 gothist = ip.history_manager.get_range(start=1, stop=4)
70 gothist = ip.history_manager.get_range(start=1, stop=4)
71 nt.assert_equal(list(gothist), zip([0,0,0],[1,2,3], newcmds))
71 nt.assert_equal(list(gothist), zip([0,0,0],[1,2,3], newcmds))
72 # Previous session:
72 # Previous session:
73 gothist = ip.history_manager.get_range(-1, 1, 4)
73 gothist = ip.history_manager.get_range(-1, 1, 4)
74 nt.assert_equal(list(gothist), zip([1,1,1],[1,2,3], hist))
74 nt.assert_equal(list(gothist), zip([1,1,1],[1,2,3], hist))
75
75
76 newhist = [(2, i + 1, c) for (i, c) in enumerate(newcmds)]
76 newhist = [(2, i + 1, c) for (i, c) in enumerate(newcmds)]
77
77
78 # Check get_hist_tail
78 # Check get_hist_tail
79 gothist = ip.history_manager.get_tail(5, output=True,
79 gothist = ip.history_manager.get_tail(5, output=True,
80 include_latest=True)
80 include_latest=True)
81 expected = [(1, 3, (hist[-1], "spam"))] \
81 expected = [(1, 3, (hist[-1], "spam"))] \
82 + [(s, n, (c, None)) for (s, n, c) in newhist]
82 + [(s, n, (c, None)) for (s, n, c) in newhist]
83 nt.assert_equal(list(gothist), expected)
83 nt.assert_equal(list(gothist), expected)
84
84
85 gothist = ip.history_manager.get_tail(2)
85 gothist = ip.history_manager.get_tail(2)
86 expected = newhist[-3:-1]
86 expected = newhist[-3:-1]
87 nt.assert_equal(list(gothist), expected)
87 nt.assert_equal(list(gothist), expected)
88
88
89 # Check get_hist_search
89 # Check get_hist_search
90 gothist = ip.history_manager.search("*test*")
90 gothist = ip.history_manager.search("*test*")
91 nt.assert_equal(list(gothist), [(1,2,hist[1])] )
91 nt.assert_equal(list(gothist), [(1,2,hist[1])] )
92
92 gothist = ip.history_manager.search("*=*")
93 gothist = ip.history_manager.search("*=*")
93 nt.assert_equal(list(gothist),
94 nt.assert_equal(list(gothist),
94 [(1, 1, hist[0]),
95 [(1, 1, hist[0]),
95 (1, 2, hist[1]),
96 (1, 2, hist[1]),
96 (1, 3, hist[2]),
97 (1, 3, hist[2]),
97 newhist[0],
98 newhist[0],
98 newhist[2],
99 newhist[2],
99 newhist[3]])
100 newhist[3]])
101
100 gothist = ip.history_manager.search("*=*", n=4)
102 gothist = ip.history_manager.search("*=*", n=4)
101 nt.assert_equal(list(gothist),
103 nt.assert_equal(list(gothist),
102 [(1, 3, hist[2]),
104 [(1, 3, hist[2]),
103 newhist[0],
105 newhist[0],
104 newhist[2],
106 newhist[2],
105 newhist[3]])
107 newhist[3]])
108
109 gothist = ip.history_manager.search("*=*", unique=True)
110 nt.assert_equal(list(gothist),
111 [(1, 1, hist[0]),
112 (1, 2, hist[1]),
113 (1, 3, hist[2]),
114 newhist[2],
115 newhist[3]])
116
106 gothist = ip.history_manager.search("b*", output=True)
117 gothist = ip.history_manager.search("b*", output=True)
107 nt.assert_equal(list(gothist), [(1,3,(hist[2],"spam"))] )
118 nt.assert_equal(list(gothist), [(1,3,(hist[2],"spam"))] )
108
119
109 # Cross testing: check that magic %save can get previous session.
120 # Cross testing: check that magic %save can get previous session.
110 testfilename = os.path.realpath(os.path.join(tmpdir, "test.py"))
121 testfilename = os.path.realpath(os.path.join(tmpdir, "test.py"))
111 ip.magic("save " + testfilename + " ~1/1-3")
122 ip.magic("save " + testfilename + " ~1/1-3")
112 with py3compat.open(testfilename, encoding='utf-8') as testfile:
123 with py3compat.open(testfilename, encoding='utf-8') as testfile:
113 nt.assert_equal(testfile.read(),
124 nt.assert_equal(testfile.read(),
114 u"# coding: utf-8\n" + u"\n".join(hist)+u"\n")
125 u"# coding: utf-8\n" + u"\n".join(hist)+u"\n")
115
126
116 # Duplicate line numbers - check that it doesn't crash, and
127 # Duplicate line numbers - check that it doesn't crash, and
117 # gets a new session
128 # gets a new session
118 ip.history_manager.store_inputs(1, "rogue")
129 ip.history_manager.store_inputs(1, "rogue")
119 ip.history_manager.writeout_cache()
130 ip.history_manager.writeout_cache()
120 nt.assert_equal(ip.history_manager.session_number, 3)
131 nt.assert_equal(ip.history_manager.session_number, 3)
121 finally:
132 finally:
122 # Restore history manager
133 # Restore history manager
123 ip.history_manager = hist_manager_ori
134 ip.history_manager = hist_manager_ori
124
135
125
136
126 def test_extract_hist_ranges():
137 def test_extract_hist_ranges():
127 instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5"
138 instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5"
128 expected = [(0, 1, 2), # 0 == current session
139 expected = [(0, 1, 2), # 0 == current session
129 (2, 3, 4),
140 (2, 3, 4),
130 (-4, 5, 7),
141 (-4, 5, 7),
131 (-4, 7, 10),
142 (-4, 7, 10),
132 (-9, 2, None), # None == to end
143 (-9, 2, None), # None == to end
133 (-8, 1, None),
144 (-8, 1, None),
134 (-7, 1, 6)]
145 (-7, 1, 6)]
135 actual = list(extract_hist_ranges(instr))
146 actual = list(extract_hist_ranges(instr))
136 nt.assert_equal(actual, expected)
147 nt.assert_equal(actual, expected)
137
148
138 def test_magic_rerun():
149 def test_magic_rerun():
139 """Simple test for %rerun (no args -> rerun last line)"""
150 """Simple test for %rerun (no args -> rerun last line)"""
140 ip = get_ipython()
151 ip = get_ipython()
141 ip.run_cell("a = 10", store_history=True)
152 ip.run_cell("a = 10", store_history=True)
142 ip.run_cell("a += 1", store_history=True)
153 ip.run_cell("a += 1", store_history=True)
143 nt.assert_equal(ip.user_ns["a"], 11)
154 nt.assert_equal(ip.user_ns["a"], 11)
144 ip.run_cell("%rerun", store_history=True)
155 ip.run_cell("%rerun", store_history=True)
145 nt.assert_equal(ip.user_ns["a"], 12)
156 nt.assert_equal(ip.user_ns["a"], 12)
146
157
147 def test_timestamp_type():
158 def test_timestamp_type():
148 ip = get_ipython()
159 ip = get_ipython()
149 info = ip.history_manager.get_session_info()
160 info = ip.history_manager.get_session_info()
150 nt.assert_true(isinstance(info[1], datetime))
161 nt.assert_true(isinstance(info[1], datetime))
151
162
152 def test_hist_file_config():
163 def test_hist_file_config():
153 cfg = Config()
164 cfg = Config()
154 tfile = tempfile.NamedTemporaryFile(delete=False)
165 tfile = tempfile.NamedTemporaryFile(delete=False)
155 cfg.HistoryManager.hist_file = tfile.name
166 cfg.HistoryManager.hist_file = tfile.name
156 try:
167 try:
157 hm = HistoryManager(shell=get_ipython(), config=cfg)
168 hm = HistoryManager(shell=get_ipython(), config=cfg)
158 nt.assert_equal(hm.hist_file, cfg.HistoryManager.hist_file)
169 nt.assert_equal(hm.hist_file, cfg.HistoryManager.hist_file)
159 finally:
170 finally:
160 try:
171 try:
161 os.remove(tfile.name)
172 os.remove(tfile.name)
162 except OSError:
173 except OSError:
163 # same catch as in testing.tools.TempFileMixin
174 # same catch as in testing.tools.TempFileMixin
164 # On Windows, even though we close the file, we still can't
175 # On Windows, even though we close the file, we still can't
165 # delete it. I have no clue why
176 # delete it. I have no clue why
166 pass
177 pass
167
178
General Comments 0
You need to be logged in to leave comments. Login now