Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

xonsh拡張のxontribをつくる

- xontribとは -

xontribはxonshの拡張ライブラリ群である。
公開されているxontribを導入するには以下のようにライブラリをインストールしロードする。

pip install xontrib-hoge
xontrib load hoge

xontrib loadをxonshrcに記述しておくことで、xonshセッション起動時にロードすることもできる。

1年程前に公開されていた各xontribの紹介は以下記事に記載している。
vaaaaaanquish.hatenablog.com

 
xontribはpythonスクリプトもしくはxshスクリプトによって記載されたmoduleで、xontrib以下のnamespaceに配置される。tabcomplete拡張や外部Pythonライブラリのサポート、xonshモジュールのoverride等が作成、公開されており、その作成方法については以下チュートリアルに概要が書かれている。
xon.sh
本記事はこちらを参考にし、xontribを作成していくものである。


 

- cookiecutterによるtemplete利用 -

xontribのテンプレートとしてcookiecutterを利用する事ができる。

https://github.com/laerus/cookiecutter-xontribgithub.com


以下コマンドで対話的にライブラリの雛形が作成できる。

pip install cookiecutter
cookiecutter https://github.com/xonsh/xontrib-cookiecutter

対話の内容は以下のようになる

full_name [Your name]: vaaaaanquish
email [Your address email]: sample@exm.com
github_username [Your github username]: 6syun9
project_name [Name of the project]: xontrib-sample    # setup.pyに記載されるproject
project_slug [xontrib-samplelib]: sample              # xontrib loadするモジュール名
project_short_description [A short description of the project]: This is test
version [0.1.0]: 0.0.1

上記cookiecutterコマンドによってsampleディレクトリが作成される。

$ tree sample
.
├── LICENSE
├── README.rst
├── setup.py
└── xontrib
    └── sample.xsh

作成した後は、sample.xshを編集するだけである。
作成された時点ではsample.xshには内容がないため、以下のように変更する。

import xonsh

__all__ = ()
__version__ = '0.0.1'

print('hello xontrib sample')

xontribを読み込んだ時点でstringをoutputするサンプルとなる。
こちらを手元にinstallし、xontrib loadで読み込んでみる。
sampleディレクトリ内にあるsetup.pyを利用する。

$ python setup.py install
$ xontrib load sample
hello xontrib sample

ここから中身を拡充していくだけ。

 

- pypiで公開し使ってもらう -

pip installで導入できるようにpypiに登録する。
(アカウント作成が必要なので事前に行なう)
PyPI · The Python Package Index

twinを利用したアップロード

distを作成し公開するためのツールを導入する

pip install wheel twine

先程の作成したパッケージのroot dirのsetup.pyを利用してパッケージを作成、アップロードする。

python setup.py sdist bdist_wheel
twine upload --repository-url https://upload.pypi.org/legacy/ dist/*

数分後くらいにちゃんと登録されて pip install xontrib-sample できるようになる(この記事は解説なので実際にはやってない)。

pypiのREADMEや必要な外部ライブラリを定義する

最低限以下のようにしておくとなんとかなる。
https://github.com/6syun9/xontrib-readable-traceback/blob/master/setup.py

rstじゃなくてmdじゃないとgithubレンダリングしてくれない場合があるので、私はmdで管理している。

 

xonshのDocumentationに追加してもらう

公開されているxontribはxonshのドキュメント上に載せてもらう事ができる。
xon.sh

また xontrib list コマンドでも表示されるようになる。

こちらに載せてもらうには、本家xonshにpull requestsを送る必要がある。
例えば、以下のように「新しいxontrib作ったよ!」と xonsh/xontribs.json を編集した旨を伝えるpull requestsを作成する。
github.com

xonshにコントリビュートする時は news/TEMPLETE.rst をコピーして news/{{ブランチ名}}.rst なるファイルを作って、更新ログを書くルールになっているのでそちらも追加して終了。詳しくは以下Developer’s Guideを参照。

Developer’s Guide — xonsh 0.9.24 documentation


 

- xontrib作成において参考にできる所 -

「こういうの作ってみたいなあ…」と思った時に参考にできるよう私のメモとして記載しておく。

あるタイミングでコマンドを発火させたい

tab補完を拡張したい

promptの見た目を弄りたい

コマンドの保存、読み込み、引数実装

コマンドの出力結果を使いたい

xonsh自体の機能をoverrideしたい

別threadの実装

画像やgraphを表示したい

サブウインドウやalertを表示したい

ネタがない


 

- おわりに -

このメモとGoogleが使えればxontribが作れると思うので、みなさんもxontributerになりましょう。