import spaces
import gradio as gr
import time
import threading
import logging
from main import run_repository_ranking # Your repository ranking function
# ---------------------------
# Global Logging Buffer Setup
# ---------------------------
LOG_BUFFER = []
LOG_BUFFER_LOCK = threading.Lock()
class BufferLogHandler(logging.Handler):
def emit(self, record):
log_entry = self.format(record)
with LOG_BUFFER_LOCK:
LOG_BUFFER.append(log_entry)
root_logger = logging.getLogger()
if not any(isinstance(h, BufferLogHandler) for h in root_logger.handlers):
handler = BufferLogHandler()
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
root_logger.addHandler(handler)
def filter_logs(logs):
filtered = []
last_was_fetching = False
for log in logs:
if "HTTP Request:" in log:
if not last_was_fetching:
filtered.append("Fetching repositories...")
last_was_fetching = True
else:
filtered.append(log)
last_was_fetching = False
return filtered
def parse_result_to_html(raw_result: str) -> str:
"""
Parses the raw string output from run_repository_ranking to an HTML table.
Only the top 10 results are displayed.
"""
entries = raw_result.strip().split("Final Rank:")
# Only use the first 10 entries (if available)
entries = entries[1:11]
if not entries:
return "
No repositories found for your query.
"
html = """
Rank
Title
Link
Combined Score
"""
for entry in entries:
lines = entry.strip().split("\n")
data = {}
data["Final Rank"] = lines[0].strip() if lines else ""
for line in lines[1:]:
if ": " in line:
key, val = line.split(": ", 1)
data[key.strip()] = val.strip()
html += f"""