From dc1dcf75b8dd921875c8d6afaf7b205475d34eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Michael=20O=2E=20Hegg=C3=B8?= <danmichaelo@gmail.com> Date: Thu, 18 May 2017 01:41:59 +0200 Subject: [PATCH] [#161] Fix: Client.ask zero result case When there's zero results, the method should not yield an empty dictionary. Otherwise counting number of results could be wrong (think `len(list(site.ask('...')))`) --- mwclient/client.py | 30 ++++++++++++------------------ tests/test_client.py | 4 ++-- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/mwclient/client.py b/mwclient/client.py index 0424395..59eba7a 100644 --- a/mwclient/client.py +++ b/mwclient/client.py @@ -976,19 +976,17 @@ class Site(object): API doc: https://semantic-mediawiki.org/wiki/Ask_API Returns: - Generator for retrieving all search results. - Iterating over the generator gives a dictionary containing the answers - to the query. - The dictionary is empty if the query is valid but there are no answers. + Generator for retrieving all search results, with each answer as a dictionary. + If the query is invalid, an APIError is raised. A valid query with zero + results will not raise any error. Examples: >>> query = "[[Category:my cat]]|[[Has name::a name]]|?Has property" - >>> answer = site.ask(query) - >>> for a in answer: - >>> for key, value in a.items() - >>> print(key) - >>> print(value) + >>> for answer in site.ask(query): + >>> for title, data in answer.items() + >>> print(title) + >>> print(data) """ kwargs = {} if title is None: @@ -998,12 +996,8 @@ class Site(object): while offset is not None: results = self.raw_api('ask', query=u'{query}|offset={offset}'.format( query=query, offset=offset), http_method='GET', **kwargs) - if self.handle_api_result(results): - answer = results['query'].get('results') - if answer: - offset = results.get('query-continue-offset') - for key, value in answer.items(): - yield {key: value} - else: # query returns no results - offset = None - yield {} + self.handle_api_result(results) # raises APIError on error + offset = results.get('query-continue-offset') + answers = results['query'].get('results') or {} + for key, value in answers.items(): + yield {key: value} diff --git a/tests/test_client.py b/tests/test_client.py index 1b031e4..e497803 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -299,14 +299,14 @@ class TestClient(TestCase): site = self.stdSetup() self.httpShouldReturn(json.dumps({ 'error': { - 'query': 'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.' + 'query': u'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.' } }), method='GET') with pytest.raises(mwclient.errors.APIError) as excinfo: list(site.ask('test')) assert excinfo.value.code is None - assert excinfo.value.info == 'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.' + assert excinfo.value.info == u'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.' assert len(responses.calls) == 1 @responses.activate -- GitLab