diff --git a/github/Requester.UnitTest.py b/github/Requester.UnitTest.py index 594d9bfb..b0eb78c2 100644 --- a/github/Requester.UnitTest.py +++ b/github/Requester.UnitTest.py @@ -49,4 +49,10 @@ class TestCase( unittest.TestCase ): self.expect( "GET", "/test?tata=tutu&toto=titi", '{"xxx": 42}', 200, [], '{ "foo": "bar" }' ) self.assertEqual( self.r.dataRequest( "GET", "/test", { "toto" : "titi", "tata" : "tutu" }, { "xxx" : 42 } ), { "foo" : "bar" } ) + def testPagination( self ): + self.expect( "GET", "/test", 'null', 200, [ ( "link", "xxx; next, xxx; last" ) ], '[ 1, 2 ]' ) + self.expect( "GET", "/test?page=2", 'null', 200, [ ( "link", "xxx; prev, xxx; first, xxx; next, xxx; last" ) ], '[ 3, 4 ]' ) + self.expect( "GET", "/test?page=3", 'null', 200, [ ( "link", "xxx; prev, xxx; first" ) ], '[ 5, 6 ]' ) + self.assertEqual( self.r.dataRequest( "GET", "/test", None, None ), [ 1, 2, 3, 4, 5, 6 ] ) + unittest.main() diff --git a/github/Requester.py b/github/Requester.py index 9ea61203..031c947b 100644 --- a/github/Requester.py +++ b/github/Requester.py @@ -10,15 +10,27 @@ class Requester: self.__login = login self.__password = password - def dataRequest( self, verb, url, parameters, data ): - status, headers, data = self.__rawRequest( verb, url, parameters, data ) + def dataRequest( self, verb, url, parameters, input ): + status, headers, output = self.__rawRequest( verb, url, parameters, input ) if 200 <= status < 300: - return data + page = 2 + while "link" in headers and "next" in headers[ "link" ]: + if parameters is None: + parameters = dict() + parameters[ "page" ] = page + newStatus, newHeaders, newOutput = self.__rawRequest( verb, url, parameters, input ) + if 200 <= newStatus < 300: + headers = newHeaders + page += 1 + output += newOutput + else: + raise UnknownGithubObject() + return output else: raise UnknownGithubObject() - def statusRequest( self, verb, url, parameters, data ): - status, headers, data = self.__rawRequest( verb, url, parameters, data ) + def statusRequest( self, verb, url, parameters, input ): + status, headers, output = self.__rawRequest( verb, url, parameters, input ) return status def __rawRequest( self, verb, url, parameters, input ): @@ -27,8 +39,8 @@ class Requester: b64_userpass = base64.b64encode( '%s:%s' % ( self.__login, self.__password ) ) b64_userpass = b64_userpass.replace( '\n', '' ) - if parameters is not None: - url += "?" + "&".join( key + "=" + value for key, value in parameters.iteritems() ) + if parameters is not None and len( parameters ) != 0: + url += "?" + "&".join( str( key ) + "=" + str( value ) for key, value in parameters.iteritems() ) input = json.dumps( input )