Skip to content

Commit 136bf80

Browse files
committed
Merge branch 'feat/auth_decorators'
* feat/auth_decorators: Added enhanced_by_auth to users.show. Added decorator for calls that change when authenticated. Decorated appropriate API calls with @requires_auth. Added requires_auth decorator for marking API calls. Conflicts: doc/api/core.rst github2/issues.py github2/users.py
2 parents fe0284c + 83f65ec commit 136bf80

5 files changed

Lines changed: 67 additions & 3 deletions

File tree

doc/api/core.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ Core
1818

1919
.. autofunction:: userdate_to_datetime
2020

21+
.. autofunction:: requires_auth
22+
.. autofunction:: enhanced_by_auth
23+
2124
.. autofunction:: doc_generator
2225

2326
.. autofunction:: repr_string

github2/core.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,45 @@ def datetime_to_isodate(datetime_):
9191
return "%sZ" % datetime_.isoformat()
9292

9393

94+
class AuthError(Exception):
95+
"""Requires authentication"""
96+
97+
98+
def requires_auth(f):
99+
"""Decorate to check a function call for authentication
100+
101+
Sets a ``requires_auth`` attribute on functions, for use in introspection.
102+
103+
:param func f: Function to wrap
104+
:raises AuthError: If function called without an authenticated session
105+
"""
106+
# When Python 2.4 support is dropped move straight to functools.wraps, don't
107+
# pass go and don't collect $200.
108+
def wrapper(self, *args, **kwargs):
109+
if not self.request.access_token and not self.request.api_token:
110+
raise AuthError("%r requires an authenticated session"
111+
% f.__name__)
112+
return f(self, *args, **kwargs)
113+
wrapped = wrapper
114+
wrapped.__name__ = f.__name__
115+
wrapped.__doc__ = f.__doc__ + """\n.. warning:: Requires authentication"""
116+
wrapped.requires_auth = True
117+
return wrapped
118+
119+
120+
def enhanced_by_auth(f):
121+
"""Decorator to mark a function as enhanced by authentication
122+
123+
Sets a ``enhanced_by_auth`` attribute on functions, for use in
124+
introspection.
125+
126+
:param func f: Function to wrap
127+
"""
128+
f.enhanced_by_auth = True
129+
f.__doc__ += """\n.. note:: This call is enhanced with authentication"""
130+
return f
131+
132+
94133
class GithubCommand(object):
95134

96135
def __init__(self, request):

github2/issues.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import urllib
22

33
from github2.core import (GithubCommand, BaseData, Attribute, DateAttribute,
4-
repr_string)
4+
repr_string, requires_auth)
55

66

77
class Issue(BaseData):
@@ -89,6 +89,7 @@ def show(self, project, number):
8989
return self.get_value("show", project, str(number),
9090
filter="issue", datatype=Issue)
9191

92+
@requires_auth
9293
def open(self, project, title, body):
9394
"""Open up a new issue.
9495
@@ -100,6 +101,7 @@ def open(self, project, title, body):
100101
return self.get_value("open", project, post_data=issue_data,
101102
filter="issue", datatype=Issue)
102103

104+
@requires_auth
103105
def close(self, project, number):
104106
"""Close an issue
105107
@@ -109,6 +111,7 @@ def close(self, project, number):
109111
return self.get_value("close", project, str(number), filter="issue",
110112
datatype=Issue, method="POST")
111113

114+
@requires_auth
112115
def reopen(self, project, number):
113116
"""Reopen a closed issue
114117
@@ -120,6 +123,7 @@ def reopen(self, project, number):
120123
return self.get_value("reopen", project, str(number), filter="issue",
121124
datatype=Issue, method="POST")
122125

126+
@requires_auth
123127
def edit(self, project, number, title, body):
124128
"""Edit an existing issue
125129
@@ -135,6 +139,7 @@ def edit(self, project, number, title, body):
135139
post_data=issue_data, filter="issue",
136140
datatype=Issue)
137141

