tableauserverclient 0.30.post0.dev1__py3-none-any.whl → 0.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tableauserverclient/__init__.py +64 -4
- tableauserverclient/_version.py +3 -3
- tableauserverclient/models/__init__.py +88 -37
- tableauserverclient/models/datasource_item.py +18 -6
- tableauserverclient/models/favorites_item.py +7 -7
- tableauserverclient/models/permissions_item.py +46 -1
- tableauserverclient/models/project_item.py +4 -3
- tableauserverclient/models/reference_item.py +5 -0
- tableauserverclient/models/tableau_auth.py +22 -23
- tableauserverclient/server/__init__.py +83 -8
- tableauserverclient/server/endpoint/__init__.py +61 -28
- tableauserverclient/server/endpoint/custom_views_endpoint.py +1 -1
- tableauserverclient/server/endpoint/databases_endpoint.py +0 -11
- tableauserverclient/server/endpoint/datasources_endpoint.py +12 -28
- tableauserverclient/server/endpoint/endpoint.py +23 -8
- tableauserverclient/server/endpoint/favorites_endpoint.py +1 -1
- tableauserverclient/server/endpoint/flow_runs_endpoint.py +1 -1
- tableauserverclient/server/endpoint/flows_endpoint.py +1 -11
- tableauserverclient/server/endpoint/groups_endpoint.py +3 -17
- tableauserverclient/server/endpoint/jobs_endpoint.py +1 -1
- tableauserverclient/server/endpoint/metadata_endpoint.py +3 -3
- tableauserverclient/server/endpoint/metrics_endpoint.py +1 -1
- tableauserverclient/server/endpoint/projects_endpoint.py +7 -18
- tableauserverclient/server/endpoint/tables_endpoint.py +0 -10
- tableauserverclient/server/endpoint/users_endpoint.py +1 -1
- tableauserverclient/server/endpoint/views_endpoint.py +4 -2
- tableauserverclient/server/endpoint/workbooks_endpoint.py +7 -36
- tableauserverclient/server/pager.py +47 -46
- tableauserverclient/server/query.py +61 -33
- tableauserverclient/server/request_factory.py +14 -42
- tableauserverclient/server/server.py +5 -6
- {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/METADATA +3 -4
- {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/RECORD +37 -37
- {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/WHEEL +1 -1
- {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/LICENSE +0 -0
- {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/LICENSE.versioneer +0 -0
- {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/top_level.txt +0 -0
|
@@ -1,9 +1,28 @@
|
|
|
1
|
+
import copy
|
|
1
2
|
from functools import partial
|
|
3
|
+
from typing import Generic, Iterable, Iterator, List, Optional, Protocol, Tuple, TypeVar, Union, runtime_checkable
|
|
2
4
|
|
|
3
|
-
from . import
|
|
5
|
+
from tableauserverclient.models.pagination_item import PaginationItem
|
|
6
|
+
from tableauserverclient.server.request_options import RequestOptions
|
|
4
7
|
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
T = TypeVar("T")
|
|
10
|
+
ReturnType = Tuple[List[T], PaginationItem]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@runtime_checkable
|
|
14
|
+
class Endpoint(Protocol):
|
|
15
|
+
def get(self, req_options: Optional[RequestOptions], **kwargs) -> ReturnType:
|
|
16
|
+
...
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@runtime_checkable
|
|
20
|
+
class CallableEndpoint(Protocol):
|
|
21
|
+
def __call__(self, __req_options: Optional[RequestOptions], **kwargs) -> ReturnType:
|
|
22
|
+
...
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Pager(Iterable[T]):
|
|
7
26
|
"""
|
|
8
27
|
Generator that takes an endpoint (top level endpoints with `.get)` and lazily loads items from Server.
|
|
9
28
|
Supports all `RequestOptions` including starting on any page. Also used by models to load sub-models
|
|
@@ -12,12 +31,17 @@ class Pager(object):
|
|
|
12
31
|
Will loop over anything that returns (List[ModelItem], PaginationItem).
|
|
13
32
|
"""
|
|
14
33
|
|
|
15
|
-
def __init__(
|
|
16
|
-
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
endpoint: Union[CallableEndpoint, Endpoint],
|
|
37
|
+
request_opts: Optional[RequestOptions] = None,
|
|
38
|
+
**kwargs,
|
|
39
|
+
) -> None:
|
|
40
|
+
if isinstance(endpoint, Endpoint):
|
|
17
41
|
# The simpliest case is to take an Endpoint and call its get
|
|
18
42
|
endpoint = partial(endpoint.get, **kwargs)
|
|
19
43
|
self._endpoint = endpoint
|
|
20
|
-
elif
|
|
44
|
+
elif isinstance(endpoint, CallableEndpoint):
|
|
21
45
|
# but if they pass a callable then use that instead (used internally)
|
|
22
46
|
endpoint = partial(endpoint, **kwargs)
|
|
23
47
|
self._endpoint = endpoint
|
|
@@ -25,47 +49,24 @@ class Pager(object):
|
|
|
25
49
|
# Didn't get something we can page over
|
|
26
50
|
raise ValueError("Pager needs a server endpoint to page through.")
|
|
27
51
|
|
|
28
|
-
self._options = request_opts
|
|
52
|
+
self._options = request_opts or RequestOptions()
|
|
29
53
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
yield current_item_list.pop(0)
|
|
45
|
-
|
|
46
|
-
return
|
|
47
|
-
|
|
48
|
-
# Get the rest on demand as a generator
|
|
49
|
-
while self._count < last_pagination_item.total_available:
|
|
50
|
-
if (
|
|
51
|
-
len(current_item_list) == 0
|
|
52
|
-
and (last_pagination_item.page_number * last_pagination_item.page_size)
|
|
53
|
-
< last_pagination_item.total_available
|
|
54
|
-
):
|
|
55
|
-
current_item_list, last_pagination_item = self._load_next_page(last_pagination_item)
|
|
56
|
-
|
|
57
|
-
try:
|
|
58
|
-
yield current_item_list.pop(0)
|
|
59
|
-
self._count += 1
|
|
60
|
-
|
|
61
|
-
except IndexError:
|
|
62
|
-
# The total count on Server changed while fetching exit gracefully
|
|
54
|
+
def __iter__(self) -> Iterator[T]:
|
|
55
|
+
options = copy.deepcopy(self._options)
|
|
56
|
+
while True:
|
|
57
|
+
# Fetch the first page
|
|
58
|
+
current_item_list, pagination_item = self._endpoint(options)
|
|
59
|
+
|
|
60
|
+
if pagination_item.total_available is None:
|
|
61
|
+
# This endpoint does not support pagination, drain the list and return
|
|
62
|
+
yield from current_item_list
|
|
63
|
+
return
|
|
64
|
+
yield from current_item_list
|
|
65
|
+
|
|
66
|
+
if pagination_item.page_size * pagination_item.page_number >= pagination_item.total_available:
|
|
67
|
+
# Last page, exit
|
|
63
68
|
return
|
|
64
69
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if self._options is not None:
|
|
69
|
-
opts.sort, opts.filter = self._options.sort, self._options.filter
|
|
70
|
-
current_item_list, last_pagination_item = self._endpoint(opts)
|
|
71
|
-
return current_item_list, last_pagination_item
|
|
70
|
+
# Update the options to fetch the next page
|
|
71
|
+
options.pagenumber = pagination_item.page_number + 1
|
|
72
|
+
options.pagesize = pagination_item.page_size
|
|
@@ -1,9 +1,25 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from
|
|
4
|
-
from .
|
|
1
|
+
from collections.abc import Sized
|
|
2
|
+
from itertools import count
|
|
3
|
+
from typing import Iterable, Iterator, List, Optional, Protocol, Tuple, TYPE_CHECKING, TypeVar, overload
|
|
4
|
+
from tableauserverclient.models.pagination_item import PaginationItem
|
|
5
|
+
from tableauserverclient.server.filter import Filter
|
|
6
|
+
from tableauserverclient.server.request_options import RequestOptions
|
|
7
|
+
from tableauserverclient.server.sort import Sort
|
|
5
8
|
import math
|
|
6
9
|
|
|
10
|
+
from typing_extensions import Self
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from tableauserverclient.server.endpoint import QuerysetEndpoint
|
|
14
|
+
|
|
15
|
+
T = TypeVar("T")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Slice(Protocol):
|
|
19
|
+
start: Optional[int]
|
|
20
|
+
step: Optional[int]
|
|
21
|
+
stop: Optional[int]
|
|
22
|
+
|
|
7
23
|
|
|
8
24
|
def to_camel_case(word: str) -> str:
|
|
9
25
|
return word.split("_")[0] + "".join(x.capitalize() or "_" for x in word.split("_")[1:])
|
|
@@ -16,28 +32,35 @@ see pagination_sample
|
|
|
16
32
|
"""
|
|
17
33
|
|
|
18
34
|
|
|
19
|
-
class QuerySet:
|
|
20
|
-
def __init__(self, model):
|
|
35
|
+
class QuerySet(Iterable[T], Sized):
|
|
36
|
+
def __init__(self, model: "QuerysetEndpoint[T]", page_size: Optional[int] = None) -> None:
|
|
21
37
|
self.model = model
|
|
22
|
-
self.request_options = RequestOptions()
|
|
23
|
-
self._result_cache =
|
|
24
|
-
self._pagination_item =
|
|
38
|
+
self.request_options = RequestOptions(pagesize=page_size or 100)
|
|
39
|
+
self._result_cache: List[T] = []
|
|
40
|
+
self._pagination_item = PaginationItem()
|
|
25
41
|
|
|
26
|
-
def __iter__(self):
|
|
42
|
+
def __iter__(self: Self) -> Iterator[T]:
|
|
27
43
|
# Not built to be re-entrant. Starts back at page 1, and empties
|
|
28
|
-
# the result cache.
|
|
29
|
-
|
|
30
|
-
self._result_cache =
|
|
31
|
-
total = self.total_available
|
|
32
|
-
size = self.page_size
|
|
33
|
-
yield from self._result_cache
|
|
44
|
+
# the result cache. Ensure the result_cache is empty to not yield
|
|
45
|
+
# items from prior usage.
|
|
46
|
+
self._result_cache = []
|
|
34
47
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
self.
|
|
38
|
-
self._result_cache = None
|
|
48
|
+
for page in count(1):
|
|
49
|
+
self.request_options.pagenumber = page
|
|
50
|
+
self._result_cache = []
|
|
39
51
|
self._fetch_all()
|
|
40
52
|
yield from self._result_cache
|
|
53
|
+
# Set result_cache to empty so the fetch will populate
|
|
54
|
+
if (page * self.page_size) >= len(self):
|
|
55
|
+
return
|
|
56
|
+
|
|
57
|
+
@overload
|
|
58
|
+
def __getitem__(self: Self, k: Slice) -> List[T]:
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
@overload
|
|
62
|
+
def __getitem__(self: Self, k: int) -> T:
|
|
63
|
+
...
|
|
41
64
|
|
|
42
65
|
def __getitem__(self, k):
|
|
43
66
|
page = self.page_number
|
|
@@ -78,7 +101,7 @@ class QuerySet:
|
|
|
78
101
|
return self._result_cache[k % size]
|
|
79
102
|
elif k in range(self.total_available):
|
|
80
103
|
# Otherwise, check if k is even sensible to return
|
|
81
|
-
self._result_cache =
|
|
104
|
+
self._result_cache = []
|
|
82
105
|
# Add one to k, otherwise it gets stuck at page boundaries, e.g. 100
|
|
83
106
|
self.request_options.pagenumber = max(1, math.ceil((k + 1) / size))
|
|
84
107
|
return self[k]
|
|
@@ -86,53 +109,57 @@ class QuerySet:
|
|
|
86
109
|
# If k is unreasonable, raise an IndexError.
|
|
87
110
|
raise IndexError
|
|
88
111
|
|
|
89
|
-
def _fetch_all(self):
|
|
112
|
+
def _fetch_all(self: Self) -> None:
|
|
90
113
|
"""
|
|
91
114
|
Retrieve the data and store result and pagination item in cache
|
|
92
115
|
"""
|
|
93
|
-
if self._result_cache
|
|
116
|
+
if not self._result_cache:
|
|
94
117
|
self._result_cache, self._pagination_item = self.model.get(self.request_options)
|
|
95
118
|
|
|
96
|
-
def __len__(self) -> int:
|
|
119
|
+
def __len__(self: Self) -> int:
|
|
97
120
|
return self.total_available
|
|
98
121
|
|
|
99
122
|
@property
|
|
100
|
-
def total_available(self) -> int:
|
|
123
|
+
def total_available(self: Self) -> int:
|
|
101
124
|
self._fetch_all()
|
|
102
125
|
return self._pagination_item.total_available
|
|
103
126
|
|
|
104
127
|
@property
|
|
105
|
-
def page_number(self) -> int:
|
|
128
|
+
def page_number(self: Self) -> int:
|
|
106
129
|
self._fetch_all()
|
|
107
130
|
return self._pagination_item.page_number
|
|
108
131
|
|
|
109
132
|
@property
|
|
110
|
-
def page_size(self) -> int:
|
|
133
|
+
def page_size(self: Self) -> int:
|
|
111
134
|
self._fetch_all()
|
|
112
135
|
return self._pagination_item.page_size
|
|
113
136
|
|
|
114
|
-
def filter(self, *invalid, **kwargs):
|
|
137
|
+
def filter(self: Self, *invalid, page_size: Optional[int] = None, **kwargs) -> Self:
|
|
115
138
|
if invalid:
|
|
116
|
-
raise RuntimeError(
|
|
139
|
+
raise RuntimeError("Only accepts keyword arguments.")
|
|
117
140
|
for kwarg_key, value in kwargs.items():
|
|
118
141
|
field_name, operator = self._parse_shorthand_filter(kwarg_key)
|
|
119
142
|
self.request_options.filter.add(Filter(field_name, operator, value))
|
|
143
|
+
|
|
144
|
+
if page_size:
|
|
145
|
+
self.request_options.pagesize = page_size
|
|
120
146
|
return self
|
|
121
147
|
|
|
122
|
-
def order_by(self, *args):
|
|
148
|
+
def order_by(self: Self, *args) -> Self:
|
|
123
149
|
for arg in args:
|
|
124
150
|
field_name, direction = self._parse_shorthand_sort(arg)
|
|
125
151
|
self.request_options.sort.add(Sort(field_name, direction))
|
|
126
152
|
return self
|
|
127
153
|
|
|
128
|
-
def paginate(self, **kwargs):
|
|
154
|
+
def paginate(self: Self, **kwargs) -> Self:
|
|
129
155
|
if "page_number" in kwargs:
|
|
130
156
|
self.request_options.pagenumber = kwargs["page_number"]
|
|
131
157
|
if "page_size" in kwargs:
|
|
132
158
|
self.request_options.pagesize = kwargs["page_size"]
|
|
133
159
|
return self
|
|
134
160
|
|
|
135
|
-
|
|
161
|
+
@staticmethod
|
|
162
|
+
def _parse_shorthand_filter(key: str) -> Tuple[str, str]:
|
|
136
163
|
tokens = key.split("__", 1)
|
|
137
164
|
if len(tokens) == 1:
|
|
138
165
|
operator = RequestOptions.Operator.Equals
|
|
@@ -146,7 +173,8 @@ class QuerySet:
|
|
|
146
173
|
raise ValueError("Field name `{}` is not valid.".format(field))
|
|
147
174
|
return (field, operator)
|
|
148
175
|
|
|
149
|
-
|
|
176
|
+
@staticmethod
|
|
177
|
+
def _parse_shorthand_sort(key: str) -> Tuple[str, str]:
|
|
150
178
|
direction = RequestOptions.Direction.Asc
|
|
151
179
|
if key.startswith("-"):
|
|
152
180
|
direction = RequestOptions.Direction.Desc
|
|
@@ -418,19 +418,10 @@ class GroupRequest(object):
|
|
|
418
418
|
import_element.attrib["siteRole"] = group_item.minimum_site_role
|
|
419
419
|
return ET.tostring(xml_request)
|
|
420
420
|
|
|
421
|
-
def update_req(
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
warnings.simplefilter("always", DeprecationWarning)
|
|
427
|
-
warnings.warn(
|
|
428
|
-
'RequestFactory.Group.update_req(...default_site_role="") is deprecated, '
|
|
429
|
-
"please set the minimum_site_role field of GroupItem",
|
|
430
|
-
DeprecationWarning,
|
|
431
|
-
)
|
|
432
|
-
group_item.minimum_site_role = default_site_role
|
|
433
|
-
|
|
421
|
+
def update_req(
|
|
422
|
+
self,
|
|
423
|
+
group_item: GroupItem,
|
|
424
|
+
) -> bytes:
|
|
434
425
|
xml_request = ET.Element("tsRequest")
|
|
435
426
|
group_element = ET.SubElement(xml_request, "group")
|
|
436
427
|
|
|
@@ -491,6 +482,9 @@ class ProjectRequest(object):
|
|
|
491
482
|
project_element.attrib["contentPermissions"] = project_item.content_permissions
|
|
492
483
|
if project_item.parent_id is not None:
|
|
493
484
|
project_element.attrib["parentProjectId"] = project_item.parent_id
|
|
485
|
+
if (owner := project_item.owner_id) is not None:
|
|
486
|
+
owner_element = ET.SubElement(project_element, "owner")
|
|
487
|
+
owner_element.attrib["id"] = owner
|
|
494
488
|
return ET.tostring(xml_request)
|
|
495
489
|
|
|
496
490
|
def create_req(self, project_item: "ProjectItem") -> bytes:
|
|
@@ -893,9 +887,7 @@ class WorkbookRequest(object):
|
|
|
893
887
|
def _generate_xml(
|
|
894
888
|
self,
|
|
895
889
|
workbook_item,
|
|
896
|
-
connection_credentials=None,
|
|
897
890
|
connections=None,
|
|
898
|
-
hidden_views=None,
|
|
899
891
|
):
|
|
900
892
|
xml_request = ET.Element("tsRequest")
|
|
901
893
|
workbook_element = ET.SubElement(xml_request, "workbook")
|
|
@@ -905,12 +897,6 @@ class WorkbookRequest(object):
|
|
|
905
897
|
project_element = ET.SubElement(workbook_element, "project")
|
|
906
898
|
project_element.attrib["id"] = str(workbook_item.project_id)
|
|
907
899
|
|
|
908
|
-
if connection_credentials is not None and connections is not None:
|
|
909
|
-
raise RuntimeError("You cannot set both `connections` and `connection_credentials`")
|
|
910
|
-
|
|
911
|
-
if connection_credentials is not None and connection_credentials != False:
|
|
912
|
-
_add_credentials_element(workbook_element, connection_credentials)
|
|
913
|
-
|
|
914
900
|
if connections is not None and connections != False and len(connections) > 0:
|
|
915
901
|
connections_element = ET.SubElement(workbook_element, "connections")
|
|
916
902
|
for connection in connections:
|
|
@@ -919,17 +905,6 @@ class WorkbookRequest(object):
|
|
|
919
905
|
if workbook_item.description is not None:
|
|
920
906
|
workbook_element.attrib["description"] = workbook_item.description
|
|
921
907
|
|
|
922
|
-
if hidden_views is not None:
|
|
923
|
-
import warnings
|
|
924
|
-
|
|
925
|
-
warnings.simplefilter("always", DeprecationWarning)
|
|
926
|
-
warnings.warn(
|
|
927
|
-
"the hidden_views parameter should now be set on the workbook directly",
|
|
928
|
-
DeprecationWarning,
|
|
929
|
-
)
|
|
930
|
-
if workbook_item.hidden_views is None:
|
|
931
|
-
workbook_item.hidden_views = hidden_views
|
|
932
|
-
|
|
933
908
|
if workbook_item.hidden_views is not None:
|
|
934
909
|
views_element = ET.SubElement(workbook_element, "views")
|
|
935
910
|
for view_name in workbook_item.hidden_views:
|
|
@@ -1012,15 +987,11 @@ class WorkbookRequest(object):
|
|
|
1012
987
|
workbook_item,
|
|
1013
988
|
filename,
|
|
1014
989
|
file_contents,
|
|
1015
|
-
connection_credentials=None,
|
|
1016
990
|
connections=None,
|
|
1017
|
-
hidden_views=None,
|
|
1018
991
|
):
|
|
1019
992
|
xml_request = self._generate_xml(
|
|
1020
993
|
workbook_item,
|
|
1021
|
-
connection_credentials=connection_credentials,
|
|
1022
994
|
connections=connections,
|
|
1023
|
-
hidden_views=hidden_views,
|
|
1024
995
|
)
|
|
1025
996
|
|
|
1026
997
|
parts = {
|
|
@@ -1032,15 +1003,11 @@ class WorkbookRequest(object):
|
|
|
1032
1003
|
def publish_req_chunked(
|
|
1033
1004
|
self,
|
|
1034
1005
|
workbook_item,
|
|
1035
|
-
connection_credentials=None,
|
|
1036
1006
|
connections=None,
|
|
1037
|
-
hidden_views=None,
|
|
1038
1007
|
):
|
|
1039
1008
|
xml_request = self._generate_xml(
|
|
1040
1009
|
workbook_item,
|
|
1041
|
-
connection_credentials=connection_credentials,
|
|
1042
1010
|
connections=connections,
|
|
1043
|
-
hidden_views=hidden_views,
|
|
1044
1011
|
)
|
|
1045
1012
|
|
|
1046
1013
|
parts = {"request_payload": ("", xml_request, "text/xml")}
|
|
@@ -1061,8 +1028,13 @@ class Connection(object):
|
|
|
1061
1028
|
@_tsrequest_wrapped
|
|
1062
1029
|
def update_req(self, xml_request: ET.Element, connection_item: "ConnectionItem") -> None:
|
|
1063
1030
|
connection_element = ET.SubElement(xml_request, "connection")
|
|
1064
|
-
if connection_item.server_address is not None:
|
|
1065
|
-
|
|
1031
|
+
if (server_address := connection_item.server_address) is not None:
|
|
1032
|
+
if (conn_type := connection_item.connection_type) is not None:
|
|
1033
|
+
if conn_type.casefold() != "odata".casefold():
|
|
1034
|
+
server_address = server_address.lower()
|
|
1035
|
+
else:
|
|
1036
|
+
server_address = server_address.lower()
|
|
1037
|
+
connection_element.attrib["serverAddress"] = server_address
|
|
1066
1038
|
if connection_item.server_port is not None:
|
|
1067
1039
|
connection_element.attrib["serverPort"] = str(connection_item.server_port)
|
|
1068
1040
|
if connection_item.username is not None:
|
|
@@ -5,9 +5,7 @@ import urllib3
|
|
|
5
5
|
|
|
6
6
|
from defusedxml.ElementTree import fromstring, ParseError
|
|
7
7
|
from packaging.version import Version
|
|
8
|
-
|
|
9
|
-
from . import CustomViews
|
|
10
|
-
from .endpoint import (
|
|
8
|
+
from tableauserverclient.server.endpoint import (
|
|
11
9
|
Sites,
|
|
12
10
|
Views,
|
|
13
11
|
Users,
|
|
@@ -34,13 +32,14 @@ from .endpoint import (
|
|
|
34
32
|
FlowRuns,
|
|
35
33
|
Metrics,
|
|
36
34
|
Endpoint,
|
|
35
|
+
CustomViews,
|
|
37
36
|
)
|
|
38
|
-
from .exceptions import (
|
|
37
|
+
from tableauserverclient.server.exceptions import (
|
|
39
38
|
ServerInfoEndpointNotFoundError,
|
|
40
39
|
EndpointUnavailableError,
|
|
41
40
|
)
|
|
42
|
-
from .endpoint.exceptions import NotSignedInError
|
|
43
|
-
from
|
|
41
|
+
from tableauserverclient.server.endpoint.exceptions import NotSignedInError
|
|
42
|
+
from tableauserverclient.namespace import Namespace
|
|
44
43
|
|
|
45
44
|
|
|
46
45
|
_PRODUCT_TO_REST_VERSION = {
|
{tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: tableauserverclient
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.32
|
|
4
4
|
Summary: A Python module for working with the Tableau Server REST API.
|
|
5
5
|
Author-email: Tableau <github@tableau.com>
|
|
6
6
|
License: The MIT License (MIT)
|
|
@@ -40,12 +40,11 @@ License-File: LICENSE.versioneer
|
|
|
40
40
|
Requires-Dist: defusedxml >=0.7.1
|
|
41
41
|
Requires-Dist: packaging >=23.1
|
|
42
42
|
Requires-Dist: requests >=2.31
|
|
43
|
-
Requires-Dist: urllib3 ==2.
|
|
43
|
+
Requires-Dist: urllib3 ==2.2.2
|
|
44
44
|
Requires-Dist: typing-extensions >=4.0.1
|
|
45
45
|
Provides-Extra: test
|
|
46
|
-
Requires-Dist: argparse ; extra == 'test'
|
|
47
46
|
Requires-Dist: black ==23.7 ; extra == 'test'
|
|
48
|
-
Requires-Dist:
|
|
47
|
+
Requires-Dist: build ; extra == 'test'
|
|
49
48
|
Requires-Dist: mypy ==1.4 ; extra == 'test'
|
|
50
49
|
Requires-Dist: pytest >=7.0 ; extra == 'test'
|
|
51
50
|
Requires-Dist: pytest-cov ; extra == 'test'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
tableauserverclient/__init__.py,sha256=
|
|
2
|
-
tableauserverclient/_version.py,sha256=
|
|
1
|
+
tableauserverclient/__init__.py,sha256=rkQfn91k882bQ1qcu5ba2H9Uerp0asX3Fb0eCNb6nPo,2377
|
|
2
|
+
tableauserverclient/_version.py,sha256=LS5D9VXuf-tpyeb8coAQeNmPlNdUGdP3Ff0lxA0B2oM,496
|
|
3
3
|
tableauserverclient/config.py,sha256=frumJjDxOQug_R54kjrnHLyaIgg1bV7aUoNPHMJlBhc,430
|
|
4
4
|
tableauserverclient/datetime_helpers.py,sha256=_-gWz5I2_KHT5AzW_boD8meH6loTTKdK-_62h1MA6ko,884
|
|
5
5
|
tableauserverclient/exponential_backoff.py,sha256=HtAfbbVnYtiOe2_ZzKqZmsml40EDZBaC3bttif5qeG8,1474
|
|
@@ -10,7 +10,7 @@ tableauserverclient/helpers/__init__.py,sha256=llpqF9zV5dsP5hQt8dyop33Op5OzGmxW0
|
|
|
10
10
|
tableauserverclient/helpers/headers.py,sha256=Pg-ZWSgV2Yp813BV1Tzo8F2Hn4P01zscla2RRM4yqNk,411
|
|
11
11
|
tableauserverclient/helpers/logging.py,sha256=5q_oR3wERHVXFXY6XDnLYML5-HdAPJTmqhH9IZg4VfY,113
|
|
12
12
|
tableauserverclient/helpers/strings.py,sha256=HRTP31HIdD3gFxDDHuBsmOl_8cLdh8fa3xLALgYsUAQ,1563
|
|
13
|
-
tableauserverclient/models/__init__.py,sha256=
|
|
13
|
+
tableauserverclient/models/__init__.py,sha256=uO2hVqJiqj_llw5J96QdAS-VvIQGMBLAuq7Aq_R0Q08,3642
|
|
14
14
|
tableauserverclient/models/column_item.py,sha256=gV2r7xOVmcn9UnMXFOe9_ORZ85oha1KtIH-crKUhgN4,1972
|
|
15
15
|
tableauserverclient/models/connection_credentials.py,sha256=8Wa8B_-cB3INFUup-Pyd5znsUD5opgYYH5TfipCzKTU,1559
|
|
16
16
|
tableauserverclient/models/connection_item.py,sha256=BiLrjWY42EtkAyh2_3juo31rYW9YZN1e3uOXMXIaslY,4743
|
|
@@ -19,10 +19,10 @@ tableauserverclient/models/data_acceleration_report_item.py,sha256=5Z18-fppR_lnA
|
|
|
19
19
|
tableauserverclient/models/data_alert_item.py,sha256=sJpncsKY1BY-tFJKDpX7xaHy6aGvELWrorsILJxr3lI,6458
|
|
20
20
|
tableauserverclient/models/data_freshness_policy_item.py,sha256=p5iyGHl-juDM3ARl9tWr3i_LnpzalxUTRoDBP6FdTMo,7639
|
|
21
21
|
tableauserverclient/models/database_item.py,sha256=SAwoxsgeowwFN20zGt3-226kJabk0M2tqbVLQthvmRs,8043
|
|
22
|
-
tableauserverclient/models/datasource_item.py,sha256=
|
|
22
|
+
tableauserverclient/models/datasource_item.py,sha256=a0k9uOVwPWZeCS_5jq278BUYYF5uaZMxUqOH4GTC5sM,12407
|
|
23
23
|
tableauserverclient/models/dqw_item.py,sha256=MFpxSP6vSzpjh5GLNrom--Sbi8iLwuGLuAda8KHiIa8,3718
|
|
24
24
|
tableauserverclient/models/exceptions.py,sha256=pQu5DS4jNMT9A0wEBWv2vANAQU1vgNpFatVr8sGE4zk,105
|
|
25
|
-
tableauserverclient/models/favorites_item.py,sha256=
|
|
25
|
+
tableauserverclient/models/favorites_item.py,sha256=iVC39Qx_534spqPIv-g6grQMWBNj7LgE0ViCI3qiQ9g,3322
|
|
26
26
|
tableauserverclient/models/fileupload_item.py,sha256=tx3LfgRxVqeHGpCN6kTDPkdBY5i1H-u1RVaPf0hQx_4,750
|
|
27
27
|
tableauserverclient/models/flow_item.py,sha256=rPIVDe8_tHied8TDRiGpg2gyTyQWlNiGb3vGhqF9YJw,7320
|
|
28
28
|
tableauserverclient/models/flow_run_item.py,sha256=pwJNz0m7l--Sb6z0o83ebWfAmTVFYSr-0apMxHWt0Vs,3139
|
|
@@ -31,17 +31,17 @@ tableauserverclient/models/interval_item.py,sha256=NZbGNuPmFI6NhEZWZVAlWfIFbsnIY
|
|
|
31
31
|
tableauserverclient/models/job_item.py,sha256=PMt7G2qu8WAxe-b3f_0BtQ9JcCSvk-g5L5EcOUpYFCY,8619
|
|
32
32
|
tableauserverclient/models/metric_item.py,sha256=Zrzi_Un43p2jzE_4OhetxhjfeSUYzotMfm8Hjd5WOhI,5397
|
|
33
33
|
tableauserverclient/models/pagination_item.py,sha256=Hdr2EIKWkXfrjWOr-Ao_vzQTWB2akUfxxtaupFKLrlQ,1432
|
|
34
|
-
tableauserverclient/models/permissions_item.py,sha256=
|
|
35
|
-
tableauserverclient/models/project_item.py,sha256=
|
|
34
|
+
tableauserverclient/models/permissions_item.py,sha256=DzyG8Mj0UQCTV05u4qF-hFT5mm0h54azG09i25lXtsY,5828
|
|
35
|
+
tableauserverclient/models/project_item.py,sha256=c5c5IujaYASX7-pEvDi-Qg-4xb2QVQ_F1dOUNSjQQk4,6946
|
|
36
36
|
tableauserverclient/models/property_decorators.py,sha256=W5EtN7bqDHrpLQF63i1cGOhPUJi0RzMJ7qmIlJVrGuE,4711
|
|
37
|
-
tableauserverclient/models/reference_item.py,sha256=
|
|
37
|
+
tableauserverclient/models/reference_item.py,sha256=mHMPMeTGx4yor9QEFq_IGwQUtkn2mjEO0O5bptHKRmo,751
|
|
38
38
|
tableauserverclient/models/revision_item.py,sha256=fLkcScAgBBiVMCyDPk4aboyZNxrykIavzJP2vkn6Rq0,2787
|
|
39
39
|
tableauserverclient/models/schedule_item.py,sha256=Tr4uANbrE5X6gQWiN7VR3MzTYTmKQktgKTOuk3hoKeU,11350
|
|
40
40
|
tableauserverclient/models/server_info_item.py,sha256=pR_fqqPuiBwpLn0wr4rQ4vxK7gxGJVTtaswzwjslheE,1880
|
|
41
41
|
tableauserverclient/models/site_item.py,sha256=xvXpsR0eEz2ypS-94KJTMS-gusHV1bLomKIhWX7GXrU,42256
|
|
42
42
|
tableauserverclient/models/subscription_item.py,sha256=XkQiAi_gWPBnxtTaB8TgrFa-IDVDtai9H00Ilay0T64,4744
|
|
43
43
|
tableauserverclient/models/table_item.py,sha256=WgXrHCgmA5djpA7k2tNuZ8A3PPK6GEKfj9RQZ27RsNk,4583
|
|
44
|
-
tableauserverclient/models/tableau_auth.py,sha256=
|
|
44
|
+
tableauserverclient/models/tableau_auth.py,sha256=2ntxM2jq-GZ6qS4eLw2uTnXT8gROb03sjdJeIx8jYCw,3824
|
|
45
45
|
tableauserverclient/models/tableau_types.py,sha256=1iq1034K1W9ugLAxON_t8n2UxSouiWV_ZEwoHiNM94c,918
|
|
46
46
|
tableauserverclient/models/tag_item.py,sha256=mVfJGZG8PspPM8hBxX38heEQ_Rnp5sSwfwWdLNA-UV0,619
|
|
47
47
|
tableauserverclient/models/target.py,sha256=dVc1SHwo9ZASR8250MhAPODXX_G5UqA4BnK8hykRE6E,263
|
|
@@ -50,51 +50,51 @@ tableauserverclient/models/user_item.py,sha256=vaQD3nvU7bJVD6t0nkWQFse8UDz8HTp8w
|
|
|
50
50
|
tableauserverclient/models/view_item.py,sha256=OcZqrCJt0cjz1bSUUdLIseOYeDfo4ji4UWkv11el6Bc,8106
|
|
51
51
|
tableauserverclient/models/webhook_item.py,sha256=LLf2HQ2Y50Rw-c4dSYyv6MXLbXdij9Iyy261gu9zpv4,2650
|
|
52
52
|
tableauserverclient/models/workbook_item.py,sha256=w6RVKOPFJ9NEmz7OG0SuKw_8FrTE4rWLKw4JkHl1lag,14118
|
|
53
|
-
tableauserverclient/server/__init__.py,sha256=
|
|
53
|
+
tableauserverclient/server/__init__.py,sha256=7QNKHgRznMbvoxB3q0R3Sth1ujesgkNmvmjjdlSSz8E,1846
|
|
54
54
|
tableauserverclient/server/exceptions.py,sha256=l-O4lcoEeXJC7fLWUanIcZM_Mf8m54uK3NQuKNj3RCg,183
|
|
55
55
|
tableauserverclient/server/filter.py,sha256=WZ_dIBuADRZf8VTYcRgn1rulSGUOJq8_uUltq05KkRI,1119
|
|
56
|
-
tableauserverclient/server/pager.py,sha256=
|
|
57
|
-
tableauserverclient/server/query.py,sha256=
|
|
58
|
-
tableauserverclient/server/request_factory.py,sha256=
|
|
56
|
+
tableauserverclient/server/pager.py,sha256=cWu4yIZgfR_ZaHPL2FrM5ZMTlRKNtU7KPxazTb5b41s,2695
|
|
57
|
+
tableauserverclient/server/query.py,sha256=L70ifD-YreY-AOCSqX31kRwf9QH9zcqow304yS0W048,6771
|
|
58
|
+
tableauserverclient/server/request_factory.py,sha256=7LpXR3eZg8DPlk-ivEqMTQeGeeN-13kQAXJ0t9V1bU0,63414
|
|
59
59
|
tableauserverclient/server/request_options.py,sha256=_eWeWZH9dIv0nPU2hCVjL99kIV56H2q8cm22a088iiM,9982
|
|
60
|
-
tableauserverclient/server/server.py,sha256=
|
|
60
|
+
tableauserverclient/server/server.py,sha256=2NZsRgxNaYihwlLmA2dsGlE6UGi-yEvOpZYjTnLZyr0,8544
|
|
61
61
|
tableauserverclient/server/sort.py,sha256=ikndqXW2r2FeacJzybC2TVcJGn4ktviWgXwPyK-AX-0,208
|
|
62
|
-
tableauserverclient/server/endpoint/__init__.py,sha256=
|
|
62
|
+
tableauserverclient/server/endpoint/__init__.py,sha256=qahoESC1Nz741V5tq6_ZdMcimD9LHaQt2y3Q2rZ702o,2703
|
|
63
63
|
tableauserverclient/server/endpoint/auth_endpoint.py,sha256=EOGGlGHWUZRN0SFBlYnEWUSwCH1lrB0Zfv4VWdd7HQs,5139
|
|
64
|
-
tableauserverclient/server/endpoint/custom_views_endpoint.py,sha256=
|
|
64
|
+
tableauserverclient/server/endpoint/custom_views_endpoint.py,sha256=LUwfnam3HjwYzQjeGdBsgy5a15R3xBJ7Jp9MvVnp4xU,4558
|
|
65
65
|
tableauserverclient/server/endpoint/data_acceleration_report_endpoint.py,sha256=nfC2gXoCke-YXGTiMWGDRBK_lDlLa9Y6hts7w3Zs8cI,1170
|
|
66
66
|
tableauserverclient/server/endpoint/data_alert_endpoint.py,sha256=c6-ICGRVDRQN7ClAgCeJsk6JK4HyBvtQGQVLOzNc4eo,5358
|
|
67
|
-
tableauserverclient/server/endpoint/databases_endpoint.py,sha256=
|
|
68
|
-
tableauserverclient/server/endpoint/datasources_endpoint.py,sha256=
|
|
67
|
+
tableauserverclient/server/endpoint/databases_endpoint.py,sha256=uRlqTVMN2U9a1Tc1I1tnlDmxnz-zxfHafmdNF7n8bhY,5016
|
|
68
|
+
tableauserverclient/server/endpoint/datasources_endpoint.py,sha256=W1ieyMHCru6MUFRIXEC4Qoaf2zEoxfOPSTEajkxANAU,19995
|
|
69
69
|
tableauserverclient/server/endpoint/default_permissions_endpoint.py,sha256=HQSYPIJwVCimuWo4YGYvsc41_-rweLHmJ-tQrWdH-Y8,4386
|
|
70
70
|
tableauserverclient/server/endpoint/dqw_endpoint.py,sha256=TvzjonvIiGtp4EisoBKms1lHOkVTjagQACw6unyY9_8,2418
|
|
71
|
-
tableauserverclient/server/endpoint/endpoint.py,sha256=
|
|
71
|
+
tableauserverclient/server/endpoint/endpoint.py,sha256=wJrUAfkl9QMo65EhTALwt3wREcqkKwaR0uYTQyEqV6s,13513
|
|
72
72
|
tableauserverclient/server/endpoint/exceptions.py,sha256=fh4fFYasqiKd3EPTxriVsmLkRL24wz9UvX94BMRfyLY,2534
|
|
73
|
-
tableauserverclient/server/endpoint/favorites_endpoint.py,sha256=
|
|
73
|
+
tableauserverclient/server/endpoint/favorites_endpoint.py,sha256=Tb29-sW3E_sjhWRUjZlPUbwDM9c9dR_xK3TlWN33lxw,6736
|
|
74
74
|
tableauserverclient/server/endpoint/fileuploads_endpoint.py,sha256=fh2xH6a8mMcBI14QzodWPBMabK1_9SMDbzZbawz-ZJc,2553
|
|
75
|
-
tableauserverclient/server/endpoint/flow_runs_endpoint.py,sha256=
|
|
75
|
+
tableauserverclient/server/endpoint/flow_runs_endpoint.py,sha256=zr_DM-vcbGJlYe4PWCLSxEH0yBJN9mjbSWHtbZjfdRU,3351
|
|
76
76
|
tableauserverclient/server/endpoint/flow_task_endpoint.py,sha256=j3snbRiYAPkI3FwhGG-CxKogHXP3SY59ep74YPrutpw,1113
|
|
77
|
-
tableauserverclient/server/endpoint/flows_endpoint.py,sha256=
|
|
78
|
-
tableauserverclient/server/endpoint/groups_endpoint.py,sha256=
|
|
79
|
-
tableauserverclient/server/endpoint/jobs_endpoint.py,sha256=
|
|
80
|
-
tableauserverclient/server/endpoint/metadata_endpoint.py,sha256=
|
|
81
|
-
tableauserverclient/server/endpoint/metrics_endpoint.py,sha256=
|
|
77
|
+
tableauserverclient/server/endpoint/flows_endpoint.py,sha256=uqA1MAzd03NXtQ2yngF79Z7qPsO6MwX3nlAtvRa8KeA,12755
|
|
78
|
+
tableauserverclient/server/endpoint/groups_endpoint.py,sha256=68PwWQ97zmkHeQBGEMSvhaELcYB9Nxos1dMCR7khi9Q,6121
|
|
79
|
+
tableauserverclient/server/endpoint/jobs_endpoint.py,sha256=Qsv0P0QmXRLHX8nidpS_C5rTJDCajYOZa41oLPFW_Dg,3248
|
|
80
|
+
tableauserverclient/server/endpoint/metadata_endpoint.py,sha256=Fqf8M3g8_L1hAWT5Ev3TJqv1F51SBLxcrO1xCbGDvik,5246
|
|
81
|
+
tableauserverclient/server/endpoint/metrics_endpoint.py,sha256=BjdtazZhSpJdspomT9Seyzxy0U7h1Uamui2DQo7u4Xc,3276
|
|
82
82
|
tableauserverclient/server/endpoint/permissions_endpoint.py,sha256=K-AZ1VPTHfiuyEwLo4qQLVTacwYFgNEGrYpCtgO9nmY,3879
|
|
83
|
-
tableauserverclient/server/endpoint/projects_endpoint.py,sha256=
|
|
83
|
+
tableauserverclient/server/endpoint/projects_endpoint.py,sha256=GJ6CZGdx278DVZJLlqclUZSr7eds9ADhTV4TjiAJxbk,7178
|
|
84
84
|
tableauserverclient/server/endpoint/resource_tagger.py,sha256=NJ64WySE7RWIR3JNltyWbErwwdaw9L_Wi7TLWdNas_4,2248
|
|
85
85
|
tableauserverclient/server/endpoint/schedules_endpoint.py,sha256=VKlAqTqMtxkvkG2UgZQ6VrBkiAgpjgffRZFzdzV9LtM,6462
|
|
86
86
|
tableauserverclient/server/endpoint/server_info_endpoint.py,sha256=4TtCc7oIp6iEuiZYGC_1NDIBsWetKk7b0rNemoA2VXI,1453
|
|
87
87
|
tableauserverclient/server/endpoint/sites_endpoint.py,sha256=lMeVXxm1k32HZK84u7aTys9hUQekb4PE1hlhKFxaZ8c,6694
|
|
88
88
|
tableauserverclient/server/endpoint/subscriptions_endpoint.py,sha256=mMo9M6DF6tAZIab6UY8f_duETezELl9VXEYs5ocAcGY,3280
|
|
89
|
-
tableauserverclient/server/endpoint/tables_endpoint.py,sha256=
|
|
89
|
+
tableauserverclient/server/endpoint/tables_endpoint.py,sha256=YB4OS5_ZE-F4K_--nYM5z6mAuuDX_xvdgLu44s72QXY,5044
|
|
90
90
|
tableauserverclient/server/endpoint/tasks_endpoint.py,sha256=HjtSGXBGS8Eriaf5bSWySiqLmKQR_rU4Ao3wGz7Xpd8,4060
|
|
91
|
-
tableauserverclient/server/endpoint/users_endpoint.py,sha256=
|
|
92
|
-
tableauserverclient/server/endpoint/views_endpoint.py,sha256=
|
|
91
|
+
tableauserverclient/server/endpoint/users_endpoint.py,sha256=s6od6Z7hzLYExMjoSgYEKjTmViRzxTE3M-VPANOMllo,7284
|
|
92
|
+
tableauserverclient/server/endpoint/views_endpoint.py,sha256=j7TYKFVCpj7JaM7vqdfUk0P9lr1CEZEgzv53yC6Wse4,7217
|
|
93
93
|
tableauserverclient/server/endpoint/webhooks_endpoint.py,sha256=-HsbAuKECNcx5EZkqp097PfGHLCNwPRnxbrdzreTpnM,2835
|
|
94
|
-
tableauserverclient/server/endpoint/workbooks_endpoint.py,sha256=
|
|
95
|
-
tableauserverclient-0.
|
|
96
|
-
tableauserverclient-0.
|
|
97
|
-
tableauserverclient-0.
|
|
98
|
-
tableauserverclient-0.
|
|
99
|
-
tableauserverclient-0.
|
|
100
|
-
tableauserverclient-0.
|
|
94
|
+
tableauserverclient/server/endpoint/workbooks_endpoint.py,sha256=MZEt3ROTpK0lOLTKK9_qRJuDwAkQng23Azt3XKRrlYo,21012
|
|
95
|
+
tableauserverclient-0.32.dist-info/LICENSE,sha256=MMkY7MguOb4L-WCmmqrVcwg2iwSGaz-RfAMFvXRXwsQ,1074
|
|
96
|
+
tableauserverclient-0.32.dist-info/LICENSE.versioneer,sha256=OYaGozOXk7bUNSm1z577iDYpti8a40XIqqR4lyQ47D8,334
|
|
97
|
+
tableauserverclient-0.32.dist-info/METADATA,sha256=NaFw4wWzmHg5MP_8VMZgTCaGKAgxFDTIxW7juASk_Vo,4073
|
|
98
|
+
tableauserverclient-0.32.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
|
|
99
|
+
tableauserverclient-0.32.dist-info/top_level.txt,sha256=kBnL39G2RlGqxJSsShDBWG4WZ3NFcWJkv1EGiOfZh4Q,20
|
|
100
|
+
tableauserverclient-0.32.dist-info/RECORD,,
|
{tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
{tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/top_level.txt
RENAMED
|
File without changes
|