Skip to content

Commit 1a4590b

Browse files
Apply black formatting
Signed-off-by: Alex Chamberlain <[email protected]>
1 parent 425b35e commit 1a4590b

File tree

5 files changed

+86
-100
lines changed

5 files changed

+86
-100
lines changed

.travis.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1+
dist: xenial
12
language: python
23
python:
34
- "2.7"
45
- "3.6"
6+
- "3.7"
57
- "pypy"
68
- "pypy3"
79
install:
810
- pip install tox-travis
911
script:
1012
- tox
13+
matrix:
14+
include:
15+
- python: "3.7"
16+
script: black --line-length 120 --check github_webhook tests setup.py
17+
install: pip install black

github_webhook/webhook.py

Lines changed: 46 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,16 @@ class Webhook(object):
1616
:param secret: Optional secret, used to authenticate the hook comes from Github
1717
"""
1818

19-
def __init__(self, app, endpoint='/postreceive', secret=None):
20-
app.add_url_rule(rule=endpoint, endpoint=endpoint, view_func=self._postreceive,
21-
methods=['POST'])
19+
def __init__(self, app, endpoint="/postreceive", secret=None):
20+
app.add_url_rule(rule=endpoint, endpoint=endpoint, view_func=self._postreceive, methods=["POST"])
2221

2322
self._hooks = collections.defaultdict(list)
24-
self._logger = logging.getLogger('webhook')
23+
self._logger = logging.getLogger("webhook")
2524
if secret is not None and not isinstance(secret, six.binary_type):
26-
secret = secret.encode('utf-8')
25+
secret = secret.encode("utf-8")
2726
self._secret = secret
2827

29-
def hook(self, event_type='push'):
28+
def hook(self, event_type="push"):
3029
"""
3130
Registers a function as a hook. Multiple hooks can be registered for a given type, but the
3231
order in which they are invoke is unspecified.
@@ -43,36 +42,33 @@ def decorator(func):
4342
def _get_digest(self):
4443
"""Return message digest if a secret key was provided"""
4544

46-
return hmac.new(
47-
self._secret, request.data, hashlib.sha1).hexdigest() if self._secret else None
45+
return hmac.new(self._secret, request.data, hashlib.sha1).hexdigest() if self._secret else None
4846

4947
def _postreceive(self):
5048
"""Callback from Flask"""
5149

5250
digest = self._get_digest()
5351

5452
if digest is not None:
55-
sig_parts = _get_header('X-Hub-Signature').split('=', 1)
53+
sig_parts = _get_header("X-Hub-Signature").split("=", 1)
5654
if not isinstance(digest, six.text_type):
5755
digest = six.text_type(digest)
5856

59-
if (len(sig_parts) < 2 or sig_parts[0] != 'sha1'
60-
or not hmac.compare_digest(sig_parts[1], digest)):
61-
abort(400, 'Invalid signature')
57+
if len(sig_parts) < 2 or sig_parts[0] != "sha1" or not hmac.compare_digest(sig_parts[1], digest):
58+
abort(400, "Invalid signature")
6259

63-
event_type = _get_header('X-Github-Event')
60+
event_type = _get_header("X-Github-Event")
6461
data = request.get_json()
6562

6663
if data is None:
67-
abort(400, 'Request body must contain json')
64+
abort(400, "Request body must contain json")
6865

69-
self._logger.info(
70-
'%s (%s)', _format_event(event_type, data), _get_header('X-Github-Delivery'))
66+
self._logger.info("%s (%s)", _format_event(event_type, data), _get_header("X-Github-Delivery"))
7167

7268
for hook in self._hooks.get(event_type, []):
7369
hook(data)
7470

75-
return '', 204
71+
return "", 204
7672

7773

7874
def _get_header(key):
@@ -81,54 +77,41 @@ def _get_header(key):
8177
try:
8278
return request.headers[key]
8379
except KeyError:
84-
abort(400, 'Missing header: ' + key)
80+
abort(400, "Missing header: " + key)
8581

8682

