Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita2cdde2

Browse files
committed
Deploy validation in two spots
Start testing like a insane person.
1 parentbe24773 commita2cdde2

File tree

4 files changed

+108
-21
lines changed

4 files changed

+108
-21
lines changed

‎github3/github.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
fromgithub3.usersimportUser,Key
2020
fromgithub3.decoratorsimportrequires_auth,requires_basic_auth
2121
fromgithub3.notificationsimportThread
22+
fromgithub3.validationimport (ParameterValidator,StringValidator,
23+
IntegerValidator)
2224

2325

2426
classGitHub(GitHubCore):
@@ -352,7 +354,7 @@ def issue(self, owner, repository, number):
352354
returnrepo.issue(number)
353355
returnNone
354356

355-
defiter_all_repos(self,number=-1,since=None,etag=None,per_page=None):
357+
defiter_all_repos(self,number=-1,etag=None,**kwargs):
356358
"""Iterate over every repository in the order they were created.
357359
358360
:param int number: (optional), number of repositories to return.
@@ -365,9 +367,12 @@ def iter_all_repos(self, number=-1, since=None, etag=None, per_page=None):
365367
request
366368
:returns: generator of :class:`Repository <github3.repos.Repository>`
367369
"""
370+
params=ParameterValidator(
371+
kwargs, {'per_page':IntegerValidator(True),
372+
'since':IntegerValidator(True)}
373+
)
368374
url=self._build_url('repositories')
369-
returnself._iter(int(number),url,Repository,
370-
params={'since':since,'per_page':per_page},
375+
returnself._iter(int(number),url,Repository,params=params,
371376
etag=etag)
372377

373378
defiter_all_users(self,number=-1,etag=None,per_page=None):
@@ -662,8 +667,7 @@ def iter_orgs(self, login=None, number=-1, etag=None):
662667
returnself._iter(int(number),url,Organization,etag=etag)
663668

664669
@requires_auth
665-
defiter_repos(self,type=None,sort=None,direction=None,number=-1,
666-
etag=None):
670+
defiter_repos(self,number=-1,etag=None,**kwargs):
667671
"""List public repositories for the authenticated user.
668672
669673
.. versionchanged:: 0.6
@@ -688,13 +692,20 @@ def iter_repos(self, type=None, sort=None, direction=None, number=-1,
688692
"""
689693
url=self._build_url('user','repos')
690694

691-
params= {}
692-
iftypein ('all','owner','public','private','member'):
693-
params.update(type=type)
694-
ifsortin ('created','updated','pushed','full_name'):
695-
params.update(sort=sort)
696-
ifdirectionin ('asc','desc'):
697-
params.update(direction=direction)
695+
params=ParameterValidator(kwargs,
696+
{'type':StringValidator(True),
697+
'sort':StringValidator(True),
698+
'direction':StringValidator(True),
699+
})
700+
t=params.get('type')
701+
s=params.get('sort')
702+
d=params.get('direction')
703+
iftand (tnotin ('all','owner','public','private','member')):
704+
delparams['type']
705+
ifsand (snotin ('created','updated','pushed','full_name')):
706+
delparams['sort']
707+
ifdand (dnotin ('asc','desc')):
708+
delparams['direction']
698709

699710
returnself._iter(int(number),url,Repository,params,etag)
700711

‎github3/validation.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ class ParameterValidator(dict):
1212
"""
1313

1414
def__init__(self,params,schema):
15-
self.params=params
16-
self.update(self.params)
1715
self.schema=schema
16+
self.params=params
17+
self.update(**self.params)
1818
self.validate()
1919

2020
defvalidate(self):
@@ -26,12 +26,12 @@ def validate(self):
2626
# If we let items pass through that we don't validate, this
2727
# would be a pointless exercise
2828

29-
forkey,(required,validator)inself.schema.items():
29+
forkey,validatorinself.schema.items():
3030
ifkeynotinself.params:
3131
continue
3232
value=self.params[key]
3333
ifnotvalidator.is_valid(value):
34-
ifrequired:
34+
ifnotvalidator.allow_none:
3535
raiseValueError(
3636
'Key "{0}" is required but is invalid.'.format(key)
3737
)
@@ -45,6 +45,11 @@ def remove_key(self, key):
4545
defset_key(self,key,value):
4646
self.params[key]=self[key]=value
4747

48+
defupdate(self,**kwargs):
49+
super(ParameterValidator,self).update(**kwargs)
50+
self.params.update(**kwargs)
51+
self.validate()
52+
4853

4954
classBaseValidator(object):
5055
def__init__(self,allow_none=False,sub_schema=None):
@@ -54,6 +59,7 @@ def __init__(self, allow_none=False, sub_schema=None):
5459
defnone(self,o):
5560
ifself.allow_noneandoisNone:
5661
returnTrue
62+
returnFalse
5763

5864
defis_valid(self,obj):
5965
raiseNotImplementedError(
@@ -141,11 +147,26 @@ def is_valid(self, lyst):
141147
try:
142148
lyst=list(lyst)
143149
exceptTypeError:
144-
returnFalse
150+
returnself.none(lyst)
145151

146152
is_valid=self.sub_schema.is_valid
147153
returnall([is_valid(i)foriinlyst])
148154

149155
defconvert(self,lyst):
150156
convert=self.sub_schema.convert
151157
return [convert(i)foriinlyst]
158+
159+
160+
classIntegerValidator(BaseValidator):
161+
defis_valid(self,integer):
162+
try:
163+
integer=int(integer)
164+
exceptValueError:
165+
returnFalse
166+
exceptTypeError:
167+
ifnotself.allow_none:
168+
raise
169+
returnTrue
170+
171+
defconvert(self,integer):
172+
returnint(integer)

‎tests/test_github.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -494,13 +494,14 @@ def test_iter_repos(self):
494494
expect(next(self.g.iter_repos())).isinstance(github3.repos.Repository)
495495
self.mock_assertions()
496496

497-
expect(next(self.g.iter_repos('sigmavirus24'))).isinstance(
498-
github3.repos.Repository)
497+
self.conf.update(params={'type':'all','direction':'desc'})
498+
499+
next(self.g.iter_repos(type='all',direction='desc'))
499500
self.mock_assertions()
500501

501-
self.conf.update(params={'type':'all','direction':'desc'})
502+
self.conf.update(params={'type':'all'})
502503

503-
next(self.g.iter_repos('all',direction='desc'))
504+
next(self.g.iter_repos(type='all',direction='foobar'))
504505
self.mock_assertions()
505506

506507
deftest_iter_user_repos(self):

‎tests/test_validation.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
fromgithub3importvalidation
2+
fromtests.utilsimportTestCase
3+
4+
5+
classTestIntegerValidator(TestCase):
6+
defsetUp(self):
7+
self.v=validation.IntegerValidator()
8+
9+
deftest_is_valid_raises_TypeError(self):
10+
self.assertRaises(TypeError,self.v.is_valid,None)
11+
12+
deftest_handles_ValueError(self):
13+
self.assertFalse(self.v.is_valid('abc'))
14+
15+
deftest_accepts_strings_of_digits(self):
16+
self.assertTrue(self.v.is_valid('123'))
17+
18+
deftest_accepts_integers(self):
19+
self.assertTrue(self.v.is_valid(123))
20+
21+
deftest_converts_strings_of_digits(self):
22+
self.assertEqual(123,self.v.convert('123'))
23+
24+
deftest_converts_integers(self):
25+
self.assertEqual(123,self.v.convert(123))
26+
27+
deftest_convert_raises_TypeError(self):
28+
self.assertRaises(TypeError,self.v.convert,None)
29+
30+
deftest_allows_none_with_allow_none_True(self):
31+
self.v.allow_none=True
32+
self.assertTrue(self.v.is_valid(None))
33+
34+
35+
classTestListValidator(TestCase):
36+
defsetUp(self):
37+
self.v=validation.ListValidator(
38+
sub_schema=validation.IntegerValidator()
39+
)
40+
41+
deftest_is_valid_None(self):
42+
self.assertFalse(self.v.is_valid(None))
43+
self.v.allow_none=True
44+
self.assertTrue(self.v.is_valid(None))
45+
46+
deftest_is_valid_empty_list(self):
47+
self.assertTrue(self.v.is_valid([]))
48+
49+
deftest_is_valid_list_of_strings(self):
50+
self.assertFalse(
51+
self.v.is_valid(
52+
["abc","def"]
53+
)
54+
)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp