タイトルの作業を行っていきます。
irbはRubyのREPLです。
先に出来上がったものを見せると
https://github.com/PyDataOsaka/irb_kernel
になります。
ここに至るまでに下記を行いました。
poetryでパッケージソースの雛形を作成
pip install poetry
poetry new irb_kernel
cd irb_kernel
poetry add pexpect
poetry add notebook
irb_kernel下にコードを追加
@antimon2 さんの Jupyter の Egison 簡易カーネルを自作してみた。
と
https://github.com/takluyver/bash_kernel
を真似ました。
https://github.com/PyDataOsaka/irb_kernel/blob/master/irb_kernel/install.py
は
kernel.json
をインストールするコマンド用の雛形的コードで
https://github.com/takluyver/bash_kernel/blob/master/bash_kernel/install.py
の
kernel_json = {"argv":[sys.executable,"-m","bash_kernel", "-f", "{connection_file}"],
"display_name":"Bash",
"language":"bash",
"codemirror_mode":"shell",
"env":{"PS1": "$"}
}
を
kernel_json = {"argv": [sys.executable,"-m","irb_kernel", "-f", "{connection_file}"],
"display_name": "Irb",
"language":"ruby",
"codemirror_mode": "ruby"
}
に置き換えただけです。
(kernel.json
がインストールされるとJupyter NotebookのNewドロップダウンリストにdisplay_name
のvalueであるIrb
が追加されます。)
次にkernelが行うことを記述するkernel.pyを追加します。
kernel.pyに関してはbash_kernelのkernel.pyより @antimon2 さんの Jupyter の Egison 簡易カーネルを自作してみた。
の egison-kernel.py を真似ています。
egison-kernel.pyの肝の箇所は
self.egisonwrapper = replwrap.REPLWrapper("egison --prompt " + prompt,
unicode(prompt), None)
です。
irb_kernelのkernel.pyでは上記を
self.irbwrapper = replwrap.REPLWrapper("irb --simple-prompt", ">> ", None)
に変えています。
https://github.com/PyDataOsaka/irb_kernel/blob/master/irb_kernel/__init__.py
と
https://github.com/PyDataOsaka/irb_kernel/blob/master/irb_kernel/__main__.py
は
egison-kernel.py同様のkernel.py から bash_kernel同様に __init__.py
と __main__.py
を分離しただけのものです。
これでコードの追加は完了です。
パッケージのビルドとPyPI での公開
# irb_kernel ディレクトリで実行します。
poetry build
poetry publish
これだけで完了です。
https://pypi.org/project/irb-kernel/
PyPIからのパッケージのインストールとkernel.jsonのインストール,そしてJupyterの起動
sudo apt install ruby
pip install irb_kernel
# 下記コマンドはパッケージソースのディレクトリのひとつ上では実行しない方がいいです。
python -m irb_kernel.install
jupyter notebook
以上ですべての作業が終わりました。
インストールすることなくirb_kernelの動作を試されたい場合は
https://mybinder.org/v2/gh/PyDataOsaka/irb_kernel/master
をクリックしてください。
最後に
画像やテーブルのインライン表示はまだできないと思います。
もし興味のある方はぜひ開発を進めてください。