PKuPyIPr5;;octave_kernel/__init__.py"""An Octave kernel for Jupyter""" __version__ = '0.17.1' PK~0HjToctave_kernel/__main__.pytry: from ipykernel.kernelapp import IPKernelApp except ImportError: from IPython.kernel.zmq.kernelapp import IPKernelApp from .kernel import OctaveKernel IPKernelApp.launch_instance(kernel_class=OctaveKernel) PKcnHp:ggoctave_kernel/install.pyimport json import os import sys try: from jupyter_client.kernelspec import install_kernel_spec except ImportError: from IPython.kernel.kernelspec import install_kernel_spec from IPython.utils.tempdir import TemporaryDirectory kernel_json = { "argv": [sys.executable, "-m", "octave_kernel", "-f", "{connection_file}"], "display_name": "Octave", "mimetype": "text/x-octave", "language": "octave", "name": "octave", } def install_my_kernel_spec(user=True): user = '--user' in sys.argv or not _is_root() with TemporaryDirectory() as td: os.chmod(td, 0o755) # Starts off as 700, not user readable with open(os.path.join(td, 'kernel.json'), 'w') as f: json.dump(kernel_json, f, sort_keys=True) kernel_name = kernel_json['name'] try: install_kernel_spec(td, kernel_name, user=user, replace=True) except: install_kernel_spec(td, kernel_name, user=not user, replace=True) def _is_root(): try: return os.geteuid() == 0 except AttributeError: return False # assume not an admin on non-Unix platforms def main(argv=[]): user = '--user' in argv or not _is_root() install_my_kernel_spec(user=user) if __name__ == '__main__': main(argv=sys.argv) PKLyI1o o octave_kernel/kernel.pyfrom __future__ import print_function from metakernel import MetaKernel, ProcessMetaKernel, REPLWrapper, u from metakernel.pexpect import which from IPython.display import Image, SVG import subprocess from xml.dom import minidom import os import shutil import sys import tempfile from . import __version__ class OctaveKernel(ProcessMetaKernel): implementation = 'Octave Kernel' implementation_version = __version__, language = 'octave' language_version = __version__, banner = "Octave Kernel", language_info = { 'mimetype': 'text/x-octave', 'name': 'octave', 'file_extension': '.m', "version": __version__, 'help_links': MetaKernel.help_links, } _setup = """ more off; """ _first = True _banner = None _executable = None @property def executable(self): if self._executable: return self._executable executable = os.environ.get('OCTAVE_EXECUTABLE', None) if not executable or not which(executable): if which('octave-cli'): self._executable = 'octave-cli' return self._executable elif which('octave'): self._executable = 'octave' return self._executable else: msg = ('Octave Executable not found, please add to path or set' '"OCTAVE_EXECUTABLE" environment variable') raise OSError(msg) else: self._executable = executable return executable @property def banner(self): if self._banner is None: banner = subprocess.check_output([self.executable, '--version']) self._banner = banner.decode('utf-8') return self._banner def makeWrapper(self): """Start an Octave process and return a :class:`REPLWrapper` object. """ if os.name == 'nt': orig_prompt = u(chr(3)) prompt_cmd = u('disp(char(3))') change_prompt = None else: orig_prompt = u('octave.*>') prompt_cmd = None change_prompt = u("PS1('{0}'); PS2('{1}')") self._first = True executable = self.executable if 'version 4' in self.banner: executable += ' --no-gui' wrapper = REPLWrapper(executable, orig_prompt, change_prompt, prompt_emit_cmd=prompt_cmd) wrapper.child.linesep = '\n' return wrapper def do_execute_direct(self, code): if self._first: self._first = False self.handle_plot_settings() super(OctaveKernel, self).do_execute_direct(self._setup) if os.name != 'nt': msg = ('may not be able to display plots properly ' 'without gnuplot, please install it ' '(gnuplot-x11 on Linux)') try: subprocess.check_call(['gnuplot', '--version']) except subprocess.CalledProcessError: self.Error(msg) super(OctaveKernel, self).do_execute_direct(code, self.Print) if self.plot_settings.get('backend', None) == 'inline': plot_dir = tempfile.mkdtemp() self._make_figs(plot_dir) for fname in os.listdir(plot_dir): filename = os.path.join(plot_dir, fname) try: if fname.lower().endswith('.svg'): im = self._handle_svg(filename) else: im = Image(filename) self.Display(im) except Exception as e: import traceback traceback.print_exc(file=sys.__stderr__) self.Error(e) shutil.rmtree(plot_dir, True) def get_kernel_help_on(self, info, level=0, none_on_fail=False): obj = info.get('help_obj', '') if not obj or len(obj.split()) > 1: if none_on_fail: return None else: return "" resp = super(OctaveKernel, self).do_execute_direct('help %s' % obj) return str(resp) def get_completions(self, info): """ Get completions from kernel based on info dict. """ cmd = 'completion_matches("%s")' % info['obj'] resp = super(OctaveKernel, self).do_execute_direct(cmd) return str(resp).splitlines() def handle_plot_settings(self): """Handle the current plot settings""" settings = self.plot_settings if settings.get('format', None) is None: settings.clear() settings.setdefault('backend', 'inline') if sys.platform == 'darwin': settings.setdefault('format', 'svg') else: settings.setdefault('format', 'png') settings.setdefault('format', 'png') settings.setdefault('size', '560,420') settings.setdefault('resolution', 150.) cmds = [] self._plot_fmt = settings['format'] if settings['backend'] == 'inline': cmds.append("set(0, 'defaultfigurevisible', 'off');") cmds.append("graphics_toolkit('gnuplot');") else: cmds.append("set(0, 'defaultfigurevisible', 'on');") cmds.append("graphics_toolkit('%s');" % settings['backend']) width, height = 560, 420 if isinstance(settings['size'], tuple): width, height = settings['size'] elif settings['size']: try: width, height = settings['size'].split(',') width, height = int(width), int(height) settings['size'] = width, height except Exception as e: self.Error('Error setting plot settings: %s' % e) size = "set(0, 'defaultfigureposition', [0 0 %s %s]);" cmds.append(size % (width, height)) self.do_execute_direct('\n'.join(cmds)) def _make_figs(self, plot_dir): fmt = self.plot_settings['format'] res = self.plot_settings['resolution'] cmd = """ _figHandles = get(0, 'children'); for _fig=1:length(_figHandles), _handle = _figHandles(_fig); _filename = fullfile('%(plot_dir)s', ['OctaveFig', sprintf('%%03d.%(fmt)s', _fig)]); try, _image = double(get(get(get(_handle,'children'),'children'),'cdata')); _clim = get(get(_handle,'children'),'clim'); _image = _image - _clim(1); _image = _image ./ (_clim(2) - _clim(1)); imwrite(uint8(_image*255), _filename); catch, print(_handle, _filename, '-r%(res)s'); end, close(_handle); end; """ % locals() super(OctaveKernel, self).do_execute_direct(cmd.replace('\n', '')) def _handle_svg(self, filename): """ Handle special considerations for SVG images. """ # Gnuplot can create invalid characters in SVG files. with open(filename, 'r', errors='replace') as fid: data = fid.read() im = SVG(data=data) try: im.data = self._fix_svg_size(im.data) except Exception: pass return im def _fix_svg_size(self, data): # GnuPlot SVGs do not have height/width attributes. Set # these to be the same as the viewBox, so that the browser # scales the image correctly. # Get the desired size. size = self.plot_settings['size'] if not (isinstance(size, tuple)): size = 560, 420 width, height = size # Minidom does not support parseUnicode, so it must be decoded # to accept unicode characters parsed = minidom.parseString(data.encode('utf-8')) (svg,) = parsed.getElementsByTagName('svg') if size is not None and size[0] is not None: width, height = size else: viewbox = svg.getAttribute('viewBox').split(' ') width, height = viewbox[2:] svg.setAttribute('width', '%dpx' % int(width)) svg.setAttribute('height', '%dpx' % int(height)) return svg.toxml() PK!H|&Ub$octave_kernel-0.17.1.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,Q034 /, (-JLR()*M ILR(4KM̫#DPK!H]!'octave_kernel-0.17.1.dist-info/METADATA_o0)@Z:""ƶv݀Io3l'%ߞT}H|5z垏:Uy hJ(xEcʒ&EN ;mKe}% ɮ޸$s*2]:>\Jd͸_lRBkTFܻK.d-Gn(iΉ@2dp{m!I!u &X]6-χs-ካ}NS@FdaxIqa>(c_\8@I8{ /O?cSD4Vp`{ ʹj}8+Dՙ ƨb=% <2*|)O7cj;F_rU=m}DЃ&IagVFa-gal@+#(Lo2t!n-۩ P@G}P;18x;Vz4qPՁϴrZ"F=ni:FOI&җhd#Ω?}!y!U!Zn`q4i )j%5  2Įi0`{ Yi,l=>ޮ&gW Պ%Ps+̨J@=xCwӿ5q*u<\>2J PK!HۘuX%%octave_kernel-0.17.1.dist-info/RECORDAO0~ LZ(v *(Vyitn~&Dwݞ|yBeˣ(7qcndAd%Mfa4KP3:aIcMگ)jh6i&wt}/!ћ̵Ǥ1#z*;~yFE kӟy=rGXZ0y~/o3Xlm:{?Ǯjh0el@6+O7v [.Eޤ!O?,6˄^iPHYk1 f,6єĎΏ.b3$m:x&1،aMɁKFKO&PKuPyIPr5;;octave_kernel/__init__.pyPK~0HjTroctave_kernel/__main__.pyPKcnHp:ggoctave_kernel/install.pyPKLyI1o o  octave_kernel/kernel.pyPK!H|&Ub$'octave_kernel-0.17.1.dist-info/WHEELPK!H]!'[(octave_kernel-0.17.1.dist-info/METADATAPK!HۘuX%%L+octave_kernel-0.17.1.dist-info/RECORDPK,