49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
# SPDX-FileCopyrightText: 2026 Art Sea LLC
|
|
#
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
from multiprocessing.queues import Queue
|
|
|
|
from band_aider.ui.dto.log_message import LogMessageDTO
|
|
|
|
|
|
class QueueTextWriter:
|
|
"""QueueTextWriter turns worker stream writes into log DTOs."""
|
|
|
|
def __init__(self, queue: Queue, logger_name: str, level: str = "INFO") -> None:
|
|
self.queue = queue
|
|
self.logger_name = logger_name
|
|
self.level = level
|
|
self._buffer = ""
|
|
|
|
def write(self, text: str) -> int:
|
|
if not text:
|
|
return 0
|
|
self._buffer += text
|
|
while "\n" in self._buffer:
|
|
line, self._buffer = self._buffer.split("\n", 1)
|
|
self._publish(line)
|
|
return len(text)
|
|
|
|
def flush(self) -> None:
|
|
if self._buffer:
|
|
self._publish(self._buffer)
|
|
self._buffer = ""
|
|
|
|
def isatty(self) -> bool:
|
|
return False
|
|
|
|
def _publish(self, line: str) -> None:
|
|
if not line.strip():
|
|
return
|
|
self.queue.put(
|
|
LogMessageDTO(
|
|
created=time.time(),
|
|
level=self.level,
|
|
logger_name=self.logger_name,
|
|
message=line,
|
|
)
|
|
)
|