Skip to content

Commit d60126e

Browse files
committed
Merge branch 'v2' into ssl_verify
2 parents c475dd3 + 542122e commit d60126e

File tree

8 files changed

+194
-81
lines changed

8 files changed

+194
-81
lines changed

.github/workflows/python-package.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
2+
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
3+
4+
name: Build
5+
6+
on:
7+
push:
8+
branches: [ v2 ]
9+
pull_request:
10+
branches: [ v2 ]
11+
12+
jobs:
13+
build:
14+
15+
runs-on: ubuntu-latest
16+
strategy:
17+
matrix:
18+
python-version: [3.5, 3.6, 3.7, 3.8]
19+
20+
steps:
21+
- uses: actions/checkout@v2
22+
- name: Set up Python ${{ matrix.python-version }}
23+
uses: actions/setup-python@v2
24+
with:
25+
python-version: ${{ matrix.python-version }}
26+
- name: Install dependencies
27+
run: |
28+
python -m pip install --upgrade pip setuptools wheel
29+
pip install -e .
30+
pip install -e .[test]
31+
pip install -e .[setup]
32+
- name: Test with pytest
33+
run: |
34+
pytest

.github/workflows/python-publish.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# This workflows will upload a Python Package using Twine when a release is created
2+
# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
3+
4+
name: Publish
5+
6+
on:
7+
release:
8+
types: [created]
9+
10+
jobs:
11+
deploy:
12+
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- uses: actions/checkout@v2
17+
- name: Set up Python
18+
uses: actions/setup-python@v2
19+
with:
20+
python-version: '3.x'
21+
- name: Install dependencies
22+
run: |
23+
python -m pip install --upgrade pip
24+
pip install setuptools wheel twine
25+
- name: Build and publish
26+
env:
27+
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
28+
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
29+
run: |
30+
python setup.py sdist bdist_wheel
31+
twine upload dist/*

.travis.yml

Lines changed: 0 additions & 25 deletions
This file was deleted.

tests/test_connections.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,31 @@ def test_remote_status_timeout():
5959
assert remote_status["status"].startswith("Unreachable")
6060

6161

62+
def test_remote_status_error():
63+
with mock.patch("umapi_client.connection.requests.Session.get") as mock_get:
64+
mock_get.side_effect = requests.ConnectionError
65+
conn = Connection(**mock_connection_params)
66+
_, remote_status = conn.status(remote=True)
67+
assert remote_status["status"].startswith("Unreachable")
68+
69+
70+
# log_stream fixture defined in conftest.py
71+
def test_remote_status_error_logging(log_stream):
72+
with mock.patch("umapi_client.connection.requests.Session.get") as mock_get:
73+
mock_get.side_effect = requests.ConnectionError
74+
stream, logger = log_stream
75+
params = dict(mock_connection_params)
76+
params["logger"] = logger
77+
conn = Connection(**params)
78+
pytest.raises(UnavailableError, conn.make_call, "")
79+
stream.flush()
80+
log = stream.getvalue() # save as a local so can do pytest -l to see exact log
81+
assert "code Error on try 1" in log
82+
assert "code Error on try 2" in log
83+
assert "code Error on try 3" in log
84+
assert "code Error on try 4" not in log
85+
86+
6287
def test_ua_string():
6388
conn = Connection(**mock_connection_params)
6489
req = conn.session.prepare_request(requests.Request('GET', "http://test.com/"))

tests/test_queries.py

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_query_multiple_user_success():
8888
conn = Connection(**mock_connection_params)
8989
assert conn.query_multiple("user") == ([{"name": "n1", "type": "user"},
9090
{"name": "n2", "type": "user"}],
91-
False)
91+
False, 0, 0, 1, 0)
9292

9393

9494
def test_query_multiple_user_empty():
@@ -97,7 +97,7 @@ def test_query_multiple_user_empty():
9797
"lastPage": True,
9898
"users": []})
9999
conn = Connection(**mock_connection_params)
100-
assert conn.query_multiple("user") == ([], True)
100+
assert conn.query_multiple("user") == ([], True, 0, 0, 1, 0)
101101

102102

103103
def test_query_multiple_user_not_found():
@@ -120,10 +120,10 @@ def test_query_multiple_user_paged():
120120
conn = Connection(**mock_connection_params)
121121
assert conn.query_multiple("user", 0) == ([{"name": "n1", "type": "user"},
122122
{"name": "n2", "type": "user"}],
123-
False)
123+
False, 0, 0, 1, 0)
124124
assert conn.query_multiple("user", 1) == ([{"name": "n3", "type": "user"},
125125
{"name": "n4", "type": "user"}],
126-
True)
126+
True, 0, 0, 1, 0)
127127

128128

129129
def test_qm_user_iterate_complete():
@@ -199,7 +199,6 @@ def test_qm_user_reload():
199199
{"name": "n7", "type": "user"},
200200
{"name": "n8", "type": "user"}]
201201

202-
203202
def test_query_multiple_usergroup_success():
204203
with mock.patch("umapi_client.connection.requests.Session.get") as mock_get:
205204
mock_get.return_value = MockResponse(200,
@@ -208,11 +207,11 @@ def test_query_multiple_usergroup_success():
208207
{"X-Total-Count": "4",
209208
"X-Page-Count": "2",
210209
"X-Current-Page": "1",
211-
"X-Page-Size:": "2"})
210+
"X-Page-Size": "2"})
212211
conn = Connection(**mock_connection_params)
213212
assert conn.query_multiple("user-group") == ([{"name": "n1", "type": "user-group"},
214213
{"name": "n2", "type": "user-group"}],
215-
False)
214+
False, 4, 2, 1, 2)
216215

217216

218217
def test_query_multiple_usergroup_empty():
@@ -222,9 +221,9 @@ def test_query_multiple_usergroup_empty():
222221
{"X-Total-Count": "0",
223222
"X-Page-Count": "1",
224223
"X-Current-Page": "1",
225-
"X-Page-Size:": "0"})
224+
"X-Page-Size": "0"})
226225
conn = Connection(**mock_connection_params)
227-
assert conn.query_multiple("user-group") == ([], True)
226+
assert conn.query_multiple("user-group") == ([], True, 0, 1, 1, 0)
228227

229228

230229
def test_query_multiple_usergroup_not_found():
@@ -242,21 +241,21 @@ def test_query_multiple_usergroup_paged():
242241
{"X-Total-Count": "4",
243242
"X-Page-Count": "2",
244243
"X-Current-Page": "1",
245-
"X-Page-Size:": "2"}),
244+
"X-Page-Size": "2"}),
246245
MockResponse(200,
247246
[{"name": "n3", "type": "user-group"},
248247
{"name": "n4", "type": "user-group"}],
249248
{"X-Total-Count": "4",
250249
"X-Page-Count": "2",
251250
"X-Current-Page": "2",
252-
"X-Page-Size:": "2"})]
251+
"X-Page-Size": "2"})]
253252
conn = Connection(**mock_connection_params)
254253
assert conn.query_multiple("user-group", 0) == ([{"name": "n1", "type": "user-group"},
255254
{"name": "n2", "type": "user-group"}],
256-
False)
255+
False, 4, 2, 1, 2)
257256
assert conn.query_multiple("user-group", 1) == ([{"name": "n3", "type": "user-group"},
258257
{"name": "n4", "type": "user-group"}],
259-
True)
258+
True, 4, 2, 2, 2)
260259

261260

262261
def test_qm_usergroup_iterate_complete():
@@ -267,14 +266,14 @@ def test_qm_usergroup_iterate_complete():
267266
{"X-Total-Count": "4",
268267
"X-Page-Count": "2",
269268
"X-Current-Page": "1",
270-
"X-Page-Size:": "2"}),
269+
"X-Page-Size": "2"}),
271270
MockResponse(200,
272271
[{"name": "n3", "type": "user-group"},
273272
{"name": "n4", "type": "user-group"}],
274273
{"X-Total-Count": "4",
275274
"X-Page-Count": "2",
276275
"X-Current-Page": "2",
277-
"X-Page-Size:": "2"})]
276+
"X-Page-Size": "2"})]
278277
conn = Connection(**mock_connection_params)
279278
qm = QueryMultiple(conn, "user-group")
280279
for obj in qm:
@@ -294,14 +293,14 @@ def test_qm_usergroup_iterate_partial():
294293
{"X-Total-Count": "6",
295294
"X-Page-Count": "3",
296295
"X-Current-Page": "1",
297-
"X-Page-Size:": "2"}),
296+
"X-Page-Size": "2"}),
298297
MockResponse(200,
299298
[{"name": "n1", "type": "user-group"},
300299
{"name": "n2", "type": "user-group"}],
301300
{"X-Total-Count": "6",
302301
"X-Page-Count": "3",
303302
"X-Current-Page": "2",
304-
"X-Page-Size:": "2"}),
303+
"X-Page-Size": "2"}),
305304
MockResponse(400, text="400 bad request")]
306305
conn = Connection(**mock_connection_params)
307306
qm = QueryMultiple(conn, "user-group")
@@ -322,28 +321,28 @@ def test_qm_usergroup_reload():
322321
{"X-Total-Count": "4",
323322
"X-Page-Count": "2",
324323
"X-Current-Page": "1",
325-
"X-Page-Size:": "2"}),
324+
"X-Page-Size": "2"}),
326325
MockResponse(200,
327326
[{"name": "n3", "type": "user-group"},
328327
{"name": "n4", "type": "user-group"}],
329328
{"X-Total-Count": "4",
330329
"X-Page-Count": "2",
331330
"X-Current-Page": "2",
332-
"X-Page-Size:": "2"}),
331+
"X-Page-Size": "2"}),
333332
MockResponse(200,
334333
[{"name": "n5", "type": "user-group"},
335334
{"name": "n6", "type": "user-group"}],
336335
{"X-Total-Count": "4",
337336
"X-Page-Count": "2",
338337
"X-Current-Page": "1",
339-
"X-Page-Size:": "2"}),
338+
"X-Page-Size": "2"}),
340339
MockResponse(200,
341340
[{"name": "n7", "type": "user-group"},
342341
{"name": "n8", "type": "user-group"}],
343342
{"X-Total-Count": "4",
344343
"X-Page-Count": "2",
345344
"X-Current-Page": "2",
346-
"X-Page-Size:": "2"})]
345+
"X-Page-Size": "2"})]
347346
conn = Connection(**mock_connection_params)
348347
qm = QueryMultiple(conn, "user-group")
349348
assert list(qm) == [{"name": "n1", "type": "user-group"},

umapi_client/api.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ def __init__(self, connection, object_type, url_params=None, query_params=None):
182182
self._results = []
183183
self._next_item_index = 0
184184
self._next_page_index = 0
185+
self._total_count = 0
186+
self._page_size = 1
187+
self._page_count = 0
188+
self._page_number = 1
185189
self._last_page_seen = False
186190

187191
def reload(self):
@@ -193,6 +197,10 @@ def reload(self):
193197
self._results = []
194198
self._next_item_index = 0
195199
self._next_page_index = 0
200+
self._total_count = 0
201+
self._page_count = 0
202+
self._page_size = 0
203+
self._page_number = 1
196204
self._last_page_seen = False
197205

198206
def _next_page(self):
@@ -201,8 +209,8 @@ def _next_page(self):
201209
"""
202210
if self._last_page_seen:
203211
raise StopIteration
204-
new, self._last_page_seen = self.conn.query_multiple(self.object_type, self._next_page_index,
205-
self.url_params, self.query_params)
212+
new, self._last_page_seen, self._total_count, self._page_count, self._page_number, self._page_size = \
213+
self.conn.query_multiple(self.object_type, self._next_page_index, self.url_params, self.query_params)
206214
self._next_page_index += 1
207215
if len(new) == 0:
208216
self._last_page_seen = True # don't bother with next page if nothing was returned
@@ -250,6 +258,9 @@ def all_results(self):
250258
self._next_item_index = len(self._results)
251259
return list(self._results)
252260

261+
def stats(self):
262+
return self._total_count, self._page_count, self._page_size, self._page_number
263+
253264

254265
class QuerySingle:
255266
"""

0 commit comments

Comments
 (0)