@@ -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
7874def _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
8783EVENT_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#
0 commit comments