generated files moved to 'assets' dir, graph drawing fixed

This commit is contained in:
pseusys
2023-02-17 00:38:26 +01:00
parent c9905b51b1
commit 52318d9afe
5 changed files with 79 additions and 82 deletions

7
.gitignore vendored
View File

@@ -2,19 +2,14 @@
*.env *.env
# Generated graph images: # Generated graph images:
*.png assets/
# Library roots: # Library roots:
node_modules/
venv/ venv/
# Python caches: # Python caches:
__pycache__/ __pycache__/
# Package manager configuration files:
package.json
package-lock.json
# IDE configuration files: # IDE configuration files:
.vscode .vscode
.idea .idea

View File

@@ -31,13 +31,14 @@ run-locally: venv
run-container: run-container:
@ # Run action in container @ # Run action in container
docker build -t waka-readme-stats -f Dockerfile . docker build -t waka-readme-stats -f Dockerfile .
docker run --env-file $(ENV) waka-readme-stats docker run --env-file $(ENV) -v ./assets/:/waka-readme-stats/assets/ waka-readme-stats
.PHONY: run-container .PHONY: run-container
clean: clean:
@ # Clean all build files, including: libraries, package manager configs, docker images and containers @ # Clean all build files, including: libraries, package manager configs, docker images and containers
rm -rf venv rm -rf venv
rm -rf assets
rm -f package*.json rm -f package*.json
docker rm -f waka-readme-stats 2>/dev/null || true docker rm -f waka-readme-stats 2>/dev/null || true
docker rmi $(docker images | grep "waka-readme-stats") 2> /dev/null || true docker rmi $(docker images | grep "waka-readme-stats") 2> /dev/null || true

View File

@@ -1,6 +1,4 @@
from typing import Dict from typing import Dict
from os.path import join, dirname
from json import load
import numpy as np import numpy as np
import matplotlib.patches as mpatches import matplotlib.patches as mpatches
@@ -12,28 +10,31 @@ from download_manager import DownloadManager
MAX_LANGUAGES = 5 MAX_LANGUAGES = 5
async def build_graph(yearly_data: Dict) -> str: async def create_loc_graph(yearly_data: Dict, save_path: str):
""" """
Draws graph of lines of code written by user by quarters of years. Draws graph of lines of code written by user by quarters of years.
Picks top `MAX_LANGUAGES` languages from each quarter only. Picks top `MAX_LANGUAGES` languages from each quarter only.
:param yearly_data: GitHub user yearly data. :param yearly_data: GitHub user yearly data.
:return: String, path to graph file. :param save_path: Path to save the graph file.
""" """
colors = await DownloadManager.get_remote_yaml("linguist") colors = await DownloadManager.get_remote_yaml("linguist")
languages_all_loc = dict()
years = len(yearly_data.keys()) years = len(yearly_data.keys())
year_indexes = np.arange(years) year_indexes = np.arange(years)
for i, y in enumerate(sorted(yearly_data.keys())): all_languages = dict()
for q in yearly_data[y].keys(): for year in yearly_data.values():
langs = sorted(yearly_data[y][q].keys(), key=lambda l: yearly_data[y][q][l], reverse=True)[0:MAX_LANGUAGES] for quarter in year.values():
for language, loc in quarter.items():
all_languages[language] = all_languages.get(language, 0) + loc
for lang in langs: top_languages_names = sorted(all_languages.keys(), key=lambda l: all_languages[l], reverse=True)[0:MAX_LANGUAGES]
if lang not in languages_all_loc: top_languages = {language: np.array([[0] * years] * 4) for language in top_languages_names}
languages_all_loc[lang] = np.array([[0] * years] * 4) for index, year in enumerate(sorted(yearly_data.keys())):
languages_all_loc[lang][q - 1][i] = yearly_data[y][q][lang] for quarter, languages in yearly_data[year].items():
for language, loc in {(lang, loc) for lang, loc in languages.items() if lang in top_languages}:
top_languages[language][quarter - 1][index] = yearly_data[year][quarter][language]
fig = plt.figure() fig = plt.figure()
ax = fig.add_axes([0, 0, 1.5, 1]) ax = fig.add_axes([0, 0, 1.5, 1])
@@ -41,7 +42,7 @@ async def build_graph(yearly_data: Dict) -> str:
language_handles = [] language_handles = []
cumulative = np.array([[0] * years] * 4) cumulative = np.array([[0] * years] * 4)
for key, value in languages_all_loc.items(): for key, value in top_languages.items():
color = colors[key]["color"] if colors[key]["color"] is not None else "w" color = colors[key]["color"] if colors[key]["color"] is not None else "w"
language_handles += [mpatches.Patch(color=color, label=key)] language_handles += [mpatches.Patch(color=color, label=key)]
@@ -64,6 +65,5 @@ async def build_graph(yearly_data: Dict) -> str:
ax.spines["right"].set_visible(False) ax.spines["right"].set_visible(False)
plt.ylim(0, 1.05 * np.amax(cumulative)) plt.ylim(0, 1.05 * np.amax(cumulative))
plt.savefig("bar_graph.png", bbox_inches="tight") plt.savefig(save_path, bbox_inches="tight")
plt.close(fig) plt.close(fig)
return "bar_graph.png"

