1+ from typing_extensions import Concatenate
12from tableauserverclient import datetime_helpers as datetime
23
34import abc
45from packaging .version import Version
56from functools import wraps
67from 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+ )
821
922from tableauserverclient .models .pagination_item import PaginationItem
1023from tableauserverclient .server .request_options import RequestOptions
1124
12- from .exceptions import (
25+ from tableauserverclient . server . endpoint .exceptions import (
1326 ServerResponseError ,
1427 InternalServerError ,
1528 NonXMLResponseError ,
1629 NotSignedInError ,
1730)
18- from . .exceptions import EndpointUnavailableError
31+ from tableauserverclient . server .exceptions import EndpointUnavailableError
1932
2033from tableauserverclient .server .query import QuerySet
2134from tableauserverclient import helpers , get_versions
2235
2336from tableauserverclient .helpers .logging import logger
24- from tableauserverclient .config import DELAY_SLEEP_SECONDS
2537
2638if TYPE_CHECKING :
27- from . .server import Server
39+ from tableauserverclient . server .server import Server
2840 from requests import Response
2941
3042
3850USER_AGENT_HEADER = "User-Agent"
3951
4052
41- class Endpoint ( object ) :
53+ class Endpoint :
4254 def __init__ (self , parent_srv : "Server" ):
4355 self .parent_srv = parent_srv
4456
@@ -232,7 +244,12 @@ def patch_request(self, url, xml_request, content_type=XML_CONTENT_TYPE, paramet
232244 )
233245
234246
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 ]]:
236253 """Annotate the minimum supported version for an endpoint.
237254
238255 Checks the version on the server object and compares normalized versions.
@@ -251,9 +268,9 @@ def api(version):
251268 >>> ...
252269 """
253270
254- def _decorator (func ) :
271+ def _decorator (func : Callable [ Concatenate [ E , P ], R ]) -> Callable [ Concatenate [ E , P ], R ] :
255272 @wraps (func )
256- def wrapper (self , * args , ** kwargs ) :
273+ def wrapper (self : E , * args : P . args , ** kwargs : P . kwargs ) -> R :
257274 self .parent_srv .assert_at_least_version (version , self .__class__ .__name__ )
258275 return func (self , * args , ** kwargs )
259276
@@ -262,7 +279,7 @@ def wrapper(self, *args, **kwargs):
262279 return _decorator
263280
264281
265- def parameter_added_in (** params ) :
282+ def parameter_added_in (** params : str ) -> Callable [[ Callable [ Concatenate [ E , P ], R ]], Callable [ Concatenate [ E , P ], R ]] :
266283 """Annotate minimum versions for new parameters or request options on an endpoint.
267284
268285 The api decorator documents when an endpoint was added, this decorator annotates
@@ -285,9 +302,9 @@ def parameter_added_in(**params):
285302 >>> ...
286303 """
287304
288- def _decorator (func ) :
305+ def _decorator (func : Callable [ Concatenate [ E , P ], R ]) -> Callable [ Concatenate [ E , P ], R ] :
289306 @wraps (func )
290- def wrapper (self , * args , ** kwargs ) :
307+ def wrapper (self : E , * args : P . args , ** kwargs : P . kwargs ) -> R :
291308 import warnings
292309
293310 server_ver = Version (self .parent_srv .version or "0.0" )
@@ -335,5 +352,5 @@ def paginate(self, **kwargs) -> QuerySet[T]:
335352 return queryset
336353
337354 @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 ]:
339356 raise NotImplementedError (f".get has not been implemented for { self .__class__ .__qualname__ } " )
0 commit comments