nikkie-ftnextの日記

イベントレポートや読書メモを発信

pyenv + venv の呼吸 弐の型 taskipy (ftnext/cookiecutter-taskipy はじめました🍪)

はじめました!

にっきーの「っきー」はCookiecutterの「っきー」1。nikkieです。

先日Cookiecutterの素振りをしました。

Cookiecutterテンプレートの作り方が分かったので、taskipy用のテンプレートを公開しました!!🎉

目次

taskipyとは

pyenv + venv の呼吸 弐の型2です!

taskipyはPythonを使った開発で使うツール類を簡単にまとめられるライブラリです。
pyproject.tomlに設定を書くとtask testという1つのコマンドだけで

  1. isortでimport順フォーマット
  2. Blackでフォーマット
  3. pytestでテストコード実行
  4. flake8で静的解析
  5. mypyで型チェック

のように一連のコマンドを流せます!
taskipyのおかげで、私の開発、捗ってます!

taskipyについて詳しくは以下をどうぞ

ftnext/cookiecutter-taskipy

今回公開したtaskipy用のCookiecutterテンプレート

なぜ作ったか

既存のプロジェクトに対してtaskipyを導入することが増えてきたのですが、毎回同じ設定をpyproject.tomlに書くのが大変だなと思い始めました。
ちょうどCookiecutterを知ったことで、taskipyを設定するpyproject.tomlをテンプレートにできるのではないかと思い至り、自分のために作り、GitHubで公開までしてみました。

使い方

まずはCookiecutterをインストールしてください(素振り記事参照)

今回の環境

  • Python 3.10.9
  • Cookiecutter 2.3.0

https://github.com/ftnext/cookiecutter-taskipy を指定します3

% cookiecutter https://github.com/ftnext/cookiecutter-taskipy --checkout 0.1.0
  [1/3] project_name (awesome_project): example_project
  [2/3] package_root_dir_name (src): mylib
  [3/3] line_length (79):

example_projectディレクトリができ、その中にpyproject.tomlができます。

[tool.taskipy.tasks]
pre_test = "task format"
test = "pytest -v"
post_test = "task check"
format = "task format_autoflake && task format_pyupgrade && task format_black && task format_isort"
format_autoflake = "autoflake --in-place --remove-all-unused-imports $(find mylib tests -name '*.py') setup.py"
format_pyupgrade = "pyupgrade $(find mylib tests -name '*.py') setup.py"
format_black = "black -l 79 mylib tests setup.py"
format_isort = "isort --profile black -l 79 mylib tests setup.py"
check = "task check_flake8 && task check_mypy"
check_flake8 = "flake8 mylib tests"
check_mypy = "mypy mylib tests"

あとは(必要な依存関係をインストールした上で)task testを叩きながらmylibパッケージの開発に注力するだけです。

既存のプロジェクトにpyproject.tomlを追加する場合は--overwrite-if-existsオプション4を使う想定です。
続く例では、カレントディレクトリにgit clone git@github.com:ftnext/sphinx-new-tab-link.gitしてあります5

% cookiecutter https://github.com/ftnext/cookiecutter-taskipy --checkout 0.1.0 --overwrite-if-exists
  [1/3] project_name (awesome_project): sphinx-new-tab-link
  [2/3] package_root_dir_name (src): sphinx_new_tab_link
  [3/3] line_length (79):

sphinx-new-tab-linkディレクトリの中にpyproject.tomlが生成されました!

これでtaskipyの導入、はかどるぞ〜〜!!

今後

今回公開したのはまだv0.1.0で、使う中で磨き込んでいく想定です。
taskipyでまとめるライブラリを増やすというよりは、cookiecutter側の設定を作り込んだり、pyproject.tomlにツールの設定を充実させたり6といった拡張を考えています。
自分のために作ったものを公開しているにすぎないので、自分にとって使いやすく整えていきます!

終わりに

taskipy向けのCookiecutterテンプレートを自分用に公開しました。
みんなのPython勉強会 LTでの鬼滅ネタオーダーから「呼吸 弐の型」と言ってきましたが、テンプレート()を作ったことで「pyenv + venv の呼吸 弐の型 taskipy」に近づいた感があります🙌


  1. 念頭に置いたのは「無一郎の無は」です
  2. LTをしました
  3. 今後使いながらテンプレートを育てていく予定ですので、--checkoutオプションにタグを指定するのがオススメです ref: https://github.com/cookiecutter/cookiecutter/blob/2.3.0/cookiecutter/cli.py#L81-L85
  4. ref: https://github.com/cookiecutter/cookiecutter/blob/2.3.0/cookiecutter/cli.py#L106-L111
  5. sphinx-new-tab-linkもみんな使ってくれたら、にっきーうれし〜
  6. すごいんだよ、pyproject.toml!ツール類も設定できちゃうのです