Source code for testsuite.databases.mongo.connection
import dataclasses
import typing
import urllib.parse
_BOOL_TO_STR = {True: 'true', False: 'false'}
_STR_TO_BOOL = {value: key for key, value in _BOOL_TO_STR.items()}
[docs]@dataclasses.dataclass(frozen=True)
class ConnectionInfo:
"""Mongodb connection uri parameters"""
host: str
port: int
dbname: typing.Optional[str] = None
retry_writes: typing.Optional[bool] = None
[docs] def get_uri(
self,
dbname: typing.Optional[str] = None,
retry_writes: typing.Optional[bool] = None,
) -> str:
"""Get mongodb connection uri"""
if dbname is None:
dbname = self.dbname
if retry_writes is None:
retry_writes = self.retry_writes
result = f'mongodb://{self.host}:{self.port}/'
if dbname is not None:
result += dbname
if retry_writes is not None:
retry_writes_str = _BOOL_TO_STR[retry_writes]
result += f'?retryWrites={retry_writes_str}'
return result
def parse_connection_uri(uri: str) -> ConnectionInfo:
url = urllib.parse.urlparse(uri)
if url.scheme != 'mongodb':
raise ValueError(f'Invalid scheme in mongodb uri {uri}')
parsed_query = urllib.parse.parse_qs(url.query)
path = url.path.lstrip('/')
return ConnectionInfo(
host=url.hostname or 'localhost',
port=url.port or 27017,
dbname=path or None,
retry_writes=_get_boolean_param(parsed_query, 'retryWrites'),
)
def _get_boolean_param(
parsed_query: typing.Dict[str, typing.List[str]],
key: str,
) -> typing.Optional[bool]:
values = parsed_query.get(key, None)
if not values or not values[0]:
return None
if len(values) > 1:
raise ValueError(f'Multiple values of {key!r}: {values}')
value = values[0].lower()
if value not in _STR_TO_BOOL:
raise ValueError(f'Invalid {key!r} value: {values[0]}')
return _STR_TO_BOOL[value]