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.
Files changed (37) hide show
  1. tableauserverclient/__init__.py +64 -4
  2. tableauserverclient/_version.py +3 -3
  3. tableauserverclient/models/__init__.py +88 -37
  4. tableauserverclient/models/datasource_item.py +18 -6
  5. tableauserverclient/models/favorites_item.py +7 -7
  6. tableauserverclient/models/permissions_item.py +46 -1
  7. tableauserverclient/models/project_item.py +4 -3
  8. tableauserverclient/models/reference_item.py +5 -0
  9. tableauserverclient/models/tableau_auth.py +22 -23
  10. tableauserverclient/server/__init__.py +83 -8
  11. tableauserverclient/server/endpoint/__init__.py +61 -28
  12. tableauserverclient/server/endpoint/custom_views_endpoint.py +1 -1
  13. tableauserverclient/server/endpoint/databases_endpoint.py +0 -11
  14. tableauserverclient/server/endpoint/datasources_endpoint.py +12 -28
  15. tableauserverclient/server/endpoint/endpoint.py +23 -8
  16. tableauserverclient/server/endpoint/favorites_endpoint.py +1 -1
  17. tableauserverclient/server/endpoint/flow_runs_endpoint.py +1 -1
  18. tableauserverclient/server/endpoint/flows_endpoint.py +1 -11
  19. tableauserverclient/server/endpoint/groups_endpoint.py +3 -17
  20. tableauserverclient/server/endpoint/jobs_endpoint.py +1 -1
  21. tableauserverclient/server/endpoint/metadata_endpoint.py +3 -3
  22. tableauserverclient/server/endpoint/metrics_endpoint.py +1 -1
  23. tableauserverclient/server/endpoint/projects_endpoint.py +7 -18
  24. tableauserverclient/server/endpoint/tables_endpoint.py +0 -10
  25. tableauserverclient/server/endpoint/users_endpoint.py +1 -1
  26. tableauserverclient/server/endpoint/views_endpoint.py +4 -2
  27. tableauserverclient/server/endpoint/workbooks_endpoint.py +7 -36
  28. tableauserverclient/server/pager.py +47 -46
  29. tableauserverclient/server/query.py +61 -33
  30. tableauserverclient/server/request_factory.py +14 -42
  31. tableauserverclient/server/server.py +5 -6
  32. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/METADATA +3 -4
  33. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/RECORD +37 -37
  34. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/WHEEL +1 -1
  35. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/LICENSE +0 -0
  36. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/LICENSE.versioneer +0 -0
  37. {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 RequestOptions
5
+ from tableauserverclient.models.pagination_item import PaginationItem
6
+ from tableauserverclient.server.request_options import RequestOptions
4
7
 
5
8
 
6
- class Pager(object):
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__(self, endpoint, request_opts=None, **kwargs):
16
- if hasattr(endpoint, "get"):
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 callable(endpoint):
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
- # If we have options we could be starting on any page, backfill the count
31
- if self._options:
32
- self._count = (self._options.pagenumber - 1) * self._options.pagesize
33
- else:
34
- self._count = 0
35
- self._options = RequestOptions()
36
-
37
- def __iter__(self):
38
- # Fetch the first page
39
- current_item_list, last_pagination_item = self._endpoint(self._options)
40
-
41
- if last_pagination_item.total_available is None:
42
- # This endpoint does not support pagination, drain the list and return
43
- while current_item_list:
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
- def _load_next_page(self, last_pagination_item):
66
- next_page = last_pagination_item.page_number + 1
67
- opts = RequestOptions(pagenumber=next_page, pagesize=last_pagination_item.page_size)
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 typing import Tuple
2
- from .filter import Filter
3
- from .request_options import RequestOptions
4
- from .sort import Sort
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 = None
24
- self._pagination_item = None
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
- self.request_options.pagenumber = 1
30
- self._result_cache = None
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
- # Loop through the subsequent pages.
36
- for page in range(1, math.ceil(total / size)):
37
- self.request_options.pagenumber = page + 1
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 = None
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 is None:
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(f"Only accepts keyword arguments.")
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
- def _parse_shorthand_filter(self, key: str) -> Tuple[str, str]:
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
- def _parse_shorthand_sort(self, key: str) -> Tuple[str, str]:
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(self, group_item: GroupItem, default_site_role: Optional[str] = None) -> bytes:
422
- # (1/8/2021): Deprecated starting v0.15
423
- if default_site_role is not None:
424
- import warnings
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
- connection_element.attrib["serverAddress"] = connection_item.server_address.lower()
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 ..namespace import Namespace
41
+ from tableauserverclient.server.endpoint.exceptions import NotSignedInError
42
+ from tableauserverclient.namespace import Namespace
44
43
 
45
44
 
46
45
  _PRODUCT_TO_REST_VERSION = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tableauserverclient
3
- Version: 0.30.post0.dev1
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.0.7
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: mock ; extra == 'test'
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=3pYu_AmAPRRuMREy0Uq5Dk9MTFX9tIKa4Vc-j7q8iLI,1125
2
- tableauserverclient/_version.py,sha256=jhLMneVfFrXy4GLLWUM8iJQL5D7Ngdn0QaWQhKzlIKA,507
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=odiSv68Ct4G93dSKuhaq3dK0PuL2lF3JGrYedaaLJ1s,1684
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=ZZZvYfzg6gD7DlZWzfEJ3VBQBMYADJ9GeoWV02F7Z8E,11944
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=AfQOraRaZ_c2lY9XzxOeeg0N89WHOOYW3CREsCuACNs,3140
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=2WlJOc1Vxkxl-WnAkFaacWsGxUXU9_d85AetSKrKwP0,3731
35
- tableauserverclient/models/project_item.py,sha256=DNxAhkMkRt9MLcMie4w8nuTG4sApIkt618onBEdoM_c,6915
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=HddG1loGNJU7gB7hBccCjnhagnSEbk4_wY2kuPbNhRQ,534
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=TdkOtRnNRi4p0w_WhBsWqUunNVG9nxKl6NPO2AQ08zU,3723
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=ZyvucBvBQMPyTVW7oDHl4W9NWuaSVSMfN9cTcSQRmKw,406
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=JLud4Q6tyzfcoIQ5ykSL_veTuvQag-NDNfrPvoC3Bd0,2900
57
- tableauserverclient/server/query.py,sha256=qMweo-N5P_V9z2Or4u_QrStaBbGL6HOg4Y4EDg8uh44,5735
58
- tableauserverclient/server/request_factory.py,sha256=DnZt4kYUtOmWsZxjitvxVnslTaufOapuD5iLsxWUuyc,64606
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=8XOze5vSEVY9Nl0WOeyYljbg2i4Yp-_znlKepCvm3Es,8458
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=GcWWEKuMPdqHY2OtYYpc8LF3qkMq3m65k9DhTSqenu8,1183
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=SShsI8TnDe3tPXCrCsjs3Oy5Ym4j-QrcDXUfZ7rF9Y4,4542
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=0V6cHwF5E1K1oQ9JKT-rb7t1EFPNwlSKMC2HyqEqYPw,5366
68
- tableauserverclient/server/endpoint/datasources_endpoint.py,sha256=6EvZc-mrOZo_qlFORBPVRzWF4srDEBdmFgw-0osxbH8,20489
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=8-XteqZmfuHDyqR_mGSXKZm9esWbeybaZByHEZoBEac,12743
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=D0MCco9kxaeCShfWOnVt3UpttJRgczJmJKXb3w0jpw4,6701
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=1vwkOrb574natWl-njFOij8xaV32e9RU3-rFbu4bML0,3338
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=cVboeR4IZa0Ck8OvYHkzpNzUJTvYgu7TzmF4Fd6bP20,13088
78
- tableauserverclient/server/endpoint/groups_endpoint.py,sha256=_aSTVy7m3NXSEqgC0cPfJt6KOaPoWprxzz0MD8CsiiY,6640
79
- tableauserverclient/server/endpoint/jobs_endpoint.py,sha256=P5Hdv1hsNVxd5KdrcNCfR9ZtJ7v3UgrfATCBItVdAxY,3239
80
- tableauserverclient/server/endpoint/metadata_endpoint.py,sha256=AKnmRNj9U85p__igiuY_vhhipsxNXpQ_9zzNUtTuU9o,5203
81
- tableauserverclient/server/endpoint/metrics_endpoint.py,sha256=pW7ZOmRrsk_d1afITrQKhYdDDo3zqw1Vq-FnhBnSM24,3264
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=cbW-VTtrG1dt2kQy5vGCmurB8w3ethuNQvyaWViSpIE,7323
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=OJQIarL-IC9mjeu1jfNh9B3UEkB41O51Q53TQNeSJ78,5376
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=QRoApMyP53nF-AqvC7oLHNcT4VJE8s5ykjUnI5ojmPY,7274
92
- tableauserverclient/server/endpoint/views_endpoint.py,sha256=GIYPftL5B0YUOb_SisFtfLP0LPIAbbUv24XCi15UH_M,7118
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=xWG8DJQFHLsp0DoUgE-sNdjTAy-aVFBfYASRizhdV88,22208
95
- tableauserverclient-0.30.post0.dev1.dist-info/LICENSE,sha256=MMkY7MguOb4L-WCmmqrVcwg2iwSGaz-RfAMFvXRXwsQ,1074
96
- tableauserverclient-0.30.post0.dev1.dist-info/LICENSE.versioneer,sha256=OYaGozOXk7bUNSm1z577iDYpti8a40XIqqR4lyQ47D8,334
97
- tableauserverclient-0.30.post0.dev1.dist-info/METADATA,sha256=3MUzWOn6XvZdbPd9-0Z-zKUVKvgIXdrl-QxI6HQ8RyA,4125
98
- tableauserverclient-0.30.post0.dev1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
99
- tableauserverclient-0.30.post0.dev1.dist-info/top_level.txt,sha256=kBnL39G2RlGqxJSsShDBWG4WZ3NFcWJkv1EGiOfZh4Q,20
100
- tableauserverclient-0.30.post0.dev1.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (71.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5