"""目録の集計(`tiasdata stats`.SPEC_03「CLI」).
- 種類・所見の値ごとの件数を返す
- 対応表を開かない(SPEC_02「対応表」: 対応表を開くのは取り込みのときだけ)
"""
import sqlite3
from contextlib import closing
from conftest import ImportEnv
from tiasdata.cli import main
from tiasdata.config import load_config
from tiasdata.importers import run_import
from tiasdata.stats import collect_stats
def _open(env: ImportEnv) -> sqlite3.Connection:
return sqlite3.connect(env.catalog_root / "catalog.sqlite")
def test_empty_catalog(import_env: ImportEnv) -> None:
assert main(["init"]) == 0
with closing(_open(import_env)) as conn:
stats = collect_stats(conn)
assert stats.subjects == 0
assert stats.captures == 0
assert stats.subjects_with_multiple_captures == 0
assert set(stats.assets_by_kind.values()) == {0}
assert "tongue_crop_masked" in stats.assets_by_kind
assert stats.annotations == {}
assert stats.superseded_annotations == 0
def test_counts_after_import(import_env: ImportEnv) -> None:
assert main(["init"]) == 0
run_import(load_config(import_env.config_path), import_env.source_name)
with closing(_open(import_env)) as conn:
stats = collect_stats(conn)
assert stats.subjects == 7
assert stats.captures == 18
# ダミーの 7 人はみな 2 枚以上
assert stats.subjects_with_multiple_captures == 7
assert stats.assets_by_kind == {
"color_chart": 0,
"tongue_crop_masked": 18,
"tongue_mask": 0,
"tongue_raw": 0,
}
tongue = stats.annotations["tongue_color"]
assert tongue.total == 18
assert tongue.by_field["label"] == {
"dark_red": 4,
"light_red": 2,
"pale": 4,
"purple": 4,
"red": 4,
}
assert tongue.by_field["severity"] == {"mild": 8, "normal": 2, "strong": 8}
# 9 フォルダ(ラベル×程度の組み合わせ)ごとに 2 枚
assert len(tongue.by_value) == 9
assert set(tongue.by_value.values()) == {2}
assert stats.superseded_annotations == 0
def test_stats_does_not_need_identity_db(import_env: ImportEnv) -> None:
assert main(["init"]) == 0
run_import(load_config(import_env.config_path), import_env.source_name)
import_env.identity_path.unlink()
assert main(["stats"]) == 0
assert not import_env.identity_path.exists()
def test_held_images_are_not_counted(import_env: ImportEnv) -> None:
from conftest import write_holds
write_holds(import_env.holds_dir, "dummy_tongue", [1, 2]) # light_red の 2 枚
assert main(["init"]) == 0
run_import(load_config(import_env.config_path), import_env.source_name)
with closing(_open(import_env)) as conn:
stats = collect_stats(conn)
assert stats.captures == 16
assert "light_red" not in stats.annotations["tongue_color"].by_field["label"]