refactor: form-core wiring, JWT sessions, slowapi, packaging, frontend rewrite, test declutter
This commit is contained in:
parent
06ab25fb47
commit
03af41e837
74 changed files with 6089 additions and 5183 deletions
|
|
@ -10,7 +10,6 @@ import hashlib
|
|||
import json
|
||||
import os
|
||||
import re
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
FLOWS_GLOB = "*.json"
|
||||
|
|
@ -20,18 +19,32 @@ FLOWS_GLOB = "*.json"
|
|||
#: validated, or shown in the frontend.
|
||||
IGNORE_FILENAME = ".flowsignore"
|
||||
|
||||
# mtime-keyed cache: the watcher re-reads per event, the file rarely changes.
|
||||
_ignore_cache: dict[str, tuple[float, set[str]]] = {}
|
||||
|
||||
|
||||
def ignored_stems(flows_dir: str | Path) -> set[str]:
|
||||
"""Stems excluded from the pipeline (empty when no ignore file)."""
|
||||
key = str(Path(flows_dir))
|
||||
try:
|
||||
mtime = (Path(flows_dir) / IGNORE_FILENAME).stat().st_mtime
|
||||
except OSError:
|
||||
_ignore_cache.pop(key, None)
|
||||
return set()
|
||||
cached = _ignore_cache.get(key)
|
||||
if cached is not None and cached[0] == mtime:
|
||||
return cached[1]
|
||||
try:
|
||||
text = (Path(flows_dir) / IGNORE_FILENAME).read_text(encoding="utf-8")
|
||||
except OSError:
|
||||
return set()
|
||||
return {
|
||||
stems = {
|
||||
line.strip()
|
||||
for line in text.splitlines()
|
||||
if line.strip() and not line.strip().startswith("#")
|
||||
}
|
||||
_ignore_cache[key] = (mtime, stems)
|
||||
return stems
|
||||
|
||||
|
||||
def filename_stem(name: str) -> str:
|
||||
|
|
@ -97,25 +110,16 @@ def find_reuse_path(flows_dir: str | Path, doc: dict) -> tuple[Path | None, bool
|
|||
def write_flow_bytes(target: Path, doc: dict) -> Path:
|
||||
"""Write a flow document to an explicit path atomically (tmp + rename).
|
||||
|
||||
The file ends up world-readable (0o644): mkstemp creates 0o600, which
|
||||
would lock out the other containers (Langflow/LFX run as different
|
||||
users and crash on unreadable seed files).
|
||||
The file ends up world-readable (0o644): atomicwrites follows the
|
||||
umask, which would lock out the other containers (Langflow/LFX run
|
||||
as different users and crash on unreadable seed files).
|
||||
"""
|
||||
from atomicwrites import atomic_write
|
||||
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
fd, tmp_name = tempfile.mkstemp(
|
||||
dir=str(target.parent), prefix=f".{target.stem}-", suffix=".tmp"
|
||||
)
|
||||
try:
|
||||
with os.fdopen(fd, "wb") as tmp:
|
||||
tmp.write(canonical_bytes(doc))
|
||||
os.replace(tmp_name, target)
|
||||
os.chmod(target, 0o644)
|
||||
except BaseException:
|
||||
try:
|
||||
os.unlink(tmp_name)
|
||||
except OSError:
|
||||
pass
|
||||
raise
|
||||
with atomic_write(target, mode="wb", overwrite=True) as tmp:
|
||||
tmp.write(canonical_bytes(doc))
|
||||
os.chmod(target, 0o644)
|
||||
return target
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue