テンプレートファイルの扱い
Enchan1207 opened this issue · comments
pipって1パッケージ内に複数のパッケージ入れられるんでしたっけ?(日本語
[options]
package_dir=
=src
packages=find:
ここに複数記述…というかsrc
直下に複数のディレクトリを置くとどうなるんだろう?
実 際 に や っ て み た
.
├── src
│ ├── __init__.py
│ ├── pip_init
│ │ ├── __init__.py
│ └── pip_init_submodule
│ └── __init__.py
こうすると、インストール時はこうなって
# pip install .
Processing /Users/enchantcode/Desktop/LunaCF/SourceCode/Python/Test/pip_init
Preparing metadata (setup.py) ... done
Building wheels for collected packages: pip-init
Building wheel for pip-init (setup.py) ... done
Created wheel for pip-init: filename=pip_init-0.1.0-py3-none-any.whl size=6190 sha256=345d21b55f06a79d0d1afcd3caf5686b1eb0eef080e15e552eed0a1dc2799949
Stored in directory: /private/var/folders/sp/pbkwmd7975734zgxfrgj9cvw0000gn/T/pip-ephem-wheel-cache-4df6eoym/wheels/22/c4/64/f696a733a94c94fc3d1f5505d8632a1b03d660c9956842d7d3
Successfully built pip-init
Installing collected packages: pip-init
Successfully installed pip-init-0.1.0
アンインストール時はこうなる
# pip uninstall pip-init
Found existing installation: pip-init 0.1.0
Uninstalling pip-init-0.1.0:
Would remove:
/usr/local/lib/python3.9/site-packages/pip_init-0.1.0.dist-info/*
/usr/local/lib/python3.9/site-packages/pip_init/*
/usr/local/lib/python3.9/site-packages/pip_init_submodule/*
Proceed (Y/n)? Y
Successfully uninstalled pip-init-0.1.0
つまり、パッケージ名は setup.cfg
のname
を引き継ぎつつ、インストール時も一つのパッケージとして読み込まれるが、
内部的には別ディレクトリとして存在している
…ということらしい
REPLで実行すると
>>> import pip_init
>>> import pip_init_submodule
>>> pip_init
<module 'pip_init' from '/usr/local/lib/python3.9/site-packages/pip_init/__init__.py'>
>>> pip_init_submodule
<module 'pip_init_submodule' from '/usr/local/lib/python3.9/site-packages/pip_init_submodule/__init__.py'>
こうなる
これを応用して、pip_init本体とテンプレートを別で管理するということができないだろうか?
現状 src.pip_init.args_handler.default.DefaultArgsHandler
でデフォルトハンドラを組んでるわけだけど
これをそのままsrc.templates.default.args_handler.DefaultArgsHandler
みたいにすれば
src.templates
配下がそのままpythonモジュールとして読み込み可能なテンプレートになるじゃないですか
んで、そうしておけば インストール場所に関係なく pip_init_templates.(テンプレート名).(引数ハンドラモジュール)
でハンドラを呼び出せる気がしませんか
まあこれでやるとカスタムテンプレートがひっじょーにやりにくくなる(site_packages
内をいじらないといけなくなる)のでもう少し拡張性考えた方がいいと思いますが(~/.pip_init_templates
をsys.path
にappendするとかね)…
ただ個人的に、デフォルトで使うテンプレートの種類も数あっていいと思う(venv前提かそうでないかとか、setup.cfgなのかrequirements.txtなのかとか)ので、現状はこの テンプレートそのものをpythonモジュールとしてロードする って方向でいいと思います
とりあえず複数モジュール立ててArgsHandler読み込めるようにしてテンプレートのベース作ってみよっか
ちょっとインポート文を修正
そうかテストケースだめじゃんこれ
デフォルトテンプレートがないから…
テスト用にハンドラのモックアップを作るか
ちょっと待って? インポートのテストケースどうすりゃええん
というかあれか?これ 与えられたテンプレート名からpip_init_templates.{テンプレート名}.{引数ハンドラモジュール名}
をインポートするのが一番早いな?
そうなるとデフォルトハンドラはやはり pip_init
が持っていて欲しいな
ハンドラを元の位置に戻して、デフォルトテンプレートに template.json
を追加
あとはカスタムテンプレートの扱いをどうするか…
~/.pip_init_templates
でもいいけど業界的に$HOME直下ドットファイル嫌われがちじゃないですか
pip_init_templates
をモジュール名じゃなくて単純なディレクトリ名として扱うことも考えたけど多分仕様的にやらない方がいいよね(複数のsys.path
に同じ名前の子ディレクトリがいることになる)…
記載がなければ常にデフォルト引数ハンドラを参照するようにして、それ以外を使いたいなら(たとえpip_init_templates
の中のライブラリであっても)args_handler強制!っていうふうにしちゃうか
えーーっとそうなるとどうすればいいんだ とりあえず ~/.pip_init_templates
をpip_initの作業ディレクトリにして、~/.pip_init_templates/custom_template_paths.txt
にカスタムテンプレートの検索パスを記述できるようにして、
そのファイルの中身と~/.pip_init_templates/templates/
をsys.path
に追加すればいいのか
でもこれConfigLoader
の仕事じゃないな(CLIで呼び出さないんだとすれば尚更)…
整理してたらどう考えてもいらないテストケースが見つかったので削除.
安定のコミットメッセージミス
デフォルトテンプレートもできたし、各テンプレートの扱いも整理できたので閉じます(これ以降はCLIの設計に入ってくるので)