Skip to content

Commit 1a79853

Browse files
authored
feat: add credentials validation for knowledge server (#59)
1 parent 8209c28 commit 1a79853

File tree

2 files changed

+22
-23
lines changed

2 files changed

+22
-23
lines changed

src/datapilot/cli/decorators.py

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,27 @@
33
import re
44
from functools import wraps
55
from pathlib import Path
6+
from typing import Dict
7+
from typing import Optional
68

79
import click
810
from dotenv import load_dotenv
911

1012

11-
def load_config_from_file():
13+
def load_config_from_file() -> Optional[Dict]:
1214
"""Load configuration from ~/.altimate/altimate.json if it exists."""
1315
config_path = Path.home() / ".altimate" / "altimate.json"
1416

1517
if not config_path.exists():
16-
return {}
18+
return None
1719

1820
try:
1921
with config_path.open() as f:
2022
config = json.load(f)
2123
return config
2224
except (OSError, json.JSONDecodeError) as e:
2325
click.echo(f"Warning: Failed to load config from {config_path}: {e}", err=True)
24-
return {}
26+
return None
2527

2628

2729
def substitute_env_vars(value):
@@ -58,30 +60,22 @@ def wrapper(token, instance_name, backend_url, *args, **kwargs):
5860
# Load .env file from current directory if it exists
5961
load_dotenv()
6062

61-
# Load configuration from file
62-
file_config = load_config_from_file()
63-
file_config = process_config(file_config)
64-
65-
# Apply file config first, then override with CLI arguments if provided
6663
final_token = token
6764
final_instance_name = instance_name
6865
final_backend_url = backend_url
6966

70-
# Use file config if CLI argument not provided
71-
if final_token is None and "altimateApiKey" in file_config:
72-
final_token = file_config["altimateApiKey"]
73-
if final_instance_name is None and "altimateInstanceName" in file_config:
74-
final_instance_name = file_config["altimateInstanceName"]
75-
if final_backend_url == "https://api.myaltimate.com" and "altimateUrl" in file_config:
76-
final_backend_url = file_config["altimateUrl"]
77-
78-
# Set defaults if nothing was provided
79-
if final_token is None:
80-
final_token = None
81-
if final_instance_name is None:
82-
final_instance_name = None
83-
if final_backend_url is None:
84-
final_backend_url = "https://api.myaltimate.com"
67+
if final_token is None and final_instance_name is None:
68+
# Try to Load configuration from file if no CLI arguments are provided
69+
file_config = load_config_from_file()
70+
if file_config is not None:
71+
# File config is provided
72+
file_config = process_config(file_config)
73+
if "altimateApiKey" in file_config:
74+
final_token = file_config["altimateApiKey"]
75+
if "altimateInstanceName" in file_config:
76+
final_instance_name = file_config["altimateInstanceName"]
77+
if "altimateUrl" in file_config:
78+
final_backend_url = file_config["altimateUrl"] or final_backend_url
8579

8680
return f(final_token, final_instance_name, final_backend_url, *args, **kwargs)
8781

src/datapilot/core/knowledge/cli.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import click
44

55
from datapilot.cli.decorators import auth_options
6+
from datapilot.clients.altimate.utils import validate_credentials
67

78
from .server import KnowledgeBaseHandler
89

@@ -23,6 +24,10 @@ def serve(token, instance_name, backend_url, port):
2324
)
2425
raise click.Abort
2526

27+
if not validate_credentials(token, backend_url, instance_name):
28+
click.echo("Error: Invalid credentials.", err=True)
29+
raise click.Abort
30+
2631
# Set context data for the handler
2732
KnowledgeBaseHandler.token = token
2833
KnowledgeBaseHandler.instance_name = instance_name

0 commit comments

Comments
 (0)