diff --git a/CodeGenerator/templates/GithubObject.py b/CodeGenerator/templates/GithubObject.py index e9ed55d2..631327bc 100644 --- a/CodeGenerator/templates/GithubObject.py +++ b/CodeGenerator/templates/GithubObject.py @@ -33,6 +33,13 @@ class {{ class.name }}( object ): {% endif %} {% endfor %} +{% if class.identity %} + # @todo Remove '_identity' from the normalized json description + @property + def _identity( self ): + return {% include "GithubObject.Concatenation.py" with concatenation=class.identity only %} +{% endif %} + def __initAttributes( self ): {% for attribute in class.attributes|dictsort:"name" %} self.__{{ attribute.name }} = None diff --git a/IntegrationTest.py b/IntegrationTest.py index 4c442bc2..d1b2ba51 100644 --- a/IntegrationTest.py +++ b/IntegrationTest.py @@ -287,53 +287,53 @@ class IntegrationTest: o.edit( name = originalName ) print o.name - # def testEditOrganizationTeamAndMembers( self ): - # o = self.g.get_organization( self.cobayeOrganization ) - # r = o.get_repo( "TestPyGithub" ) + def testEditOrganizationTeamAndMembers( self ): + o = self.g.get_organization( self.cobayeOrganization ) + r = o.get_repo( "TestPyGithub" ) - # self.printList( "Teams", o.get_teams(), lambda t: t.name ) - # t = o.create_team( "PyGithubTesters" ) - # t.edit( "PyGithubTesters", permission = "push" ) - # self.printList( "Teams", o.get_teams(), lambda t: t.name ) + self.printList( "Teams", o.get_teams(), lambda t: t.name ) + t = o.create_team( "PyGithubTesters" ) + t.edit( "PyGithubTesters", permission = "push" ) + self.printList( "Teams", o.get_teams(), lambda t: t.name ) - # u = self.g.get_user( self.cobayeUser ) + u = self.g.get_user( self.cobayeUser ) - # self.printList( "Team members", t.get_members(), lambda m: m.login ) - # self.printList( "Team repos", t.get_repos(), lambda r: r.name ) - # assert not t.has_in_repos( r ) - # assert not t.has_in_members( u ) - # t.add_to_members( u ) - # t.add_to_repos( r ) - # assert t.has_in_repos( r ) - # assert t.has_in_members( u ) - # self.printList( "Team members", t.get_members(), lambda m: m.login ) - # self.printList( "Team repos", t.get_repos(), lambda r: r.name ) + self.printList( "Team members", t.get_members(), lambda m: m.login ) + self.printList( "Team repos", t.get_repos(), lambda r: r.name ) + assert not t.has_in_repos( r ) + assert not t.has_in_members( u ) + t.add_to_members( u ) + t.add_to_repos( r ) + assert t.has_in_repos( r ) + assert t.has_in_members( u ) + self.printList( "Team members", t.get_members(), lambda m: m.login ) + self.printList( "Team repos", t.get_repos(), lambda r: r.name ) - # self.printList( "Public members", o.get_public_members(), lambda m: m.login ) - # o.add_to_public_members( u ) - # assert o.has_in_public_members( u ) - # self.printList( "Public members", o.get_public_members(), lambda m: m.login ) - # o.remove_from_public_members( u ) - # assert not o.has_in_public_members( u ) - # self.printList( "Public members", o.get_public_members(), lambda m: m.login ) + self.printList( "Public members", o.get_public_members(), lambda m: m.login ) + o.add_to_public_members( u ) + assert o.has_in_public_members( u ) + self.printList( "Public members", o.get_public_members(), lambda m: m.login ) + o.remove_from_public_members( u ) + assert not o.has_in_public_members( u ) + self.printList( "Public members", o.get_public_members(), lambda m: m.login ) - # self.printList( "Members", o.get_members(), lambda m: m.login ) - # assert o.has_in_members( u ) - # o.remove_from_members( u ) - # assert not o.has_in_members( u ) - # self.printList( "Members", o.get_members(), lambda m: m.login ) + self.printList( "Members", o.get_members(), lambda m: m.login ) + assert o.has_in_members( u ) + o.remove_from_members( u ) + assert not o.has_in_members( u ) + self.printList( "Members", o.get_members(), lambda m: m.login ) - # self.printList( "Team members", t.get_members(), lambda m: m.login ) - # self.printList( "Team repos", t.get_repos(), lambda r: r.name ) - # t.remove_from_members( u ) - # t.remove_from_repos( r ) - # assert not t.has_in_repos( r ) - # assert not t.has_in_members( u ) - # self.printList( "Team members", t.get_members(), lambda m: m.login ) - # self.printList( "Team repos", t.get_repos(), lambda r: r.name ) + self.printList( "Team members", t.get_members(), lambda m: m.login ) + self.printList( "Team repos", t.get_repos(), lambda r: r.name ) + t.remove_from_members( u ) + t.remove_from_repos( r ) + assert not t.has_in_repos( r ) + assert not t.has_in_members( u ) + self.printList( "Team members", t.get_members(), lambda m: m.login ) + self.printList( "Team repos", t.get_repos(), lambda r: r.name ) - # t.delete() - # self.printList( "Teams", o.get_teams(), lambda t: t.name ) + t.delete() + self.printList( "Teams", o.get_teams(), lambda t: t.name ) # def testEvents( self ): # self.printList( "User events", self.g.get_user( self.cobayeUser ).get_events(), lambda e: e.type ) diff --git a/JsonDescriptionOfGithubApiV3/description.000.human_readable.json b/JsonDescriptionOfGithubApiV3/description.000.human_readable.json index 8a7d1283..d50db4cc 100644 --- a/JsonDescriptionOfGithubApiV3/description.000.human_readable.json +++ b/JsonDescriptionOfGithubApiV3/description.000.human_readable.json @@ -704,6 +704,7 @@ { "name": "type", "type": "@todo" }, { "name": "url", "type": "@todo" } ], + "identity": [ { "type": "attribute", "value": [ "login" ] } ], "collections": [ { "name": "events", @@ -1027,6 +1028,11 @@ }, { "name": "Repository", + "identity": [ + { "type": "attribute", "value": [ "owner", "login" ] }, + { "type": "constant", "value": "/" }, + { "type": "attribute", "value": [ "name" ] } + ], "edit": { "mandatory_parameters": [ { "name": "name", "type": "@todo" } diff --git a/JsonDescriptionOfGithubApiV3/description.001.normalized.json b/JsonDescriptionOfGithubApiV3/description.001.normalized.json index bf87ad9c..f2bb11a6 100644 --- a/JsonDescriptionOfGithubApiV3/description.001.normalized.json +++ b/JsonDescriptionOfGithubApiV3/description.001.normalized.json @@ -909,7 +909,7 @@ "type": "argument", "value": [ "watched", - "login" + "_identity" ] } ], @@ -988,7 +988,7 @@ "type": "argument", "value": [ "watched", - "login" + "_identity" ] } ], @@ -1036,7 +1036,7 @@ "type": "argument", "value": [ "watched", - "login" + "_identity" ] } ], @@ -1084,7 +1084,7 @@ "type": "argument", "value": [ "following", - "login" + "_identity" ] } ], @@ -1163,7 +1163,7 @@ "type": "argument", "value": [ "following", - "login" + "_identity" ] } ], @@ -1211,7 +1211,7 @@ "type": "argument", "value": [ "following", - "login" + "_identity" ] } ], @@ -3751,7 +3751,7 @@ "type": "argument", "value": [ "label", - "login" + "_identity" ] } ], @@ -4488,6 +4488,14 @@ } ], "name": "NamedUser", + "identity": [ + { + "type": "attribute", + "value": [ + "login" + ] + } + ], "methods": [ { "mandatory_parameters": [], @@ -5242,7 +5250,7 @@ "type": "argument", "value": [ "member", - "login" + "_identity" ] } ], @@ -5290,7 +5298,7 @@ "type": "argument", "value": [ "member", - "login" + "_identity" ] } ], @@ -5338,7 +5346,7 @@ "type": "argument", "value": [ "public_member", - "login" + "_identity" ] } ], @@ -5417,7 +5425,7 @@ "type": "argument", "value": [ "public_member", - "login" + "_identity" ] } ], @@ -5465,7 +5473,7 @@ "type": "argument", "value": [ "public_member", - "login" + "_identity" ] } ], @@ -6739,6 +6747,25 @@ } ], "name": "Repository", + "identity": [ + { + "type": "attribute", + "value": [ + "owner", + "login" + ] + }, + { + "type": "constant", + "value": "/" + }, + { + "type": "attribute", + "value": [ + "name" + ] + } + ], "methods": [ { "mandatory_parameters": [ @@ -6889,7 +6916,7 @@ "type": "argument", "value": [ "collaborator", - "login" + "_identity" ] } ], @@ -6968,7 +6995,7 @@ "type": "argument", "value": [ "collaborator", - "login" + "_identity" ] } ], @@ -7016,7 +7043,7 @@ "type": "argument", "value": [ "collaborator", - "login" + "_identity" ] } ], @@ -9407,7 +9434,7 @@ "type": "argument", "value": [ "member", - "login" + "_identity" ] } ], @@ -9486,7 +9513,7 @@ "type": "argument", "value": [ "member", - "login" + "_identity" ] } ], @@ -9534,7 +9561,7 @@ "type": "argument", "value": [ "member", - "login" + "_identity" ] } ], @@ -9582,7 +9609,7 @@ "type": "argument", "value": [ "repo", - "login" + "_identity" ] } ], @@ -9661,7 +9688,7 @@ "type": "argument", "value": [ "repo", - "login" + "_identity" ] } ], @@ -9709,7 +9736,7 @@ "type": "argument", "value": [ "repo", - "login" + "_identity" ] } ], diff --git a/JsonDescriptionOfGithubApiV3/normalize.py b/JsonDescriptionOfGithubApiV3/normalize.py index 8e01a5b5..6f367560 100644 --- a/JsonDescriptionOfGithubApiV3/normalize.py +++ b/JsonDescriptionOfGithubApiV3/normalize.py @@ -121,7 +121,7 @@ class Collection: "url": [ { "type": "attribute", "value": [ "url" ] }, { "type": "constant", "value": "/" + desc[ "name" ] + "/" }, - { "type": "argument", "value": [ desc[ "singular_name" ], "login" ] }, # @todo 'login' should be 'the attribute identifying the object' + { "type": "argument", "value": [ desc[ "singular_name" ], "_identity" ] }, ], "information": "status", } @@ -202,7 +202,7 @@ class Collection: "url": [ { "type": "attribute", "value": [ "url" ] }, { "type": "constant", "value": "/" + desc[ "name" ] + "/" }, - { "type": "argument", "value": [ desc[ "singular_name" ], "login" ] }, # @todo 'login' should be 'the attribute identifying the object' + { "type": "argument", "value": [ desc[ "singular_name" ], "_identity" ] }, ], "information": "status", } @@ -218,7 +218,7 @@ class Collection: "url": [ { "type": "attribute", "value": [ "url" ] }, { "type": "constant", "value": "/" + desc[ "name" ] + "/" }, - { "type": "argument", "value": [ desc[ "singular_name" ], "login" ] }, # @todo 'login' should be 'the attribute identifying the object' + { "type": "argument", "value": [ desc[ "singular_name" ], "_identity" ] }, ], "information": "status", } @@ -233,7 +233,7 @@ class Collection: class Class: def __init__( self, desc ): - checkKeys( desc, [ "name", "attributes", "collections" ], [ "edit", "delete", "additional_methods" ] ) + checkKeys( desc, [ "name", "attributes", "collections" ], [ "identity", "edit", "delete", "additional_methods" ] ) self.name = desc[ "name" ] self.attributes = sorted( @@ -244,6 +244,10 @@ class Class: key = lambda class_: class_.name ) self.methods = [] + if "identity" in desc: + self.identity = desc[ "identity" ] + else: + self.identity = None if "edit" in desc: self.methods.append( Function( desc[ "edit" ], @@ -274,11 +278,14 @@ class Class: self.methods += [ Function( method ) for method in desc[ "additional_methods" ] ] def ToJson( self ): - return { + d = { "name": self.name, "attributes": self.attributes, "methods": self.methods, } + if self.identity is not None: + d[ "identity" ] = self.identity + return d class Description: def __init__( self, desc ): diff --git a/github/GithubObjects/AuthenticatedUser.py b/github/GithubObjects/AuthenticatedUser.py index 00db7eed..7801b80f 100644 --- a/github/GithubObjects/AuthenticatedUser.py +++ b/github/GithubObjects/AuthenticatedUser.py @@ -155,7 +155,7 @@ class AuthenticatedUser( object ): def add_to_following( self, following ): status, headers, data = self.__requester.request( "PUT", - str( self.url ) + "/following/" + str( following.login ), + str( self.url ) + "/following/" + str( following._identity ), None, None ) @@ -163,7 +163,7 @@ class AuthenticatedUser( object ): def add_to_watched( self, watched ): status, headers, data = self.__requester.request( "PUT", - str( self.url ) + "/watched/" + str( watched.login ), + str( self.url ) + "/watched/" + str( watched._identity ), None, None ) @@ -437,7 +437,7 @@ class AuthenticatedUser( object ): def has_in_following( self, following ): status, headers, data = self.__requester.request( "GET", - str( self.url ) + "/following/" + str( following.login ), + str( self.url ) + "/following/" + str( following._identity ), None, None ) @@ -446,7 +446,7 @@ class AuthenticatedUser( object ): def has_in_watched( self, watched ): status, headers, data = self.__requester.request( "GET", - str( self.url ) + "/watched/" + str( watched.login ), + str( self.url ) + "/watched/" + str( watched._identity ), None, None ) @@ -458,7 +458,7 @@ class AuthenticatedUser( object ): def remove_from_following( self, following ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/following/" + str( following.login ), + str( self.url ) + "/following/" + str( following._identity ), None, None ) @@ -466,7 +466,7 @@ class AuthenticatedUser( object ): def remove_from_watched( self, watched ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/watched/" + str( watched.login ), + str( self.url ) + "/watched/" + str( watched._identity ), None, None ) diff --git a/github/GithubObjects/Issue.py b/github/GithubObjects/Issue.py index c288e1f7..42c217d7 100644 --- a/github/GithubObjects/Issue.py +++ b/github/GithubObjects/Issue.py @@ -195,7 +195,7 @@ class Issue( object ): def remove_from_labels( self, label ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/labels/" + str( label.login ), + str( self.url ) + "/labels/" + str( label._identity ), None, None ) diff --git a/github/GithubObjects/NamedUser.py b/github/GithubObjects/NamedUser.py index cdf3ecad..15e2b9fe 100644 --- a/github/GithubObjects/NamedUser.py +++ b/github/GithubObjects/NamedUser.py @@ -268,6 +268,11 @@ class NamedUser( object ): for element in data ] + # @todo Remove '_identity' from the normalized json description + @property + def _identity( self ): + return str( self.login ) + def __initAttributes( self ): self.__avatar_url = None self.__bio = None diff --git a/github/GithubObjects/Organization.py b/github/GithubObjects/Organization.py index da3059b8..be146804 100644 --- a/github/GithubObjects/Organization.py +++ b/github/GithubObjects/Organization.py @@ -143,7 +143,7 @@ class Organization( object ): def add_to_public_members( self, public_member ): status, headers, data = self.__requester.request( "PUT", - str( self.url ) + "/public_members/" + str( public_member.login ), + str( self.url ) + "/public_members/" + str( public_member._identity ), None, None ) @@ -294,7 +294,7 @@ class Organization( object ): def has_in_members( self, member ): status, headers, data = self.__requester.request( "GET", - str( self.url ) + "/members/" + str( member.login ), + str( self.url ) + "/members/" + str( member._identity ), None, None ) @@ -303,7 +303,7 @@ class Organization( object ): def has_in_public_members( self, public_member ): status, headers, data = self.__requester.request( "GET", - str( self.url ) + "/public_members/" + str( public_member.login ), + str( self.url ) + "/public_members/" + str( public_member._identity ), None, None ) @@ -312,7 +312,7 @@ class Organization( object ): def remove_from_members( self, member ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/members/" + str( member.login ), + str( self.url ) + "/members/" + str( member._identity ), None, None ) @@ -320,7 +320,7 @@ class Organization( object ): def remove_from_public_members( self, public_member ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/public_members/" + str( public_member.login ), + str( self.url ) + "/public_members/" + str( public_member._identity ), None, None ) diff --git a/github/GithubObjects/Repository.py b/github/GithubObjects/Repository.py index d6a8a345..15bae6b0 100644 --- a/github/GithubObjects/Repository.py +++ b/github/GithubObjects/Repository.py @@ -190,7 +190,7 @@ class Repository( object ): def add_to_collaborators( self, collaborator ): status, headers, data = self.__requester.request( "PUT", - str( self.url ) + "/collaborators/" + str( collaborator.login ), + str( self.url ) + "/collaborators/" + str( collaborator._identity ), None, None ) @@ -767,7 +767,7 @@ class Repository( object ): def has_in_collaborators( self, collaborator ): status, headers, data = self.__requester.request( "GET", - str( self.url ) + "/collaborators/" + str( collaborator.login ), + str( self.url ) + "/collaborators/" + str( collaborator._identity ), None, None ) @@ -776,11 +776,16 @@ class Repository( object ): def remove_from_collaborators( self, collaborator ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/collaborators/" + str( collaborator.login ), + str( self.url ) + "/collaborators/" + str( collaborator._identity ), None, None ) + # @todo Remove '_identity' from the normalized json description + @property + def _identity( self ): + return str( self.owner.login ) + "/" + str( self.name ) + def __initAttributes( self ): self.__clone_url = None self.__created_at = None diff --git a/github/GithubObjects/Team.py b/github/GithubObjects/Team.py index 2953867e..591a28ca 100644 --- a/github/GithubObjects/Team.py +++ b/github/GithubObjects/Team.py @@ -51,7 +51,7 @@ class Team( object ): def add_to_members( self, member ): status, headers, data = self.__requester.request( "PUT", - str( self.url ) + "/members/" + str( member.login ), + str( self.url ) + "/members/" + str( member._identity ), None, None ) @@ -59,7 +59,7 @@ class Team( object ): def add_to_repos( self, repo ): status, headers, data = self.__requester.request( "PUT", - str( self.url ) + "/repos/" + str( repo.login ), + str( self.url ) + "/repos/" + str( repo._identity ), None, None ) @@ -113,7 +113,7 @@ class Team( object ): def has_in_members( self, member ): status, headers, data = self.__requester.request( "GET", - str( self.url ) + "/members/" + str( member.login ), + str( self.url ) + "/members/" + str( member._identity ), None, None ) @@ -122,7 +122,7 @@ class Team( object ): def has_in_repos( self, repo ): status, headers, data = self.__requester.request( "GET", - str( self.url ) + "/repos/" + str( repo.login ), + str( self.url ) + "/repos/" + str( repo._identity ), None, None ) @@ -131,7 +131,7 @@ class Team( object ): def remove_from_members( self, member ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/members/" + str( member.login ), + str( self.url ) + "/members/" + str( member._identity ), None, None ) @@ -139,7 +139,7 @@ class Team( object ): def remove_from_repos( self, repo ): status, headers, data = self.__requester.request( "DELETE", - str( self.url ) + "/repos/" + str( repo.login ), + str( self.url ) + "/repos/" + str( repo._identity ), None, None )