Skip to content

Commit 7600176

Browse files
committed
feat(data-classes): Add appsync scalar_types_utils
Changes: - Move existing scalar util functions in to scalar_types_utils.py - Add support for timezone offset - Add docstrings for scalar utils - Update tests Closes #324
1 parent 5daa45a commit 7600176

File tree

3 files changed

+111
-33
lines changed

3 files changed

+111
-33
lines changed

aws_lambda_powertools/utilities/data_classes/appsync/resolver_utils.py

-26
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,9 @@
1-
import datetime
2-
import time
3-
import uuid
41
from typing import Any, Dict
52

63
from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent
74
from aws_lambda_powertools.utilities.typing import LambdaContext
85

96

10-
def make_id():
11-
return str(uuid.uuid4())
12-
13-
14-
def aws_date():
15-
now = datetime.datetime.utcnow().date()
16-
return now.strftime("%Y-%m-%d")
17-
18-
19-
def aws_time():
20-
now = datetime.datetime.utcnow().time()
21-
return now.strftime("%H:%M:%S")
22-
23-
24-
def aws_datetime():
25-
now = datetime.datetime.utcnow()
26-
return now.strftime("%Y-%m-%dT%H:%M:%SZ")
27-
28-
29-
def aws_timestamp():
30-
return int(time.time())
31-
32-
337
class AppSyncResolver:
348
def __init__(self):
359
self._resolvers: dict = {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import datetime
2+
import time
3+
import uuid
4+
5+
6+
def _formatted_time(now: datetime.date, fmt: str, timezone_offset: int) -> str:
7+
"""String formatted time with optional timezone offset
8+
9+
Parameters
10+
----------
11+
now : datetime.date
12+
Current datetime with zero timezone offset
13+
fmt : str
14+
Data format before adding timezone offset
15+
timezone_offset : int
16+
Timezone offset in hours, defaults to 0
17+
Returns
18+
-------
19+
str
20+
Returns string formatted time with optional timezone offset
21+
"""
22+
if timezone_offset == 0:
23+
return now.strftime(fmt + "Z")
24+
25+
now = now + datetime.timedelta(hours=timezone_offset)
26+
fmt += "+" if timezone_offset > 0 else "-"
27+
fmt += str(abs(timezone_offset)).zfill(2)
28+
fmt += ":00:00"
29+
30+
return now.strftime(fmt)
31+
32+
33+
def make_id() -> str:
34+
"""ID - A unique identifier for an object. This scalar is serialized like a String but isn't meant to be
35+
human-readable."""
36+
return str(uuid.uuid4())
37+
38+
39+
def aws_date(timezone_offset: int = 0) -> str:
40+
"""AWSDate - An extended ISO 8601 date string in the format YYYY-MM-DD.
41+
42+
Parameters
43+
----------
44+
timezone_offset : int
45+
Timezone offset, defaults to 0
46+
47+
Returns
48+
-------
49+
str
50+
Returns current time as AWSDate scalar string with optional timezone offset
51+
"""
52+
return _formatted_time(datetime.datetime.utcnow(), "%Y-%m-%d", timezone_offset)
53+
54+
55+
def aws_time(timezone_offset: int = 0) -> str:
56+
"""AWSTime - An extended ISO 8601 time string in the format hh:mm:ss.sss.
57+
58+
Parameters
59+
----------
60+
timezone_offset : int
61+
Timezone offset, defaults to 0
62+
63+
Returns
64+
-------
65+
str
66+
Returns current time as AWSTime scalar string with optional timezone offset
67+
"""
68+
return _formatted_time(datetime.datetime.utcnow(), "%H:%M:%S", timezone_offset)
69+
70+
71+
def aws_datetime(timezone_offset: int = 0) -> str:
72+
"""AWSDateTime - An extended ISO 8601 date and time string in the format YYYY-MM-DDThh:mm:ss.sssZ.
73+
74+
Parameters
75+
----------
76+
timezone_offset : int
77+
Timezone offset, defaults to 0
78+
79+
Returns
80+
-------
81+
str
82+
Returns current time as AWSDateTime scalar string with optional timezone offset
83+
"""
84+
return _formatted_time(datetime.datetime.utcnow(), "%Y-%m-%dT%H:%M:%S", timezone_offset)
85+
86+
87+
def aws_timestamp() -> int:
88+
"""AWSTimestamp - An integer value representing the number of seconds before or after 1970-01-01-T00:00Z."""
89+
return int(time.time())

tests/functional/appsync/test_appsync_resolver_utils.py

+22-7
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
import pytest
88

99
from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent
10-
from aws_lambda_powertools.utilities.data_classes.appsync.resolver_utils import (
11-
AppSyncResolver,
10+
from aws_lambda_powertools.utilities.data_classes.appsync.resolver_utils import AppSyncResolver
11+
from aws_lambda_powertools.utilities.data_classes.appsync.scalar_types_utils import (
12+
_formatted_time,
1213
aws_date,
1314
aws_datetime,
1415
aws_time,
@@ -196,19 +197,19 @@ def test_make_id():
196197
assert len(uuid) == 36
197198

198199

199-
def test_aws_date():
200+
def test_aws_date_utc():
200201
date_str = aws_date()
201202
assert isinstance(date_str, str)
202-
assert datetime.datetime.strptime(date_str, "%Y-%m-%d")
203+
assert datetime.datetime.strptime(date_str, "%Y-%m-%dZ")
203204

204205

205-
def test_aws_time():
206+
def test_aws_time_utc():
206207
time_str = aws_time()
207208
assert isinstance(time_str, str)
208-
assert datetime.datetime.strptime(time_str, "%H:%M:%S")
209+
assert datetime.datetime.strptime(time_str, "%H:%M:%SZ")
209210

210211

211-
def test_aws_datetime():
212+
def test_aws_datetime_utc():
212213
datetime_str = aws_datetime()
213214
assert isinstance(datetime_str, str)
214215
assert datetime.datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%SZ")
@@ -217,3 +218,17 @@ def test_aws_datetime():
217218
def test_aws_timestamp():
218219
timestamp = aws_timestamp()
219220
assert isinstance(timestamp, int)
221+
222+
223+
def test_format_time_positive():
224+
now = datetime.datetime(2022, 1, 22)
225+
datetime_str = _formatted_time(now, "%Y-%m-%d", 8)
226+
assert isinstance(datetime_str, str)
227+
assert datetime_str == "2022-01-22+08:00:00"
228+
229+
230+
def test_format_time_negative():
231+
now = datetime.datetime(2022, 1, 22, 14, 22, 33)
232+
datetime_str = _formatted_time(now, "%H:%M:%S", -12)
233+
assert isinstance(datetime_str, str)
234+
assert datetime_str == "02:22:33-12:00:00"

0 commit comments

Comments
 (0)