Files
Autoparts-DB/console/main.py
consultoria-as 2c6b6e0160 fix(console): fix PostgreSQL connection + add Metabase Actions guide
- Fix console/main.py: import DB_URL instead of missing DB_PATH
- Add sqlalchemy text() import for connection test
- Replace file-exists check with actual PostgreSQL connection test
- Mask password in startup banner
- Add docs/METABASE_ACTIONS.md: complete guide for data entry via
  Metabase Actions (models, forms, dashboard layout, workflows)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 05:52:12 +00:00

114 lines
3.0 KiB
Python

"""
Entry point for the NEXUS AUTOPARTS Pick/VT220-style console application.
Usage:
python -m console # via package
python -m console.main # via module
python console/main.py # direct
"""
import argparse
import sys
from sqlalchemy import text
from console.config import VERSION, APP_NAME, APP_SUBTITLE, DB_URL
def parse_args(argv=None):
"""Parse command-line arguments."""
parser = argparse.ArgumentParser(
prog=APP_NAME.lower(),
description=f"{APP_NAME} - {APP_SUBTITLE}",
)
parser.add_argument(
"--version",
action="version",
version=f"{APP_NAME} {VERSION}",
)
parser.add_argument(
"--db",
default=DB_URL,
help="PostgreSQL connection URL (default: from config)",
)
return parser.parse_args(argv)
def _print_banner(db_url):
"""Print a startup banner before entering terminal mode."""
# Mask password in display
display_url = db_url
if '@' in db_url:
pre_at = db_url.split('@')[0]
post_at = db_url.split('@', 1)[1]
if ':' in pre_at.split('//')[-1]:
user = pre_at.split('//')[-1].split(':')[0]
display_url = f"postgresql://{user}:****@{post_at}"
border = "=" * 58
print(border)
print(f" {APP_NAME} v{VERSION}")
print(f" {APP_SUBTITLE}")
print(border)
print(f" DB : {display_url}")
print(border)
print()
def main(argv=None):
"""Main entry point: parse args, set up renderer, DB, and launch the app."""
args = parse_args(argv)
db_url = args.db
# Lazy imports so the module can be loaded without curses available
# (e.g. during tests or when just checking --version).
from console.db import Database
from console.renderers.curses_renderer import CursesRenderer
from console.core.app import App
# Print startup banner
_print_banner(db_url)
# Test database connection before entering curses mode
db = Database(db_url)
try:
db._get_engine()
session = db._session()
session.execute(text("SELECT 1"))
session.close()
except Exception as e:
print(
f"Error: Cannot connect to database.\n"
f"\n"
f" URL: {db_url}\n"
f" Error: {e}\n"
f"\n"
f"Make sure PostgreSQL is running and the connection URL is correct.\n"
f"You can specify a custom URL with the --db flag:\n"
f"\n"
f" python -m console --db postgresql://user:pass@host/dbname\n",
file=sys.stderr,
)
sys.exit(1)
renderer = CursesRenderer()
app = App(renderer=renderer, db=db)
try:
app.run()
except KeyboardInterrupt:
pass
except Exception as e:
# Ensure terminal is restored before printing the traceback
try:
renderer.cleanup()
except Exception:
pass
print(f"\nError: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()