11from .exceptions import ConfigError
22from .logger import logger
3-
3+ from urllib . parse import urlparse
44
55class Node (object ):
6+ def __init__ (self ,url ):
7+ parsed = urlparse (url );
8+ if not parsed .hostname :
9+ raise ConfigError ('Node URL does not contain the host name.' )
10+ if not parsed .port :
11+ raise ConfigError ('Node URL does not contain the port.' )
12+ if not parsed .scheme :
13+ raise ConfigError ('Node URL does not contain the protocol.' )
14+ self .__init__ (parsed .hostname ,parsed .port ,parsed .path ,parsed .scheme )
15+
616def __init__ (self ,host ,port ,path ,protocol ):
717self .host = host
818self .port = port
@@ -21,19 +31,21 @@ def __init__(self, config_dict):
2131Configuration .show_deprecation_warnings (config_dict )
2232Configuration .validate_config_dict (config_dict )
2333
24- node_dicts = config_dict .get ('nodes' , [])
25-
2634self .nodes = []
27- for node_dict in node_dicts :
28- self .nodes .append (
29- Node (node_dict ['host' ],node_dict ['port' ],node_dict .get ('path' ,'' ),node_dict ['protocol' ])
30- )
35+ for node_config in config_dict .get ('nodes' , []):
36+ if isinstance (node_config ,str ):
37+ node = Node (node_config )
38+ else :
39+ node = Node (node_config ['host' ],node_config ['port' ],node_config .get ('path' ,'' ),node_config ['protocol' ])
40+ self .nodes .append (node )
3141
3242nearest_node = config_dict .get ('nearest_node' ,None )
33- if nearest_node :
34- self .nearest_node = Node (nearest_node ['host' ],nearest_node ['port' ],nearest_node .get ('path' ,'' ),nearest_node ['protocol' ])
35- else :
43+ if not nearest_node :
3644self .nearest_node = None
45+ else if isinstance (nearest_node ,str ):
46+ self .nearest_node = Node (nearest_node )
47+ else :
48+ self .nearest_node = Node (nearest_node ['host' ],nearest_node ['port' ],nearest_node .get ('path' ,'' ),nearest_node ['protocol' ])
3749
3850self .api_key = config_dict .get ('api_key' ,'' )
3951self .connection_timeout_seconds = config_dict .get ('connection_timeout_seconds' ,3.0 )
@@ -53,16 +65,18 @@ def validate_config_dict(config_dict):
5365
5466for node in nodes :
5567if not Configuration .validate_node_fields (node ):
56- raise ConfigError ('`node` entry must be a dictionary with the following required keys: '
68+ raise ConfigError ('`node` entry must be aURL string or a dictionary with the following required keys: '
5769'host, port, protocol' )
5870
5971nearest_node = config_dict .get ('nearest_node' ,None )
6072if nearest_node and not Configuration .validate_node_fields (nearest_node ):
61- raise ConfigError ('`nearest_node` entry must be a dictionary with the following required keys: '
73+ raise ConfigError ('`nearest_node` entry must be aURL string or a dictionary with the following required keys: '
6274'host, port, protocol' )
6375
6476@staticmethod
6577def validate_node_fields (node ):
78+ if isinstance (node ,str ):
79+ return true
6680expected_fields = {'host' ,'port' ,'protocol' }
6781return expected_fields .issubset (node )
6882
@@ -76,4 +90,3 @@ def show_deprecation_warnings(config_dict):
7690
7791if config_dict .get ('read_replica_nodes' ):
7892logger .warn ('Deprecation warning: read_replica_nodes is now consolidated to nodes, starting with Typesense Server v0.12' )
79-