Show More
@@ -25,6 +25,7 b' from IPython.config.configurable import Configurable' | |||||
25 |
|
25 | |||
26 | from IPython.testing.skipdoctest import skip_doctest |
|
26 | from IPython.testing.skipdoctest import skip_doctest | |
27 | from IPython.utils import io |
|
27 | from IPython.utils import io | |
|
28 | from IPython.utils.path import locate_profile | |||
28 | from IPython.utils.traitlets import Bool, Dict, Instance, Int, CInt, List, Unicode |
|
29 | from IPython.utils.traitlets import Bool, Dict, Instance, Int, CInt, List, Unicode | |
29 | from IPython.utils.warn import warn |
|
30 | from IPython.utils.warn import warn | |
30 |
|
31 | |||
@@ -43,10 +44,20 b' class HistoryAccessor(Configurable):' | |||||
43 | # The SQLite database |
|
44 | # The SQLite database | |
44 | db = Instance(sqlite3.Connection) |
|
45 | db = Instance(sqlite3.Connection) | |
45 |
|
46 | |||
46 | def __init__(self, hist_file=u'', shell=None, config=None, **traits): |
|
47 | def __init__(self, profile='default', hist_file=u'', shell=None, config=None, **traits): | |
47 | """Create a new history accessor. |
|
48 | """Create a new history accessor. | |
48 |
|
49 | |||
49 | hist_file must be given, either as an argument or through config. |
|
50 | Parameters | |
|
51 | ---------- | |||
|
52 | profile : str | |||
|
53 | The name of the profile from which to open history. | |||
|
54 | hist_file : str | |||
|
55 | Path to an SQLite history database stored by IPython. If specified, | |||
|
56 | hist_file overrides profile. | |||
|
57 | shell : | |||
|
58 | InteractiveShell object, for use by HistoryManager subclass | |||
|
59 | config : | |||
|
60 | Config object. hist_file can also be set through this. | |||
50 | """ |
|
61 | """ | |
51 | # We need a pointer back to the shell for various tasks. |
|
62 | # We need a pointer back to the shell for various tasks. | |
52 | super(HistoryAccessor, self).__init__(shell=shell, config=config, |
|
63 | super(HistoryAccessor, self).__init__(shell=shell, config=config, | |
@@ -54,7 +65,7 b' class HistoryAccessor(Configurable):' | |||||
54 |
|
65 | |||
55 | if self.hist_file == u'': |
|
66 | if self.hist_file == u'': | |
56 | # No one has set the hist_file, yet. |
|
67 | # No one has set the hist_file, yet. | |
57 |
self.hist_file = self._get_hist_file_name( |
|
68 | self.hist_file = self._get_hist_file_name(profile) | |
58 |
|
69 | |||
59 | try: |
|
70 | try: | |
60 | self.init_db() |
|
71 | self.init_db() | |
@@ -70,9 +81,18 b' class HistoryAccessor(Configurable):' | |||||
70 | # The hist_file is probably :memory: or something else. |
|
81 | # The hist_file is probably :memory: or something else. | |
71 | raise |
|
82 | raise | |
72 |
|
83 | |||
73 |
def _get_hist_file_name(self, |
|
84 | def _get_hist_file_name(self, profile='default'): | |
74 | "Override to produce a default history file name." |
|
85 | """Find the history file for the given profile name. | |
75 | raise NotImplementedError("No default history file") |
|
86 | ||
|
87 | This is overridden by the HistoryManager subclass, to use the shell's | |||
|
88 | active profile. | |||
|
89 | ||||
|
90 | Parameters | |||
|
91 | ---------- | |||
|
92 | profile : str | |||
|
93 | The name of a profile which has a history file. | |||
|
94 | """ | |||
|
95 | return os.path.join(locate_profile(profile), 'history.sqlite') | |||
76 |
|
96 | |||
77 | def init_db(self): |
|
97 | def init_db(self): | |
78 | """Connect to the database, and create tables if necessary.""" |
|
98 | """Connect to the database, and create tables if necessary.""" | |
@@ -332,7 +352,11 b' class HistoryManager(HistoryAccessor):' | |||||
332 |
|
352 | |||
333 | self.new_session() |
|
353 | self.new_session() | |
334 |
|
354 | |||
335 |
def _get_hist_file_name(self, |
|
355 | def _get_hist_file_name(self, profile=None): | |
|
356 | """Get default history file name based on the Shell's profile. | |||
|
357 | ||||
|
358 | The profile parameter is ignored, but must exist for compatibility with | |||
|
359 | the parent class.""" | |||
336 | profile_dir = self.shell.profile_dir.location |
|
360 | profile_dir = self.shell.profile_dir.location | |
337 | return os.path.join(profile_dir, 'history.sqlite') |
|
361 | return os.path.join(profile_dir, 'history.sqlite') | |
338 |
|
362 |
@@ -372,6 +372,18 b' def get_ipython_module_path(module_str):' | |||||
372 | the_path = the_path.replace('.pyo', '.py') |
|
372 | the_path = the_path.replace('.pyo', '.py') | |
373 | return py3compat.cast_unicode(the_path, fs_encoding) |
|
373 | return py3compat.cast_unicode(the_path, fs_encoding) | |
374 |
|
374 | |||
|
375 | def locate_profile(profile='default'): | |||
|
376 | """Find the path to the folder associated with a given profile. | |||
|
377 | ||||
|
378 | I.e. find $IPYTHON_DIR/profile_whatever. | |||
|
379 | """ | |||
|
380 | from IPython.core.profiledir import ProfileDir, ProfileDirError | |||
|
381 | try: | |||
|
382 | pd = ProfileDir.find_profile_dir_by_name(get_ipython_dir(), profile) | |||
|
383 | except ProfileDirError: | |||
|
384 | # IOError makes more sense when people are expecting a path | |||
|
385 | raise IOError("Couldn't find profile %r" % profile) | |||
|
386 | return pd.location | |||
375 |
|
387 | |||
376 | def expand_path(s): |
|
388 | def expand_path(s): | |
377 | """Expand $VARS and ~names in a string, like a shell |
|
389 | """Expand $VARS and ~names in a string, like a shell |
General Comments 0
You need to be logged in to leave comments.
Login now