Skip to content

Commit 14ef05b

Browse files
committed
Refactor result. Now it's a package
result.smart => Paginate iterator with 'page' behaviour. result.normal => Paginate iterator with 'next' behaviour.
1 parent ed0b5d1 commit 14ef05b

File tree

11 files changed

+410
-220
lines changed

11 files changed

+410
-220
lines changed

docs/result.rst

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,14 @@ Result
55
Some requests returns multiple :doc:`resources`, for that reason the
66
``Github API`` paginate it and **pygithub3** too
77

8-
.. autoclass:: pygithub3.core.result.Result
8+
Smart Result
9+
--------------
10+
11+
.. autoclass:: pygithub3.core.result.smart.Result
12+
:members:
13+
14+
Normal Result
15+
---------------
16+
17+
.. autoclass:: pygithub3.core.result.normal.Result
918

pygithub3/core/result.py

Lines changed: 0 additions & 207 deletions
This file was deleted.

pygithub3/core/result/__init__.py

Whitespace-only changes.

pygithub3/core/result/base.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
import functools
5+
6+
7+
class Method(object):
8+
""" It wraps the requester method, with behaviour to results """
9+
10+
def __init__(self, method, request, **method_args):
11+
self.method = functools.partial(method, request, **method_args)
12+
self.resource = request.resource
13+
self.cache = {}
14+
15+
def __call__(self):
16+
raise NotImplementedError
17+
18+
19+
class Page(object):
20+
""" Iterator of resources """
21+
22+
def __init__(self, getter, page=1):
23+
self.getter = getter
24+
self.page = page
25+
26+
def __iter__(self):
27+
return self
28+
29+
def __add__(self, number):
30+
return self.page + number
31+
32+
def __radd__(self, number):
33+
return number + self.page
34+
35+
def __sub__(self, number):
36+
return self.page - number
37+
38+
def __rsub__(self, number):
39+
return number - self.page
40+
41+
def __lt__(self, number):
42+
return self.page < number
43+
44+
def __le__(self, number):
45+
return self.page <= number
46+
47+
def __eq__(self, number):
48+
return self.page == number
49+
50+
def __ne__(self, number):
51+
return self.page != number
52+
53+
def __gt__(self, number):
54+
return self.page > number
55+
56+
def __ge__(self, number):
57+
return self.page >= number
58+
59+
@property
60+
def resources(self):
61+
return getattr(self, 'count', None) or '~'
62+
63+
def get_content(func):
64+
def wrapper(self):
65+
if not hasattr(self, 'count'):
66+
content = self.getter(self.page)
67+
self.count = len(content)
68+
self.iterable = iter(content)
69+
return func(self)
70+
return wrapper
71+
72+
@get_content
73+
def __next__(self):
74+
try:
75+
return self.iterable.next()
76+
except StopIteration:
77+
self.iterable = iter(self.getter(self.page))
78+
raise StopIteration
79+
80+
def next(self):
81+
return self.__next__()
82+
83+
def __str__(self):
84+
return '<{name}{page} resources={resources}>'.format(
85+
name=self.__class__.__name__,
86+
page=self.page,
87+
resources=self.resources)
88+
89+
90+
class Result(object):
91+
""" Iterator of pages """
92+
93+
def __init__(self, method):
94+
self.getter = method
95+
96+
def __iter__(self):
97+
return self
98+
99+
def next(self):
100+
return self.__next__()
101+
102+
def iterator(self):
103+
""" generator """
104+
for page in self:
105+
for resource in page:
106+
yield resource
107+
108+
def all(self):
109+
return list(self.iterator())
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
from urlparse import urlparse, parse_qs
55

6-
from .third_libs.link_header import parse_link_value
6+
from pygithub3.core.third_libs.link_header import parse_link_value
7+
78

89
class Link(str):
910

0 commit comments

Comments
 (0)