Implement subscriptions (issue #70)

This commit is contained in:
Vincent Jacques
2012-09-08 01:54:51 +02:00
parent 5d67293676
commit 3be2e82b40
13 changed files with 395 additions and 6 deletions
@@ -153,6 +153,15 @@
"addElement": true,
"removeElement": true
},
{
"name": "subscriptions",
"singularName": "subscription",
"type": "Repository",
"getList": true,
"hasElement": true,
"addElement": true,
"removeElement": true
},
{
"name": "starred",
"singularName": "starred",
@@ -952,6 +961,12 @@
"type": "Repository",
"getList": true
},
{
"name": "subscriptions",
"singularName": "subscription",
"type": "Repository",
"getList": true
},
{
"name": "starred",
"singularName": "starred",
@@ -1768,6 +1783,12 @@
"type": "NamedUser",
"getList": true
},
{
"name": "subscribers",
"singularName": "subscriber",
"type": "NamedUser",
"getList": true
},
{
"name": "stargazers",
"singularName": "stargazer",
@@ -999,6 +999,154 @@
"name": "void"
}
},
{
"group": "subscriptions",
"name": [
"add",
"to",
"subscriptions"
],
"mandatoryParameters": [
{
"type": {
"simple": false,
"cardinality": "scalar",
"name": "Repository"
},
"name": "subscription"
}
],
"request": {
"url": [
{
"type": "constant",
"value": "/user/subscriptions/"
},
{
"type": "identity",
"value": [
"subscription"
]
}
],
"information": "status",
"verb": "PUT"
},
"isMutation": false,
"optionalParameters": [],
"type": {
"simple": true,
"cardinality": "scalar",
"name": "void"
}
},
{
"group": "subscriptions",
"name": [
"get",
"subscriptions"
],
"mandatoryParameters": [],
"request": {
"url": [
{
"type": "constant",
"value": "/user/subscriptions"
}
],
"information": "data",
"verb": "GET"
},
"isMutation": false,
"optionalParameters": [],
"type": {
"simple": false,
"cardinality": "list",
"name": "Repository"
}
},
{
"group": "subscriptions",
"name": [
"has",
"in",
"subscriptions"
],
"mandatoryParameters": [
{
"type": {
"simple": false,
"cardinality": "scalar",
"name": "Repository"
},
"name": "subscription"
}
],
"request": {
"url": [
{
"type": "constant",
"value": "/user/subscriptions/"
},
{
"type": "identity",
"value": [
"subscription"
]
}
],
"information": "status",
"verb": "GET"
},
"isMutation": false,
"optionalParameters": [],
"type": {
"simple": true,
"cardinality": "scalar",
"name": "bool"
}
},
{
"group": "subscriptions",
"name": [
"remove",
"from",
"subscriptions"
],
"mandatoryParameters": [
{
"type": {
"simple": false,
"cardinality": "scalar",
"name": "Repository"
},
"name": "subscription"
}
],
"request": {
"url": [
{
"type": "constant",
"value": "/user/subscriptions/"
},
{
"type": "identity",
"value": [
"subscription"
]
}
],
"information": "status",
"verb": "DELETE"
},
"isMutation": false,
"optionalParameters": [],
"type": {
"simple": true,
"cardinality": "scalar",
"name": "void"
}
},
{
"group": "starred",
"name": [
@@ -5492,6 +5640,37 @@
"name": "Repository"
}
},
{
"group": "subscriptions",
"name": [
"get",
"subscriptions"
],
"mandatoryParameters": [],
"request": {
"url": [
{
"type": "attribute",
"value": [
"url"
]
},
{
"type": "constant",
"value": "/subscriptions"
}
],
"information": "data",
"verb": "GET"
},
"isMutation": false,
"optionalParameters": [],
"type": {
"simple": false,
"cardinality": "list",
"name": "Repository"
}
},
{
"group": "starred",
"name": [
@@ -10378,6 +10557,37 @@
"name": "NamedUser"
}
},
{
"group": "subscribers",
"name": [
"get",
"subscribers"
],
"mandatoryParameters": [],
"request": {
"url": [
{
"type": "attribute",
"value": [
"url"
]
},
{
"type": "constant",
"value": "/subscribers"
}
],
"information": "data",
"verb": "GET"
},
"isMutation": false,
"optionalParameters": [],
"type": {
"simple": false,
"cardinality": "list",
"name": "NamedUser"
}
},
{
"group": "stargazers",
"name": [
+6 -6
View File
@@ -413,7 +413,7 @@ API `/repos/:user/:repo/statuses/:sha`
API `/repos/:user/:repo/subscribers`
====================================
* GET: (TODO)
* GET: `Repository.get_subscribers`
API `/repos/:user/:repo/tags`
=============================
@@ -510,13 +510,13 @@ API `/user/starred/:user/:repo`
API `/user/subscriptions`
=========================
* GET: (TODO)
* GET: `AuthenticatedUser.get_subscriptions`
API `/user/subscriptions/:user/:repo`
=====================================
* GET: (TODO)
* PUT: (TODO)
* DELETE: (TODO)
* GET: `AuthenticatedUser.has_in_subscriptions`
* PUT: `AuthenticatedUser.add_to_subscriptions`
* DELETE: `AuthenticatedUser.remove_from_subscriptions`
API `/user/watched`
===================
@@ -579,7 +579,7 @@ API `/users/:user/starred`
API `/users/:user/subscriptions`
================================
* GET: (TODO)
* GET: `NamedUser.get_subscriptions`
API `/users/:user/watched`
==========================
+18
View File
@@ -190,6 +190,16 @@ Starred
* `remove_from_starred( starred )`
* `starred`: `Repository`
Subscriptions
-------------
* `add_to_subscriptions( subscription )`
* `subscription`: `Repository`
* `get_subscriptions()`: iterator of `Repository`
* `has_in_subscriptions( subscription )`: bool
* `subscription`: `Repository`
* `remove_from_subscriptions( subscription )`
* `subscription`: `Repository`
Watched
-------
* `add_to_watched( watched )`
@@ -829,6 +839,10 @@ Starred
-------
* `get_starred()`: iterator of `Repository`
Subscriptions
-------------
* `get_subscriptions()`: iterator of `Repository`
Watched
-------
* `get_watched()`: iterator of `Repository`
@@ -1311,6 +1325,10 @@ Stargazers
----------
* `get_stargazers()`: iterator of `NamedUser`
Subscribers
-----------
* `get_subscribers()`: iterator of `NamedUser`
Tags
----
* `get_tags()`: iterator of `Tag`
+42
View File
@@ -182,6 +182,15 @@ class AuthenticatedUser( GithubObject.GithubObject ):
None
)
def add_to_subscriptions( self, subscription ):
assert isinstance( subscription, Repository.Repository ), subscription
headers, data = self._requester.requestAndCheck(
"PUT",
"/user/subscriptions/" + subscription._identity,
None,
None
)
def add_to_watched( self, watched ):
assert isinstance( watched, Repository.Repository ), watched
headers, data = self._requester.requestAndCheck(
@@ -533,6 +542,20 @@ class AuthenticatedUser( GithubObject.GithubObject ):
data
)
def get_subscriptions( self ):
headers, data = self._requester.requestAndCheck(
"GET",
"/user/subscriptions",
None,
None
)
return PaginatedList.PaginatedList(
Repository.Repository,
self._requester,
headers,
data
)
def get_watched( self ):
headers, data = self._requester.requestAndCheck(
"GET",
@@ -567,6 +590,16 @@ class AuthenticatedUser( GithubObject.GithubObject ):
)
return status == 204
def has_in_subscriptions( self, subscription ):
assert isinstance( subscription, Repository.Repository ), subscription
status, headers, data = self._requester.requestRaw(
"GET",
"/user/subscriptions/" + subscription._identity,
None,
None
)
return status == 204
def has_in_watched( self, watched ):
assert isinstance( watched, Repository.Repository ), watched
status, headers, data = self._requester.requestRaw(
@@ -605,6 +638,15 @@ class AuthenticatedUser( GithubObject.GithubObject ):
None
)
def remove_from_subscriptions( self, subscription ):
assert isinstance( subscription, Repository.Repository ), subscription
headers, data = self._requester.requestAndCheck(
"DELETE",
"/user/subscriptions/" + subscription._identity,
None,
None
)
def remove_from_watched( self, watched ):
assert isinstance( watched, Repository.Repository ), watched
headers, data = self._requester.requestAndCheck(
+14
View File
@@ -328,6 +328,20 @@ class NamedUser( GithubObject.GithubObject ):
data
)
def get_subscriptions( self ):
headers, data = self._requester.requestAndCheck(
"GET",
self.url + "/subscriptions",
None,
None
)
return PaginatedList.PaginatedList(
Repository.Repository,
self._requester,
headers,
data
)
def get_watched( self ):
headers, data = self._requester.requestAndCheck(
"GET",
+14
View File
@@ -978,6 +978,20 @@ class Repository( GithubObject.GithubObject ):
data
)
def get_subscribers( self ):
headers, data = self._requester.requestAndCheck(
"GET",
self.url + "/subscribers",
None,
None
)
return PaginatedList.PaginatedList(
NamedUser.NamedUser,
self._requester,
headers,
data
)
def get_tags( self ):
headers, data = self._requester.requestAndCheck(
"GET",
+9
View File
@@ -99,6 +99,15 @@ class AuthenticatedUser( Framework.TestCase ):
self.user.add_to_starred( gitflow )
self.assertEqual( self.user.has_in_starred( gitflow ), True )
def testSubscriptions( self ):
gitflow = self.g.get_user( "nvie" ).get_repo( "gitflow" )
self.assertListKeyEqual( self.user.get_subscriptions(), lambda r: r.name, [ "gitflow", "ViDE", "Boost.HierarchicalEnum", "QuadProgMm", "DrawSyntax", "DrawTurksHead", "PrivateStuff", "vincent-jacques.net", "Hacking", "C4Planner", "developer.github.com", "PyGithub", "PyGithub", "django", "CinePlanning", "PyGithub", "PyGithub", "PyGithub", "IpMap", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub" ] )
self.assertEqual( self.user.has_in_subscriptions( gitflow ), True )
self.user.remove_from_subscriptions( gitflow )
self.assertEqual( self.user.has_in_subscriptions( gitflow ), False )
self.user.add_to_subscriptions( gitflow )
self.assertEqual( self.user.has_in_subscriptions( gitflow ), True )
def testGetAuthorizations( self ):
self.assertListKeyEqual( self.user.get_authorizations(), lambda a: a.id, [ 372294 ] )
+3
View File
@@ -114,6 +114,9 @@ class NamedUser( Framework.TestCase ):
def testGetStarred( self ):
self.assertListKeyEqual( self.user.get_starred(), lambda r: r.name, [ "git", "boost.php", "capistrano", "boost.perl", "git-subtree", "git-hg", "homebrew", "celtic_knot", "twisted-intro", "markup", "hub", "gitflow", "murder", "boto", "agit", "d3", "pygit2", "git-pulls", "django_mathlatex", "scrumblr", "developer.github.com", "python-github3", "PlantUML", "bootstrap", "drawnby", "django-socketio", "django-realtime", "playground", "BozoCrack", "FatherBeaver", "amaunet", "django", "django", "moviePlanning", "folly" ] )
def testGetSubscriptions( self ):
self.assertListKeyEqual( self.user.get_subscriptions(), lambda r: r.name, [ "ViDE", "Boost.HierarchicalEnum", "QuadProgMm", "DrawSyntax", "DrawTurksHead", "PrivateStuff", "vincent-jacques.net", "Hacking", "C4Planner", "developer.github.com", "PyGithub", "PyGithub", "django", "CinePlanning", "PyGithub", "PyGithub", "PyGithub", "IpMap", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub", "PyGithub" ] )
def testGetEvents( self ):
self.assertListKeyBegin( self.user.get_events(), lambda e: e.type, [ "GistEvent", "IssueCommentEvent", "PushEvent", "IssuesEvent" ] )
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
https GET api.github.com None /repos/jacquev6/PyGithub/subscribers {'Authorization': 'Basic login_and_password_removed'} null
200
[('status', '200 OK'), ('content-length', '3327'), ('x-github-media-type', 'github.beta; format=json'), ('x-content-type-options', 'nosniff'), ('vary', 'Accept, Authorization, Cookie'), ('x-ratelimit-remaining', '4956'), ('server', 'nginx/1.0.13'), ('last-modified', 'Fri, 07 Sep 2012 12:01:21 GMT'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"ab16ed4c5e852882d2d1a3887c3cb606"'), ('cache-control', 'private, s-maxage=60, max-age=60'), ('date', 'Fri, 07 Sep 2012 23:46:43 GMT'), ('content-type', 'application/json; charset=utf-8')]
[{"gravatar_id":"b68de5ae38616c296fa345d2b9df2225","avatar_url":"https://secure.gravatar.com/avatar/b68de5ae38616c296fa345d2b9df2225?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"jacquev6","url":"https://api.github.com/users/jacquev6","id":327146},{"gravatar_id":"e8f8081fe45c1b793c288ecd1c1e932e","avatar_url":"https://secure.gravatar.com/avatar/e8f8081fe45c1b793c288ecd1c1e932e?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"equus12","url":"https://api.github.com/users/equus12","id":1647505},{"gravatar_id":"2aed663a62fa8bf9f7aebe603d3998bb","avatar_url":"https://secure.gravatar.com/avatar/2aed663a62fa8bf9f7aebe603d3998bb?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"bilderbuchi","url":"https://api.github.com/users/bilderbuchi","id":327442},{"gravatar_id":"4a70a247b4f222894f6b9861e40f733d","avatar_url":"https://secure.gravatar.com/avatar/4a70a247b4f222894f6b9861e40f733d?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"hcilab","url":"https://api.github.com/users/hcilab","id":1610572},{"gravatar_id":"abd8a1f2aa5d4899129458889b6f315b","avatar_url":"https://secure.gravatar.com/avatar/abd8a1f2aa5d4899129458889b6f315b?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"hattya","url":"https://api.github.com/users/hattya","id":839237},{"gravatar_id":"0e5246dc215484496d9ba125c1142716","avatar_url":"https://secure.gravatar.com/avatar/0e5246dc215484496d9ba125c1142716?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"firstthumb","url":"https://api.github.com/users/firstthumb","id":66023},{"gravatar_id":"8707d63a44f6cc04e58a655f3df3105c","avatar_url":"https://secure.gravatar.com/avatar/8707d63a44f6cc04e58a655f3df3105c?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"gregwjacobs","url":"https://api.github.com/users/gregwjacobs","id":1749292},{"gravatar_id":"bb0e7d8e63591b6b908a5a21b3e75878","avatar_url":"https://secure.gravatar.com/avatar/bb0e7d8e63591b6b908a5a21b3e75878?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"sagarsane","url":"https://api.github.com/users/sagarsane","id":667114},{"gravatar_id":"bf75ed46f2034fe6cc1075ce888084d8","avatar_url":"https://secure.gravatar.com/avatar/bf75ed46f2034fe6cc1075ce888084d8?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"liang456","url":"https://api.github.com/users/liang456","id":1673318},{"gravatar_id":"3a90a2072fa32035016c5cc3c8584367","avatar_url":"https://secure.gravatar.com/avatar/3a90a2072fa32035016c5cc3c8584367?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"berndca","url":"https://api.github.com/users/berndca","id":466654},{"gravatar_id":"1517ed584458ccf83e03f5d77d9699d7","avatar_url":"https://secure.gravatar.com/avatar/1517ed584458ccf83e03f5d77d9699d7?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","login":"Lyloa","url":"https://api.github.com/users/Lyloa","id":1131432}]
+3
View File
@@ -325,6 +325,9 @@ class Repository( Framework.TestCase ):
def testGetStargazers( self ):
self.assertListKeyEqual( self.repo.get_stargazers(), lambda u: u.login, [ "Stals", "att14", "jardon-u", "huxley", "mikofski", "L42y", "fanzeyi", "abersager", "waylan", "adericbourg", "tallforasmurf", "pvicente", "roskakori", "michaelpedersen", "stefanfoulis", "equus12", "JuRogn", "joshmoore", "jsilter", "dasapich", "ritratt", "hcilab", "vxnick", "pmuilu", "herlo", "malexw", "ahmetvurgun", "PengGu", "cosmin", "Swop", "kennethreitz", "bryandyck", "jason2506", "zsiciarz", "waawal", "gregorynicholas", "sente", "richmiller55", "thouis", "mazubieta", "michaelhood", "engie", "jtriley", "oangeor", "coryking", "noddi", "alejo8591", "omab", "Carreau", "bilderbuchi", "schwa", "rlerallut", "PengHub", "zoek1", "xobb1t", "notgary", "hattya", "ZebtinRis", "aaronhall", "youngsterxyf", "ailling", "gregwjacobs", "n0rmrx", "awylie", "firstthumb", "joshbrand", "berndca" ] )
def testGetSubscribers( self ):
self.assertListKeyEqual( self.repo.get_subscribers(), lambda u: u.login, [ "jacquev6", "equus12", "bilderbuchi", "hcilab", "hattya", "firstthumb", "gregwjacobs", "sagarsane", "liang456", "berndca", "Lyloa" ] )
def testCreatePull( self ):
pull = self.repo.create_pull( "Pull request created by PyGithub", "Body of the pull request", "topic/RewriteWithGeneratedCode", "BeaverSoftware:master" )
self.assertEqual( pull.id, 1436215 )