Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / utils.py @ a9e3df67

History | View | Annotate | Download (3.5 kB)

1
# Copyright 2011-2012 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
    if exactMath:
39
        return True if val1.lower() == val2.lower() else False
40
    else:
41
        return True if val1.lower().startswith(val2.lower()) else False
42

    
43

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

47
    :param d: (dict) input
48

49
    :param prefix: (str) prefix to match input keys against
50

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

54
    :returns: (dict) the updated d
55
    """
56

    
57
    ret = {}
58
    for key, val in d.items():
59
        if not _matches(key, prefix, exactMath=exactMatch):
60
            ret[key] = val
61
    return ret
62

    
63

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

67
    :param d: (dict) input
68

69
    :param prefix: (str) prefix to match input keys against
70

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

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

    
82

    
83
def path4url(*args):
84
    """
85
    :param args: (list of str)
86

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

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

    
96

    
97
def params4url(params):
98
    """{'key1':'val1', 'key2':None, 'key3':15} --> "?key1=val1&key2&key3=15"
99

100
    :param params: (dict) request parameters in the form key:val
101

102
    :returns: (str) http-request friendly in the form ?key1=val1&key2=val2&...
103
    """
104

    
105
    assert(type(params) is dict)
106
    result = ''
107
    dlmtr = '?'
108
    for name in params:
109
        result = result + dlmtr + name
110
        result += '=%s' % params[name] if params[name] else result
111
        dlmtr = '&'
112
    return result