Skip to content

Commit fdc1720

Browse files
author
Ask Solem
committed
Some refactoring.
1 parent d9e22a0 commit fdc1720

5 files changed

Lines changed: 208 additions & 199 deletions

File tree

github2/client.py

Lines changed: 3 additions & 199 deletions
Original file line numberDiff line numberDiff line change
@@ -1,203 +1,7 @@
11
from github2.request import GithubRequest
2-
3-
4-
class BaseDataType(type):
5-
6-
def __new__(cls, name, bases, attrs):
7-
super_new = super(BaseDataType, cls).__new__
8-
9-
attributes = attrs.pop("attributes", tuple())
10-
attrs.update(dict([(attr_name, None)
11-
for attr_name in attributes]))
12-
13-
def constructor(self, **kwargs):
14-
for attr_name, attr_value in kwargs.items():
15-
if attr_name not in attributes:
16-
raise TypeError("%s.__init__() doesn't support the "
17-
"%s argument." % ( cls_name, attr_name))
18-
setattr(self, attr_name, attr_value)
19-
attrs["__init__"] = constructor
20-
21-
def to_dict(self):
22-
dict_ = {}
23-
for attr_name in self.attributes:
24-
attr_value = getattr(self, attr_name, None)
25-
if attr_value is not None:
26-
dict_[attr_name] = attr_value
27-
return dict_
28-
attrs["to_dict"] = to_dict
29-
30-
return super_new(cls, name, bases, attrs)
31-
32-
33-
class BaseData(object):
34-
__metaclass__ = BaseDataType
35-
36-
37-
class Issue(BaseData):
38-
attributes = ("position", "number", "votes", "body", "title",
39-
"created_at", "updated_at", "user", "state")
40-
41-
42-
class User(BaseData):
43-
attributes = ("id", "login", "name", "company", "location",
44-
"email", "blog", "following_count", "followers_count",
45-
"public_gist_count", "public_repo_count",
46-
"total_private_repo_count", "collaborators",
47-
"disk_usage", "owned_private_repo_count",
48-
"private_gist_count", "plan")
49-
50-
def is_authenticated(self):
51-
return self.plan is not None
52-
53-
54-
class Repository(BaseData):
55-
attributes = ("description", "forks", "name", "watchers", "private",
56-
"url", "fork", "owner", "homepage")
57-
58-
59-
class GithubCommand(object):
60-
61-
def __init__(self, request):
62-
self.request = request
63-
64-
def make_request(self, command, *args, **kwargs):
65-
filter = kwargs.get("filter")
66-
post_data = kwargs.get("post_data")
67-
if post_data:
68-
response = self.request.post(self.domain, command, *args,
69-
**post_data)
70-
else:
71-
response = self.request.get(self.domain, command, *args)
72-
if filter:
73-
return response[filter]
74-
return response
75-
76-
77-
class Users(GithubCommand):
78-
domain = "user"
79-
80-
def search(self, query):
81-
return self.make_request("search", query, filter="users")
82-
83-
def show(self, username):
84-
user_data = self.make_request("show", username, filter="user")
85-
return User(**user_data)
86-
87-
def followers(self, username):
88-
return self.make_request("show", username, "followers", filter="users")
89-
90-
def following(self, username):
91-
return self.make_request("show", username, "following", filter="users")
92-
93-
def follow(self, other_user):
94-
return self.make_request("follow", other_user)
95-
96-
def unfollow(self, other_user):
97-
return self.make_request("unfollow", other_user)
98-
99-
100-
class Issues(GithubCommand):
101-
domain = "issues"
102-
103-
def list(self, project, state="open"):
104-
"""Get all issues for project' with state'.
105-
106-
``project`` is a string with the project owner username and repository
107-
name separated by ``/`` (e.g. ``ask/pygithub2``).
108-
``state`` can be either ``open`` or ``closed``.
109-
"""
110-
return [Issue(**issue)
111-
for issue in self.make_request("list", project, state,
112-
filter="issues")]
113-
114-
def show(self, project, number):
115-
"""Get all the data for issue by issue-number."""
116-
issue_data = self.make_request("show", project, str(number),
117-
filter="issue")
118-
return Issue(**issue_data)
119-
120-
def open(self, project, title, body):
121-
"""Open up a new issue."""
122-
issue_data = {"title": title, "body": body}
123-
r = self.make_request("open", project, post_data=issue_data,
124-
filter="issue")
125-
return Issue(**r)
126-
127-
def close(self, project, number):
128-
issue_data = self.make_request("close", project, str(number),
129-
filter="issue")
130-
return Issue(**issue_data)
131-
132-
def add_label(self, project, number, label):
133-
return self.make_request("label/add", project, label, str(number),
134-
filter="labels")
135-
136-
def remove_label(self, project, number, label):
137-
return self.make_request("label/remove", project, label, str(number),
138-
filter="labels")
139-
140-
class Repositories(GithubCommand):
141-
domain = "repos"
142-
143-
def search(self, query):
144-
return self.make_request("search", query, filter="repositories")
145-
146-
def show(self, project):
147-
repo_data = self.make_request("show", project, filter="repository")
148-
return Repository(**repo_data)
149-
150-
def list(self, for_user=None):
151-
for_user = for_user or self.request.username
152-
return [Repository(**repo_data)
153-
for repo_data in self.make_request("show", for_user,
154-
filter="repositories")]
155-
156-
def watch(self, project):
157-
return self.make_request("watch", project)
158-
159-
def unwatch(self, project):
160-
return self.make_request("unwatch", project)
161-
162-
def fork(self, project):
163-
new_repo_data = self.make_request("fork", project,
164-
filter="repository")
165-
return Repository(**new_repo_data)
166-
167-
def create(self, name, description=None, homepage=None, public=True):
168-
repo_data = {"name": name, "description": description,
169-
"homepage": homepage, "public": str(int(public))}
170-
new_repo_data = self.make_request("create", post_data=repo_data,
171-
filter="repository")
172-
return Repository(**new_repo_data)
173-
174-
def set_private(self, repo_name):
175-
return self.make_request("set/private", repo_name)
176-
177-
def set_public(self, repo_name):
178-
return self.make_request("set/public", repo_name)
179-
180-
def list_collaborators(self, project):
181-
return self.make_request("show", project, "collaborators",
182-
filter="collaborators")
183-
184-
def add_collaborator(self, repo_name, username):
185-
return self.make_request("collaborators", repo_name, "add", username)
186-
187-
def remove_collaborator(self, repo_name, username):
188-
return self.make_request("collaborators", repo_name, "remove",
189-
username)
190-
191-
def network(self, project):
192-
return self.make_request("show", project, "network", filter="network")
193-
194-
def tags(self, project):
195-
return self.make_request("show", project, "tags", filter="tags")
196-
197-
def branches(self, project):
198-
return self.make_request("show", project, "branches",
199-
filter="branches")
200-
2+
from github2.issues import Issues
3+
from github2.repositories import Repositories
4+
from github2.users import Users
2015

