You've already forked wakapi-readme-stats
161 lines
6.1 KiB
Python
161 lines
6.1 KiB
Python
"""
|
|
Readme Development Metrics With waka time progress
|
|
"""
|
|
from asyncio import run
|
|
from typing import Dict, Tuple
|
|
from datetime import datetime
|
|
from urllib.parse import quote
|
|
|
|
from humanize import intword, naturalsize, intcomma, precisedelta
|
|
|
|
from manager_download import init_download_manager, DownloadManager as DM
|
|
from manager_environment import EnvironmentManager as EM
|
|
from manager_github import init_github_manager, GitHubManager as GHM
|
|
from manager_localization import init_localization_manager, LocalizationManager as LM
|
|
from loc import LinesOfCode # TODO: refactor
|
|
from graphics_list_formatter import make_list, generate_commit_list, make_language_per_repo_list
|
|
|
|
|
|
async def get_waka_time_stats() -> str:
|
|
stats = str()
|
|
|
|
data = await DM.get_remote_json("waka_latest")
|
|
if EM.SHOW_COMMIT:
|
|
stats += f"{await generate_commit_list(data['data']['timezone'])}\n\n"
|
|
|
|
if EM.SHOW_TIMEZONE or EM.SHOW_LANGUAGE or EM.SHOW_EDITORS or EM.SHOW_PROJECTS or EM.SHOW_OS:
|
|
no_activity = LM.t("No Activity Tracked This Week")
|
|
stats += f"📊 **{LM.t('This Week I Spend My Time On')}** \n\n```text\n"
|
|
|
|
if EM.SHOW_TIMEZONE:
|
|
time_zone = data["data"]["timezone"]
|
|
stats += f"⌚︎ {LM.t('Timezone')}: {time_zone}\n\n"
|
|
|
|
if EM.SHOW_LANGUAGE:
|
|
lang_list = no_activity if len(data["data"]["languages"]) == 0 else make_list(data["data"]["languages"])
|
|
stats += f"💬 {LM.t('Languages')}: \n{lang_list}\n\n"
|
|
|
|
if EM.SHOW_EDITORS:
|
|
edit_list = no_activity if len(data["data"]["editors"]) == 0 else make_list(data["data"]["editors"])
|
|
stats += f"🔥 {LM.t('Editors')}: \n{edit_list}\n\n"
|
|
|
|
if EM.SHOW_PROJECTS:
|
|
project_list = no_activity if len(data["data"]["projects"]) == 0 else make_list(data["data"]["projects"])
|
|
stats += f"🐱💻 {LM.t('Projects')}: \n{project_list}\n\n"
|
|
|
|
if EM.SHOW_OS:
|
|
os_list = no_activity if len(data["data"]["operating_systems"]) == 0 else make_list(data["data"]["operating_systems"])
|
|
stats += f"💻 {LM.t('operating system')}: \n{os_list}\n\n"
|
|
|
|
stats += '```\n\n'
|
|
|
|
return stats
|
|
|
|
|
|
async def get_yearly_data(repository_list) -> Tuple[LinesOfCode, Dict]: # TODO: refactor!
|
|
loc = LinesOfCode(GHM.USER, EM.GH_TOKEN, repository_list, EM.IGNORED_REPOS)
|
|
return loc, await loc.calculateLoc()
|
|
|
|
|
|
async def get_short_github_info():
|
|
stats = f"**🐱 {LM.t('My GitHub Data')}** \n\n"
|
|
|
|
if GHM.USER.disk_usage is None:
|
|
disk_usage = LM.t("Used in GitHub's Storage") % "?"
|
|
print("Please add new github personal access token with user permission!")
|
|
else:
|
|
disk_usage = LM.t("Used in GitHub's Storage") % naturalsize(GHM.USER.disk_usage)
|
|
stats += f"> 📦 {disk_usage} \n > \n"
|
|
|
|
data = await DM.get_remote_json("github_stats")
|
|
if len(data["years"]) > 0:
|
|
contributions = LM.t('Contributions in the year') % (intcomma(data["years"][0]['total']), data["years"][0]['year'])
|
|
stats += f"> 🏆 {contributions}\n > \n"
|
|
|
|
opted_to_hire = GHM.USER.hireable
|
|
if opted_to_hire:
|
|
stats += f"> 💼 {LM.t('Opted to Hire')}\n > \n"
|
|
else:
|
|
stats += f"> 🚫 {LM.t('Not Opted to Hire')}\n > \n"
|
|
|
|
public_repo = GHM.USER.public_repos
|
|
if public_repo != 1:
|
|
stats += f"> 📜 {LM.t('public repositories') % public_repo} \n > \n"
|
|
else:
|
|
stats += f"> 📜 {LM.t('public repository') % public_repo} \n > \n"
|
|
|
|
private_repo = GHM.USER.owned_private_repos if GHM.USER.owned_private_repos is not None else 0
|
|
if public_repo != 1:
|
|
stats += f"> 🔑 {LM.t('private repositories') % private_repo} \n > \n"
|
|
else:
|
|
stats += f"> 🔑 {LM.t('private repository') % private_repo} \n > \n"
|
|
|
|
return stats
|
|
|
|
|
|
async def get_stats() -> str:
|
|
"""
|
|
Gets API data and returns markdown progress
|
|
"""
|
|
stats = str()
|
|
repositories = await DM.get_remote_graphql("user_repository_list", username=GHM.USER.login, id=GHM.USER.node_id)
|
|
|
|
if EM.SHOW_LINES_OF_CODE or EM.SHOW_LOC_CHART:
|
|
loc, yearly_data = await get_yearly_data(repositories)
|
|
else:
|
|
loc, yearly_data = (None, dict())
|
|
|
|
if EM.SHOW_TOTAL_CODE_TIME:
|
|
data = await DM.get_remote_json("waka_all")
|
|
stats += f"}-{quote(str(data['data']['text']))}-blue)\n\n"
|
|
|
|
if EM.SHOW_PROFILE_VIEWS:
|
|
data = GHM.REPO.get_views_traffic(per="week")
|
|
stats += f")}-{data['count']}-blue)\n\n"
|
|
|
|
if EM.SHOW_LINES_OF_CODE:
|
|
total_loc = sum([yearly_data[y][q][d] for y in yearly_data.keys() for q in yearly_data[y].keys() for d in yearly_data[y][q].keys()])
|
|
data = f"{intword(total_loc)} {LM.t('Lines of code')}"
|
|
stats += f")}-{quote(data)}-blue)\n\n"
|
|
|
|
if EM.SHOW_SHORT_INFO:
|
|
stats += await get_short_github_info()
|
|
|
|
stats += await get_waka_time_stats()
|
|
|
|
if EM.SHOW_LANGUAGE_PER_REPO:
|
|
stats += f"{make_language_per_repo_list(repositories)}\n\n"
|
|
|
|
if EM.SHOW_LOC_CHART:
|
|
await loc.plotLoc(yearly_data)
|
|
chart_path = f"{GHM.USER.login}/{GHM.USER.login}/{GHM.branch()}/{LinesOfCode.GRAPH_PATH}"
|
|
stats += '**' + LM.t('Timeline') + '**\n\n'
|
|
stats += f"\n\n"
|
|
|
|
if EM.SHOW_UPDATED_DATE:
|
|
stats += f"\n Last Updated on {datetime.now().strftime(EM.UPDATED_DATE_FORMAT)} UTC"
|
|
|
|
return stats
|
|
|
|
|
|
async def main():
|
|
init_github_manager()
|
|
await init_download_manager()
|
|
init_localization_manager()
|
|
|
|
if GHM.update_readme(await get_stats()):
|
|
print("Readme updated!")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
start_time = datetime.now()
|
|
run(main())
|
|
run_delta = datetime.now() - start_time
|
|
print(f"Program processed in {precisedelta(run_delta, minimum_unit='microseconds')}.")
|
|
|
|
# TODO: check function and variable naming
|
|
# TODO: check type hints
|
|
# TODO: sorted to max / min
|
|
# TODO: add 1 to repo count
|
|
# TODO: drop not awaited coroutines
|