16
16
8 : 'adjust' ,
17
17
}
18
18
19
+ # https://github.com/tarantool/tarantool/blob/ff57f990f359f6d7866c1947174d8ba0e97b1ea6/src/lua/datetime.lua#L112-L146
20
+ SECS_PER_DAY = 86400
21
+
22
+ MIN_DATE_YEAR = - 5879610
23
+ MIN_DATE_MONTH = 6
24
+ MIN_DATE_DAY = 22
25
+ MAX_DATE_YEAR = 5879611
26
+ MAX_DATE_MONTH = 7
27
+ MAX_DATE_DAY = 11
28
+
29
+ AVERAGE_DAYS_YEAR = 365.25
30
+ AVERAGE_WEEK_YEAR = AVERAGE_DAYS_YEAR / 7
31
+ INT_MAX = 2147483647
32
+ MAX_YEAR_RANGE = MAX_DATE_YEAR - MIN_DATE_YEAR
33
+ MAX_MONTH_RANGE = MAX_YEAR_RANGE * 12
34
+ MAX_WEEK_RANGE = MAX_YEAR_RANGE * AVERAGE_WEEK_YEAR
35
+ MAX_DAY_RANGE = MAX_YEAR_RANGE * AVERAGE_DAYS_YEAR
36
+ MAX_HOUR_RANGE = MAX_DAY_RANGE * 24
37
+ MAX_MIN_RANGE = MAX_HOUR_RANGE * 60
38
+ MAX_SEC_RANGE = MAX_DAY_RANGE * SECS_PER_DAY
39
+ MAX_NSEC_RANGE = INT_MAX
40
+
41
+ max_val = {
42
+ 'year' : MAX_YEAR_RANGE ,
43
+ 'month' : MAX_MONTH_RANGE ,
44
+ 'week' : MAX_WEEK_RANGE ,
45
+ 'day' : MAX_DAY_RANGE ,
46
+ 'hour' : MAX_HOUR_RANGE ,
47
+ 'minute' : MAX_MIN_RANGE ,
48
+ 'sec' : MAX_SEC_RANGE ,
49
+ 'nsec' : MAX_NSEC_RANGE ,
50
+ }
51
+
52
+
53
+ def verify_range (intv ):
54
+ """
55
+ Check allowed values. Approach is the same as in tarantool/tarantool.
56
+
57
+ :param intv: Raw interval to verify.
58
+ :type intv: :class:`~tarantool.Interval`
59
+
60
+ :raise: :exc:`ValueError`
61
+
62
+ :meta private:
63
+ """
64
+
65
+ for field_name , range_max in max_val .items ():
66
+ val = getattr (intv , field_name )
67
+ # Tarantool implementation has a bug
68
+ # https://github.com/tarantool/tarantool/issues/8878
69
+ if (val > range_max ) or (val < - range_max ):
70
+ raise ValueError (f"value { val } of { field_name } is out of "
71
+ f"allowed range [{ - range_max } , { range_max } ]" )
72
+
19
73
20
74
# https://github.com/tarantool/c-dt/blob/cec6acebb54d9e73ea0b99c63898732abd7683a6/dt_arithmetic.h#L34
21
75
class Adjust (Enum ):
@@ -92,6 +146,8 @@ def __init__(self, *, year=0, month=0, week=0,
92
146
:param adjust: Interval adjustment rule. Refer to
93
147
:meth:`~tarantool.Datetime.__add__`.
94
148
:type adjust: :class:`~tarantool.IntervalAdjust`, optional
149
+
150
+ :raise: :exc:`ValueError`
95
151
"""
96
152
97
153
self .year = year
@@ -104,6 +160,8 @@ def __init__(self, *, year=0, month=0, week=0,
104
160
self .nsec = nsec
105
161
self .adjust = adjust
106
162
163
+ verify_range (self )
164
+
107
165
def __add__ (self , other ):
108
166
"""
109
167
Valid operations:
0 commit comments