feat: make pyarrow optional via mt5cli[parquet] extra (#69)

This commit is contained in:
Daichi Narushima
2026-06-25 14:03:24 +09:00
committed by GitHub
parent dfe80ce500
commit 9dbb46fbb1
7 changed files with 69 additions and 4 deletions
+22
View File
@@ -5,6 +5,7 @@ from __future__ import annotations
import re
import sqlite3
from datetime import UTC, datetime
from importlib.metadata import requires
from pathlib import Path
from typing import get_type_hints
from unittest.mock import MagicMock
@@ -832,3 +833,24 @@ class TestStableSdkContract:
assert result.index.tz is not None
assert "time" not in result.columns
assert "close" in result.columns
# ---------------------------------------------------------------------------
# Packaging metadata
# ---------------------------------------------------------------------------
def test_parquet_extra_declares_pyarrow() -> None:
"""Package metadata lists pyarrow under the parquet optional extra."""
reqs = requires("mt5cli") or []
parquet_reqs = [r for r in reqs if "pyarrow" in r and "parquet" in r]
assert parquet_reqs, "pyarrow not found in parquet optional extra"
def test_pyarrow_not_in_core_dependencies() -> None:
"""Pyarrow is not a core dependency; it belongs only in the parquet extra."""
reqs = requires("mt5cli") or []
core_reqs = [r for r in reqs if "extra ==" not in r]
assert not any("pyarrow" in r for r in core_reqs), (
"pyarrow should not appear in core dependencies"
)
+12
View File
@@ -4,6 +4,7 @@ from __future__ import annotations
import json
import sqlite3
import sys
from datetime import UTC, datetime
from typing import TYPE_CHECKING
@@ -111,6 +112,17 @@ class TestExportDataframe:
result = pd.read_parquet(output)
pd.testing.assert_frame_equal(result, sample_df)
def test_export_parquet_without_pyarrow(
self,
tmp_path: Path,
sample_df: pd.DataFrame,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test that a clear error is raised when pyarrow is not installed."""
monkeypatch.setitem(sys.modules, "pyarrow", None)
with pytest.raises(ImportError, match="mt5cli\\[parquet\\]"):
export_dataframe(sample_df, tmp_path / "out.parquet", "parquet")
def test_export_sqlite3(self, tmp_path: Path, sample_df: pd.DataFrame) -> None:
"""Test SQLite3 export."""
output = tmp_path / "out.db"