Skip to content

Commit fda81ff

Browse files
committed
Move list extraction for object response into iter
1 parent d5c7f5b commit fda81ff

File tree

4 files changed

+49
-13
lines changed

4 files changed

+49
-13
lines changed

src/github3/checks.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ class CheckSuite(models.GitHubCore):
193193
"""
194194

195195
class_name = "CheckSuite"
196-
list_response_dict_key = "check_suites"
197196
CUSTOM_HEADERS = {"Accept": "application/vnd.github.antiope-preview+json"}
198197

199198
def _update_attributes(self, suite):
@@ -240,7 +239,11 @@ def check_runs(self):
240239
"""
241240
url = self._build_url("check-runs", base_url=self._api)
242241
return self._iter(
243-
-1, url, CheckRun, headers=CheckSuite.CUSTOM_HEADERS
242+
-1,
243+
url,
244+
CheckRun,
245+
headers=CheckRun.CUSTOM_HEADERS,
246+
list_key="check_runs",
244247
)
245248

246249

@@ -438,7 +441,6 @@ class CheckRun(models.GitHubCore):
438441
"""
439442

440443
class_name = "CheckRun"
441-
list_response_dict_key = "check_runs"
442444
CUSTOM_HEADERS = {"Accept": "application/vnd.github.antiope-preview+json"}
443445

444446
def _update_attributes(self, run):

src/github3/models.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,16 @@ def _api(self, uri):
245245
self._uri = self._uri_parse(uri)
246246
self.url = uri
247247

248-
def _iter(self, count, url, cls, params=None, etag=None, headers=None):
248+
def _iter(
249+
self,
250+
count,
251+
url,
252+
cls,
253+
params=None,
254+
etag=None,
255+
headers=None,
256+
list_key=None,
257+
):
249258
"""Generic iterator for this project.
250259
251260
:param int count: How many items to return.
@@ -254,12 +263,16 @@ def _iter(self, count, url, cls, params=None, etag=None, headers=None):
254263
:param params dict: (optional) Parameters for the request
255264
:param str etag: (optional), ETag from the last call
256265
:param dict headers: (optional) HTTP Headers for the request
266+
:param str list_key: (optional) Key for extracting the list of items
267+
from a dict response
257268
:returns: A lazy iterator over the pagianted resource
258269
:rtype: :class:`GitHubIterator <github3.structs.GitHubIterator>`
259270
"""
260271
from .structs import GitHubIterator
261272

262-
return GitHubIterator(count, url, cls, self, params, etag, headers)
273+
return GitHubIterator(
274+
count, url, cls, self, params, etag, headers, list_key
275+
)
263276

264277
@property
265278
def ratelimit_remaining(self):

src/github3/repos/commit.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ def check_runs(self):
4848
"""
4949
url = self._build_url("check-runs", base_url=self._api)
5050
return self._iter(
51-
-1, url, checks.CheckRun, headers=checks.CheckRun.CUSTOM_HEADERS
51+
-1,
52+
url,
53+
checks.CheckRun,
54+
headers=checks.CheckRun.CUSTOM_HEADERS,
55+
list_key="check_runs",
5256
)
5357

5458
def check_suites(self):
@@ -67,6 +71,7 @@ def check_suites(self):
6771
url,
6872
checks.CheckSuite,
6973
headers=checks.CheckSuite.CUSTOM_HEADERS,
74+
list_key="check_suites",
7075
)
7176

7277
def diff(self):

src/github3/structs.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,15 @@ class GitHubIterator(models.GitHubCore, collections.Iterator):
1212
"""The :class:`GitHubIterator` class powers all of the iter_* methods."""
1313

1414
def __init__(
15-
self, count, url, cls, session, params=None, etag=None, headers=None
15+
self,
16+
count,
17+
url,
18+
cls,
19+
session,
20+
params=None,
21+
etag=None,
22+
headers=None,
23+
list_key=None,
1624
):
1725
models.GitHubCore.__init__(self, {}, session)
1826
#: Original number of items requested
@@ -41,6 +49,8 @@ def __init__(
4149
self.last_response = None
4250
#: Last status code received
4351
self.last_status = 0
52+
#: Key to get the list of items in case a dict is returned
53+
self.list_key = list_key
4454

4555
if etag:
4656
self.headers.update({"If-None-Match": etag})
@@ -81,6 +91,17 @@ def __iter__(self):
8191
if json is None:
8292
break
8393

94+
# Some APIs return the list of items inside a dict
95+
if isinstance(json, dict) and self.list_key is not None:
96+
try:
97+
json = json[self.list_key]
98+
except KeyError:
99+
raise exceptions.UnprocessableResponseBody(
100+
"GitHub's API returned a body that could not be"
101+
" handled",
102+
json,
103+
)
104+
84105
# languages returns a single dict. We want the items.
85106
if isinstance(json, dict):
86107
if issubclass(self.cls, models.GitHubCore):
@@ -112,12 +133,7 @@ def __next__(self):
112133
return next(self.__i__)
113134

114135
def _get_json(self, response):
115-
json = self._json(response, 200)
116-
if isinstance(json, dict):
117-
list_key = getattr(self.cls, "list_response_dict_key", None)
118-
if list_key is not None:
119-
return json.get(list_key)
120-
return json
136+
return self._json(response, 200)
121137

122138
def refresh(self, conditional=False):
123139
self.count = self.original

0 commit comments

Comments
 (0)