Skip to content

Commit 76f2c32

Browse files
committed
Simplify enriched_datetime
1 parent baf53cd commit 76f2c32

12 files changed

Lines changed: 115 additions & 318 deletions

sqlalchemy_utils/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@
6868
DateTimeRangeType,
6969
EmailType,
7070
EncryptedType,
71-
EnrichedDateTimeType,
72-
EnrichedDateType,
7371
instrumented_list,
7472
InstrumentedList,
7573
Int8RangeType,

sqlalchemy_utils/types/__init__.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
EncryptedType,
1313
StringEncryptedType
1414
)
15-
from .enriched_datetime.enriched_date_type import EnrichedDateType # noqa
1615
from .ip_address import IPAddressType # noqa
1716
from .json import JSONType # noqa
1817
from .locale import LocaleType # noqa
@@ -42,8 +41,6 @@
4241
from .uuid import UUIDType # noqa
4342
from .weekdays import WeekDaysType # noqa
4443

45-
from .enriched_datetime.enriched_datetime_type import EnrichedDateTimeType # noqa isort:skip
46-
4744

4845
class InstrumentedList(_InstrumentedList):
4946
"""Enhanced version of SQLAlchemy InstrumentedList. Provides some

sqlalchemy_utils/types/arrow.py

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1 @@
1-
from ..exceptions import ImproperlyConfigured
2-
from .enriched_datetime import ArrowDateTime
3-
from .enriched_datetime.enriched_datetime_type import EnrichedDateTimeType
4-
5-
arrow = None
6-
try:
7-
import arrow
8-
except ImportError:
9-
pass
10-
11-
12-
class ArrowType(EnrichedDateTimeType):
13-
"""
14-
ArrowType provides way of saving Arrow_ objects into database. It
15-
automatically changes Arrow_ objects to datetime objects on the way in and
16-
datetime objects back to Arrow_ objects on the way out (when querying
17-
database). ArrowType needs Arrow_ library installed.
18-
19-
.. _Arrow: https://github.com/arrow-py/arrow
20-
21-
::
22-
23-
from datetime import datetime
24-
from sqlalchemy_utils import ArrowType
25-
import arrow
26-
27-
28-
class Article(Base):
29-
__tablename__ = 'article'
30-
id = sa.Column(sa.Integer, primary_key=True)
31-
name = sa.Column(sa.Unicode(255))
32-
created_at = sa.Column(ArrowType)
33-
34-
35-
36-
article = Article(created_at=arrow.utcnow())
37-
38-
39-
As you may expect all the arrow goodies come available:
40-
41-
::
42-
43-
44-
article.created_at = article.created_at.replace(hours=-1)
45-
46-
article.created_at.humanize()
47-
# 'an hour ago'
48-
49-
"""
50-
cache_ok = True
51-
52-
def __init__(self, *args, **kwargs):
53-
if not arrow:
54-
raise ImproperlyConfigured(
55-
"'arrow' package is required to use 'ArrowType'"
56-
)
57-
58-
super().__init__(
59-
datetime_processor=ArrowDateTime,
60-
*args,
61-
**kwargs
62-
)
1+
from .enriched_datetime import ArrowDateTime as ArrowType
Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from collections.abc import Iterable
22
from datetime import datetime
33

4+
from sqlalchemy import types
5+
6+
from ..scalar_coercible import ScalarCoercible
47
from ...exceptions import ImproperlyConfigured
58

69
arrow = None
@@ -10,14 +13,36 @@
1013
pass
1114

1215

13-
class ArrowDateTime:
14-
def __init__(self):
16+
class ArrowDateTime(types.TypeDecorator, ScalarCoercible):
17+
"""Datetime column that uses arrow dates.
18+
19+
Example::
20+
21+
22+
from sqlalchemy_utils.enriched_datetime import ArrowDateTime
23+
import arrow
24+
25+
class User(Base):
26+
__tablename__ = 'user'
27+
id = sa.Column(sa.Integer, primary_key=True)
28+
created_at = sa.Column(ArrowDateTime)
29+
30+
user = User()
31+
user.created_at = arrow.now()
32+
session.add(user)
33+
session.commit()
34+
"""
35+
impl = types.DateTime
36+
cache_ok = True
37+
38+
def __init__(self, *args, **kwargs):
1539
if not arrow:
1640
raise ImproperlyConfigured(
1741
"'arrow' package is required to use 'ArrowDateTime'"
1842
)
43+
super().__init__(*args, **kwargs)
1944

20-
def _coerce(self, impl, value):
45+
def _coerce(self, value):
2146
if isinstance(value, str):
2247
value = arrow.get(value)
2348
elif isinstance(value, Iterable):
@@ -26,14 +51,17 @@ def _coerce(self, impl, value):
2651
value = arrow.get(value)
2752
return value
2853

29-
def process_bind_param(self, impl, value, dialect):
54+
def process_bind_param(self, value, dialect):
3055
if value:
31-
utc_val = self._coerce(impl, value).to('UTC')
56+
utc_val = self._coerce(value).to('UTC')
3257
return utc_val.datetime\
33-
if impl.timezone else utc_val.naive
58+
if self.impl.timezone else utc_val.naive
3459
return value
3560

36-
def process_result_value(self, impl, value, dialect):
61+
def process_result_value(self, value, dialect):
3762
if value:
3863
return arrow.get(value)
3964
return value
65+
66+
def process_literal_param(self, value, dialect):
67+
return value

sqlalchemy_utils/types/enriched_datetime/enriched_date_type.py

Lines changed: 0 additions & 50 deletions
This file was deleted.

sqlalchemy_utils/types/enriched_datetime/enriched_datetime_type.py

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from sqlalchemy import types
2+
13
from ...exceptions import ImproperlyConfigured
24
from .pendulum_datetime import PendulumDateTime
35

@@ -9,24 +11,22 @@
911

1012

1113
class PendulumDate(PendulumDateTime):
12-
def __init__(self):
13-
if not pendulum:
14-
raise ImproperlyConfigured(
15-
"'pendulum' package is required to use 'PendulumDate'"
16-
)
1714

18-
def _coerce(self, impl, value):
15+
cache_ok = True
16+
impl = types.Date
17+
18+
def _coerce(self, value):
1919
if value:
2020
if not isinstance(value, pendulum.Date):
21-
value = super()._coerce(impl, value).date()
21+
value = super()._coerce(value).date()
2222
return value
2323

24-
def process_result_value(self, impl, value, dialect):
24+
def process_result_value(self, value, dialect):
2525
if value:
2626
return pendulum.parse(value.isoformat()).date()
2727
return value
2828

29-
def process_bind_param(self, impl, value, dialect):
29+
def process_bind_param(self, value, dialect):
3030
if value:
31-
return self._coerce(impl, value)
31+
return self._coerce(value)
3232
return value

sqlalchemy_utils/types/enriched_datetime/pendulum_datetime.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import datetime
22

3+
from sqlalchemy import types
4+
5+
from ..scalar_coercible import ScalarCoercible
36
from ...exceptions import ImproperlyConfigured
47

58
pendulum = None
@@ -9,14 +12,38 @@
912
pass
1013

1114

12-
class PendulumDateTime:
13-
def __init__(self):
15+
class PendulumDateTime(types.TypeDecorator, ScalarCoercible):
16+
"""Datetime column that uses PendulumDateTime as values.
17+
18+
Example::
19+
20+
21+
from sqlalchemy_utils.enriched_datetime import PendulumDateTime
22+
import pendulum
23+
24+
class User(Base):
25+
__tablename__ = 'user'
26+
id = sa.Column(sa.Integer, primary_key=True)
27+
created_at = sa.Column(PendulumDateTime)
28+
29+
user = User()
30+
user.created_at = pendulum.now()
31+
session.add(user)
32+
session.commit()
33+
"""
34+
35+
impl = types.DateTime
36+
cache_ok = True
37+
38+
def __init__(self, *args, **kwargs):
1439
if not pendulum:
1540
raise ImproperlyConfigured(
1641
"'pendulum' package is required to use 'PendulumDateTime'"
1742
)
43+
super().__init__(*args, **kwargs)
44+
1845

19-
def _coerce(self, impl, value):
46+
def _coerce(self, value):
2047
if value is not None:
2148
if isinstance(value, pendulum.DateTime):
2249
pass
@@ -30,14 +57,17 @@ def _coerce(self, impl, value):
3057
value = pendulum.parse(value)
3158
return value
3259

33-
def process_bind_param(self, impl, value, dialect):
60+
def process_bind_param(self, value, dialect):
3461
if value:
35-
return self._coerce(impl, value).in_tz('UTC').naive()
62+
return self._coerce(value).in_tz('UTC').naive()
3663
return value
3764

38-
def process_result_value(self, impl, value, dialect):
65+
def process_result_value(self, value, dialect):
3966
if value:
4067
return pendulum.DateTime.instance(
4168
value.replace(tzinfo=datetime.timezone.utc)
4269
)
4370
return value
71+
72+
def process_literal_param(self, value, dialect):
73+
return value

0 commit comments

Comments
 (0)