Compare commits
26 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
91dec6e35d | ||
|
1b5b63412c | ||
|
8d201a6313 | ||
|
c6628c271b | ||
|
4d999ae477 | ||
|
b9ef50f20a | ||
|
0dc06a87bd | ||
|
7563a7a8ed | ||
|
b5c7fff8c3 | ||
|
d11a3bdb64 | ||
|
96d2a79378 | ||
|
7d189fc98d | ||
|
e3100077b1 | ||
|
79d91bc512 | ||
![]() |
4e3dc0a20a | ||
|
8ac60ed14f | ||
|
9ea8300262 | ||
|
702a9a9e8e | ||
|
c469bfb723 | ||
|
6a5ebb1ab0 | ||
|
a37900c521 | ||
|
8e15ddefda | ||
|
64fb92311d | ||
|
66fb6bbc52 | ||
|
30417a50d4 | ||
|
cb9b2232a8 |
24
.github/workflows/main.yml
vendored
24
.github/workflows/main.yml
vendored
@@ -1,24 +0,0 @@
|
||||
# This is a basic workflow to help you get started with Actions
|
||||
|
||||
name: Waka Readme
|
||||
|
||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||
# events but only for the master branch
|
||||
on:
|
||||
schedule:
|
||||
# Runs at 12am UTC
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Update Readme
|
||||
uses: athul/waka-readme@master
|
||||
with:
|
||||
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
||||
|
@@ -2,6 +2,7 @@ FROM python:latest
|
||||
|
||||
# Install dependencies.
|
||||
ADD requirements.txt /requirements.txt
|
||||
ADD main.py /main.py
|
||||
RUN pip install -r requirements.txt
|
||||
|
||||
CMD python main.py
|
||||
CMD ["python", "/main.py"]
|
99
README.md
99
README.md
@@ -1,30 +1,97 @@
|
||||
# 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.
|
||||
|
||||
## How to get it
|
||||
## New to WakaTime
|
||||
|
||||
- Clone the Repo
|
||||
- Install the dependencies `pip install -r requirements.txt`
|
||||
- Get a GitHub Access Token with a `repo` scope.
|
||||
- Get your Wakatime API Key.
|
||||
- Load env vars like
|
||||
|
||||
```text
|
||||
GH_TOKEN = <ghtoken>
|
||||
WAKATIME_API_KEY = <your wakatime API Key>
|
||||
USERNAME = <github_username>
|
||||
```
|
||||
WakaTime gives you an idea of the time you really spent on coding. This helps you boost your productivity and competitive edge.
|
||||
|
||||
- Run the Script with `python main.py`
|
||||
- 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>`)*
|
||||
|
||||
> 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:
|
||||
|
||||
```yml
|
||||
name: Waka Readme
|
||||
|
||||
on:
|
||||
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 }}
|
||||
```
|
||||
|
||||
### Other Repository (not Profile)
|
||||
|
||||
*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
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Runs at 12am UTC
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
update-readme:
|
||||
name: Update Readme with Metrics
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: athul/waka-readme@master
|
||||
with:
|
||||
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
||||
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.
|
||||
```
|
||||
|
@@ -5,6 +5,7 @@ description: 'Add a Wakatime Coding Activity graph in your Readme'
|
||||
inputs:
|
||||
GH_TOKEN:
|
||||
description: 'GitHub access token with Repo scope'
|
||||
required: true
|
||||
default: ${{ github.token }}
|
||||
|
||||
WAKATIME_API_KEY:
|
||||
|
70
main.py
70
main.py
@@ -1,26 +1,41 @@
|
||||
import base64
|
||||
import requests
|
||||
'''
|
||||
WakaTime progress visualizer
|
||||
'''
|
||||
|
||||
import re
|
||||
import os
|
||||
import base64
|
||||
import datetime
|
||||
import requests
|
||||
from github import Github
|
||||
|
||||
|
||||
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')
|
||||
|
||||
def this_week():
|
||||
'''Returns current week span'''
|
||||
week_number = datetime.date.today().isocalendar()[1]
|
||||
month = datetime.date.today().strftime('%B')
|
||||
week_start = datetime.datetime.today().day - datetime.datetime.today().weekday()
|
||||
week_end = week_start + 5
|
||||
return f"Week #{week_number} : {month} {week_start} - {week_end}"
|
||||
|
||||
def makeGraph(percent: float):
|
||||
done_block = "█"
|
||||
empty_block = "░"
|
||||
def make_graph(percent: float):
|
||||
'''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():
|
||||
'''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']
|
||||
@@ -28,30 +43,31 @@ def getStats():
|
||||
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']}"
|
||||
op = f"{l['name']}{' '*(12-ln)}{l['text']}{' '*(20-ln_text)}{make_graph(l['percent'])} {l['percent']}%"
|
||||
data_list.append(op)
|
||||
data = " \n".join(data_list)
|
||||
return ("```text\n"+data+"\n```")
|
||||
data = ' \n'.join(data_list)
|
||||
return '```text\n'+this_week()+'\n\n'+data+'\n```'
|
||||
|
||||
|
||||
def decodeReadme(data: str):
|
||||
decodedBytes = base64.b64decode(data)
|
||||
decodedStr = str(decodedBytes, "utf-8")
|
||||
return decodedStr
|
||||
def decode_readme(data: 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):
|
||||
'''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}")
|
||||
contents = repo.get_readme()
|
||||
stats = getStats()
|
||||
rdmd = decodeReadme(contents.content)
|
||||
newreadme = generatenewReadme(stats=stats, readme=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