summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Silvester2014-07-31 20:19:10 -0500
committerSteven Silvester2014-07-31 20:19:10 -0500
commit900c792d14530fb5c7ae3d8c6931dead5d8493f0 (patch)
tree944c0093986dc8b61783fe6c4ec86efac06576f2
parenta1ceb302e6c877a552bedd7022339c72f143db7e (diff)
downloadscilab_kernel-900c792d14530fb5c7ae3d8c6931dead5d8493f0.tar.gz
scilab_kernel-900c792d14530fb5c7ae3d8c6931dead5d8493f0.tar.bz2
scilab_kernel-900c792d14530fb5c7ae3d8c6931dead5d8493f0.zip
Clean up complete, add path completions, refactoring.
-rw-r--r--octave_kernel.py97
1 files changed, 58 insertions, 39 deletions
diff --git a/octave_kernel.py b/octave_kernel.py
index 5526f02..7ebe698 100644
--- a/octave_kernel.py
+++ b/octave_kernel.py
@@ -1,6 +1,7 @@
from IPython.kernel.zmq.kernelbase import Kernel
from oct2py import octave, Oct2PyError
+import os
import signal
from subprocess import check_output
import re
@@ -59,21 +60,9 @@ class OctaveKernel(Kernel):
self.octavewrapper.restart()
return abort_msg
elif code.endswith('?'):
- if code[:-1] in dir(self.octavewrapper):
- output = getattr(self.octavewrapper, code[:-1]).__doc__
- stream_content = {'name': 'stdout', 'data': output}
- self.send_response(self.iopub_socket, 'stream', stream_content)
+ code = self._get_help(code)
+ if not code:
return abort_msg
- elif code.endswith('??') and code[:-2] in dir(self.octavewrapper):
- output = getattr(self.octavewrapper, code[:-2]).__doc__
- stream_content = {'name': 'stdout', 'data': output}
- self.send_response(self.iopub_socket, 'stream', stream_content)
- return abort_msg
- else:
- if code.endswith('??'):
- code = 'help("' + code[:-2] + '")\n\ntype ' + code[:-2]
- else:
- code = 'help("' + code[:-1] + '")'
interrupted = False
try:
output = self.octavewrapper._eval([code])
@@ -82,18 +71,7 @@ class OctaveKernel(Kernel):
interrupted = True
output = 'Octave Session Interrupted'
except Oct2PyError as e:
- err = str(e)
- if 'parse error:' in err:
- err = 'Parse Error'
- elif 'Octave returned:' in err:
- err = err[err.index('Octave returned:'):]
- err = err[len('Octave returned:'):].lstrip()
- elif 'Syntax Error' in err:
- err = 'Syntax Error'
- stream_content = {'name': 'stdout', 'data': err.strip()}
- self.send_response(self.iopub_socket, 'stream', stream_content)
- return {'status': 'error', 'execution_count': self.execution_count,
- 'ename': '', 'evalue': err, 'traceback': []}
+ return self._handle_error(str(e))
else:
if output is None:
output = ''
@@ -112,23 +90,33 @@ class OctaveKernel(Kernel):
def do_complete(self, code, cursor_pos):
code = code[:cursor_pos]
+ default = {'matches': [], 'cursor_start': 0,
+ 'cursor_end': cursor_pos, 'metadata': dict(),
+ 'status': 'ok'}
if code[-1] == ' ':
- return
+ return default
tokens = code.replace(';', ' ').split()
if not tokens:
- return
+ return default
token = tokens[-1]
- # check for valid function name
- if not re.match('\A[a-zA-Z_]', token):
- return
- start = cursor_pos - len(token)
- cmd = 'completion_matches("%s")' % token
- output = self.octavewrapper._eval([cmd])
- output = output.split()
- for item in dir(self.octavewrapper):
- if item.startswith(token) and not item in output:
- output.append(item)
- return {'matches': output, 'cursor_start': start,
+ if os.sep in token:
+ dname = os.path.dirname(token)
+ rest = os.path.basename(token)
+ if os.path.exists(dname):
+ files = os.listdir(dname)
+ matches = [f for f in files if f.startswith(rest)]
+ start = cursor_pos - len(rest)
+ else:
+ return default
+ else:
+ start = cursor_pos - len(token)
+ cmd = 'completion_matches("%s")' % token
+ output = self.octavewrapper._eval([cmd])
+ matches = output.split()
+ for item in dir(self.octavewrapper):
+ if item.startswith(token) and not item in matches:
+ matches.append(item)
+ return {'matches': matches, 'cursor_start': start,
'cursor_end': cursor_pos, 'metadata': dict(),
'status': 'ok'}
@@ -139,6 +127,37 @@ class OctaveKernel(Kernel):
self.octavewrapper.close()
return Kernel.do_shutdown(self, restart)
+ def _get_help(self, code):
+ if code[:-1] in dir(self.octavewrapper):
+ output = getattr(self.octavewrapper, code[:-1]).__doc__
+ stream_content = {'name': 'stdout', 'data': output}
+ self.send_response(self.iopub_socket, 'stream', stream_content)
+ code = None
+ elif code.endswith('??') and code[:-2] in dir(self.octavewrapper):
+ output = getattr(self.octavewrapper, code[:-2]).__doc__
+ stream_content = {'name': 'stdout', 'data': output}
+ self.send_response(self.iopub_socket, 'stream', stream_content)
+ code = None
+ else:
+ if code.endswith('??'):
+ code = 'help("' + code[:-2] + '")\n\ntype ' + code[:-2]
+ else:
+ code = 'help("' + code[:-1] + '")'
+ return code
+
+ def _handle_error(self, err):
+ if 'parse error:' in err:
+ err = 'Parse Error'
+ elif 'Octave returned:' in err:
+ err = err[err.index('Octave returned:'):]
+ err = err[len('Octave returned:'):].lstrip()
+ elif 'Syntax Error' in err:
+ err = 'Syntax Error'
+ stream_content = {'name': 'stdout', 'data': err.strip()}
+ self.send_response(self.iopub_socket, 'stream', stream_content)
+ return {'status': 'error', 'execution_count': self.execution_count,
+ 'ename': '', 'evalue': err, 'traceback': []}
+
if __name__ == '__main__':
from IPython.kernel.zmq.kernelapp import IPKernelApp
IPKernelApp.launch_instance(kernel_class=OctaveKernel)