6
6
from datetime import datetime
7
7
from dotenv import load_dotenv
8
8
from decimal import Decimal
9
+ from typing import Literal
9
10
10
11
11
12
class DynoLayer :
@@ -23,15 +24,15 @@ def __init__(
23
24
self ._timestamps = timestamps
24
25
self ._limit = 50
25
26
self ._offset = False
26
- self ._order_by = None
27
- self ._count = None
27
+ self ._order_by = {}
28
+ self ._count = 0
28
29
self ._secondary_index = None
29
30
self ._attributes_to_get = None
30
31
self ._filter_expression = None
31
32
self ._filter_params = None
32
- self ._filter_params_name = None
33
- self ._last_evaluated_key = None
34
- self ._error = None
33
+ self ._filter_params_name = {}
34
+ self ._last_evaluated_key = {}
35
+ self ._error = ''
35
36
self ._is_find_by = False
36
37
self ._is_query_operation = False
37
38
self ._just_count = False
@@ -81,12 +82,19 @@ def _load_dynamo(self):
81
82
82
83
Returns:
83
84
self: The DynoLayer.
85
+ query_by('likes', '>', 10)
84
86
"""
85
87
86
- def query_by (self , key : str , key_value , secondary_index = None ):
88
+ def query_by (
89
+ self ,
90
+ key : str ,
91
+ comparator : Literal ["=" , "<>" , "<" , "<=" , ">" , ">=" ],
92
+ key_value ,
93
+ secondary_index = None
94
+ ):
87
95
self ._is_query_operation = True
88
96
self ._secondary_index = secondary_index
89
- return self .find_by (key , key_value )
97
+ return self .find_by (key , comparator , key_value )
90
98
91
99
"""
92
100
Args:
@@ -99,9 +107,9 @@ def query_by(self, key: str, key_value, secondary_index=None):
99
107
100
108
def find (
101
109
self ,
102
- filter_expression : str = None ,
103
- filter_params : dict = None ,
104
- filter_params_name : dict = None
110
+ filter_expression : str = '' ,
111
+ filter_params : dict = {} ,
112
+ filter_params_name : dict = {}
105
113
):
106
114
self ._filter_expression = filter_expression
107
115
self ._filter_params = filter_params
@@ -131,13 +139,18 @@ def query(
131
139
self: The DynoLayer.
132
140
"""
133
141
134
- def find_by (self , attribute : str , attribute_value ):
142
+ def find_by (
143
+ self ,
144
+ attribute : str ,
145
+ comparator : Literal ["=" , "<>" , "<" , "<=" , ">" , ">=" ],
146
+ attribute_value
147
+ ):
135
148
self ._is_find_by = True
136
149
137
150
if isinstance (attribute_value , dict ) or isinstance (attribute_value , list ):
138
151
attribute_value = json .dumps (attribute_value )
139
152
140
- self ._filter_expression = f'#{ attribute } = :{ attribute } '
153
+ self ._filter_expression = f'#{ attribute } { comparator } :{ attribute } '
141
154
self ._filter_params = {
142
155
f':{ attribute } ' : attribute_value
143
156
}
@@ -383,8 +396,7 @@ def error(self) -> str:
383
396
384
397
def _safe (self ):
385
398
if self ._timestamps :
386
- zone = os .environ .get ('TIMESTAMP_TIMEZONE' ) if os .environ .get ('TIMESTAMP_TIMEZONE' ,
387
- None ) else 'America/Sao_Paulo'
399
+ zone = os .environ .get ('TIMESTAMP_TIMEZONE' , 'America/Sao_Paulo' )
388
400
timezone = pytz .timezone (zone )
389
401
current_date = datetime .now (timezone )
390
402
if not self ._data .get (self ._partition_key ):
@@ -407,7 +419,7 @@ def _required(self):
407
419
required = True
408
420
if len (self ._required_fields ) == 0 :
409
421
return required
410
- for key , value in self ._data .items ():
422
+ for key , _ in self ._data .items ():
411
423
if key not in self ._required_fields :
412
424
required = False
413
425
else :
@@ -503,3 +515,4 @@ def _order_response(self, response, object=False):
503
515
return transformed_response
504
516
505
517
return response
518
+
0 commit comments