Skip to content

Commit a3a1e89

Browse files
committed
Refactor: Move Redis URI parsing functions to config.py
- Move parse_redis_uri() and set_redis_env_from_config() from main.py to config.py - These functions belong in config.py as they handle configuration logic - Clean up main.py by removing configuration-related code - Import functions from config.py in main.py - Maintain all functionality while improving code organization
1 parent f895ea4 commit a3a1e89

File tree

2 files changed

+84
-85
lines changed

2 files changed

+84
-85
lines changed

src/common/config.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from dotenv import load_dotenv
22
import os
3+
import urllib.parse
34

45
load_dotenv()
56

@@ -21,3 +22,85 @@
2122
"db": int(os.getenv('REDIS_DB', 0))}
2223

2324

25+
def parse_redis_uri(uri: str) -> dict:
26+
"""Parse a Redis URI and return connection parameters."""
27+
parsed = urllib.parse.urlparse(uri)
28+
29+
config = {}
30+
31+
# Scheme determines SSL
32+
if parsed.scheme == 'rediss':
33+
config['ssl'] = True
34+
elif parsed.scheme == 'redis':
35+
config['ssl'] = False
36+
else:
37+
raise ValueError(f"Unsupported scheme: {parsed.scheme}")
38+
39+
# Host and port
40+
config['host'] = parsed.hostname or '127.0.0.1'
41+
config['port'] = parsed.port or 6379
42+
43+
# Database
44+
if parsed.path and parsed.path != '/':
45+
try:
46+
config['db'] = int(parsed.path.lstrip('/'))
47+
except ValueError:
48+
config['db'] = 0
49+
else:
50+
config['db'] = 0
51+
52+
# Authentication
53+
if parsed.username:
54+
config['username'] = parsed.username
55+
if parsed.password:
56+
config['password'] = parsed.password
57+
58+
# Parse query parameters for SSL and other options
59+
if parsed.query:
60+
query_params = urllib.parse.parse_qs(parsed.query)
61+
62+
# Handle SSL parameters
63+
if 'ssl_cert_reqs' in query_params:
64+
config['ssl_cert_reqs'] = query_params['ssl_cert_reqs'][0]
65+
if 'ssl_ca_certs' in query_params:
66+
config['ssl_ca_certs'] = query_params['ssl_ca_certs'][0]
67+
if 'ssl_ca_path' in query_params:
68+
config['ssl_ca_path'] = query_params['ssl_ca_path'][0]
69+
if 'ssl_keyfile' in query_params:
70+
config['ssl_keyfile'] = query_params['ssl_keyfile'][0]
71+
if 'ssl_certfile' in query_params:
72+
config['ssl_certfile'] = query_params['ssl_certfile'][0]
73+
74+
# Handle other parameters
75+
if 'db' in query_params:
76+
try:
77+
config['db'] = int(query_params['db'][0])
78+
except ValueError:
79+
pass
80+
81+
return config
82+
83+
84+
def set_redis_env_from_config(config: dict):
85+
"""Set environment variables from Redis configuration."""
86+
env_mapping = {
87+
'host': 'REDIS_HOST',
88+
'port': 'REDIS_PORT',
89+
'db': 'REDIS_DB',
90+
'username': 'REDIS_USERNAME',
91+
'password': 'REDIS_PWD',
92+
'ssl': 'REDIS_SSL',
93+
'ssl_ca_path': 'REDIS_SSL_CA_PATH',
94+
'ssl_keyfile': 'REDIS_SSL_KEYFILE',
95+
'ssl_certfile': 'REDIS_SSL_CERTFILE',
96+
'ssl_cert_reqs': 'REDIS_SSL_CERT_REQS',
97+
'ssl_ca_certs': 'REDIS_SSL_CA_CERTS',
98+
'cluster_mode': 'REDIS_CLUSTER_MODE'
99+
}
100+
101+
for key, env_var in env_mapping.items():
102+
if key in config:
103+
value = config[key]
104+
if isinstance(value, bool):
105+
value = 'true' if value else 'false'
106+
os.environ[env_var] = str(value)

src/main.py