2026
class Github(object):
2037

github2/core.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
class GithubCommand(object):
2+
3+
def __init__(self, request):
4+
self.request = request
5+
6+
def make_request(self, command, *args, **kwargs):
7+
filter = kwargs.get("filter")
8+
post_data = kwargs.get("post_data")
9+
if post_data:
10+
response = self.request.post(self.domain, command, *args,
11+
**post_data)
12+
else:
13+
response = self.request.get(self.domain, command, *args)
14+
if filter:
15+
return response[filter]
16+
return response
17+
18+
def get_value(self, *args, **kwargs):
19+
datatype = kwargs.pop("datatype", None)
20+
value = self.make_request(*args, **kwargs)
21+
if datatype:
22+
return datatype(**value)
23+
return value
24+
25+
def get_values(self, *args, **kwargs):
26+
datatype = kwargs.pop("datatype", None)
27+
values = self.make_request(*args, **kwargs)
28+
if datatype:
29+
return [datatype(**value) for value in values]
30+
return values
31+
32+
33+
class BaseDataType(type):
34+
35+
def __new__(cls, name, bases, attrs):
36+
super_new = super(BaseDataType, cls).__new__
37+
38+
attributes = attrs.pop("attributes", tuple())
39+
attrs.update(dict([(attr_name, None)
40+
for attr_name in attributes]))
41+
42+
def constructor(self, **kwargs):
43+
for attr_name, attr_value in kwargs.items():
44+
if attr_name not in attributes:
45+
raise TypeError("%s.__init__() doesn't support the "
46+
"%s argument." % ( cls_name, attr_name))
47+
setattr(self, attr_name, attr_value)
48+
attrs["__init__"] = constructor
49+
50+
def to_dict(self):
51+
dict_ = {}
52+
for attr_name in self.attributes:
53+
attr_value = getattr(self, attr_name, None)
54+
if attr_value is not None:
55+
dict_[attr_name] = attr_value
56+
return dict_
57+
attrs["to_dict"] = to_dict
58+
59+
return super_new(cls, name, bases, attrs)
60+
61+
62+
class BaseData(object):
63+
__metaclass__ = BaseDataType

