feat(sources): real-time file progress for sync and upload — background upload with success toast
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -63,7 +63,7 @@ from __future__ import annotations
|
||||
import asyncio
|
||||
import logging
|
||||
import time
|
||||
from collections.abc import Iterator
|
||||
from collections.abc import Callable, Iterator
|
||||
from datetime import UTC, datetime
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
@@ -235,6 +235,9 @@ class FakeImportSources:
|
||||
self.sources: list[list[Path]] = []
|
||||
self.llms: list[LLMClient] = []
|
||||
self.prune_flags: list[bool] = []
|
||||
# Phase 64 (task 02): the progress hook the runner passes (a live
|
||||
# closure while wired, None if the wiring regresses).
|
||||
self.progress_hooks: list[object] = []
|
||||
|
||||
async def __call__(
|
||||
self,
|
||||
@@ -244,10 +247,12 @@ class FakeImportSources:
|
||||
prune: bool = False,
|
||||
limit: int | None = None,
|
||||
session: Session | None = None,
|
||||
progress: Callable[[str, str, int, int], None] | None = None,
|
||||
) -> ImportSummary:
|
||||
self.sources.append(list(sources))
|
||||
self.llms.append(llm)
|
||||
self.prune_flags.append(prune)
|
||||
self.progress_hooks.append(progress)
|
||||
if self.delay:
|
||||
await asyncio.sleep(self.delay)
|
||||
return self.summary
|
||||
@@ -324,6 +329,10 @@ def test_admin_sync_success_reports_full_detail(
|
||||
"finished_at": None,
|
||||
"detail": {},
|
||||
"error": None,
|
||||
# Phase 64 (task 02): the per-file progress keys — null/0/0 idle.
|
||||
"current_file": None,
|
||||
"files_done": 0,
|
||||
"files_total": 0,
|
||||
}
|
||||
|
||||
r = sync_client.post("/api/sync")
|
||||
@@ -353,6 +362,10 @@ def test_admin_sync_success_reports_full_detail(
|
||||
assert fake_import.prune_flags == [True]
|
||||
assert len(fake_import.llms) == 1
|
||||
assert isinstance(fake_import.llms[0], LLMClient)
|
||||
# Phase 64 (task 02): the runner wires the per-file progress hook
|
||||
# (the live closure the status endpoint reads while the import runs).
|
||||
assert len(fake_import.progress_hooks) == 1
|
||||
assert callable(fake_import.progress_hooks[0])
|
||||
# Overview: refreshed (added + updated > 0) with the same client.
|
||||
assert fake_overview.llms == [fake_import.llms[0]]
|
||||
# Phase 41: the probe ran first and got the very client the import
|
||||
@@ -733,6 +746,7 @@ def test_import_error_is_reported_with_credentials_masked(
|
||||
prune: bool = False,
|
||||
limit: int | None = None,
|
||||
session: Session | None = None,
|
||||
progress: Callable[[str, str, int, int], None] | None = None,
|
||||
) -> ImportSummary:
|
||||
raise EmbeddingError(
|
||||
"embeddings request to https://user:secret@aipi.reeseapps.com/v1 "
|
||||
|
||||
Reference in New Issue
Block a user