8783
EVENT_DESCRIPTIONS = {
88-
'commit_comment': '{comment[user][login]} commented on '
89-
'{comment[commit_id]} in {repository[full_name]}',
90-
'create': '{sender[login]} created {ref_type} ({ref}) in '
91-
'{repository[full_name]}',
92-
'delete': '{sender[login]} deleted {ref_type} ({ref}) in '
93-
'{repository[full_name]}',
94-
'deployment': '{sender[login]} deployed {deployment[ref]} to '
95-
'{deployment[environment]} in {repository[full_name]}',
96-
'deployment_status': 'deployment of {deployement[ref]} to '
97-
'{deployment[environment]} '
98-
'{deployment_status[state]} in '
99-
'{repository[full_name]}',
100-
'fork': '{forkee[owner][login]} forked {forkee[name]}',
101-
'gollum': '{sender[login]} edited wiki pages in {repository[full_name]}',
102-
'issue_comment': '{sender[login]} commented on issue #{issue[number]} '
103-
'in {repository[full_name]}',
104-
'issues': '{sender[login]} {action} issue #{issue[number]} in '
105-
'{repository[full_name]}',
106-
'member': '{sender[login]} {action} member {member[login]} in '
107-
'{repository[full_name]}',
108-
'membership': '{sender[login]} {action} member {member[login]} to team '
109-
'{team[name]} in {repository[full_name]}',
110-
'page_build': '{sender[login]} built pages in {repository[full_name]}',
111-
'ping': 'ping from {sender[login]}',
112-
'public': '{sender[login]} publicized {repository[full_name]}',
113-
'pull_request': '{sender[login]} {action} pull #{pull_request[number]} in '
114-
'{repository[full_name]}',
115-
'pull_request_review': '{sender[login]} {action} {review[state]} '
116-
'review on pull #{pull_request[number]} in '
117-
'{repository[full_name]}',
118-
'pull_request_review_comment': '{comment[user][login]} {action} comment '
119-
'on pull #{pull_request[number]} in '
120-
'{repository[full_name]}',
121-
'push': '{pusher[name]} pushed {ref} in {repository[full_name]}',
122-
'release': '{release[author][login]} {action} {release[tag_name]} in '
123-
'{repository[full_name]}',
124-
'repository': '{sender[login]} {action} repository '
125-
'{repository[full_name]}',
126-
'status': '{sender[login]} set {sha} status to {state} in '
127-
'{repository[full_name]}',
128-
'team_add': '{sender[login]} added repository {repository[full_name]} to '
129-
'team {team[name]}',
130-
'watch': '{sender[login]} {action} watch in repository '
131-
'{repository[full_name]}'
84+
"commit_comment": "{comment[user][login]} commented on " "{comment[commit_id]} in {repository[full_name]}",
85+
"create": "{sender[login]} created {ref_type} ({ref}) in " "{repository[full_name]}",
86+
"delete": "{sender[login]} deleted {ref_type} ({ref}) in " "{repository[full_name]}",
87+
"deployment": "{sender[login]} deployed {deployment[ref]} to "
88+
"{deployment[environment]} in {repository[full_name]}",
89+
"deployment_status": "deployment of {deployement[ref]} to "
90+
"{deployment[environment]} "
91+
"{deployment_status[state]} in "
92+
"{repository[full_name]}",
93+
"fork": "{forkee[owner][login]} forked {forkee[name]}",
94+
"gollum": "{sender[login]} edited wiki pages in {repository[full_name]}",
95+
"issue_comment": "{sender[login]} commented on issue #{issue[number]} " "in {repository[full_name]}",
96+
"issues": "{sender[login]} {action} issue #{issue[number]} in " "{repository[full_name]}",
97+
"member": "{sender[login]} {action} member {member[login]} in " "{repository[full_name]}",
98+
"membership": "{sender[login]} {action} member {member[login]} to team " "{team[name]} in {repository[full_name]}",
99+
"page_build": "{sender[login]} built pages in {repository[full_name]}",
100+
"ping": "ping from {sender[login]}",
101+
"public": "{sender[login]} publicized {repository[full_name]}",
102+
"pull_request": "{sender[login]} {action} pull #{pull_request[number]} in " "{repository[full_name]}",
103+
"pull_request_review": "{sender[login]} {action} {review[state]} "
104+
"review on pull #{pull_request[number]} in "
105+
"{repository[full_name]}",
106+
"pull_request_review_comment": "{comment[user][login]} {action} comment "
107+
"on pull #{pull_request[number]} in "
108+
"{repository[full_name]}",
109+
"push": "{pusher[name]} pushed {ref} in {repository[full_name]}",
110+
"release": "{release[author][login]} {action} {release[tag_name]} in " "{repository[full_name]}",
111+
"repository": "{sender[login]} {action} repository " "{repository[full_name]}",
112+
"status": "{sender[login]} set {sha} status to {state} in " "{repository[full_name]}",
113+
"team_add": "{sender[login]} added repository {repository[full_name]} to " "team {team[name]}",
114+
"watch": "{sender[login]} {action} watch in repository " "{repository[full_name]}",
132115
}
133116

