diff --git a/setup.py b/setup.py index 63b5e96..371cffc 100644 --- a/setup.py +++ b/setup.py @@ -15,39 +15,46 @@ from web.utils import get_mysql_config cmd = sys.argv[1] if len(sys.argv) > 1 else "help" -if cmd == "mysql-init": - cfg = get_mysql_config() - root_url = f"mysql+pymysql://{cfg['user']}:{cfg['password']}@{cfg['host']}:{cfg['port']}/" - dbname = cfg["database"] - root_engine = create_engine(root_url, future=True) - with root_engine.begin() as conn: - conn.execute(text( - f"CREATE DATABASE IF NOT EXISTS `{dbname}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")) - mysql_url = f"mysql+pymysql://{cfg['user']}:{cfg['password']}@{cfg['host']}:{cfg['port']}/{dbname}?charset=utf8mb4" - mysql_engine = create_engine(mysql_url, future=True) - from web.db import Base - Base.metadata.create_all(mysql_engine) - print("MySQL database and tables ensured") -elif cmd == "counts": - cfg = get_mysql_config() - url = f"mysql+pymysql://{cfg['user']}:{cfg['password']}@{cfg['host']}:{cfg['port']}/{cfg['database']}?charset=utf8mb4" - engine = create_engine(url, future=True) - with engine.begin() as conn: - for table in [ - "users", - "regions", - "keywords", - "user_regions", - "user_keywords", - "job_listings", - "job_descriptions", - "cached_pages", - "user_interactions", - ]: - try: - n = conn.execute(text(f"SELECT COUNT(*) FROM {table}")) - print(f"{table}: {list(n)[0][0]}") - except Exception as e: - print(f"{table}: error {e}") -else: - print(__doc__) +try: + if cmd == "mysql-init": + cfg = get_mysql_config() + root_url = f"mysql+pymysql://{cfg['user']}:{cfg['password']}@{cfg['host']}:{cfg['port']}/" + dbname = cfg["database"] + root_engine = create_engine(root_url, future=True) + with root_engine.begin() as conn: + conn.execute(text( + f"CREATE DATABASE IF NOT EXISTS `{dbname}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")) + mysql_url = f"mysql+pymysql://{cfg['user']}:{cfg['password']}@{cfg['host']}:{cfg['port']}/{dbname}?charset=utf8mb4" + mysql_engine = create_engine(mysql_url, future=True) + from web.db import Base + Base.metadata.create_all(mysql_engine) + print("MySQL database and tables ensured") + sys.exit(0) + elif cmd == "counts": + cfg = get_mysql_config() + url = f"mysql+pymysql://{cfg['user']}:{cfg['password']}@{cfg['host']}:{cfg['port']}/{cfg['database']}?charset=utf8mb4" + engine = create_engine(url, future=True) + with engine.begin() as conn: + for table in [ + "users", + "regions", + "keywords", + "user_regions", + "user_keywords", + "job_listings", + "job_descriptions", + "cached_pages", + "user_interactions", + ]: + try: + n = conn.execute(text(f"SELECT COUNT(*) FROM {table}")) + print(f"{table}: {list(n)[0][0]}") + except Exception as e: + print(f"{table}: error {e}") + sys.exit(0) + else: + print(__doc__) + sys.exit(0) +except Exception as e: + print(f"Error: {e}") + sys.exit(1) diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..54672d8 --- /dev/null +++ b/setup.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# Robust Debian-compatible setup script for the jobs web app +set -euo pipefail + +PY=python3 +if ! command -v ${PY} >/dev/null 2>&1; then + echo "python3 not found; try installing python3 and rerun this script" + exit 2 +fi + +echo "Creating virtualenv .venv" +${PY} -m venv .venv + +echo "Activating virtualenv" +# shellcheck disable=SC1091 +source .venv/bin/activate + +echo "Upgrading pip and installing requirements" +pip install --upgrade pip setuptools wheel || true +if ! pip install -r requirements.txt; then + echo "pip install failed; inspect output above. Continuing to allow manual fixes." +fi + +echo "Ensuring DB schema (if configured). Running: python setup.py mysql-init" +if ! python setup.py mysql-init; then + echo "setup.py mysql-init failed — check MySQL settings in config/settings.json" + # don't fail the whole script; the DB step is optional for local dev without MySQL +fi + +echo "Setup complete. To activate the venv in this shell: source .venv/bin/activate"