Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.4 kB)

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

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

45 74d988b0 Christos Stavrakakis
    """
46 74d988b0 Christos Stavrakakis
    (seconds, microseconds) = divmod(int(value * 1000000), 1000000)
47 c4e55622 Christos Stavrakakis
48 74d988b0 Christos Stavrakakis
    assert 0 <= seconds, \
49 74d988b0 Christos Stavrakakis
        "Seconds must be larger than or equal to 0, but are %s" % seconds
50 74d988b0 Christos Stavrakakis
    assert 0 <= microseconds <= 999999, \
51 74d988b0 Christos Stavrakakis
        "Microseconds must be 0-999999, but are %s" % microseconds
52 c4e55622 Christos Stavrakakis
53 74d988b0 Christos Stavrakakis
    return (int(seconds), int(microseconds))
54 c4e55622 Christos Stavrakakis
55 c4e55622 Christos Stavrakakis
56 c4e55622 Christos Stavrakakis
def merge_time(timetuple):
57 74d988b0 Christos Stavrakakis
    """Merges a tuple into a datetime object
58 c4e55622 Christos Stavrakakis

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

63 74d988b0 Christos Stavrakakis
    """
64 74d988b0 Christos Stavrakakis
    (seconds, microseconds) = timetuple
65 c4e55622 Christos Stavrakakis
66 74d988b0 Christos Stavrakakis
    assert 0 <= seconds, \
67 74d988b0 Christos Stavrakakis
        "Seconds must be larger than or equal to 0, but are %s" % seconds
68 74d988b0 Christos Stavrakakis
    assert 0 <= microseconds <= 999999, \
69 74d988b0 Christos Stavrakakis
        "Microseconds must be 0-999999, but are %s" % microseconds
70 c4e55622 Christos Stavrakakis
71 74d988b0 Christos Stavrakakis
    t1 = float(seconds) + (float(microseconds) * 0.000001)
72 74d988b0 Christos Stavrakakis
    return datetime.datetime.fromtimestamp(t1)
73 1de7fd6d Kostas Papadimitriou
74 1de7fd6d Kostas Papadimitriou
75 1de7fd6d Kostas Papadimitriou
def case_unique(iterable):
76 1de7fd6d Kostas Papadimitriou
    """
77 1de7fd6d Kostas Papadimitriou
    Compare case uniquness across iterable contents. Return diff.
78 1de7fd6d Kostas Papadimitriou

79 b253c438 Georgios D. Tsoukalas
    >>> case_unique(['a','b','c'])
80 1de7fd6d Kostas Papadimitriou
    []
81 b253c438 Georgios D. Tsoukalas
    >>> case_unique(['a','A','b','c'])
82 1de7fd6d Kostas Papadimitriou
    ['A']
83 1de7fd6d Kostas Papadimitriou
    """
84 b253c438 Georgios D. Tsoukalas
    icase = set(map(unicode.lower, unicode(iterable)))
85 1de7fd6d Kostas Papadimitriou
    same = len(icase) == len(iterable)
86 1de7fd6d Kostas Papadimitriou
    if not same:
87 1de7fd6d Kostas Papadimitriou
        return list(set(iterable) - set(icase))
88 1de7fd6d Kostas Papadimitriou
89 1de7fd6d Kostas Papadimitriou
    return []
90 a971d6fe Kostas Papadimitriou
91 a971d6fe Kostas Papadimitriou
92 a971d6fe Kostas Papadimitriou
def dict_merge(a, b):
93 a971d6fe Kostas Papadimitriou
    """
94 a971d6fe Kostas Papadimitriou
    http://www.xormedia.com/recursively-merge-dictionaries-in-python/
95 a971d6fe Kostas Papadimitriou
    """
96 a971d6fe Kostas Papadimitriou
    if not isinstance(b, dict):
97 a971d6fe Kostas Papadimitriou
        return b
98 a971d6fe Kostas Papadimitriou
    result = copy.deepcopy(a)
99 a971d6fe Kostas Papadimitriou
    for k, v in b.iteritems():
100 a971d6fe Kostas Papadimitriou
        if k in result and isinstance(result[k], dict):
101 a971d6fe Kostas Papadimitriou
                result[k] = dict_merge(result[k], v)
102 a971d6fe Kostas Papadimitriou
        else:
103 a971d6fe Kostas Papadimitriou
            result[k] = copy.deepcopy(v)
104 a971d6fe Kostas Papadimitriou
    return result