Lines changed: 1 addition & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import sys
22
import os
3-
import urllib.parse
43
import click
54

65
from src.common.connection import RedisConnectionManager
@@ -16,7 +15,7 @@
1615
import src.tools.set
1716
import src.tools.stream
1817
import src.tools.pub_sub
19-
from src.common.config import MCP_TRANSPORT
18+
from src.common.config import MCP_TRANSPORT, parse_redis_uri, set_redis_env_from_config
2019

2120

2221
class RedisMCPServer:
@@ -26,89 +25,6 @@ def __init__(self):
2625
def run(self):
2726
mcp.run(transport=MCP_TRANSPORT)
2827

29-
def parse_redis_uri(uri: str) -> dict:
30-
"""Parse a Redis URI and return connection parameters."""
31-
parsed = urllib.parse.urlparse(uri)
32-
33-
config = {}
34-
35-
# Scheme determines SSL
36-
if parsed.scheme == 'rediss':
37-
config['ssl'] = True
38-
elif parsed.scheme == 'redis':
39-
config['ssl'] = False
40-
else:
41-
raise ValueError(f"Unsupported scheme: {parsed.scheme}")
42-
43-
# Host and port
44-
config['host'] = parsed.hostname or '127.0.0.1'
45-
config['port'] = parsed.port or 6379
46-
47-
# Database
48-
if parsed.path and parsed.path != '/':
49-
try:
50-
config['db'] = int(parsed.path.lstrip('/'))
51-
except ValueError:
52-
config['db'] = 0
53-
else:
54-
config['db'] = 0
55-
56-
# Authentication
57-
if parsed.username:
58-
config['username'] = parsed.username
59-
if parsed.password:
60-
config['password'] = parsed.password
61-
62-
# Parse query parameters for SSL and other options
63-
if parsed.query:
64-
query_params = urllib.parse.parse_qs(parsed.query)
65-
66-
# Handle SSL parameters
67-
if 'ssl_cert_reqs' in query_params:
68-
config['ssl_cert_reqs'] = query_params['ssl_cert_reqs'][0]
69-
if 'ssl_ca_certs' in query_params:
70-
config['ssl_ca_certs'] = query_params['ssl_ca_certs'][0]
71-
if 'ssl_ca_path' in query_params:
72-
config['ssl_ca_path'] = query_params['ssl_ca_path'][0]
73-
if 'ssl_keyfile' in query_params:
74-
config['ssl_keyfile'] = query_params['ssl_keyfile'][0]
75-
if 'ssl_certfile' in query_params:
76-
config['ssl_certfile'] = query_params['ssl_certfile'][0]
77-
78-
# Handle other parameters
79-
if 'db' in query_params:
80-
try:
81-
config['db'] = int(query_params['db'][0])
82-
except ValueError:
83-
pass
84-
85-
return config
86-
87-
88-
def set_redis_env_from_config(config: dict):
89-
"""Set environment variables from Redis configuration."""
90-
env_mapping = {
91-
'host': 'REDIS_HOST',
92-
'port': 'REDIS_PORT',
93-
'db': 'REDIS_DB',
94-
'username': 'REDIS_USERNAME',
95-
'password': 'REDIS_PWD',
96-
'ssl': 'REDIS_SSL',
97-
'ssl_ca_path': 'REDIS_SSL_CA_PATH',
98-
'ssl_keyfile': 'REDIS_SSL_KEYFILE',
99-
'ssl_certfile': 'REDIS_SSL_CERTFILE',
100-
'ssl_cert_reqs': 'REDIS_SSL_CERT_REQS',
101-
'ssl_ca_certs': 'REDIS_SSL_CA_CERTS',
102-
'cluster_mode': 'REDIS_CLUSTER_MODE'
103-
}
104-
105-
for key, env_var in env_mapping.items():
106-
if key in config:
107-
value = config[key]
108-
if isinstance(value, bool):
109-
value = 'true' if value else 'false'
110-
os.environ[env_var] = str(value)
111-
11228

11329
@click.command()
11430
@click.option('--url', help='Redis connection URI (redis://user:pass@host:port/db or rediss:// for SSL)')

0 commit comments

Comments
 (0)