Merge branch 'Alpha' into master

This commit is contained in:
Anmol Pratap Singh
2020-07-28 14:44:52 +05:30
committed by GitHub
5 changed files with 188 additions and 134 deletions

View File

@@ -94,23 +94,27 @@ jobs:
with: with:
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }} WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
GH_TOKEN: ${{ secrets.GH_TOKEN }} GH_TOKEN: ${{ secrets.GH_TOKEN }}
USERNAME: <username> # optional, it will automatically use the username of the owner of the repository who's executing the workflow.
``` ```
## Extras ## Extras
1. If you want to add the other info to your stats, you can add multiple `FLAGS` in your workflow file by default all flags are enabled 1. If you want to add the other info to your stats, you can add multiple `FLAGS` in your workflow file by default all flags are enabled
>except the lines of code flag due to heavy operation performed
```yml ```yml
- uses: anmol098/waka-readme-stats@master - uses: anmol098/waka-readme-stats@master
with: with:
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }} WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
GH_TOKEN: ${{ secrets.GH_TOKEN }} GH_TOKEN: ${{ secrets.GH_TOKEN }}
USERNAME: <username>
SHOW_OS: "False" SHOW_OS: "False"
SHOW_PROJECTS: "False" SHOW_PROJECTS: "False"
``` ```
#### Flags Available #### Flags Available
`SHOW_LINES_OF_CODE` flag can be set to `True` to show the Lines of code writen till date
![Lines of code](https://img.shields.io/badge/From%20Hello%20World%20I've%20written-12,66,814%20Lines%20of%20code-blue)
`SHOW_COMMIT` flag can be set to `False` to hide the commit stats `SHOW_COMMIT` flag can be set to `False` to hide the commit stats
**I'm an early 🐤** **I'm an early 🐤**
@@ -120,6 +124,18 @@ jobs:
🌃 Evening 112 commits █████████░░░░░░░░░░░░░░░░ 36.01% 🌃 Evening 112 commits █████████░░░░░░░░░░░░░░░░ 36.01%
🌙 Night 26 commits ██░░░░░░░░░░░░░░░░░░░░░░░ 8.36% 🌙 Night 26 commits ██░░░░░░░░░░░░░░░░░░░░░░░ 8.36%
```
📅 **I'm Most Productive on Sundays**
```text
Monday 50 commits ███░░░░░░░░░░░░░░░░░░░░░░ 13.19%
Tuesday 85 commits █████░░░░░░░░░░░░░░░░░░░░ 22.43%
Wednesday 56 commits ███░░░░░░░░░░░░░░░░░░░░░░ 14.78%
Thursday 44 commits ███░░░░░░░░░░░░░░░░░░░░░░ 11.61%
Friday 28 commits █░░░░░░░░░░░░░░░░░░░░░░░░ 7.39%
Saturday 30 commits ██░░░░░░░░░░░░░░░░░░░░░░░ 7.92%
Sunday 86 commits █████░░░░░░░░░░░░░░░░░░░░ 22.69%
``` ```
`SHOW_LANGUAGE` flag can be set to `False` to hide the Coding Language You use `SHOW_LANGUAGE` flag can be set to `False` to hide the Coding Language You use
@@ -167,6 +183,27 @@ PhpStorm 1 hr 35 mins ████░░░░░░░
PyCharm 23 mins █░░░░░░░░░░░░░░░░░░░░░░░░ 4.49% PyCharm 23 mins █░░░░░░░░░░░░░░░░░░░░░░░░ 4.49%
``` ```
## :sparkling_heart: Support the project
I open-source almost everything I can, and I try to reply to everyone needing help using these projects. Obviously,
this takes time. You can use this service for free.
However, if you are using this project and happy with it or just want to encourage me to continue creating stuff, there are few ways you can do it :-
- Giving proper credit when you use this action on your readme, linking back to it :D
- Starring and sharing the project :rocket:
- [![paypal.me/aapreneur](https://ionicabizau.github.io/badges/paypal.svg)](https://www.paypal.me/aapreneur) - You can make one-time donations via PayPal. I'll probably buy a ~~beer~~ wine 🍷
Thanks! :heart:
---
Contributions are welcomed! ♥
Made with :heart: and Python 🐍.
> This project is inspired by an awesome pinned-gist project [Awesome Pinned Gists](https://github.com/matchai/awesome-pinned-gists) <br/> > This project is inspired by an awesome pinned-gist project [Awesome Pinned Gists](https://github.com/matchai/awesome-pinned-gists) <br/>
>This project is inspired from [athul/waka-readme](https://github.com/athul/waka-readme) >This project is inspired from [athul/waka-readme](https://github.com/athul/waka-readme)

View File

@@ -47,6 +47,20 @@ inputs:
description: "Show the Coding language used in dev metrics" description: "Show the Coding language used in dev metrics"
default: "True" default: "True"
SHOW_LINES_OF_CODE:
required: false
description: "Show the Total Lines of code written Badge till date"
default: "False"
SHOW_LANGUAGE_PER_REPO:
required: false
description: ""
default: "True"
SHOW_LOC_CHART:
required: false
description: ""
default: "True"

102
loc.py
View File

@@ -6,7 +6,7 @@ from github import Github
import datetime import datetime
from string import Template from string import Template
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from io import StringIO,BytesIO from io import StringIO, BytesIO
from dotenv import load_dotenv from dotenv import load_dotenv
import time import time
@@ -15,70 +15,70 @@ from make_bar_graph import BarGraph
class LinesOfCode: class LinesOfCode:
def __init__(self,id,username,ghtoken, repositoryData): def __init__(self, id, username, ghtoken, repositoryData):
self.id=id self.id = id
self.username=username self.username = username
self.g = Github(ghtoken) self.g = Github(ghtoken)
self.headers = {"Authorization": "Bearer " + ghtoken} self.headers = {"Authorization": "Bearer " + ghtoken}
self.repositoryData=repositoryData self.repositoryData = repositoryData
def calculateLoc(self): def calculateLoc(self):
result=self.repositoryData result = self.repositoryData
yearly_data={} yearly_data = {}
for repo in result['data']['user']['repositories']['edges']: for repo in result['data']['user']['repositories']['edges']:
print(repo) print(repo)
self.getCommitStat(repo['node'],yearly_data) self.getCommitStat(repo['node'], yearly_data)
time.sleep(0.7) time.sleep(0.7)
print("\n\n") print("\n\n")
print(yearly_data) print(yearly_data)
graph=BarGraph(yearly_data) print("here")
graph_file=graph.build_graph() graph = BarGraph(yearly_data)
graph_file = graph.build_graph()
self.pushChart() self.pushChart()
def run_query_v3(self,nameWithOwner): def run_query_v3(self, nameWithOwner):
endPoint='https://api.github.com/repos/'+nameWithOwner+'/stats/code_frequency' endPoint = 'https://api.github.com/repos/' + nameWithOwner + '/stats/code_frequency'
# print(endPoint) # print(endPoint)
request = requests.get(endPoint, headers=self.headers) request = requests.get(endPoint, headers=self.headers)
if request.status_code == 401: if request.status_code == 401:
raise Exception("Invalid token {}. {}".format(request.status_code, nameWithOwner)) raise Exception("Invalid token {}. {}".format(request.status_code, nameWithOwner))
return request.json() return request.json()
def getQuarter(self,timeStamp): def getQuarter(self, timeStamp):
month=datetime.datetime.fromtimestamp(timeStamp).month month = datetime.datetime.fromtimestamp(timeStamp).month
if month>=1 and month<=4: if month >= 1 and month <= 4:
return 1 return 1
elif month>=5 and month<=8: elif month >= 5 and month <= 8:
return 2 return 2
elif month>=9 and month<=12: elif month >= 9 and month <= 12:
return 3 return 3
def getCommitStat(self,repoDetails,yearly_data): def getCommitStat(self, repoDetails, yearly_data):
result= self.run_query_v3(repoDetails['nameWithOwner']) result = self.run_query_v3(repoDetails['nameWithOwner'])
this_year=datetime.datetime.utcnow().year this_year = datetime.datetime.utcnow().year
for i in range(len(result)): for i in range(len(result)):
curr_year=datetime.datetime.fromtimestamp(result[i][0]).year curr_year = datetime.datetime.fromtimestamp(result[i][0]).year
# if curr_year != this_year: # if curr_year != this_year:
quarter=self.getQuarter(result[i][0]) quarter = self.getQuarter(result[i][0])
if repoDetails['primaryLanguage'] is not None: if repoDetails['primaryLanguage'] is not None:
if curr_year not in yearly_data: if curr_year not in yearly_data:
yearly_data[curr_year]={} yearly_data[curr_year] = {}
if quarter not in yearly_data[curr_year]: if quarter not in yearly_data[curr_year]:
yearly_data[curr_year][quarter]={} yearly_data[curr_year][quarter] = {}
if repoDetails['primaryLanguage']['name'] not in 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']] = 0
yearly_data[curr_year][quarter][repoDetails['primaryLanguage']['name']]+=(result[i][1]+result[i][2]) yearly_data[curr_year][quarter][repoDetails['primaryLanguage']['name']] += (result[i][1] + result[i][2])
#to find total # to find total
# if 'total' not in yearly_data[curr_year]: # if 'total' not in yearly_data[curr_year]:
# yearly_data[curr_year]['total']={} # yearly_data[curr_year]['total']={}
# if repoDetails['primaryLanguage']['name'] not in 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']]=0
# yearly_data[curr_year]['total'][repoDetails['primaryLanguage']['name']]+=(result[i][1]+result[i][2]) # yearly_data[curr_year]['total'][repoDetails['primaryLanguage']['name']]+=(result[i][1]+result[i][2])
def pushChart(self): def pushChart(self):
repo = self.g.get_repo(f"{self.username}/{self.username}") repo = self.g.get_repo(f"{self.username}/{self.username}")
@@ -88,13 +88,9 @@ class LinesOfCode:
contents = repo.get_contents("charts/bar_graph.png") contents = repo.get_contents("charts/bar_graph.png")
repo.update_file(contents.path, "Charts Added", data, contents.sha) repo.update_file(contents.path, "Charts Added", data, contents.sha)
except Exception as e: except Exception as e:
repo.create_file("charts/bar_graph.png", "Initial Commit",data) repo.create_file("charts/bar_graph.png", "Initial Commit", data)
print("pushed") print("pushed")
# if __name__ == '__main__': # if __name__ == '__main__':
# try: # try:
# g = Github(ghtoken) # g = Github(ghtoken)
@@ -103,7 +99,7 @@ class LinesOfCode:
# username = user_data["data"]["viewer"]["login"] # username = user_data["data"]["viewer"]["login"]
# id = user_data["data"]["viewer"]["id"] # id = user_data["data"]["viewer"]["id"]
# print("user {} id {}".format(username, id)) # print("user {} id {}".format(username, id))
# getLoc() # getLoc()
# # repo = g.get_repo(f"{username}/{username}") # # repo = g.get_repo(f"{username}/{username}")
@@ -117,4 +113,4 @@ class LinesOfCode:
# # content=new_readme, sha=contents.sha, branch='master') # # content=new_readme, sha=contents.sha, branch='master')
# # print("Readme updated") # # print("Readme updated")
# except Exception as e: # except Exception as e:
# print("Exception Occurred" + str(e)) # print("Exception Occurred" + str(e))

View File

@@ -93,7 +93,7 @@ def run_v3_api(query):
repositoryListQuery = Template(""" repositoryListQuery = Template("""
{ {
user(login: "$username") { user(login: "$username") {
repositories(orderBy: {field: CREATED_AT, direction: ASC}, last: 100, affiliations: [OWNER, COLLABORATOR, ORGANIZATION_MEMBER], isFork: false) { repositories(orderBy: {field: CREATED_AT, direction: ASC}, last: 5, affiliations: [OWNER, COLLABORATOR, ORGANIZATION_MEMBER], isFork: false) {
totalCount totalCount
edges { edges {
node { node {
@@ -280,6 +280,8 @@ def generate_commit_list(tz):
string = string + '📅 **' + days_title + '** \n\n' + '```text\n' + make_commit_list(dayOfWeek) + '\n\n```\n' string = string + '📅 **' + days_title + '** \n\n' + '```text\n' + make_commit_list(dayOfWeek) + '\n\n```\n'
return string return string
def get_waka_time_stats(): def get_waka_time_stats():
stats = '' stats = ''
request = requests.get( request = requests.get(

View File

@@ -2,106 +2,111 @@ import pandas as pd
import numpy as np import numpy as np
import altair as alt import altair as alt
import json import json
alt.data_transformers.enable('data_server_proxied')
# npm install vega-lite vega-cli canvas # npm install vega-lite vega-cli canvas
class BarGraph: class BarGraph:
def __init__(self, yearly_data): def __init__(self, yearly_data):
self.yearly_data=yearly_data self.yearly_data = yearly_data
def build_graph(self): def build_graph(self):
with open('colors.json') as f: with open('colors.json') as f:
colors = json.load(f) colors = json.load(f)
allColorsValues=[] allColorsValues = []
#filter data # filter data
max_languages=5 max_languages = 5
top_languages={} top_languages = {}
for year in self.yearly_data.keys(): for year in self.yearly_data.keys():
for quarter in self.yearly_data[year].keys(): for quarter in self.yearly_data[year].keys():
for language in sorted(list(self.yearly_data[year][quarter].keys()), key=lambda lang:self.yearly_data[year][quarter][lang], reverse=True)[0:max_languages]: for language in sorted(list(self.yearly_data[year][quarter].keys()),
if 'top' not in self.yearly_data[year][quarter]: key=lambda lang: self.yearly_data[year][quarter][lang], reverse=True)[
self.yearly_data[year][quarter]['top']={} 0:max_languages]:
if self.yearly_data[year][quarter][language]!=0: if 'top' not in self.yearly_data[year][quarter]:
self.yearly_data[year][quarter]['top'][language]=self.yearly_data[year][quarter][language] self.yearly_data[year][quarter]['top'] = {}
if self.yearly_data[year][quarter][language] != 0:
if language not in top_languages: self.yearly_data[year][quarter]['top'][language] = self.yearly_data[year][quarter][language]
top_languages[language] =1
top_languages[language]+=1
# print(self.yearly_data) if language not in top_languages:
top_languages[language] = 1
top_languages[language] += 1
all_languages=list(top_languages.keys()) print("here")
print(self.yearly_data)
for language in all_languages: all_languages = list(top_languages.keys())
if colors[language]['color'] is not None:
allColorsValues.append(colors[language]['color'])
languages_all_loc={} for language in all_languages:
if colors[language]['color'] is not None:
allColorsValues.append(colors[language]['color'])
for language in all_languages: languages_all_loc = {}
language_year=[]
for year in self.yearly_data.keys():
language_quarter=[0,0,0]
for quarter in self.yearly_data[year].keys():
if language in self.yearly_data[year][quarter]['top']:
language_quarter[quarter-1]=self.yearly_data[year][quarter]['top'][language]
else:
language_quarter[quarter-1]=0
language_year.append(language_quarter)
languages_all_loc[language]=language_year
print(languages_all_loc) for language in all_languages:
language_year = []
for year in self.yearly_data.keys():
language_quarter = [0, 0, 0]
for quarter in self.yearly_data[year].keys():
if language in self.yearly_data[year][quarter]['top']:
language_quarter[quarter - 1] = self.yearly_data[year][quarter]['top'][language]
else:
language_quarter[quarter - 1] = 0
language_year.append(language_quarter)
languages_all_loc[language] = language_year
language_df={} print("here 2")
print(languages_all_loc)
def prep_df(df, name): language_df = {}
df = df.stack().reset_index()
df.columns = ['c1', 'c2', 'values']
df['Language'] = name
return df
for language in languages_all_loc.keys(): def prep_df(df, name):
language_df[language]=pd.DataFrame(languages_all_loc[language],index=list(self.yearly_data.keys()),columns=["Q1","Q2","Q3"]) df = df.stack().reset_index()
df.columns = ['c1', 'c2', 'values']
df['Language'] = name
return df
for language in language_df.keys(): for language in languages_all_loc.keys():
language_df[language]=prep_df(language_df[language], language) language_df[language] = pd.DataFrame(languages_all_loc[language], index=list(self.yearly_data.keys()),
columns=["Q1", "Q2", "Q3"])
for language in language_df.keys():
language_df[language] = prep_df(language_df[language], language)
df = pd.concat(list(language_df.values()))
df=pd.concat(list(language_df.values())) # print(df)
chart = alt.Chart(df).mark_bar().encode(
# print(df) # tell Altair which field to group columns on
x=alt.X('c2:N', title=None),
# tell Altair which field to use as Y values and how to calculate
y=alt.Y('sum(values):Q',
axis=alt.Axis(
grid=False,
title='LOC added')),
chart=alt.Chart(df).mark_bar().encode( # tell Altair which field to use to use as the set of columns to be represented in each group
column=alt.Column('c1:N', title=None),
# tell Altair which field to group columns on # tell Altair which field to use for color segmentation
x=alt.X('c2:N', title=None), color=alt.Color('Language:N',
scale=alt.Scale(
# tell Altair which field to use as Y values and how to calculate domain=all_languages,
y=alt.Y('sum(values):Q', # make it look pretty with an enjoyable color pallet
axis=alt.Axis( range=allColorsValues,
grid=False, ),
title='LOC added')), )) \
.configure_view(
# tell Altair which field to use to use as the set of columns to be represented in each group # remove grid lines around column clusters
column=alt.Column('c1:N', title=None), strokeOpacity=0
)
# tell Altair which field to use for color segmentation chart.save('bar_graph.png')
color=alt.Color('Language:N', return 'bar_graph.png'
scale=alt.Scale(
domain=all_languages,
# make it look pretty with an enjoyable color pallet
range=allColorsValues,
),
))\
.configure_view(
# remove grid lines around column clusters
strokeOpacity=0
)
chart.save('bar_graph.png')
return 'bar_graph.png'