##// END OF EJS Templates
merge all from 0.7.3 branch to trunk
vivainio -
r503:b114b8cd
parent child
Show More
@@ -1,31 +1,31
1 import inspect
1 import inspect
2 import IPython.ipapi
2 import IPython.ipapi
3 from IPython.genutils import arg_split
3 from IPython.genutils import arg_split
4 ip = IPython.ipapi.get()
4 ip = IPython.ipapi.get()
5
5
6 from IPython import Debugger
6 from IPython import Debugger
7
7
8 def call_pydb(self, args):
8 def call_pydb(self, args):
9 """Invoke pydb with the supplied parameters."""
9 """Invoke pydb with the supplied parameters."""
10 try:
10 try:
11 import pydb
11 import pydb
12 except ImportError:
12 except ImportError:
13 raise ImportError("pydb doesn't seem to be installed.")
13 raise ImportError("pydb doesn't seem to be installed.")
14
14
15 if not hasattr(pydb.pydb, "runv"):
15 if not hasattr(pydb.pydb, "runv"):
16 raise ImportError("You need pydb version 1.19 or later installed.")
16 raise ImportError("You need pydb version 1.19 or later installed.")
17
17
18 argl = arg_split(args)
18 argl = arg_split(args)
19 # print argl # dbg
19 # print argl # dbg
20 if len(inspect.getargspec(pydb.runv)[0]) == 2:
20 if len(inspect.getargspec(pydb.runv)[0]) == 2:
21 pdb = Debugger.Pdb()
21 pdb = Debugger.Pdb()
22 ip.IP.history_saving_wrapper( lambda : pydb.runv(argl, pdb) )()
22 ip.IP.history_saving_wrapper( lambda : pydb.runv(argl, pdb) )()
23 else:
23 else:
24 ip.IP.history_saving_wrapper( lambda : pydb.runv(argl) )()
24 ip.IP.history_saving_wrapper( lambda : pydb.runv(argl) )()
25
25
26
26
27 ip.expose_magic("pydb",call_pydb)
27 ip.expose_magic("pydb",call_pydb)
28
28
29
29
30
30
31
31
@@ -1,218 +1,218
1 """ Tab completion support for a couple of linux package managers
1 """ Tab completion support for a couple of linux package managers
2
2
3 This is also an example of how to write custom completer plugins
3 This is also an example of how to write custom completer plugins
4 or hooks.
4 or hooks.
5
5
6 Practical use:
6 Practical use:
7
7
8 [ipython]|1> import ipy_linux_package_managers
8 [ipython]|1> import ipy_linux_package_managers
9 [ipython]|2> apt-get u<<< press tab here >>>
9 [ipython]|2> apt-get u<<< press tab here >>>
10 update upgrade
10 update upgrade
11 [ipython]|2> apt-get up
11 [ipython]|2> apt-get up
12
12
13 """
13 """
14 import IPython.ipapi
14 import IPython.ipapi
15 import glob,os,shlex,sys
15 import glob,os,shlex,sys
16
16
17 ip = IPython.ipapi.get()
17 ip = IPython.ipapi.get()
18
18
19 def vcs_completer(commands, event):
19 def vcs_completer(commands, event):
20 """ utility to make writing typical version control app completers easier
20 """ utility to make writing typical version control app completers easier
21
21
22 VCS command line apps typically have the format:
22 VCS command line apps typically have the format:
23
23
24 [sudo ]PROGNAME [help] [command] file file...
24 [sudo ]PROGNAME [help] [command] file file...
25
25
26 """
26 """
27
27
28
28
29 cmd_param = event.line.split()
29 cmd_param = event.line.split()
30 if event.line.endswith(' '):
30 if event.line.endswith(' '):
31 cmd_param.append('')
31 cmd_param.append('')
32
32
33 if cmd_param[0] == 'sudo':
33 if cmd_param[0] == 'sudo':
34 cmd_param = cmd_param[1:]
34 cmd_param = cmd_param[1:]
35
35
36 if len(cmd_param) == 2 or 'help' in cmd_param:
36 if len(cmd_param) == 2 or 'help' in cmd_param:
37 return commands.split()
37 return commands.split()
38
38
39 return ip.IP.Completer.file_matches(event.symbol)
39 return ip.IP.Completer.file_matches(event.symbol)
40
40
41
41
42
42
43 def apt_completers(self, event):
43 def apt_completers(self, event):
44 """ This should return a list of strings with possible completions.
44 """ This should return a list of strings with possible completions.
45
45
46 Note that all the included strings that don't start with event.symbol
46 Note that all the included strings that don't start with event.symbol
47 are removed, in order to not confuse readline.
47 are removed, in order to not confuse readline.
48
48
49 """
49 """
50 # print event # dbg
50 # print event # dbg
51
51
52 # commands are only suggested for the 'command' part of package manager
52 # commands are only suggested for the 'command' part of package manager
53 # invocation
53 # invocation
54
54
55 cmd = (event.line + "<placeholder>").rsplit(None,1)[0]
55 cmd = (event.line + "<placeholder>").rsplit(None,1)[0]
56 # print cmd
56 # print cmd
57 if cmd.endswith('apt-get') or cmd.endswith('yum'):
57 if cmd.endswith('apt-get') or cmd.endswith('yum'):
58 return ['update', 'upgrade', 'install', 'remove']
58 return ['update', 'upgrade', 'install', 'remove']
59
59
60 # later on, add dpkg -l / whatever to get list of possible
60 # later on, add dpkg -l / whatever to get list of possible
61 # packages, add switches etc. for the rest of command line
61 # packages, add switches etc. for the rest of command line
62 # filling
62 # filling
63
63
64 raise IPython.ipapi.TryNext
64 raise IPython.ipapi.TryNext
65
65
66
66
67 # re_key specifies the regexp that triggers the specified completer
67 # re_key specifies the regexp that triggers the specified completer
68
68
69 ip.set_hook('complete_command', apt_completers, re_key = '.*apt-get')
69 ip.set_hook('complete_command', apt_completers, re_key = '.*apt-get')
70 ip.set_hook('complete_command', apt_completers, re_key = '.*yum')
70 ip.set_hook('complete_command', apt_completers, re_key = '.*yum')
71
71
72 pkg_cache = None
72 pkg_cache = None
73
73
74 def module_completer(self,event):
74 def module_completer(self,event):
75 """ Give completions after user has typed 'import' """
75 """ Give completions after user has typed 'import' """
76
76
77 # only a local version for py 2.4, pkgutil has no walk_packages() there
77 # only a local version for py 2.4, pkgutil has no walk_packages() there
78 if sys.version_info < (2,5):
78 if sys.version_info < (2,5):
79 for el in [f[:-3] for f in glob.glob("*.py")]:
79 for el in [f[:-3] for f in glob.glob("*.py")]:
80 yield el
80 yield el
81 return
81 return
82
82
83 global pkg_cache
83 global pkg_cache
84 import pkgutil,imp,time
84 import pkgutil,imp,time
85 #current =
85 #current =
86 if pkg_cache is None:
86 if pkg_cache is None:
87 print "\n\n[Standby while scanning modules, this can take a while]\n\n"
87 print "\n\n[Standby while scanning modules, this can take a while]\n\n"
88 pkg_cache = list(pkgutil.walk_packages())
88 pkg_cache = list(pkgutil.walk_packages())
89
89
90 already = set()
90 already = set()
91 for ld, name, ispkg in pkg_cache:
91 for ld, name, ispkg in pkg_cache:
92 if name.count('.') < event.symbol.count('.') + 1:
92 if name.count('.') < event.symbol.count('.') + 1:
93 if name not in already:
93 if name not in already:
94 already.add(name)
94 already.add(name)
95 yield name + (ispkg and '.' or '')
95 yield name + (ispkg and '.' or '')
96 return
96 return
97
97
98 ip.set_hook('complete_command', module_completer, str_key = 'import')
98 ip.set_hook('complete_command', module_completer, str_key = 'import')
99 ip.set_hook('complete_command', module_completer, str_key = 'from')
99 ip.set_hook('complete_command', module_completer, str_key = 'from')
100
100
101 svn_commands = """\
101 svn_commands = """\
102 add blame praise annotate ann cat checkout co cleanup commit ci copy
102 add blame praise annotate ann cat checkout co cleanup commit ci copy
103 cp delete del remove rm diff di export help ? h import info list ls
103 cp delete del remove rm diff di export help ? h import info list ls
104 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
104 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
105 pe propget pget pg proplist plist pl propset pset ps resolved revert
105 pe propget pget pg proplist plist pl propset pset ps resolved revert
106 status stat st switch sw unlock update
106 status stat st switch sw unlock update
107 """
107 """
108
108
109 def svn_completer(self,event):
109 def svn_completer(self,event):
110 return vcs_completer(svn_commands, event)
110 return vcs_completer(svn_commands, event)
111
111
112 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
112 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
113
113
114 hg_commands = """
114 hg_commands = """
115 add addremove annotate archive backout branch branches bundle cat
115 add addremove annotate archive backout branch branches bundle cat
116 clone commit copy diff export grep heads help identify import incoming
116 clone commit copy diff export grep heads help identify import incoming
117 init locate log manifest merge outgoing parents paths pull push
117 init locate log manifest merge outgoing parents paths pull push
118 qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
118 qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
119 qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
119 qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
120 qselect qseries qtop qunapplied recover remove rename revert rollback
120 qselect qseries qtop qunapplied recover remove rename revert rollback
121 root serve showconfig status strip tag tags tip unbundle update verify
121 root serve showconfig status strip tag tags tip unbundle update verify
122 version
122 version
123 """
123 """
124
124
125 def hg_completer(self,event):
125 def hg_completer(self,event):
126 """ Completer for mercurial commands """
126 """ Completer for mercurial commands """
127
127
128 return vcs_completer(hg_commands, event)
128 return vcs_completer(hg_commands, event)
129
129
130 ip.set_hook('complete_command', hg_completer, str_key = 'hg')
130 ip.set_hook('complete_command', hg_completer, str_key = 'hg')
131
131
132
132
133 bzr_commands = """
133 bzr_commands = """
134 add annotate bind branch break-lock bundle-revisions cat check
134 add annotate bind branch break-lock bundle-revisions cat check
135 checkout commit conflicts deleted diff export gannotate gbranch
135 checkout commit conflicts deleted diff export gannotate gbranch
136 gcommit gdiff help ignore ignored info init init-repository inventory
136 gcommit gdiff help ignore ignored info init init-repository inventory
137 log merge missing mkdir mv nick pull push reconcile register-branch
137 log merge missing mkdir mv nick pull push reconcile register-branch
138 remerge remove renames resolve revert revno root serve sign-my-commits
138 remerge remove renames resolve revert revno root serve sign-my-commits
139 status testament unbind uncommit unknowns update upgrade version
139 status testament unbind uncommit unknowns update upgrade version
140 version-info visualise whoami
140 version-info visualise whoami
141 """
141 """
142
142
143 def bzr_completer(self,event):
143 def bzr_completer(self,event):
144 """ Completer for bazaar commands """
144 """ Completer for bazaar commands """
145 cmd_param = event.line.split()
145 cmd_param = event.line.split()
146 if event.line.endswith(' '):
146 if event.line.endswith(' '):
147 cmd_param.append('')
147 cmd_param.append('')
148
148
149 if len(cmd_param) > 2:
149 if len(cmd_param) > 2:
150 cmd = cmd_param[1]
150 cmd = cmd_param[1]
151 param = cmd_param[-1]
151 param = cmd_param[-1]
152 output_file = (param == '--output=')
152 output_file = (param == '--output=')
153 if cmd == 'help':
153 if cmd == 'help':
154 return bzr_commands.split()
154 return bzr_commands.split()
155 elif cmd in ['bundle-revisions','conflicts',
155 elif cmd in ['bundle-revisions','conflicts',
156 'deleted','nick','register-branch',
156 'deleted','nick','register-branch',
157 'serve','unbind','upgrade','version',
157 'serve','unbind','upgrade','version',
158 'whoami'] and not output_file:
158 'whoami'] and not output_file:
159 return []
159 return []
160 else:
160 else:
161 # the rest are probably file names
161 # the rest are probably file names
162 return ip.IP.Completer.file_matches(event.symbol)
162 return ip.IP.Completer.file_matches(event.symbol)
163
163
164 return bzr_commands.split()
164 return bzr_commands.split()
165
165
166 ip.set_hook('complete_command', bzr_completer, str_key = 'bzr')
166 ip.set_hook('complete_command', bzr_completer, str_key = 'bzr')
167
167
168
168
169 def runlistpy(self, event):
169 def runlistpy(self, event):
170 comps = shlex.split(event.line)
170 comps = shlex.split(event.line)
171 relpath = (len(comps) > 1 and comps[-1] or '')
171 relpath = (len(comps) > 1 and comps[-1] or '')
172
172
173 #print "rp",relpath # dbg
173 #print "rp",relpath # dbg
174 lglob = glob.glob
174 lglob = glob.glob
175 isdir = os.path.isdir
175 isdir = os.path.isdir
176 if relpath.startswith('~'):
176 if relpath.startswith('~'):
177 relpath = os.path.expanduser(relpath)
177 relpath = os.path.expanduser(relpath)
178 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
178 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
179 if isdir(f)]
179 if isdir(f)]
180 pys = [f.replace('\\','/') for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy')]
180 pys = [f.replace('\\','/') for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy')]
181 return dirs + pys
181 return dirs + pys
182
182
183 ip.set_hook('complete_command', runlistpy, str_key = '%run')
183 ip.set_hook('complete_command', runlistpy, str_key = '%run')
184
184
185 def cd_completer(self, event):
185 def cd_completer(self, event):
186 relpath = event.symbol
186 relpath = event.symbol
187 #print event # dbg
187 #print event # dbg
188 if '-b' in event.line:
188 if '-b' in event.line:
189 # return only bookmark completions
189 # return only bookmark completions
190 bkms = self.db.get('bookmarks',{})
190 bkms = self.db.get('bookmarks',{})
191 return bkms.keys()
191 return bkms.keys()
192
192
193
193
194 if event.symbol == '-':
194 if event.symbol == '-':
195 # jump in directory history by number
195 # jump in directory history by number
196 ents = ['-%d [%s]' % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
196 ents = ['-%d [%s]' % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
197 if len(ents) > 1:
197 if len(ents) > 1:
198 return ents
198 return ents
199 return []
199 return []
200
200
201 if relpath.startswith('~'):
201 if relpath.startswith('~'):
202 relpath = os.path.expanduser(relpath).replace('\\','/')
202 relpath = os.path.expanduser(relpath).replace('\\','/')
203 found = []
203 found = []
204 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
204 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
205 if os.path.isdir(f)]:
205 if os.path.isdir(f)]:
206 if ' ' in d:
206 if ' ' in d:
207 # we don't want to deal with any of that, complex code
207 # we don't want to deal with any of that, complex code
208 # for this is elsewhere
208 # for this is elsewhere
209 raise IPython.ipapi.TryNext
209 raise IPython.ipapi.TryNext
210 found.append( d )
210 found.append( d )
211
211
212 if not found:
212 if not found:
213 if os.path.isdir(relpath):
213 if os.path.isdir(relpath):
214 return [relpath]
214 return [relpath]
215 raise IPython.ipapi.TryNext
215 raise IPython.ipapi.TryNext
216 return found
216 return found
217
217
218 ip.set_hook('complete_command', cd_completer, str_key = '%cd')
218 ip.set_hook('complete_command', cd_completer, str_key = '%cd')
@@ -1,61 +1,61
1 """ Preliminary "job control" extensions for IPython
1 """ Preliminary "job control" extensions for IPython
2
2
3 requires python 2.4 (or separate 'subprocess' module
3 requires python 2.4 (or separate 'subprocess' module
4
4
5 At the moment this is in a very "unhelpful" form, will be extended in the future.
5 At the moment this is in a very "unhelpful" form, will be extended in the future.
6
6
7 Usage:
7 Usage:
8
8
9 [ipython]|2> import jobctrl
9 [ipython]|2> import jobctrl
10 [ipython]|3> &ls
10 [ipython]|3> &ls
11 <3> <jobctrl.IpyPopen object at 0x00D87FD0>
11 <3> <jobctrl.IpyPopen object at 0x00D87FD0>
12 [ipython]|4> _3.go
12 [ipython]|4> _3.go
13 -----------> _3.go()
13 -----------> _3.go()
14 ChangeLog
14 ChangeLog
15 IPython
15 IPython
16 MANIFEST.in
16 MANIFEST.in
17 README
17 README
18 README_Windows.txt
18 README_Windows.txt
19
19
20 ...
20 ...
21 """
21 """
22
22
23 from subprocess import Popen,PIPE
23 from subprocess import Popen,PIPE
24 import os
24 import os,shlex
25
25
26 from IPython import genutils
26 from IPython import genutils
27
27
28 import IPython.ipapi
28 import IPython.ipapi
29
29
30 class IpyPopen(Popen):
30 class IpyPopen(Popen):
31 def go(self):
31 def go(self):
32 print self.communicate()[0]
32 print self.communicate()[0]
33 def __repr__(self):
33 def __repr__(self):
34 return '<IPython job "%s" PID=%d>' % (self.line, self.pid)
34 return '<IPython job "%s" PID=%d>' % (self.line, self.pid)
35
35
36 def kill(self):
36 def kill(self):
37 assert os.name == 'nt' # xxx add posix version
37 assert os.name == 'nt' # xxx add posix version
38 os.system('taskkill /PID %d' % self.pid)
38 os.system('taskkill /PID %d' % self.pid)
39
39
40 def startjob(job):
40 def startjob(job):
41 p = IpyPopen(job, stdout=PIPE, shell = False)
41 p = IpyPopen(shlex.split(job), stdout=PIPE, shell = False)
42 p.line = job
42 p.line = job
43 return p
43 return p
44
44
45 def jobctrl_prefilter_f(self,line):
45 def jobctrl_prefilter_f(self,line):
46 if line.startswith('&'):
46 if line.startswith('&'):
47 pre,fn,rest = self.split_user_input(line[1:])
47 pre,fn,rest = self.split_user_input(line[1:])
48
48
49 line = ip.IP.expand_aliases(fn,rest)
49 line = ip.IP.expand_aliases(fn,rest)
50 return '_ip.startjob(%s)' % genutils.make_quoted_expr(line)
50 return '_ip.startjob(%s)' % genutils.make_quoted_expr(line)
51
51
52 raise IPython.ipapi.TryNext
52 raise IPython.ipapi.TryNext
53
53
54 def install():
54 def install():
55 global ip
55 global ip
56 ip = IPython.ipapi.get()
56 ip = IPython.ipapi.get()
57 # needed to make startjob visible as _ip.startjob('blah')
57 # needed to make startjob visible as _ip.startjob('blah')
58 ip.startjob = startjob
58 ip.startjob = startjob
59 ip.set_hook('input_prefilter', jobctrl_prefilter_f)
59 ip.set_hook('input_prefilter', jobctrl_prefilter_f)
60
60
61 install() No newline at end of file
61 install()
@@ -1,98 +1,98
1 """ Fun magic line editor for ipython
1 """ Fun magic line editor for ipython
2
2
3 Use this to easily edit lists of strings gradually without crafting long
3 Use this to easily edit lists of strings gradually without crafting long
4 list comprehensions.
4 list comprehensions.
5
5
6 'l' is the magic variable name for every line (array element). Save the current
6 'l' is the magic variable name for every line (array element). Save the current
7 result (or more exactly, retrieve the last ipython computation result into
7 result (or more exactly, retrieve the last ipython computation result into
8 %led work area) by running '%led s'. Just run '%led' to show the current work
8 %led work area) by running '%led s'. Just run '%led' to show the current work
9 area data.
9 area data.
10
10
11 Example use:
11 Example use:
12
12
13 [ipython]|25> setups = !ls *setup*.py
13 [ipython]|25> setups = !ls *setup*.py
14 ==
14 ==
15 ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
15 ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
16 [ipython]|26> setups
16 [ipython]|26> setups
17 <26> ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
17 <26> ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
18 [ipython]|27> %led s
18 [ipython]|27> %led s
19 Data set from last result (_)
19 Data set from last result (_)
20 <27> ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
20 <27> ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
21 [ipython]|28> %led upper
21 [ipython]|28> %led upper
22 cmd translated => l.upper()
22 cmd translated => l.upper()
23 <28> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY']
23 <28> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY']
24 [ipython]|29> %led
24 [ipython]|29> %led
25 Magic line editor (for lists of strings)
25 Magic line editor (for lists of strings)
26 current data is:
26 current data is:
27 ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
27 ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py']
28 [ipython]|30> %led upper
28 [ipython]|30> %led upper
29 cmd translated => l.upper()
29 cmd translated => l.upper()
30 <30> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY']
30 <30> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY']
31 [ipython]|31> %led s
31 [ipython]|31> %led s
32 Data set from last result (_)
32 Data set from last result (_)
33 <31> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY']
33 <31> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY']
34 [ipython]|32> %led "n:" + l
34 [ipython]|32> %led "n:" + l
35 <32> ['n:EGGSETUP.PY', 'n:SETUP.PY', 'n:SETUP_BDIST_EGG.PY']
35 <32> ['n:EGGSETUP.PY', 'n:SETUP.PY', 'n:SETUP_BDIST_EGG.PY']
36 [ipython]|33> %led s
36 [ipython]|33> %led s
37 Data set from last result (_)
37 Data set from last result (_)
38 <33> ['n:EGGSETUP.PY', 'n:SETUP.PY', 'n:SETUP_BDIST_EGG.PY']
38 <33> ['n:EGGSETUP.PY', 'n:SETUP.PY', 'n:SETUP_BDIST_EGG.PY']
39 [ipython]|34> %led l.
39 [ipython]|34> %led l.
40 l.__add__ l.__gt__ l.__reduce_ex__ l.endswith l.join l.rstrip
40 l.__add__ l.__gt__ l.__reduce_ex__ l.endswith l.join l.rstrip
41 l.__class__ l.__hash__ l.__repr__ l.expandtabs l.ljust l.split
41 l.__class__ l.__hash__ l.__repr__ l.expandtabs l.ljust l.split
42
42
43 ... (completions for string variable shown ) ...
43 ... (completions for string variable shown ) ...
44
44
45 """
45 """
46 import IPython.ipapi
46 import IPython.ipapi
47 import pprint
47 import pprint
48 ip = IPython.ipapi.get()
48 ip = IPython.ipapi.get()
49
49
50 curdata = []
50 curdata = []
51
51
52 def line_edit_f(self, cmd ):
52 def line_edit_f(self, cmd ):
53 global curdata
53 global curdata
54
54
55 if not cmd:
55 if not cmd:
56
56
57 print "Magic line editor (for lists of strings)"
57 print "Magic line editor (for lists of strings)"
58 if curdata:
58 if curdata:
59 print "current data is:"
59 print "current data is:"
60 pprint.pprint(curdata)
60 pprint.pprint(curdata)
61 else:
61 else:
62 print "No current data, you should set it by running '%led s'"
62 print "No current data, you should set it by running '%led s'"
63 print "When you have your data in _ (result of last computation)."
63 print "When you have your data in _ (result of last computation)."
64 return
64 return
65
65
66 if cmd == 's':
66 if cmd == 's':
67 curdata = ip.ev('_')
67 curdata = ip.ev('_')
68 print "Data set from last result (_)"
68 print "Data set from last result (_)"
69 newlines = curdata
69 newlines = curdata
70
70
71 else:
71 else:
72 # simple method call, e.g. upper
72 # simple method call, e.g. upper
73 if cmd.isalpha():
73 if cmd.isalpha():
74 cmd = 'l.' + cmd + '()'
74 cmd = 'l.' + cmd + '()'
75 print "cmd translated =>",cmd
75 print "cmd translated =>",cmd
76
76
77 newlines = []
77 newlines = []
78 for l in curdata:
78 for l in curdata:
79 try:
79 try:
80 l2 = eval(cmd)
80 l2 = eval(cmd)
81 except Exception,e:
81 except Exception,e:
82 print "Dropping exception",e,"on line:",l
82 print "Dropping exception",e,"on line:",l
83 continue
83 continue
84 newlines.append(l2)
84 newlines.append(l2)
85
85
86
86
87 return newlines
87 return newlines
88
88
89 def line_edit_complete_f(self,event):
89 def line_edit_complete_f(self,event):
90 """ Show all string methods in completions """
90 """ Show all string methods in completions """
91 if event.symbol.startswith('l.'):
91 if event.symbol.startswith('l.'):
92 return ['l.' + func for func in dir('')]
92 return ['l.' + func for func in dir('')]
93
93
94 return dir('') + ['l.' + func for func in dir('')]
94 return dir('') + ['l.' + func for func in dir('')]
95
95
96 ip.set_hook('complete_command', line_edit_complete_f , str_key = '%led')
96 ip.set_hook('complete_command', line_edit_complete_f , str_key = '%led')
97
97
98 ip.expose_magic('led', line_edit_f) No newline at end of file
98 ip.expose_magic('led', line_edit_f)
@@ -1,7 +1,7
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Release data for the IPython project.
2 """Release data for the IPython project.
3
3
4 $Id: Release.py 1976 2006-12-08 11:53:57Z vivainio $"""
4 $Id: Release.py 2010 2006-12-20 15:29:17Z vivainio $"""
5
5
6 #*****************************************************************************
6 #*****************************************************************************
7 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
7 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
@@ -22,12 +22,11 name = 'ipython'
22 # because bdist_rpm does not accept dashes (an RPM) convention, and
22 # because bdist_rpm does not accept dashes (an RPM) convention, and
23 # bdist_deb does not accept underscores (a Debian convention).
23 # bdist_deb does not accept underscores (a Debian convention).
24
24
25 revision = '1975'
25 revision = '2007'
26
26
27 #version = '0.7.3.svn'
27 version = '0.7.3'
28
29 version = '0.7.3b3.r' + revision.rstrip('M')
30
28
29 #version = '0.7.3rc2.r' + revision.rstrip('M')
31
30
32 description = "An enhanced interactive Python shell."
31 description = "An enhanced interactive Python shell."
33
32
@@ -1,54 +1,54
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """ Imports and provides the "correct" version of readline for the platform.
2 """ Imports and provides the "correct" version of readline for the platform.
3
3
4 Readline is used throughout IPython as "import IPython.rlineimpl as readline.
4 Readline is used throughout IPython as "import IPython.rlineimpl as readline.
5
5
6 In addition to normal readline stuff, this module provides have_readline boolean
6 In addition to normal readline stuff, this module provides have_readline boolean
7 and _outputfile variable used in genutils.
7 and _outputfile variable used in genutils.
8
8
9 $Id: Magic.py 1096 2006-01-28 20:08:02Z vivainio $"""
9 $Id: Magic.py 1096 2006-01-28 20:08:02Z vivainio $"""
10
10
11
11
12 import sys
12 import sys
13
13
14 have_readline = False
14 have_readline = False
15
15
16 if sys.platform == 'win32':
16 if sys.platform == 'win32':
17 try:
17 try:
18 import pyreadline.rlmain
18 import pyreadline.rlmain
19 #add config for inputrcpath here:
19 #add config for inputrcpath here:
20 #pyreadline.rlmain.config_path="c:/python/test_config.ini"
20 #pyreadline.rlmain.config_path="c:/python/test_config.ini"
21 from readline import *
21 from readline import *
22 #print "Using the new pyreadline (thanks for participating in the testing!)"
22 #print "Using the new pyreadline (thanks for participating in the testing!)"
23
23
24 have_readline = True
24 have_readline = True
25
25
26 import readline as _rl
26 import readline as _rl
27 except ImportError:
27 except ImportError:
28 #print "IPython team recommends the new pyreadline for Windows use, "
28 #print "IPython team recommends the new pyreadline for Windows use, "
29 #print "It's superior especially with non-US keyboard layouts."
29 #print "It's superior especially with non-US keyboard layouts."
30 #print "Try installing it with 'easy_install pyreadline (ctypes is required) or"
30 #print "Try installing it with 'easy_install pyreadline (ctypes is required) or"
31 #print "svn co http://ipython.scipy.org/svn/ipython/pyreadline/trunk pyreadline"
31 #print "svn co http://ipython.scipy.org/svn/ipython/pyreadline/trunk pyreadline"
32 #print "Trying 'old' windows readline."
32 #print "Trying 'old' windows readline."
33 #print "Using 'old' readline, you might want to try pyreadline:"
33 #print "Using 'old' readline, you might want to try pyreadline:"
34 #print "http://projects.scipy.org/ipython/ipython/wiki/PyReadline/Intro"
34 #print "http://projects.scipy.org/ipython/ipython/wiki/PyReadline/Intro"
35 try:
35 try:
36 from readline import *
36 from readline import *
37 import readline as _rl
37 import readline as _rl
38 have_readline = True
38 have_readline = True
39 except ImportError:
39 except ImportError:
40 pass
40 pass
41
41
42 if have_readline:
42 if have_readline:
43 try:
43 try:
44 _outputfile=_rl.GetOutputFile()
44 _outputfile=_rl.GetOutputFile()
45 except NameError:
45 except NameError:
46 print "Failed GetOutputFile"
46 print "Failed GetOutputFile"
47 have_readline = False
47 have_readline = False
48
48
49 else:
49 else:
50 try:
50 try:
51 from readline import *
51 from readline import *
52 have_readline = True
52 have_readline = True
53 except ImportError:
53 except ImportError:
54 pass
54 pass
@@ -1,65 +1,65
1 from IPython.hooks import CommandChainDispatcher
1 from IPython.hooks import CommandChainDispatcher
2 import IPython.hooks
2 import IPython.hooks
3
3
4 import re
4 import re
5
5
6 class StrDispatch(object):
6 class StrDispatch(object):
7 """ Dispatch (lookup) a set of strings / regexps for match """
7 """ Dispatch (lookup) a set of strings / regexps for match """
8 def __init__(self):
8 def __init__(self):
9 self.strs = {}
9 self.strs = {}
10 self.regexs = {}
10 self.regexs = {}
11 def add_s(self, s, obj, priority= 0 ):
11 def add_s(self, s, obj, priority= 0 ):
12 """ Adds a target 'string' for dispatching """
12 """ Adds a target 'string' for dispatching """
13
13
14 chain = self.strs.get(s, CommandChainDispatcher())
14 chain = self.strs.get(s, CommandChainDispatcher())
15 chain.add(obj,priority)
15 chain.add(obj,priority)
16 self.strs[s] = chain
16 self.strs[s] = chain
17
17
18 def add_re(self, regex, obj, priority= 0 ):
18 def add_re(self, regex, obj, priority= 0 ):
19 """ Adds a target regexp for dispatching """
19 """ Adds a target regexp for dispatching """
20
20
21 chain = self.regexs.get(regex, CommandChainDispatcher())
21 chain = self.regexs.get(regex, CommandChainDispatcher())
22 chain.add(obj,priority)
22 chain.add(obj,priority)
23 self.regexs[regex] = chain
23 self.regexs[regex] = chain
24
24
25 def dispatch(self, key):
25 def dispatch(self, key):
26 """ Get a seq of Commandchain objects that match key """
26 """ Get a seq of Commandchain objects that match key """
27 if key in self.strs:
27 if key in self.strs:
28 yield self.strs[key]
28 yield self.strs[key]
29
29
30 for r, obj in self.regexs.items():
30 for r, obj in self.regexs.items():
31 if re.match(r, key):
31 if re.match(r, key):
32 yield obj
32 yield obj
33 else:
33 else:
34 #print "nomatch",key
34 #print "nomatch",key
35 pass
35 pass
36
36
37
37
38 def __repr__(self):
38 def __repr__(self):
39 return "<Strdispatch %s, %s>" % (self.strs, self.regexs)
39 return "<Strdispatch %s, %s>" % (self.strs, self.regexs)
40
40
41 def s_matches(self, key):
41 def s_matches(self, key):
42 if key not in self.strs:
42 if key not in self.strs:
43 return
43 return
44 for el in self.strs[key]:
44 for el in self.strs[key]:
45 yield el[1]
45 yield el[1]
46
46
47
47
48 def flat_matches(self, key):
48 def flat_matches(self, key):
49 """ Yield all 'value' targets, without priority """
49 """ Yield all 'value' targets, without priority """
50 for val in self.dispatch(key):
50 for val in self.dispatch(key):
51 for el in val:
51 for el in val:
52 yield el[1] # only value, no priority
52 yield el[1] # only value, no priority
53 return
53 return
54
54
55
55
56 def test():
56 def test():
57 d = StrDispatch()
57 d = StrDispatch()
58 d.add_s('hei',34, priority = 4)
58 d.add_s('hei',34, priority = 4)
59 d.add_s('hei',123, priority = 2)
59 d.add_s('hei',123, priority = 2)
60 print list(d.dispatch('hei'))
60 print list(d.dispatch('hei'))
61 d.add_re('h.i', 686)
61 d.add_re('h.i', 686)
62 print list(d.flat_matches('hei'))
62 print list(d.flat_matches('hei'))
63
63
64 if __name__ == '__main__':
64 if __name__ == '__main__':
65 test() No newline at end of file
65 test()
@@ -1,94 +1,94
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 """ A script/util to upgrade all files in a directory
2 """ A script/util to upgrade all files in a directory
3
3
4 This is rather conservative in its approach, only copying/overwriting
4 This is rather conservative in its approach, only copying/overwriting
5 new and unedited files.
5 new and unedited files.
6
6
7 To be used by "upgrade" feature.
7 To be used by "upgrade" feature.
8 """
8 """
9 try:
9 try:
10 from IPython.Extensions.path import path
10 from IPython.Extensions.path import path
11 except ImportError:
11 except ImportError:
12 try:
12 try:
13 from Extensions.path import path
13 from Extensions.path import path
14 except ImportError:
14 except ImportError:
15 from path import path
15 from path import path
16
16
17 import md5,pickle
17 import md5,pickle
18
18
19 def showdiff(old,new):
19 def showdiff(old,new):
20 import difflib
20 import difflib
21 d = difflib.Differ()
21 d = difflib.Differ()
22 lines = d.compare(old.lines(),new.lines())
22 lines = d.compare(old.lines(),new.lines())
23 realdiff = False
23 realdiff = False
24 for l in lines:
24 for l in lines:
25 print l,
25 print l,
26 if not realdiff and not l[0].isspace():
26 if not realdiff and not l[0].isspace():
27 realdiff = True
27 realdiff = True
28 return realdiff
28 return realdiff
29
29
30 def upgrade_dir(srcdir, tgtdir):
30 def upgrade_dir(srcdir, tgtdir):
31 """ Copy over all files in srcdir to tgtdir w/ native line endings
31 """ Copy over all files in srcdir to tgtdir w/ native line endings
32
32
33 Creates .upgrade_report in tgtdir that stores md5sums of all files
33 Creates .upgrade_report in tgtdir that stores md5sums of all files
34 to notice changed files b/w upgrades.
34 to notice changed files b/w upgrades.
35 """
35 """
36
36
37 def pr(s):
37 def pr(s):
38 print s
38 print s
39
39
40 def ignorable(p):
40 def ignorable(p):
41 if p.lower().startswith('.svn') or p.startswith('ipythonrc'):
41 if p.lower().startswith('.svn') or p.startswith('ipythonrc'):
42 return True
42 return True
43 return False
43 return False
44
44
45
45
46 modded = []
46 modded = []
47 files = [path(srcdir).relpathto(p) for p in path(srcdir).walkfiles()]
47 files = [path(srcdir).relpathto(p) for p in path(srcdir).walkfiles()]
48 #print files
48 #print files
49 rep = tgtdir / '.upgrade_report'
49 rep = tgtdir / '.upgrade_report'
50 try:
50 try:
51 rpt = pickle.load(rep.open())
51 rpt = pickle.load(rep.open())
52 except:
52 except:
53 rpt = {}