Enchan1207 / blueprintpy

汎用パッケージコンフィグCLIジェネレータ

Home Page:https://enchan1207.github.io/blueprintpy/index.html

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

テンプレートファイルの扱い

Enchan1207 opened this issue · comments

(from #1)

概念は #2, #4 で実装できたけど、実際のテンプレートファイルとか引数ハンドラのインポート先とかをどう扱うかを考えたい.

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.cfgnameを引き継ぎつつ、インストール時も一つのパッケージとして読み込まれるが、
内部的には別ディレクトリとして存在している

…ということらしい

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_templatessys.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の設計に入ってくるので)