1
1
import requests
2
2
import logging
3
- from distutils .version import LooseVersion as Version
3
+ from packaging .version import Version
4
4
from functools import wraps
5
5
from xml .etree .ElementTree import ParseError
6
6
from typing import Any , Callable , Dict , Optional , TYPE_CHECKING
11
11
NonXMLResponseError ,
12
12
EndpointUnavailableError ,
13
13
)
14
- from .. import endpoint
15
14
from ..query import QuerySet
16
15
from ... import helpers
16
+ from ..._version import get_versions
17
+
18
+ __TSC_VERSION__ = get_versions ()["version" ]
19
+ del get_versions
17
20
18
21
logger = logging .getLogger ("tableau.endpoint" )
19
22
22
25
XML_CONTENT_TYPE = "text/xml"
23
26
JSON_CONTENT_TYPE = "application/json"
24
27
28
+ USERAGENT_HEADER = "User-Agent"
29
+
25
30
if TYPE_CHECKING :
26
31
from ..server import Server
27
32
from requests import Response
28
33
29
34
30
- _version_header : Optional [str ] = None
31
-
32
-
33
35
class Endpoint (object ):
34
36
def __init__ (self , parent_srv : "Server" ):
35
- global _version_header
36
37
self .parent_srv = parent_srv
37
38
38
39
@staticmethod
39
40
def _make_common_headers (auth_token , content_type ):
40
- global _version_header
41
-
42
- if not _version_header :
43
- from ..server import __TSC_VERSION__
44
-
45
- _version_header = __TSC_VERSION__
46
-
47
41
headers = {}
48
42
if auth_token is not None :
49
43
headers ["x-tableau-auth" ] = auth_token
50
44
if content_type is not None :
51
45
headers ["content-type" ] = content_type
52
- headers ["User-Agent" ] = "Tableau Server Client/{}" .format (_version_header )
46
+ headers ["User-Agent" ] = "Tableau Server Client/{}" .format (__TSC_VERSION__ )
53
47
return headers
54
48
55
49
def _make_request (
@@ -62,9 +56,9 @@ def _make_request(
62
56
parameters : Optional [Dict [str , Any ]] = None ,
63
57
) -> "Response" :
64
58
parameters = parameters or {}
65
- parameters .update (self .parent_srv .http_options )
66
59
if "headers" not in parameters :
67
60
parameters ["headers" ] = {}
61
+ parameters .update (self .parent_srv .http_options )
68
62
parameters ["headers" ].update (Endpoint ._make_common_headers (auth_token , content_type ))
69
63
70
64
if content is not None :
@@ -89,14 +83,12 @@ def _check_status(self, server_response, url: str = None):
89
83
if server_response .status_code >= 500 :
90
84
raise InternalServerError (server_response , url )
91
85
elif server_response .status_code not in Success_codes :
92
- # todo: is an error reliably of content-type application/xml?
93
86
try :
94
87
raise ServerResponseError .from_response (server_response .content , self .parent_srv .namespace , url )
95
88
except ParseError :
96
- # This will happen if we get a non-success HTTP code that
97
- # doesn't return an xml error object (like metadata endpoints or 503 pages)
98
- # we convert this to a better exception and pass through the raw
99
- # response body
89
+ # This will happen if we get a non-success HTTP code that doesn't return an xml error object
90
+ # e.g metadata endpoints, 503 pages, totally different servers
91
+ # we convert this to a better exception and pass through the raw response body
100
92
raise NonXMLResponseError (server_response .content )
101
93
except Exception :
102
94
# anything else re-raise here
@@ -194,7 +186,7 @@ def api(version):
194
186
def _decorator (func ):
195
187
@wraps (func )
196
188
def wrapper (self , * args , ** kwargs ):
197
- self .parent_srv .assert_at_least_version (version , "endpoint" )
189
+ self .parent_srv .assert_at_least_version (version , self . __class__ . __name__ )
198
190
return func (self , * args , ** kwargs )
199
191
200
192
return wrapper
0 commit comments