10000 Changes for breaking GitHub API changes · danpalmer/github3.py@f44694a · GitHub
[go: up one dir, main page]

Skip to content

Commit f44694a

Browse files
committed
Changes for breaking GitHub API changes
1 parent 7ed3d0c commit f44694a

File tree

4 files changed

+137
-5
lines changed

4 files changed

+137
-5
lines changed

HISTORY.rst

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
History/Changelog
22
-----------------
33

4+
0.9.2: 2014-10-05
5+
~~~~~~~~~~~~~~~~~
6+
7+
- Updates for `new team management`_ API changes
8+
9+
- Add ``Team#invite``, ``Team#membership_for``, and
10+
``Team#revoke_membership``
11+
12+
- Deprecate ``Team#add_member``, ``Team#remove_member``, and
13+
``Organization#add_member``.
14+
15+
- Update payload handler for ``TeamAddEvent``.
16+
17+
.. _new team management:
18+
https://developer.github.com/changes/2014-09-23-one-more-week-before-the-add-team-member-api-breaking-change/
19+
420
0.9.1: 2014-08-10
521
~~~~~~~~~~~~~~~~~
622

github3/events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ def _team(payload):
156156
payload['team'] = Team(payload['team'], None)
157157
if payload.get('repo'):
158158
payload['repo'] = Repository(payload['repo'], None)
159-
if payload.get('user'):
160-
payload['user'] = User(payload['user'], None)
159+
if payload.get('sender'):
160+
payload['sender'] = User(payload['sender'], None)
161161
return payload
162162

163163

github3/github.py

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010

1111
from .auths import Authorization
1212
from .decorators import (requires_auth, requires_basic_auth,
13-
requires_app_credentials)
13+
requires_app_credentials)
1414
from .events import Event
1515
from .gists import Gist
1616
from .issues import Issue, issue_params
1717
from .models import GitHubCore
18-
from .orgs import Organization, Team
18+
from .orgs import Membership, Organization, Team
1919
from .repos import Repository
2020
from .search import (CodeSearchResult, IssueSearchResult,
21-
RepositorySearchResult, UserSearchResult)
21+
RepositorySearchResult, UserSearchResult)
2222
from .structs import SearchIterator
2323
from .users import User, Key
2424
from .notifications import Thread
@@ -931,6 +931,14 @@ def markdown(self, text, mode='', context='', raw=False):
931931
return req.content
932932
return '' # (No coverage)
933933

934+
@requires_auth
935+
def membership_in(self, organization):
936+
"""Retrieve the user's membership in the specified organization."""
937+
url = self._build_url('user', 'memberships', 'orgs',
938+
str(organization))
939+
json = self._json(self._get(url), 200)
940+
return Membership(json, self)
941+
934942
def meta(self):
935943
"""Returns a dictionary with arrays of addresses in CIDR format
936944
specifying theaddresses that the incoming service hooks will originate
@@ -962,6 +970,22 @@ def organization(self, login):
962970
json = self._json(self._get(url), 200)
963971
return Organization(json, self) if json else None
964972

973+
@requires_auth
974+
def organization_memberships(self, state=None, number=-1, etag=None):
975+
"""List organizations of which the user is a current or pending member.
976+
977+
:param str state: (option), state of the membership, i.e., active,
978+
pending
979+
:returns: iterator of :class:`Membership <github3.orgs.Membership>`
980+
"""
981+
params = None
982+
url = self._build_url('user', 'memberships', 'orgs')
983+
if state is not None and state.lower() in ('active', 'pending'):
984+
params = {'state': state.lower()}
985+
return self._iter(int(number), url, Membership,
986+
params=params,
987+
etag=etag)
988+
965989
@requires_auth
966990
def pubsubhubbub(self, mode, topic, callback, secret=''):
967991
"""Create/update a pubsubhubbub hook.

github3/orgs.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"""
99
from __future__ import unicode_literals
1010

11+
import warnings
12+
1113
from json import dumps
1214
from .events import Event
1315
from .models import BaseAccount, GitHubCore
@@ -66,6 +68,11 @@ def add_member(self, login):
6668
6769
:returns: bool
6870
"""
71+
warnings.warn(
72+
'This is no longer supported by the GitHub API, see '
73+
'https://developer.github.com/changes/2014-09-23-one-more-week'
74+
'-before-the-add-team-member-api-breaking-change/',
75+
DeprecationWarning)
6976
url = self._build_url('members', login, base_url=self._api)
7077
return self._boolean(self._put(url), 204, 404)
7178

@@ -112,6 +119,20 @@ def has_repo(self, repo):
112119
url = self._build_url('repos', repo, base_url=self._api)
113120
return self._boolean(self._get(url), 204, 404)
114121