142+
@requires_auth
138143
def add_label(self, project, number, label):
139144
"""Add a label to an issue
140145
@@ -145,6 +150,7 @@ def add_label(self, project, number, label):
145150
return self.make_request("label/add", project, label, str(number),
146151
filter="labels", method="POST")
147152

153+
@requires_auth
148154
def remove_label(self, project, number, label):
149155
"""Remove an existing label from an issue
150156
@@ -155,6 +161,7 @@ def remove_label(self, project, number, label):
155161
return self.make_request("label/remove", project, label, str(number),
156162
filter="labels", method="POST")
157163

164+
@requires_auth
158165
def comment(self, project, number, comment):
159166
"""Comment on an issue.
160167

github2/repositories.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from github2.core import BaseData, GithubCommand, Attribute, DateAttribute
1+
from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute,
2+
requires_auth)
23

34
from github2.users import User
45

@@ -50,6 +51,7 @@ def show(self, project):
5051
return self.get_value("show", project, filter="repository",
5152
datatype=Repository)
5253

54+
@requires_auth
5355
def pushable(self):
5456
"""Return a list of repos you can push to that are not your own.
5557
@@ -72,20 +74,23 @@ def list(self, user=None):
7274
return self.get_values("show", user, filter="repositories",
7375
datatype=Repository)
7476

77+
@requires_auth
7578
def watch(self, project):
7679
"""Watch a project
7780
7881
:param str project: GitHub project
7982
"""
8083
return self.make_request("watch", project)
8184

85+
@requires_auth
8286
def unwatch(self, project):
8387
"""Unwatch a project
8488
8589
:param str project: GitHub project
8690
"""
8791
return self.make_request("unwatch", project)
8892

93+
@requires_auth
8994
def fork(self, project):
9095
"""Fork a project
9196
@@ -94,6 +99,7 @@ def fork(self, project):
9499
return self.get_value("fork", project, filter="repository",
95100
datatype=Repository)
96101

102+
@requires_auth
97103
def create(self, project, description=None, homepage=None, public=True):
98104
"""Create a repository
99105
@@ -107,6 +113,7 @@ def create(self, project, description=None, homepage=None, public=True):
107113
return self.get_value("create", post_data=repo_data,
108114
filter="repository", datatype=Repository)
109115

116+
@requires_auth
110117
def delete(self, project):
111118
"""Delete a repository
112119
@@ -117,13 +124,15 @@ def delete(self, project):
117124
result = self.make_request("delete", project, method="POST")
118125
self.make_request("delete", project, post_data=result)
119126

127+
@requires_auth
120128
def set_private(self, project):
121129
"""Mark repository as private
122130
123131
:param str project: project name to set as private
124132
"""
125133
return self.make_request("set/private", project)
126134

135+
@requires_auth
127136
def set_public(self, project):
128137
"""Mark repository as public
129138
@@ -139,6 +148,7 @@ def list_collaborators(self, project):
139148
return self.make_request("show", project, "collaborators",
140149
filter="collaborators")
141150

151+
@requires_auth
142152
def add_collaborator(self, project, username):
143153
"""Adds an add_collaborator to a repo
144154
@@ -147,6 +157,7 @@ def add_collaborator(self, project, username):
147157
"""
148158
return self.make_request("collaborators", project, "add", username)
149159

160+
@requires_auth
150161
def remove_collaborator(self, project, username):
151162
"""Removes an add_collaborator from a repo
152163

github2/users.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from github2.core import BaseData, GithubCommand, DateAttribute, Attribute
1+
from github2.core import (BaseData, GithubCommand, DateAttribute, Attribute,
2+
enhanced_by_auth, requires_auth)
23
import urllib
34

45

@@ -54,6 +55,7 @@ def search_by_email(self, query):
5455
"""
5556
return self.get_value("email", query, filter="user", datatype=User)
5657

58+
@enhanced_by_auth
5759
def show(self, username):
5860
"""Get information on Github user
5961
@@ -78,13 +80,15 @@ def following(self, username):
7880
"""
7981
return self.make_request("show", username, "following", filter="users")
8082

83+
@requires_auth
8184
def follow(self, other_user):
8285
"""Follow a Github user
8386
8487
:param str other_user: Github user name
8588
"""
8689
return self.make_request("follow", other_user)
8790

91+
@requires_auth
8892
def unfollow(self, other_user):
8993
"""Unfollow a Github user
9094

0 commit comments

Comments
 (0)