[docs]def split(path):
return path.split('.')
[docs]def join(*args):
path = ''
for arg in args:
if isinstance(arg, list):
path = join(path, *arg)
elif isinstance(arg, str) and arg != '':
path = arg if path == '' else path + '.' + arg
return path
[docs]def common_prefix(a, b):
common = []
for compa, compb in zip(split(a), split(b)):
if compa != compb:
break
common.append(compa)
return join(common)
[docs]def resolve_relative(path, namespace):
namespace = namespace or ''
namespace_comps = split(namespace)
if not path.startswith('.'):
return path
replace_count = 0
while path[replace_count] == '.':
replace_count += 1
skip_count = len(namespace_comps) - replace_count + 1
if skip_count <= 0:
raise ValueError('Too much dots in %r for namespace %r' % (path, namespace))
replacement = '.'.join(namespace_comps[:skip_count])
if replacement == '':
return path[replace_count:]
else:
return replacement + '.' + path[replace_count:]