Skip to content

Commit 397238b

Browse files
committed
Restructure modules and packages in a clean way
The docs has increased lines of code, so I split it
1 parent 372e78e commit 397238b

30 files changed

+910
-864
lines changed

docs/github.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ Github
33

44
This is the main entrance of **pygithub3**
55

6-
.. autoclass:: pygithub3.github.Github
6+
.. autoclass:: pygithub3.Github
77
:members:

docs/repos.rst

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ You can see it better with an example: ::
4949
Repo
5050
-------
5151

52-
.. autoclass:: pygithub3.services.repos.Repo
52+
.. autoclass:: pygithub3.services.repos.Repos
5353
:members:
5454

5555
.. attribute:: collaborators
@@ -81,33 +81,44 @@ Repo
8181
Collaborators
8282
--------------
8383

84+
.. autoclass:: pygithub3.services.repos.Collaborators
8485

8586
.. _Commits service:
8687

8788
Commits
8889
----------
8990

91+
.. autoclass:: pygithub3.services.repos.Commits
92+
9093
.. _Downloads service:
9194

9295
Downloads
9396
------------
9497

98+
.. autoclass:: pygithub3.services.repos.Downloads
99+
95100

96101
.. _Forks service:
97102

98103
Forks
99104
---------
100105

106+
.. autoclass:: pygithub3.services.repos.Forks
107+
101108

102109
.. _RepoKeys service:
103110

104111
Keys
105112
----------
106113

114+
.. autoclass:: pygithub3.services.repos.Keys
115+
107116

108117
.. _Watchers service:
109118

110119
Watchers
111120
---------
112121

122+
.. autoclass:: pygithub3.services.repos.Watchers
123+
113124
.. _github repo doc: http://developer.github.com/v3/repos

docs/resources.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Resources
2+
==========

pygithub3/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@
77
__email__ = '[email protected]'
88
__license__ = 'ISC'
99
__copyright__ = 'Copyright 2012 David Medina'
10+
11+
from github import Github

pygithub3/github.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- encoding: utf-8 -*-
33

44
from pygithub3.services.users import User
5-
from pygithub3.services.repos import Repo
5+
from pygithub3.services.repos import Repos
66

77

88
class Github(object):
@@ -17,7 +17,7 @@ class Github(object):
1717

1818
def __init__(self, **config):
1919
self._users = User(**config)
20-
self._repos = Repo(**config)
20+
self._repos = Repos(**config)
2121

2222
@property
2323
def users(self):

pygithub3/requests/__init__.py

Lines changed: 0 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1,137 +1 @@
1-
#!/usr/bin/env python
21
# -*- encoding: utf-8 -*-
3-
4-
import re
5-
from importlib import import_module
6-
try:
7-
import simplejson as json
8-
except ImportError:
9-
import json
10-
11-
from pygithub3.exceptions import (DoesNotExists, UriInvalid, ValidationError,
12-
InvalidBodySchema)
13-
from pygithub3.resources.base import Raw
14-
15-
ABS_IMPORT_PREFIX = 'pygithub3.requests'
16-
17-
18-
class Body(object):
19-
20-
def __init__(self, content, schema, required):
21-
self.content = content
22-
self.schema = schema
23-
self.required = required
24-
25-
def dumps(self):
26-
if not self.schema:
27-
return self.content or None
28-
return json.dumps(self.parse())
29-
30-
def parse(self):
31-
if not hasattr(self.content, 'items'):
32-
raise ValidationError("'%s' needs a content dictionary"
33-
% self.__class__.__name__)
34-
parsed = {key: self.content[key] for key in self.schema
35-
if key in self.content}
36-
for attr_required in self.required:
37-
if attr_required not in parsed:
38-
raise ValidationError("'%s' attribute is required" %
39-
attr_required)
40-
if not parsed[attr_required]:
41-
raise ValidationError("'%s' attribute can't be empty" %
42-
attr_required)
43-
return parsed
44-
45-
46-
class Request(object):
47-
""" """
48-
49-
uri = ''
50-
resource = Raw
51-
body_schema = {}
52-
53-
def __init__(self, **kwargs):
54-
""" """
55-
self.body = kwargs.pop('body', None)
56-
self.args = kwargs
57-
self.clean()
58-
59-
def clean(self):
60-
self.uri = self.clean_uri() or self.uri
61-
self.body = Body(self.clean_body(), **self.clean_valid_body())
62-
63-
def clean_body(self):
64-
return self.body
65-
66-
def clean_uri(self):
67-
return None
68-
69-
def clean_valid_body(self):
70-
schema = set(self.body_schema.get('schema', ()))
71-
required = set(self.body_schema.get('required', ()))
72-
if not required.issubset(schema):
73-
raise InvalidBodySchema(
74-
"'%s:valid_body' attribute is invalid. "
75-
"'%s required' isn't a subset of '%s schema'" % (
76-
self.__class__.__name__, required, schema))
77-
return dict(schema=schema, required=required)
78-
79-
def __getattr__(self, name):
80-
return self.args.get(name)
81-
82-
def __str__(self):
83-
return self.populate_uri()
84-
85-
def populate_uri(self):
86-
try:
87-
populated_uri = self.uri.format(**self.args)
88-
except KeyError:
89-
raise ValidationError(
90-
"'%s' request wasn't be able to populate the uri '%s' with "
91-
"'%s' args" % (self.__class__.__name__, self.uri, self.args))
92-
return str(populated_uri).strip('/')
93-
94-
def get_body(self):
95-
return self.body.dumps()
96-
97-
98-
class Factory(object):
99-
""" """
100-
101-
import_pattern = re.compile(r'^(\w+\.)+\w+$')
102-
103-
def __validate(func):
104-
""" """
105-
106-
def wrapper(self, request_uri, **kwargs):
107-
if not Factory.import_pattern.match(request_uri):
108-
raise UriInvalid("'%s' isn't valid form" % request_uri)
109-
return func(self, request_uri.lower(), **kwargs)
110-
return wrapper
111-
112-
def __dispatch(func):
113-
""" """
114-
115-
def wrapper(self, request_uri, **kwargs):
116-
module_chunk, s, request_chunk = request_uri.rpartition('.')
117-
try:
118-
# TODO: CamelCase and under_score support, now only Class Name
119-
module = import_module('%s.%s'
120-
% (ABS_IMPORT_PREFIX, module_chunk))
121-
request = getattr(module, request_chunk.capitalize())
122-
except ImportError:
123-
raise DoesNotExists("'%s' module does not exists"
124-
% module_chunk)
125-
except AttributeError:
126-
raise DoesNotExists(
127-
"'%s' request doesn't exists into '%s' module"
128-
% (request_chunk.capitalize(), module_chunk))
129-
return func(self, request, **kwargs)
130-
return wrapper
131-
132-
@__validate
133-
@__dispatch
134-
def __call__(self, request='', **kwargs):
135-
request = request(**kwargs)
136-
assert isinstance(request, Request)
137-
return request

