1
+ from typing_extensions import Concatenate
1
2
from tableauserverclient import datetime_helpers as datetime
2
3
3
4
import abc
4
5
from packaging .version import Version
5
6
from functools import wraps
6
7
from xml .etree .ElementTree import ParseError
7
- from typing import Any , Callable , Dict , Generic , List , Optional , TYPE_CHECKING , Tuple , TypeVar , Union
8
+ from typing import (
9
+ Any ,
10
+ Callable ,
11
+ Dict ,
12
+ Generic ,
13
+ List ,
14
+ Optional ,
15
+ TYPE_CHECKING ,
16
+ ParamSpec ,
17
+ Tuple ,
18
+ TypeVar ,
19
+ Union ,
20
+ )
8
21
9
22
from tableauserverclient .models .pagination_item import PaginationItem
10
23
from tableauserverclient .server .request_options import RequestOptions
11
24
12
- from .exceptions import (
25
+ from tableauserverclient . server . endpoint .exceptions import (
13
26
ServerResponseError ,
14
27
InternalServerError ,
15
28
NonXMLResponseError ,
16
29
E864
NotSignedInError ,
17
30
)
18
- from . .exceptions import EndpointUnavailableError
31
+ from tableauserverclient . server .exceptions import EndpointUnavailableError
19
32
20
33
from tableauserverclient .server .query import QuerySet
21
34
from tableauserverclient import helpers , get_versions
22
35
23
36
from tableauserverclient .helpers .logging import logger
24
- from tableauserverclient .config import DELAY_SLEEP_SECONDS
25
37
26
38
if TYPE_CHECKING :
27
- from . .server import Server
39
+ from tableauserverclient . server .server import Server
28
40
from requests import Response
29
41
30
42
38
50
USER_AGENT_HEADER = "User-Agent"
39
51
40
52
41
- class Endpoint ( object ) :
53
+ class Endpoint :
42
54
def __init__ (self , parent_srv : "Server" ):
43
55
self .parent_srv = parent_srv
44
56
@@ -232,7 +244,12 @@ def patch_request(self, url, xml_request, content_type=XML_CONTENT_TYPE, paramet
232
244
)
233
245
234
246
235
- def api (version ):
247
+ E = TypeVar ("E" , bound = "Endpoint" )
248
+ P = ParamSpec ("P" )
249
+ R = TypeVar ("R" )
250
+
251
+
252
+ def api (version : str ) -> Callable [[Callable [Concatenate [E , P ], R ]], Callable [Concatenate [E , P ], R ]]:
236
253
"""Annotate the minimum supported version for an endpoint.
237
254
238
255
Checks the version on the server object and compares normalized versions.
@@ -251,9 +268,9 @@ def api(version):
251
268
>>> ...
252
269
"""
253
270
254
- def _decorator (func ) :
271
+ def _decorator (func : Callable [ Concatenate [ E , P ], R ]) -> Callable [ Concatenate [ E , P ], R ] :
255
272
@wraps (func )
256
- def wrapper (self , * args , ** kwargs ) :
273
+ def wrapper (self : E , * args : P . args , ** kwargs : P . kwargs ) -> R :
257
274
self .parent_srv .assert_at_least_version (version , self .__class__ .__name__ )
258
275
return func (self , * args , ** kwargs )
259
276
@@ -262,7 +279,7 @@ def wrapper(self, *args, **kwargs):
262
279
return _decorator
263
280
264
281
265
- def parameter_added_in (** params ) :
282
+ def parameter_added_in (** params : str ) -> Callable [[ Callable [ Concatenate [ E , P ], R ]], Callable [ Concatenate [ E , P ], R ]] :
266
283
"""Annotate minimum versions for new parameters or request options on an endpoint.
267
284
268
285
The api decorator documents when an endpoint was added, this decorator annotates
@@ -285,9 +302,9 @@ def parameter_added_in(**params):
285
302
>>> ...
286
303
"""
287
304
288
- def _decorator (func ) :
305
+ def _decorator (func : Callable [ Concatenate [ E , P ], R ]) -> Callable [ Concatenate [ E , P ], R ] :
289
306
@wraps (func )
290
- def wrapper (self , * args , ** kwargs ) :
307
+ def wrapper (self : E , * args : P . args , ** kwargs : P . kwargs ) -> R :
291
308
import warnings
292
309
293
310
server_ver = Version (self .parent_srv .version or "0.0" )
@@ -335,5 +352,5 @@ def paginate(self, **kwargs) -> QuerySet[T]:
335
352
return queryset
336
353
337
354
@abc .abstractmethod
338
- def get (self , request_options : RequestOptions ) -> Tuple [List [T ], PaginationItem ]:
355
+ def get (self , request_options : Optional [ RequestOptions ] = None ) -> Tuple [List [T ], PaginationItem ]:
339
356
raise NotImplementedError (f".get has not been implemented for { self .__class__ .__qualname__ } " )
0 commit comments