134117

@@ -138,6 +121,7 @@ def _format_event(event_type, data):
138121
except KeyError:
139122
return event_type
140123

124+
141125
# -----------------------------------------------------------------------------
142126
# Copyright 2015 Bloomberg Finance L.P.
143127
#

setup.py

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
from setuptools import setup
22

3-
setup(name="github-webhook",
4-
version="1.0.2",
5-
description="Very simple, but powerful, microframework for writing Github webhooks in Python",
6-
url="https://github.com/bloomberg/python-github-webhook",
7-
author="Alex Chamberlain, Fred Phillips, Daniel Kiss, Daniel Beer",
8-
9-
license='Apache 2.0',
10-
packages=["github_webhook"],
11-
install_requires=['flask', 'six'],
12-
tests_require=['mock', 'pytest'],
13-
14-
classifiers=[
15-
'Development Status :: 4 - Beta',
16-
'Framework :: Flask',
17-
'Environment :: Web Environment',
18-
'Intended Audience :: Developers',
19-
'Intended Audience :: System Administrators',
20-
'License :: OSI Approved :: Apache Software License',
21-
'Operating System :: MacOS :: MacOS X',
22-
'Operating System :: Microsoft :: Windows',
23-
'Operating System :: POSIX',
24-
'Programming Language :: Python :: 2',
25-
'Programming Language :: Python :: 3',
26-
'Topic :: Software Development :: Version Control'
27-
],
28-
test_suite='nose.collector')
3+
setup(
4+
name="github-webhook",
5+
version="1.0.2",
6+
description="Very simple, but powerful, microframework for writing Github webhooks in Python",
7+
url="https://github.com/bloomberg/python-github-webhook",
8+
author="Alex Chamberlain, Fred Phillips, Daniel Kiss, Daniel Beer",
9+
10+
license="Apache 2.0",
11+
packages=["github_webhook"],
12+
install_requires=["flask", "six"],
13+
tests_require=["mock", "pytest"],
14+
classifiers=[
15+
"Development Status :: 4 - Beta",
16+
"Framework :: Flask",
17+
"Environment :: Web Environment",
18+
"Intended Audience :: Developers",
19+
"Intended Audience :: System Administrators",
20+
"License :: OSI Approved :: Apache Software License",
21+
"Operating System :: MacOS :: MacOS X",
22+
"Operating System :: Microsoft :: Windows",
23+
"Operating System :: POSIX",
24+
"Programming Language :: Python :: 2",
25+
"Programming Language :: Python :: 3",
26+
"Topic :: Software Development :: Version Control",
27+
],
28+
test_suite="nose.collector",
29+
)

tests/test_webhook.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import pytest
66
import werkzeug
7+
78
try:
89
from unittest import mock
910
except ImportError:
@@ -15,9 +16,7 @@
1516
@pytest.fixture
1617
def mock_request():
1718
with mock.patch("github_webhook.webhook.request") as req:
18-
req.headers = {
19-
"X-Github-Delivery": ""
20-
}
19+
req.headers = {"X-Github-Delivery": ""}
2120
yield req
2221

2322

@@ -53,10 +52,8 @@ def test_constructor():
5352

5453
# THEN
5554
app.add_url_rule.assert_called_once_with(
56-
endpoint='/postreceive',
57-
rule='/postreceive',
58-
view_func=webhook._postreceive,
59-
methods=['POST'])
55+
endpoint="/postreceive", rule="/postreceive", view_func=webhook._postreceive, methods=["POST"]
56+
)
6057

6158

6259
def test_run_push_hook(webhook, handler, push_request):
@@ -83,10 +80,7 @@ def test_can_handle_zero_events(webhook, push_request):
8380
webhook._postreceive() # noop
8481

8582

86-
@pytest.mark.parametrize("secret", [
87-
u"secret",
88-
b"secret"
89-
])
83+
@pytest.mark.parametrize("secret", [u"secret", b"secret"])
9084
@mock.patch("github_webhook.webhook.hmac")
9185
def test_calls_if_signature_is_correct(mock_hmac, app, push_request, secret):
9286
# GIVEN

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[tox]
2-
envlist = py27,py36,pypy,pypy3,flake8
2+
envlist = py27,py36,py37,pypy,pypy3,flake8
33

44
[testenv]
55
deps =

0 commit comments

Comments
 (0)