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

blueprintpyの件もあるので、あまり風呂敷を広げすぎない方がいいような気がする

  • プロジェクト関連ファイル展開 (__init__.pyとか、setup.cfgとか)
    • テンプレートエンジンの適用 (setup.cfgにプロジェクト名とかプロジェクト詳細とか挿入したい)
  • ディレクトリ構成の変更 (srctestsディレクトリの作成)
  • 展開前後のカスタムシェルスクリプト実行機能 (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立ててどうこうって形になるのかなと

お疲れ様でした.