tableauserverclient 0.37__py3-none-any.whl → 0.39__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 (118) hide show
  1. tableauserverclient/bin/_version.py → _version.py +3 -3
  2. bin/__init__.py +3 -0
  3. bin/_version.py +21 -0
  4. {tableauserverclient/helpers → helpers}/strings.py +25 -1
  5. {tableauserverclient/models → models}/__init__.py +15 -1
  6. models/collection_item.py +52 -0
  7. {tableauserverclient/models → models}/connection_item.py +16 -2
  8. {tableauserverclient/models → models}/custom_view_item.py +8 -0
  9. {tableauserverclient/models → models}/data_freshness_policy_item.py +3 -3
  10. {tableauserverclient/models → models}/datasource_item.py +113 -3
  11. models/extensions_item.py +186 -0
  12. models/extract_item.py +82 -0
  13. {tableauserverclient/models → models}/favorites_item.py +21 -8
  14. {tableauserverclient/models → models}/flow_item.py +3 -3
  15. {tableauserverclient/models → models}/group_item.py +18 -1
  16. {tableauserverclient/models → models}/groupset_item.py +14 -0
  17. {tableauserverclient/models → models}/interval_item.py +42 -1
  18. models/location_item.py +53 -0
  19. models/oidc_item.py +82 -0
  20. {tableauserverclient/models → models}/permissions_item.py +2 -0
  21. {tableauserverclient/models → models}/project_item.py +141 -29
  22. {tableauserverclient/models → models}/property_decorators.py +2 -2
  23. {tableauserverclient/models → models}/reference_item.py +12 -6
  24. {tableauserverclient/models → models}/schedule_item.py +67 -1
  25. {tableauserverclient/models → models}/site_item.py +54 -0
  26. {tableauserverclient/models → models}/table_item.py +7 -3
  27. {tableauserverclient/models → models}/tableau_auth.py +13 -6
  28. {tableauserverclient/models → models}/tableau_types.py +13 -1
  29. {tableauserverclient/models → models}/user_item.py +111 -4
  30. {tableauserverclient/models → models}/view_item.py +79 -5
  31. {tableauserverclient/models → models}/workbook_item.py +153 -3
  32. {tableauserverclient/server → server}/endpoint/__init__.py +4 -0
  33. {tableauserverclient/server → server}/endpoint/databases_endpoint.py +101 -18
  34. {tableauserverclient/server → server}/endpoint/datasources_endpoint.py +155 -25
  35. {tableauserverclient/server → server}/endpoint/dqw_endpoint.py +16 -6
  36. {tableauserverclient/server → server}/endpoint/endpoint.py +39 -0
  37. server/endpoint/extensions_endpoint.py +79 -0
  38. {tableauserverclient/server → server}/endpoint/flow_task_endpoint.py +1 -1
  39. {tableauserverclient/server → server}/endpoint/flows_endpoint.py +5 -4
  40. server/endpoint/oidc_endpoint.py +157 -0
  41. {tableauserverclient/server → server}/endpoint/projects_endpoint.py +12 -0
  42. server/endpoint/schedules_endpoint.py +328 -0
  43. {tableauserverclient/server → server}/endpoint/sites_endpoint.py +18 -1
  44. {tableauserverclient/server → server}/endpoint/tables_endpoint.py +140 -17
  45. {tableauserverclient/server → server}/endpoint/users_endpoint.py +296 -10
  46. {tableauserverclient/server → server}/endpoint/views_endpoint.py +23 -0
  47. {tableauserverclient/server → server}/endpoint/workbooks_endpoint.py +124 -9
  48. {tableauserverclient/server → server}/query.py +36 -0
  49. {tableauserverclient/server → server}/request_factory.py +286 -2
  50. {tableauserverclient/server → server}/request_options.py +139 -3
  51. {tableauserverclient/server → server}/server.py +46 -0
  52. {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/METADATA +5 -26
  53. tableauserverclient-0.39.dist-info/RECORD +107 -0
  54. {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/WHEEL +1 -1
  55. tableauserverclient-0.39.dist-info/top_level.txt +4 -0
  56. tableauserverclient/__init__.py +0 -141
  57. tableauserverclient/config.py +0 -27
  58. tableauserverclient/datetime_helpers.py +0 -45
  59. tableauserverclient/exponential_backoff.py +0 -30
  60. tableauserverclient/filesys_helpers.py +0 -63
  61. tableauserverclient/namespace.py +0 -37
  62. tableauserverclient/py.typed +0 -0
  63. tableauserverclient/server/endpoint/schedules_endpoint.py +0 -151
  64. tableauserverclient-0.37.dist-info/RECORD +0 -106
  65. tableauserverclient-0.37.dist-info/licenses/LICENSE.versioneer +0 -7
  66. tableauserverclient-0.37.dist-info/top_level.txt +0 -1
  67. {tableauserverclient/helpers → helpers}/__init__.py +0 -0
  68. {tableauserverclient/helpers → helpers}/headers.py +0 -0
  69. {tableauserverclient/helpers → helpers}/logging.py +0 -0
  70. {tableauserverclient/models → models}/column_item.py +0 -0
  71. {tableauserverclient/models → models}/connection_credentials.py +0 -0
  72. {tableauserverclient/models → models}/data_acceleration_report_item.py +0 -0
  73. {tableauserverclient/models → models}/data_alert_item.py +0 -0
  74. {tableauserverclient/models → models}/database_item.py +0 -0
  75. {tableauserverclient/models → models}/dqw_item.py +0 -0
  76. {tableauserverclient/models → models}/exceptions.py +0 -0
  77. {tableauserverclient/models → models}/fileupload_item.py +0 -0
  78. {tableauserverclient/models → models}/flow_run_item.py +0 -0
  79. {tableauserverclient/models → models}/job_item.py +0 -0
  80. {tableauserverclient/models → models}/linked_tasks_item.py +0 -0
  81. {tableauserverclient/models → models}/metric_item.py +0 -0
  82. {tableauserverclient/models → models}/pagination_item.py +0 -0
  83. {tableauserverclient/models → models}/revision_item.py +0 -0
  84. {tableauserverclient/models → models}/server_info_item.py +0 -0
  85. {tableauserverclient/models → models}/subscription_item.py +0 -0
  86. {tableauserverclient/models → models}/tag_item.py +0 -0
  87. {tableauserverclient/models → models}/target.py +0 -0
  88. {tableauserverclient/models → models}/task_item.py +0 -0
  89. {tableauserverclient/models → models}/virtual_connection_item.py +0 -0
  90. {tableauserverclient/models → models}/webhook_item.py +0 -0
  91. {tableauserverclient/server → server}/__init__.py +0 -0
  92. {tableauserverclient/server → server}/endpoint/auth_endpoint.py +0 -0
  93. {tableauserverclient/server → server}/endpoint/custom_views_endpoint.py +0 -0
  94. {tableauserverclient/server → server}/endpoint/data_acceleration_report_endpoint.py +0 -0
  95. {tableauserverclient/server → server}/endpoint/data_alert_endpoint.py +0 -0
  96. {tableauserverclient/server → server}/endpoint/default_permissions_endpoint.py +0 -0
  97. {tableauserverclient/server → server}/endpoint/exceptions.py +0 -0
  98. {tableauserverclient/server → server}/endpoint/favorites_endpoint.py +0 -0
  99. {tableauserverclient/server → server}/endpoint/fileuploads_endpoint.py +0 -0
  100. {tableauserverclient/server → server}/endpoint/flow_runs_endpoint.py +0 -0
  101. {tableauserverclient/server → server}/endpoint/groups_endpoint.py +0 -0
  102. {tableauserverclient/server → server}/endpoint/groupsets_endpoint.py +0 -0
  103. {tableauserverclient/server → server}/endpoint/jobs_endpoint.py +0 -0
  104. {tableauserverclient/server → server}/endpoint/linked_tasks_endpoint.py +0 -0
  105. {tableauserverclient/server → server}/endpoint/metadata_endpoint.py +0 -0
  106. {tableauserverclient/server → server}/endpoint/metrics_endpoint.py +0 -0
  107. {tableauserverclient/server → server}/endpoint/permissions_endpoint.py +0 -0
  108. {tableauserverclient/server → server}/endpoint/resource_tagger.py +0 -0
  109. {tableauserverclient/server → server}/endpoint/server_info_endpoint.py +0 -0
  110. {tableauserverclient/server → server}/endpoint/subscriptions_endpoint.py +0 -0
  111. {tableauserverclient/server → server}/endpoint/tasks_endpoint.py +0 -0
  112. {tableauserverclient/server → server}/endpoint/virtual_connections_endpoint.py +0 -0
  113. {tableauserverclient/server → server}/endpoint/webhooks_endpoint.py +0 -0
  114. {tableauserverclient/server → server}/exceptions.py +0 -0
  115. {tableauserverclient/server → server}/filter.py +0 -0
  116. {tableauserverclient/server → server}/pager.py +0 -0
  117. {tableauserverclient/server → server}/sort.py +0 -0
  118. {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,6 @@
1
1
  import sys
2
2
  from typing import Optional
3
+ import warnings
3
4
 
4
5
  from typing_extensions import Self
5
6
 
@@ -62,8 +63,21 @@ class RequestOptions(RequestOptionsBase):
62
63
  self.pagesize = pagesize or config.PAGE_SIZE
63
64
  self.sort = set()
64
65
  self.filter = set()
66
+ self.fields = set()
65
67
  # This is private until we expand all of our parsers to handle the extra fields
66
- self._all_fields = False
68
+ self.all_fields = False
69
+
70
+ @property
71
+ def _all_fields(self) -> bool:
72
+ return self.all_fields
73
+
74
+ @_all_fields.setter
75
+ def _all_fields(self, value):
76
+ warnings.warn(
77
+ "Directly setting _all_fields is deprecated, please use the all_fields property instead.",
78
+ DeprecationWarning,
79
+ )
80
+ self.all_fields = value
67
81
 
68
82
  def get_query_params(self) -> dict:
69
83
  params = {}
@@ -75,12 +89,17 @@ class RequestOptions(RequestOptionsBase):
75
89
  filter_options = (str(filter_item) for filter_item in self.filter)
76
90
  ordered_filter_options = sorted(filter_options)
77
91
  params["filter"] = ",".join(ordered_filter_options)
78
- if self._all_fields:
92
+ if self.all_fields:
79
93
  params["fields"] = "_all_"
80
94
  if self.pagenumber:
81
95
  params["pageNumber"] = self.pagenumber
82
96
  if self.pagesize:
83
97
  params["pageSize"] = self.pagesize
98
+ if self.fields:
99
+ if "_all_" in self.fields:
100
+ params["fields"] = "_all_"
101
+ else:
102
+ params["fields"] = ",".join(sorted(self.fields))
84
103
  return params
85
104
 
86
105
  def page_size(self, page_size):
@@ -181,6 +200,116 @@ class RequestOptions(RequestOptionsBase):
181
200
  Desc = "desc"
182
201
  Asc = "asc"
183
202
 
203
+ class SelectFields:
204
+ class Common:
205
+ All = "_all_"
206
+ Default = "_default_"
207
+
208
+ class ContentsCounts:
209
+ ProjectCount = "contentsCounts.projectCount"
210
+ ViewCount = "contentsCounts.viewCount"
211
+ DatasourceCount = "contentsCounts.datasourceCount"
212
+ WorkbookCount = "contentsCounts.workbookCount"
213
+
214
+ class Datasource:
215
+ ContentUrl = "datasource.contentUrl"
216
+ ID = "datasource.id"
217
+ Name = "datasource.name"
218
+ Type = "datasource.type"
219
+ Description = "datasource.description"
220
+ CreatedAt = "datasource.createdAt"
221
+ UpdatedAt = "datasource.updatedAt"
222
+ EncryptExtracts = "datasource.encryptExtracts"
223
+ IsCertified = "datasource.isCertified"
224
+ UseRemoteQueryAgent = "datasource.useRemoteQueryAgent"
225
+ WebPageURL = "datasource.webpageUrl"
226
+ Size = "datasource.size"
227
+ Tag = "datasource.tag"
228
+ FavoritesTotal = "datasource.favoritesTotal"
229
+ DatabaseName = "datasource.databaseName"
230
+ ConnectedWorkbooksCount = "datasource.connectedWorkbooksCount"
231
+ HasAlert = "datasource.hasAlert"
232
+ HasExtracts = "datasource.hasExtracts"
233
+ IsPublished = "datasource.isPublished"
234
+ ServerName = "datasource.serverName"
235
+
236
+ class Favorite:
237
+ Label = "favorite.label"
238
+ ParentProjectName = "favorite.parentProjectName"
239
+ TargetOwnerName = "favorite.targetOwnerName"
240
+
241
+ class Group:
242
+ ID = "group.id"
243
+ Name = "group.name"
244
+ DomainName = "group.domainName"
245
+ UserCount = "group.userCount"
246
+ MinimumSiteRole = "group.minimumSiteRole"
247
+
248
+ class Job:
249
+ ID = "job.id"
250
+ Status = "job.status"
251
+ CreatedAt = "job.createdAt"
252
+ StartedAt = "job.startedAt"
253
+ EndedAt = "job.endedAt"
254
+ Priority = "job.priority"
255
+ JobType = "job.jobType"
256
+ Title = "job.title"
257
+ Subtitle = "job.subtitle"
258
+
259
+ class Owner:
260
+ ID = "owner.id"
261
+ Name = "owner.name"
262
+ FullName = "owner.fullName"
263
+ SiteRole = "owner.siteRole"
264
+ LastLogin = "owner.lastLogin"
265
+ Email = "owner.email"
266
+
267
+ class Project:
268
+ ID = "project.id"
269
+ Name = "project.name"
270
+ Description = "project.description"
271
+ CreatedAt = "project.createdAt"
272
+ UpdatedAt = "project.updatedAt"
273
+ ContentPermissions = "project.contentPermissions"
274
+ ParentProjectID = "project.parentProjectId"
275
+ TopLevelProject = "project.topLevelProject"
276
+ Writeable = "project.writeable"
277
+
278
+ class User:
279
+ ExternalAuthUserId = "user.externalAuthUserId"
280
+ ID = "user.id"
281
+ Name = "user.name"
282
+ SiteRole = "user.siteRole"
283
+ LastLogin = "user.lastLogin"
284
+ FullName = "user.fullName"
285
+ Email = "user.email"
286
+ AuthSetting = "user.authSetting"
287
+
288
+ class View:
289
+ ID = "view.id"
290
+ Name = "view.name"
291
+ ContentUrl = "view.contentUrl"
292
+ CreatedAt = "view.createdAt"
293
+ UpdatedAt = "view.updatedAt"
294
+ Tags = "view.tags"
295
+ SheetType = "view.sheetType"
296
+ Usage = "view.usage"
297
+
298
+ class Workbook:
299
+ ID = "workbook.id"
300
+ Description = "workbook.description"
301
+ Name = "workbook.name"
302
+ ContentUrl = "workbook.contentUrl"
303
+ ShowTabs = "workbook.showTabs"
304
+ Size = "workbook.size"
305
+ CreatedAt = "workbook.createdAt"
306
+ UpdatedAt = "workbook.updatedAt"
307
+ SheetCount = "workbook.sheetCount"
308
+ HasExtracts = "workbook.hasExtracts"
309
+ Tags = "workbook.tags"
310
+ WebpageUrl = "workbook.webpageUrl"
311
+ DefaultViewId = "workbook.defaultViewId"
312
+
184
313
 
185
314
  """
186
315
  These options can be used by methods that are fetching data exported from a specific content item
@@ -258,7 +387,14 @@ class _DataExportOptions(RequestOptionsBase):
258
387
  Self
259
388
  The current object
260
389
  """
261
- self.view_parameters.append((name, value))
390
+ prefix = "vf_Parameters."
391
+ if name.startswith(prefix):
392
+ proper_name = name
393
+ elif name.startswith("Parameters."):
394
+ proper_name = f"vf_{name}"
395
+ else:
396
+ proper_name = f"{prefix}{name}"
397
+ self.view_parameters.append((proper_name, value))
262
398
  return self
263
399
 
264
400
  def _append_view_filters(self, params) -> None:
@@ -2,6 +2,7 @@ from tableauserverclient.helpers.logging import logger
2
2
 
3
3
  import requests
4
4
  import urllib3
5
+ import ssl
5
6
 
6
7
  from defusedxml.ElementTree import fromstring, ParseError
7
8
  from packaging.version import Version
@@ -37,6 +38,8 @@ from tableauserverclient.server.endpoint import (
37
38
  GroupSets,
38
39
  Tags,
39
40
  VirtualConnections,
41
+ OIDC,
42
+ Extensions,
40
43
  )
41
44
  from tableauserverclient.server.exceptions import (
42
45
  ServerInfoEndpointNotFoundError,
@@ -91,6 +94,13 @@ class Server:
91
94
  and a later version of the REST API. For more information, see REST API
92
95
  Versions.
93
96
 
97
+ http_options : dict, optional
98
+ Additional options to pass to the requests library when making HTTP requests.
99
+
100
+ session_factory : callable, optional
101
+ A factory function that returns a requests.Session object. If not provided,
102
+ requests.session is used.
103
+
94
104
  Examples
95
105
  --------
96
106
  >>> import tableauserverclient as TSC
@@ -107,6 +117,16 @@ class Server:
107
117
  >>> # for example, 2.8
108
118
  >>> # server.version = '2.8'
109
119
 
120
+ >>> # if connecting to an older Tableau Server with weak DH keys (Python 3.12+ only)
121
+ >>> server.configure_ssl(allow_weak_dh=True) # Note: reduces security
122
+
123
+ Notes
124
+ -----
125
+ When using Python 3.12 or later with older versions of Tableau Server, you may encounter
126
+ SSL errors related to weak Diffie-Hellman keys. This is because newer Python versions
127
+ enforce stronger security requirements. You can temporarily work around this using
128
+ configure_ssl(allow_weak_dh=True), but this reduces security and should only be used
129
+ as a temporary measure until the server can be upgraded.
110
130
  """
111
131
 
112
132
  class PublishMode:
@@ -125,6 +145,7 @@ class Server:
125
145
  self._auth_token = None
126
146
  self._site_id = None
127
147
  self._user_id = None
148
+ self._ssl_context = None
128
149
 
129
150
  # TODO: this needs to change to default to https, but without breaking existing code
130
151
  if not server_address.startswith("http://") and not server_address.startswith("https://"):
@@ -164,6 +185,8 @@ class Server:
164
185
  self.group_sets = GroupSets(self)
165
186
  self.tags = Tags(self)
166
187
  self.virtual_connections = VirtualConnections(self)
188
+ self.oidc = OIDC(self)
189
+ self.extensions = Extensions(self)
167
190
 
168
191
  self._session = self._session_factory()
169
192
  self._http_options = dict() # must set this before making a server call
@@ -313,3 +336,26 @@ class Server:
313
336
 
314
337
  def is_signed_in(self):
315
338
  return self._auth_token is not None
339
+
340
+ def configure_ssl(self, *, allow_weak_dh=False):
341
+ """Configure SSL/TLS settings for the server connection.
342
+
343
+ Parameters
344
+ ----------
345
+ allow_weak_dh : bool, optional
346
+ If True, allows connections to servers with DH keys that are considered too small by modern Python versions.
347
+ WARNING: This reduces security and should only be used as a temporary workaround.
348
+ """
349
+ if allow_weak_dh:
350
+ logger.warning(
351
+ "WARNING: Allowing weak Diffie-Hellman keys. This reduces security and should only be used temporarily."
352
+ )
353
+ self._ssl_context = ssl.create_default_context()
354
+ # Allow weak DH keys by setting minimum key size to 512 bits (default is 1024 in Python 3.12+)
355
+ self._ssl_context.set_dh_parameters(min_key_bits=512)
356
+ self.add_http_options({"verify": self._ssl_context})
357
+ else:
358
+ self._ssl_context = None
359
+ # Remove any custom SSL context if we're reverting to default settings
360
+ if "verify" in self._http_options:
361
+ del self._http_options["verify"]
@@ -1,30 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tableauserverclient
3
- Version: 0.37
3
+ Version: 0.39
4
4
  Summary: A Python module for working with the Tableau Server REST API.
5
5
  Author-email: Tableau <github@tableau.com>
6
- License: The MIT License (MIT)
7
-
8
- Copyright (c) 2022 Tableau
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
28
6
  Project-URL: repository, https://github.com/tableau/server-client-python
29
7
  Classifier: Programming Language :: Python
30
8
  Classifier: Programming Language :: Python :: 3
@@ -36,20 +14,21 @@ Classifier: Programming Language :: Python :: 3.13
36
14
  Requires-Python: >=3.9
37
15
  Description-Content-Type: text/markdown
38
16
  License-File: LICENSE
39
- License-File: LICENSE.versioneer
40
17
  Requires-Dist: defusedxml>=0.7.1
41
18
  Requires-Dist: packaging>=23.1
42
19
  Requires-Dist: requests>=2.32
43
- Requires-Dist: urllib3<3,>=2.2.2
20
+ Requires-Dist: urllib3<3,>=2.6.0
44
21
  Requires-Dist: typing_extensions>=4.0
45
22
  Provides-Extra: test
46
- Requires-Dist: black==24.8; extra == "test"
23
+ Requires-Dist: black==24.10; extra == "test"
47
24
  Requires-Dist: build; extra == "test"
48
25
  Requires-Dist: mypy==1.4; extra == "test"
49
26
  Requires-Dist: pytest>=7.0; extra == "test"
50
27
  Requires-Dist: pytest-cov; extra == "test"
51
28
  Requires-Dist: pytest-subtests; extra == "test"
29
+ Requires-Dist: pytest-xdist; extra == "test"
52
30
  Requires-Dist: requests-mock<2.0,>=1.0; extra == "test"
31
+ Requires-Dist: types-requests>=2.32.4.20250913; extra == "test"
53
32
  Dynamic: license-file
54
33
 
55
34
  # Tableau Server Client (Python)
@@ -0,0 +1,107 @@
1
+ _version.py,sha256=Gj76mmCMMylBUJ_rBL4WMy9bM-2DediAdkn9393A6Tc,496
2
+ bin/__init__.py,sha256=T8WHy9zTlF9XZWoqqMbrxJ39Tw4YHo4x7zq9iSQRioQ,119
3
+ bin/_version.py,sha256=Gj76mmCMMylBUJ_rBL4WMy9bM-2DediAdkn9393A6Tc,496
4
+ helpers/__init__.py,sha256=llpqF9zV5dsP5hQt8dyop33Op5OzGmxW0BZibaSlCcM,23
5
+ helpers/headers.py,sha256=Pg-ZWSgV2Yp813BV1Tzo8F2Hn4P01zscla2RRM4yqNk,411
6
+ helpers/logging.py,sha256=5q_oR3wERHVXFXY6XDnLYML5-HdAPJTmqhH9IZg4VfY,113
7
+ helpers/strings.py,sha256=7MvaS9haJ5hpdv4NPQ11gRj94zIgbDmujFPD_GnZPJI,2013
8
+ models/__init__.py,sha256=m_hsDtY9aQwtd1rtg34QqmBVBF1wGh3SEArFjKMP1-8,4679
9
+ models/collection_item.py,sha256=nZISWKtjsuAHSBrw9_h1Xco0zHNf1x5uQ0UAH2MWxaQ,2162
10
+ models/column_item.py,sha256=yUFzXNcnUPVo2imrhEBS4fMVAR5j2ZzksOk5t9XYW5s,1964
11
+ models/connection_credentials.py,sha256=CQ8FkkHW9MeTw8uArNhrU5mowtryWUddgEgEliqh3ys,2066
12
+ models/connection_item.py,sha256=QO-20N7df-5V1rCnaZCQ6bxLRncctWvprq1aXSOF7YE,6553
13
+ models/custom_view_item.py,sha256=oIdYhyWLhJZUaSsp9QAAAka9AP7kO8LOaN97vPw95Qw,7967
14
+ models/data_acceleration_report_item.py,sha256=HFZROetfOWh-hMS48xBEHqYOViINHZR-EpcrP45_8AI,3386
15
+ models/data_alert_item.py,sha256=VZtRR-kqojq-mkrTgvay4WkPawj3-4jbSc0wBijmJhk,6444
16
+ models/data_freshness_policy_item.py,sha256=k_EfTuf9Av6kDEapmqiLbkzT8W4yEYS6V3EY0CRXPbM,7648
17
+ models/database_item.py,sha256=lWxmmMpPeVxzizVAsVkc6Ps2I-j-0KJAJZto8qShrYU,8223
18
+ models/datasource_item.py,sha256=ITVzWLHdY2xLhP1UCWJqE9j5ZijomxT83p5B_WE78I4,19735
19
+ models/dqw_item.py,sha256=87oTc7icrQst_DSaTqoVR965YEckg5dk6osa51BrCAk,3710
20
+ models/exceptions.py,sha256=pQu5DS4jNMT9A0wEBWv2vANAQU1vgNpFatVr8sGE4zk,105
21
+ models/extensions_item.py,sha256=nJj5Xl_B1j5KK6TQ8-g8tBaBH5tkCsR2Y0GTnuOcxWQ,6684
22
+ models/extract_item.py,sha256=2qDyNrAanbw1gK6qE2L7RwQFsIg_59unUx8rbLWrTmg,2691
23
+ models/favorites_item.py,sha256=IvImwOW8csz14HdrTVSDZ6mCubyuYjTLsI9yS3nD2jE,3947
24
+ models/fileupload_item.py,sha256=N5M0jtlFj_PFh3jlp2AbcYOwCwdnBCk_L64xe3Z4ves,742
25
+ models/flow_item.py,sha256=sFAgm-RSJOBaq2CTZvL9F0wD3MiO0r7tBXfqVR7JDic,8674
26
+ models/flow_run_item.py,sha256=nf_b6KRwNevwZRsPoMh8dLzdONUMWY2wipWEMdY9SN4,3113
27
+ models/group_item.py,sha256=7i-b4GvAC03GQtR8BweTDj5xcxEDvoer5EXuygvIYVU,5532
28
+ models/groupset_item.py,sha256=sNaXHbFLxC1sLiJgA_Dbm_d2nny2sRVN383Dltvy-kQ,2339
29
+ models/interval_item.py,sha256=q-SK-Coo3WhoLsNbzkC4K3qYCMfcNnrRzAmKmdIKuIY,11016
30
+ models/job_item.py,sha256=Q7tTKXEiW-5VJsLmnAq6auP0jvmbbImmqw_nx1kiXtM,11512
31
+ models/linked_tasks_item.py,sha256=TYkNvmJfKlZ30OST8w9GUobboFAH5ftFKjXdWWAtR24,3806
32
+ models/location_item.py,sha256=8pVxiSoySTAQOF9QDe0KiHMUp0aiFG-sZ2cB1u8oAEg,1287
33
+ models/metric_item.py,sha256=D3atzbr3jtQUsVsqYHfz-v3yRP3qruRN5jRsv_-yRQ0,5378
34
+ models/oidc_item.py,sha256=hKqX8QiIUtd6keXKT9l9LzhIMkaO2QkvXkp2VxzhkHQ,3753
35
+ models/pagination_item.py,sha256=55Ap_9pJxq8plWQO1Js3Jp6KFidN3TQsL5LM2-yZGDo,1424
36
+ models/permissions_item.py,sha256=Av_z2P8IbxH-FXWMhOPGZapPR6qQRrYfqo30nZjMBrM,6245
37
+ models/project_item.py,sha256=MFUJ9vDbsTdZXmWtmeWKitffZ7lFfP2eOZY-HSvSIbM,11729
38
+ models/property_decorators.py,sha256=Xp08wlfbHImLEgb9TrdbdFTlAGCO3RR68Sw5qvnBDJ4,4632
39
+ models/reference_item.py,sha256=8cFg61-Y2NQsDE5IAHGSYU5p3unVB2nHclOq8e8EFFs,940
40
+ models/revision_item.py,sha256=5ghmnwhUcCOWwZdApzgV_uM3sqdoG_gtsJwUQwfKITo,2773
41
+ models/schedule_item.py,sha256=553k5g1gbLiNs4_4NLbDhTKDgU4lqXfK6fBh35-tSxY,13770
42
+ models/server_info_item.py,sha256=55wTG_31o-WwqgBrbwpgMpq_by10iM6BXpmdAZ3TO90,2631
43
+ models/site_item.py,sha256=Wq5Ry_14RUgJEXDAcs87SFAaRsvVlUqQYbQ6CWe1l30,47296
44
+ models/subscription_item.py,sha256=ujaQQIo_ln3pnm0Th2IdcGCp_cl6WxvEMPgeZbwZtFc,4724
45
+ models/table_item.py,sha256=4CZ2R0asNz8iINn3FKKQzjpwt-5lBAvfm0fHKmz5gcw,4752
46
+ models/tableau_auth.py,sha256=F1AOyKCaxwS4q_1HbNC8nw2KBaYNexXescxZdHhNkjw,8394
47
+ models/tableau_types.py,sha256=bukzI490GWpebGv9ZiCuSqioqIZm9ao9Yr2GGrmM8_A,1420
48
+ models/tag_item.py,sha256=K2EVEy1EDdr0yLr4wBvGr-p9gIAFVsOCv80b-AFPFLk,588
49
+ models/target.py,sha256=dVc1SHwo9ZASR8250MhAPODXX_G5UqA4BnK8hykRE6E,263
50
+ models/task_item.py,sha256=l4t4COw2LfdlYmJpzUSgwGven_NSZj2r3PUJZkqvCus,4555
51
+ models/user_item.py,sha256=Nynycb3lM2q909P8bML6xOncr4P1yBhWO17lE_Nh9P8,19814
52
+ models/view_item.py,sha256=-JxiwRFqBo7DS3dvwk4rxRhc25WH-Pgf8rBaLyFQOzE,12451
53
+ models/virtual_connection_item.py,sha256=TvX7MId7WSg4IZE41XAMl1l3Ibu8kTUR1xr26Cqtyeo,3357
54
+ models/webhook_item.py,sha256=r37fHY3_uhDhxupHfMSvB4I2aUjy3qQ2FOLQjAcNUUk,3994
55
+ models/workbook_item.py,sha256=myU8Tesc5eGwmYEICQdk3aXtxERkHdC8FEk1zwO65Y4,22404
56
+ server/__init__.py,sha256=77E-3LseLd9gHeRgKPnpZTNMQySgYiwst33AsReol-k,1940
57
+ server/exceptions.py,sha256=l-O4lcoEeXJC7fLWUanIcZM_Mf8m54uK3NQuKNj3RCg,183
58
+ server/filter.py,sha256=Z7O6A175bBSmcponLs0Enh5R5Gp2puVRGfOMk-V395w,1096
59
+ server/pager.py,sha256=IESvCba7WZO3O9VBcKlJ6ricVDgro0gKuUQyJnOCUws,3497
60
+ server/query.py,sha256=dY_y20DOBOFwydIpLcWLK39s1lVmDPxhX5x6hVxeoL0,10529
61
+ server/request_factory.py,sha256=2A6mFp-eLi7wd18I1QySULvCx1B78EHyNu59Oj2dzsM,87792
62
+ server/request_options.py,sha256=xVMZYO_dXdDHWi4bYalA8w-n55z-qSuSNGRGwwEFUCU,20251
63
+ server/server.py,sha256=YC7rmMdw7asDMsvq2M5FGujl3FE2qP35M5DOwnNwHZ4,13463
64
+ server/sort.py,sha256=wjnlt7rlmLvQjM_XpgD8N8Hlg0zVvLOV7k_dAs1DmHY,628
65
+ server/endpoint/__init__.py,sha256=kHDGHsGU0QgJVBzMzerfR8vQ476ksC0QFQJfMDvQ_Vk,3277
66
+ server/endpoint/auth_endpoint.py,sha256=8N3_OUSwYm4KCvwDJHGmH9i2OqzH70PLP0-rT-sKYVo,7177
67
+ server/endpoint/custom_views_endpoint.py,sha256=se-CZ9BF8Cf_quT_3BbrO9lwK7E8hHbCoMYq-2IZMM8,14515
68
+ server/endpoint/data_acceleration_report_endpoint.py,sha256=he-MVqCvAQo8--icEKFoIV2KUP6Z1s_PJ2uZ8Xpj2f8,1130
69
+ server/endpoint/data_alert_endpoint.py,sha256=ZNotgG3hBpR7fo8eDTXx_gSppF2n25GQ3udwF3MKFLk,5203
70
+ server/endpoint/databases_endpoint.py,sha256=vojSCB6DQ665Z0X7h5TQg5wflU_WUtd4pgcjsda7JdU,8689
71
+ server/endpoint/datasources_endpoint.py,sha256=CQ6erQgiWIKgyfAPDtwFquXNy6MxdSIcjjhsbRrZN6I,44921
72
+ server/endpoint/default_permissions_endpoint.py,sha256=bZlhDqu6jFyC4vbrdC3Nn1cWRJWRz0mhxco9hRUouJA,4327
73
+ server/endpoint/dqw_endpoint.py,sha256=bfgA7sRGQajR67xcRS9mIF7yKlJmjjFyN-hBxwZ5wkU,2626
74
+ server/endpoint/endpoint.py,sha256=035rsaaUoQP0oYtaRhtIMHs9bwMeFCt2u-gn5asOK7o,15309
75
+ server/endpoint/exceptions.py,sha256=ifkRatvvqG5awY73BzwALlby3dYYKr_8leUOmpeZS0Y,2919
76
+ server/endpoint/extensions_endpoint.py,sha256=sInHr4sDMoXC7X-eHyOmP4bJfJbUypalfsUEKHK_F7Y,2992
77
+ server/endpoint/favorites_endpoint.py,sha256=ZMui0KQCSGRBlUrem519Y5_gBpngN7wtDWo_EvEUMEk,6340
78
+ server/endpoint/fileuploads_endpoint.py,sha256=e3qIw6lJJG4Y8RHG26psMjjETovpfrBzmFjeYeJll8s,2410
79
+ server/endpoint/flow_runs_endpoint.py,sha256=HIVuTi4pXIqog16K_3Zzu1LC96TR_pZlAjxRKoJrJ_g,4957
80
+ server/endpoint/flow_task_endpoint.py,sha256=z9qrWw9hrWXPHwRT9j0vx9PeW_kL_yphB5h9-inLj6M,1075
81
+ server/endpoint/flows_endpoint.py,sha256=GLODBEg31O-mZeqLV6kjaPGg0bLP93_kl6ok2GF_k4A,23738
82
+ server/endpoint/groups_endpoint.py,sha256=5ZhKJeKT3GoM2olqJYJggdiVYQ9BdcEJCIqkx-tZqxo,18745
83
+ server/endpoint/groupsets_endpoint.py,sha256=Kcrrd0NbduwIhAtGkG-EMf38qcCM74EnCybAs24TFnM,5577
84
+ server/endpoint/jobs_endpoint.py,sha256=rhR8tD89U5ha-g5QhLlGXurTF77mLQREnd7k208EHxA,10387
85
+ server/endpoint/linked_tasks_endpoint.py,sha256=tMZqVPWPZvYawaXLJGVV9scmWPu1rdCxz-eWZv1WbPk,2262
86
+ server/endpoint/metadata_endpoint.py,sha256=sg0Yehj2f0wlrJMkVjzNdNxNEhSeNbZIkio3eQamOVk,5228
87
+ server/endpoint/metrics_endpoint.py,sha256=p9F_tbUela1sb3i9n67Tr9zsPRmsjSAigC6EqLwZHqE,3175
88
+ server/endpoint/oidc_endpoint.py,sha256=OMOpOOcPO8C1z6FFRHf6CEVgJqWgaETRSWPiQdYg4wA,5969
89
+ server/endpoint/permissions_endpoint.py,sha256=tXX_KSanbxUeR-L4UdI_jphko8dD_fZsXVhQayQL3JA,3719
90
+ server/endpoint/projects_endpoint.py,sha256=cIeoCGUCiUl_MtpHDycI21n9DIjGfSvFeyGW1iDduwo,31114
91
+ server/endpoint/resource_tagger.py,sha256=eKekflXzLjx_zDOLgYkTIusRO8vsFus1LvLIf0LOwtQ,6661
92
+ server/endpoint/schedules_endpoint.py,sha256=C4evSP4P6_7cxTlk71IaswIxba7Bo2I5eVM-W5cfyGU,12716
93
+ server/endpoint/server_info_endpoint.py,sha256=9UcYP3td22S_Kwabu-RWc-Pn3lFrIERVlzVpl4ErP_I,2649
94
+ server/endpoint/sites_endpoint.py,sha256=Fh8ppL00IVI1YpXyOXCCc5fIc_r_TC1o8GCgYD_gOV4,14778
95
+ server/endpoint/subscriptions_endpoint.py,sha256=21oZ6Q14AL8p2ZHyfREpbnPU6Vj4Xh97o1K9hmKRJ-I,3187
96
+ server/endpoint/tables_endpoint.py,sha256=PcNqk66aJ_rsFSHOJ1FCB_G5GlvGFIzr66G5aO2aIRo,9742
97
+ server/endpoint/tasks_endpoint.py,sha256=5VHGe2NSgr40BKPPOm9nVrdZGrG3Sf0ri_CNqsv0CpQ,6304
98
+ server/endpoint/users_endpoint.py,sha256=How6_592NotSDF__pRSQ_IMkKWX-jjRKIHTVCsTXfgo,30054
99
+ server/endpoint/views_endpoint.py,sha256=p4rSEPS3Octgm9W7b1QHSaxVJW4F5KJHoYXTymYMo-o,18639
100
+ server/endpoint/virtual_connections_endpoint.py,sha256=K5R86aIm4hZeYw3OUOlKv-zTmsWa3np1iuV_h5iPvt0,8458
101
+ server/endpoint/webhooks_endpoint.py,sha256=nmEjKdbntwBg-0XAP2TluOv2v8usqxXg7sO8ogS5rDI,4923
102
+ server/endpoint/workbooks_endpoint.py,sha256=tN5AybuR8lZxwM6OFtJLJ0Cryo2d8thWHUONCT4OK7k,47116
103
+ tableauserverclient-0.39.dist-info/licenses/LICENSE,sha256=MMkY7MguOb4L-WCmmqrVcwg2iwSGaz-RfAMFvXRXwsQ,1074
104
+ tableauserverclient-0.39.dist-info/METADATA,sha256=nddyyUHFsllYnxKmsXLyE8_9ot7Cx3Cp36KPbejGbVc,3176
105
+ tableauserverclient-0.39.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
106
+ tableauserverclient-0.39.dist-info/top_level.txt,sha256=mYhy_-A6qRwugiu8LrbB_k66cJASefpXAZrD1u_5CZk,26
107
+ tableauserverclient-0.39.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.0.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,4 @@
1
+ bin
2
+ helpers
3
+ models
4
+ server
@@ -1,141 +0,0 @@
1
- from tableauserverclient.bin._version import get_versions
2
- from tableauserverclient.namespace import NEW_NAMESPACE as DEFAULT_NAMESPACE
3
- from tableauserverclient.models import (
4
- BackgroundJobItem,
5
- ColumnItem,
6
- ConnectionCredentials,
7
- ConnectionItem,
8
- CustomViewItem,
9
- DQWItem,
10
- DailyInterval,
11
- DataAlertItem,
12
- DatabaseItem,
13
- DataFreshnessPolicyItem,
14
- DatasourceItem,
15
- FavoriteItem,
16
- FlowItem,
17
- FlowRunItem,
18
- FileuploadItem,
19
- GroupItem,
20
- GroupSetItem,
21
- HourlyInterval,
22
- IntervalItem,
23
- JobItem,
24
- JWTAuth,
25
- LinkedTaskItem,
26
- LinkedTaskStepItem,
27
- LinkedTaskFlowRunItem,
28
- MetricItem,
29
- MonthlyInterval,
30
- PaginationItem,
31
- Permission,
32
- PermissionsRule,
33
- PersonalAccessTokenAuth,
34
- ProjectItem,
35
- Resource,
36
- RevisionItem,
37
- ScheduleItem,
38
- SiteItem,
39
- ServerInfoItem,
40
- SubscriptionItem,
41
- TableauItem,
42
- TableItem,
43
- TableauAuth,
44
- Target,
45
- TaskItem,
46
- UserItem,
47
- ViewItem,
48
- VirtualConnectionItem,
49
- WebhookItem,
50
- WeeklyInterval,
51
- WorkbookItem,
52
- )
53
-
54
- from tableauserverclient.server import (
55
- CSVRequestOptions,
56
- ExcelRequestOptions,
57
- ImageRequestOptions,
58
- PDFRequestOptions,
59
- PPTXRequestOptions,
60
- RequestOptions,
61
- MissingRequiredFieldError,
62
- FailedSignInError,
63
- NotSignedInError,
64
- ServerResponseError,
65
- Filter,
66
- Pager,
67
- Server,
68
- Sort,
69
- )
70
-
71
- __all__ = [
72
- "BackgroundJobItem",
73
- "BackgroundJobItem",
74
- "ColumnItem",
75
- "ConnectionCredentials",
76
- "ConnectionItem",
77
- "CSVRequestOptions",
78
- "CustomViewItem",
79
- "DailyInterval",
80
- "DataAlertItem",
81
- "DatabaseItem",
82
- "DataFreshnessPolicyItem",
83
- "DatasourceItem",
84
- "DEFAULT_NAMESPACE",
85
- "DQWItem",
86
- "ExcelRequestOptions",
87
- "FailedSignInError",
88
- "FavoriteItem",
89
- "FileuploadItem",
90
- "Filter",
91
- "FlowItem",
92
- "FlowRunItem",
93
- "get_versions",
94
- "GroupItem",
95
- "GroupSetItem",
96
- "HourlyInterval",
97
- "ImageRequestOptions",
98
- "IntervalItem",
99
- "JobItem",
100
- "JWTAuth",
101
- "LinkedTaskFlowRunItem",
102
- "LinkedTaskItem",
103
- "LinkedTaskStepItem",
104
- "MetricItem",
105
- "MissingRequiredFieldError",
106
- "MonthlyInterval",
107
- "NotSignedInError",
108
- "Pager",
109
- "PaginationItem",
110
- "PDFRequestOptions",
111
- "PPTXRequestOptions",
112
- "Permission",
113
- "PermissionsRule",
114
- "PersonalAccessTokenAuth",
115
- "ProjectItem",
116
- "RequestOptions",
117
- "Resource",
118
- "RevisionItem",
119
- "ScheduleItem",
120
- "Server",
121
- "ServerInfoItem",
122
- "ServerResponseError",
123
- "SiteItem",
124
- "Sort",
125
- "SubscriptionItem",
126
- "TableauAuth",
127
- "TableauItem",
128
- "TableItem",
129
- "Target",
130
- "TaskItem",
131
- "UserItem",
132
- "ViewItem",
133
- "VirtualConnectionItem",
134
- "WebhookItem",
135
- "WeeklyInterval",
136
- "WorkbookItem",
137
- ]
138
-
139
- from .bin import _version
140
-
141
- __version__ = _version.get_versions()["version"]
@@ -1,27 +0,0 @@
1
- import os
2
-
3
- ALLOWED_FILE_EXTENSIONS = ["tds", "tdsx", "tde", "hyper", "parquet"]
4
-
5
- BYTES_PER_MB = 1024 * 1024
6
-
7
- DELAY_SLEEP_SECONDS = 0.1
8
-
9
-
10
- class Config:
11
- # The maximum size of a file that can be published in a single request is 64MB
12
- @property
13
- def FILESIZE_LIMIT_MB(self):
14
- return min(int(os.getenv("TSC_FILESIZE_LIMIT_MB", 64)), 64)
15
-
16
- # For when a datasource is over 64MB, break it into 5MB(standard chunk size) chunks
17
- @property
18
- def CHUNK_SIZE_MB(self):
19
- return int(os.getenv("TSC_CHUNK_SIZE_MB", 5 * 10)) # 5MB felt too slow, upped it to 50
20
-
21
- # Default page size
22
- @property
23
- def PAGE_SIZE(self):
24
- return int(os.getenv("TSC_PAGE_SIZE", 100))
25
-
26
-
27
- config = Config()
@@ -1,45 +0,0 @@
1
- import datetime
2
-
3
-
4
- ZERO = datetime.timedelta(0)
5
- HOUR = datetime.timedelta(hours=1)
6
-
7
-
8
- def timestamp():
9
- return datetime.datetime.now().strftime("%H:%M:%S")
10
-
11
-
12
- # This class is a concrete implementation of the abstract base class tzinfo
13
- # docs: https://docs.python.org/2.3/lib/datetime-tzinfo.html
14
- class UTC(datetime.tzinfo):
15
- """UTC"""
16
-
17
- def utcoffset(self, dt):
18
- return ZERO
19
-
20
- def tzname(self, dt):
21
- return "UTC"
22
-
23
- def dst(self, dt):
24
- return ZERO
25
-
26
-
27
- utc = UTC()
28
- TABLEAU_DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
29
-
30
-
31
- def parse_datetime(date):
32
- if date is None:
33
- return None
34
-
35
- try:
36
- return datetime.datetime.strptime(date, TABLEAU_DATE_FORMAT).replace(tzinfo=utc)
37
- except ValueError:
38
- return None
39
-
40
-
41
- def format_datetime(date):
42
- if date is None:
43
- return None
44
-
45
- return date.astimezone(tz=utc).strftime(TABLEAU_DATE_FORMAT)