Skip to content

[BUG] dashboard extra が pandas を宣言していない(gradio の推移的依存で動いている) #93

Closed

Description

@m96-chan

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

現状では推移的依存のため再現しません。意図的に再現するには:

  1. pip install pyetwkit[dashboard]
  2. pip uninstall pandas(gradio が pandas を要求しなくなった状況の模擬)
  3. Dashboard(...).launch() を呼ぶ
  4. 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 で export extra を CI に入れ、pandas / pyarrow のテストが実際に走るようにしました。dashboard は同じ状態のまま残っています
  • _create_gradio_app() はテストで一度も呼ばれておらず、gradio 経路のカバレッジはゼロです
  • 修正自体は pyproject.toml の1行です。CI への追加まで含めるかは別途判断してください

Activity

  1. added a commit that references this issue on Sep 6, 2026
    d9b5757
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions