class User(object): """ """ def __init__(self, name, teamName): self.name = name self.teamName = teamName self.db = SQLiteDB() def get_pr_rank(self, startDate, endDate, repos = None, isMerged=None): """get the pr count rank in all users args: startDate: endDate repos: rackhd repository isMerged: True or False (pr be merged or not) return: the len(less count)/len(result)*100 """ if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select user, count(*) Count from PullRequests where") if isMerged == None: items.append("createDate >= '%s'" % startDate) items.append("and createDate < '%s'" % endDate) else: items.append("merged == '%s'" % isMerged) items.append("and endDate >= '%s'" % startDate) items.append("and endDate < '%s'" % endDate) if repos != None: items.append("and repo in (" ) buffer_repo = None for repo in repos: if buffer_repo != None: items.append("'%s'," % buffer_repo) buffer_repo = repo items.append("'%s')" % buffer_repo) items.append("group by user order by Count") select_sql = ' '.join(items) #print(select_sql) result = self.db.getResult(select_sql) if result[0][0] == None: print("result is None. Select sql may be wrong!") for line in result: if line[0] == self.name: user_info = line break beat_rank = round(result.index(user_info)/len(result)*100, 2) #print(beat_rank) return beat_rank except Exception as e: print ("Error: %s" % e) def get_comments_rank(self, startDate, endDate, repos = None): """get the comments count rank in all users args: startDate: endDate repos: rackhd repository return: the len(less count)/len(result)*100 """ if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select from_user, count(*) Count from Comments where") items.append("submitDate >= '%s'" % startDate) items.append("and submitDate < '%s'" % endDate) if repos != None: items.append("and repo in (" ) buffer_repo = None for repo in repos: if buffer_repo != None: items.append("'%s'," % buffer_repo) buffer_repo = repo items.append("'%s')" % buffer_repo) items.append("group by from_user order by Count") select_sql = ' '.join(items) #print(select_sql) result = self.db.getResult(select_sql) if result[0][0] == None: print("result is None. Comments Table is Null. Or select sql may be wrong!") for line in result: if line[0] == self.name: user_info = line break beat_rank = round(result.index(user_info)/len(result)*100, 2) #print(beat_rank) return beat_rank except Exception as e: print ("Error: %s" % e) def get_three_top_review_to(self, startDate, endDate, repos = None): """get the three top users who he or her reviews to args: startDate: endDate repos: rackhd repository return: the three top (user, count) """ if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select to_user, count(*) Count from Comments where from_user != to_user and from_user = '******'" % self.name) items.append("and submitDate >= '%s'" % startDate) items.append("and submitDate < '%s'" % endDate) if repos != None: items.append("and repo in (" ) buffer_repo = None for repo in repos: if buffer_repo != None: items.append("'%s'," % buffer_repo) buffer_repo = repo items.append("'%s')" % buffer_repo) items.append("group by to_user order by Count DESC") select_sql = ' '.join(items) #print(select_sql) result = self.db.getResult(select_sql) if result[0][0] == None: print("result is None. Comments Table is Null. Or select sql may be wrong!") #print(result) return result[0:3] except Exception as e: print ("Error: %s" % e) def get_three_top_review_from(self, startDate, endDate, repos = None): """get the three top users that he or her be reviewed from args: startDate: endDate repos: rackhd repository return: the three top (user, count) """ if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select from_user, count(*) Count from Comments where from_user != to_user and to_user = '******'" % self.name) items.append("and submitDate >= '%s'" % startDate) items.append("and submitDate < '%s'" % endDate) if repos != None: items.append("and repo in (" ) buffer_repo = None for repo in repos: if buffer_repo != None: items.append("'%s'," % buffer_repo) buffer_repo = repo items.append("'%s')" % buffer_repo) items.append("group by from_user order by Count DESC") select_sql = ' '.join(items) #print(select_sql) result = self.db.getResult(select_sql) if result[0][0] == None: print("result is None. Comments Table is Null. Or select sql may be wrong!") #print(result[0:15]) return result[0:3] except Exception as e: print ("Error: %s" % e) def get_pr_count(self, startDate = None, endDate = None, repos = None, isMerged=None): """ get user commit pr count args: startDate: endDate: repos: rackhd repository isMerged: True or False (pr be merged or not) return: the count of pr """ #count = SQLiteDB().selectUserPRcount(self.name, startDate, endDate, repos) if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select count(*) from PullRequests where user = '******'" % self.name) if isMerged == None: if startDate != None: items.append("and createDate >= '%s'" % startDate) if endDate != None: items.append("and createDate < '%s'" % endDate) else: items.append("and merged == '%s'" % isMerged) if startDate != None: items.append("and endDate >= '%s'" % startDate) if endDate != None: items.append("and endDate < '%s'" % endDate) if repos != None: items.append("and repo in (" ) buffer_repo = None for repo in repos: if buffer_repo != None: items.append("'%s'," % buffer_repo) #add the previous repo buffer_repo = repo items.append("'%s')" % buffer_repo) select_sql = ' '.join(items) result = self.db.getResult(select_sql) if result[0][0] == None: return 0.0 else: return result[0][0] except Exception as e: print ("Error: %s" % e) def get_comments_count(self, startDate = None, endDate = None, repos = None): """get review comments count args: startDate: endDate: repos: rackhd repository return: the count of comments """ if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select count(*) from Comments where from_user = '******'" % self.name) if startDate != None : items.append("and submitDate >= '%s'" % startDate) if endDate != None : items.append("and submitDate < '%s'" % endDate) if repos != None : items.append("and repo in (" ) buffer_repo = None for repo in repos: if buffer_repo != None: items.append("'%s'," % buffer_repo) #add the previous repo buffer_repo = repo items.append("'%s')" % buffer_repo) select_sql = ' '.join(items) result = self.db.getResult(select_sql) if result[0][0] == None: return 0.0 else: return result[0][0] except Exception as e: print ("Error: %s" % e) def get_avg_duration(self, startDate = None, endDate = None, repos = None): """get avg duration of pull requests args: startDate: endDate: repos: rackhd repository return: the prs avg duration """ if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select avg(julianday(endDate)-julianday(createDate)) from PullRequests where user = '******' " % self.name) if startDate != None : items.append("and createDate >= '%s' " % startDate) if endDate != None : items.append("and createDate < '%s' " % endDate) if repos != None : items.append("and repo in ( " ) buffer_repo = None for repo in repos: if buffer_repo != None: items.append("'%s'," % buffer_repo) #add the previous repo buffer_repo = repo items.append("'%s')" % buffer_repo) select_sql = ' '.join(items) result = self.db.getResult(select_sql) if result[0][0] == None: return 0.0 else: return result[0][0] except Exception as e: print ("Error: %s" % e) def get_pr_duration(self, startDate = None, endDate = None, repos = None): """get pull requests' duration list args: startDate: endDate: repos: rackhd repository return: all pr duration list """ if self.db == None: self.db = SQLiteDB() try: items = [] items.append("select julianday(endDate)-julianday(createDate) from PullRequests where user = '******' " % self.name) if startDate != None : items.append("and createDate >= '%s' " % startDate) if endDate != None : items.append("and createDate < '%s' " % endDate) if repos != None : items.append("and repo in ( " ) buffer_repo = None for repo in repos: # 添加上一个repo if buffer_repo != None: items.append("'%s'," % buffer_repo) #add the previous repo buffer_repo = repo items.append("'%s')" % buffer_repo) select_sql = ' '.join(items) result = self.db.getResult(select_sql) if len(result)!= 0: return [x[0] for x in result] else: return result except Exception as e: print ("Error: %s" % e)
class Organization(object): """rackhd and no_rackhd organization """ def __init__(self): self.rackhd = Team("rackhd", []) self.no_rackhd = Team("no_rackhd", []) self.db = SQLiteDB() self.set_rackhd() self.set_no_rackhd() def set_rackhd(self): """select all users from USERS table and set rackhd members """ if self.db == None: self.db = SQLiteDB() try: sql = "select distinct userName from USERS" result = self.db.getResult(sql) if result[0][0] != None: team_members = [x[0] for x in result] self.rackhd.set_team_members(team_members) else: print("USERS table is empty") except Exception as e: print("Error: %s" % e) def set_no_rackhd(self): """select from DB and set the no_rackhd members """ if self.db == None: self.db = SQLiteDB() try: sql = "select distinct user from PullRequests where user NOT IN (select distinct userName from USERS)" result = self.db.getResult(sql) if result[0][0] != None: team_members = [x[0] for x in result] self.no_rackhd.set_team_members(team_members) else: print( " select sql may wrong, or pull request don't have no_rackhd members' pr" ) except Exception as e: print("Error: %s" % e) def draw_pr_count_monthly(self, startDate, endDate, repos=None): """ 1.1 draw pr count monthly with rackhd and no-rackhd args: startDate: endDate: repos: rackhd repository """ month, rackhd_created_count = self.rackhd.get_pr_count_monthly( startDate, endDate, repos) _, rackhd_merged_count = self.rackhd.get_pr_count_monthly( startDate, endDate, repos, isMerged=True) _, rackhd_unmerged_count = self.rackhd.get_pr_count_monthly( startDate, endDate, repos, isMerged=False) _, no_rackhd_created_count = self.no_rackhd.get_pr_count_monthly( startDate, endDate, repos) _, no_rackhd_merged_count = self.no_rackhd.get_pr_count_monthly( startDate, endDate, repos, isMerged=True) _, no_rackhd_unmerged_count = self.no_rackhd.get_pr_count_monthly( startDate, endDate, repos, isMerged=False) ind = np.linspace(0.5, 9.5, len(month)) # y_ind = range(0, max(rackhd_created_count)+200, 100) fig, ax = plt.subplots(figsize=(12, 6)) plt.plot(ind, rackhd_created_count, 'r--^', linewidth=1, label='rackhd create pr count') plt.plot(ind, rackhd_merged_count, 'r-*', linewidth=1, label='rackhd merged pr count') plt.plot(ind, rackhd_unmerged_count, 'r-.o', linewidth=1, label='rackhd unmerged pr count') plt.plot(ind, no_rackhd_created_count, 'c--^', linewidth=1, label='norackhd create pr count') plt.plot(ind, no_rackhd_merged_count, 'c-*', linewidth=1, label='norackhd merged pr count') plt.plot(ind, no_rackhd_unmerged_count, 'c-.o', linewidth=1, label='norackhd unmerged pr count') plt.xticks(ind, month, rotation=30) # plt.yticks(y_ind) plt.xlabel('Month') plt.ylabel('PR Count') plt.title('PR Count Monthly') plt.legend() canvas = FigureCanvas(fig) png_output = BytesIO() canvas.print_png(png_output) return png_output.getvalue() def draw_comments_monthly(self, startDate, endDate, repos=None): """ 1.2 draw review count monthly with rackhd and no-rackhd args: startDate: endDate: repos: rackhd repository """ month, rackhd_comments_count = self.rackhd.get_comments_count_monthly( startDate, endDate, repos) _, no_rackhd_comments_count = self.no_rackhd.get_comments_count_monthly( startDate, endDate, repos) x_ind = np.linspace(0.5, 9.5, len(month)) y_ind = range( 0, max(rackhd_comments_count + no_rackhd_comments_count) + 400, 100) fig, ax = plt.subplots(figsize=(12, 6)) plt.plot(x_ind, rackhd_comments_count, 'r--^', linewidth=1, label='rackhd comments count') plt.plot(x_ind, no_rackhd_comments_count, 'c--^', linewidth=1, label='norackhd comments count') plt.xticks(x_ind, month, rotation=30) plt.yticks(y_ind) plt.xlabel('Month') plt.ylabel('Review Count') plt.title('Review Count Monthly') plt.legend() canvas = FigureCanvas(fig) png_output = BytesIO() canvas.print_png(png_output) return png_output.getvalue()