##// END OF EJS Templates
aliases can be %store'd
vivainio -
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,149 +1,172 b''
1 # -*- coding: utf-8 -*-
2 """
3 %store magic for lightweight persistence.
4
5 Stores variables, aliases etc. in PickleShare database.
6
7 $Id: iplib.py 1107 2006-01-30 19:02:20Z vivainio $
8 """
9
1 10 import IPython.ipapi
2 11 ip = IPython.ipapi.get()
3 12
4 13 import pickleshare
5 14
6 15 import inspect,pickle,os,textwrap
7 16 from IPython.FakeModule import FakeModule
8 17
18 def restore_aliases(self):
19 ip = self.getapi()
20 staliases = ip.getdb().get('stored_aliases', {})
21 for k,v in staliases.items():
22 #print "restore alias",k,v # dbg
23 self.alias_table[k] = v
24
25
9 26 def refresh_variables(ip):
10 27 db = ip.getdb()
11 28 for key in db.keys('autorestore/*'):
12 29 # strip autorestore
13 30 justkey = os.path.basename(key)
14 31 try:
15 32 obj = db[key]
16 33 except KeyError:
17 34 print "Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % justkey
18 35 print "The error was:",sys.exc_info()[0]
19 36 else:
20 37 #print "restored",justkey,"=",obj #dbg
21 38 ip.user_ns()[justkey] = obj
22 39
23 40
24 41
25 42 def restore_data(self):
26 #o = ip.options()
27 #self.db = pickleshare.PickleShareDB(o.ipythondir + "/db")
28 #print "restoring ps data" # dbg
29
30 43 ip = self.getapi()
31 44 refresh_variables(ip)
45 restore_aliases(self)
32 46 raise IPython.ipapi.TryNext
33 47
34
35 48 ip.set_hook('late_startup_hook', restore_data)
36 49
37 50 def magic_store(self, parameter_s=''):
38 51 """Lightweight persistence for python variables.
39 52
40 53 Example:
41 54
42 55 ville@badger[~]|1> A = ['hello',10,'world']\\
43 56 ville@badger[~]|2> %store A\\
44 57 ville@badger[~]|3> Exit
45 58
46 59 (IPython session is closed and started again...)
47 60
48 61 ville@badger:~$ ipython -p pysh\\
49 62 ville@badger[~]|1> print A
50 63
51 64 ['hello', 10, 'world']
52 65
53 66 Usage:
54 67
55 68 %store - Show list of all variables and their current values\\
56 69 %store <var> - Store the *current* value of the variable to disk\\
57 70 %store -d <var> - Remove the variable and its value from storage\\
58 71 %store -z - Remove all variables from storage\\
59 72 %store -r - Refresh all variables from store (delete current vals)\\
60 73 %store foo >a.txt - Store value of foo to new file a.txt\\
61 74 %store foo >>a.txt - Append value of foo to file a.txt\\
62 75
63 76 It should be noted that if you change the value of a variable, you
64 77 need to %store it again if you want to persist the new value.
65 78
66 79 Note also that the variables will need to be pickleable; most basic
67 80 python types can be safely %stored.
68 81 """
69 82
70 83 opts,argsl = self.parse_options(parameter_s,'drz',mode='string')
71 84 args = argsl.split(None,1)
72 85 ip = self.getapi()
86 db = ip.getdb()
73 87 # delete
74 88 if opts.has_key('d'):
75 89 try:
76 90 todel = args[0]
77 91 except IndexError:
78 92 error('You must provide the variable to forget')
79 93 else:
80 94 try:
81 del self.db['autorestore/' + todel]
95 del db['autorestore/' + todel]
82 96 except:
83 97 error("Can't delete variable '%s'" % todel)
84 98 # reset
85 99 elif opts.has_key('z'):
86 for k in self.db.keys('autorestore/*'):
87 del self.db[k]
100 for k in db.keys('autorestore/*'):
101 del db[k]
88 102
89 103 elif opts.has_key('r'):
90 104 refresh_variables(ip)
91 105
92 106
93 107 # run without arguments -> list variables & values
94 108 elif not args:
95 109 vars = self.db.keys('autorestore/*')
96 110 vars.sort()
97 111 if vars:
98 112 size = max(map(len,vars))
99 113 else:
100 114 size = 0
101 115
102 116 print 'Stored variables and their in-db values:'
103 117 fmt = '%-'+str(size)+'s -> %s'
104 get = self.db.get
118 get = db.get
105 119 for var in vars:
106 120 justkey = os.path.basename(var)
107 121 # print 30 first characters from every var
108 122 print fmt % (justkey,repr(get(var,'<unavailable>'))[:50])
109 123
110 124 # default action - store the variable
111 125 else:
112 126 # %store foo >file.txt or >>file.txt
113 127 if len(args) > 1 and args[1].startswith('>'):
114 128 fnam = os.path.expanduser(args[1].lstrip('>').lstrip())
115 129 if args[1].startswith('>>'):
116 130 fil = open(fnam,'a')
117 131 else:
118 132 fil = open(fnam,'w')
119 133 obj = ip.ev(args[0])
120 134 print "Writing '%s' (%s) to file '%s'." % (args[0],
121 135 obj.__class__.__name__, fnam)
122 136
123 137
124 138 if not isinstance (obj,basestring):
125 139 pprint(obj,fil)
126 140 else:
127 141 fil.write(obj)
128 142 if not obj.endswith('\n'):
129 143 fil.write('\n')
130 144
131 145 fil.close()
132 146 return
133 147
134 148 # %store foo
149 try:
135 150 obj = ip.ev(args[0])
151 except NameError:
152 # it might be an alias
153 if args[0] in self.alias_table:
154 staliases = db.get('stored_aliases',{})
155 staliases[ args[0] ] = self.alias_table[ args[0] ]
156 db['stored_aliases'] = staliases
157 print "Alias stored:", args[0], self.alias_table[ args[0] ]
158 return
159 else:
136 160 if isinstance(inspect.getmodule(obj), FakeModule):
137 161 print textwrap.dedent("""\
138 162 Warning:%s is %s
139 163 Proper storage of interactively declared classes (or instances
140 164 of those classes) is not possible! Only instances
141 165 of classes in real modules on file system can be %%store'd.
142 166 """ % (args[0], obj) )
143 167 return
144 168 #pickled = pickle.dumps(obj)
145 169 self.db[ 'autorestore/' + args[0] ] = obj
146 170 print "Stored '%s' (%s)" % (args[0], obj.__class__.__name__)
147 171
148 172 ip.expose_magic('store',magic_store)
149 No newline at end of file
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now