##// END OF EJS Templates
Improve tooltip tringgering,make it configurable...
Improve tooltip tringgering,make it configurable As until now, when pressing tab and a white space was preceding the cursor The completion was triggerd with the whole namespace in it. Now if a whitespace or an opening bracket is just befor the cursor it will try to display a tooltip. The logic to find what object_info_request is send have been sightly changed to try to match the expression just before the last unmached openig bracket before the cursor (without considering what is after the cursor). example (_|_ represent the cursor): >>> his_|_<tab> # completion >>> hist(_|_<tab> # tooltip on hist >>> hist(rand(20),bins=range(_|_ <tab> #tooltip on range >>> hist(rand(20),bins=range(10), _|_ <tab> # tooltip on hist (whitespace before cursor) >>> hist(rand(20),bins=range(10),_|_ <tab> # completion as we dont care of what is after the cursor: >>> hist(rand(5000), bins=50, _|_orientaion='horizontal') # and tab, equivalent to >>> hist(rand(5000), bins=50, _|_<tab> # onte the space again >>> hist(_|_rand(5000), bins=50, orientaion='horizontal') # and tab, equivalent to >>> hist(_|_ the 4 give tooltip on hist note that you can get tooltip on things that aren't function by appending a '(' like >>> matplotlib(<tab> Which is kinda weird... so we might want to bound another shortcut for tooltip, but which matches without bracket... additionnaly I have added a "Config" pannel in the left pannel with a checkbox bind to wether or not activate this functionnality Note, (rebase and edited commit, might not work perfetly xwithout the following ones)

File last commit:

