Skip to content

Commit

Permalink
Merge pull request #519 from PyGithub/integrations-installation
Browse files Browse the repository at this point in the history
adding support for the integrations installation endpoint
  • Loading branch information
jayfk committed Feb 1, 2017
2 parents 0cf05cb + 33334e4 commit 656e70e
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 8 deletions.
75 changes: 75 additions & 0 deletions github/Installation.py
@@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-

# ########################## Copyrights and license ############################
# #
# Copyright 2017 Jannis Gebauer <ja.geb@me.com> #
# #
# This file is part of PyGithub. #
# http://pygithub.github.io/PyGithub/v1/index.html #
# #
# PyGithub is free software: you can redistribute it and/or modify it under #
# the terms of the GNU Lesser General Public License as published by the Free #
# Software Foundation, either version 3 of the License, or (at your option) #
# any later version. #
# #
# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY #
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more #
# details. #
# #
# You should have received a copy of the GNU Lesser General Public License #
# along with PyGithub. If not, see <http://www.gnu.org/licenses/>. #
# #
# ##############################################################################

import github.GithubObject
import github.PaginatedList

import github.Gist
import github.Repository
import github.NamedUser
import github.Plan
import github.Organization
import github.UserKey
import github.Issue
import github.Event
import github.Authorization
import github.Notification

INTEGRATION_PREVIEW_HEADERS = {"Accept": "application/vnd.github.machine-man-preview+json"}


class Installation(github.GithubObject.NonCompletableGithubObject):
"""
This class represents Installations as in https://developer.github.com/v3/integrations/installations
"""

def __repr__(self):
return self.get__repr__({"id": self._id.value})

@property
def id(self):
return self._id

def get_repos(self):
"""
:calls: `GET /installation/repositories <https://developer.github.com/v3/integrations/installations/#list-repositories>`_
:rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.Repository.Repository`
"""
url_parameters = dict()

return github.PaginatedList.PaginatedList(
contentClass=github.Repository.Repository,
requester=self._requester,
firstUrl="/installation/repositories",
firstParams=url_parameters,
headers=INTEGRATION_PREVIEW_HEADERS,
list_item='repositories'
)

def _initAttributes(self):
self._id = github.GithubObject.NotSet

def _useAttributes(self, attributes):
if "id" in attributes: # pragma no branch
self._id = self._makeIntAttribute(attributes["id"])
19 changes: 16 additions & 3 deletions github/MainClass.py
Expand Up @@ -29,6 +29,7 @@
import urllib
import pickle
import time
import sys
from httplib import HTTPSConnection
from jose import jwt

Expand All @@ -39,6 +40,7 @@
import Gist
import github.PaginatedList
import Repository
import Installation
import Legacy
import github.GithubObject
import HookDescription
Expand All @@ -49,6 +51,7 @@
import InstallationAuthorization
import GithubException

atLeastPython3 = sys.hexversion >= 0x03000000

DEFAULT_BASE_URL = "https://api.github.com"
DEFAULT_TIMEOUT = 10
Expand Down Expand Up @@ -596,6 +599,14 @@ def get_api_status_messages(self):
)
return [StatusMessage.StatusMessage(self.__requester, headers, attributes, completed=True) for attributes in data]

def get_installation(self, id):
"""
:param id:
:return:
"""
return Installation.Installation(self.__requester, headers={}, attributes={"id": id}, completed=True)


class GithubIntegration(object):
"""
Expand Down Expand Up @@ -651,6 +662,10 @@ def get_access_token(self, installation_id, user_id=None):
)
response = conn.getresponse()
response_text = response.read()

if atLeastPython3:
response_text = response_text.decode('utf-8')

conn.close()
if response.status == 201:
data = json.loads(response_text)
Expand All @@ -673,6 +688,4 @@ def get_access_token(self, installation_id, user_id=None):
raise GithubException.GithubException(
status=response.status,
data=response_text
)


)
11 changes: 6 additions & 5 deletions github/PaginatedList.py
Expand Up @@ -107,7 +107,7 @@ class PaginatedList(PaginatedListBase):
some_other_repos = user.get_repos().get_page(3)
"""

def __init__(self, contentClass, requester, firstUrl, firstParams, headers=None):
def __init__(self, contentClass, requester, firstUrl, firstParams, headers=None, list_item="items"):
PaginatedListBase.__init__(self)
self.__requester = requester
self.__contentClass = contentClass
Expand All @@ -116,6 +116,7 @@ def __init__(self, contentClass, requester, firstUrl, firstParams, headers=None)
self.__nextUrl = firstUrl
self.__nextParams = firstParams or {}
self.__headers = headers
self.__list_item = list_item
if self.__requester.per_page != 30:
self.__nextParams["per_page"] = self.__requester.per_page
self._reversed = False
Expand Down Expand Up @@ -173,9 +174,9 @@ def _fetchNextPage(self):
self.__nextUrl = links["next"]
self.__nextParams = None

if 'items' in data:
if self.__list_item in data:
self.__totalCount = data['total_count']
data = data["items"]
data = data[self.__list_item]

content = [
self.__contentClass(self.__requester, headers, element, completed=False)
Expand Down Expand Up @@ -209,9 +210,9 @@ def get_page(self, page):
headers=self.__headers
)

if 'items' in data:
if self.__list_item in data:
self.__totalCount = data['total_count']
data = data["items"]
data = data[self.__list_item]

return [
self.__contentClass(self.__requester, headers, element, completed=False)
Expand Down

0 comments on commit 656e70e

Please sign in to comment.