11import json
22import pandas as pd
3+ import requests
4+ import os
35
6+ LABEL_BOT_URL = os .environ .get ('LABEL_BOT_URL' , 'http://127.0.0.1:8008' )
47
58# Step 1: Multi-dimension developer portrait
69def label_developer_portrait (user , user_profile ):
@@ -129,12 +132,16 @@ def rule_generator(issue, user_profile, bot_conf):
129132 issue_owner_portrait = label_developer_portrait (issue ['issueUser' ]['issueUserID' ], user_profile )
130133 # Step 2: Generate the rules
131134 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
133138 rule_list = []
134- if not isinstance (info_rules , list ):
139+ if not isinstance (info_rules , list ) or not isinstance ( label_bot_rules , list ) :
135140 info_rules = list (info_rules )
136- rule_list = rule_list + info_rules
137- return rule_list
141+ label_bot_rules = list (label_bot_rules )
142+ rule_list = rule_list + info_rules + label_bot_rules
143+ rules = 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.
144+ return rules
138145
139146def label_handler (labels ):
140147 isContainUser = False
@@ -145,6 +152,56 @@ def label_handler(labels):
145152 break
146153 return isContainUser
147154
155+ def convert_payload (issue ):
156+ payload = dict ()
157+ payload ["action" ] = issue ["issueAction" ]
158+ payload ["enterprise" ] = issue ["repoInfo" ]["ent" ] if issue ["repoInfo" ]["ent" ] != "" else None
159+ payload ["iid" ] = issue ["issueID" ]
160+
161+ payload_issue = dict ()
162+ # payload_issue["assignee"] = issue["issueAssignee"] # Do not use this field, because label-bot will not unmarshal this one.
163+ payload_issue ["body" ] = issue ["issueContent" ]
164+ payload_issue ["created_at" ] = issue ["issueTime" ]
165+
166+ # payload_issue_labels = [{"name": labels["labelName"]} for labels in issue["issueLabel"]] if len(issue["issueLabel"]) != 0 else []
167+ 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.
168+ payload_issue ["labels" ] = payload_issue_labels
169+
170+ payload_issue ["number" ] = issue ["issueID" ]
171+ payload_issue ["title" ] = issue ["issueTitle" ]
172+ payload_issue ["updated_at" ] = issue ["issueUpdateTime" ]
173+
174+ payload_issue_user = dict ()
175+ payload_issue_user ["login" ] = issue ["issueUser" ]["issueUserID" ]
176+ payload_issue_user ["name" ] = issue ["issueUser" ]["issueUserName" ]
177+ payload_issue ["user" ] = payload_issue_user
178+
179+ payload_repository = dict ()
180+ payload_repository ["name" ] = issue ["repoInfo" ]["repo" ]
181+ payload_repository ["namespace" ] = issue ["repoInfo" ]["org" ]
182+
183+ payload ["issue" ] = payload_issue
184+ payload ["repository" ] = payload_repository
185+
186+ return payload
187+
188+ def get_label_bot_rules (event_type , issue ):
189+ # Label-bot needs the format of payload from Gitee, not customized structure ISSUE posted from data-cache
190+ payload = convert_payload (issue )
191+
192+ try :
193+ resp = requests .post (LABEL_BOT_URL , headers = {"event_type" : event_type }, json = payload )
194+ resp .encoding = 'utf-8'
195+ except :
196+ print ("Requests err when posting to LABEL_BOT_URL [{}]" .format (LABEL_BOT_URL ))
197+ return []
198+ else :
199+ if resp .status_code == 200 :
200+ hash_map = json .loads (resp .content )
201+ rules = [content for content in hash_map .values ()]
202+ return rules
203+ else :
204+ return []
148205
149206
150207if __name__ == "__main__" :
@@ -158,8 +215,6 @@ def label_handler(labels):
158215 '"issueLabel":["SIG/XX", "kind/bug"]}'
159216 test_issue = json .loads (issue_str )
160217
161- # Loading user_profile data
162- # Loading data
163218 label_user_profile = pd .read_csv ('config/developer_portrait/issue_label_user_profile.csv' ).set_index ('owner_login' )
164219 label_bot_reaction = pd .read_csv ('config/bot_reaction/issue_label_rule_generator.csv' ).set_index ('user_habit' )
165220 community_assignee_list = ['lizi' , 'mfl' ] # Community Maintainer
0 commit comments