Skip to content

Commit f84d7d5

Browse files
authored
Merge pull request #1347 from tableau/development
0.30 Release (bug fixes)
2 parents 6af8557 + 1106673 commit f84d7d5

File tree

6 files changed

+18
-56
lines changed

6 files changed

+18
-56
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,4 @@ $RECYCLE.BIN/
155155
docs/_site/
156156
docs/.jekyll-metadata
157157
docs/Gemfile.lock
158+
samples/credentials

contributing.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ Contribution can include, but are not limited to, any of the following:
1010
* Fix an Issue/Bug
1111
* Add/Fix documentation
1212

13-
Contributions must follow the guidelines outlined on the [Tableau Organization](http://tableau.github.io/) page, though filing an issue or requesting
14-
a feature do not require the CLA.
13+
Contributions must follow the guidelines outlined on the [Tableau Organization](http://tableau.github.io/) page, though filing an issue or requesting a feature do not require the CLA.
1514

1615
## Issues and Feature Requests
1716

samples/getting_started/3_hello_universe.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,6 @@ def main():
6262
print("{} jobs".format(pagination.total_available))
6363
print(jobs[0])
6464

65-
metrics, pagination = server.metrics.get()
66-
if metrics:
67-
print("{} metrics".format(pagination.total_available))
68-
print(metrics[0])
69-
7065
schedules, pagination = server.schedules.get()
7166
if schedules:
7267
print("{} schedules".format(pagination.total_available))
@@ -82,7 +77,7 @@ def main():
8277
print("{} webhooks".format(pagination.total_available))
8378
print(webhooks[0])
8479

85-
users, pagination = server.metrics.get()
80+
users, pagination = server.users.get()
8681
if users:
8782
print("{} users".format(pagination.total_available))
8883
print(users[0])
@@ -92,5 +87,6 @@ def main():
9287
print("{} groups".format(pagination.total_available))
9388
print(groups[0])
9489

95-
if __name__ == "__main__":
96-
main()
90+
91+
if __name__ == "__main__":
92+
main()

tableauserverclient/models/interval_item.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def interval(self):
6969

7070
@interval.setter
7171
def interval(self, intervals):
72-
VALID_INTERVALS = {0.25, 0.5, 1, 2, 4, 6, 8, 12}
72+
VALID_INTERVALS = {0.25, 0.5, 1, 2, 4, 6, 8, 12, 24}
7373
for interval in intervals:
7474
# if an hourly interval is a string, then it is a weekDay interval
7575
if isinstance(interval, str) and not interval.isnumeric() and not hasattr(IntervalItem.Day, interval):

tableauserverclient/server/endpoint/endpoint.py

+3-40
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from threading import Thread
2-
from time import sleep
31
from tableauserverclient import datetime_helpers as datetime
42

53
from packaging.version import Version
@@ -76,55 +74,20 @@ def set_user_agent(parameters):
7674
return parameters
7775

7876
def _blocking_request(self, method, url, parameters={}) -> Optional[Union["Response", Exception]]:
79-
self.async_response = None
8077
response = None
8178
logger.debug("[{}] Begin blocking request to {}".format(datetime.timestamp(), url))
8279
try:
8380
response = method(url, **parameters)
84-
self.async_response = response
8581
logger.debug("[{}] Call finished".format(datetime.timestamp()))
8682
except Exception as e:
8783
logger.debug("Error making request to server: {}".format(e))
88-
self.async_response = e
89-
finally:
90-
if response and not self.async_response:
91-
logger.debug("Request response not saved")
92-
return None
93-
logger.debug("[{}] Request complete".format(datetime.timestamp()))
94-
return self.async_response
84+
raise e
85+
return response
9586

9687
def send_request_while_show_progress_threaded(
9788
self, method, url, parameters={}, request_timeout=None
9889
) -> Optional[Union["Response", Exception]]:
99-
try:
100-
request_thread = Thread(target=self._blocking_request, args=(method, url, parameters))
101-
request_thread.start()
102-
except Exception as e:
103-
logger.debug("Error starting server request on separate thread: {}".format(e))
104-
return None
105-
seconds = 0.05
106-
minutes = 0
107-
last_log_minute = 0
108-
sleep(seconds)
109-
if self.async_response is not None:
110-
# a quick return for any immediate responses
111-
return self.async_response
112-
timed_out: bool = request_timeout is not None and seconds > request_timeout
113-
while (self.async_response is None) and not timed_out:
114-
sleep(DELAY_SLEEP_SECONDS)
115-
seconds = seconds + DELAY_SLEEP_SECONDS
116-
minutes = int(seconds / 60)
117-
last_log_minute = self.log_wait_time(minutes, last_log_minute, url)
118-
return self.async_response
119-
120-
def log_wait_time(self, minutes, last_log_minute, url) -> int:
121-
logger.debug("{} Waiting....".format(datetime.timestamp()))
122-
if minutes > last_log_minute: # detailed log message ~every minute
123-
logger.info("[{}] Waiting ({} minutes so far) for request to {}".format(datetime.timestamp(), minutes, url))
124-
last_log_minute = minutes
125-
else:
126-
logger.debug("[{}] Waiting for request to {}".format(datetime.timestamp(), url))
127-
return last_log_minute
90+
return self._blocking_request(method, url, parameters)
12891

12992
def _make_request(
13093
self,

test/test_endpoint.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from pathlib import Path
2+
import pytest
3+
import requests
24
import unittest
35

46
import tableauserverclient as TSC
@@ -35,11 +37,12 @@ def test_user_friendly_request_returns(self) -> None:
3537
)
3638
self.assertIsNotNone(response)
3739

38-
def test_blocking_request_returns(self) -> None:
39-
url = "http://test/"
40-
endpoint = TSC.server.Endpoint(self.server)
41-
response = endpoint._blocking_request(endpoint.parent_srv.session.get, url=url)
42-
self.assertIsNotNone(response)
40+
def test_blocking_request_raises_request_error(self) -> None:
41+
with pytest.raises(requests.exceptions.ConnectionError):
42+
url = "http://test/"
43+
endpoint = TSC.server.Endpoint(self.server)
44+
response = endpoint._blocking_request(endpoint.parent_srv.session.get, url=url)
45+
self.assertIsNotNone(response)
4346

4447
def test_get_request_stream(self) -> None:
4548
url = "http://test/"

0 commit comments

Comments
 (0)