Show More
@@ -12,6 +12,7 b' import IPython.ipapi' | |||||
12 | import glob,os,shlex,sys |
|
12 | import glob,os,shlex,sys | |
13 | import inspect |
|
13 | import inspect | |
14 | from time import time |
|
14 | from time import time | |
|
15 | from zipimport import zipimporter | |||
15 | ip = IPython.ipapi.get() |
|
16 | ip = IPython.ipapi.get() | |
16 |
|
17 | |||
17 | try: |
|
18 | try: | |
@@ -86,6 +87,11 b' def moduleList(path):' | |||||
86 |
|
87 | |||
87 | if os.path.isdir(path): |
|
88 | if os.path.isdir(path): | |
88 | folder_list = os.listdir(path) |
|
89 | folder_list = os.listdir(path) | |
|
90 | elif path.endswith('.egg'): | |||
|
91 | try: | |||
|
92 | folder_list = [f for f in zipimporter(path)._files] | |||
|
93 | except: | |||
|
94 | folder_list = [] | |||
89 | else: |
|
95 | else: | |
90 | folder_list = [] |
|
96 | folder_list = [] | |
91 | #folder_list = glob.glob(os.path.join(path,'*')) |
|
97 | #folder_list = glob.glob(os.path.join(path,'*')) |
@@ -1052,25 +1052,40 b' class SList(list):' | |||||
1052 |
|
1052 | |||
1053 | p = paths = property(get_paths) |
|
1053 | p = paths = property(get_paths) | |
1054 |
|
1054 | |||
1055 | def grep(self, pattern, prune = False): |
|
1055 | def grep(self, pattern, prune = False, field = None): | |
1056 | """ Return all strings matching 'pattern' (a regex or callable) |
|
1056 | """ Return all strings matching 'pattern' (a regex or callable) | |
1057 |
|
1057 | |||
1058 | This is case-insensitive. If prune is true, return all items |
|
1058 | This is case-insensitive. If prune is true, return all items | |
1059 | NOT matching the pattern. |
|
1059 | NOT matching the pattern. | |
1060 |
|
1060 | |||
|
1061 | If field is specified, the match must occur in the specified | |||
|
1062 | whitespace-separated field. | |||
|
1063 | ||||
1061 | Examples:: |
|
1064 | Examples:: | |
1062 |
|
1065 | |||
1063 | a.grep( lambda x: x.startswith('C') ) |
|
1066 | a.grep( lambda x: x.startswith('C') ) | |
1064 | a.grep('Cha.*log', prune=1) |
|
1067 | a.grep('Cha.*log', prune=1) | |
|
1068 | a.grep('chm', field=-1) | |||
1065 | """ |
|
1069 | """ | |
|
1070 | ||||
|
1071 | def match_target(s): | |||
|
1072 | if field is None: | |||
|
1073 | return s | |||
|
1074 | parts = s.split() | |||
|
1075 | try: | |||
|
1076 | tgt = parts[field] | |||
|
1077 | return tgt | |||
|
1078 | except IndexError: | |||
|
1079 | return "" | |||
|
1080 | ||||
1066 | if isinstance(pattern, basestring): |
|
1081 | if isinstance(pattern, basestring): | |
1067 | pred = lambda x : re.search(pattern, x, re.IGNORECASE) |
|
1082 | pred = lambda x : re.search(pattern, x, re.IGNORECASE) | |
1068 | else: |
|
1083 | else: | |
1069 | pred = pattern |
|
1084 | pred = pattern | |
1070 | if not prune: |
|
1085 | if not prune: | |
1071 | return SList([el for el in self if pred(el)]) |
|
1086 | return SList([el for el in self if pred(match_target(el))]) | |
1072 | else: |
|
1087 | else: | |
1073 | return SList([el for el in self if not pred(el)]) |
|
1088 | return SList([el for el in self if not pred(match_target(el))]) | |
1074 | def fields(self, *fields): |
|
1089 | def fields(self, *fields): | |
1075 | """ Collect whitespace-separated fields from string list |
|
1090 | """ Collect whitespace-separated fields from string list | |
1076 |
|
1091 | |||
@@ -1083,6 +1098,7 b' class SList(list):' | |||||
1083 | a.fields(0) is ['-rwxrwxrwx', 'drwxrwxrwx+'] |
|
1098 | a.fields(0) is ['-rwxrwxrwx', 'drwxrwxrwx+'] | |
1084 | a.fields(1,0) is ['1 -rwxrwxrwx', '6 drwxrwxrwx+'] |
|
1099 | a.fields(1,0) is ['1 -rwxrwxrwx', '6 drwxrwxrwx+'] | |
1085 | (note the joining by space). |
|
1100 | (note the joining by space). | |
|
1101 | a.fields(-1) is ['ChangeLog', 'IPython'] | |||
1086 |
|
1102 | |||
1087 | IndexErrors are ignored. |
|
1103 | IndexErrors are ignored. | |
1088 |
|
1104 |
@@ -92,7 +92,7 b' class NonBlockingIPShell(object):' | |||||
92 |
|
92 | |||
93 | def __init__(self,argv=[],user_ns={},user_global_ns=None, |
|
93 | def __init__(self,argv=[],user_ns={},user_global_ns=None, | |
94 | cin=None, cout=None, cerr=None, |
|
94 | cin=None, cout=None, cerr=None, | |
95 |
ask_exit_handler=None |
|
95 | ask_exit_handler=None): | |
96 | ''' |
|
96 | ''' | |
97 | @param argv: Command line options for IPython |
|
97 | @param argv: Command line options for IPython | |
98 | @type argv: list |
|
98 | @type argv: list | |
@@ -114,7 +114,7 b' class NonBlockingIPShell(object):' | |||||
114 | #ipython0 initialisation |
|
114 | #ipython0 initialisation | |
115 | self.initIpython0(argv, user_ns, user_global_ns, |
|
115 | self.initIpython0(argv, user_ns, user_global_ns, | |
116 | cin, cout, cerr, |
|
116 | cin, cout, cerr, | |
117 |
ask_exit_handler |
|
117 | ask_exit_handler) | |
118 |
|
118 | |||
119 | #vars used by _execute |
|
119 | #vars used by _execute | |
120 | self._iter_more = 0 |
|
120 | self._iter_more = 0 | |
@@ -133,7 +133,7 b' class NonBlockingIPShell(object):' | |||||
133 |
|
133 | |||
134 | def initIpython0(self, argv=[], user_ns={}, user_global_ns=None, |
|
134 | def initIpython0(self, argv=[], user_ns={}, user_global_ns=None, | |
135 | cin=None, cout=None, cerr=None, |
|
135 | cin=None, cout=None, cerr=None, | |
136 |
ask_exit_handler=None |
|
136 | ask_exit_handler=None): | |
137 | #first we redefine in/out/error functions of IPython |
|
137 | #first we redefine in/out/error functions of IPython | |
138 | if cin: |
|
138 | if cin: | |
139 | IPython.Shell.Term.cin = cin |
|
139 | IPython.Shell.Term.cin = cin | |
@@ -167,12 +167,18 b' class NonBlockingIPShell(object):' | |||||
167 | self._IP.set_hook('shell_hook',self._shell) |
|
167 | self._IP.set_hook('shell_hook',self._shell) | |
168 |
|
168 | |||
169 | #we replace the ipython default input command caller by our method |
|
169 | #we replace the ipython default input command caller by our method | |
170 | IPython.iplib.raw_input_original = rawinput |
|
170 | IPython.iplib.raw_input_original = self._raw_input | |
171 |
|
||||
172 | #we replace the ipython default exit command by our method |
|
171 | #we replace the ipython default exit command by our method | |
173 | self._IP.exit = ask_exit_handler |
|
172 | self._IP.exit = ask_exit_handler | |
174 | #we replace the help command |
|
173 | #we replace the help command | |
175 | self._IP.user_ns['help'] = _Helper(self._pager_help) |
|
174 | self._IP.user_ns['help'] = _Helper(self._pager_help) | |
|
175 | ||||
|
176 | #we disable cpase magic... until we found a way to use it properly. | |||
|
177 | #import IPython.ipapi | |||
|
178 | ip = IPython.ipapi.get() | |||
|
179 | def bypassMagic(self, arg): | |||
|
180 | print '%this magic is currently disabled.' | |||
|
181 | ip.expose_magic('cpaste', bypassMagic) | |||
176 |
|
182 | |||
177 | sys.excepthook = excepthook |
|
183 | sys.excepthook = excepthook | |
178 |
|
184 | |||
@@ -340,6 +346,12 b' class NonBlockingIPShell(object):' | |||||
340 | ''' |
|
346 | ''' | |
341 | pass |
|
347 | pass | |
342 |
|
348 | |||
|
349 | #def _askExit(self): | |||
|
350 | # ''' | |||
|
351 | # Can be redefined to generate post event to exit the Ipython shell | |||
|
352 | # ''' | |||
|
353 | # pass | |||
|
354 | ||||
343 | def _getHistoryMaxIndex(self): |
|
355 | def _getHistoryMaxIndex(self): | |
344 | ''' |
|
356 | ''' | |
345 | returns the max length of the history buffer |
|
357 | returns the max length of the history buffer | |
@@ -380,6 +392,18 b' class NonBlockingIPShell(object):' | |||||
380 | ''' |
|
392 | ''' | |
381 | self._doc_text = text |
|
393 | self._doc_text = text | |
382 |
|
394 | |||
|
395 | def _raw_input(self, prompt=''): | |||
|
396 | ''' | |||
|
397 | Custom raw_input() replacement. Get's current line from console buffer. | |||
|
398 | ||||
|
399 | @param prompt: Prompt to print. Here for compatability as replacement. | |||
|
400 | @type prompt: string | |||
|
401 | ||||
|
402 | @return: The current command line text. | |||
|
403 | @rtype: string | |||
|
404 | ''' | |||
|
405 | return self._line_to_execute | |||
|
406 | ||||
383 | def _execute(self): |
|
407 | def _execute(self): | |
384 | ''' |
|
408 | ''' | |
385 | Executes the current line provided by the shell object. |
|
409 | Executes the current line provided by the shell object. |
@@ -47,12 +47,11 b' class WxNonBlockingIPShell(NonBlockingIPShell):' | |||||
47 | def __init__(self, parent, |
|
47 | def __init__(self, parent, | |
48 | argv=[],user_ns={},user_global_ns=None, |
|
48 | argv=[],user_ns={},user_global_ns=None, | |
49 | cin=None, cout=None, cerr=None, |
|
49 | cin=None, cout=None, cerr=None, | |
50 |
ask_exit_handler=None |
|
50 | ask_exit_handler=None): | |
51 |
|
51 | |||
52 | NonBlockingIPShell.__init__(self,argv,user_ns,user_global_ns, |
|
52 | NonBlockingIPShell.__init__(self,argv,user_ns,user_global_ns, | |
53 | cin, cout, cerr, |
|
53 | cin, cout, cerr, | |
54 |
ask_exit_handler |
|
54 | ask_exit_handler) | |
55 | rawinput) |
|
|||
56 |
|
55 | |||
57 | self.parent = parent |
|
56 | self.parent = parent | |
58 |
|
57 | |||
@@ -216,6 +215,31 b' class WxConsoleView(stc.StyledTextCtrl):' | |||||
216 |
|
215 | |||
217 | self.Bind(wx.EVT_KEY_DOWN, self._onKeypress, self) |
|
216 | self.Bind(wx.EVT_KEY_DOWN, self._onKeypress, self) | |
218 |
|
217 | |||
|
218 | def asyncWrite(self, text): | |||
|
219 | ''' | |||
|
220 | Write given text to buffer in an asynchroneous way. | |||
|
221 | It is used from another thread to be able to acces the GUI. | |||
|
222 | @param text: Text to append | |||
|
223 | @type text: string | |||
|
224 | ''' | |||
|
225 | try: | |||
|
226 | #print >>sys.__stdout__,'entering' | |||
|
227 | wx.MutexGuiEnter() | |||
|
228 | #print >>sys.__stdout__,'locking the GUI' | |||
|
229 | ||||
|
230 | #be sure not to be interrutpted before the MutexGuiLeave! | |||
|
231 | self.write(text) | |||
|
232 | #print >>sys.__stdout__,'done' | |||
|
233 | ||||
|
234 | except KeyboardInterrupt: | |||
|
235 | #print >>sys.__stdout__,'got keyboard interrupt' | |||
|
236 | wx.MutexGuiLeave() | |||
|
237 | #print >>sys.__stdout__,'interrupt unlock the GUI' | |||
|
238 | raise KeyboardInterrupt | |||
|
239 | wx.MutexGuiLeave() | |||
|
240 | #print >>sys.__stdout__,'normal unlock the GUI' | |||
|
241 | ||||
|
242 | ||||
219 | def write(self, text): |
|
243 | def write(self, text): | |
220 | ''' |
|
244 | ''' | |
221 | Write given text to buffer. |
|
245 | Write given text to buffer. | |
@@ -453,7 +477,7 b' class IPShellWidget(wx.Panel):' | |||||
453 |
|
477 | |||
454 | def __init__(self, parent, intro=None, |
|
478 | def __init__(self, parent, intro=None, | |
455 | background_color="BLACK", add_button_handler=None, |
|
479 | background_color="BLACK", add_button_handler=None, | |
456 | wx_ip_shell=None, |
|
480 | wx_ip_shell=None, user_ns={},user_global_ns=None, | |
457 | ): |
|
481 | ): | |
458 | ''' |
|
482 | ''' | |
459 | Initialize. |
|
483 | Initialize. | |
@@ -472,8 +496,7 b' class IPShellWidget(wx.Panel):' | |||||
472 | else: |
|
496 | else: | |
473 | self.IP = WxNonBlockingIPShell(self, |
|
497 | self.IP = WxNonBlockingIPShell(self, | |
474 | cout = self.cout, cerr = self.cout, |
|
498 | cout = self.cout, cerr = self.cout, | |
475 |
ask_exit_handler = self.askExitCallback |
|
499 | ask_exit_handler = self.askExitCallback) | |
476 | rawinput = self.rawInput) |
|
|||
477 |
|
500 | |||
478 | ### IPython wx console view instanciation ### |
|
501 | ### IPython wx console view instanciation ### | |
479 | #If user didn't defined an intro text, we create one for him |
|
502 | #If user didn't defined an intro text, we create one for him | |
@@ -492,7 +515,7 b' class IPShellWidget(wx.Panel):' | |||||
492 | intro=welcome_text, |
|
515 | intro=welcome_text, | |
493 | background_color=background_color) |
|
516 | background_color=background_color) | |
494 |
|
517 | |||
495 |
self.cout.write = self.text_ctrl. |
|
518 | self.cout.write = self.text_ctrl.asyncWrite | |
496 |
|
519 | |||
497 | self.text_ctrl.Bind(wx.EVT_KEY_DOWN, self.keyPress, self.text_ctrl) |
|
520 | self.text_ctrl.Bind(wx.EVT_KEY_DOWN, self.keyPress, self.text_ctrl) | |
498 |
|
521 | |||
@@ -509,18 +532,19 b' class IPShellWidget(wx.Panel):' | |||||
509 | #widget state management (for key handling different cases) |
|
532 | #widget state management (for key handling different cases) | |
510 | self.setCurrentState('IDLE') |
|
533 | self.setCurrentState('IDLE') | |
511 | self.pager_state = 'DONE' |
|
534 | self.pager_state = 'DONE' | |
|
535 | self.raw_input_current_line = 0 | |||
512 |
|
536 | |||
513 | def askExitCallback(self, event): |
|
537 | def askExitCallback(self, event): | |
514 | self.askExitHandler(event) |
|
538 | self.askExitHandler(event) | |
515 |
|
539 | |||
516 | #---------------------- IPython Thread Management ------------------------ |
|
540 | #---------------------- IPython Thread Management ------------------------ | |
517 | def stateDoExecuteLine(self): |
|
541 | def stateDoExecuteLine(self): | |
518 | #print >>sys.__stdout__,"command:",self.getCurrentLine() |
|
|||
519 | lines=self.text_ctrl.getCurrentLine() |
|
542 | lines=self.text_ctrl.getCurrentLine() | |
520 | self.text_ctrl.write('\n') |
|
543 | self.text_ctrl.write('\n') | |
521 |
|
|
544 | lines_to_execute = lines.replace('\t',' '*4) | |
522 | self.IP.doExecute((line.replace('\t',' '*4)).encode('cp1252')) |
|
545 | lines_to_execute = lines_to_execute.replace('\r\n','\n') | |
523 | self.updateHistoryTracker(self.text_ctrl.getCurrentLine()) |
|
546 | self.IP.doExecute(lines.encode('cp1252')) | |
|
547 | self.updateHistoryTracker(lines) | |||
524 | self.setCurrentState('WAIT_END_OF_EXECUTION') |
|
548 | self.setCurrentState('WAIT_END_OF_EXECUTION') | |
525 |
|
549 | |||
526 | def evtStateExecuteDone(self,evt): |
|
550 | def evtStateExecuteDone(self,evt): | |
@@ -551,16 +575,7 b' class IPShellWidget(wx.Panel):' | |||||
551 | def setCurrentState(self, state): |
|
575 | def setCurrentState(self, state): | |
552 | self.cur_state = state |
|
576 | self.cur_state = state | |
553 | self.updateStatusTracker(self.cur_state) |
|
577 | self.updateStatusTracker(self.cur_state) | |
554 | #---------------------------- Ipython raw_input ----------------------------------- |
|
578 | ||
555 | def rawInput(self, prompt=''): |
|
|||
556 | self.setCurrentState('WAITING_USER_INPUT') |
|
|||
557 | while self.cur_state != 'WAIT_END_OF_EXECUTION': |
|
|||
558 | pass |
|
|||
559 | line = self.text_ctrl.getCurrentLine() |
|
|||
560 | line = line.split('\n') |
|
|||
561 | return line[-2] |
|
|||
562 |
|
||||
563 | #---------------------------- IPython pager --------------------------------------- |
|
|||
564 | def pager(self,text): |
|
579 | def pager(self,text): | |
565 |
|
580 | |||
566 | if self.pager_state == 'INIT': |
|
581 | if self.pager_state == 'INIT': |
@@ -1,3 +1,10 b'' | |||||
|
1 | 2008-04-15 Ville Vainio <vivainio@gmail.com> | |||
|
2 | ||||
|
3 | * genutils.py: SList.grep supports 'field' argument | |||
|
4 | ||||
|
5 | * ipy_completers.py: module completer looks inside | |||
|
6 | .egg zip files (patch by mc). Close #196. | |||
|
7 | ||||
1 | 2008-04-09 Ville Vainio <vivainio@gmail.com> |
|
8 | 2008-04-09 Ville Vainio <vivainio@gmail.com> | |
2 |
|
9 | |||
3 | * deep_reload.py: do not crash on from __future__ import |
|
10 | * deep_reload.py: do not crash on from __future__ import |
General Comments 0
You need to be logged in to leave comments.
Login now