userver: en/testsuite/databases/mongo/connection.py Source File
Loading...
Searching...
No Matches
connection.py
1import dataclasses
2import urllib.parse
3
4_BOOL_TO_STR = {True: 'true', False: 'false'}
5_STR_TO_BOOL = {value: key for key, value in _BOOL_TO_STR.items()}
6
7
8@dataclasses.dataclass(frozen=True)
10 """Mongodb connection uri parameters"""
11
12 host: str
13 port: int
14 dbname: str | None = None
15 retry_writes: bool | None = None
16
18 self,
19 dbname: str | None = None,
20 retry_writes: bool | None = None,
21 ) -> str:
22 """Get mongodb connection uri"""
23 if dbname is None:
24 dbname = self.dbname
25 if retry_writes is None:
26 retry_writes = self.retry_writes
27 result = f'mongodb://{self.host}:{self.port}/'
28 if dbname is not None:
29 result += dbname
30 if retry_writes is not None:
31 retry_writes_str = _BOOL_TO_STR[retry_writes]
32 result += f'?retryWrites={retry_writes_str}'
33 return result
34
35
36def parse_connection_uri(uri: str) -> ConnectionInfo:
37 url = urllib.parse.urlparse(uri)
38 if url.scheme != 'mongodb':
39 raise ValueError(f'Invalid scheme in mongodb uri {uri}')
40 parsed_query = urllib.parse.parse_qs(url.query)
41 path = url.path.lstrip('/')
42 return ConnectionInfo(
43 host=url.hostname or 'localhost',
44 port=url.port or 27017,
45 dbname=path or None,
46 retry_writes=_get_boolean_param(parsed_query, 'retryWrites'),
47 )
48
49
50def _get_boolean_param(
51 parsed_query: dict[str, list[str]],
52 key: str,
53) -> bool | None:
54 values = parsed_query.get(key, None)
55 if not values or not values[0]:
56 return None
57 if len(values) > 1:
58 raise ValueError(f'Multiple values of {key!r}: {values}')
59 value = values[0].lower()
60 if value not in _STR_TO_BOOL:
61 raise ValueError(f'Invalid {key!r} value: {values[0]}')
62 return _STR_TO_BOOL[value]