pygithub3/requests/base.py

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
import re
5+
from importlib import import_module
6+
try:
7+
import simplejson as json
8+
except ImportError:
9+
import json
10+
11+
from pygithub3.exceptions import (DoesNotExists, UriInvalid, ValidationError,
12+
InvalidBodySchema)
13+
from pygithub3.resources.base import Raw
14+
15+
ABS_IMPORT_PREFIX = 'pygithub3.requests'
16+
17+
18+
class Body(object):
19+
20+
def __init__(self, content, schema, required):
21+
self.content = content
22+
self.schema = schema
23+
self.required = required
24+
25+
def dumps(self):
26+
if not self.schema:
27+
return self.content or None
28+
return json.dumps(self.parse())
29+
30+
def parse(self):
31+
if not hasattr(self.content, 'items'):
32+
raise ValidationError("'%s' needs a content dictionary"
33+
% self.__class__.__name__)
34+
parsed = {key: self.content[key] for key in self.schema
35+
if key in self.content}
36+
for attr_required in self.required:
37+
if attr_required not in parsed:
38+
raise ValidationError("'%s' attribute is required" %
39+
attr_required)
40+
if not parsed[attr_required]:
41+
raise ValidationError("'%s' attribute can't be empty" %
42+
attr_required)
43+
return parsed
44+
45+
46+
class Request(object):
47+
""" """
48+
49+
uri = ''
50+
resource = Raw
51+
body_schema = {}
52+
53+
def __init__(self, **kwargs):
54+
""" """
55+
self.body = kwargs.pop('body', None)
56+
self.args = kwargs
57+
self.clean()
58+
59+
def clean(self):
60+
self.uri = self.clean_uri() or self.uri
61+
self.body = Body(self.clean_body(), **self.clean_valid_body())
62+
63+
def clean_body(self):
64+
return self.body
65+
66+
def clean_uri(self):
67+
return None
68+
69+
def clean_valid_body(self):
70+
schema = set(self.body_schema.get('schema', ()))
71+
required = set(self.body_schema.get('required', ()))
72+
if not required.issubset(schema):
73+
raise InvalidBodySchema(
74+
"'%s:valid_body' attribute is invalid. "
75+
"'%s required' isn't a subset of '%s schema'" % (
76+
self.__class__.__name__, required, schema))
77+
return dict(schema=schema, required=required)
78+
79+
def __getattr__(self, name):
80+
return self.args.get(name)
81+
82+
def __str__(self):
83+
return self.populate_uri()
84+
85+
def populate_uri(self):
86+
try:
87+
populated_uri = self.uri.format(**self.args)
88+
except KeyError:
89+
raise ValidationError(
90+
"'%s' request wasn't be able to populate the uri '%s' with "
91+
"'%s' args" % (self.__class__.__name__, self.uri, self.args))
92+
return str(populated_uri).strip('/')
93+
94+
def get_body(self):
95+
return self.body.dumps()
96+
97+
98+
class Factory(object):
99+
""" """
100+
101+
import_pattern = re.compile(r'^(\w+\.)+\w+$')
102+
103+
def validate(func):
104+
""" """
105+
106+
def wrapper(self, request_uri, **kwargs):
107+
if not Factory.import_pattern.match(request_uri):
108+
raise UriInvalid("'%s' isn't valid form" % request_uri)
109+
return func(self, request_uri.lower(), **kwargs)
110+
return wrapper
111+
112+
def dispatch(func):
113+
""" """
114+
115+
def wrapper(self, request_uri, **kwargs):
116+
module_chunk, s, request_chunk = request_uri.rpartition('.')
117+
try:
118+
# TODO: CamelCase and under_score support, now only Class Name
119+
module = import_module('%s.%s'
120+
% (ABS_IMPORT_PREFIX, module_chunk))
121+
request = getattr(module, request_chunk.capitalize())
122+
except ImportError:
123+
raise DoesNotExists("'%s' module does not exists"
124+
% module_chunk)
125+
except AttributeError:
126+
raise DoesNotExists(
127+
"'%s' request doesn't exists into '%s' module"
128+
% (request_chunk.capitalize(), module_chunk))
129+
return func(self, request, **kwargs)
130+
return wrapper
131+
132+
@validate
133+
@dispatch
134+
def __call__(self, request='', **kwargs):
135+
request = request(**kwargs)
136+
assert isinstance(request, Request)
137+
return request

0 commit comments

Comments
 (0)