107 lines
3.4 KiB
Python
107 lines
3.4 KiB
Python
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
def check_node_installation():
|
|
print("Checking Node.js and npm installation...")
|
|
try:
|
|
node_version = subprocess.run(
|
|
"node --version",
|
|
shell=True,
|
|
capture_output=True,
|
|
text=True,
|
|
check=True
|
|
).stdout.strip()
|
|
print(f"✓ Node.js {node_version} is installed")
|
|
|
|
npm_version = subprocess.run(
|
|
"npm --version",
|
|
shell=True,
|
|
capture_output=True,
|
|
text=True,
|
|
check=True
|
|
).stdout.strip()
|
|
print(f"✓ npm {npm_version} is installed")
|
|
except subprocess.CalledProcessError:
|
|
print("❌ Node.js and/or npm is not installed!")
|
|
print("Please install Node.js and npm before running this script.")
|
|
print("You can download them from: https://nodejs.org/")
|
|
sys.exit(1)
|
|
|
|
def check_uv_installation():
|
|
print("Checking uv installation...")
|
|
try:
|
|
uv_version = subprocess.run(
|
|
"uv --version",
|
|
shell=True,
|
|
capture_output=True,
|
|
text=True,
|
|
check=True
|
|
).stdout.strip()
|
|
print(f"✓ uv {uv_version} is installed")
|
|
except subprocess.CalledProcessError:
|
|
print("❌ uv is not installed!")
|
|
print("Please install uv before running this script.")
|
|
print("You can download it from: https://docs.astral.sh/uv/getting-started/installation/")
|
|
sys.exit(1)
|
|
|
|
def run_command(command, cwd=None):
|
|
print(f"Running: {command}")
|
|
try:
|
|
process = subprocess.Popen(command, shell=True, cwd=cwd)
|
|
process.wait()
|
|
if process.returncode != 0:
|
|
print(f"Error running command: {command}")
|
|
print(f"Error code: {process.returncode}")
|
|
sys.exit(1)
|
|
except KeyboardInterrupt:
|
|
print("\nReceived interrupt signal. Shutting down...")
|
|
process.terminate()
|
|
process.wait()
|
|
sys.exit(0)
|
|
except Exception as e:
|
|
print(f"Error running command: {command}")
|
|
print(f"Error: {e}")
|
|
sys.exit(1)
|
|
|
|
def main():
|
|
check_node_installation()
|
|
check_uv_installation()
|
|
|
|
project_root = Path(__file__).parent
|
|
static_dir = project_root / "app" / "static"
|
|
|
|
print("Compiling translations...")
|
|
run_command("uv run pybabel compile -d app/translations")
|
|
|
|
print("Running database setup...")
|
|
print("1. Renaming legacy database...")
|
|
run_command("uv run python -m app.legacy_migration.rename_legacy")
|
|
|
|
print("2. Applying alembic migrations...")
|
|
run_command("uv run flask db upgrade")
|
|
|
|
print("3. Importing legacy data...")
|
|
run_command("uv run python -m app.legacy_migration.import_legacy")
|
|
|
|
print("Installing/updating npm dependencies...")
|
|
run_command("npm install", cwd=static_dir)
|
|
|
|
# Start the Tailwind watcher in the background
|
|
print("Starting Tailwind watcher...")
|
|
tailwind_process = subprocess.Popen(
|
|
"./watch-tailwind.sh",
|
|
cwd=static_dir,
|
|
shell=True
|
|
)
|
|
|
|
try:
|
|
print("Starting Flask development server...")
|
|
run_command("uv run flask run --debug")
|
|
finally:
|
|
# Ensure we clean up the Tailwind process when Flask exits
|
|
tailwind_process.terminate()
|
|
tailwind_process.wait()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|