View File

@@ -5,10 +5,11 @@ from github import Github, InputGitAuthor, AuthenticatedUser
import datetime import datetime
from download_manager import DownloadManager from download_manager import DownloadManager
from make_bar_graph import build_graph from graph_drawer import create_loc_graph
class LinesOfCode: class LinesOfCode:
GRAPH_PATH = "assets/bar_graph.png"
def __init__(self, user: AuthenticatedUser, ghtoken, repositoryData, ignored_repos): def __init__(self, user: AuthenticatedUser, ghtoken, repositoryData, ignored_repos):
self.g = Github(ghtoken) self.g = Github(ghtoken)
@@ -28,7 +29,7 @@ class LinesOfCode:
return yearly_data return yearly_data
async def plotLoc(self, yearly_data): async def plotLoc(self, yearly_data):
await build_graph(yearly_data) await create_loc_graph(yearly_data, LinesOfCode.GRAPH_PATH)
self.pushChart() self.pushChart()
def getQuarter(self, timeStamp): def getQuarter(self, timeStamp):
@@ -67,10 +68,10 @@ class LinesOfCode:
def pushChart(self): def pushChart(self):
repo = self.g.get_repo(f"{self.user.login}/{self.user.login}") repo = self.g.get_repo(f"{self.user.login}/{self.user.login}")
committer = InputGitAuthor('readme-bot', '41898282+github-actions[bot]@users.noreply.github.com') committer = InputGitAuthor('readme-bot', '41898282+github-actions[bot]@users.noreply.github.com')
with open('bar_graph.png', 'rb') as input_file: with open(LinesOfCode.GRAPH_PATH, 'rb') as input_file:
data = input_file.read() data = input_file.read()
try: try:
contents = repo.get_contents("charts/bar_graph.png") contents = repo.get_contents(LinesOfCode.GRAPH_PATH)
repo.update_file(contents.path, "Charts Updated", data, contents.sha, committer=committer) repo.update_file(contents.path, "Charts Updated", data, contents.sha, committer=committer)
except Exception as e: except Exception as e:
repo.create_file("charts/bar_graph.png", "Charts Added", data, committer=committer) repo.create_file(LinesOfCode.GRAPH_PATH, "Charts Added", data, committer=committer)

View File

@@ -383,7 +383,7 @@ async def get_stats(github) -> str:
if showLocChart.lower() in truthy: if showLocChart.lower() in truthy:
stats += '**' + translate['Timeline'] + '**\n\n' stats += '**' + translate['Timeline'] + '**\n\n'
branch_name = github.get_repo(f'{user.login}/{user.login}').default_branch branch_name = github.get_repo(f'{user.login}/{user.login}').default_branch
stats = stats + '![Chart not found](https://raw.githubusercontent.com/' + user.login + '/' + user.login + '/' + branch_name + '/charts/bar_graph.png) \n\n' stats = stats + '![Chart not found](https://raw.githubusercontent.com/' + user.login + '/' + user.login + '/' + branch_name + '/' + LinesOfCode.GRAPH_PATH + ') \n\n'
if show_updated_date.lower() in truthy: if show_updated_date.lower() in truthy:
now = datetime.datetime.utcnow() now = datetime.datetime.utcnow()