Skip to content

Commit 18e2644

Browse files
committed
Replace datetime.utcfromtimestamp
It is depricated and to be removed soon. Only method available out-of-box for this purpose is `datetime.fromtimestamp`. But it either include timezone into datetime which is not acceptable, or offset datetime from utc which we don't want to happen. On other hand `tz_info` in not writable on `datetime` and all API that allows you to manipulate it offsets time. So, simpliest solution would to be ship a function that calls `datetime.fromtimestamp` and then builds exactly same datetime with tz_info empty.
1 parent d62eb38 commit 18e2644

File tree

6 files changed

+26
-16
lines changed

6 files changed

+26
-16
lines changed

cassandra/cqlengine/columns.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from cassandra.cqltypes import SimpleDateType, _cqltypes, UserType
2222
from cassandra.cqlengine import ValidationError
2323
from cassandra.cqlengine.functions import get_total_seconds
24-
from cassandra.util import Duration as _Duration
24+
from cassandra.util import Duration as _Duration, utcfromtimestamp
2525

2626
log = logging.getLogger(__name__)
2727

@@ -551,7 +551,7 @@ def to_python(self, value):
551551
elif isinstance(value, date):
552552
return datetime(*(value.timetuple()[:6]))
553553

554-
return datetime.utcfromtimestamp(value)
554+
return utcfromtimestamp(value)
555555

556556
def to_database(self, value):
557557
value = super(DateTime, self).to_database(value)

cassandra/util.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,17 @@
4040

4141
from cassandra import DriverException
4242

43+
44+
def utcfromtimestamp(timestamp):
45+
"""
46+
It replicates behavior of datetime.utcfromtimestamp
47+
"""
48+
dt = datetime.datetime.fromtimestamp(timestamp, datetime.timezone.utc)
49+
return datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, fold=dt.fold)
50+
51+
4352
DATETIME_EPOC = datetime.datetime(1970, 1, 1)
44-
UTC_DATETIME_EPOC = datetime.datetime.utcfromtimestamp(0)
53+
UTC_DATETIME_EPOC = utcfromtimestamp(0)
4554

4655
_nan = float('nan')
4756

tests/integration/cqlengine/columns/test_validation.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import unittest
1616

1717
import sys
18-
from datetime import datetime, timedelta, date, tzinfo, time
18+
from datetime import datetime, timedelta, date, tzinfo, time, timezone
1919
from decimal import Decimal as D
2020
from uuid import uuid4, uuid1
2121
from packaging.version import Version
@@ -30,6 +30,7 @@
3030
from cassandra.cqlengine.models import Model, ValidationError
3131
from cassandra.cqlengine.usertype import UserType
3232
from cassandra import util
33+
from cassandra.util import utcfromtimestamp
3334

3435
from tests.integration import PROTOCOL_VERSION, CASSANDRA_VERSION, greaterthanorequalcass30, greaterthanorequalcass3_11
3536
from tests.integration.cqlengine.base import BaseCassEngTestCase
@@ -97,7 +98,7 @@ def test_datetime_timestamp(self):
9798
dt_value = 1454520554
9899
self.DatetimeTest.objects.create(test_id=5, created_at=dt_value)
99100
dt2 = self.DatetimeTest.objects(test_id=5).first()
100-
self.assertEqual(dt2.created_at, datetime.utcfromtimestamp(dt_value))
101+
self.assertEqual(dt2.created_at, utcfromtimestamp(dt_value))
101102

102103
def test_datetime_large(self):
103104
dt_value = datetime(2038, 12, 31, 10, 10, 10, 123000)
@@ -809,7 +810,7 @@ def test_conversion_specific_date(self):
809810
assert isinstance(uuid, UUID)
810811

811812
ts = (uuid.time - 0x01b21dd213814000) / 1e7 # back to a timestamp
812-
new_dt = datetime.utcfromtimestamp(ts)
813+
new_dt = utcfromtimestamp(ts)
813814

814815
# checks that we created a UUID1 with the proper timestamp
815816
assert new_dt == dt

tests/integration/cqlengine/model/test_model_io.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from uuid import uuid4, UUID
1717
import random
18-
from datetime import datetime, date, time
18+
from datetime import datetime, date, time, timezone
1919
from decimal import Decimal
2020
from operator import itemgetter
2121

@@ -26,7 +26,7 @@
2626
from cassandra.cqlengine.management import drop_table
2727
from cassandra.cqlengine.models import Model
2828
from cassandra.query import SimpleStatement
29-
from cassandra.util import Date, Time, Duration
29+
from cassandra.util import Date, Time, Duration, utcfromtimestamp
3030
from cassandra.cqlengine.statements import SelectStatement, DeleteStatement, WhereClause
3131
from cassandra.cqlengine.operators import EqualsOperator
3232

