repos per language added.

This commit is contained in:
prabhatdev
2020-07-27 01:54:47 +05:30
parent 2a00e47efb
commit 4176c0f17e

289
main.py
View File

@@ -5,27 +5,38 @@ Readme Development Metrics With waka time progress
import re import re
import os import os
import base64 import base64
import sys
from pytz import timezone
import pytz
import requests import requests
from github import Github, GithubException from github import Github
import datetime import datetime
from string import Template from string import Template
import matplotlib.pyplot as plt
from io import StringIO,BytesIO
START_COMMENT = '<!--START_SECTION:waka-->' START_COMMENT = '<!--START_SECTION:waka-->'
END_COMMENT = '<!--END_SECTION:waka-->' END_COMMENT = '<!--END_SECTION:waka-->'
listReg = f"{START_COMMENT}[\\s\\S]+{END_COMMENT}" listReg = f"{START_COMMENT}[\\s\\S]+{END_COMMENT}"
user = os.getenv('INPUT_USERNAME') # user = os.getenv('INPUT_USERNAME')
waka_key = os.getenv('INPUT_WAKATIME_API_KEY') # waka_key = os.getenv('INPUT_WAKATIME_API_KEY')
ghtoken = os.getenv('INPUT_GH_TOKEN') # ghtoken = os.getenv('INPUT_GH_TOKEN')
showTimeZone = os.getenv('INPUT_SHOW_TIMEZONE') # showTimeZone = os.getenv('INPUT_SHOW_TIMEZONE')
showProjects = os.getenv('INPUT_SHOW_PROJECTS') # showProjects = os.getenv('INPUT_SHOW_PROJECTS')
showEditors = os.getenv('INPUT_SHOW_EDITORS') # showEditors = os.getenv('INPUT_SHOW_EDITORS')
showOs = os.getenv('INPUT_SHOW_OS') # showOs = os.getenv('INPUT_SHOW_OS')
showCommit = os.getenv('INPUT_SHOW_COMMIT') # showCommit = os.getenv('INPUT_SHOW_COMMIT')
showLanguage = os.getenv('INPUT_SHOW_LANGUAGE') # showLanguage = os.getenv('INPUT_SHOW_LANGUAGE')
# showLanguagePerRepo=os.getenv('LANGUAGE_PER_REPO')
username = ''
waka_key = '1647f145-ce70-4172-9f4c-aa9143300891'
ghtoken = '20c2809f702a3db2cbe2350dd160e4e34302889e'
showTimeZone = 'y'
showProjects = 'y'
showEditors = 'y'
showOs = 'y'
showCommit = 'y'
showLanguage = 'y'
showLanguagePerRepo= 'y'
# The GraphQL query to get commit data. # The GraphQL query to get commit data.
userInfoQuery = """ userInfoQuery = """
@@ -70,6 +81,47 @@ query {
} }
""") """)
repositoryListQuery = Template("""
{
user(login: "$username") {
repositories(orderBy: {field: CREATED_AT, direction: ASC}, first: 100, affiliations: [OWNER, COLLABORATOR, ORGANIZATION_MEMBER]) {
totalCount
edges {
node {
object(expression:"master") {
... on Commit {
history {
totalCount
}
}
}
primaryLanguage {
color
name
id
}
stargazers {
totalCount
}
collaborators {
totalCount
}
createdAt
name
owner {
id
login
}
nameWithOwner
}
}
}
location
createdAt
name
}
}
""")
def run_query(query): def run_query(query):
request = requests.post('https://api.github.com/graphql', json={'query': query}, headers=headers) request = requests.post('https://api.github.com/graphql', json={'query': query}, headers=headers)
@@ -101,7 +153,7 @@ def make_list(data: list):
def make_commit_list(data: list): def make_commit_list(data: list):
'''Make List''' '''Make List'''
data_list = [] data_list = []
for l in data[:7]: for l in data[:5]:
ln = len(l['name']) ln = len(l['name'])
ln_text = len(l['text']) ln_text = len(l['text'])
op = f"{l['name']}{' ' * (13 - ln)}{l['text']}{' ' * (15 - ln_text)}{make_graph(l['percent'])} {l['percent']}%" op = f"{l['name']}{' ' * (13 - ln)}{l['text']}{' ' * (15 - ln_text)}{make_graph(l['percent'])} {l['percent']}%"
@@ -109,13 +161,7 @@ def make_commit_list(data: list):
return ' \n'.join(data_list) return ' \n'.join(data_list)
def generate_commit_list(tz): def generate_commit_list():
string = ''
result = run_query(userInfoQuery) # Execute the query
username = result["data"]["viewer"]["login"]
id = result["data"]["viewer"]["id"]
print("user {} id".format(username))
result = run_query(createContributedRepoQuery.substitute(username=username)) result = run_query(createContributedRepoQuery.substitute(username=username))
nodes = result["data"]["user"]["repositoriesContributedTo"]["nodes"] nodes = result["data"]["user"]["repositoriesContributedTo"]["nodes"]
repos = [d for d in nodes if d['isFork'] is False] repos = [d for d in nodes if d['isFork'] is False]
@@ -125,24 +171,14 @@ def generate_commit_list(tz):
evening = 0 # 18 - 24 evening = 0 # 18 - 24
night = 0 # 0 - 6 night = 0 # 0 - 6
Monday = 0
Tuesday = 0
Wednesday = 0
Thursday = 0
Friday = 0
Saturday = 0
Sunday = 0
for repository in repos: for repository in repos:
result = run_query( result = run_query(
createCommittedDateQuery.substitute(owner=repository["owner"]["login"], name=repository["name"], id=id)) createCommittedDateQuery.substitute(owner=repository["owner"]["login"], name=repository["name"], id=id))
try: try:
committed_dates = result["data"]["repository"]["ref"]["target"]["history"]["edges"] committed_dates = result["data"]["repository"]["ref"]["target"]["history"]["edges"]
for committedDate in committed_dates: for committedDate in committed_dates:
date = datetime.datetime.strptime(committedDate["node"]["committedDate"], date = datetime.datetime.strptime(committedDate["node"]["committedDate"], "%Y-%m-%dT%H:%M:%SZ")
"%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=pytz.utc).astimezone(timezone(tz))
hour = date.hour hour = date.hour
weekday = date.strftime('%A')
if 6 <= hour < 12: if 6 <= hour < 12:
morning += 1 morning += 1
if 12 <= hour < 18: if 12 <= hour < 18:
@@ -151,26 +187,10 @@ def generate_commit_list(tz):
evening += 1 evening += 1
if 0 <= hour < 6: if 0 <= hour < 6:
night += 1 night += 1
if weekday == "Monday":
Monday += 1
if weekday == "Tuesday":
Tuesday += 1
if weekday == "Wednesday":
Wednesday += 1
if weekday == "Thursday":
Thursday += 1
if weekday == "Friday":
Friday += 1
if weekday == "Saturday":
Saturday += 1
if weekday == "Sunday":
Sunday += 1
except Exception as ex: except Exception as ex:
print("Please Ignore this exception " + str(ex)) print("Exception occured" + str(ex));
sumAll = morning + daytime + evening + night sumAll = morning + daytime + evening + night
sum_week = Sunday + Monday + Tuesday + Friday + Saturday + Wednesday + Thursday
if morning + daytime >= evening + night: if morning + daytime >= evening + night:
title = "I'm an early 🐤" title = "I'm an early 🐤"
else: else:
@@ -181,77 +201,95 @@ def generate_commit_list(tz):
{"name": "🌃 Evening", "text": str(evening) + " commits", "percent": round((evening / sumAll) * 100, 2)}, {"name": "🌃 Evening", "text": str(evening) + " commits", "percent": round((evening / sumAll) * 100, 2)},
{"name": "🌙 Night", "text": str(night) + " commits", "percent": round((night / sumAll) * 100, 2)}, {"name": "🌙 Night", "text": str(night) + " commits", "percent": round((night / sumAll) * 100, 2)},
] ]
dayOfWeek = [
{"name": "Monday", "text": str(Monday) + " commits", "percent": round((Monday / sum_week) * 100, 2)},
{"name": "Tuesday", "text": str(Tuesday) + " commits", "percent": round((Tuesday / sum_week) * 100, 2)},
{"name": "Wednesday", "text": str(Wednesday) + " commits", "percent": round((Wednesday / sum_week) * 100, 2)},
{"name": "Thursday", "text": str(Thursday) + " commits", "percent": round((Thursday / sum_week) * 100, 2)},
{"name": "Friday", "text": str(Friday) + " commits", "percent": round((Friday / sum_week) * 100, 2)},
{"name": "Saturday", "text": str(Saturday) + " commits", "percent": round((Saturday / sum_week) * 100, 2)},
{"name": "Sunday", "text": str(Sunday) + " commits", "percent": round((Sunday / sum_week) * 100, 2)},
]
max_element = { return '**' + title + '** \n\n' + '```text\n' + make_commit_list(one_day) + '\n\n```\n'
'percent': 0
}
for day in dayOfWeek: def get_waka_time_stats():
if day['percent'] > max_element['percent']: stats=''
max_element = day try:
days_title = 'I\'m Most Productive on ' + max_element['name'] + 's' request = requests.get(
string = string + '**' + title + '** \n\n' + '```text\n' + make_commit_list(one_day) + '\n\n```\n' f"https://wakatime.com/api/v1/users/current/stats/last_7_days?api_key={waka_key}")
string = string + '📅 **' + days_title + '** \n\n' + '```text\n' + make_commit_list(dayOfWeek) + '\n\n```\n'
if request.status_code == 200:
data = request.json()
stats = stats + '📊 **This week I spent my time on** \n\n'
stats = stats + '```text\n'
if showTimeZone.lower() in ['true', '1', 't', 'y', 'yes']:
timezone = data['data']['timezone']
stats = stats + '⌚︎ Timezone: ' + timezone + '\n\n'
if showLanguage.lower() in ['true', '1', 't', 'y', 'yes']:
lang_list = make_list(data['data']['languages'])
stats = stats + '💬 Languages: \n' + lang_list + '\n\n'
if showEditors.lower() in ['true', '1', 't', 'y', 'yes']:
edit_list = make_list(data['data']['editors'])
stats = stats + '🔥 Editors: \n' + edit_list + '\n\n'
if showProjects.lower() in ['true', '1', 't', 'y', 'yes']:
project_list = make_list(data['data']['projects'])
stats = stats + '🐱‍💻 Projects: \n' + project_list + '\n\n'
if showOs.lower() in ['true', '1', 't', 'y', 'yes']:
os_list = make_list(data['data']['operating_systems'])
stats = stats + '💻 Operating Systems: \n' + os_list + '\n\n'
stats = stats + '```\n\n'
else:
print("Waka Time Api Key Not Configured Properly")
except Exception as e:
print("Waka Time Api Key Not Configured" + str(e))
return stats
def generate_language_per_repo():
result = run_query(repositoryListQuery.substitute(username=username))
language_count={}
total=0
for repo in result['data']['user']['repositories']['edges']:
if repo['node']['primaryLanguage'] is None:
continue
language=repo['node']['primaryLanguage']['name']
color_code=repo['node']['primaryLanguage']['color']
total+=1
if language not in language_count.keys():
language_count[language]={}
language_count[language]['count']=1
language_count[language]['color']=color_code
else:
language_count[language]['count']=language_count[language]['count']+1
language_count[language]['color']=color_code
data=[]
sorted_labels=list(language_count.keys())
sorted_labels.sort(key= lambda x: language_count[x]['count'], reverse=True)
most_language_repo=sorted_labels[0]
for label in sorted_labels:
percent=round(language_count[label]['count']/total*100,2)
data.append({
"name":label,
"text":str(language_count[label]['count'])+ " repos",
"percent":percent
})
title='I mostly code in '+most_language_repo
return '**' + title + '** \n\n' + '```text\n' + make_commit_list(data) + '\n\n```\n'
return string
def get_stats(): def get_stats():
'''Gets API data and returns markdown progress''' '''Gets API data and returns markdown progress'''
stats = ''
request = requests.get(f"https://wakatime.com/api/v1/users/current/stats/last_7_days?api_key={waka_key}") stats=''
if showCommit.lower() in ['true', '1', 't', 'y', 'yes']:
stats = stats + generate_commit_list() + '\n\n'
if request.status_code == 200: if showLanguagePerRepo.lower() in ['true', '1', 't', 'y', 'yes']:
data = request.json() stats = stats + generate_language_per_repo() + '\n\n'
if showCommit.lower() in ['true', '1', 't', 'y', 'yes']:
stats = stats + generate_commit_list(tz=data['data']['timezone']) + '\n\n'
stats = stats + '📊 **This week I spent my time on** \n\n'
stats = stats + '```text\n'
if showTimeZone.lower() in ['true', '1', 't', 'y', 'yes']:
timezone = data['data']['timezone']
stats = stats + '⌚︎ Timezone: ' + timezone + '\n\n'
if showLanguage.lower() in ['true', '1', 't', 'y', 'yes']: stats=stats+get_waka_time_stats()
if len(data['data']['languages']) != 0:
lang_list = make_list(data['data']['languages'])
else:
lang_list = "No Activity tracked this Week"
stats = stats + '💬 Languages: \n' + lang_list + '\n\n'
if showEditors.lower() in ['true', '1', 't', 'y', 'yes']:
if len(data['data']['editors']) != 0:
edit_list = make_list(data['data']['editors'])
else:
edit_list = "No Activity tracked this Week"
stats = stats + '🔥 Editors: \n' + edit_list + '\n\n'
if showProjects.lower() in ['true', '1', 't', 'y', 'yes']:
if len(data['data']['projects']) != 0:
project_list = make_list(data['data']['projects'])
else:
project_list = "No Activity tracked this Week"
stats = stats + '🐱‍💻 Projects: \n' + project_list + '\n\n'
if showOs.lower() in ['true', '1', 't', 'y', 'yes']:
if len(data['data']['operating_systems']) != 0:
os_list = make_list(data['data']['operating_systems'])
else:
os_list = "No Activity tracked this Week"
stats = stats + '💻 Operating Systems: \n' + os_list + '\n\n'
stats = stats + '```\n\n'
else:
print("Error With WAKA time API returned " + str(request.status_code) + " Response " + str(request.json()))
return stats return stats
@@ -269,17 +307,22 @@ def generate_new_readme(stats: str, readme: str):
if __name__ == '__main__': if __name__ == '__main__':
g = Github(ghtoken)
try: try:
repo = g.get_repo(f"{user}/{user}") g = Github(ghtoken)
except GithubException: headers = {"Authorization": "Bearer " + ghtoken}
print("Authentication Error. Try saving a GitHub Personal Access Token in your Repo Secrets") user_data = run_query(userInfoQuery) # Execute the query
sys.exit(1) username = user_data["data"]["viewer"]["login"]
contents = repo.get_readme() id = user_data["data"]["viewer"]["id"]
headers = {"Authorization": "Bearer " + ghtoken} print("user {} id {}".format(username, id))
waka_stats = get_stats() repo = g.get_repo(f"{username}/{username}")
rdmd = decode_readme(contents.content) contents = repo.get_readme()
new_readme = generate_new_readme(stats=waka_stats, readme=rdmd) waka_stats = get_stats()
if new_readme != rdmd: rdmd = decode_readme(contents.content)
repo.update_file(path=contents.path, message='Updated with Dev Metrics', new_readme = generate_new_readme(stats=waka_stats, readme=rdmd)
content=new_readme, sha=contents.sha, branch='master') 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')
except Exception as e:
print("Exception Occurred" + str(e))