1
1
import json
2
2
import pandas as pd
3
+ import requests
4
+ import os
3
5
6
+ LABEL_BOT_URL = os .environ .get ('LABEL_BOT_URL' , 'http://127.0.0.1:8008' )
4
7
5
8
# Step 1: Multi-dimension developer portrait
6
9
def label_developer_portrait (user , user_profile ):
@@ -129,12 +132,17 @@ def rule_generator(issue, user_profile, bot_conf):
129
132
issue_owner_portrait = label_developer_portrait (issue ['issueUser' ]['issueUserID' ], user_profile )
130
133
# Step 2: Generate the rules
131
134
info_rules = info_rule_generator (issue , issue_owner_portrait , bot_conf )
132
- # Step 3: Finish the complete rule list
135
+ # Step 3: Import rules from label-bot [https://github.com/TECH4DX/label-bot.git]
136
+ label_bot_rules = get_label_bot_rules ("Issue Hook" , issue )
137
+ # Step 4: Finish the complete rule list
133
138
rule_list = []
134
- if not isinstance (info_rules , list ):
135
- info_rules = list (info_rules )
136
- rule_list = rule_list + info_rules
137
- return rule_list
139
+ if not isinstance (info_rules , list ) or not isinstance (label_bot_rules , list ):
140
+ # info_rules = list(info_rules)
141
+ label_bot_rules = list (label_bot_rules )
142
+ # rule_list = rule_list + info_rules
143
+ rule_list = rule_list + info_rules + label_bot_rules
144
+ # return rule_list
145
+ return list (filter (lambda x : rule_list .count (x ) == 1 , rule_list )) # Currently rule-handler and label-bot generate some same rules when creating an issue, so de-duplicated them here.
138
146
139
147
def label_handler (labels ):
140
148
isContainUser = False
@@ -145,6 +153,56 @@ def label_handler(labels):
145
153
break
146
154
return isContainUser
147
155
156
+ def convert_payload (issue ):
157
+ payload = dict ()
158
+ payload ["action" ] = issue ["issueAction" ]
159
+ payload ["enterprise" ] = issue ["repoInfo" ]["ent" ] if issue ["repoInfo" ]["ent" ] != "" else None
160
+ payload ["iid" ] = issue ["issueID" ]
161
+
162
+ payload_issue = dict ()
163
+ # payload_issue["assignee"] = issue["issueAssignee"] # Do not use this field, because label-bot will not unmarshal this one.
164
+ payload_issue ["body" ] = issue ["issueContent" ]
165
+ payload_issue ["created_at" ] = issue ["issueTime" ]
166
+
167
+ # payload_issue_labels = [{"name": labels["labelName"]} for labels in issue["issueLabel"]] if len(issue["issueLabel"]) != 0 else []
168
+ payload_issue_labels = [{"name" : labels ["labelName" ]} for labels in issue ["issueLabel" ]] if issue ["issueLabel" ] is not None else [] # issue["issueLabel"] should be empty, but the retriever didn't pass it when empty.
169
+ payload_issue ["labels" ] = payload_issue_labels
170
+
171
+ payload_issue ["number" ] = issue ["issueID" ]
172
+ payload_issue ["title" ] = issue ["issueTitle" ]
173
+ payload_issue ["updated_at" ] = issue ["issueUpdateTime" ]
174
+
175
+ payload_issue_user = dict ()
176
+ payload_issue_user ["login" ] = issue ["issueUser" ]["issueUserID" ]
177
+ payload_issue_user ["name" ] = issue ["issueUser" ]["issueUserName" ]
178
+ payload_issue ["user" ] = payload_issue_user
179
+
180
+ payload_repository = dict ()
181
+ payload_repository ["name" ] = issue ["repoInfo" ]["repo" ]
182
+ payload_repository ["namespace" ] = issue ["repoInfo" ]["org" ]
183
+
184
+ payload ["issue" ] = payload_issue
185
+ payload ["repository" ] = payload_repository
186
+
187
+ return payload
188
+
189
+ def get_label_bot_rules (event_type , issue ):
190
+ # Label-bot needs the format of payload from Gitee, not customized structure ISSUE posted from data-cache
191
+ payload = convert_payload (issue )
192
+
193
+ try :
194
+ resp = requests .post (LABEL_BOT_URL , headers = {"event_type" : event_type }, json = payload )
195
+ resp .encoding = 'utf-8'
196
+ except :
197
+ print ("Requests err when posting to LABEL_BOT_URL [{}]" .format (LABEL_BOT_URL ))
198
+ return []
199
+ else :
200
+ if resp .status_code == 200 :
201
+ hash_map = json .loads (resp .content )
202
+ rules = [content for content in hash_map .values ()]
203
+ return rules
204
+ else :
205
+ return []
148
206
149
207
150
208
if __name__ == "__main__" :
@@ -158,8 +216,6 @@ def label_handler(labels):
158
216
'"issueLabel":["SIG/XX", "kind/bug"]}'
159
217
test_issue = json .loads (issue_str )
160
218
161
- # Loading user_profile data
162
- # Loading data
163
219
label_user_profile = pd .read_csv ('config/developer_portrait/issue_label_user_profile.csv' ).set_index ('owner_login' )
164
220
label_bot_reaction = pd .read_csv ('config/bot_reaction/issue_label_rule_generator.csv' ).set_index ('user_habit' )
165
221
community_assignee_list = ['lizi' , 'mfl' ] # Community Maintainer
0 commit comments