Skip to content

Commit 1a04634

Browse files
author
Gauvain Pocentek
committed
Revert "make as_list work for all queries"
This reverts commit 8e78761. This change broke the basic generator usage (Fixes python-gitlab#534)
1 parent ba90e30 commit 1a04634

File tree

2 files changed

+20
-67
lines changed

2 files changed

+20
-67
lines changed

gitlab/__init__.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,8 @@ def http_list(self, path, query_data={}, as_list=None, **kwargs):
537537
538538
Returns:
539539
list: A list of the objects returned by the server. If `as_list` is
540-
False then a GitlabList object (generator) is returned
540+
False and no pagination-related arguments (`page`, `per_page`,
541+
`all`) are defined then a GitlabList object (generator) is returned
541542
instead. This object will make API calls when needed to fetch the
542543
next items from the server.
543544
@@ -547,16 +548,21 @@ def http_list(self, path, query_data={}, as_list=None, **kwargs):
547548
"""
548549

549550
# In case we want to change the default behavior at some point
550-
as_list = as_list is None or as_list
551+
as_list = True if as_list is None else as_list
551552

552553
get_all = kwargs.get('all', False)
553554
url = self._build_url(path)
554555

555-
glist = GitlabList(self, url, query_data,
556-
get_next='page' not in kwargs and get_all, **kwargs)
557-
if as_list:
558-
glist = list(glist)
559-
return glist
556+
if get_all is True:
557+
return list(GitlabList(self, url, query_data, **kwargs))
558+
559+
if 'page' in kwargs or as_list is True:
560+
# pagination requested, we return a list
561+
return list(GitlabList(self, url, query_data, get_next=False,
562+
**kwargs))
563+
564+
# No pagination, generator requested
565+
return GitlabList(self, url, query_data, **kwargs)
560566

561567
def http_post(self, path, query_data={}, post_data={}, files=None,
562568
**kwargs):

gitlab/tests/test_gitlab.py

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
from httmock import HTTMock # noqa
2828
from httmock import response # noqa
29-
from httmock import remember_called, urlmatch # noqa
29+
from httmock import urlmatch # noqa
3030
import requests
3131

3232
import gitlab
@@ -57,7 +57,6 @@ def setUp(self):
5757
def test_build_list(self):
5858
@urlmatch(scheme='http', netloc="localhost", path="/api/v4/tests",
5959
method="get")
60-
@remember_called
6160
def resp_1(url, request):
6261
headers = {'content-type': 'application/json',
6362
'X-Page': 1,
@@ -73,7 +72,6 @@ def resp_1(url, request):
7372

7473
@urlmatch(scheme='http', netloc="localhost", path="/api/v4/tests",
7574
method='get', query=r'.*page=2')
76-
@remember_called
7775
def resp_2(url, request):
7876
headers = {'content-type': 'application/json',
7977
'X-Page': 2,
@@ -84,7 +82,7 @@ def resp_2(url, request):
8482
content = '[{"c": "d"}]'
8583
return response(200, content, headers, None, 5, request)
8684

87-
with HTTMock(resp_2, resp_1):
85+
with HTTMock(resp_1):
8886
obj = self.gl.http_list('/tests', as_list=False)
8987
self.assertEqual(len(obj), 2)
9088
self.assertEqual(obj._next_url,
@@ -96,62 +94,11 @@ def resp_2(url, request):
9694
self.assertEqual(obj.total_pages, 2)
9795
self.assertEqual(obj.total, 2)
9896

99-
l = list(obj)
100-
self.assertListEqual(l, [{"a": "b"}])
101-
self.assertEqual(resp_1.call['count'], 1)
102-
self.assertFalse(resp_2.call['called'])
103-
104-
def test_build_list_all(self):
105-
@urlmatch(scheme='http', netloc="localhost", path="/api/v4/tests",
106-
method="get")
107-
@remember_called
108-
def resp_1(url, request):
109-
headers = {'content-type': 'application/json',
110-
'X-Page': 1,
111-
'X-Next-Page': 2,
112-
'X-Per-Page': 1,
113-
'X-Total-Pages': 2,
114-
'X-Total': 2,
115-
'Link': (
116-
'<http://localhost/api/v4/tests?per_page=1&page=2>;'
117-
' rel="next"')}
118-
content = '[{"a": "b"}]'
119-
return response(200, content, headers, None, 5, request)
120-
121-
@urlmatch(scheme='http', netloc="localhost", path="/api/v4/tests",
122-
method='get', query=r'.*page=2')
123-
@remember_called
124-
def resp_2(url, request):
125-
headers = {'content-type': 'application/json',
126-
'X-Page': 2,
127-
'X-Next-Page': 2,
128-
'X-Per-Page': 1,
129-
'X-Total-Pages': 2,
130-
'X-Total': 2}
131-
content = '[{"c": "d"}]'
132-
return response(200, content, headers, None, 5, request)
133-
134-
with HTTMock(resp_2, resp_1):
135-
obj = self.gl.http_list('/tests', as_list=False, all=True)
136-
self.assertEqual(len(obj), 2)
137-
self.assertEqual(obj._next_url,
138-
'http://localhost/api/v4/tests?per_page=1&page=2')
139-
self.assertEqual(obj.current_page, 1)
140-
self.assertEqual(obj.prev_page, None)
141-
self.assertEqual(obj.next_page, 2)
142-
self.assertEqual(obj.per_page, 1)
143-
self.assertEqual(obj.total_pages, 2)
144-
self.assertEqual(obj.total, 2)
145-
self.assertEqual(resp_1.call['count'], 1)
146-
self.assertFalse(resp_2.call['called'])
147-
self.assertDictEqual(next(obj), {"a": "b"})
148-
self.assertEqual(resp_1.call['count'], 1)
149-
self.assertFalse(resp_2.call['called'])
150-
self.assertDictEqual(next(obj), {"c": "d"})
151-
self.assertEqual(resp_1.call['count'], 1)
152-
self.assertEqual(resp_2.call['count'], 1)
153-
with self.assertRaises(StopIteration):
154-
next(obj)
97+
with HTTMock(resp_2):
98+
l = list(obj)
99+
self.assertEqual(len(l), 2)
100+
self.assertEqual(l[0]['a'], 'b')
101+
self.assertEqual(l[1]['c'], 'd')
155102

156103

157104
class TestGitlabHttpMethods(unittest.TestCase):

0 commit comments

Comments
 (0)