diff --git a/github/Github.py b/github/Github.py index 012912e2..9446f6ba 100644 --- a/github/Github.py +++ b/github/Github.py @@ -1,51 +1,15 @@ -import httplib -import json -import base64 - +from Requester import Requester from GithubObjects import * -class UnknownGithubObject( Exception ): - pass - class Github: def __init__( self, login, password ): - self.__login = login - self.__password = password + self.__requester = Requester( login, password ) def _dataRequest( self, verb, url, parameters, data ): - status, headers, data = self.__rawRequest( verb, url, parameters, data ) - if 200 <= status < 300: - return data - else: - raise UnknownGithubObject() + return self.__requester.dataRequest( verb, url, parameters, data ) def _statusRequest( self, verb, url, parameters, data ): - status, headers, data = self.__rawRequest( verb, url, parameters, data ) - return status - - def __rawRequest( self, verb, url, parameters, input ): - assert verb in [ "HEAD", "GET", "POST", "PATCH", "PUT", "DELETE" ] - - b64_userpass = base64.b64encode( '%s:%s' % ( self.__login, self.__password ) ) - b64_userpass = b64_userpass.replace( '\n', '' ) - - input = json.dumps( input ) - - cnx = httplib.HTTPSConnection( "api.github.com", strict = True ) - cnx.request( verb, url, input, { "Authorization" : "Basic " + b64_userpass } ) - response = cnx.getresponse() - - status = response.status - headers = dict( response.getheaders() ) - output = response.read() - if len( output ) == 0: - output = None - else: - output = json.loads( output ) - cnx.close() - - # print verb, url, input, "==>", status, str( headers )[ :30 ], str( output )[ :30 ] - return status, headers, output + return self.__requester.statusRequest( verb, url, parameters, data ) def get_user( self, login = None ): if login is None: diff --git a/github/Github.UnitTest.py b/github/Requester.UnitTest.py similarity index 85% rename from github/Github.UnitTest.py rename to github/Requester.UnitTest.py index 5af5960f..57e66230 100644 --- a/github/Github.UnitTest.py +++ b/github/Requester.UnitTest.py @@ -3,13 +3,13 @@ import MockMockMock import httplib import base64 -from Github import Github, UnknownGithubObject +from Requester import Requester, UnknownGithubObject class TestCase( unittest.TestCase ): def setUp( self ): unittest.TestCase.setUp( self ) - self.g = Github( "login", "password" ) + self.r = Requester( "login", "password" ) self.b64_userpass = base64.b64encode( "login:password" ) self.b64_userpass = self.b64_userpass.replace( '\n', '' ) @@ -34,15 +34,15 @@ class TestCase( unittest.TestCase ): def testSimpleStatus( self ): self.expect( "GET", "/test", "null", 200, [], "" ) - self.assertEqual( self.g._statusRequest( "GET", "/test", None, None ), 200 ) + self.assertEqual( self.r._statusRequest( "GET", "/test", None, None ), 200 ) def testSimpleData( self ): self.expect( "GET", "/test", "null", 200, [], '{ "foo": "bar" }' ) - self.assertEqual( self.g._dataRequest( "GET", "/test", None, None ), { "foo" : "bar" } ) + self.assertEqual( self.r._dataRequest( "GET", "/test", None, None ), { "foo" : "bar" } ) def testDataOnBadStatus( self ): self.expect( "GET", "/test", "null", 404, [], '{ "foo": "bar" }' ) with self.assertRaises( UnknownGithubObject ): - self.g._dataRequest( "GET", "/test", None, None ) + self.r._dataRequest( "GET", "/test", None, None ) unittest.main() diff --git a/github/Requester.py b/github/Requester.py new file mode 100644 index 00000000..fecbfc88 --- /dev/null +++ b/github/Requester.py @@ -0,0 +1,46 @@ +import httplib +import json +import base64 + +class UnknownGithubObject( Exception ): + pass + +class Requester: + def __init__( self, login, password ): + self.__login = login + self.__password = password + + def _dataRequest( self, verb, url, parameters, data ): + status, headers, data = self.__rawRequest( verb, url, parameters, data ) + if 200 <= status < 300: + return data + else: + raise UnknownGithubObject() + + def _statusRequest( self, verb, url, parameters, data ): + status, headers, data = self.__rawRequest( verb, url, parameters, data ) + return status + + def __rawRequest( self, verb, url, parameters, input ): + assert verb in [ "HEAD", "GET", "POST", "PATCH", "PUT", "DELETE" ] + + b64_userpass = base64.b64encode( '%s:%s' % ( self.__login, self.__password ) ) + b64_userpass = b64_userpass.replace( '\n', '' ) + + input = json.dumps( input ) + + cnx = httplib.HTTPSConnection( "api.github.com", strict = True ) + cnx.request( verb, url, input, { "Authorization" : "Basic " + b64_userpass } ) + response = cnx.getresponse() + + status = response.status + headers = dict( response.getheaders() ) + output = response.read() + if len( output ) == 0: + output = None + else: + output = json.loads( output ) + cnx.close() + + # print verb, url, input, "==>", status, str( headers )[ :30 ], str( output )[ :30 ] + return status, headers, output