要件整理
Enchan1207 opened this issue · comments
blueprintpyの件もあるので、あまり風呂敷を広げすぎない方がいいような気がする
- プロジェクト関連ファイル展開 (
__init__.py
とか、setup.cfg
とか)- テンプレートエンジンの適用 (setup.cfgにプロジェクト名とかプロジェクト詳細とか挿入したい)
- ディレクトリ構成の変更 (
src
、tests
ディレクトリの作成) - 展開前後のカスタムシェルスクリプト実行機能 (systemdのexecStartみたいなイメージ)
…くらいまであれば、とりあえずpythonテンプレートとしては十分だと思う
blueprintpyでできなかったのは、「対話型インタフェースで得た情報をもとにディレクトリを生成する」処理.
単純なテンプレート展開+ファイルコピーではやはり対応しきれない部分がある.
テンプレートのディレクトリ構成と展開先のディレクトリ構成を一致させる必要はないんじゃないかとも思っている
例えば、template.json
みたいな構成ファイルを用意してあげて
{
"name": "pip_init_basic",
"exec_before_ask": "/path/to/shell/before/ask/args.sh",
"args": [
{
"name": "project_name",
"description": "The name of project"
}
],
"exec_before_extract": "/path/to/shell/before/extract/template.sh",
"destinations": [
{
"src": "setup.cfg",
"dest": "./setup.cfg"
},
{
"src": "setup.py",
"dest": "./setup.py"
},
{
"src": "__init__.py",
"dest": "./{project_name}/__init__.py"
}
],
"exec_after_extract": "/path/to/shell/after/extract/template.sh"
}
みたいにすれば、極端な話テンプレート直下はフラットでも問題ないはず(Jinjaテンプレートのincludeとか考えるとやめた方がいいかもしれないが)
dest
はf文字列が使えて、各シェルにはargs
の値が環境変数として渡ってるイメージ
f文字列の展開はstring.format
が **kwargs
を取るので、それでやればいいと思います
>>> "Hello, {place}!".format(**{'place': "World"})
'Hello, World!'
あとはpipのpackage_dataがかなり使いにくいのを身にしみて感じたので、その辺をどう改善するかを考えたい.
PyPIに置ければ置いてみたいので…
どーーこから手つけようかなこれ
とりあえず
template.json
をパースするクラス (TemplateConfig
?)- 各テンプレート引数をハンドルするクラス (
TemplateArgument
?) - インタラクティブシェルを扱うクラス (
Console.ask()
?) - destinationsをパースして適宜テンプレートに通して保持するクラス (
ExtractedFile
?)
が必要で、最後にそれらをまとめて処理するCLIがあればいいんだな
template.json
の実装ができたので、ちょっとロードマップを修正
- ✅ template.jsonをパースするクラス ->
Config
およびConfigLoader
で実装 - ✅ 各テンプレート引数をハンドルするクラス -> インタフェースのみ
ArgsHandlerBase
で実装 インタラクティブシェルを扱うクラス (Console.ask()?)引数ハンドラ内での処理で済ませたいcontents
の内容を展開先に(必要ならjinjaを通して)配置するクラス
こんな感じか
Content
の展開元とか、args_handler
のインポート元とか
テンプレートのルートを保持して読み出せるような仕組みが必要ですね
つまりテンプレートそのものの扱いをどうするか
なんとなく整理
- パッケージの更新に追従する デフォルトテンプレート は、pip_initインストール時に追加されるパッケージ
pip_init_templates
が管理 - それ以外の ユーザ定義テンプレート は
~/.pip_init/
を作業ディレクトリとし、そこに直接テンプレートを置いたり追加の検索パスを記述したりできるように args_handler
はデフォルトテンプレートであっても強制DefaultArgsHandler
を使わないなら場所に関わらずargs_handler
の指定が必要
…的な方向で進めたいと思います
次は contents
の内容を展開先に(必要ならjinjaを通して)配置するクラス の設計
これで、とりあえず
- テンプレートの構成を管理して (
template.json
,Config
,Argument
,Content
) - その構成をjson形式で読み書きして (
ConfigLoader
,ConfigSerializer
) - テンプレートエンジンを通したり、展開先パスの変数を展開したりして (
ContentBuilder
,PreparedContent
) - 準備ができたファイルを展開する (
ContentExtractor
)
処理が完成したわけですね
あとは、ユーザの操作に従って
- テンプレートが格納されているディレクトリを特定して
- 展開先を取得して
- 変数に値を(バリデーションしつつ)挿入する
CLIを書けば、一通り完成したといえるんじゃないだろうか?
(ちょっとディレクトリ構成とかシリアライズ周りの処理とかパスの指定方法とかいじりたいけどね…)
CLIのフレームはできた あとは引数ハンドラの具象実装!
大体形にはなったんじゃないかなと!
あとは諸々のガバをなんとかすればver 1.0.0としては十分だと思います
一旦publicにしてドキュメント整えますか
ドキュメントの基盤は完成 rstなれるまでちょっと大変かも
pypiから落とせるようにできるかな
リポジトリ名変更したので追従しましょう
とりあえずプロジェクトとしてなんとか動く段階にはきたので、以降は適宜issue立ててどうこうって形になるのかなと
お疲れ様でした.