filevisualization


Namefilevisualization JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryVisualize structure of XML/JSON/YAML/TOML as trees or mind maps
upload_time2025-08-30 16:00:30
maintainerNone
docs_urlNone
authorhayashikunita
requires_python>=3.10
licenseMIT
keywords visualization xml json yaml toml tree mindmap
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # filevisualization

![CI](https://github.com/hayashikunita/filevisualization/actions/workflows/ci.yml/badge.svg)
![PyPI](https://img.shields.io/pypi/v/filevisualization.svg)

構造化ファイル(JSON / YAML / TOML / XML)を以下の方法で可視化するPythonライブラリです。
ビッグデータを扱う際、ワンコマンドで可視化します。

- ターミナル上のリッチな樹形図(Rich)
- Graphviz によるマインドマップ風グラフ(SVG/PNG などに保存)
- Plotly(インタラクティブHTML)
- pyvis(インタラクティブHTML)

CLI と Python API の両方で利用できます。

主な特徴
- 拡張子から自動判別(JSON / YAML / TOML / XML)
- 複数レンダラー(tree / graphviz / plotly / pyvis)
- レイアウト切替(hierarchical / radial / force)やエンジン指定(dot/twopi/sfdp/circo など)
- テーマ(pastel[既定], light, dark, kawaii, chic, modern, business, caution)と型に基づくアイコン・形状
- フィルタリング・制限(max-depth / include-keys / exclude-keys / prune-arrays / max-nodes / max-edges)
- 大規模JSON向けストリーミング読み込み(--stream-json)
- グラフエクスポート(DOT / JSON-Graph / GraphML / CSV-edges)
- 診断コマンドで環境チェック(--diagnose)
- 単体テスト・型ヒント・CI(OS×Py×Graphviz 有無 マトリクス)、pre-commit、Bandit、ライセンスチェック

対応Python: 3.10–3.12(CIで検証済み)

---

## インストール

PyPI(推奨)
```
pip install filevisualization
```

最小構成(Rich + 主要パーサ)
```
pip install .
```

オプション(インタラクティブ表示用)
```
# Plotly を使う場合
pip install .[plotly]

# pyvis を使う場合
pip install .[pyvis]

# すべて(Plotly + pyvis + pygraphviz: pygraphviz は Python>=3.10 の環境で有効)
pip install .[all]
```

Graphviz(システム本体)のインストール(Graphviz出力をファイル保存する場合に必要)
- ダウンロード: https://graphviz.org/download/
- Windows はインストーラー実行後、`dot.exe` のパスが PATH に通っていることを確認してください。
	- PowerShell で確認: `dot -V`(バージョン表示されればOK)

---

## 使い方(CLI)

基本
```
fileviz <path> --format tree|graphviz|mindmap|plotly|pyvis \
	[--output <path>] [--layout <name>] [--engine <name>] [--theme <name>] \
	[--max-depth N] [--include-keys k1,k2] [--exclude-keys k1,k2] [--prune-arrays N] \
	[--max-nodes N] [--max-edges N] [--stream-json] \
	[--export-dot PATH] [--export-json-graph PATH] [--export-graphml PATH] [--export-csv-edges PATH] \
	[--diagnose]
```

例
```
# 樹形図(ターミナル表示)
fileviz example.json --format tree

# Graphviz をSVGで保存(階層: TB)
fileviz example.yaml --format graphviz --layout hierarchical --output out_tb.svg

# Graphviz(階層: LR)
fileviz example.yaml --format graphviz --layout lr --output out_lr.svg

# Graphviz(放射: twopi)
fileviz example.toml --format graphviz --layout radial --output radial.svg

# Graphviz(力学: sfdp)
fileviz example.xml --format graphviz --layout force --output force.svg

# Graphviz(エンジンを直接指定: circo)
fileviz example.json --format graphviz --engine circo --output circo.svg

# Plotly(HTML出力、オフラインで開けるようにJSをインライン埋め込み)
fileviz example.json --format plotly --output plotly.html

# pyvis(HTML出力)
fileviz example.yaml --format pyvis --output pyvis.html

# 診断(Graphvizやオプション依存の有無を表示)
fileviz --diagnose
```

オプションの概要(詳細)

- `--format`
	- 値: `tree` | `graphviz` | `mindmap`(= `graphviz` のエイリアス) | `plotly` | `pyvis`
	- 既定: `tree`
	- 出力未指定時(`--output`なし)の挙動:
		- `tree`: 端末にツリーを表示
		- `graphviz`/`mindmap`: DOTソースを標準出力
		- `plotly`: 図のJSON仕様を標準出力
		- `pyvis`: 一時HTMLファイルに書き出し、そのパスを標準出力
	- 依存関係/要件:
		- `graphviz`: システムにGraphviz本体(`dot`)が必要(ファイル保存時)。
		- `plotly`: 追加インストール `.[plotly]` が必要。
		- `pyvis`: 追加インストール `.[pyvis]` が必要。

- `--output <path>`
	- 値: 保存先のファイルパス(拡張子で形式判定します)
	- Graphvizの拡張子: 指定拡張子を尊重して保存(`.svg`推奨)。未指定なら `.svg` を自動付与。
	- 出力未指定時の挙動は上記 `--format` の項参照。
	- 例:
		- `--format graphviz --output graph.svg`
		- `--format plotly --output figure.html`
		- `--format pyvis --output network.html`

- `--layout <name>`(Graphviz系: `graphviz` / `mindmap`)
	- 値と意味:
		- `hierarchical` / `tree` / `tb` / `lr`:
			- 既定エンジンは `dot`。
			- 上下(TB)が既定。左右(LR)にしたい場合は `lr` を指定。
		- `radial` / `circle`:
			- 既定エンジンは `twopi`(放射状配置)。
		- `force` / `spring`:
			- 既定エンジンは `sfdp`(力学的配置)。
	- 備考: `--engine` を指定するとエンジンは上書きされます。`rankdir`(TB/LR)の効果は `dot` で有効です(他エンジンでは無視されることがあります)。

- `--engine <name>`(Graphviz系)
	- 値: `dot`, `twopi`, `sfdp`, `neato`, `circo` など Graphviz のエンジン名。
	- 既定: `dot`(`layout` により `twopi`/`sfdp` へ切替あり)。
	- `--layout` よりも優先され、指定したエンジンでレイアウトが実行されます。
	- 例: `--engine circo`(円環状に配置)

- `--theme <name>`
	- 値: `pastel`(既定), `light`, `dark`, `kawaii`, `chic`, `modern`, `business`, `caution`
	- 影響範囲:
		- Rich(`tree`): ラベル色とアイコン(絵文字)
		- Graphviz: 背景/ノード/エッジ色、ノード形状、(一部テーマで)グラデーション塗り
		- Plotly: 背景色、カラーパレット、マーカーシンボル
		- pyvis: 背景/ノード/エッジ色、ノード形状
	- 例: `--theme kawaii`(やわらか配色と親しみやすい記号)

	- フィルタリング / 制限
		- `--max-depth <N>`: 走査の最大深さ。超えた部分はサマリ表示。
		- `--include-keys <k1,k2>`: 部分一致で含めたいキー(dict対象)。
		- `--exclude-keys <k1,k2>`: 部分一致で除外したいキー(dict対象)。
		- `--prune-arrays <N>`: 配列が N を超えたら先頭 N 要素+サマリに省略。
		- `--max-nodes <N>` / `--max-edges <N>`: ノード/エッジのハード上限(超えたら打ち切り+警告)。

	- ストリーミング
		- `--stream-json`: ijson を利用してJSONをストリーミング読み込み(超大規模JSON向け)。
			- 追加インストール: `pip install .[stream]`

	- エクスポート
		- `--export-dot PATH`: DOTソースを書き出し。
		- `--export-json-graph PATH`: JSON-Graph(nodes/links)を書き出し。
		- `--export-graphml PATH`: GraphMLを書き出し。
		- `--export-csv-edges PATH`: エッジCSV(source,target,label)を書き出し。

拡張子の扱い(Graphviz)
- 出力ファイルの拡張子をそのまま尊重して保存します。`.svg` を指定すれば `.svg` で保存され、`.svg.svg` のような二重拡張子にはなりません。
- 拡張子未指定の場合は自動で `.svg` が付きます。

---

## 使い方(Python API)

簡単な例
```python
from filevisualization import visualize_path

# 樹形図を端末に表示
visualize_path("example.toml", format="tree")

# Graphviz(SVG保存)
visualize_path("example.xml", format="graphviz", layout="radial", output="graph.svg")
```

少し詳しい制御
```python
from filevisualization.core import load_file, visualize_data

data = load_file("tests/fixtures/sample.yaml")

# Plotly(HTML)
visualize_data(data, format="plotly", theme="business", output="plotly.html")

# pyvis(HTML)
visualize_data(data, format="pyvis", theme="kawaii", output="pyvis.html")
```

---

## テーマと型ベースのスタイリング

- テーマ(`--theme` / API引数 `theme`)
	- `pastel`(既定), `light`, `dark`, `kawaii`, `chic`, `modern`, `business`, `caution`
	- 背景・ノード・エッジの色がテーマごとに調整されます。
- 型ベースのスタイル
	- 値の種類(オブジェクト/配列/文字列/数値/真偽/Null など)に応じて、
		- Rich: アイコン(絵文字)
		- Graphviz: 形状(box, ellipse, diamond など)
		- Plotly: マーカーシンボル
		- pyvis: ノード形状
		が自動で割り当てられます。

---

## サンプルデータ

テスト用サンプルは `tests/fixtures` にあります。
- `tests/fixtures/sample.json`
- `tests/fixtures/sample.yaml`
- `tests/fixtures/sample.toml`
- `tests/fixtures/sample.xml`

---

## トラブルシュート

Graphviz: `ExecutableNotFound` になる
- システムに Graphviz が未インストール、または `dot` が PATH にありません。
- Windows の場合: Graphviz インストール後、PowerShell で `dot -V` が通るか確認してください。
	- それでも失敗する場合は `fileviz --diagnose` の出力を確認してください。

Graphviz出力の拡張子が二重になる
- 本ライブラリは出力拡張子を尊重して保存する実装(`pipe` で書き込み)に更新済みです。
- `.svg` を指定すれば `.svg` のみで保存されます。

Plotly の HTML がオフラインで開けない
- 本ライブラリは `include_plotlyjs="inline"` で書き出すため、単体HTMLで開けます。

pygraphviz を使いたい
- オプション依存関係(`.[all]`)に含まれていますが、Python>=3.10 でのみ有効化されます。
- Windows では VC++ Build Tools が必要になることがあります。

---

## 開発

ローカル開発
```
pip install -e .[all]
pre-commit install
pre-commit run --all-files
ruff check .
mypy
bandit -r src
pytest -q
```

uv を使う場合(任意)
```
# ヘルプ
uv run fileviz -h
# 見つからない場合
uv run python -m filevisualization.cli -h

# 例: Graphviz(放射)
uv run fileviz example.toml --format graphviz --layout radial --output radial.svg

# Plotly / pyvis の追加
uv pip install .[plotly]
uv run fileviz example.json --format plotly --output plotly.html

uv pip install .[pyvis]
uv run fileviz example.yaml --format pyvis --output pyvis.html
```

CI/品質ゲート
- Ruff(lint & format)
- mypy(strict)
- pytest(DOT/JSON-Graph の最小ゴールデンテスト含む)
- pre-commit(コミット前に自動整形・解析)
- Bandit(セキュリティ静的解析)
- OSS ライセンス出力(CIで生成・保存可能)

構成
- ビルド: `pyproject.toml`(PEP 621, setuptools)
- パッケージ: `src/filevisualization`
- CLI: `fileviz` エントリポイント(`filevisualization/cli.py`)
- テスト: `tests/`
- CI: `.github/workflows/ci.yml`(OS×Python×Graphviz 有無のマトリクスで検証)

ライセンス: MIT(`LICENSE` を参照)

---

## 変更履歴(抜粋)
- Graphviz 出力時の拡張子処理を改善し、二重拡張子にならないように変更
- テーマと型ベースのスタイルを全レンダラーに適用
- フィルタ・制限・ストリーミングJSON・各種エクスポート・診断を追加
- CIマトリクス、pre-commit、Bandit、ライセンスチェックを追加

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "filevisualization",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "visualization, xml, json, yaml, toml, tree, mindmap",
    "author": "hayashikunita",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/9c/d0/56b43c44890ef7af2fbe752dc624bbb476b86fa375ed740e522f16201dfc/filevisualization-0.1.0.tar.gz",
    "platform": null,
    "description": "# filevisualization\r\n\r\n![CI](https://github.com/hayashikunita/filevisualization/actions/workflows/ci.yml/badge.svg)\r\n![PyPI](https://img.shields.io/pypi/v/filevisualization.svg)\r\n\r\n\u69cb\u9020\u5316\u30d5\u30a1\u30a4\u30eb\uff08JSON / YAML / TOML / XML\uff09\u3092\u4ee5\u4e0b\u306e\u65b9\u6cd5\u3067\u53ef\u8996\u5316\u3059\u308bPython\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002\r\n\u30d3\u30c3\u30b0\u30c7\u30fc\u30bf\u3092\u6271\u3046\u969b\u3001\u30ef\u30f3\u30b3\u30de\u30f3\u30c9\u3067\u53ef\u8996\u5316\u3057\u307e\u3059\u3002\r\n\r\n- \u30bf\u30fc\u30df\u30ca\u30eb\u4e0a\u306e\u30ea\u30c3\u30c1\u306a\u6a39\u5f62\u56f3\uff08Rich\uff09\r\n- Graphviz \u306b\u3088\u308b\u30de\u30a4\u30f3\u30c9\u30de\u30c3\u30d7\u98a8\u30b0\u30e9\u30d5\uff08SVG/PNG \u306a\u3069\u306b\u4fdd\u5b58\uff09\r\n- Plotly\uff08\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6HTML\uff09\r\n- pyvis\uff08\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6HTML\uff09\r\n\r\nCLI \u3068 Python API \u306e\u4e21\u65b9\u3067\u5229\u7528\u3067\u304d\u307e\u3059\u3002\r\n\r\n\u4e3b\u306a\u7279\u5fb4\r\n- \u62e1\u5f35\u5b50\u304b\u3089\u81ea\u52d5\u5224\u5225\uff08JSON / YAML / TOML / XML\uff09\r\n- \u8907\u6570\u30ec\u30f3\u30c0\u30e9\u30fc\uff08tree / graphviz / plotly / pyvis\uff09\r\n- \u30ec\u30a4\u30a2\u30a6\u30c8\u5207\u66ff\uff08hierarchical / radial / force\uff09\u3084\u30a8\u30f3\u30b8\u30f3\u6307\u5b9a\uff08dot/twopi/sfdp/circo \u306a\u3069\uff09\r\n- \u30c6\u30fc\u30de\uff08pastel\uff3b\u65e2\u5b9a\uff3d, light, dark, kawaii, chic, modern, business, caution\uff09\u3068\u578b\u306b\u57fa\u3065\u304f\u30a2\u30a4\u30b3\u30f3\u30fb\u5f62\u72b6\r\n- \u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u30fb\u5236\u9650\uff08max-depth / include-keys / exclude-keys / prune-arrays / max-nodes / max-edges\uff09\r\n- \u5927\u898f\u6a21JSON\u5411\u3051\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u8aad\u307f\u8fbc\u307f\uff08--stream-json\uff09\r\n- \u30b0\u30e9\u30d5\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\uff08DOT / JSON-Graph / GraphML / CSV-edges\uff09\r\n- \u8a3a\u65ad\u30b3\u30de\u30f3\u30c9\u3067\u74b0\u5883\u30c1\u30a7\u30c3\u30af\uff08--diagnose\uff09\r\n- \u5358\u4f53\u30c6\u30b9\u30c8\u30fb\u578b\u30d2\u30f3\u30c8\u30fbCI\uff08OS\u00d7Py\u00d7Graphviz \u6709\u7121 \u30de\u30c8\u30ea\u30af\u30b9\uff09\u3001pre-commit\u3001Bandit\u3001\u30e9\u30a4\u30bb\u30f3\u30b9\u30c1\u30a7\u30c3\u30af\r\n\r\n\u5bfe\u5fdcPython: 3.10\u20133.12\uff08CI\u3067\u691c\u8a3c\u6e08\u307f\uff09\r\n\r\n---\r\n\r\n## \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\n\r\nPyPI\uff08\u63a8\u5968\uff09\r\n```\r\npip install filevisualization\r\n```\r\n\r\n\u6700\u5c0f\u69cb\u6210\uff08Rich + \u4e3b\u8981\u30d1\u30fc\u30b5\uff09\r\n```\r\npip install .\r\n```\r\n\r\n\u30aa\u30d7\u30b7\u30e7\u30f3\uff08\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u8868\u793a\u7528\uff09\r\n```\r\n# Plotly \u3092\u4f7f\u3046\u5834\u5408\r\npip install .[plotly]\r\n\r\n# pyvis \u3092\u4f7f\u3046\u5834\u5408\r\npip install .[pyvis]\r\n\r\n# \u3059\u3079\u3066\uff08Plotly + pyvis + pygraphviz: pygraphviz \u306f Python>=3.10 \u306e\u74b0\u5883\u3067\u6709\u52b9\uff09\r\npip install .[all]\r\n```\r\n\r\nGraphviz\uff08\u30b7\u30b9\u30c6\u30e0\u672c\u4f53\uff09\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff08Graphviz\u51fa\u529b\u3092\u30d5\u30a1\u30a4\u30eb\u4fdd\u5b58\u3059\u308b\u5834\u5408\u306b\u5fc5\u8981\uff09\r\n- \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9: https://graphviz.org/download/\r\n- Windows \u306f\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30fc\u5b9f\u884c\u5f8c\u3001`dot.exe` \u306e\u30d1\u30b9\u304c PATH \u306b\u901a\u3063\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n\t- PowerShell \u3067\u78ba\u8a8d: `dot -V`\uff08\u30d0\u30fc\u30b8\u30e7\u30f3\u8868\u793a\u3055\u308c\u308c\u3070OK\uff09\r\n\r\n---\r\n\r\n## \u4f7f\u3044\u65b9\uff08CLI\uff09\r\n\r\n\u57fa\u672c\r\n```\r\nfileviz <path> --format tree|graphviz|mindmap|plotly|pyvis \\\r\n\t[--output <path>] [--layout <name>] [--engine <name>] [--theme <name>] \\\r\n\t[--max-depth N] [--include-keys k1,k2] [--exclude-keys k1,k2] [--prune-arrays N] \\\r\n\t[--max-nodes N] [--max-edges N] [--stream-json] \\\r\n\t[--export-dot PATH] [--export-json-graph PATH] [--export-graphml PATH] [--export-csv-edges PATH] \\\r\n\t[--diagnose]\r\n```\r\n\r\n\u4f8b\r\n```\r\n# \u6a39\u5f62\u56f3\uff08\u30bf\u30fc\u30df\u30ca\u30eb\u8868\u793a\uff09\r\nfileviz example.json --format tree\r\n\r\n# Graphviz \u3092SVG\u3067\u4fdd\u5b58\uff08\u968e\u5c64: TB\uff09\r\nfileviz example.yaml --format graphviz --layout hierarchical --output out_tb.svg\r\n\r\n# Graphviz\uff08\u968e\u5c64: LR\uff09\r\nfileviz example.yaml --format graphviz --layout lr --output out_lr.svg\r\n\r\n# Graphviz\uff08\u653e\u5c04: twopi\uff09\r\nfileviz example.toml --format graphviz --layout radial --output radial.svg\r\n\r\n# Graphviz\uff08\u529b\u5b66: sfdp\uff09\r\nfileviz example.xml --format graphviz --layout force --output force.svg\r\n\r\n# Graphviz\uff08\u30a8\u30f3\u30b8\u30f3\u3092\u76f4\u63a5\u6307\u5b9a: circo\uff09\r\nfileviz example.json --format graphviz --engine circo --output circo.svg\r\n\r\n# Plotly\uff08HTML\u51fa\u529b\u3001\u30aa\u30d5\u30e9\u30a4\u30f3\u3067\u958b\u3051\u308b\u3088\u3046\u306bJS\u3092\u30a4\u30f3\u30e9\u30a4\u30f3\u57cb\u3081\u8fbc\u307f\uff09\r\nfileviz example.json --format plotly --output plotly.html\r\n\r\n# pyvis\uff08HTML\u51fa\u529b\uff09\r\nfileviz example.yaml --format pyvis --output pyvis.html\r\n\r\n# \u8a3a\u65ad\uff08Graphviz\u3084\u30aa\u30d7\u30b7\u30e7\u30f3\u4f9d\u5b58\u306e\u6709\u7121\u3092\u8868\u793a\uff09\r\nfileviz --diagnose\r\n```\r\n\r\n\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u6982\u8981\uff08\u8a73\u7d30\uff09\r\n\r\n- `--format`\r\n\t- \u5024: `tree` | `graphviz` | `mindmap`\uff08= `graphviz` \u306e\u30a8\u30a4\u30ea\u30a2\u30b9\uff09 | `plotly` | `pyvis`\r\n\t- \u65e2\u5b9a: `tree`\r\n\t- \u51fa\u529b\u672a\u6307\u5b9a\u6642\uff08`--output`\u306a\u3057\uff09\u306e\u6319\u52d5:\r\n\t\t- `tree`: \u7aef\u672b\u306b\u30c4\u30ea\u30fc\u3092\u8868\u793a\r\n\t\t- `graphviz`/`mindmap`: DOT\u30bd\u30fc\u30b9\u3092\u6a19\u6e96\u51fa\u529b\r\n\t\t- `plotly`: \u56f3\u306eJSON\u4ed5\u69d8\u3092\u6a19\u6e96\u51fa\u529b\r\n\t\t- `pyvis`: \u4e00\u6642HTML\u30d5\u30a1\u30a4\u30eb\u306b\u66f8\u304d\u51fa\u3057\u3001\u305d\u306e\u30d1\u30b9\u3092\u6a19\u6e96\u51fa\u529b\r\n\t- \u4f9d\u5b58\u95a2\u4fc2/\u8981\u4ef6:\r\n\t\t- `graphviz`: \u30b7\u30b9\u30c6\u30e0\u306bGraphviz\u672c\u4f53\uff08`dot`\uff09\u304c\u5fc5\u8981\uff08\u30d5\u30a1\u30a4\u30eb\u4fdd\u5b58\u6642\uff09\u3002\r\n\t\t- `plotly`: \u8ffd\u52a0\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb `.[plotly]` \u304c\u5fc5\u8981\u3002\r\n\t\t- `pyvis`: \u8ffd\u52a0\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb `.[pyvis]` \u304c\u5fc5\u8981\u3002\r\n\r\n- `--output <path>`\r\n\t- \u5024: \u4fdd\u5b58\u5148\u306e\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\uff08\u62e1\u5f35\u5b50\u3067\u5f62\u5f0f\u5224\u5b9a\u3057\u307e\u3059\uff09\r\n\t- Graphviz\u306e\u62e1\u5f35\u5b50: \u6307\u5b9a\u62e1\u5f35\u5b50\u3092\u5c0a\u91cd\u3057\u3066\u4fdd\u5b58\uff08`.svg`\u63a8\u5968\uff09\u3002\u672a\u6307\u5b9a\u306a\u3089 `.svg` \u3092\u81ea\u52d5\u4ed8\u4e0e\u3002\r\n\t- \u51fa\u529b\u672a\u6307\u5b9a\u6642\u306e\u6319\u52d5\u306f\u4e0a\u8a18 `--format` \u306e\u9805\u53c2\u7167\u3002\r\n\t- \u4f8b:\r\n\t\t- `--format graphviz --output graph.svg`\r\n\t\t- `--format plotly --output figure.html`\r\n\t\t- `--format pyvis --output network.html`\r\n\r\n- `--layout <name>`\uff08Graphviz\u7cfb: `graphviz` / `mindmap`\uff09\r\n\t- \u5024\u3068\u610f\u5473:\r\n\t\t- `hierarchical` / `tree` / `tb` / `lr`:\r\n\t\t\t- \u65e2\u5b9a\u30a8\u30f3\u30b8\u30f3\u306f `dot`\u3002\r\n\t\t\t- \u4e0a\u4e0b\uff08TB\uff09\u304c\u65e2\u5b9a\u3002\u5de6\u53f3\uff08LR\uff09\u306b\u3057\u305f\u3044\u5834\u5408\u306f `lr` \u3092\u6307\u5b9a\u3002\r\n\t\t- `radial` / `circle`:\r\n\t\t\t- \u65e2\u5b9a\u30a8\u30f3\u30b8\u30f3\u306f `twopi`\uff08\u653e\u5c04\u72b6\u914d\u7f6e\uff09\u3002\r\n\t\t- `force` / `spring`:\r\n\t\t\t- \u65e2\u5b9a\u30a8\u30f3\u30b8\u30f3\u306f `sfdp`\uff08\u529b\u5b66\u7684\u914d\u7f6e\uff09\u3002\r\n\t- \u5099\u8003: `--engine` \u3092\u6307\u5b9a\u3059\u308b\u3068\u30a8\u30f3\u30b8\u30f3\u306f\u4e0a\u66f8\u304d\u3055\u308c\u307e\u3059\u3002`rankdir`\uff08TB/LR\uff09\u306e\u52b9\u679c\u306f `dot` \u3067\u6709\u52b9\u3067\u3059\uff08\u4ed6\u30a8\u30f3\u30b8\u30f3\u3067\u306f\u7121\u8996\u3055\u308c\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\uff09\u3002\r\n\r\n- `--engine <name>`\uff08Graphviz\u7cfb\uff09\r\n\t- \u5024: `dot`, `twopi`, `sfdp`, `neato`, `circo` \u306a\u3069 Graphviz \u306e\u30a8\u30f3\u30b8\u30f3\u540d\u3002\r\n\t- \u65e2\u5b9a: `dot`\uff08`layout` \u306b\u3088\u308a `twopi`/`sfdp` \u3078\u5207\u66ff\u3042\u308a\uff09\u3002\r\n\t- `--layout` \u3088\u308a\u3082\u512a\u5148\u3055\u308c\u3001\u6307\u5b9a\u3057\u305f\u30a8\u30f3\u30b8\u30f3\u3067\u30ec\u30a4\u30a2\u30a6\u30c8\u304c\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002\r\n\t- \u4f8b: `--engine circo`\uff08\u5186\u74b0\u72b6\u306b\u914d\u7f6e\uff09\r\n\r\n- `--theme <name>`\r\n\t- \u5024: `pastel`\uff08\u65e2\u5b9a\uff09, `light`, `dark`, `kawaii`, `chic`, `modern`, `business`, `caution`\r\n\t- \u5f71\u97ff\u7bc4\u56f2:\r\n\t\t- Rich\uff08`tree`\uff09: \u30e9\u30d9\u30eb\u8272\u3068\u30a2\u30a4\u30b3\u30f3\uff08\u7d75\u6587\u5b57\uff09\r\n\t\t- Graphviz: \u80cc\u666f/\u30ce\u30fc\u30c9/\u30a8\u30c3\u30b8\u8272\u3001\u30ce\u30fc\u30c9\u5f62\u72b6\u3001\uff08\u4e00\u90e8\u30c6\u30fc\u30de\u3067\uff09\u30b0\u30e9\u30c7\u30fc\u30b7\u30e7\u30f3\u5857\u308a\r\n\t\t- Plotly: \u80cc\u666f\u8272\u3001\u30ab\u30e9\u30fc\u30d1\u30ec\u30c3\u30c8\u3001\u30de\u30fc\u30ab\u30fc\u30b7\u30f3\u30dc\u30eb\r\n\t\t- pyvis: \u80cc\u666f/\u30ce\u30fc\u30c9/\u30a8\u30c3\u30b8\u8272\u3001\u30ce\u30fc\u30c9\u5f62\u72b6\r\n\t- \u4f8b: `--theme kawaii`\uff08\u3084\u308f\u3089\u304b\u914d\u8272\u3068\u89aa\u3057\u307f\u3084\u3059\u3044\u8a18\u53f7\uff09\r\n\r\n\t- \u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0 / \u5236\u9650\r\n\t\t- `--max-depth <N>`: \u8d70\u67fb\u306e\u6700\u5927\u6df1\u3055\u3002\u8d85\u3048\u305f\u90e8\u5206\u306f\u30b5\u30de\u30ea\u8868\u793a\u3002\r\n\t\t- `--include-keys <k1,k2>`: \u90e8\u5206\u4e00\u81f4\u3067\u542b\u3081\u305f\u3044\u30ad\u30fc\uff08dict\u5bfe\u8c61\uff09\u3002\r\n\t\t- `--exclude-keys <k1,k2>`: \u90e8\u5206\u4e00\u81f4\u3067\u9664\u5916\u3057\u305f\u3044\u30ad\u30fc\uff08dict\u5bfe\u8c61\uff09\u3002\r\n\t\t- `--prune-arrays <N>`: \u914d\u5217\u304c N \u3092\u8d85\u3048\u305f\u3089\u5148\u982d N \u8981\u7d20\uff0b\u30b5\u30de\u30ea\u306b\u7701\u7565\u3002\r\n\t\t- `--max-nodes <N>` / `--max-edges <N>`: \u30ce\u30fc\u30c9/\u30a8\u30c3\u30b8\u306e\u30cf\u30fc\u30c9\u4e0a\u9650\uff08\u8d85\u3048\u305f\u3089\u6253\u3061\u5207\u308a\uff0b\u8b66\u544a\uff09\u3002\r\n\r\n\t- \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\r\n\t\t- `--stream-json`: ijson \u3092\u5229\u7528\u3057\u3066JSON\u3092\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u8aad\u307f\u8fbc\u307f\uff08\u8d85\u5927\u898f\u6a21JSON\u5411\u3051\uff09\u3002\r\n\t\t\t- \u8ffd\u52a0\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb: `pip install .[stream]`\r\n\r\n\t- \u30a8\u30af\u30b9\u30dd\u30fc\u30c8\r\n\t\t- `--export-dot PATH`: DOT\u30bd\u30fc\u30b9\u3092\u66f8\u304d\u51fa\u3057\u3002\r\n\t\t- `--export-json-graph PATH`: JSON-Graph\uff08nodes/links\uff09\u3092\u66f8\u304d\u51fa\u3057\u3002\r\n\t\t- `--export-graphml PATH`: GraphML\u3092\u66f8\u304d\u51fa\u3057\u3002\r\n\t\t- `--export-csv-edges PATH`: \u30a8\u30c3\u30b8CSV\uff08source,target,label\uff09\u3092\u66f8\u304d\u51fa\u3057\u3002\r\n\r\n\u62e1\u5f35\u5b50\u306e\u6271\u3044\uff08Graphviz\uff09\r\n- \u51fa\u529b\u30d5\u30a1\u30a4\u30eb\u306e\u62e1\u5f35\u5b50\u3092\u305d\u306e\u307e\u307e\u5c0a\u91cd\u3057\u3066\u4fdd\u5b58\u3057\u307e\u3059\u3002`.svg` \u3092\u6307\u5b9a\u3059\u308c\u3070 `.svg` \u3067\u4fdd\u5b58\u3055\u308c\u3001`.svg.svg` \u306e\u3088\u3046\u306a\u4e8c\u91cd\u62e1\u5f35\u5b50\u306b\u306f\u306a\u308a\u307e\u305b\u3093\u3002\r\n- \u62e1\u5f35\u5b50\u672a\u6307\u5b9a\u306e\u5834\u5408\u306f\u81ea\u52d5\u3067 `.svg` \u304c\u4ed8\u304d\u307e\u3059\u3002\r\n\r\n---\r\n\r\n## \u4f7f\u3044\u65b9\uff08Python API\uff09\r\n\r\n\u7c21\u5358\u306a\u4f8b\r\n```python\r\nfrom filevisualization import visualize_path\r\n\r\n# \u6a39\u5f62\u56f3\u3092\u7aef\u672b\u306b\u8868\u793a\r\nvisualize_path(\"example.toml\", format=\"tree\")\r\n\r\n# Graphviz\uff08SVG\u4fdd\u5b58\uff09\r\nvisualize_path(\"example.xml\", format=\"graphviz\", layout=\"radial\", output=\"graph.svg\")\r\n```\r\n\r\n\u5c11\u3057\u8a73\u3057\u3044\u5236\u5fa1\r\n```python\r\nfrom filevisualization.core import load_file, visualize_data\r\n\r\ndata = load_file(\"tests/fixtures/sample.yaml\")\r\n\r\n# Plotly\uff08HTML\uff09\r\nvisualize_data(data, format=\"plotly\", theme=\"business\", output=\"plotly.html\")\r\n\r\n# pyvis\uff08HTML\uff09\r\nvisualize_data(data, format=\"pyvis\", theme=\"kawaii\", output=\"pyvis.html\")\r\n```\r\n\r\n---\r\n\r\n## \u30c6\u30fc\u30de\u3068\u578b\u30d9\u30fc\u30b9\u306e\u30b9\u30bf\u30a4\u30ea\u30f3\u30b0\r\n\r\n- \u30c6\u30fc\u30de\uff08`--theme` / API\u5f15\u6570 `theme`\uff09\r\n\t- `pastel`\uff08\u65e2\u5b9a\uff09, `light`, `dark`, `kawaii`, `chic`, `modern`, `business`, `caution`\r\n\t- \u80cc\u666f\u30fb\u30ce\u30fc\u30c9\u30fb\u30a8\u30c3\u30b8\u306e\u8272\u304c\u30c6\u30fc\u30de\u3054\u3068\u306b\u8abf\u6574\u3055\u308c\u307e\u3059\u3002\r\n- \u578b\u30d9\u30fc\u30b9\u306e\u30b9\u30bf\u30a4\u30eb\r\n\t- \u5024\u306e\u7a2e\u985e\uff08\u30aa\u30d6\u30b8\u30a7\u30af\u30c8/\u914d\u5217/\u6587\u5b57\u5217/\u6570\u5024/\u771f\u507d/Null \u306a\u3069\uff09\u306b\u5fdc\u3058\u3066\u3001\r\n\t\t- Rich: \u30a2\u30a4\u30b3\u30f3\uff08\u7d75\u6587\u5b57\uff09\r\n\t\t- Graphviz: \u5f62\u72b6\uff08box, ellipse, diamond \u306a\u3069\uff09\r\n\t\t- Plotly: \u30de\u30fc\u30ab\u30fc\u30b7\u30f3\u30dc\u30eb\r\n\t\t- pyvis: \u30ce\u30fc\u30c9\u5f62\u72b6\r\n\t\t\u304c\u81ea\u52d5\u3067\u5272\u308a\u5f53\u3066\u3089\u308c\u307e\u3059\u3002\r\n\r\n---\r\n\r\n## \u30b5\u30f3\u30d7\u30eb\u30c7\u30fc\u30bf\r\n\r\n\u30c6\u30b9\u30c8\u7528\u30b5\u30f3\u30d7\u30eb\u306f `tests/fixtures` \u306b\u3042\u308a\u307e\u3059\u3002\r\n- `tests/fixtures/sample.json`\r\n- `tests/fixtures/sample.yaml`\r\n- `tests/fixtures/sample.toml`\r\n- `tests/fixtures/sample.xml`\r\n\r\n---\r\n\r\n## \u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c8\r\n\r\nGraphviz: `ExecutableNotFound` \u306b\u306a\u308b\r\n- \u30b7\u30b9\u30c6\u30e0\u306b Graphviz \u304c\u672a\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3001\u307e\u305f\u306f `dot` \u304c PATH \u306b\u3042\u308a\u307e\u305b\u3093\u3002\r\n- Windows \u306e\u5834\u5408: Graphviz \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u5f8c\u3001PowerShell \u3067 `dot -V` \u304c\u901a\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n\t- \u305d\u308c\u3067\u3082\u5931\u6557\u3059\u308b\u5834\u5408\u306f `fileviz --diagnose` \u306e\u51fa\u529b\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n\r\nGraphviz\u51fa\u529b\u306e\u62e1\u5f35\u5b50\u304c\u4e8c\u91cd\u306b\u306a\u308b\r\n- \u672c\u30e9\u30a4\u30d6\u30e9\u30ea\u306f\u51fa\u529b\u62e1\u5f35\u5b50\u3092\u5c0a\u91cd\u3057\u3066\u4fdd\u5b58\u3059\u308b\u5b9f\u88c5\uff08`pipe` \u3067\u66f8\u304d\u8fbc\u307f\uff09\u306b\u66f4\u65b0\u6e08\u307f\u3067\u3059\u3002\r\n- `.svg` \u3092\u6307\u5b9a\u3059\u308c\u3070 `.svg` \u306e\u307f\u3067\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002\r\n\r\nPlotly \u306e HTML \u304c\u30aa\u30d5\u30e9\u30a4\u30f3\u3067\u958b\u3051\u306a\u3044\r\n- \u672c\u30e9\u30a4\u30d6\u30e9\u30ea\u306f `include_plotlyjs=\"inline\"` \u3067\u66f8\u304d\u51fa\u3059\u305f\u3081\u3001\u5358\u4f53HTML\u3067\u958b\u3051\u307e\u3059\u3002\r\n\r\npygraphviz \u3092\u4f7f\u3044\u305f\u3044\r\n- \u30aa\u30d7\u30b7\u30e7\u30f3\u4f9d\u5b58\u95a2\u4fc2\uff08`.[all]`\uff09\u306b\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u304c\u3001Python>=3.10 \u3067\u306e\u307f\u6709\u52b9\u5316\u3055\u308c\u307e\u3059\u3002\r\n- Windows \u3067\u306f VC++ Build Tools \u304c\u5fc5\u8981\u306b\u306a\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\r\n\r\n---\r\n\r\n## \u958b\u767a\r\n\r\n\u30ed\u30fc\u30ab\u30eb\u958b\u767a\r\n```\r\npip install -e .[all]\r\npre-commit install\r\npre-commit run --all-files\r\nruff check .\r\nmypy\r\nbandit -r src\r\npytest -q\r\n```\r\n\r\nuv \u3092\u4f7f\u3046\u5834\u5408\uff08\u4efb\u610f\uff09\r\n```\r\n# \u30d8\u30eb\u30d7\r\nuv run fileviz -h\r\n# \u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\r\nuv run python -m filevisualization.cli -h\r\n\r\n# \u4f8b: Graphviz\uff08\u653e\u5c04\uff09\r\nuv run fileviz example.toml --format graphviz --layout radial --output radial.svg\r\n\r\n# Plotly / pyvis \u306e\u8ffd\u52a0\r\nuv pip install .[plotly]\r\nuv run fileviz example.json --format plotly --output plotly.html\r\n\r\nuv pip install .[pyvis]\r\nuv run fileviz example.yaml --format pyvis --output pyvis.html\r\n```\r\n\r\nCI/\u54c1\u8cea\u30b2\u30fc\u30c8\r\n- Ruff\uff08lint & format\uff09\r\n- mypy\uff08strict\uff09\r\n- pytest\uff08DOT/JSON-Graph \u306e\u6700\u5c0f\u30b4\u30fc\u30eb\u30c7\u30f3\u30c6\u30b9\u30c8\u542b\u3080\uff09\r\n- pre-commit\uff08\u30b3\u30df\u30c3\u30c8\u524d\u306b\u81ea\u52d5\u6574\u5f62\u30fb\u89e3\u6790\uff09\r\n- Bandit\uff08\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u9759\u7684\u89e3\u6790\uff09\r\n- OSS \u30e9\u30a4\u30bb\u30f3\u30b9\u51fa\u529b\uff08CI\u3067\u751f\u6210\u30fb\u4fdd\u5b58\u53ef\u80fd\uff09\r\n\r\n\u69cb\u6210\r\n- \u30d3\u30eb\u30c9: `pyproject.toml`\uff08PEP 621, setuptools\uff09\r\n- \u30d1\u30c3\u30b1\u30fc\u30b8: `src/filevisualization`\r\n- CLI: `fileviz` \u30a8\u30f3\u30c8\u30ea\u30dd\u30a4\u30f3\u30c8\uff08`filevisualization/cli.py`\uff09\r\n- \u30c6\u30b9\u30c8: `tests/`\r\n- CI: `.github/workflows/ci.yml`\uff08OS\u00d7Python\u00d7Graphviz \u6709\u7121\u306e\u30de\u30c8\u30ea\u30af\u30b9\u3067\u691c\u8a3c\uff09\r\n\r\n\u30e9\u30a4\u30bb\u30f3\u30b9: MIT\uff08`LICENSE` \u3092\u53c2\u7167\uff09\r\n\r\n---\r\n\r\n## \u5909\u66f4\u5c65\u6b74\uff08\u629c\u7c8b\uff09\r\n- Graphviz \u51fa\u529b\u6642\u306e\u62e1\u5f35\u5b50\u51e6\u7406\u3092\u6539\u5584\u3057\u3001\u4e8c\u91cd\u62e1\u5f35\u5b50\u306b\u306a\u3089\u306a\u3044\u3088\u3046\u306b\u5909\u66f4\r\n- \u30c6\u30fc\u30de\u3068\u578b\u30d9\u30fc\u30b9\u306e\u30b9\u30bf\u30a4\u30eb\u3092\u5168\u30ec\u30f3\u30c0\u30e9\u30fc\u306b\u9069\u7528\r\n- \u30d5\u30a3\u30eb\u30bf\u30fb\u5236\u9650\u30fb\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0JSON\u30fb\u5404\u7a2e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u30fb\u8a3a\u65ad\u3092\u8ffd\u52a0\r\n- CI\u30de\u30c8\u30ea\u30af\u30b9\u3001pre-commit\u3001Bandit\u3001\u30e9\u30a4\u30bb\u30f3\u30b9\u30c1\u30a7\u30c3\u30af\u3092\u8ffd\u52a0\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Visualize structure of XML/JSON/YAML/TOML as trees or mind maps",
    "version": "0.1.0",
    "project_urls": {
        "Homepage": "https://github.com/hayashikunita/filevisualization",
        "Issues": "https://github.com/hayashikunita/filevisualization/issues",
        "Repository": "https://github.com/hayashikunita/filevisualization"
    },
    "split_keywords": [
        "visualization",
        " xml",
        " json",
        " yaml",
        " toml",
        " tree",
        " mindmap"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bc0842a8ba6667e9ffc3ca65991b6d9b9805c399acedbe0bfcd88a80d42a9c94",
                "md5": "ff82ae346f1a06edeb7dbfaff1051f9d",
                "sha256": "eda057ce86349fcfdb5652341fb3be00f2fd9cd3c5eda91c69d23f49267e10a1"
            },
            "downloads": -1,
            "filename": "filevisualization-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ff82ae346f1a06edeb7dbfaff1051f9d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 20530,
            "upload_time": "2025-08-30T16:00:28",
            "upload_time_iso_8601": "2025-08-30T16:00:28.601615Z",
            "url": "https://files.pythonhosted.org/packages/bc/08/42a8ba6667e9ffc3ca65991b6d9b9805c399acedbe0bfcd88a80d42a9c94/filevisualization-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9cd056b43c44890ef7af2fbe752dc624bbb476b86fa375ed740e522f16201dfc",
                "md5": "ba31f4c79616629e5f20ceeef5857087",
                "sha256": "ceb31ef1fce337da689f0b79fa214b1108e96efe3a3d11bc6aeee6480b239ae4"
            },
            "downloads": -1,
            "filename": "filevisualization-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "ba31f4c79616629e5f20ceeef5857087",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 23965,
            "upload_time": "2025-08-30T16:00:30",
            "upload_time_iso_8601": "2025-08-30T16:00:30.163025Z",
            "url": "https://files.pythonhosted.org/packages/9c/d0/56b43c44890ef7af2fbe752dc624bbb476b86fa375ed740e522f16201dfc/filevisualization-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-30 16:00:30",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "hayashikunita",
    "github_project": "filevisualization",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "filevisualization"
}
        
Elapsed time: 0.96995s