@@ -16,17 +16,16 @@ class Webhook(object):
16
16
:param secret: Optional secret, used to authenticate the hook comes from Github
17
17
"""
18
18
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" ])
22
21
23
22
self ._hooks = collections .defaultdict (list )
24
- self ._logger = logging .getLogger (' webhook' )
23
+ self ._logger = logging .getLogger (" webhook" )
25
24
if secret is not None and not isinstance (secret , six .binary_type ):
26
- secret = secret .encode (' utf-8' )
25
+ secret = secret .encode (" utf-8" )
27
26
self ._secret = secret
28
27
29
- def hook (self , event_type = ' push' ):
28
+ def hook (self , event_type = " push" ):
30
29
"""
31
30
Registers a function as a hook. Multiple hooks can be registered for a given type, but the
32
31
order in which they are invoke is unspecified.
@@ -43,36 +42,33 @@ def decorator(func):
43
42
def _get_digest (self ):
44
43
"""Return message digest if a secret key was provided"""
45
44
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
48
46
49
47
def _postreceive (self ):
50
48
"""Callback from Flask"""
51
49
52
50
digest = self ._get_digest ()
53
51
54
52
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 )
56
54
if not isinstance (digest , six .text_type ):
57
55
digest = six .text_type (digest )
58
56
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" )
62
59
63
- event_type = _get_header (' X-Github-Event' )
60
+ event_type = _get_header (" X-Github-Event" )
64
61
data = request .get_json ()
65
62
66
63
if data is None :
67
- abort (400 , ' Request body must contain json' )
64
+ abort (400 , " Request body must contain json" )
68
65
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" ))
71
67
72
68
for hook in self ._hooks .get (event_type , []):
73
69
hook (data )
74
70
75
- return '' , 204
71
+ return "" , 204
76
72
77
73
78
74
def _get_header (key ):
@@ -81,54 +77,41 @@ def _get_header(key):
81
77
try :
82
78
return request .headers [key ]
83
79
except KeyError :
84
- abort (400 , ' Missing header: ' + key )
80
+ abort (400 , " Missing header: " + key )
85
81
86
82
87
83
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]}" ,
132
115
}
133
116
134
117
@@ -138,6 +121,7 @@ def _format_event(event_type, data):
138
121
except KeyError :
139
122
return event_type
140
123
124
+
141
125
# -----------------------------------------------------------------------------
142
126
# Copyright 2015 Bloomberg Finance L.P.
143
127
#
0 commit comments