@@ -200,13 +200,13 @@ class AllDatatypesModel(Model):
200200

201201
sync_table(AllDatatypesModel)
202202

203-
input = ['ascii', 2 ** 63 - 1, bytearray(b'hello world'), True, datetime.utcfromtimestamp(872835240),
203+
input = ['ascii', 2 ** 63 - 1, bytearray(b'hello world'), True, utcfromtimestamp(872835240),
204204
Decimal('12.3E+7'), 2.39, 3.4028234663852886e+38, '123.123.123.123', 2147483647, 'text',
205205
UUID('FE2B4360-28C6-11E2-81C1-0800200C9A66'), UUID('067e6162-3b6f-4ae2-a171-2470b63dff00'),
206206
int(str(2147483647) + '000')]
207207

208208
AllDatatypesModel.create(id=0, a='ascii', b=2 ** 63 - 1, c=bytearray(b'hello world'), d=True,
209-
e=datetime.utcfromtimestamp(872835240), f=Decimal('12.3E+7'), g=2.39,
209+
e=utcfromtimestamp(872835240), f=Decimal('12.3E+7'), g=2.39,
210210
h=3.4028234663852886e+38, i='123.123.123.123', j=2147483647, k='text',
211211
l=UUID('FE2B4360-28C6-11E2-81C1-0800200C9A66'),
212212
m=UUID('067e6162-3b6f-4ae2-a171-2470b63dff00'), n=int(str(2147483647) + '000'),

tests/integration/cqlengine/model/test_udts.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414
import unittest
1515

16-
from datetime import datetime, date, time
16+
from datetime import datetime, date, time, timezone
1717
from decimal import Decimal
1818
from mock import Mock
1919
from uuid import UUID, uuid4
@@ -23,7 +23,7 @@
2323
from cassandra.cqlengine import columns, connection
2424
from cassandra.cqlengine.management import sync_table, drop_table, sync_type, create_keyspace_simple, drop_keyspace
2525
from cassandra.cqlengine import ValidationError
26-
from cassandra.util import Date, Time
26+
from cassandra.util import Date, Time, utcfromtimestamp
2727

2828
from tests.integration import PROTOCOL_VERSION
2929
from tests.integration.cqlengine.base import BaseCassEngTestCase
@@ -272,7 +272,7 @@ def test_can_insert_udts_with_all_datatypes(self):
272272
self.addCleanup(drop_table, AllDatatypesModel)
273273

274274
input = AllDatatypes(a='ascii', b=2 ** 63 - 1, c=bytearray(b'hello world'), d=True,
275-
e=datetime.utcfromtimestamp(872835240), f=Decimal('12.3E+7'), g=2.39,
275+
e=utcfromtimestamp(872835240), f=Decimal('12.3E+7'), g=2.39,
276276
h=3.4028234663852886e+38, i='123.123.123.123', j=2147483647, k='text',
277277
l=UUID('FE2B4360-28C6-11E2-81C1-0800200C9A66'),
278278
m=UUID('067e6162-3b6f-4ae2-a171-2470b63dff00'), n=int(str(2147483647) + '000'))

tests/unit/test_types.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from cassandra.util import (
4242
OPEN_BOUND, Date, DateRange, DateRangeBound,
4343
DateRangePrecision, Time, ms_timestamp_from_datetime,
44-
datetime_from_timestamp
44+
datetime_from_timestamp, utcfromtimestamp
4545
)
4646
from tests.unit.util import check_sequence_consistency
4747

@@ -200,7 +200,7 @@ def test_empty_value(self):
200200

201201
def test_datetype(self):
202202
now_time_seconds = time.time()
203-
now_datetime = datetime.datetime.utcfromtimestamp(now_time_seconds)
203+
now_datetime = utcfromtimestamp(now_time_seconds)
204204

205205
# Cassandra timestamps in millis
206206
now_timestamp = now_time_seconds * 1e3
@@ -211,7 +211,7 @@ def test_datetype(self):
211211
# deserialize
212212
# epoc
213213
expected = 0
214-
self.assertEqual(DateType.deserialize(int64_pack(1000 * expected), 0), datetime.datetime.utcfromtimestamp(expected))
214+
self.assertEqual(DateType.deserialize(int64_pack(1000 * expected), 0), utcfromtimestamp(expected))
215215

216216
# beyond 32b
217217
expected = 2 ** 33

0 commit comments

Comments
 (0)