forked from splitio/python-client
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtransformers.py
More file actions
136 lines (114 loc) · 4.6 KB
/
Copy pathtransformers.py
File metadata and controls
136 lines (114 loc) · 4.6 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
from builtins import int
from arrow import Arrow
logger = logging.getLogger(__name__)
class TransformMixin(object):
"""Base for all transform mixins"""
def _transform_key(self, value):
"""
Transforms a value. Subclasses need to implement this method
:param value: The value to transform
:type value: any
:return: The transformed value
:rtype: any
"""
return value
def transform_key(self, value):
"""
Transforms a value
:param value: The value to transform
:type value: any
:return: The transformed value
:rtype: any
"""
try:
return self._transform_key(value)
except:
logger.exception('Exception caught transforming value. value = %s', value)
def _transform_condition_parameter(self, source_value):
"""
Transforms a condition parameter. Subclasses need to implement this method
:param value: The value to transform
:type value: any
:return: The transformed value
:rtype: any
"""
return self._transform_key(source_value)
def transform_condition_parameter(self, source_value):
"""
Transforms a condition parameter
:param value: The value to transform
:type value: any
:return: The transformed value
:rtype: any
"""
try:
return self._transform_condition_parameter(source_value)
except:
logger.exception('Exception caught transforming source value. source_value = %s',
source_value)
class AsNumberTransformMixin(TransformMixin):
"""Mixin to allow transforming values to int (long)"""
def _transform_key(self, value):
"""
Transforms value to int (long in Python2)
:param value: Any value suitable to be transformed
:type value:
:return: The value transformed to int
:rtype: int
"""
if value is None:
return None
return int(value)
class AsDateHourMinuteTimestampTransformMixin(TransformMixin):
"""Mixin to allow truncating timestamp to the minute"""
def _transform_key(self, value):
"""
Truncates seconds and milliseconds from a long value of seconds from epoch
:param value: An int value representing the number of seconds from epoch (timestmap)
:type value: int
:return: The value truncated to minutes
:rtype: int
"""
if value is None:
return None
return Arrow.utcfromtimestamp(value).replace(second=0, microsecond=0).timestamp * 1000
def _transform_condition_parameter(self, source_value):
"""
Truncates seconds and milliseconds from a long value of milliseconds from epoch
:param value: An int value representing the number of milliseconds from epoch (timestmap)
:type value: int
:return: The value truncated to minutes
:rtype: int
"""
if source_value is None:
return None
return Arrow.utcfromtimestamp(source_value // 1000).replace(second=0,
microsecond=0).timestamp * 1000
class AsDateTimestampTransformMixin(TransformMixin):
"""Mixin to allow truncating timestamp to midnight"""
def _transform_key(self, value):
"""
Truncates seconds and milliseconds from a long value of seconds from epoch
:param value: An int value representing the number of seconds from epoch (timestmap)
:type value: int
:return: The value truncated to midnight of the same day
:rtype: int
"""
if value is None:
return None
return Arrow.utcfromtimestamp(value).replace(hour=0, minute=0, second=0,
microsecond=0).timestamp * 1000
def _transform_condition_parameter(self, source_value):
"""
Truncates seconds and milliseconds from a long value of milliseconds from epoch
:param value: An int value representing the number of milliseconds from epoch (timestmap)
:type value: int
:return: The value truncated to midnight of the same day
:rtype: int
"""
if source_value is None:
return None
return Arrow.utcfromtimestamp(source_value // 1000).replace(hour=0, minute=0, second=0,
microsecond=0).timestamp * 1000