#!/usr/bin/env python3 """Wiki dev test. Starts the wiki edit sidecar + Astro dev server pointing at the bincio_activity dev database so both apps share the same users. Prerequisites: Run bincio_activity's dev_test.py first to create the shared DB: cd ~/src/bincio_activity uv run python scripts/dev_test.py --fresh Run from the bincio_wiki project root: uv run python scripts/dev_test.py [--wiki-only] Options: --wiki-only Add a wiki-only user (no activity access) to test that path Credentials (same as bincio_activity dev): dave / testpass (admin, wiki + activity) brut / testpass (wiki + activity) wiki_user / testpass (wiki only, if --wiki-only is used) URL: http://localhost:4321 """ import argparse import os import platform import resource import subprocess import sys from pathlib import Path PROJECT_DIR = Path(__file__).resolve().parent.parent ACTIVITY_DIR = PROJECT_DIR.parent / "bincio_activity" SHARED_DB = Path("/tmp/bincio_dev_test/instance.db") PASSWORD = "testpass" def section(msg: str) -> None: print(f"\n\033[1;36m▸ {msg}\033[0m") def ok(msg: str) -> None: print(f" \033[32m✓\033[0m {msg}") def warn(msg: str) -> None: print(f" \033[33m·\033[0m {msg}") def err(msg: str) -> None: print(f" \033[31m✗\033[0m {msg}", file=sys.stderr) def check_shared_db() -> None: section("Checking shared DB") if not SHARED_DB.exists(): err(f"Shared DB not found at {SHARED_DB}") err("Run bincio_activity's dev_test.py first:") err(f" cd {ACTIVITY_DIR}") err(" uv run python scripts/dev_test.py --fresh") sys.exit(1) ok(f"Found {SHARED_DB}") def add_wiki_only_user() -> None: section("Adding wiki-only test user") sys.path.insert(0, str(ACTIVITY_DIR)) from bincio.serve.db import open_db, get_user, create_user db = open_db(SHARED_DB.parent) if get_user(db, "wiki_user"): warn("user 'wiki_user' already exists — skipping") else: create_user(db, "wiki_user", "Wiki User", PASSWORD, is_admin=False, wiki_access=True, activity_access=False) ok("wiki-only user 'wiki_user' created") def start_dev() -> None: section("Starting wiki dev server") print() print(" \033[1mCredentials\033[0m") print(f" dave / {PASSWORD} (admin, wiki + activity)") print(f" brut / {PASSWORD} (wiki + activity)") print() print(" \033[1mURL\033[0m http://localhost:4321") print() print(" Press Ctrl+C to stop.\n") env = os.environ.copy() env["SHARED_DB_PATH"] = str(SHARED_DB) try: subprocess.run( ["bash", "scripts/dev.sh", "--edit"], cwd=PROJECT_DIR, env=env, ) except KeyboardInterrupt: pass def raise_open_file_limit() -> None: if platform.system() != "Darwin": return target = 65536 soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) if soft < target: resource.setrlimit(resource.RLIMIT_NOFILE, (min(target, hard), hard)) ok(f"open-file limit raised to {min(target, hard)}") def main() -> None: parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("--wiki-only", action="store_true", help="Add a wiki-only user (no activity access) for testing") args = parser.parse_args() raise_open_file_limit() print(f"\033[1mbincio_wiki dev test\033[0m → shared DB: {SHARED_DB}") check_shared_db() if args.wiki_only: add_wiki_only_user() start_dev() if __name__ == "__main__": main()