1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright (C) 2013 Yahoo! Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import time
from kazoo.protocol import paths as k_paths
from kazoo.protocol import states as k_states
def millitime():
"""Converts the current time to milliseconds."""
return int(round(time.time() * 1000.0))
def normpath(path, keep_trailing=False):
"""Really normalize the path by adding a missing leading slash."""
new_path = k_paths.normpath(path)
if keep_trailing and path.endswith("/") and not new_path.endswith("/"):
new_path = new_path + "/"
if not new_path.startswith('/'):
return '/' + new_path
return new_path
def make_cb(func, args=None, type=''):
if not args:
args = []
return k_states.Callback(type=type, func=func, args=args)
def dispatch_async(handler, func, *args, **kwargs):
async_result = handler.async_result()
def call(func, args, kwargs):
try:
result = func(*args, **kwargs)
async_result.set(result)
except Exception as exc:
async_result.set_exception(exc)
cb = make_cb(call, [func, args, kwargs], type='async')
handler.dispatch_callback(cb)
return async_result
def partition_path(path):
path_pieces = [path]
cur_path = path
while True:
(tmp_path, _ext) = os.path.split(cur_path)
if tmp_path == cur_path:
path_pieces.append(tmp_path)
break
else:
path_pieces.append(tmp_path)
cur_path = tmp_path
return sorted(set(path_pieces))
def is_child_path(parent_path, child_path, only_direct=True):
parent_pieces = [p for p in parent_path.split("/") if p]
child_pieces = [p for p in child_path.split("/") if p]
if len(child_pieces) <= len(parent_pieces):
return False
shared_pieces = child_pieces[0:len(parent_pieces)]
if tuple(parent_pieces) != tuple(shared_pieces):
return False
if only_direct:
return len(child_pieces) == len(parent_pieces) + 1
return True
|