Repository navigation
[BUG] dashboard extra が pandas を宣言していない(gradio の推移的依存で動いている) #93
Description
Bug Description
dashboard extra が gradio>=4.0 しか宣言していないのに、Dashboard._create_gradio_app() は pandas を無防備に import しています。
# src/pyetwkit/dashboard.py
try:
import gradio as gr
except ImportError as e:
logger.error("Failed to import Gradio: %s", e)
raise ImportError(
"Gradio is required for the dashboard. "
"Install it with: pip install pyetwkit[dashboard]"
) from e
import pandas as pd # <- ガードなし。extra は宣言していない# pyproject.toml
dashboard = [
"gradio>=4.0",
]現時点では壊れていません。gradio が pandas に依存しているため、pip install pyetwkit[dashboard] で pandas も一緒に入るからです。つまり他パッケージの依存関係にぶら下がって動いている状態で、gradio がその依存を落とせば壊れます。
またその場合のエラーは pandas の ModuleNotFoundError になり、gradio 用に用意された「pip install pyetwkit[dashboard] を実行してください」という案内は的外れになります(そのコマンドは既に実行されているため)。
Steps to Reproduce
現状では推移的依存のため再現しません。意図的に再現するには:
pip install pyetwkit[dashboard]pip uninstall pandas(gradio が pandas を要求しなくなった状況の模擬)Dashboard(...).launch()を呼ぶModuleNotFoundError: No module named 'pandas'が出る
Expected Behavior
dashboard extra が、dashboard の動作に必要なものを自分で宣言していること。
dashboard = [
"gradio>=4.0",
"pandas>=2.0",
]Actual Behavior
dashboard extra は gradio のみを宣言し、pandas は gradio の推移的依存として入っています。
Environment
- OS: Windows 11 (10.0.26200)
- Python version: 3.12.10
- PyETWkit version: 3.1.0 (main,
b696112) - Rust toolchain: 1.98.1
Error Log / Stack Trace
(現状では発生しません。宣言と実装の不一致を記録するための Issue です)
Minimal Reproduction Code
# pandas が無い環境で
from pyetwkit import Dashboard
dashboard = Dashboard(port=7860)
dashboard.add_provider("Microsoft-Windows-Kernel-Process")
dashboard.launch()
# ModuleNotFoundError: No module named 'pandas'
# (案内は "pip install pyetwkit[dashboard]" だが、それでは解決しない)Related ETW Provider (if applicable)
- Provider name: 該当なし
- Event ID: 該当なし
Test Case Proposal (TDD)
extra の宣言そのものを検証します。_create_gradio_app の実行には gradio が要るため、宣言と実装の整合をメタデータ側で確かめる形が現実的です。
import importlib.metadata
import re
def test_dashboard_extra_declares_everything_the_dashboard_imports() -> None:
"""dashboard extra が pandas を含むこと。現状は失敗する。"""
requires = importlib.metadata.requires("pyetwkit") or []
dashboard_deps = [
r for r in requires if 'extra == "dashboard"' in r
]
names = {re.split(r"[<>=!\[ ;]", r)[0].strip() for r in dashboard_deps}
assert "gradio" in names
assert "pandas" in names, (
"dashboard.py imports pandas unguarded; the extra must declare it "
"rather than relying on gradio pulling it in"
)dashboard extra を CI に入れるかどうかは別途判断が必要です。gradio は重く、_create_gradio_app() は現在テストで一度も呼ばれていません(tests/test_dashboard.py に gradio への言及がありません)。#87 で export extra を CI に入れたのと同じ判断を要します。
Additional Context
- test: Run the exporters in CI instead of skipping them #87 で
exportextra を CI に入れ、pandas / pyarrow のテストが実際に走るようにしました。dashboardは同じ状態のまま残っています _create_gradio_app()はテストで一度も呼ばれておらず、gradio 経路のカバレッジはゼロです- 修正自体は pyproject.toml の1行です。CI への追加まで含めるかは別途判断してください
Activity
fix: Declare pandas in the dashboard extra (#95)