Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / utils / __init__.py @ 56ca8235

History | View | Annotate | Download (3.4 kB)

1
# Copyright 2013-2014 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34

    
35
def _matches(val1, val2, exactMath=True):
36
    """Case Insensitive match"""
37

    
38
    return (val1.lower() == val2.lower()) if (
39
        exactMath) else val1.lower().startswith(val2.lower())
40

    
41

    
42
def filter_out(d, prefix, exactMatch=False):
43
    """Remove entries that are prefixed with prefix (case insensitive)
44

45
    :param d: (dict) input
46

47
    :param prefix: (str) prefix to match input keys against
48

49
    :param exactMatch: (bool) key should fully match if True, just prefixed
50
        with prefix if False
51

52
    :returns: (dict) the updated d
53
    """
54

    
55
    ret = dict()
56
    for key, val in d.items():
57
        if not _matches(key, prefix, exactMath=exactMatch):
58
            ret[key] = val
59
    return ret
60

    
61

    
62
def filter_in(d, prefix, exactMatch=False):
63
    """Keep only entries of d prefixed with prefix
64

65
    :param d: (dict) input
66

67
    :param prefix: (str) prefix to match input keys against
68

69
    :param exactMatch: (bool) key should fully match if True, just prefixed
70
        with prefix if False
71

72
    :returns: (dict) the updated d
73
    """
74
    ret = dict()
75
    for key, val in d.items():
76
        if _matches(key, prefix, exactMath=exactMatch):
77
            ret[key] = val
78
    return ret
79

    
80

    
81
def path4url(*args):
82
    """
83
    :param args: (list of str)
84

85
    :returns: (str) a path in the form /args[0]/args[1]/...
86
    """
87

    
88
    r = '/'.join([''] + [arg.decode('utf-8') if (
89
        isinstance(arg, str)) else '%s' % arg for arg in args])
90
    while '//' in r:
91
        r = r.replace('//', '/')
92
    return ('/%s' % r.strip('/')) if r else ''
93

    
94

    
95
def readall(openfile, size, retries=7):
96
    """Read a file until size is reached"""
97
    remains = size if size > 0 else 0
98
    buf = ''
99
    for i in range(retries):
100
        tmp_buf = openfile.read(remains)
101
        if tmp_buf:
102
            buf += tmp_buf
103
            remains -= len(tmp_buf)
104
            if remains > 0:
105
                continue
106
        return buf
107
    raise IOError('Failed to read %s bytes from file' % size)