diff --git a/github/GithubObject.UnitTest.py b/github/GithubObject.UnitTest.py index d33ed079..37bb88d9 100644 --- a/github/GithubObject.UnitTest.py +++ b/github/GithubObject.UnitTest.py @@ -286,6 +286,24 @@ class GithubObjectWithModifiableListOfObjects( TestCaseWithGithubTestObject ): self.expectDataPost( "/test/a3s", { "name": "nameCreate" } ).andReturn( { "id": "idCreate" } ) self.assertEqual( self.o.create_a3s( name = "nameCreate" ).id, "idCreate" ) +class GithubObjectWithObjectGetter( TestCaseWithGithubTestObject ): + ContainedObject = GithubObject( + "ContainedObject", + BaseUrl( lambda obj: "/test/a3s/" + obj.id ), + BasicAttributes( "id", "name" ) + ) + + GithubTestObject = GithubObject( + "GithubTestObject", + BaseUrl( lambda obj: "/test" ), + BasicAttributes( "a1", "a2" ), + ObjectGetter( "a3", ContainedObject, lambda id : { "id": id } ) + ) + + def testGetList( self ): + self.expectDataGet( "/test/a3s/idGet" ).andReturn( { "id": "idGet" } ) + self.assertEqual( self.o.get_a3( "idGet" ).id, "idGet" ) + def myCallable( obj, mock, arg ): return mock.call( arg ) diff --git a/github/GithubObject.py b/github/GithubObject.py index 1c5505a7..df43e943 100644 --- a/github/GithubObject.py +++ b/github/GithubObject.py @@ -185,6 +185,15 @@ class Deletable( MethodFromCallable ): def __execute( self, obj, *args, **kwds ): obj._github._statusRequest( "DELETE", obj._baseUrl, None, None ) +class ObjectGetter( MethodFromCallable ): + def __init__( self, singularName, type, attributes ): + MethodFromCallable.__init__( self, "get_" + singularName, self.__execute ) + self.__attributes = attributes + self.__type = type + + def __execute( self, obj, *args, **kwds ): + return self.__type( obj._github, self.__attributes( *args, **kwds ), lazy = False ) + def GithubObject( className, *attributePolicies ): class GithubObject: __attributeDefinitions = dict()