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.
- tableauserverclient/bin/_version.py → _version.py +3 -3
- bin/__init__.py +3 -0
- bin/_version.py +21 -0
- {tableauserverclient/helpers → helpers}/strings.py +25 -1
- {tableauserverclient/models → models}/__init__.py +15 -1
- models/collection_item.py +52 -0
- {tableauserverclient/models → models}/connection_item.py +16 -2
- {tableauserverclient/models → models}/custom_view_item.py +8 -0
- {tableauserverclient/models → models}/data_freshness_policy_item.py +3 -3
- {tableauserverclient/models → models}/datasource_item.py +113 -3
- models/extensions_item.py +186 -0
- models/extract_item.py +82 -0
- {tableauserverclient/models → models}/favorites_item.py +21 -8
- {tableauserverclient/models → models}/flow_item.py +3 -3
- {tableauserverclient/models → models}/group_item.py +18 -1
- {tableauserverclient/models → models}/groupset_item.py +14 -0
- {tableauserverclient/models → models}/interval_item.py +42 -1
- models/location_item.py +53 -0
- models/oidc_item.py +82 -0
- {tableauserverclient/models → models}/permissions_item.py +2 -0
- {tableauserverclient/models → models}/project_item.py +141 -29
- {tableauserverclient/models → models}/property_decorators.py +2 -2
- {tableauserverclient/models → models}/reference_item.py +12 -6
- {tableauserverclient/models → models}/schedule_item.py +67 -1
- {tableauserverclient/models → models}/site_item.py +54 -0
- {tableauserverclient/models → models}/table_item.py +7 -3
- {tableauserverclient/models → models}/tableau_auth.py +13 -6
- {tableauserverclient/models → models}/tableau_types.py +13 -1
- {tableauserverclient/models → models}/user_item.py +111 -4
- {tableauserverclient/models → models}/view_item.py +79 -5
- {tableauserverclient/models → models}/workbook_item.py +153 -3
- {tableauserverclient/server → server}/endpoint/__init__.py +4 -0
- {tableauserverclient/server → server}/endpoint/databases_endpoint.py +101 -18
- {tableauserverclient/server → server}/endpoint/datasources_endpoint.py +155 -25
- {tableauserverclient/server → server}/endpoint/dqw_endpoint.py +16 -6
- {tableauserverclient/server → server}/endpoint/endpoint.py +39 -0
- server/endpoint/extensions_endpoint.py +79 -0
- {tableauserverclient/server → server}/endpoint/flow_task_endpoint.py +1 -1
- {tableauserverclient/server → server}/endpoint/flows_endpoint.py +5 -4
- server/endpoint/oidc_endpoint.py +157 -0
- {tableauserverclient/server → server}/endpoint/projects_endpoint.py +12 -0
- server/endpoint/schedules_endpoint.py +328 -0
- {tableauserverclient/server → server}/endpoint/sites_endpoint.py +18 -1
- {tableauserverclient/server → server}/endpoint/tables_endpoint.py +140 -17
- {tableauserverclient/server → server}/endpoint/users_endpoint.py +296 -10
- {tableauserverclient/server → server}/endpoint/views_endpoint.py +23 -0
- {tableauserverclient/server → server}/endpoint/workbooks_endpoint.py +124 -9
- {tableauserverclient/server → server}/query.py +36 -0
- {tableauserverclient/server → server}/request_factory.py +286 -2
- {tableauserverclient/server → server}/request_options.py +139 -3
- {tableauserverclient/server → server}/server.py +46 -0
- {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/METADATA +5 -26
- tableauserverclient-0.39.dist-info/RECORD +107 -0
- {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/WHEEL +1 -1
- tableauserverclient-0.39.dist-info/top_level.txt +4 -0
- tableauserverclient/__init__.py +0 -141
- tableauserverclient/config.py +0 -27
- tableauserverclient/datetime_helpers.py +0 -45
- tableauserverclient/exponential_backoff.py +0 -30
- tableauserverclient/filesys_helpers.py +0 -63
- tableauserverclient/namespace.py +0 -37
- tableauserverclient/py.typed +0 -0
- tableauserverclient/server/endpoint/schedules_endpoint.py +0 -151
- tableauserverclient-0.37.dist-info/RECORD +0 -106
- tableauserverclient-0.37.dist-info/licenses/LICENSE.versioneer +0 -7
- tableauserverclient-0.37.dist-info/top_level.txt +0 -1
- {tableauserverclient/helpers → helpers}/__init__.py +0 -0
- {tableauserverclient/helpers → helpers}/headers.py +0 -0
- {tableauserverclient/helpers → helpers}/logging.py +0 -0
- {tableauserverclient/models → models}/column_item.py +0 -0
- {tableauserverclient/models → models}/connection_credentials.py +0 -0
- {tableauserverclient/models → models}/data_acceleration_report_item.py +0 -0
- {tableauserverclient/models → models}/data_alert_item.py +0 -0
- {tableauserverclient/models → models}/database_item.py +0 -0
- {tableauserverclient/models → models}/dqw_item.py +0 -0
- {tableauserverclient/models → models}/exceptions.py +0 -0
- {tableauserverclient/models → models}/fileupload_item.py +0 -0
- {tableauserverclient/models → models}/flow_run_item.py +0 -0
- {tableauserverclient/models → models}/job_item.py +0 -0
- {tableauserverclient/models → models}/linked_tasks_item.py +0 -0
- {tableauserverclient/models → models}/metric_item.py +0 -0
- {tableauserverclient/models → models}/pagination_item.py +0 -0
- {tableauserverclient/models → models}/revision_item.py +0 -0
- {tableauserverclient/models → models}/server_info_item.py +0 -0
- {tableauserverclient/models → models}/subscription_item.py +0 -0
- {tableauserverclient/models → models}/tag_item.py +0 -0
- {tableauserverclient/models → models}/target.py +0 -0
- {tableauserverclient/models → models}/task_item.py +0 -0
- {tableauserverclient/models → models}/virtual_connection_item.py +0 -0
- {tableauserverclient/models → models}/webhook_item.py +0 -0
- {tableauserverclient/server → server}/__init__.py +0 -0
- {tableauserverclient/server → server}/endpoint/auth_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/custom_views_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/data_acceleration_report_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/data_alert_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/default_permissions_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/exceptions.py +0 -0
- {tableauserverclient/server → server}/endpoint/favorites_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/fileuploads_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/flow_runs_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/groups_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/groupsets_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/jobs_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/linked_tasks_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/metadata_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/metrics_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/permissions_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/resource_tagger.py +0 -0
- {tableauserverclient/server → server}/endpoint/server_info_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/subscriptions_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/tasks_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/virtual_connections_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/webhooks_endpoint.py +0 -0
- {tableauserverclient/server → server}/exceptions.py +0 -0
- {tableauserverclient/server → server}/filter.py +0 -0
- {tableauserverclient/server → server}/pager.py +0 -0
- {tableauserverclient/server → server}/sort.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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,,
|
tableauserverclient/__init__.py
DELETED
|
@@ -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"]
|
tableauserverclient/config.py
DELETED
|
@@ -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)
|