refactor: split cli.py into package (ref.md 3.7)
This commit is contained in:
@@ -0,0 +1,267 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
from devplacepy.database import get_table
|
||||
from devplacepy.cli._shared import _audit_cli
|
||||
|
||||
|
||||
def _remove_zip_artifacts(job):
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
from devplacepy.services.jobs.zip_service import STAGING_DIR
|
||||
|
||||
local_path = (job.get("result") or {}).get("local_path")
|
||||
if local_path:
|
||||
Path(local_path).unlink(missing_ok=True)
|
||||
shutil.rmtree(STAGING_DIR / job["uid"], ignore_errors=True)
|
||||
|
||||
|
||||
def cmd_zips_prune(args):
|
||||
from datetime import datetime, timezone
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
now = datetime.now(timezone.utc)
|
||||
removed = 0
|
||||
for job in queue.list_jobs(kind="zip", status=queue.DONE):
|
||||
expires_at = job.get("expires_at")
|
||||
if not expires_at:
|
||||
continue
|
||||
try:
|
||||
expiry = datetime.fromisoformat(expires_at)
|
||||
except (ValueError, TypeError):
|
||||
continue
|
||||
if expiry < now:
|
||||
_remove_zip_artifacts(job)
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
removed += 1
|
||||
_audit_cli("cli.zips.prune", f"CLI pruned {removed} expired zip jobs", metadata={"count": removed})
|
||||
print(f"Pruned {removed} expired zip job(s)")
|
||||
|
||||
|
||||
def cmd_zips_clear(args):
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
jobs = queue.list_jobs(kind="zip")
|
||||
for job in jobs:
|
||||
_remove_zip_artifacts(job)
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
_audit_cli("cli.zips.clear", f"CLI cleared all zip jobs ({len(jobs)})", metadata={"count": len(jobs)})
|
||||
print(f"Cleared {len(jobs)} zip job(s) and their archives")
|
||||
|
||||
|
||||
def cmd_forks_prune(args):
|
||||
from datetime import datetime, timezone
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
now = datetime.now(timezone.utc)
|
||||
removed = 0
|
||||
for job in queue.list_jobs(kind="fork", status=queue.DONE):
|
||||
expires_at = job.get("expires_at")
|
||||
if not expires_at:
|
||||
continue
|
||||
try:
|
||||
expiry = datetime.fromisoformat(expires_at)
|
||||
except (ValueError, TypeError):
|
||||
continue
|
||||
if expiry < now:
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
removed += 1
|
||||
_audit_cli("cli.forks.prune", f"CLI pruned {removed} expired fork jobs", metadata={"count": removed})
|
||||
print(f"Pruned {removed} expired fork job(s)")
|
||||
|
||||
|
||||
def cmd_forks_clear(args):
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
jobs = queue.list_jobs(kind="fork")
|
||||
for job in jobs:
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
_audit_cli("cli.forks.clear", f"CLI cleared all fork jobs ({len(jobs)})", metadata={"count": len(jobs)})
|
||||
print(f"Cleared {len(jobs)} fork job(s)")
|
||||
|
||||
|
||||
def _remove_seo_artifacts(job):
|
||||
import shutil
|
||||
from devplacepy.config import SEO_REPORTS_DIR
|
||||
|
||||
shutil.rmtree(SEO_REPORTS_DIR / job["uid"], ignore_errors=True)
|
||||
|
||||
|
||||
def cmd_seo_prune(args):
|
||||
from datetime import datetime, timezone
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
now = datetime.now(timezone.utc)
|
||||
removed = 0
|
||||
for job in queue.list_jobs(kind="seo", status=queue.DONE):
|
||||
expires_at = job.get("expires_at")
|
||||
if not expires_at:
|
||||
continue
|
||||
try:
|
||||
expiry = datetime.fromisoformat(expires_at)
|
||||
except (ValueError, TypeError):
|
||||
continue
|
||||
if expiry < now:
|
||||
_remove_seo_artifacts(job)
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
removed += 1
|
||||
_audit_cli("cli.seo.prune", f"CLI pruned {removed} expired SEO jobs", metadata={"count": removed})
|
||||
print(f"Pruned {removed} expired SEO audit(s)")
|
||||
|
||||
|
||||
def cmd_seo_clear(args):
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
jobs = queue.list_jobs(kind="seo")
|
||||
for job in jobs:
|
||||
_remove_seo_artifacts(job)
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
_audit_cli("cli.seo.clear", f"CLI cleared all SEO jobs ({len(jobs)})", metadata={"count": len(jobs)})
|
||||
print(f"Cleared {len(jobs)} SEO audit(s) and their reports")
|
||||
|
||||
|
||||
def cmd_seo_meta_prune(args):
|
||||
from datetime import datetime, timezone
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
now = datetime.now(timezone.utc)
|
||||
removed = 0
|
||||
for job in queue.list_jobs(kind="seo_meta", status=queue.DONE):
|
||||
expires_at = job.get("expires_at")
|
||||
if not expires_at:
|
||||
continue
|
||||
try:
|
||||
expiry = datetime.fromisoformat(expires_at)
|
||||
except (ValueError, TypeError):
|
||||
continue
|
||||
if expiry < now:
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
removed += 1
|
||||
_audit_cli(
|
||||
"cli.seo_meta.prune",
|
||||
f"CLI pruned {removed} expired SEO metadata jobs",
|
||||
metadata={"count": removed},
|
||||
)
|
||||
print(f"Pruned {removed} expired SEO metadata job(s)")
|
||||
|
||||
|
||||
def cmd_seo_meta_clear(args):
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
jobs = queue.list_jobs(kind="seo_meta")
|
||||
for job in jobs:
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
_audit_cli(
|
||||
"cli.seo_meta.clear",
|
||||
f"CLI cleared all SEO metadata jobs ({len(jobs)})",
|
||||
metadata={"count": len(jobs)},
|
||||
)
|
||||
print(f"Cleared {len(jobs)} SEO metadata job(s); generated metadata persists")
|
||||
|
||||
|
||||
def _remove_deepsearch_artifacts(job):
|
||||
import shutil
|
||||
from devplacepy.config import DEEPSEARCH_DIR
|
||||
from devplacepy.services.deepsearch.store import VectorStore
|
||||
|
||||
uid = job["uid"]
|
||||
collection = f"ds_{uid.replace('-', '')}"
|
||||
VectorStore(collection).drop()
|
||||
shutil.rmtree(DEEPSEARCH_DIR / uid, ignore_errors=True)
|
||||
|
||||
|
||||
def cmd_deepsearch_prune(args):
|
||||
from datetime import datetime, timezone
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
now = datetime.now(timezone.utc)
|
||||
removed = 0
|
||||
for job in queue.list_jobs(kind="deepsearch", status=queue.DONE):
|
||||
expires_at = job.get("expires_at")
|
||||
if not expires_at:
|
||||
continue
|
||||
try:
|
||||
expiry = datetime.fromisoformat(expires_at)
|
||||
except (ValueError, TypeError):
|
||||
continue
|
||||
if expiry < now:
|
||||
_remove_deepsearch_artifacts(job)
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
removed += 1
|
||||
_audit_cli(
|
||||
"cli.deepsearch.prune",
|
||||
f"CLI pruned {removed} expired DeepSearch jobs",
|
||||
metadata={"count": removed},
|
||||
)
|
||||
print(f"Pruned {removed} expired DeepSearch job(s)")
|
||||
|
||||
|
||||
def cmd_deepsearch_clear(args):
|
||||
from devplacepy.services.jobs import queue
|
||||
|
||||
jobs = queue.list_jobs(kind="deepsearch")
|
||||
for job in jobs:
|
||||
_remove_deepsearch_artifacts(job)
|
||||
get_table("jobs").delete(uid=job["uid"])
|
||||
_audit_cli(
|
||||
"cli.deepsearch.clear",
|
||||
f"CLI cleared all DeepSearch jobs ({len(jobs)})",
|
||||
metadata={"count": len(jobs)},
|
||||
)
|
||||
print(f"Cleared {len(jobs)} DeepSearch job(s) and their collections")
|
||||
|
||||
|
||||
def register_jobs(subparsers):
|
||||
zips = subparsers.add_parser("zips", help="Zip archive job management")
|
||||
zips_sub = zips.add_subparsers(title="action", dest="action")
|
||||
zips_prune = zips_sub.add_parser(
|
||||
"prune", help="Delete expired zip archives and their job rows"
|
||||
)
|
||||
zips_prune.set_defaults(func=cmd_zips_prune)
|
||||
zips_clear = zips_sub.add_parser(
|
||||
"clear", help="Delete every zip archive and job row"
|
||||
)
|
||||
zips_clear.set_defaults(func=cmd_zips_clear)
|
||||
|
||||
forks = subparsers.add_parser("forks", help="Fork job management")
|
||||
forks_sub = forks.add_subparsers(title="action", dest="action")
|
||||
forks_prune = forks_sub.add_parser(
|
||||
"prune", help="Delete expired completed fork job rows (forked projects persist)"
|
||||
)
|
||||
forks_prune.set_defaults(func=cmd_forks_prune)
|
||||
forks_clear = forks_sub.add_parser(
|
||||
"clear", help="Delete every fork job row (forked projects persist)"
|
||||
)
|
||||
forks_clear.set_defaults(func=cmd_forks_clear)
|
||||
|
||||
seo = subparsers.add_parser("seo", help="SEO Diagnostics job management")
|
||||
seo_sub = seo.add_subparsers(title="action", dest="action")
|
||||
seo_prune = seo_sub.add_parser(
|
||||
"prune", help="Delete expired SEO audit reports and their job rows"
|
||||
)
|
||||
seo_prune.set_defaults(func=cmd_seo_prune)
|
||||
seo_clear = seo_sub.add_parser(
|
||||
"clear", help="Delete every SEO audit report and job row"
|
||||
)
|
||||
seo_clear.set_defaults(func=cmd_seo_clear)
|
||||
|
||||
seo_meta = subparsers.add_parser("seo-meta", help="SEO metadata job management")
|
||||
seo_meta_sub = seo_meta.add_subparsers(title="action", dest="action")
|
||||
seo_meta_prune = seo_meta_sub.add_parser(
|
||||
"prune", help="Delete expired SEO metadata job rows (generated metadata persists)"
|
||||
)
|
||||
seo_meta_prune.set_defaults(func=cmd_seo_meta_prune)
|
||||
seo_meta_clear = seo_meta_sub.add_parser(
|
||||
"clear", help="Delete every SEO metadata job row (generated metadata persists)"
|
||||
)
|
||||
seo_meta_clear.set_defaults(func=cmd_seo_meta_clear)
|
||||
|
||||
deepsearch = subparsers.add_parser("deepsearch", help="DeepSearch job management")
|
||||
deepsearch_sub = deepsearch.add_subparsers(title="action", dest="action")
|
||||
deepsearch_prune = deepsearch_sub.add_parser(
|
||||
"prune", help="Delete expired DeepSearch sessions and their job rows"
|
||||
)
|
||||
deepsearch_prune.set_defaults(func=cmd_deepsearch_prune)
|
||||
deepsearch_clear = deepsearch_sub.add_parser(
|
||||
"clear", help="Delete every DeepSearch session and job row"
|
||||
)
|
||||
deepsearch_clear.set_defaults(func=cmd_deepsearch_clear)
|
||||
Reference in New Issue
Block a user