Some checks failed
Smoke Test / smoke (pull_request) Failing after 11s
Structured processing log for the multimodal Twitter archive analysis. 33 meaning kernel entries indexed with theme classification. ## What - twitter-archive/know-thy-father/PROCESSING_LOG.md — progress tracker, theme index, arc pattern catalog - twitter-archive/know-thy-father/entries/processed.jsonl — 33 structured entries with tweet_id, media_type, arc, meaning_kernel, themes - twitter-archive/know-thy-father/tracker.py — CLI tool for status/add/report - tests/twitter_archive/test_ktf_tracker.py — 7 tests ## Themes tracked identity (20), transmutation (13), authenticity (12), digital_agency (11), agency (8), glitch (8), silence (5), void (5), collective_identity (4), noise (4), presence (4), simulation (2), shadow (1), self_naming (1), persistence (1) ## Usage python tracker.py status — show progress python tracker.py add X.json — add entry python tracker.py report — generate markdown report Closes #587.
146 lines
5.1 KiB
Python
146 lines
5.1 KiB
Python
"""Tests for the Know Thy Father processing tracker."""
|
|
|
|
import json
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.fixture
|
|
def tmp_log_dir(tmp_path):
|
|
"""Create a temporary log directory with test entries."""
|
|
entries_dir = tmp_path / "entries"
|
|
entries_dir.mkdir()
|
|
|
|
# Write test entries
|
|
entries = [
|
|
{
|
|
"tweet_id": "123",
|
|
"media_type": "video",
|
|
"method": "frame_sequence",
|
|
"arc": "Test arc 1",
|
|
"meaning_kernel": "Test kernel 1",
|
|
"themes": ["identity", "glitch"],
|
|
},
|
|
{
|
|
"tweet_id": "456",
|
|
"media_type": "image",
|
|
"method": "screenshot",
|
|
"arc": "Test arc 2",
|
|
"meaning_kernel": "Test kernel 2",
|
|
"themes": ["transmutation"],
|
|
},
|
|
]
|
|
|
|
entries_file = entries_dir / "processed.jsonl"
|
|
with open(entries_file, "w") as f:
|
|
for entry in entries:
|
|
f.write(json.dumps(entry) + "\n")
|
|
|
|
return tmp_path
|
|
|
|
|
|
class TestLoadEntries:
|
|
def test_loads_jsonl(self, tmp_log_dir, monkeypatch):
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "twitter-archive" / "know-thy-father"))
|
|
import tracker
|
|
monkeypatch.setattr(tracker, "ENTRIES_FILE", tmp_log_dir / "entries" / "processed.jsonl")
|
|
|
|
entries = tracker.load_entries()
|
|
assert len(entries) == 2
|
|
assert entries[0]["tweet_id"] == "123"
|
|
assert entries[1]["tweet_id"] == "456"
|
|
|
|
def test_empty_file(self, tmp_path, monkeypatch):
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "twitter-archive" / "know-thy-father"))
|
|
import tracker
|
|
entries_file = tmp_path / "nonexistent.jsonl"
|
|
monkeypatch.setattr(tracker, "ENTRIES_FILE", entries_file)
|
|
|
|
entries = tracker.load_entries()
|
|
assert entries == []
|
|
|
|
|
|
class TestComputeStats:
|
|
def test_basic_stats(self, tmp_log_dir, monkeypatch):
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "twitter-archive" / "know-thy-father"))
|
|
import tracker
|
|
monkeypatch.setattr(tracker, "ENTRIES_FILE", tmp_log_dir / "entries" / "processed.jsonl")
|
|
|
|
entries = tracker.load_entries()
|
|
stats = tracker.compute_stats(entries)
|
|
|
|
assert stats["total_targets"] == 108
|
|
assert stats["processed"] == 2
|
|
assert stats["pending"] == 106
|
|
assert stats["themes"]["identity"] == 1
|
|
assert stats["themes"]["transmutation"] == 1
|
|
assert stats["themes"]["glitch"] == 1
|
|
assert stats["media_types"]["video"] == 1
|
|
assert stats["media_types"]["image"] == 1
|
|
|
|
def test_completion_percentage(self, tmp_log_dir, monkeypatch):
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "twitter-archive" / "know-thy-father"))
|
|
import tracker
|
|
monkeypatch.setattr(tracker, "ENTRIES_FILE", tmp_log_dir / "entries" / "processed.jsonl")
|
|
|
|
entries = tracker.load_entries()
|
|
stats = tracker.compute_stats(entries)
|
|
|
|
assert stats["completion_pct"] == pytest.approx(1.9, abs=0.1)
|
|
|
|
|
|
class TestSaveEntry:
|
|
def test_append_entry(self, tmp_log_dir, monkeypatch):
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "twitter-archive" / "know-thy-father"))
|
|
import tracker
|
|
entries_file = tmp_log_dir / "entries" / "processed.jsonl"
|
|
monkeypatch.setattr(tracker, "ENTRIES_FILE", entries_file)
|
|
|
|
new_entry = {
|
|
"tweet_id": "789",
|
|
"media_type": "video",
|
|
"arc": "New arc",
|
|
"meaning_kernel": "New kernel",
|
|
"themes": ["agency"],
|
|
}
|
|
tracker.save_entry(new_entry)
|
|
|
|
entries = tracker.load_entries()
|
|
assert len(entries) == 3
|
|
assert entries[-1]["tweet_id"] == "789"
|
|
|
|
def test_creates_parent_dirs(self, tmp_path, monkeypatch):
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "twitter-archive" / "know-thy-father"))
|
|
import tracker
|
|
entries_file = tmp_path / "new_dir" / "entries" / "processed.jsonl"
|
|
monkeypatch.setattr(tracker, "ENTRIES_FILE", entries_file)
|
|
|
|
tracker.save_entry({"tweet_id": "000", "media_type": "test", "arc": "x", "meaning_kernel": "y", "themes": []})
|
|
assert entries_file.exists()
|
|
|
|
|
|
class TestThemeDistribution:
|
|
def test_theme_counts(self, tmp_log_dir, monkeypatch):
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "twitter-archive" / "know-thy-father"))
|
|
import tracker
|
|
monkeypatch.setattr(tracker, "ENTRIES_FILE", tmp_log_dir / "entries" / "processed.jsonl")
|
|
|
|
entries = tracker.load_entries()
|
|
stats = tracker.compute_stats(entries)
|
|
|
|
# identity appears in entry 1 only
|
|
assert stats["themes"]["identity"] == 1
|
|
# glitch appears in entry 1 only
|
|
assert stats["themes"]["glitch"] == 1
|
|
# transmutation appears in entry 2 only
|
|
assert stats["themes"]["transmutation"] == 1
|