r4872:34c10438
r5399:f73c6ce0
Show More
ipy_jot.py
312 lines | 9.1 KiB | text/x-python | PythonLexer
Ville M. Vainio
add ipy_jot.py
r1165 # -*- coding: utf-8 -*-
"""
%jot magic for lightweight persistence.
Stores variables in Struct with some notes in PicleShare database
"""
Bernardo B. Marques
remove all trailling spaces
r4872 from datetime import datetime
Brian Granger
ipapi.py => core/ipapi.py and imports updated.
r2027 from IPython.core import ipapi
ip = ipapi.get()
Ville M. Vainio
add ipy_jot.py
r1165
import pickleshare
import inspect,pickle,os,sys,textwrap
Brian Granger
FakeModule.py => core/fakemodule.py and updated tests and imports.
r2020 from IPython.core.fakemodule import FakeModule
Bernardo B. Marques
remove all trailling spaces
r4872 from IPython.utils.ipstruct import Struct
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 from IPython.utils.warn import error
Ville M. Vainio
add ipy_jot.py
r1165
def refresh_variables(ip, key=None):
db = ip.db
if key is None:
keys = db.keys('jot/*')
else:
keys = db.keys('jot/'+key)
for key in keys:
# strip autorestore
justkey = os.path.basename(key)
print "Restoring from", justkey, "..."
try:
obj = db[key]
except KeyError:
print "Unable to restore variable '%s', ignoring (use %%jot -d to forget!)" % justkey
print "The error was:",sys.exc_info()[0]
else:
#print "restored",justkey,"=",obj #dbg
try:
origname = obj.name
except:
ip.user_ns[justkey] = obj
print "Restored", justkey
else:
ip.user_ns[origname] = obj['val']
Bernardo B. Marques
remove all trailling spaces
r4872 print "Restored", origname
Ville M. Vainio
add ipy_jot.py
r1165
def read_variables(ip, key=None):
db = ip.db
if key is None:
return None
else:
keys = db.keys('jot/'+key)
for key in keys:
# strip autorestore
justkey = os.path.basename(key)
Bernardo B. Marques
remove all trailling spaces
r4872 print "restoring from ", justkey
Ville M. Vainio
add ipy_jot.py
r1165 try:
obj = db[key]
except KeyError:
print "Unable to read variable '%s', ignoring (use %%jot -d to forget!)" % justkey
print "The error was:",sys.exc_info()[0]
else:
return obj
def detail_variables(ip, key=None):
db, get = ip.db, ip.db.get
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 if key is None:
keys = db.keys('jot/*')
else:
keys = db.keys('jot/'+key)
if keys:
size = max(map(len,keys))
else:
size = 0
fmthead = '%-'+str(size)+'s [%s]'
fmtbody = 'Comment:\n %s'
fmtdata = 'Data:\n %s, %s'
for key in keys:
v = get(key,'<unavailable>')
justkey = os.path.basename(key)
Bernardo B. Marques
remove all trailling spaces
r4872 try:
Ville M. Vainio
add ipy_jot.py
r1165 print fmthead % (justkey, datetime.ctime(v.get('time','<unavailable>')))
print fmtbody % (v.get('comment','<unavailable>'))
d = v.get('val','unavailable')
print fmtdata % (repr(type(d)), '')
print repr(d)[0:200]
print
print
except AttributeError:
print fmt % (justkey, '<unavailable>', '<unavailable>', repr(v)[:50])
def intm(n):
try:
return int(n)
except:
return 0
def jot_obj(self, obj, name, comment=''):
"""
write obj data to the note database, with whatever that should be noted.
"""
had = self.db.keys('jot/'+name+'*')
Bernardo B. Marques
remove all trailling spaces
r4872 # if it the same name but a later version, we stupidly add a number to the
Ville M. Vainio
add ipy_jot.py
r1165 # so the name doesn't collide. Any better idea?
suffix = ''
if len(had)>0:
pre = os.path.commonprefix(had)
suf = [n.split(pre)[1] for n in had]
versions = map(intm, suf)
suffix = str(max(versions)+1)
uname = 'jot/'+name+suffix
Bernardo B. Marques
remove all trailling spaces
r4872 # which one works better?
Brian Granger
Continuing a massive refactor of everything.
r2205 #all = ip.shadowhist.all()
Satrajit Ghosh
History refactored and saved to json file...
r3240 all = ip.shell.history_manager.input_hist_parsed
Ville M. Vainio
add ipy_jot.py
r1165
# We may actually want to make snapshot of files that are run-ned.
Bernardo B. Marques
remove all trailling spaces
r4872 # get the comment
Ville M. Vainio
add ipy_jot.py
r1165 try:
Brian Granger
Continuing a massive refactor of everything.
r2205 comment = ip.magic_edit('-x').strip()
Ville M. Vainio
add ipy_jot.py
r1165 except:
print "No comment is recorded."
comment = ''
Bernardo B. Marques
remove all trailling spaces
r4872 self.db[uname] = Struct({'val':obj,
'time' : datetime.now(),
Ville M. Vainio
add ipy_jot.py
r1165 'hist' : all,
'name' : name,
'comment' : comment,})
print "Jotted down notes for '%s' (%s)" % (uname, obj.__class__.__name__)
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165
def magic_jot(self, parameter_s=''):
"""Lightweight persistence for python variables.
Example:
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 ville@badger[~]|1> A = ['hello',10,'world']\\
ville@badger[~]|2> %jot A\\
ville@badger[~]|3> Exit
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 (IPython session is closed and started again...)
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 ville@badger:~$ ipython -p pysh\\
ville@badger[~]|1> print A
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 ['hello', 10, 'world']
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 Usage:
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 %jot - Show list of all variables and their current values\\
%jot -l - Show list of all variables and their current values in detail\\
%jot -l <var> - Show one variable and its current values in detail\\
%jot <var> - Store the *current* value of the variable to disk\\
%jot -d <var> - Remove the variable and its value from storage\\
%jot -z - Remove all variables from storage (disabled)\\
%jot -r <var> - Refresh/Load variable from jot (delete current vals)\\
%jot foo >a.txt - Store value of foo to new file a.txt\\
Bernardo B. Marques
remove all trailling spaces
r4872 %jot foo >>a.txt - Append value of foo to file a.txt\\
Ville M. Vainio
add ipy_jot.py
r1165 It should be noted that if you change the value of a variable, you
need to %note it again if you want to persist the new value.
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 Note also that the variables will need to be pickleable; most basic
python types can be safely %stored.
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 """
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 opts,argsl = self.parse_options(parameter_s,'drzl',mode='string')
args = argsl.split(None,1)
ip = self.getapi()
db = ip.db
# delete
if opts.has_key('d'):
try:
todel = args[0]
except IndexError:
error('You must provide the variable to forget')
else:
try:
del db['jot/' + todel]
except:
error("Can't delete variable '%s'" % todel)
# reset the whole database
elif opts.has_key('z'):
print "reseting the whole database has been disabled."
#for k in db.keys('autorestore/*'):
# del db[k]
elif opts.has_key('r'):
try:
toret = args[0]
except:
print "restoring all the variables jotted down..."
refresh_variables(ip)
else:
refresh_variables(ip, toret)
elif opts.has_key('l'):
try:
tolist = args[0]
except:
print "List details for all the items."
detail_variables(ip)
else:
print "Details for", tolist, ":"
detail_variables(ip, tolist)
Bernardo B. Marques
remove all trailling spaces
r4872
# run without arguments -> list noted variables & notes
Ville M. Vainio
add ipy_jot.py
r1165 elif not args:
vars = self.db.keys('jot/*')
Bernardo B. Marques
remove all trailling spaces
r4872 vars.sort()
Ville M. Vainio
add ipy_jot.py
r1165 if vars:
Bernardo B. Marques
remove all trailling spaces
r4872 size = max(map(len,vars)) - 4
Ville M. Vainio
add ipy_jot.py
r1165 else:
size = 0
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 print 'Variables and their in-db values:'
fmt = '%-'+str(size)+'s [%s] -> %s'
get = db.get
for var in vars:
justkey = os.path.basename(var)
v = get(var,'<unavailable>')
Bernardo B. Marques
remove all trailling spaces
r4872 try:
Ville M. Vainio
add ipy_jot.py
r1165 print fmt % (justkey,\
datetime.ctime(v.get('time','<unavailable>')),\
v.get('comment','<unavailable>')[:70].replace('\n',' '),)
except AttributeError:
print fmt % (justkey, '<unavailable>', '<unavailable>', repr(v)[:50])
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 # default action - store the variable
else:
# %store foo >file.txt or >>file.txt
if len(args) > 1 and args[1].startswith('>'):
fnam = os.path.expanduser(args[1].lstrip('>').lstrip())
if args[1].startswith('>>'):
fil = open(fnam,'a')
else:
fil = open(fnam,'w')
obj = ip.ev(args[0])
print "Writing '%s' (%s) to file '%s'." % (args[0],
obj.__class__.__name__, fnam)
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 if not isinstance (obj,basestring):
from pprint import pprint
pprint(obj,fil)
else:
fil.write(obj)
if not obj.endswith('\n'):
fil.write('\n')
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 fil.close()
return
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 # %note foo
try:
obj = ip.user_ns[args[0]]
except KeyError:
# this should not be alias, for aliases, use %store
print
print "Error: %s doesn't exist." % args[0]
Bernardo B. Marques
remove all trailling spaces
r4872 print
Ville M. Vainio
add ipy_jot.py
r1165 print "Use %note -r <var> to retrieve variables. This should not be used " +\
Bernardo B. Marques
remove all trailling spaces
r4872 "to store alias, for saving aliases, use %store"
Ville M. Vainio
add ipy_jot.py
r1165 return
else:
if isinstance(inspect.getmodule(obj), FakeModule):
print textwrap.dedent("""\
Bernardo B. Marques
remove all trailling spaces
r4872 Warning:%s is %s
Ville M. Vainio
add ipy_jot.py
r1165 Proper storage of interactively declared classes (or instances
of those classes) is not possible! Only instances
of classes in real modules on file system can be %%store'd.
Bernardo B. Marques
remove all trailling spaces
r4872 """ % (args[0], obj) )
Ville M. Vainio
add ipy_jot.py
r1165 return
#pickled = pickle.dumps(obj)
#self.db[ 'jot/' + args[0] ] = obj
jot_obj(self, obj, args[0])
def magic_read(self, parameter_s=''):
Bernardo B. Marques
remove all trailling spaces
r4872 """
Ville M. Vainio
add ipy_jot.py
r1165 %read <var> - Load variable from data that is jotted down.\\
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 """
Bernardo B. Marques
remove all trailling spaces
r4872
Ville M. Vainio
add ipy_jot.py
r1165 opts,argsl = self.parse_options(parameter_s,'drzl',mode='string')
args = argsl.split(None,1)
ip = self.getapi()
db = ip.db
#if opts.has_key('r'):
try:
toret = args[0]
except:
print "which record do you want to read out?"
return
else:
return read_variables(ip, toret)
Brian Granger
Continuing a massive refactor of everything.
r2205 ip.define_magic('jot',magic_jot)
ip.define_magic('read',magic_read)