import re import os import base64 import requests from github import Github import datetime from string import Template import matplotlib.pyplot as plt from io import StringIO,BytesIO from dotenv import load_dotenv import time from make_bar_graph import BarGraph class LinesOfCode: def __init__(self,id,username,ghtoken, repositoryData): self.id=id self.username=username self.g = Github(ghtoken) self.headers = {"Authorization": "Bearer " + ghtoken} self.repositoryData=repositoryData def calculateLoc(self): result=self.repositoryData yearly_data={} for repo in result['data']['user']['repositories']['edges']: print(repo) self.getCommitStat(repo['node'],yearly_data) time.sleep(0.7) print("\n\n") print(yearly_data) graph=BarGraph(yearly_data) graph_file=graph.build_graph() self.pushChart() def run_query_v3(self,nameWithOwner): endPoint='https://api.github.com/repos/'+nameWithOwner+'/stats/code_frequency' # print(endPoint) request = requests.get(endPoint, headers=self.headers) if request.status_code == 401: raise Exception("Invalid token {}. {}".format(request.status_code, nameWithOwner)) return request.json() def getQuarter(self,timeStamp): month=datetime.datetime.fromtimestamp(timeStamp).month if month>=1 and month<=4: return 1 elif month>=5 and month<=8: return 2 elif month>=9 and month<=12: return 3 def getCommitStat(self,repoDetails,yearly_data): result= self.run_query_v3(repoDetails['nameWithOwner']) this_year=datetime.datetime.utcnow().year for i in range(len(result)): curr_year=datetime.datetime.fromtimestamp(result[i][0]).year # if curr_year != this_year: quarter=self.getQuarter(result[i][0]) if repoDetails['primaryLanguage'] is not None: if curr_year not in yearly_data: yearly_data[curr_year]={} if quarter not in yearly_data[curr_year]: yearly_data[curr_year][quarter]={} if repoDetails['primaryLanguage']['name'] not in yearly_data[curr_year][quarter]: yearly_data[curr_year][quarter][repoDetails['primaryLanguage']['name']]=0 yearly_data[curr_year][quarter][repoDetails['primaryLanguage']['name']]+=(result[i][1]+result[i][2]) #to find total # if 'total' not in yearly_data[curr_year]: # yearly_data[curr_year]['total']={} # if repoDetails['primaryLanguage']['name'] not in yearly_data[curr_year]['total']: # yearly_data[curr_year]['total'][repoDetails['primaryLanguage']['name']]=0 # yearly_data[curr_year]['total'][repoDetails['primaryLanguage']['name']]+=(result[i][1]+result[i][2]) def pushChart(self): repo = self.g.get_repo(f"{self.username}/{self.username}") with open('bar_graph.png', 'rb') as input_file: data = input_file.read() try: contents = repo.get_contents("charts/bar_graph.png") repo.update_file(contents.path, "Charts Added", data, contents.sha) except Exception as e: repo.create_file("charts/bar_graph.png", "Initial Commit",data) print("pushed") # if __name__ == '__main__': # try: # g = Github(ghtoken) # headers = {"Authorization": "Bearer " + ghtoken} # user_data = run_query(userInfoQuery) # Execute the query # username = user_data["data"]["viewer"]["login"] # id = user_data["data"]["viewer"]["id"] # print("user {} id {}".format(username, id)) # getLoc() # # repo = g.get_repo(f"{username}/{username}") # # contents = repo.get_readme() # # waka_stats = get_stats() # # rdmd = decode_readme(contents.content) # # new_readme = generate_new_readme(stats=waka_stats, readme=rdmd) # # print(new_readme) # # # if new_readme != rdmd: # # repo.update_file(path=contents.path, message='Updated with Dev Metrics', # # content=new_readme, sha=contents.sha, branch='master') # # print("Readme updated") # except Exception as e: # print("Exception Occurred" + str(e))