Statistics
| Branch: | Tag: | Revision:

root / snf-common / synnefo / lib / utils.py @ d509e6da

History | View | Annotate | Download (3.4 kB)

1
# Copyright 2012, 2013 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
import datetime
35
import copy
36

    
37

    
38
def split_time(value):
39
    """Splits time as floating point number into a tuple.
40

41
    @param value: Time in seconds
42
    @type value: int or float
43
    @return: Tuple containing (seconds, microseconds)
44

45
    """
46
    (seconds, microseconds) = divmod(int(value * 1000000), 1000000)
47

    
48
    assert 0 <= seconds, \
49
        "Seconds must be larger than or equal to 0, but are %s" % seconds
50
    assert 0 <= microseconds <= 999999, \
51
        "Microseconds must be 0-999999, but are %s" % microseconds
52

    
53
    return (int(seconds), int(microseconds))
54

    
55

    
56
def merge_time(timetuple):
57
    """Merges a tuple into a datetime object
58

59
    @param timetuple: Time as tuple, (seconds, microseconds)
60
    @type timetuple: tuple
61
    @return: Time as a datetime object
62

63
    """
64
    (seconds, microseconds) = timetuple
65

    
66
    assert 0 <= seconds, \
67
        "Seconds must be larger than or equal to 0, but are %s" % seconds
68
    assert 0 <= microseconds <= 999999, \
69
        "Microseconds must be 0-999999, but are %s" % microseconds
70

    
71
    t1 = float(seconds) + (float(microseconds) * 0.000001)
72
    return datetime.datetime.fromtimestamp(t1)
73

    
74

    
75
def case_unique(iterable):
76
    """
77
    Compare case uniquness across iterable contents. Return diff.
78

79
    >>> case_unique(['a','b','c'])
80
    []
81
    >>> case_unique(['a','A','b','c'])
82
    ['A']
83
    """
84
    icase = set(map(unicode.lower, unicode(iterable)))
85
    same = len(icase) == len(iterable)
86
    if not same:
87
        return list(set(iterable) - set(icase))
88

    
89
    return []
90

    
91

    
92
def dict_merge(a, b):
93
    """
94
    http://www.xormedia.com/recursively-merge-dictionaries-in-python/
95
    """
96
    if not isinstance(b, dict):
97
        return b
98
    result = copy.deepcopy(a)
99
    for k, v in b.iteritems():
100
        if k in result and isinstance(result[k], dict):
101
                result[k] = dict_merge(result[k], v)
102
        else:
103
            result[k] = copy.deepcopy(v)
104
    return result