Compare commits
30 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
67a3568c75 | ||
|
580f6d4639 | ||
|
fd7a6214c1 | ||
|
c487876563 | ||
|
744bf5ae56 | ||
|
0edb69508c | ||
|
5f04a7c728 | ||
|
610c67b096 | ||
|
15c5dbcc49 | ||
|
96f680b05f | ||
|
49b64c7be8 | ||
|
0cf0773d1c | ||
|
d0c5208665 | ||
|
b1a69733c8 | ||
|
02b84ff4ca | ||
|
91dec6e35d | ||
|
1b5b63412c | ||
|
8d201a6313 | ||
|
c6628c271b | ||
|
4d999ae477 | ||
|
b9ef50f20a | ||
|
0dc06a87bd | ||
|
7563a7a8ed | ||
|
b5c7fff8c3 | ||
|
d11a3bdb64 | ||
|
96d2a79378 | ||
|
7d189fc98d | ||
|
e3100077b1 | ||
|
79d91bc512 | ||
![]() |
4e3dc0a20a |
121
README.md
121
README.md
@@ -1,58 +1,95 @@
|
||||
# Dev Metrics in Readme
|
||||
|
||||
[Wakatime](https://wakatime.com) Weekly Metrics on your Profile Readme:
|
||||

|
||||
|
||||
----
|
||||
|
||||
[WakaTime](https://wakatime.com) Weekly Metrics on your Profile Readme:
|
||||
|
||||
## Prep Work
|
||||
|
||||
1. You need to update the markdown file(.md) with 2 comments. You can refer [here](#update-your-readme) for updating it.
|
||||
2. You'll need a WakaTime API Key. You can get that from your WakaTime Account Settings
|
||||
- You can refer [here](#new-to-wakatime), if you're new to WakaTime
|
||||
3. **Optional** You'll need a GitHub API Token with `repo` scope from [here](https://github.com/settings/tokens) if you're running the action not in your Profile Repository
|
||||
- You can use [this](#other-repository-not-profile) example to work it out
|
||||
4. You need to save the WakaTime API Key (and the GitHub API Token, if you need it) in the repository secrets. You can find that in the Settings of your Repository.Be sure to save those as the following.
|
||||
- WakaTime-api-key as `WAKATIME_API_KEY = <your wakatime API Key>`and
|
||||
- The GitHub Access Token as `GH_TOKEN=<your github access token>`
|
||||
5. You can follow either of the Two Examples according to your needs to get started with.
|
||||
|
||||
> I strongly suggest you to run the Action in your Profile Repo since you won't be needing a GitHub Access Token
|
||||
|
||||
This Action will run everyday at 00.00 UTC
|
||||
|
||||
## Update your Readme
|
||||
|
||||
Add a comment to your README like the follows
|
||||
Add a comment to your `README.md` like this:
|
||||
|
||||
```md
|
||||
<!--START_SECTION:waka-->
|
||||
<!--END_SECTION:waka-->
|
||||
```
|
||||
|
||||
The lines will be our entrypoints for our metrics.
|
||||
These lines will be our entry-points for the dev metrics.
|
||||
|
||||
## Using it
|
||||
## New to WakaTime
|
||||
|
||||
- Get your Wakatime API Key from your [Account Settings in Wakatime](https://wakatime.com/settings/account) and save it as `WAKATIME_API_KEY = <your wakatime API Key>` in your Repository Secrets
|
||||
WakaTime gives you an idea of the time you really spent on coding. This helps you boost your productivity and competitive edge.
|
||||
|
||||
That's it. The Action runs everyday at 00.00 UTC
|
||||
- Head over to <https://wakatime.com> and create an account.
|
||||
- Get your WakaTime API Key from your [Account Settings in WakaTime](https://wakatime.com/settings/account).
|
||||
- Install the [WakaTime plugin](https://wakatime.com/plugins) in your favourite editor / IDE.
|
||||
- Paste in your API key to start the analysis.
|
||||
|
||||
### Profile Repository
|
||||
|
||||
If you're executing the workflow on your Profile Repository (`<username>/<username>`)
|
||||
*If you're executing the workflow on your Profile Repository (`<username>/<username>`)*
|
||||
|
||||
**You wouldn't need an GitHub Access Token since GitHub Actions already makes one for you.**
|
||||
> You wouldn't need an GitHub Access Token since GitHub Actions already makes one for you.
|
||||
|
||||
Here is a sample workflow file for you to get started,
|
||||
Please follow the steps below:
|
||||
|
||||
```yml
|
||||
name: Waka Readme
|
||||
1. Go to your `<username>/<username>/actions`, hit `New workflow`, `set up a workflow yourself`, delete all the default content github made for you.
|
||||
2. Copy the following code and paste it to your new workflow you created at step 1:
|
||||
```yml
|
||||
name: Waka Readme
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Runs at 12am UTC
|
||||
- cron: '0 0 * * *'
|
||||
on:
|
||||
workflow_dispatch
|
||||
schedule:
|
||||
# Runs at 12am UTC
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
update-readme:
|
||||
name: Update this repo's README
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: athul/waka-readme@master
|
||||
with:
|
||||
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
||||
```
|
||||
jobs:
|
||||
update-readme:
|
||||
name: Update this repo's README
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: athul/waka-readme@master
|
||||
with:
|
||||
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
||||
```
|
||||
3. Go to your repo secrets by hitting `Settings => Secrets` tab in your profile repo. You can also enter the url https://github.com/USERNAME/USERNAME/settings/secrets . Please replace the `USERNAME` with your own username.
|
||||
4. Create a new `Secret`. `Name`: `WAKATIME_API_KEY`, `Value`: Paste the Wakatime API key here. If you don't know what is the key, please go to [Account Settings in WakaTime](https://wakatime.com/settings/account) to find your API Key there.
|
||||
5. Add a comment to your `README.md` like this:
|
||||
|
||||
### Different Repository than Profile Repository
|
||||
```md
|
||||
<!--START_SECTION:waka-->
|
||||
<!--END_SECTION:waka-->
|
||||
```
|
||||
6. Go to Workflows menu (mentioned in step 1), click `Waka Readme`, click `Run workflow`.
|
||||
7. Go to your profile page. you will be able to see it.
|
||||
|
||||
if you're executing the workflow on another repo other than `<username>/<username>`
|
||||
### Other Repository (not Profile)
|
||||
|
||||
- You'll need to get a GitHub Access Token with a `repo` scope and save it in the Repo Secrets `GH_TOKEN = <Your GitHub Access Token>`
|
||||
|
||||
Here is Sample Worflow File for running it
|
||||
|
||||
*If you're executing the workflow on another repo other than `<username>/<username>`*
|
||||
|
||||
You'll need to get a [GitHub Access Token](https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) with a `repo` scope and save it in the Repo Secrets `GH_TOKEN = <Your GitHub Access Token>`
|
||||
|
||||
Here is Sample Workflow File for running it:
|
||||
|
||||
```yml
|
||||
name: Waka Readme
|
||||
@@ -70,6 +107,30 @@ jobs:
|
||||
- uses: athul/waka-readme@master
|
||||
with:
|
||||
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
||||
GH_TOKEN: ${{ secrets.GH_TOKEN}}
|
||||
USERNAME: <username> # optional, it will automaticially use the username that executing the workflow
|
||||
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
|
||||
|
||||
1. If you want to add the week in the Header of your stats, you can add `HEAD_FLAG: true` in your workflow file like this
|
||||
|
||||
```yml
|
||||
- uses: athul/waka-readme@master
|
||||
with:
|
||||
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
||||
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
USERNAME: <username>
|
||||
SHOW_TITLE: true
|
||||
```
|
||||
|
||||
`SHOW_TITLE` flag can be set to true if you want to display the week number and days in the readme, by default it will be false. Here is an example output with `SHOW_TITLE` set to true.
|
||||
|
||||
```text
|
||||
Week: 10 July, 2020 - 17 July, 2020
|
||||
Python 8 hrs 52 mins ███████████████████░░░░░░ 75.87 %
|
||||
Go 1 hr 15 mins ██░░░░░░░░░░░░░░░░░░░░░░░ 10.79 %
|
||||
Markdown 52 mins █░░░░░░░░░░░░░░░░░░░░░░░░ 07.43 %
|
||||
Docker 16 mins ░░░░░░░░░░░░░░░░░░░░░░░░░ 02.32 %
|
||||
YAML 7 mins ░░░░░░░░░░░░░░░░░░░░░░░░░ 01.07 %
|
||||
```
|
||||
|
@@ -15,6 +15,12 @@ inputs:
|
||||
USERNAME:
|
||||
description: 'Your GitHub username'
|
||||
default: ${{ github.repository_owner }}
|
||||
required: false
|
||||
|
||||
SHOW_TITLE:
|
||||
description: "Displays the week number and days in Readme as title"
|
||||
default: false
|
||||
required: false
|
||||
|
||||
|
||||
runs:
|
||||
|
109
main.py
109
main.py
@@ -1,58 +1,97 @@
|
||||
import base64
|
||||
import requests
|
||||
'''
|
||||
WakaTime progress visualizer
|
||||
'''
|
||||
|
||||
import re
|
||||
import os
|
||||
from github import Github
|
||||
import base64
|
||||
import sys
|
||||
import datetime
|
||||
import requests
|
||||
from github import Github, GithubException
|
||||
|
||||
START_COMMENT = '<!--START_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")
|
||||
ghtoken = os.getenv("INPUT_GH_TOKEN")
|
||||
user = os.getenv('INPUT_USERNAME')
|
||||
waka_key = os.getenv('INPUT_WAKATIME_API_KEY')
|
||||
ghtoken = os.getenv('INPUT_GH_TOKEN')
|
||||
show_title = os.getenv("INPUT_SHOW_TITLE")
|
||||
|
||||
|
||||
def makeGraph(percent: float):
|
||||
done_block = "█"
|
||||
empty_block = "░"
|
||||
def this_week() -> str:
|
||||
'''Returns a week streak'''
|
||||
week_end = datetime.datetime.today() - datetime.timedelta(days=1)
|
||||
week_start = week_end - datetime.timedelta(days=7)
|
||||
print("Week header created")
|
||||
return f"Week: {week_start.strftime('%d %B, %Y')} - {week_end.strftime('%d %B, %Y')}"
|
||||
|
||||
|
||||
def make_graph(percent: float) -> str:
|
||||
'''Make progress graph from API graph'''
|
||||
done_block = '█'
|
||||
empty_block = '░'
|
||||
pc_rnd = round(percent)
|
||||
return (f'{done_block*int(pc_rnd/4)}{empty_block*int( 25-int(pc_rnd/4))}')
|
||||
return f"{done_block*int(pc_rnd/4)}{empty_block*int(25-int(pc_rnd/4))}"
|
||||
|
||||
|
||||
def getStats():
|
||||
def get_stats() -> str:
|
||||
'''Gets API data and returns markdown progress'''
|
||||
data = requests.get(
|
||||
f"https://wakatime.com/api/v1/users/current/stats/last_7_days?api_key={waka_key}").json()
|
||||
lang_data = data['data']['languages']
|
||||
try:
|
||||
lang_data = data['data']['languages']
|
||||
except KeyError:
|
||||
print("Please Add your WakaTime API Key to the Repository Secrets")
|
||||
sys.exit(1)
|
||||
|
||||
data_list = []
|
||||
for l in lang_data[:5]:
|
||||
ln = len(l['name'])
|
||||
ln_text = len(l['text'])
|
||||
op = f"{l['name']}{' '*(12-ln)}{l['text']}{' '*(20-ln_text)}{makeGraph(l['percent'])} {l['percent']}"
|
||||
data_list.append(op)
|
||||
data = " \n".join(data_list)
|
||||
return ("```text\n"+data+"\n```")
|
||||
try:
|
||||
pad = len(max([l['name'] for l in lang_data[:5]], key=len))
|
||||
except ValueError:
|
||||
print("The Data seems to be empty. Please wait for a day for the data to be filled in.")
|
||||
return '```text\nNo Activity tracked this Week\n```'
|
||||
for lang in lang_data[:5]:
|
||||
lth = len(lang['name'])
|
||||
ln_text = len(lang['text'])
|
||||
# following line provides a neat finish
|
||||
fmt_percent = format(lang['percent'], '0.2f').zfill(5)
|
||||
data_list.append(
|
||||
f"{lang['name']}{' '*(pad + 3 - lth)}{lang['text']}{' '*(16 - ln_text)}{make_graph(lang['percent'])} {fmt_percent} %")
|
||||
print("Graph Generated")
|
||||
data = ' \n'.join(data_list)
|
||||
if show_title == 'true':
|
||||
print("Stats with Weeks in Title Generated")
|
||||
return '```text\n'+this_week()+'\n\n'+data+'\n```'
|
||||
else:
|
||||
print("Usual Stats Generated")
|
||||
return '```text\n'+data+'\n```'
|
||||
|
||||
|
||||
def decodeReadme(data: str):
|
||||
decodedBytes = base64.b64decode(data)
|
||||
decodedStr = str(decodedBytes, "utf-8")
|
||||
return decodedStr
|
||||
def decode_readme(data: str) -> str:
|
||||
'''Decode the contets of old readme'''
|
||||
decoded_bytes = base64.b64decode(data)
|
||||
return str(decoded_bytes, 'utf-8')
|
||||
|
||||
|
||||
def generatenewReadme(stats: str, readme: str):
|
||||
statsinReadme = f"{START_COMMENT}\n{stats}\n{END_COMMENT}"
|
||||
newReadme = re.sub(listReg, statsinReadme, readme)
|
||||
return newReadme
|
||||
def generate_new_readme(stats: str, readme: str) -> str:
|
||||
'''Generate a new Readme.md'''
|
||||
stats_in_readme = f"{START_COMMENT}\n{stats}\n{END_COMMENT}"
|
||||
return re.sub(listReg, stats_in_readme, readme)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
g = Github(ghtoken)
|
||||
repo = g.get_repo(f"{user}/{user}")
|
||||
try:
|
||||
repo = g.get_repo(f"{user}/{user}")
|
||||
except GithubException:
|
||||
print("Authentication Error. Try saving a GitHub Token in your Repo Secrets or Use the GitHub Actions Token, which is automatically used by the action.")
|
||||
sys.exit(1)
|
||||
contents = repo.get_readme()
|
||||
stats = getStats()
|
||||
rdmd = decodeReadme(contents.content)
|
||||
newreadme = generatenewReadme(stats=stats, readme=rdmd)
|
||||
if newreadme != rdmd:
|
||||
repo.update_file(path=contents.path, message="Updated with Dev Metrics",
|
||||
content=newreadme, sha=contents.sha, branch="master")
|
||||
waka_stats = get_stats()
|
||||
rdmd = decode_readme(contents.content)
|
||||
new_readme = generate_new_readme(stats=waka_stats, readme=rdmd)
|
||||
if new_readme != rdmd:
|
||||
repo.update_file(path=contents.path, message='Updated with Dev Metrics',
|
||||
content=new_readme, sha=contents.sha, branch='master')
|
||||
|
Reference in New Issue
Block a user