Update main.py

This commit is contained in:
prabhatdev
2020-07-28 14:39:29 +05:30
committed by GitHub
parent 399d8389e3
commit 7320e98481

149
main.py
View File

@@ -1,16 +1,17 @@
''' '''
Readme Development Metrics With waka time progress Readme Development Metrics With waka time progress
''' '''
import locale
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 from github import Github, GithubException
import datetime import datetime
from string import Template from string import Template
import matplotlib.pyplot as plt
from io import StringIO,BytesIO
from dotenv import load_dotenv from dotenv import load_dotenv
from loc import LinesOfCode from loc import LinesOfCode
@@ -20,20 +21,20 @@ 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')
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 = 'y' if (os.getenv('INPUT_SHOW_TIMEZONE') is None) else os.getenv('INPUT_SHOW_TIMEZONE') showTimeZone = os.getenv('INPUT_SHOW_TIMEZONE')
showProjects = 'y' if (os.getenv('INPUT_SHOW_PROJECTS') is None) else os.getenv('INPUT_SHOW_PROJECTS') showProjects = os.getenv('INPUT_SHOW_PROJECTS')
showEditors = 'y' if (os.getenv('INPUT_SHOW_EDITORS') is None) else os.getenv('INPUT_SHOW_EDITORS') showEditors = os.getenv('INPUT_SHOW_EDITORS')
showOs = 'y' if (os.getenv('INPUT_SHOW_OS') is None) else os.getenv('INPUT_SHOW_OS') showOs = os.getenv('INPUT_SHOW_OS')
showCommit = 'y' if (os.getenv('INPUT_SHOW_COMMIT') is None) else os.getenv('INPUT_SHOW_COMMIT') showCommit = os.getenv('INPUT_SHOW_COMMIT')
showLanguage = 'y' if (os.getenv('INPUT_SHOW_LANGUAGE') is None) else os.getenv('INPUT_SHOW_LANGUAGE') showLanguage = os.getenv('INPUT_SHOW_LANGUAGE')
showLanguagePerRepo='y' if (os.getenv('LANGUAGE_PER_REPO') is None) else os.getenv('LANGUAGE_PER_REPO') show_loc = os.getenv('INPUT_SHOW_LINES_OF_CODE')
showLocChart='y' if (os.getenv('LOC_CHART') is None) else os.getenv('LOC_CHART')
show_waka_stats='n' if waka_key is None else 'y'
showLanguagePerRepo = os.getenv('INPUT_SHOW_LANGUAGE_PER_REPO')
showLocChart = os.getenv('INPUT_SHOW_LOC_CHART')
show_waka_stats = 'y'
# The GraphQL query to get commit data. # The GraphQL query to get commit data.
userInfoQuery = """ userInfoQuery = """
{ {
@@ -77,6 +78,18 @@ query {
} }
""") """)
get_loc_url = Template("""/repos/$owner/$repo/stats/code_frequency""")
def run_v3_api(query):
request = requests.get('https://api.github.com' + query, headers=headers)
if request.status_code == 200:
return request.json()
else:
raise Exception(
"Query failed to run by returning code of {}. {},... {}".format(request.status_code, query, request.json()))
repositoryListQuery = Template(""" repositoryListQuery = Template("""
{ {
user(login: "$username") { user(login: "$username") {
@@ -119,6 +132,7 @@ repositoryListQuery = Template("""
} }
""") """)
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)
if request.status_code == 200: if request.status_code == 200:
@@ -149,7 +163,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[:5]: for l in data[:7]:
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']}%"
@@ -157,7 +171,13 @@ def make_commit_list(data: list):
return ' \n'.join(data_list) return ' \n'.join(data_list)
def generate_commit_list(): def generate_commit_list(tz):
string = ''
result = run_query(userInfoQuery) # Execute the query
username = result["data"]["viewer"]["login"]
id = result["data"]["viewer"]["id"]
print("user {}".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]
@@ -167,14 +187,35 @@ def generate_commit_list():
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
total_loc = 0
for repository in repos: for repository in repos:
if show_loc.lower() in ['true', '1', 't', 'y', 'yes']:
try:
datas = run_v3_api(get_loc_url.substitute(owner=repository["owner"]["login"], repo=repository["name"]))
for data in datas:
total_loc = total_loc + data[1] - data[2]
except Exception as e:
print(e)
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"], "%Y-%m-%dT%H:%M:%SZ") date = datetime.datetime.strptime(committedDate["node"]["committedDate"],
"%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:
@@ -183,10 +224,26 @@ def generate_commit_list():
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("Exception occured" + str(ex)); print("Please Ignore this exception " + 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:
@@ -197,17 +254,41 @@ def generate_commit_list():
{"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)},
]
return '**' + title + '** \n\n' + '```text\n' + make_commit_list(one_day) + '\n\n```\n' max_element = {
'percent': 0
}
for day in dayOfWeek:
if day['percent'] > max_element['percent']:
max_element = day
days_title = 'I\'m Most Productive on ' + max_element['name'] + 's'
if show_loc.lower() in ['true', '1', 't', 'y', 'yes']:
string = string + '![Lines of code](https://img.shields.io/badge/From%20Hello%20World%20I\'ve%20written-' + locale.format_string(
"%d", total_loc,
grouping=True) + '%20Lines%20of%20code-blue)\n\n'
string = string + '**' + title + '** \n\n' + '```text\n' + make_commit_list(one_day) + '\n\n```\n'
string = string + '📅 **' + days_title + '** \n\n' + '```text\n' + make_commit_list(dayOfWeek) + '\n\n```\n'
return string
def get_waka_time_stats(): def get_waka_time_stats():
stats = '' stats = ''
try:
request = requests.get( request = requests.get(
f"https://wakatime.com/api/v1/users/current/stats/last_7_days?api_key={waka_key}") f"https://wakatime.com/api/v1/users/current/stats/last_7_days?api_key={waka_key}")
if request.status_code == 200: if request.status_code != 401:
data = request.json() data = request.json()
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 + '📊 **This week I spent my time on** \n\n'
stats = stats + '```text\n' stats = stats + '```text\n'
if showTimeZone.lower() in ['true', '1', 't', 'y', 'yes']: if showTimeZone.lower() in ['true', '1', 't', 'y', 'yes']:
@@ -215,26 +296,36 @@ def get_waka_time_stats():
stats = stats + '⌚︎ Timezone: ' + timezone + '\n\n' stats = stats + '⌚︎ Timezone: ' + timezone + '\n\n'
if showLanguage.lower() in ['true', '1', 't', 'y', 'yes']: if showLanguage.lower() in ['true', '1', 't', 'y', 'yes']:
if len(data['data']['languages']) != 0:
lang_list = make_list(data['data']['languages']) lang_list = make_list(data['data']['languages'])
else:
lang_list = "No Activity tracked this Week"
stats = stats + '💬 Languages: \n' + lang_list + '\n\n' stats = stats + '💬 Languages: \n' + lang_list + '\n\n'
if showEditors.lower() in ['true', '1', 't', 'y', 'yes']: if showEditors.lower() in ['true', '1', 't', 'y', 'yes']:
if len(data['data']['editors']) != 0:
edit_list = make_list(data['data']['editors']) edit_list = make_list(data['data']['editors'])
else:
edit_list = "No Activity tracked this Week"
stats = stats + '🔥 Editors: \n' + edit_list + '\n\n' stats = stats + '🔥 Editors: \n' + edit_list + '\n\n'
if showProjects.lower() in ['true', '1', 't', 'y', 'yes']: if showProjects.lower() in ['true', '1', 't', 'y', 'yes']:
if len(data['data']['projects']) != 0:
project_list = make_list(data['data']['projects']) project_list = make_list(data['data']['projects'])
else:
project_list = "No Activity tracked this Week"
stats = stats + '🐱‍💻 Projects: \n' + project_list + '\n\n' stats = stats + '🐱‍💻 Projects: \n' + project_list + '\n\n'
if showOs.lower() in ['true', '1', 't', 'y', 'yes']: if showOs.lower() in ['true', '1', 't', 'y', 'yes']:
if len(data['data']['operating_systems']) != 0:
os_list = make_list(data['data']['operating_systems']) 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 + '💻 Operating Systems: \n' + os_list + '\n\n'
stats = stats + '```\n\n' stats = stats + '```\n\n'
else: else:
print("Waka Time Api Key Not Configured Properly") print("Error With WAKA time API returned " + str(request.status_code) + " Response " + str(request.json()))
except Exception as e:
print("Waka Time Api Key Not Configured" + str(e))
return stats return stats
@@ -256,7 +347,6 @@ def generate_language_per_repo(result):
language_count[language]['count'] = language_count[language]['count'] + 1 language_count[language]['count'] = language_count[language]['count'] + 1
language_count[language]['color'] = color_code language_count[language]['color'] = color_code
data = [] data = []
sorted_labels = list(language_count.keys()) sorted_labels = list(language_count.keys())
sorted_labels.sort(key=lambda x: language_count[x]['count'], reverse=True) sorted_labels.sort(key=lambda x: language_count[x]['count'], reverse=True)
@@ -273,14 +363,10 @@ def generate_language_per_repo(result):
return '**' + title + '** \n\n' + '```text\n' + make_commit_list(data) + '\n\n```\n' return '**' + title + '** \n\n' + '```text\n' + make_commit_list(data) + '\n\n```\n'
def get_stats(): def get_stats():
'''Gets API data and returns markdown progress''' '''Gets API data and returns markdown progress'''
stats = '' stats = ''
if showCommit.lower() in ['true', '1', 't', 'y', 'yes']:
stats = stats + generate_commit_list() + '\n\n'
repositoryList = run_query(repositoryListQuery.substitute(username=username, id=id)) repositoryList = run_query(repositoryListQuery.substitute(username=username, id=id))
if showLanguagePerRepo.lower() in ['true', '1', 't', 'y', 'yes']: if showLanguagePerRepo.lower() in ['true', '1', 't', 'y', 'yes']:
@@ -296,8 +382,6 @@ def get_stats():
if show_waka_stats.lower() in ['true', '1', 't', 'y', 'yes']: if show_waka_stats.lower() in ['true', '1', 't', 'y', 'yes']:
stats = stats + get_waka_time_stats() stats = stats + get_waka_time_stats()
return stats return stats
@@ -335,4 +419,3 @@ if __name__ == '__main__':
print("Readme updated") print("Readme updated")
except Exception as e: except Exception as e:
print("Exception Occurred" + str(e)) print("Exception Occurred" + str(e))