github2/issues.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from github2.core import GithubCommand, BaseData
2+
3+
class Issue(BaseData):
4+
attributes = ("position", "number", "votes", "body", "title",
5+
"created_at", "updated_at", "user", "state")
6+
7+
8+
class Issues(GithubCommand):
9+
domain = "issues"
10+
11+
def list(self, project, state="open"):
12+
"""Get all issues for project' with state'.
13+
14+
``project`` is a string with the project owner username and repository
15+
name separated by ``/`` (e.g. ``ask/pygithub2``).
16+
``state`` can be either ``open`` or ``closed``.
17+
"""
18+
return self.get_values("list", project, state, filter="issues",
19+
datatype=Issue)
20+
21+
def show(self, project, number):
22+
"""Get all the data for issue by issue-number."""
23+
return self.get_value("show", project, str(number),
24+
filter="issue", datatype=Issue)
25+
26+
def open(self, project, title, body):
27+
"""Open up a new issue."""
28+
issue_data = {"title": title, "body": body}
29+
return self.get_value("open", project, post_data=issue_data,
30+
filter="issue", datatype=Issue)
31+
32+
def close(self, project, number):
33+
return self.get_value("close", project, str(number), filter="issue",
34+
datatype=Issue)
35+
36+
def add_label(self, project, number, label):
37+
return self.make_request("label/add", project, label, str(number),
38+
filter="labels")
39+
40+
def remove_label(self, project, number, label):
41+
return self.make_request("label/remove", project, label, str(number),
42+
filter="labels")

github2/repositories.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from github2.core import BaseData, GithubCommand
2+
3+
4+
class Repository(BaseData):
5+
attributes = ("description", "forks", "name", "watchers", "private",
6+
"url", "fork", "owner", "homepage")
7+
8+
9+
class Repositories(GithubCommand):
10+
domain = "repos"
11+
12+
def search(self, query):
13+
return self.make_request("search", query, filter="repositories")
14+
15+
def show(self, project):
16+
return self.get_value("show", project, filter="repository",
17+
datatype=Repository)
18+
19+
def list(self, for_user=None):
20+
for_user = for_user or self.request.username
21+
return self.get_values("show", for_user, filter="repositories",
22+
datatype=Repository)
23+
24+
def watch(self, project):
25+
return self.make_request("watch", project)
26+
27+
def unwatch(self, project):
28+
return self.make_request("unwatch", project)
29+
30+
def fork(self, project):
31+
return self.get_value("fork", project, filter="repository",
32+
datatype=Repository)
33+
34+
def create(self, name, description=None, homepage=None, public=True):
35+
repo_data = {"name": name, "description": description,
36+
"homepage": homepage, "public": str(int(public))}
37+
return self.get_value("create", post_data=repo_data,
38+
filter="repository", datatype=Repository)
39+
40+
def set_private(self, repo_name):
41+
return self.make_request("set/private", repo_name)
42+
43+
def set_public(self, repo_name):
44+
return self.make_request("set/public", repo_name)
45+
46+
def list_collaborators(self, project):
47+
return self.make_request("show", project, "collaborators",
48+
filter="collaborators")
49+
50+
def add_collaborator(self, repo_name, username):
51+
return self.make_request("collaborators", repo_name, "add", username)
52+
53+
def remove_collaborator(self, repo_name, username):
54+
return self.make_request("collaborators", repo_name, "remove",
55+
username)
56+
57+
def network(self, project):
58+
return self.make_request("show", project, "network", filter="network")
59+
60+
def tags(self, project):
61+
return self.make_request("show", project, "tags", filter="tags")
62+
63+
def branches(self, project):
64+
return self.make_request("show", project, "branches",
65+
filter="branches")

0 commit comments

Comments
 (0)