|
1 | 1 | __author__ = "Robert Cope" |
2 | 2 |
|
| 3 | +import sys |
3 | 4 | import requests |
4 | 5 | from requests.auth import HTTPBasicAuth |
5 | 6 | from urlparse import urljoin |
|
14 | 15 | api_logger.addHandler(nh) |
15 | 16 |
|
16 | 17 |
|
| 18 | +def all_of(api_call, *args, **kwargs): |
| 19 | + """ |
| 20 | + Generator that iterates over all results of an API call that requires limit/start pagination. |
| 21 | +
|
| 22 | + If the `limit` keyword argument is set, it is used to stop the |
| 23 | + generator after the given number of result items. |
| 24 | +
|
| 25 | + >>> for i, v in enumerate(all_of(api.get_content)): |
| 26 | + >>> v = bunchify(v) |
| 27 | + >>> print('\t'.join((str(i), v.type, v.id, v.status, v.title))) |
| 28 | +
|
| 29 | + :param api_call: Confluence API call (method). |
| 30 | + :param args: Positional arguments of the call. |
| 31 | + :param kwargs: Keyword arguments of the call. |
| 32 | + """ |
| 33 | + kwargs = kwargs.copy() |
| 34 | + pos, outer_limit = 0, kwargs.get('limit', 0) or sys.maxint |
| 35 | + while True: |
| 36 | + response = api_call(*args, **kwargs) |
| 37 | + for item in response.get('results', []): |
| 38 | + pos += 1 |
| 39 | + if pos > outer_limit: |
| 40 | + return |
| 41 | + yield item |
| 42 | + ##print((pos, response['start'], response['limit'])) |
| 43 | + if response.get('_links', {}).get('next', None): |
| 44 | + kwargs['start'] = response['start'] + response['size'] |
| 45 | + kwargs['limit'] = response['limit'] |
| 46 | + else: |
| 47 | + return |
| 48 | + |
| 49 | + |
17 | 50 | class ConfluenceAPI(object): |
18 | 51 | DEFAULT_USER_AGENT = "PythonConfluenceAPI" |
19 | 52 |
|
|
0 commit comments