Source code for pyinthesky.utils
[docs]def args_to_kwargs(args, kwargs, argnames):
# Check we haven't exceeded the number of allowed arguments.
argcount = len(args) + len(kwargs)
if argcount > len(argnames):
errmsg = {
0: "takes no arguments ({1} given)",
1: "takes exactly 1 argument ({1} given)",
}.get(argcount, "takes exactly {0} arguments ({1} given)")
raise TypeError(errmsg.format(len(argnames), argcount))
# Check we haven't defined both arguments and keyword arguments for the
# same. We turn argnames into a list in case we have a dict-keys object.
for argname in list(argnames)[:len(args)]:
if argname in kwargs:
err = "got multiple values for keyword argument '%s'"
raise TypeError(err % argname)
# Combine the values.
res = kwargs.copy()
res.update(zip(argnames, args))
return res
# Based around this: http://rosettacode.org/wiki/Find_Common_Directory_Path#Python
[docs]def common_url_prefix(urls):
def same(values):
return all(v == values[0] for v in values[1:])
from six.moves.urllib import parse
parsed = [parse.urlparse(url) for url in urls]
# We need the same protocol and netloc (host/port), otherwise there
# is not a common prefix.
if not same([u[:2] for u in parsed]):
return None
# If we get here, it means we have a shared protocol and netloc, so
# now we just compare paths.
from itertools import takewhile as tw
parts = zip(*[p.path.split('/') for p in parsed])
commonpath = '/'.join(x[0] for x in tw(same, parts))
res_parts = parsed[0][:2] + (commonpath, '', '', '')
res = parse.urlunparse(res_parts)
if res[-1] != '/':
res += '/'
return res