Skip to content

Commit 79808ca

Browse files
authored
Merge pull request #42 from khornberg/bug/params
Version: 0.9.1
2 parents 6c54d28 + 455fd1f commit 79808ca

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def read(*names, **kwargs):
2121

2222
setup(
2323
name='octokitpy',
24-
version='0.9.0',
24+
version='0.9.1',
2525
license='MIT license',
2626
description='Python client for GitHub API',
2727
long_description='%s\n%s' % (

src/octokit/__init__.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@ def _get_headers(self, method_headers):
2626
def _validate(self, kwargs, params):
2727
cached_kwargs = dict(ChainMap(kwargs, self._attribute_cache['url']))
2828
required_params = [k for k, v in params.items() if v.get('required')]
29+
self._validate_required_params(required_params, cached_kwargs)
30+
for kwarg, value in kwargs.items():
31+
param_value = params.get(kwarg)
32+
self._validate_params(param_value, kwarg, value, required_params)
33+
34+
def _validate_required_params(self, required_params, cached_kwargs):
2935
for p in required_params:
36+
if '.' in p:
37+
utils.walk_path(cached_kwargs, p.split('.'))
38+
continue
3039
if p not in cached_kwargs: # has all required
3140
message = '{} is a required parameter'.format(p)
3241
raise errors.OctokitParameterError(message)
33-
for kwarg, value in kwargs.items():
34-
param_value = params.get(kwarg)
35-
self._validate_params(param_value, kwarg, value, required_params)
3642

3743
def _validate_params(self, param_value, kwarg, value, required_params):
3844
if not param_value: # is a valid param but not necessarily required

src/octokit/utils.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,10 @@ def get_json_data(filename):
1515

1616
def parameter_transform(params):
1717
return {param['name']: param for param in params}
18+
19+
20+
def walk_path(obj, path):
21+
if len(path) == 1:
22+
assert obj or obj[path[0]]
23+
else:
24+
walk_path(obj[path[0]], path[1:])

tests/test_methods.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,27 @@ def test_can_pass_in_optional_headers(self, mocker):
237237
authorization_id=100, headers={'accept': 'application/vnd.github.ant-man-preview+json'}
238238
)
239239
requests.get.assert_called_once_with('https://api.github.com/authorizations/100', params={}, headers=headers)
240+
241+
def test_dictionary_keys_are_validated(self, mocker):
242+
mocker.patch('requests.put')
243+
headers = {'accept': 'application/vnd.github.v3+json', 'Content-Type': 'application/json'}
244+
data = {
245+
"required_status_checks": {
246+
"strict": True,
247+
"contexts": [],
248+
},
249+
"required_pull_request_reviews": {
250+
"dismiss_stale_reviews": True
251+
},
252+
"enforce_admins": True,
253+
"restrictions": {
254+
"users": [],
255+
"teams": [],
256+
}
257+
}
258+
Octokit().repos.update_branch_protection(owner='user', repo='repo', branch='branch', **data)
259+
requests.put.assert_called_with(
260+
'https://api.github.com/repos/user/repo/branches/branch/protection',
261+
data=json.dumps(data, sort_keys=True),
262+
headers=headers
263+
)

0 commit comments

Comments
 (0)