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)

template.jsonとかそこに置くファイルとか…

構成ファイルに必要なのは

  • ユーザに入力を要求する引数群とそれぞれのコンフィグ
  • 展開元と展開先をまとめたファイルマップ
  • 各段階で実行されるカスタムシェルスクリプトのパス

かな?

イメージこんなかんじ #1に投げたのは若干キモかったので修正

{
   "name": "pip_init_basic",

   "args": [
       {
           "name": "project_name",
           "description": "The name of project"
       }
   ],

   "destinations": [
       {
           "src": "setup.cfg",
           "dest": "./setup.cfg"
       },
       {
           "src": "setup.py",
           "dest": "./setup.py"
       },
       {
           "src": "__init__.py",
           "dest": "./{project_name}/__init__.py"
       }
   ],

   "scripts":{
       "before_ask": "パラメータ入力待機前に呼ばれる.sh",
       "before_extract": "テンプレートファイル展開・配置前に呼ばれる.sh",
       "after_extract": "テンプレートファイル展開・配置後に呼ばれる.sh"
   }
}

before_extractの中で、受け取ったargsを元にディレクトリを生成したりってことができそう.

まあdestinationsのパスでディレクトリ自動生成してもいいしその方が楽なので多分やりませんが…

ちょっと思ったのは、venvを使用しますか? Y/N みたいな条件分岐があってもいいよなと
まあそうなるとargsの中でかなりちゃんとした順序制御が必要になるのであまりやりたくはないのですが…

んーでも条件分岐欲しいな
依存関係追加とか 追加する依存関係を入力してください. 空行を入力するとこの手順をスキップします みたいにできたら嬉しいし

まあ極端な話 テンプレート構成なんていらないんですよ (!?)

今回欲しいのはあくまで Pythonパッケージテンプレートの自動展開 であって blueprintpyのような 汎用テンプレート展開ではないので

これに時間かける方がアホらしいからね(早く本命のコード書かせろ

もちろんテンプレート展開先マップは欲しいのでその辺は残しますが、カスタムシェル実行は飛ばしてもいいかもしれない.
それやるくらいなら動的import使って処理任せるとかの方が楽そう(Python同士の方がデータのやり取りが楽)

こんなかんじだろうか

{
   "name": "pip_init_basic",

   "args": [
       {
           "name": "project_name",
           "description": "The name of project"
       }
   ],
   "args_handler": "src.arg_handler",

   "destinations": [
       {
           "src": "setup.cfg",
           "dest": "./setup.cfg"
       },
       {
           "src": "setup.py",
           "dest": "./setup.py"
       },
       {
           "src": "__init__.py",
           "dest": "./{project_name}/__init__.py"
       }
   ],

   "event_scripts":{
       "before_ask": "src.scripts.before_ask",
       "before_extract": "src.scripts.before_extract",
       "after_extract": "src.scripts.after_extract"
   }
}

ディレクトリ構成のイメージ

.
├── template.json
└── src
    ├── scripts.py # この中に各イベントの処理を担当する関数が記述されている
    └── arg_handler.py

scripts.pyの中に before_ask, before_extract, after_extractって関数が別で存在する.

args_handler はオプショナル. arg_handler.pyには ArgumentHandler(仮)を継承したクラスがいる ArgumentHandlerは継承されたとき自動でそっちに引数処理を任せるようになる

やりようにはsrc.も消せるかもしれない(sys.pathしだい?) 要検証

ハンドラをオプションで渡せるのはすごい面白いと思うなあ

引数タイプみたいな概念があってもいいかも? あとdestinationというよりcontentだなこれ

イベントスクリプトはちょっと保留 (args_handlerで十分)

{
    "name": "pip_init_basic",
    "args": [
        {
            "name": "project_name",
            "description": "The name of project"
        },
        {
            "name": "dependencies",
            "description": "Dependencies of project",
            "argtype": "array"
        },
        {
            "name": "mypy_python_version",
            "description": "Version of Python3 interpreter (for mypy)",
            "default_value": "3.9"
        }
    ],
    "args_handler": "src.arg_handler",
    "contents": [
        {
            "src": "setup.cfg",
            "dest": "./setup.cfg"
        },
        {
            "src": "setup.py",
            "dest": "./setup.py"
        },
        {
            "src": "__init__.py",
            "dest": "./{project_name}/__init__.py"
        }
    ]
}

こうなるとデフォルトハンドラの構成も考えないといけなくなってきますね

とりあえずこれを展開・保持しておける土台を作るか

ほいモデルクラス生成
ここにjsonローダがあればいいのか

とりあえずこのissueでやるべきことはやったと思います!
merged!