ghostbase-cli 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
main.py ADDED
@@ -0,0 +1,117 @@
1
+ import sys
2
+ import os
3
+
4
+
5
+ def _load_env_file(path: str) -> dict:
6
+ """Parse a .env file without any external dependency."""
7
+ env: dict = {}
8
+ if not os.path.isfile(path):
9
+ return env
10
+ try:
11
+ with open(path, "r", encoding="utf-8") as fh:
12
+ for line in fh:
13
+ line = line.strip()
14
+ if not line or line.startswith("#") or "=" not in line:
15
+ continue
16
+ key, _, val = line.partition("=")
17
+ key = key.strip()
18
+ val = val.strip().strip('"').strip("'")
19
+ env[key] = val
20
+ except Exception:
21
+ pass
22
+ return env
23
+
24
+
25
+ def parse_args():
26
+ read_only = False
27
+ conn_arg = None
28
+ for a in sys.argv[1:]:
29
+ arg_lower = a.strip().lower()
30
+ if arg_lower in ("-r", "--read-only", "--safe"):
31
+ read_only = True
32
+ elif arg_lower in ("-h", "--help"):
33
+ print("GhostBase 👻 - Terminal Database Studio\n")
34
+ print("Usage:")
35
+ print(" ghostbase (Auto-detect .env or sample.db)")
36
+ print(" ghostbase <db_path_or_url> (Connect to SQLite, Postgres or MySQL)")
37
+ print(" ghostbase --read-only (Launch in Safe Mode)\n")
38
+ print("Keyboard Shortcuts:")
39
+ print(" Ctrl+R Execute query")
40
+ print(" Ctrl+P 1-Key EXPLAIN query plan")
41
+ print(" Ctrl+B Beautify & format SQL query")
42
+ print(" Ctrl+S Toggle Safe Mode / Production Guard")
43
+ print(" Ctrl+N New / clear query")
44
+ print(" Ctrl+I Export results as SQL INSERTs")
45
+ print(" Ctrl+M Export results as Markdown table")
46
+ print(" Ctrl+E Export results as CSV")
47
+ print(" Ctrl+J Export results as JSON")
48
+ print(" Ctrl+F Filter / search tables")
49
+ print(" Ctrl+Up Previous query from history")
50
+ print(" Ctrl+Down Next query from history")
51
+ print(" Ctrl+Q Quit\n")
52
+ sys.exit(0)
53
+ else:
54
+ conn_arg = a.strip()
55
+ return conn_arg, read_only
56
+
57
+
58
+ def detect_connection(cli_arg: str = None) -> str:
59
+ """
60
+ Resolve the database connection string in priority order:
61
+
62
+ 1. Command-line argument (ghostbase mydb.sqlite | ghostbase postgresql://...)
63
+ 2. DATABASE_URL in .env (current working directory)
64
+ 3. DB_HOST + DB_NAME + DB_USER in .env → builds a PostgreSQL URL
65
+ 4. DATABASE_URL environment variable
66
+ 5. Fallback: sample.db (SQLite, inside GhostBase directory)
67
+ """
68
+ if cli_arg:
69
+ return cli_arg
70
+
71
+ # 2 & 3. .env file
72
+ env = _load_env_file(os.path.join(os.getcwd(), ".env"))
73
+
74
+ url = env.get("DATABASE_URL")
75
+ if url:
76
+ return url
77
+
78
+ host = env.get("DB_HOST") or env.get("PGHOST")
79
+ port = env.get("DB_PORT") or env.get("PGPORT") or "5432"
80
+ name = env.get("DB_NAME") or env.get("PGDATABASE")
81
+ user = env.get("DB_USER") or env.get("PGUSER")
82
+ pwd = env.get("DB_PASSWORD") or env.get("PGPASSWORD") or ""
83
+
84
+ if host and name and user:
85
+ return f"postgresql://{user}:{pwd}@{host}:{port}/{name}"
86
+
87
+ # 4. OS environment variable
88
+ url = os.environ.get("DATABASE_URL")
89
+ if url:
90
+ return url
91
+
92
+ # 5. Fallback
93
+ return os.path.join(os.path.dirname(os.path.abspath(__file__)), "sample.db")
94
+
95
+
96
+ def main():
97
+ if sys.platform == "win32":
98
+ try:
99
+ sys.stdout.reconfigure(encoding="utf-8")
100
+ sys.stderr.reconfigure(encoding="utf-8")
101
+ except Exception:
102
+ pass
103
+
104
+ from app import GhostBaseApp
105
+
106
+ conn_arg, read_only = parse_args()
107
+ conn = detect_connection(conn_arg)
108
+ try:
109
+ app = GhostBaseApp(db_path=conn, read_only=read_only)
110
+ app.run()
111
+ except Exception as e:
112
+ print(f"\n[GhostBase Error] Failed to connect to database: {e}\n")
113
+ sys.exit(1)
114
+
115
+
116
+ if __name__ == "__main__":
117
+ main()