diff options
author | Steven Silvester | 2014-07-31 20:19:10 -0500 |
---|---|---|
committer | Steven Silvester | 2014-07-31 20:19:10 -0500 |
commit | 900c792d14530fb5c7ae3d8c6931dead5d8493f0 (patch) | |
tree | 944c0093986dc8b61783fe6c4ec86efac06576f2 | |
parent | a1ceb302e6c877a552bedd7022339c72f143db7e (diff) | |
download | scilab_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.py | 97 |
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) |