# fastapi_di — 開発タスク
# format は uvx で ruff のバージョンを固定して実行する（環境差を排除）。

# ruff / pyright のピン留めバージョン（更新時はここだけ変える）
RUFF_VERSION := 0.15.18
PYRIGHT_VERSION := 1.1.411

# lint/format の対象（examples / tools もルート直下から移して対象に含めた）
SRC := src tests examples tools

.PHONY: format format-check lint test test-heavy test-benchmark test-all type-test check build publish grep-todo

# コード整形（自動修正）
format:
	uvx ruff@$(RUFF_VERSION) format $(SRC)
	uvx ruff@$(RUFF_VERSION) check --fix $(SRC)

# 整形確認のみ（CI 向け・書き換えない）
format-check:
	uvx ruff@$(RUFF_VERSION) format --check $(SRC)
	uvx ruff@$(RUFF_VERSION) check $(SRC)

# lint のみ
lint:
	uvx ruff@$(RUFF_VERSION) check $(SRC)

# テスト 4 段。マーカー slow / benchmark は pyproject に登録済み。
test:                      # fast（内ループ既定）
	uv run pytest -m "not slow and not benchmark"
	@make test-type

test-heavy:                # 重い層だけ（実バックエンド・ネットワーク・ポーリング待ち）
	uv run pytest -m "slow"

test-benchmark:            # 性能計測だけ
	uv run pytest -m "benchmark"

test-all:                  # 全部（CI / 明示時）
	uv run pytest
	@make test-type

# 型テスト（pytest とは別系統）。tests/test_type/ を pyright で静的検査する。
# assert_type の一致・依存と注釈の不整合検出が壊れたらここが赤くなる。
test-type:
	uvx pyright@$(PYRIGHT_VERSION) tests/test_type

# 一括検証（format 確認 + fast test）＝内ループの「検証緑」判定
check: format-check test

# 配布物（sdist + wheel）を dist/ にビルドし、メタデータを検証（壊れた配布を公開前に弾く）。
build:
	rm -rf dist
	uv build
	uvx twine@6 check dist/*

# 非常用フォールバックの手動公開（正路は CI の Trusted Publishing）。トークンは対話入力させる。
publish: build
	uv publish

# 作業マーカー（TODO/FIXME/HACK）を file:line で拾う。非ヒットでも exit 0
grep-todo:
	@grep -rnE 'TODO|FIXME|HACK' $(SRC) --include='*.py' || true
