Open3

[WIP] pipx を使って、diagramsのclassを自由に持ち歩きたい

TakashiAiharaTakashiAihara

布教

diagramsの布教です。
これ、直感的にアーキテクチャ書けます。

PlantUMLとかMermaidももちろん便利。
なんですけど「アーキテクチャ図を書く」ことに関しては、クラス図とかフローチャートを間借りして何とかやってる感がすごい。
その点、diagramsはそれに特化している。

またdiagramsで強いのは、思いっきりPython言語なのでclassが使えること。
例えば「コンテナは六角形で表現したい」って理想が出てきたときに、

class Container(Node):
    def __init__(self, *args, **kwargs):
        kwargs["shape"] = "octagon"
        super().__init__(*args, **kwargs)

こうしとけば 統一できる。すっきり。

TakashiAiharaTakashiAihara

diagramsのハードル

monorepoが脚光を浴びてきた昨今、アーキテクチャ図は1リポジトリごとに書くことが多い or 多くなっていくと思います。

diagramsで図を出力するには Pythonの実行環境が必要で、もし自分用のclassを複数作ったとしたら、それを持ちこむ必要がある。

TypeScriptベースのリポジトリを例に、構成パターンをいくつか見ていきます。

パターン「ガッツリ持ち込む」

▼ リポジトリ

- package.json
- tsconfig.json
- pnpm-workspace.yaml
- .eslintrc
- packages
  - nextjs
    - src
      - components
      - Table.tsx
      - pages
        - index.tsx
        - 404.tsx
  - db
  - config
- README.md
- doc
  - pyproject.toml
  - poetry.lock
  - architecture.py
  - architecture.svg
  - util.py
  - tox.ini
  • Pythonのプロジェクトじゃないのに、Pythonの設定ファイル + Utilクラスとかが幅を利かせてる。。。
  • 本当に見せたいものはどれ?
  • python側の設定をいじるだけで pull/mergeしないといけないとか。。。

パターン「リポジトリ分割」

▼ メインリポジトリ

- package.json
- tsconfig.json
- pnpm-workspace.yaml
- .eslintrc
- packages
  - nextjs
    - src
      - components
      - Table.tsx
      - pages
        - index.tsx
        - 404.tsx
  - db
  - config

▼ docリポジトリ

- README.md
- pyproject.toml
- poetry.lock
- architecture.py
- architecture.svg
- util.py
- tox.ini
  • 実行環境の分け方としては理想的。
  • ただしメインリポジトリの修正と同期的にdocに何かをする、ということに関して工夫が必要。
  • docに光があたらず置いてけぼりを食らう可能性が高い。
  • issueも分かれるので、プロジェクトを通したり、メンションとかでいい感じにしないといけない。
  • utilの更新があった場合、それに追従する必要がある。

パターン「理想」

▼ メインリポジトリ

- package.json
- tsconfig.json
- pnpm-workspace.yaml
- .eslintrc
- packages
  - nextjs
    - src
      - components
      - Table.tsx
      - pages
        - index.tsx
        - 404.tsx
  - db
  - config
- README.md
- doc
  - architecture.py -> (common-diagrams 利用)
  - architecture.svg

▼ common-diagramsリポジトリ

- pyproject.toml
- poetry.lock
- util.py
- tox.ini
  • メインリポジトリの浸食は最低限。
  • 全社でアーキテクチャの書き方を統一する~とかも出来る(変更も容易)
TakashiAiharaTakashiAihara

動機

前述の「理想」パターンを実現するためには、Node.js 環境における "npx" コマンドを Python環境で実現する必要があるんです。