122+
@requires_auth
123+
def invite(self, username):
124+
"""Invite the user to join this team.
125+
126+
This returns a dictionary like so::
127+
128+
{'state': 'pending', 'url': 'https://api.github.com/teams/...'}
129+
130+
:param str username: (required), user to invite to join this team.
131+
:returns: dictionary
132+
"""
133+
url = self._build_url('memberships', username, base_url=self._api)
134+
return self._json(self._put(url), 200)
135+
115136
def is_member(self, login):
116137
"""Check if ``login`` is a member of this team.
117138
@@ -146,16 +167,42 @@ def iter_repos(self, number=-1, etag=None):
146167
url = self._build_url('repos', base_url=self._api)
147168
return self._iter(int(number), url, Repository, etag=etag)
148169

170+
@requires_auth
171+
def membership_for(self, username):
172+
"""Retrieve the membership information for the user.
173+
174+
:param str username: (required), name of the user
175+
:returns: dictionary
176+
"""
177+
url = self._build_url('memberships', username, base_url=self._api)
178+
json = self._json(self._get(url), 200)
179+
return json or {}
180+
149181
@requires_auth
150182
def remove_member(self, login):
151183
"""Remove ``login`` from this team.
152184
153185
:param str login: (required), login of the member to remove
154186
:returns: bool
155187
"""
188+
warnings.warn(
189+
'This is no longer supported by the GitHub API, see '
190+
'https://developer.github.com/changes/2014-09-23-one-more-week'
191+
'-before-the-add-team-member-api-breaking-change/',
192+
DeprecationWarning)
156193
url = self._build_url('members', login, base_url=self._api)
157194
return self._boolean(self._delete(url), 204, 404)
158195

196+
@requires_auth
197+
def revoke_membership(self, username):
198+
"""Revoke this user's team membership.
199+
200+
:param str username: (required), name of the team member
201+
:returns: bool
202+
"""
203+
url = self._build_url('memberships', username, base_url=self._api)
204+
return self._boolean(self._delete(url), 204, 404)
205+
159206
@requires_auth
160207
def remove_repo(self, repo):
161208
"""Remove ``repo`` from this team.
@@ -209,6 +256,11 @@ def __init__(self, org, session=None):
209256
def add_member(self, login, team):
210257
"""Add ``login`` to ``team`` and thereby to this organization.
211258
259+
.. warning::
260+
This method is no longer valid. To add a member to a team, you
261+
must now retrieve the team directly, and use the ``invite``
262+
method.
263+
212264
Any user that is to be added to an organization, must be added
213265
to a team as per the GitHub api.
214266
@@ -223,6 +275,11 @@ def add_member(self, login, team):
223275
:param str team: (required), team name
224276
:returns: bool
225277
"""
278+
warnings.warn(
279+
'This is no longer supported by the GitHub API, see '
280+
'https://developer.github.com/changes/2014-09-23-one-more-week'
281+
'-before-the-add-team-member-api-breaking-change/',
282+
DeprecationWarning)
226283
for t in self.iter_teams():
227284
if team == t.name:
228285
return t.add_member( E377 login)
@@ -484,3 +541,38 @@ def team(self, team_id):
484541
url = self._build_url('teams', str(team_id))
485542
json = self._json(self._get(url), 200)
486543
return Team(json, self._session) if json else None
544+
545+
546+
class Membership(GitHubCore):
547+
548+
"""The wrapper for information about Team and Organization memberships."""
549+
550+
def __init__(self, membership, session=None):
551+
super(Membership, self).__init__(membership, session)
552+
self._update_attributes(membership)
553+
554+
def _repr(self):
555+
return '<Membership [{0}]>'.format(self.organization)
556+
557+
def _update_attributes(self, membership):
558+
self._api = membership.get('url')
559+
self.organization = Organization(membership.get('organization', {}),
560+
self)
561+
self.state = membership.get('state', '')
562+
self.organization_url = membership.get('organization_url')
563+
self.active = self.state.lower() == 'active'
564+
self.pending = self.state.lower() == 'pending'
565+
566+
@requires_auth
567+
def edit(self, state):
568+
"""Edit the user's membership.
569+
570+
:param str state: (required), the state the membership should be in.
571+
Only accepts ``"active"``.
572+
:returns: itself
573+
"""
574+
if state and state.lower() == 'active':
575+
data = dumps({'state': state.lower()})
576+
json = self._json(self._patch(self._api, data=data))
577+
self._update_attributes(json)
578+
return self

0 commit comments

Comments
 (0)
0