Spaces:
Sleeping
Sleeping
Commit
·
2690221
1
Parent(s):
1171cba
fix(runtime): strip U+FEFF (BOM/ZWNBSP) from Python sources
Browse files- app.py +1 -1
- app/__init__.py +0 -1
- app/api.py +1 -1
- app/metrics.py +1 -1
- app/paths.py +1 -1
- app/rag/__init__.py +0 -1
- app/rag_system.py +1 -1
- app/routes_stats.py +1 -1
- app/schemas.py +1 -1
- app/store.py +1 -1
- app/utils.py +1 -1
- boot.py +1 -1
- fix_api_imports.py +63 -0
- main.py +1 -1
- strip_bom.py +30 -0
app.py
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
-
|
| 2 |
from app.api import app # FastAPI instance
|
| 3 |
|
|
|
|
| 1 |
+
# app.py (repo kГ¶kГјndЙ™)
|
| 2 |
from app.api import app # FastAPI instance
|
| 3 |
|
app/__init__.py
CHANGED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
|
|
|
|
|
|
app/api.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
from app.storage import DATA_DIR, INDEX_DIR, HISTORY_JSON
|
| 2 |
|
| 3 |
-
|
| 4 |
|
| 5 |
|
| 6 |
|
|
|
|
| 1 |
from app.storage import DATA_DIR, INDEX_DIR, HISTORY_JSON
|
| 2 |
|
| 3 |
+
from app.storage import DATA_DIR, INDEX_DIR, HISTORY_JSON
|
| 4 |
|
| 5 |
|
| 6 |
|
app/metrics.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
from datetime import datetime, timedelta, timezone
|
| 3 |
|
| 4 |
class StatsTracker:
|
|
|
|
| 1 |
+
from collections import deque, defaultdict
|
| 2 |
from datetime import datetime, timedelta, timezone
|
| 3 |
|
| 4 |
class StatsTracker:
|
app/paths.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
from pathlib import Path
|
| 3 |
DATA_DIR = Path(os.getenv("DATA_DIR", str(DATA_DIR)))
|
| 4 |
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
| 1 |
+
import os
|
| 2 |
from pathlib import Path
|
| 3 |
DATA_DIR = Path(os.getenv("DATA_DIR", str(DATA_DIR)))
|
| 4 |
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
app/rag/__init__.py
CHANGED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
|
|
|
|
|
|
app/rag_system.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
from __future__ import annotations
|
| 3 |
|
| 4 |
import os
|
|
|
|
| 1 |
+
# app/rag_system.py
|
| 2 |
from __future__ import annotations
|
| 3 |
|
| 4 |
import os
|
app/routes_stats.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
from .metrics import tracker
|
| 3 |
|
| 4 |
router = APIRouter()
|
|
|
|
| 1 |
+
from fastapi import APIRouter
|
| 2 |
from .metrics import tracker
|
| 3 |
|
| 4 |
router = APIRouter()
|
app/schemas.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
from pydantic import BaseModel, Field
|
| 3 |
from typing import Optional, List
|
| 4 |
|
|
|
|
| 1 |
+
# app/schemas.py
|
| 2 |
from pydantic import BaseModel, Field
|
| 3 |
from typing import Optional, List
|
| 4 |
|
app/store.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
from collections import defaultdict
|
| 3 |
from typing import List, Dict
|
| 4 |
|
|
|
|
| 1 |
+
# app/store.py
|
| 2 |
from collections import defaultdict
|
| 3 |
from typing import List, Dict
|
| 4 |
|
app/utils.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
import uuid
|
| 3 |
from fastapi import HTTPException
|
| 4 |
|
|
|
|
| 1 |
+
# app/utils.py
|
| 2 |
import uuid
|
| 3 |
from fastapi import HTTPException
|
| 4 |
|
boot.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
import uvicorn
|
| 3 |
|
| 4 |
candidates = [
|
|
|
|
| 1 |
+
import os, sys, importlib
|
| 2 |
import uvicorn
|
| 3 |
|
| 4 |
candidates = [
|
fix_api_imports.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re, pathlib
|
| 2 |
+
|
| 3 |
+
p = pathlib.Path("app/api.py")
|
| 4 |
+
s = p.read_text(encoding="utf-8")
|
| 5 |
+
lines = s.splitlines()
|
| 6 |
+
|
| 7 |
+
n = len(lines)
|
| 8 |
+
i = 0
|
| 9 |
+
|
| 10 |
+
# --- Shebang / encoding sətirlərini saxla
|
| 11 |
+
header = []
|
| 12 |
+
while i < n and (lines[i].startswith("#!") or re.search(r"coding[:=]\s*[-\w.]+", lines[i])):
|
| 13 |
+
header.append(lines[i]); i += 1
|
| 14 |
+
|
| 15 |
+
# --- Docstring varsa götür (yalnız faylın əvvəlində olanda)
|
| 16 |
+
doc_block = []
|
| 17 |
+
if i < n and re.match(r'^\s*(?P<q>"""|\'\'\')', lines[i]):
|
| 18 |
+
q = '"""' if lines[i].strip().startswith('"""') else "'''"
|
| 19 |
+
doc_block.append(lines[i]); i += 1
|
| 20 |
+
while i < n:
|
| 21 |
+
doc_block.append(lines[i])
|
| 22 |
+
if q in lines[i]:
|
| 23 |
+
i += 1
|
| 24 |
+
break
|
| 25 |
+
i += 1
|
| 26 |
+
|
| 27 |
+
# --- Qalan hissədən __future__ importlarını çək
|
| 28 |
+
future_re = re.compile(r'^\s*from __future__ import ')
|
| 29 |
+
futures, rest = [], []
|
| 30 |
+
for ln in lines[i:]:
|
| 31 |
+
if future_re.match(ln):
|
| 32 |
+
futures.append(ln.rstrip())
|
| 33 |
+
else:
|
| 34 |
+
rest.append(ln)
|
| 35 |
+
|
| 36 |
+
# unikallaşdır
|
| 37 |
+
seen = set(); futures = [x for x in futures if not (x in seen or seen.add(x))]
|
| 38 |
+
|
| 39 |
+
# --- Köhnə storage importlarını təmizlə
|
| 40 |
+
rest = [ln for ln in rest if not re.match(r'^\s*from app\.storage import ', ln)]
|
| 41 |
+
|
| 42 |
+
storage_line = 'from app.storage import DATA_DIR, INDEX_DIR, HISTORY_JSON'
|
| 43 |
+
|
| 44 |
+
out = []
|
| 45 |
+
out += header
|
| 46 |
+
if header and (doc_block or futures or storage_line): out.append('')
|
| 47 |
+
out += doc_block
|
| 48 |
+
if doc_block and (futures or storage_line): out.append('')
|
| 49 |
+
out += futures
|
| 50 |
+
if futures: out.append(storage_line)
|
| 51 |
+
else:
|
| 52 |
+
# futures yoxdursa, storage-ı docstringdən sonra qoyuruq
|
| 53 |
+
if doc_block: out.append(storage_line)
|
| 54 |
+
else: out.append(storage_line)
|
| 55 |
+
# importlardan sonra boş sətir
|
| 56 |
+
out.append('')
|
| 57 |
+
|
| 58 |
+
# qalan hissə
|
| 59 |
+
out += rest
|
| 60 |
+
|
| 61 |
+
txt = '\n'.join(out).rstrip() + '\n'
|
| 62 |
+
p.write_text(txt, encoding="utf-8")
|
| 63 |
+
print("OK: rearranged", p)
|
main.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
|
| 2 |
from fastapi import Form
|
| 3 |
|
| 4 |
@app.post("/generate")
|
|
|
|
| 1 |
+
# --- ADD: /generate alias for compatibility ---
|
| 2 |
from fastapi import Form
|
| 3 |
|
| 4 |
@app.post("/generate")
|
strip_bom.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pathlib
|
| 2 |
+
|
| 3 |
+
def clean_file(path: pathlib.Path):
|
| 4 |
+
b = path.read_bytes()
|
| 5 |
+
# BOM-u (əgər faylın əvvəlindədirsə) kənarlaşdırmaq üçün utf-8-sig ilə oxu
|
| 6 |
+
try:
|
| 7 |
+
s = b.decode("utf-8-sig")
|
| 8 |
+
except UnicodeDecodeError:
|
| 9 |
+
s = b.decode("utf-8", errors="ignore")
|
| 10 |
+
changed = False
|
| 11 |
+
if "\ufeff" in s: # sətir içi FEFF-ləri də sil
|
| 12 |
+
s = s.replace("\ufeff", "")
|
| 13 |
+
changed = True
|
| 14 |
+
# Əgər başlanğıcda BOM vardısa, utf-8-sig artıq onu çıxarıb; yazarkən BOMsuz yaz
|
| 15 |
+
if changed or b[:3] == b"\xef\xbb\xbf":
|
| 16 |
+
path.write_text(s, encoding="utf-8", newline="\n")
|
| 17 |
+
print(f"cleaned: {path}")
|
| 18 |
+
return 1
|
| 19 |
+
return 0
|
| 20 |
+
|
| 21 |
+
changed = 0
|
| 22 |
+
# app/ altındakı bütün .py fayllar
|
| 23 |
+
for p in pathlib.Path("app").rglob("*.py"):
|
| 24 |
+
changed += clean_file(p)
|
| 25 |
+
|
| 26 |
+
# kökdə .py varsa, onları da yoxla (opsional)
|
| 27 |
+
for p in pathlib.Path(".").glob("*.py"):
|
| 28 |
+
changed += clean_file(p)
|
| 29 |
+
|
| 30 |
+
print("total_changed:", changed)
|