Skip to content

Commit 794cc7d

Browse files
Merge pull request #75 from vossen-adobe/feature/stats
Add statistics from response headers for query_multiple
2 parents f02714c + 87cc63b commit 794cc7d

File tree

3 files changed

+44
-27
lines changed

3 files changed

+44
-27
lines changed

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
"""

umapi_client/connection.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,21 +273,28 @@ def query_multiple(self, object_type, page=0, url_params=None, query_params=None
273273
return [], True
274274
else:
275275
raise re
276+
277+
headers = {k.lower(): v for k, v in result.headers.items()}
278+
total_count = headers.get("x-total-count", "0")
279+
page_count = headers.get("x-page-count", "0")
280+
page_number = headers.get("x-current-page", "1")
281+
page_size = headers.get("x-page-size", "0")
282+
276283
if object_type in ("user", "group"):
277284
if body.get("result") == "success":
278285
values = body.get(object_type + "s", [])
279286
last_page = body.get("lastPage", False)
287+
280288
if self.logger: self.logger.debug("Ran multi-%s query: %s %s (page %d: %d found)",
281289
object_type, url_params, query_params, page, len(values))
282-
return values, last_page
290+
return values, last_page, int(total_count), int(page_count), int(page_number), int(page_size)
283291
else:
284292
raise ClientError("OK status but no 'success' result", result)
285293
elif object_type == "user-group":
286-
page_number = result.headers.get("X-Current-Page", "1")
287-
page_count = result.headers.get("X-Page-Count", "1")
288294
if self.logger: self.logger.debug("Ran multi-group query: %s %s (page %d: %d found)",
289295
url_params, query_params, page, len(body))
290-
return body, int(page_number) >= int(page_count)
296+
return body, int(page_number) >= int(page_count), int(total_count), int(page_count), \
297+
int(page_number), int(page_size)
291298
else:
292299
# this would actually be caught above, but we use a parallel construction in both places
293300
# to make it easy to add query object types

0 commit comments

Comments
 (0)