From 55d17c672546317c0e95e604e8f8f835eec97b1e Mon Sep 17 00:00:00 2001 From: Kyle Hornberg Date: Mon, 26 Feb 2018 13:14:33 -0600 Subject: [PATCH] Enhancement: method calls return self with response attributes --- src/octokit/__init__.py | 15 +++++++++- tests/test_methods.py | 66 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/octokit/__init__.py b/src/octokit/__init__.py index a1cd237..4329767 100644 --- a/src/octokit/__init__.py +++ b/src/octokit/__init__.py @@ -151,8 +151,21 @@ class Octokit(Base): url, data_kwargs = self._form_url(kwargs, definition['url']) requests_kwargs.update(self._data(data_kwargs, definition.get('params'), method)) requests_kwargs.update(self._auth(requests_kwargs)) - return getattr(requests, method)(url, **requests_kwargs) + _response = getattr(requests, method)(url, **requests_kwargs) + attributes = _response.json() + setattr(self, '_response', _response) + setattr(self, 'json', attributes) + setattr(self, 'response', self._convert_to_object(attributes)) + return self _api_call.__name__ = name _api_call.__doc__ = definition['description'] return _api_call + + def _convert_to_object(self, item): + if isinstance(item, dict): + return type('ResponseData', (object, ), {k: self._convert_to_object(v) for k, v in item.items()}) + if isinstance(item, list): + return list((self._convert_to_object(value) for index, value in enumerate(item))) + else: + return item diff --git a/tests/test_methods.py b/tests/test_methods.py index 64399a1..649f001 100644 --- a/tests/test_methods.py +++ b/tests/test_methods.py @@ -1,4 +1,5 @@ import json +from collections import namedtuple import pytest import requests @@ -82,3 +83,68 @@ class TestClientMethods(object): requests.get.assert_called_once_with( 'https://api.github.com/applications/grants/404', params=params, headers=Octokit().headers ) + + def test_returned_object_is_self(self, mocker): + mocker.patch('requests.patch') + headers = {'accept': 'application/vnd.github.squirrel-girl-preview', 'Content-Type': 'application/json'} + data = {'state': 'open'} + sut = Octokit().issues.edit(owner='testUser', repo='testRepo', number=1) + requests.patch.assert_called_once_with( + 'https://api.github.com/repos/testUser/testRepo/issues/1', data=json.dumps(data), headers=headers + ) + assert sut.__class__.__name__ == 'Octokit' + + def test_returned_object_has_requests_response_object(self, mocker): + patch = mocker.patch('requests.patch') + Response = namedtuple('Response', ['json']) + patch.return_value = Response(json=lambda: {}) + sut = Octokit().issues.edit(owner='testUser', repo='testRepo', number=1) + assert sut._response.__class__.__name__ == 'Response' + + def test_returned_object_has_json_attribute(self, mocker): + patch = mocker.patch('requests.patch') + Request = namedtuple('Request', ['json']) + patch.return_value = Request(json=lambda: data) + data = {'documentation_url': 'https://developer.github.com/v3', 'message': 'Not Found'} + sut = Octokit().issues.edit(owner='testUser', repo='testRepo', number=1) + assert sut.json == data + + def test_returned_object_has_response_attributes(self, mocker): + patch = mocker.patch('requests.patch') + data = { + "id": 1, + "number": 1347, + "state": "open", + "title": "Found a bug", + "user": { + "login": "octocat", + "site_admin": False + }, + "labels": [{ + "id": 208045946, + }, { + "id": 208045947, + }], + } + Request = namedtuple('Request', ['json']) + patch.return_value = Request(json=lambda: data) + sut = Octokit().issues.edit(owner='testUser', repo='testRepo', number=1) + assert sut.response.id == 1 + assert sut.response.number == 1347 + assert sut.response.state == 'open' + assert str(sut.response.user) == '' + assert sut.response.user.login == 'octocat' + assert sut.response.user.site_admin is False + assert sut.response.labels[0].id == 208045946 + + def test_returned_object_is_a_list(self, mocker): + patch = mocker.patch('requests.patch') + data = [{ + "id": 208045946, + }, { + "id": 208045947, + }] + Request = namedtuple('Request', ['json']) + patch.return_value = Request(json=lambda: data) + sut = Octokit().issues.edit(owner='testUser', repo='testRepo', number=1) + assert sut.response[0].id == 208045946