1
1
from typing import Iterable , Tuple
2
2
3
- from httpx import AsyncClient , Response
3
+ from deprecation import deprecated
4
+ from httpx import AsyncClient
4
5
5
6
from postgrest_py .utils import sanitize_param , sanitize_pattern_param
7
+ from postgrest_py .__version__ import __version__
6
8
7
9
8
10
class RequestBuilder :
9
- def __init__ (self , session : AsyncClient , path : str ) -> None :
11
+ def __init__ (self , session : AsyncClient , path : str ):
10
12
self .session = session
11
13
self .path = path
12
- self .json = {}
13
- self .http_method = "GET"
14
-
15
- self .negate_next = False
16
-
17
- @property
18
- def not_ (self ):
19
- self .negate_next = True
20
- return self
21
14
22
15
def select (self , * columns : str ):
23
16
self .session .params ["select" ] = "," .join (columns )
24
- self .http_method = "GET"
25
- return GetRequestBuilder .from_request_builder (self )
17
+ return SelectRequestBuilder (self .session , self .path , "GET" , {})
26
18
27
19
def insert (self , json : dict , * , upsert = False ):
28
20
self .session .headers [
29
21
"Prefer"
30
22
] = f"return=representation{ ',resolution=merge-duplicates' if upsert else '' } "
31
- self .json = json
32
- self .http_method = "POST"
33
- return self
23
+ return NonQueryRequestBuilder (self .session , self .path , "POST" , json )
34
24
35
25
def update (self , json : dict ):
36
26
self .session .headers ["Prefer" ] = "return=representation"
37
- self .json = json
38
- self .http_method = "PATCH"
39
- return self
27
+ return QueryRequestBuilder (self .session , self .path , "PATCH" , json )
40
28
41
29
def delete (self ):
42
- self .http_method = "DELETE"
43
- return self
30
+ return QueryRequestBuilder (self .session , self .path , "DELETE" , {})
31
+
32
+
33
+ class NonQueryRequestBuilder :
34
+ def __init__ (self , session : AsyncClient , path : str , http_method : str , json : dict ):
35
+ self .session = session
36
+ self .path = path
37
+ self .http_method = http_method
38
+ self .json = json
44
39
45
- async def execute (self ) -> Response :
40
+ async def execute (self ):
46
41
r = await self .session .request (self .http_method , self .path , json = self .json )
47
- return r
42
+ return r .json ()
43
+
44
+
45
+ class QueryRequestBuilder (NonQueryRequestBuilder ):
46
+ def __init__ (self , session : AsyncClient , path : str , http_method : str , json : dict ):
47
+ super ().__init__ (session , path , http_method , json )
48
+
49
+ self .negate_next = False
50
+
51
+ @property
52
+ def not_ (self ):
53
+ self .negate_next = True
54
+ return self
48
55
49
56
def filter (self , column : str , operator : str , criteria : str ):
50
57
"""Either filter in or filter out based on Self.negate_next."""
@@ -129,18 +136,15 @@ def adj(self, column: str, range: Tuple[int, int]):
129
136
return self .filter (column , "adj" , f"({ range [0 ]} ,{ range [1 ]} )" )
130
137
131
138
132
- class GetRequestBuilder (RequestBuilder ):
133
- @classmethod
134
- def from_request_builder (cls , builder : RequestBuilder ):
135
- result = cls (builder .session , builder .path )
136
- result .json = builder .json
137
- result .http_method = builder .http_method
138
- return result
139
+ class SelectRequestBuilder (QueryRequestBuilder ):
140
+ def __init__ (self , session : AsyncClient , path : str , http_method : str , json : dict ):
141
+ super ().__init__ (session , path , http_method , json )
139
142
140
143
def order (self , column : str , * , desc = False , nullsfirst = False ):
141
- self .session .params .setdefault ("order" , []).append (
142
- f"{ column } { '.desc' if desc else '' } { '.nullsfirst' if nullsfirst else '' } "
143
- )
144
+ self .session .params [
145
+ "order"
146
+ ] = f"{ column } { '.desc' if desc else '' } { '.nullsfirst' if nullsfirst else '' } "
147
+
144
148
return self
145
149
146
150
def limit (self , size : int , * , start = 0 ):
@@ -156,3 +160,11 @@ def range(self, start: int, end: int):
156
160
def single (self ):
157
161
self .session .headers ["Accept" ] = "application/vnd.pgrst.object+json"
158
162
return self
163
+
164
+
165
+ class GetRequestBuilder (SelectRequestBuilder ):
166
+ """Alias to SelectRequestBuilder."""
167
+
168
+ @deprecated ("0.4.0" , "1.0.0" , __version__ , "Use SelectRequestBuilder instead" )
169
+ def __init__ (self , * args , ** kwargs ):
170
+ super ().__init__ (* args , ** kwargs )
0 commit comments