Source code for caspia.meadow.namespace

[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:]