Source code for py2store.utils.uri_utils
"""
utils to work with URIs
"""
from urllib.parse import urlsplit
[docs]def parse_uri(uri):
"""
Parses DB URI string into a dict of params.
:param uri: string formatted as: "scheme://username:password@host:port/database"
:return: a dict with these params parsed.
"""
splitted_uri = urlsplit(uri)
if splitted_uri.path.startswith('/'):
path = splitted_uri.path[1:]
else:
path = ''
return {
'scheme': splitted_uri.scheme,
'database': path,
'username': splitted_uri.username,
'password': splitted_uri.password,
'hostname': splitted_uri.hostname,
'port': splitted_uri.port,
}
[docs]def build_uri(
scheme,
database='', # TODO: Change name: Not always a database
username=None,
password=None,
host='localhost',
port=None,
):
"""
Reverse of `parse_uri` function.
Builds a URI string from provided params.
"""
port_ = f':{port}' if port else ''
uri = f'{scheme}://{username}:{password}@{host}{port_}/{database}'
return uri
import string
from py2store.signatures import set_signature_of_func
str_formatter = string.Formatter()
def mk_str_making_func(
str_format: str, input_trans=None, method=False, module=None, name=None
):
fields = tuple(
filter(None, (x[1] for x in str_formatter.parse(str_format)))
) # TODO: validate
n_fields = len(fields)
if method:
def _mk(self, *args, **kwargs):
n = len(args) + len(kwargs)
if n > n_fields:
raise ValueError(
f'You have too many arguments: (args, kwargs) is ({args}, {kwargs})'
)
elif n < n_fields:
raise ValueError(
f'You have too few arguments: (args, kwargs) is ({args}, {kwargs})'
)
kwargs = dict({k: v for k, v in zip(fields, args)}, **kwargs)
if input_trans is not None:
kwargs = input_trans(**kwargs)
return str_format.format(**kwargs)
set_signature_of_func(_mk, ['self'] + list(fields))
else:
def _mk(*args, **kwargs):
n = len(args) + len(kwargs)
if n > n_fields:
raise ValueError(
f'You have too many arguments: (args, kwargs) is ({args}, {kwargs})'
)
elif n < n_fields:
raise ValueError(
f'You have too few arguments: (args, kwargs) is ({args}, {kwargs})'
)
kwargs = dict({k: v for k, v in zip(fields, args)}, **kwargs)
if input_trans is not None:
kwargs = input_trans(**kwargs)
return str_format.format(**kwargs)
set_signature_of_func(_mk, fields)
if module is not None:
_mk.__module__ = module
if name is not None:
_mk.__qualname__ = name
return _mk