diagramsとは
pythonでアーキテクチャ図が書けてしまうソフトウェアです。
数日前に目について、以下のようなことをやりたいと思ったのが作った動機でした。
<img src='http://localhost:8080/?
with Diagram("Grouped Workers", show=False, direction="TB"):
ELB("lb") >> [EC2("worker1"),
EC2("worker2"),
EC2("worker3"),
EC2("worker4"),
EC2("worker5")] >> RDS("events")
とりあえず、えいやっと作ってみる
10時間程度格闘して作成してみました。
ソースコード一式は、以下のリポジトリです。
Pythonのコードをコンパイルする
まずはなんと言っても問題になるのはURLで渡されてくるPythonのソースコードをどうやってコンパイルするか?です。query_stringから取得するのはよしとしても、整形してからコンパイルしないとダメです。
ライブラリとしてはyapfを利用させていただきました。
【課題】そもそもquery_stringには改行コードがない
examplesに掲載されている通りにimport文も含めて、記載してもらう予定でした。
しかし、query_stringには```... import EC2from ...`````のようにくっついており整形しても分離は(当たり前ですが)できませんでした。
ASTを使って引数を変更する
こちらは、想定通りの動きが実装できました。NodeTransformerを使用し書き換えてコンパイルしてexecで実行です。
途中linenoとかがないとかエラーが出たのですがast.fix_missing_location
で無事に解決しました。(したと思っている・・・)
アイコンのリクエストを無理やり・・・
svgで出力するとアイコンのリクエストが別途発生します。
Flaskのrouteで無理やり処理しました。(docker内で実行しているから許されるはず!?)
その他の課題
頑張って作ってみたものの色々と問題があるなーって思っています。
- 受け取ったPythonのコードをそのまま実行するので、インターネットに公開したらダメです。docker内で実行しているから限定的に大丈夫なのか、どうか判断つきませんでした。(何かしら叩けばセキュリティホールがあるはず)
- 上に書いてあるサンプル以外で試したところ、Syntax Errorになってしまいました。詳細は調べていません。
- URLのところに/pngとか指定すると、そのファイル形式で作成されますが、文字化けしてしまいます・・・。(dockerで実行時。開発時のpython server.pyで実行する分には問題なし)
- 出力された画像ファイルが/workフォルダ内に溜まります。削除は行っていません。
本来であればissueで書くべきですね・・・。
なぜかタイムトライアル的な気分で突っ走ってリリースしてみました。
この後は腰を据えて対応していきたいと思います。