Show More
@@ -129,7 +129,8 b' class HistoryManager(Configurable):' | |||
|
129 | 129 | |
|
130 | 130 | def init_db(self): |
|
131 | 131 | """Connect to the database, and create tables if necessary.""" |
|
132 | self.db = sqlite3.connect(self.hist_file) | |
|
132 | # use detect_types so that timestamps return datetime objects | |
|
133 | self.db = sqlite3.connect(self.hist_file, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) | |
|
133 | 134 | self.db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer |
|
134 | 135 | primary key autoincrement, start timestamp, |
|
135 | 136 | end timestamp, num_cmds integer, remark text)""") |
@@ -213,6 +214,33 b' class HistoryManager(Configurable):' | |||
|
213 | 214 | return cur |
|
214 | 215 | |
|
215 | 216 | |
|
217 | def get_session_info(self, session=0): | |
|
218 | """get info about a session | |
|
219 | ||
|
220 | Parameters | |
|
221 | ---------- | |
|
222 | ||
|
223 | session : int | |
|
224 | Session number to retrieve. The current session is 0, and negative | |
|
225 | numbers count back from current session, so -1 is previous session. | |
|
226 | ||
|
227 | Returns | |
|
228 | ------- | |
|
229 | ||
|
230 | (session_id [int], start [datetime], end [datetime], num_cmds [int], remark [unicode]) | |
|
231 | ||
|
232 | Sessions that are running or did not exit cleanly will have `end=None` | |
|
233 | and `num_cmds=None`. | |
|
234 | ||
|
235 | """ | |
|
236 | ||
|
237 | if session <= 0: | |
|
238 | session += self.session_number | |
|
239 | ||
|
240 | query = "SELECT * from sessions where session == ?" | |
|
241 | return self.db.execute(query, (session,)).fetchone() | |
|
242 | ||
|
243 | ||
|
216 | 244 | def get_tail(self, n=10, raw=True, output=False, include_latest=False): |
|
217 | 245 | """Get the last n lines from the history database. |
|
218 | 246 |
@@ -2552,6 +2552,11 b' class InteractiveShell(SingletonConfigurable, Magic):' | |||
|
2552 | 2552 | code that has the appropriate information, rather than trying to |
|
2553 | 2553 | clutter |
|
2554 | 2554 | """ |
|
2555 | # Close the history session (this stores the end time and line count) | |
|
2556 | # this must be *before* the tempfile cleanup, in case of temporary | |
|
2557 | # history db | |
|
2558 | self.history_manager.end_session() | |
|
2559 | ||
|
2555 | 2560 | # Cleanup all tempfiles left around |
|
2556 | 2561 | for tfile in self.tempfiles: |
|
2557 | 2562 | try: |
@@ -2559,9 +2564,6 b' class InteractiveShell(SingletonConfigurable, Magic):' | |||
|
2559 | 2564 | except OSError: |
|
2560 | 2565 | pass |
|
2561 | 2566 | |
|
2562 | # Close the history session (this stores the end time and line count) | |
|
2563 | self.history_manager.end_session() | |
|
2564 | ||
|
2565 | 2567 | # Clear all user namespaces to release all references cleanly. |
|
2566 | 2568 | self.reset(new_session=False) |
|
2567 | 2569 |
@@ -9,7 +9,7 b'' | |||
|
9 | 9 | import os |
|
10 | 10 | import sys |
|
11 | 11 | import unittest |
|
12 | ||
|
12 | from datetime import datetime | |
|
13 | 13 | # third party |
|
14 | 14 | import nose.tools as nt |
|
15 | 15 | |
@@ -107,3 +107,8 b' def test_magic_rerun():' | |||
|
107 | 107 | nt.assert_equal(ip.user_ns["a"], 11) |
|
108 | 108 | ip.run_cell("%rerun") |
|
109 | 109 | nt.assert_equal(ip.user_ns["a"], 12) |
|
110 | ||
|
111 | def test_timestamp_type(): | |
|
112 | ip = get_ipython() | |
|
113 | info = ip.history_manager.get_session_info() | |
|
114 | nt.assert_true(isinstance(info[1], datetime)) |
@@ -194,6 +194,9 b' def start_ipython():' | |||
|
194 | 194 | |
|
195 | 195 | # A few more tweaks needed for playing nicely with doctests... |
|
196 | 196 | |
|
197 | # remove history file | |
|
198 | shell.tempfiles.append(config.HistoryManager.hist_file) | |
|
199 | ||
|
197 | 200 | # These traps are normally only active for interactive use, set them |
|
198 | 201 | # permanently since we'll be mocking interactive sessions. |
|
199 | 202 | shell.builtin_trap.activate() |
@@ -31,6 +31,7 b' from __future__ import absolute_import' | |||
|
31 | 31 | import os |
|
32 | 32 | import re |
|
33 | 33 | import sys |
|
34 | import tempfile | |
|
34 | 35 | |
|
35 | 36 | from contextlib import contextmanager |
|
36 | 37 | |
@@ -170,7 +171,7 b' def default_config():' | |||
|
170 | 171 | config.TerminalInteractiveShell.colors = 'NoColor' |
|
171 | 172 | config.TerminalTerminalInteractiveShell.term_title = False, |
|
172 | 173 | config.TerminalInteractiveShell.autocall = 0 |
|
173 | config.HistoryManager.hist_file = u'test_hist.sqlite' | |
|
174 | config.HistoryManager.hist_file = tempfile.mktemp(u'test_hist.sqlite') | |
|
174 | 175 | config.HistoryManager.db_cache_size = 10000 |
|
175 | 176 | return config |
|
176 | 177 |
General Comments 0
You need to be logged in to leave comments.
Login now