feat: flags to tweak commit info; bump version
- flags are now available to modify commit information - adds these flags to `dockerfile` & `action.yml` - fixes a few typos - improves `Readme.md` - updates secondary dependencies - bumps project version **Related Items** _Issues_ - Closes #103 - Closes #104 - Closes #125
This commit is contained in:
parent
7d29cf150e
commit
a3e45eb050
93
README.md
93
README.md
@ -28,7 +28,7 @@ Alternatively, you can also fetch data from WakaTime compatible services like [W
|
|||||||
|
|
||||||
## Prep Work
|
## Prep Work
|
||||||
|
|
||||||
A GitHub repository and a `README.md` file is required. We'll be making use of readme in the [profile repository][profile_readme]\*.
|
A GitHub repository and a `README.md` file is required. We'll be making use of readme in the [profile repository][profile_readme].
|
||||||
|
|
||||||
- Save the `README.md` file after copy-pasting the following special comments. Your dev-metics will show up in between.
|
- Save the `README.md` file after copy-pasting the following special comments. Your dev-metics will show up in between.
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ A GitHub repository and a `README.md` file is required. We'll be making use of r
|
|||||||
- If you're not using [profile repository][profile_readme], add another secret _named_ `GH_TOKEN` and insert your [GitHub token][gh_access_token]\* in place of _value_.
|
- If you're not using [profile repository][profile_readme], add another secret _named_ `GH_TOKEN` and insert your [GitHub token][gh_access_token]\* in place of _value_.
|
||||||
|
|
||||||
- Create a new workflow file (`waka-readme.yml`) inside `.github/workflows/` folder of your repository. You can create it from a template using the _actions tab_ of your repository too.
|
- Create a new workflow file (`waka-readme.yml`) inside `.github/workflows/` folder of your repository. You can create it from a template using the _actions tab_ of your repository too.
|
||||||
- Clear any existing contents, add the following lines and save the file.
|
- Clear any existing contents, add the following lines and save the `waka-readme.yml` workflow file.
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
name: Waka Readme
|
name: Waka Readme
|
||||||
@ -72,25 +72,47 @@ A GitHub repository and a `README.md` file is required. We'll be making use of r
|
|||||||
#REPOSITORY: <gh_username/gh_username>
|
#REPOSITORY: <gh_username/gh_username>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Refer [#Example](#example) section for a full blown workflow file.
|
||||||
|
|
||||||
## Tweaks
|
## Tweaks
|
||||||
|
|
||||||
There are many flags that you can tweak to suit your taste!
|
There are many flags that you can tweak as you wish!
|
||||||
|
|
||||||
| Flag | Default | Options | Meaning |
|
### Meta Tweaks
|
||||||
| ------------------ | -------------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
||||||
| `API_BASE_URL` | `https://wakatime.com/api` | `https://wakatime.com/api`, `https://wakapi.dev/api`, `https://hakatime.mtx-dev.xyz/api` | Integration with WakaTime compatible services like [Wakapi][wakapi] & [Hakatime][hakatime] are possible |
|
| Environment flag | Options (`Default`, `Other`, ...) | Description |
|
||||||
| `REPOSITORY` | `<gh_username>/<gh_username>` | `<gh_username>/<repo_name>` | Waka-readme stats will appear on the provided repository |
|
| ---------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
||||||
| `SECTION_NAME` | `waka` | Any alphanumeric string | The generator will look for this section to fill up the readme. |
|
| `API_BASE_URL` | `https://wakatime.com/api`, `https://wakapi.dev/api`, `https://hakatime.mtx-dev.xyz/api` | Use WakaTime compatible services like [Wakapi][wakapi] & [Hakatime][hakatime] |
|
||||||
| `COMMIT_MESSAGE` | `Updated waka-readme graph with new metrics` | Any string | Messaged used when committing updated stats |
|
| `REPOSITORY` | `<gh_username>/<gh_username>`, `<gh_username>/<repo_name>` | Waka-readme stats will appear on the provided repository |
|
||||||
| `CODE_LANG` | `txt` | `python` `ruby` `json` , you can use other languages also | Language syntax to format the generated text, to get colored text. |
|
|
||||||
| `SHOW_TITLE` | `false` | `false`, `true` | Add title to waka-readme stats blob |
|
### Content Tweaks
|
||||||
| `BLOCKS` | `░▒▓█` | `░▒▓█`, `⣀⣄⣤⣦⣶⣷⣿`, `-#`, you can be creative! | Ascii art used to build stats graph |
|
|
||||||
| `TIME_RANGE` | `last_7_days` | `last_7_days`, `last_30_days`, `last_6_months`, `last_year`, `all_time` | String representing a dispensation from which stats are aggregated |
|
| Environment flag | Options (`Default`, `Other`, ...) | Description |
|
||||||
| `SHOW_TIME` | `true` | `false`, `true` | Displays the amount of time spent for each language |
|
| ------------------ | ----------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
|
||||||
| `SHOW_TOTAL` | `false` | `false`, `true` | Show total coding time |
|
| `SHOW_TITLE` | `false`, `true` | Add title to waka-readme stats blob |
|
||||||
| `SHOW_MASKED_TIME` | `false` | `false`, `true` | Adds total coding time including unclassified languages (overrides: `SHOW_TOTAL`) |
|
| `SECTION_NAME` | `waka`, any alphanumeric string | The generator will look for section name to fill up the readme. |
|
||||||
| `LANG_COUNT` | `5` | Any reasonable number | Number of languages to be displayed |
|
| `BLOCKS` | `░▒▓█`, `⣀⣄⣤⣦⣶⣷⣿`, `-#`, `=>`, you can be creative | Ascii art used to build stats graph |
|
||||||
| `STOP_AT_OTHER` | `false` | `false`, `true` | Stop when language marked as `Other` is retrieved (overrides: `LANG_COUNT`) |
|
| `CODE_LANG` | `txt`, `python` `ruby` `json` , you can use other languages also | Language syntax based highlighted text |
|
||||||
|
| `TIME_RANGE` | `last_7_days`, `last_30_days`, `last_6_months`, `last_year`, `all_time` | String representing a dispensation from which stats are aggregated |
|
||||||
|
| `LANG_COUNT` | `5`, any plausible number | Number of languages to be displayed |
|
||||||
|
| `SHOW_TIME` | `true`, `false` | Displays the amount of time spent for each language |
|
||||||
|
| `SHOW_TOTAL` | `false`, `true` | Show total coding time |
|
||||||
|
| `SHOW_MASKED_TIME` | `false`, `true` | Adds total coding time including unclassified languages (overrides: `SHOW_TOTAL`) |
|
||||||
|
| `STOP_AT_OTHER` | `false`, `true` | Stop when language marked as `Other` is retrieved (overrides: `LANG_COUNT`) |
|
||||||
|
|
||||||
|
### Commit Tweaks
|
||||||
|
|
||||||
|
| Environment flag | Options (`Default`, `Other`, ...) |
|
||||||
|
| ----------------- | -------------------------------------------------------------------- |
|
||||||
|
| `COMMIT_MESSAGE` | `Updated waka-readme graph with new metrics`, any reasonable message |
|
||||||
|
| `TARGET_BRANCH` | `NOT_SET`, target branch name |
|
||||||
|
| `TARGET_PATH` | `NOT_SET`, `/path/to/target/file` |
|
||||||
|
| `COMMITTER_NAME` | `NOT_SET`, committer name |
|
||||||
|
| `COMMITTER_EMAIL` | `NOT_SET`, committer email |
|
||||||
|
| `AUTHOR_NAME` | `NOT_SET`, author name |
|
||||||
|
| `AUTHOR_EMAIL` | `NOT_SET`, author email |
|
||||||
|
|
||||||
|
All of these flags are _optional_.
|
||||||
|
|
||||||
# Example
|
# Example
|
||||||
|
|
||||||
@ -112,15 +134,40 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: athul/waka-readme@master
|
- uses: athul/waka-readme@master
|
||||||
with:
|
with:
|
||||||
|
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||||
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
||||||
|
# meta
|
||||||
|
API_BASE_URL: https://wakatime.com/api
|
||||||
|
REPOSITORY: athul/athul
|
||||||
|
# content
|
||||||
SHOW_TITLE: true
|
SHOW_TITLE: true
|
||||||
|
SECTION_NAME: waka
|
||||||
BLOCKS: ->
|
BLOCKS: ->
|
||||||
TIME_RANGE: all_time
|
CODE_LANG: all_time
|
||||||
SHOW_TIME: true
|
TIME_RANGE: true
|
||||||
SHOW_MASKED_TIME: true
|
|
||||||
LANG_COUNT: 10
|
LANG_COUNT: 10
|
||||||
|
SHOW_TIME: true
|
||||||
|
SHOW_TOTAL: true
|
||||||
|
SHOW_MASKED_TIME: false
|
||||||
|
STOP_AT_OTHER: true
|
||||||
|
# commit
|
||||||
|
COMMIT_MESSAGE: Updated waka-readme graph with new metrics
|
||||||
|
TARGET_BRANCH: master
|
||||||
|
TARGET_PATH: README.md
|
||||||
|
COMMITTER_NAME: GitHubActionBot
|
||||||
|
COMMITTER_EMAIL: action-bot@github.org
|
||||||
|
AUTHOR_NAME: Athul
|
||||||
|
AUTHOR_EMAIL: athul@example.org
|
||||||
|
# you can populate email-id with secretes instead
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> Note:
|
||||||
|
>
|
||||||
|
> - Flags `REPOSITORY` and `GH_TOKEN` are required, ONLY if you're NOT using [profile readme][profile_readme].
|
||||||
|
> - `WAKATIME_API_KEY` is a required secret.
|
||||||
|
> - Every other environment variables is optional.
|
||||||
|
> - The above example does not show proper default values, refer [#Tweaks](#tweaks) for the same.
|
||||||
|
|
||||||
**`README.md`**
|
**`README.md`**
|
||||||
|
|
||||||
```md
|
```md
|
||||||
@ -140,10 +187,6 @@ Other 47 hrs 58 mins >------------------------ 03.05 %
|
|||||||
|
|
||||||
I am a fan of minimal designs and the profile readme is a great way to show off your skills and interests. The WakaTime API, gets us a **lot of data** about a person's **coding activity including the editors and Operating Systems you used and the projects you worked on**. Some of these projects maybe secretive and should not be shown out to the public. Using up more data via the Wakatime API will clutter the profile readme and hinder your chances on displaying what you provide **value to the community** like the pinned Repositories. I believe that **Coding Stats is nerdiest of all** since you can tell the community that you are **_exercising these languages or learning a new language_**, this will also show that you spend some amount of time to learn and exercise your development skills. That's what matters in the end :heart:
|
I am a fan of minimal designs and the profile readme is a great way to show off your skills and interests. The WakaTime API, gets us a **lot of data** about a person's **coding activity including the editors and Operating Systems you used and the projects you worked on**. Some of these projects maybe secretive and should not be shown out to the public. Using up more data via the Wakatime API will clutter the profile readme and hinder your chances on displaying what you provide **value to the community** like the pinned Repositories. I believe that **Coding Stats is nerdiest of all** since you can tell the community that you are **_exercising these languages or learning a new language_**, this will also show that you spend some amount of time to learn and exercise your development skills. That's what matters in the end :heart:
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<sup>\*</sup>`REPOSITORY` flag and `GH_TOKEN` secret are required you're not using profile readme.
|
|
||||||
|
|
||||||
[//]: #(Links)
|
[//]: #(Links)
|
||||||
[wakapi]: https://wakapi.dev
|
[wakapi]: https://wakapi.dev
|
||||||
[hakatime]: https://github.com/mujx/hakatime
|
[hakatime]: https://github.com/mujx/hakatime
|
||||||
|
52
action.yml
52
action.yml
@ -1,84 +1,98 @@
|
|||||||
name: "Waka - Readme"
|
name: "Waka - Readme"
|
||||||
author: Athul Cyriac Ajay
|
author: "Athul Cyriac Ajay"
|
||||||
description: "Add a Wakatime Coding Activity graph in your Readme"
|
description: "WakaTime coding activity graph in your profile readme"
|
||||||
|
|
||||||
inputs:
|
inputs:
|
||||||
GH_TOKEN:
|
GH_TOKEN:
|
||||||
description: "GitHub access token with Repo scope"
|
description: "GitHub access token with Repo scope"
|
||||||
default: ${{ github.token }}
|
default: ${{ github.token }}
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
WAKATIME_API_KEY:
|
WAKATIME_API_KEY:
|
||||||
description: "Your Wakatime/Wakapi/Hakatime API Key"
|
description: "Your Wakatime/Wakapi/Hakatime API Key"
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
# meta tweaks
|
||||||
API_BASE_URL:
|
API_BASE_URL:
|
||||||
description: "Alternative API base URL when using a third-party WakaTime-ish backend"
|
description: "Alternative API base URL when using a third-party WakaTime-ish backend"
|
||||||
default: "https://wakatime.com/api"
|
default: "https://wakatime.com/api"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
REPOSITORY:
|
REPOSITORY:
|
||||||
description: "Your GitHub repository"
|
description: "Your GitHub repository"
|
||||||
default: ${{ github.repository }}
|
default: ${{ github.repository }}
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
COMMIT_MESSAGE:
|
|
||||||
description: "Add a commit message of your choice"
|
|
||||||
default: "Updated waka-readme graph with new metrics"
|
|
||||||
required: false
|
|
||||||
|
|
||||||
# content tweaks
|
# content tweaks
|
||||||
|
|
||||||
SHOW_TITLE:
|
SHOW_TITLE:
|
||||||
description: "Displays the week number and days in Readme as title"
|
description: "Displays the week number and days in Readme as title"
|
||||||
default: "false"
|
default: "false"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
SECTION_NAME:
|
SECTION_NAME:
|
||||||
description: "Section name for data to appear in readme"
|
description: "Section name for data to appear in readme"
|
||||||
required: false
|
required: false
|
||||||
default: "waka"
|
default: "waka"
|
||||||
|
|
||||||
BLOCKS:
|
BLOCKS:
|
||||||
description: "Add the progress blocks of your choice"
|
description: "Add the progress blocks of your choice"
|
||||||
default: "░▒▓█"
|
default: "░▒▓█"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
CODE_LANG:
|
CODE_LANG:
|
||||||
description: "Add syntax formatter for generated code"
|
description: "Add syntax formatter for generated code"
|
||||||
default: "txt"
|
default: "txt"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
TIME_RANGE:
|
TIME_RANGE:
|
||||||
description: "Time range of the queried statistics"
|
description: "Time range of the queried statistics"
|
||||||
default: "last_7_days"
|
default: "last_7_days"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
LANG_COUNT:
|
LANG_COUNT:
|
||||||
description: "Maximum number of languages to be shown"
|
description: "Maximum number of languages to be shown"
|
||||||
default: "5"
|
default: "5"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
SHOW_TIME:
|
SHOW_TIME:
|
||||||
description: "Displays the amount of time spent for each language"
|
description: "Displays the amount of time spent for each language"
|
||||||
default: "true"
|
default: "true"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
SHOW_TOTAL:
|
SHOW_TOTAL:
|
||||||
description: "Displays total coding time"
|
description: "Displays total coding time"
|
||||||
default: "false"
|
default: "false"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
SHOW_MASKED_TIME:
|
SHOW_MASKED_TIME:
|
||||||
description: "Displays total coding time including unclassified languages"
|
description: "Displays total coding time including unclassified languages"
|
||||||
default: "false"
|
default: "false"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
STOP_AT_OTHER:
|
STOP_AT_OTHER:
|
||||||
description: "Stop data retrieval when language marked 'Other' is reached"
|
description: "Stop data retrieval when language marked 'Other' is reached"
|
||||||
default: "false"
|
default: "false"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
|
# commit tweaks
|
||||||
|
COMMIT_MESSAGE:
|
||||||
|
description: "Add a commit message of your choice"
|
||||||
|
default: "Updated waka-readme graph with new metrics"
|
||||||
|
required: false
|
||||||
|
TARGET_BRANCH:
|
||||||
|
description: "Target branch"
|
||||||
|
default: "NOT_SET"
|
||||||
|
required: false
|
||||||
|
TARGET_PATH:
|
||||||
|
description: "Target file path"
|
||||||
|
default: "NOT_SET"
|
||||||
|
required: false
|
||||||
|
COMMITTER_NAME:
|
||||||
|
description: "Committer name"
|
||||||
|
default: "NOT_SET"
|
||||||
|
required: false
|
||||||
|
COMMITTER_EMAIL:
|
||||||
|
description: "Committer email"
|
||||||
|
default: "NOT_SET"
|
||||||
|
required: false
|
||||||
|
AUTHOR_NAME:
|
||||||
|
description: "Author name"
|
||||||
|
default: "NOT_SET"
|
||||||
|
required: false
|
||||||
|
AUTHOR_EMAIL:
|
||||||
|
description: "Author email"
|
||||||
|
default: "NOT_SET"
|
||||||
|
required: false
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: "docker"
|
using: "docker"
|
||||||
image: "dockerfile"
|
image: "dockerfile"
|
||||||
|
19
dockerfile
19
dockerfile
@ -2,18 +2,29 @@ FROM docker.io/python:3-slim
|
|||||||
|
|
||||||
ENV INPUT_GH_TOKEN \
|
ENV INPUT_GH_TOKEN \
|
||||||
INPUT_WAKATIME_API_KEY \
|
INPUT_WAKATIME_API_KEY \
|
||||||
|
# meta
|
||||||
INPUT_API_BASE_URL \
|
INPUT_API_BASE_URL \
|
||||||
INPUT_REPOSITORY \
|
INPUT_REPOSITORY \
|
||||||
INPUT_COMMIT_MESSAGE \
|
# content
|
||||||
INPUT_SHOW_TITLE \
|
INPUT_SHOW_TITLE \
|
||||||
INPUT_SECTION_NAME \
|
INPUT_SECTION_NAME \
|
||||||
INPUT_BLOCKS \
|
INPUT_BLOCKS \
|
||||||
|
INPUT_CODE_LANG \
|
||||||
|
INPUT_TIME_RANGE \
|
||||||
|
INPUT_LANG_COUNT \
|
||||||
INPUT_SHOW_TIME \
|
INPUT_SHOW_TIME \
|
||||||
INPUT_SHOW_TOTAL \
|
INPUT_SHOW_TOTAL \
|
||||||
INPUT_TIME_RANGE \
|
|
||||||
INPUT_SHOW_MASKED_TIME \
|
INPUT_SHOW_MASKED_TIME \
|
||||||
INPUT_LANG_COUNT \
|
INPUT_STOP_AT_OTHER \
|
||||||
INPUT_STOP_AT_OTHER
|
# commit
|
||||||
|
INPUT_COMMIT_MESSAGE \
|
||||||
|
INPUT_TARGET_BRANCH \
|
||||||
|
INPUT_TARGET_PATH \
|
||||||
|
INPUT_COMMITTER_NAME \
|
||||||
|
INPUT_COMMITTER_EMAIL \
|
||||||
|
INPUT_AUTHOR_NAME \
|
||||||
|
INPUT_AUTHOR_EMAIL
|
||||||
|
|
||||||
|
|
||||||
ENV PATH="${PATH}:/root/.local/bin" \
|
ENV PATH="${PATH}:/root/.local/bin" \
|
||||||
# python
|
# python
|
||||||
|
113
main.py
113
main.py
@ -30,6 +30,7 @@ Contents := Title + Byline + Body
|
|||||||
# standard
|
# standard
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from random import SystemRandom
|
from random import SystemRandom
|
||||||
|
from functools import partial
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
import logging as logger
|
import logging as logger
|
||||||
@ -40,9 +41,9 @@ import re
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
# external
|
# external
|
||||||
|
from github import ContentFile, Github, GithubException, InputGitAuthor, Repository
|
||||||
from requests.exceptions import RequestException
|
from requests.exceptions import RequestException
|
||||||
from requests import get as rq_get
|
from requests import get as rq_get
|
||||||
from github import GithubException, Github
|
|
||||||
from faker import Faker
|
from faker import Faker
|
||||||
|
|
||||||
|
|
||||||
@ -149,6 +150,13 @@ class WakaInput:
|
|||||||
show_masked_time: str | bool = os.getenv("INPUT_SHOW_MASKED_TIME") or False
|
show_masked_time: str | bool = os.getenv("INPUT_SHOW_MASKED_TIME") or False
|
||||||
language_count: str | int = os.getenv("INPUT_LANG_COUNT") or 5
|
language_count: str | int = os.getenv("INPUT_LANG_COUNT") or 5
|
||||||
stop_at_other: str | bool = os.getenv("INPUT_STOP_AT_OTHER") or False
|
stop_at_other: str | bool = os.getenv("INPUT_STOP_AT_OTHER") or False
|
||||||
|
# # optional meta
|
||||||
|
target_branch: str = os.getenv("INPUT_TARGET_BRANCH", "NOT_SET")
|
||||||
|
target_path: str = os.getenv("INPUT_TARGET_PATH", "NOT_SET")
|
||||||
|
committer_name: str = os.getenv("INPUT_COMMITTER_NAME", "NOT_SET")
|
||||||
|
committer_email: str = os.getenv("INPUT_COMMITTER_EMAIL", "NOT_SET")
|
||||||
|
author_name: str = os.getenv("INPUT_AUTHOR_NAME", "NOT_SET")
|
||||||
|
author_email: str = os.getenv("INPUT_AUTHOR_EMAIL", "NOT_SET")
|
||||||
|
|
||||||
def validate_input(self):
|
def validate_input(self):
|
||||||
"""Validate Input Env Variables."""
|
"""Validate Input Env Variables."""
|
||||||
@ -205,6 +213,19 @@ class WakaInput:
|
|||||||
logger.debug("Using default language count: 5")
|
logger.debug("Using default language count: 5")
|
||||||
self.language_count = 5
|
self.language_count = 5
|
||||||
|
|
||||||
|
for option in (
|
||||||
|
"target_branch",
|
||||||
|
"target_path",
|
||||||
|
"committer_name",
|
||||||
|
"committer_email",
|
||||||
|
"author_name",
|
||||||
|
"author_email",
|
||||||
|
):
|
||||||
|
if not getattr(self, option):
|
||||||
|
logger.warning(f"Improper '{option}' configuration")
|
||||||
|
logger.debug(f"Using default '{option}'")
|
||||||
|
setattr(self, option, "NOT_SET")
|
||||||
|
|
||||||
logger.debug("Input validation complete\n")
|
logger.debug("Input validation complete\n")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -284,7 +305,7 @@ def prep_content(stats: dict[str, Any], language_count: int = 5, stop_at_other:
|
|||||||
pad_len = len(
|
pad_len = len(
|
||||||
# comment if it feels way computationally expensive
|
# comment if it feels way computationally expensive
|
||||||
max((str(lng["name"]) for lng in lang_info), key=len)
|
max((str(lng["name"]) for lng in lang_info), key=len)
|
||||||
# and then don't for get to set pad_len to say 13 :)
|
# and then do not for get to set `pad_len` to say 13 :)
|
||||||
)
|
)
|
||||||
if language_count == 0 and not stop_at_other:
|
if language_count == 0 and not stop_at_other:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
@ -365,7 +386,7 @@ def churn(old_readme: str, /):
|
|||||||
"""
|
"""
|
||||||
# check if placeholder pattern exists in readme
|
# check if placeholder pattern exists in readme
|
||||||
if not re.findall(wk_i.waka_block_pattern, old_readme):
|
if not re.findall(wk_i.waka_block_pattern, old_readme):
|
||||||
logger.warning(f"Can't find `{wk_i.waka_block_pattern}` pattern in readme")
|
logger.warning(f"Cannot find `{wk_i.waka_block_pattern}` pattern in readme")
|
||||||
return None
|
return None
|
||||||
# getting contents
|
# getting contents
|
||||||
if not (waka_stats := fetch_stats()):
|
if not (waka_stats := fetch_stats()):
|
||||||
@ -389,33 +410,86 @@ def churn(old_readme: str, /):
|
|||||||
if len(sys.argv) == 2 and sys.argv[1] == "--dev":
|
if len(sys.argv) == 2 and sys.argv[1] == "--dev":
|
||||||
logger.debug("Detected run in `dev` mode.")
|
logger.debug("Detected run in `dev` mode.")
|
||||||
# to avoid accidentally writing back to Github
|
# to avoid accidentally writing back to Github
|
||||||
# when developing and testing WakaReadme
|
# when developing or testing waka-readme
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return None if new_readme == old_readme else new_readme
|
return None if new_readme == old_readme else new_readme
|
||||||
|
|
||||||
|
|
||||||
|
def qualify_target(gh_repo: Repository.Repository):
|
||||||
|
"""Qualify target repository defaults."""
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TargetRepository:
|
||||||
|
this: ContentFile.ContentFile
|
||||||
|
path: str
|
||||||
|
commit_message: str
|
||||||
|
sha: str
|
||||||
|
branch: str
|
||||||
|
committer: InputGitAuthor | None
|
||||||
|
author: InputGitAuthor | None
|
||||||
|
|
||||||
|
gh_branch = gh_repo.default_branch
|
||||||
|
if wk_i.target_branch != "NOT_SET":
|
||||||
|
gh_branch = gh_repo.get_branch(wk_i.target_branch)
|
||||||
|
|
||||||
|
target = gh_repo.get_readme()
|
||||||
|
if wk_i.target_path != "NOT_SET":
|
||||||
|
target = gh_repo.get_contents(
|
||||||
|
path=wk_i.target_path,
|
||||||
|
ref=gh_branch if isinstance(gh_branch, str) else gh_branch.commit.sha,
|
||||||
|
)
|
||||||
|
|
||||||
|
if isinstance(target, list):
|
||||||
|
raise RuntimeError("Cannot handle multiple files.")
|
||||||
|
|
||||||
|
committer, author = None, None
|
||||||
|
if wk_i.committer_name != "NOT_SET" and wk_i.committer_email != "NOT_SET":
|
||||||
|
committer = InputGitAuthor(name=wk_i.committer_name, email=wk_i.committer_email)
|
||||||
|
if wk_i.author_name != "NOT_SET" and wk_i.author_email != "NOT_SET":
|
||||||
|
author = InputGitAuthor(name=wk_i.author_name, email=wk_i.author_email)
|
||||||
|
|
||||||
|
return TargetRepository(
|
||||||
|
this=target,
|
||||||
|
path=target.path,
|
||||||
|
commit_message=wk_i.commit_message,
|
||||||
|
sha=target.sha,
|
||||||
|
branch=gh_branch if isinstance(gh_branch, str) else gh_branch.name,
|
||||||
|
committer=committer,
|
||||||
|
author=author,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def genesis():
|
def genesis():
|
||||||
"""Run Program."""
|
"""Run Program."""
|
||||||
logger.debug("Connecting to GitHub")
|
logger.debug("Connecting to GitHub")
|
||||||
gh_connect = Github(wk_i.gh_token)
|
gh_connect = Github(wk_i.gh_token)
|
||||||
# since a validator is being used casting to string here is okay
|
# since a validator is being used earlier, casting
|
||||||
|
# `wk_i.ENV_VARIABLE` to a string here, is okay
|
||||||
gh_repo = gh_connect.get_repo(str(wk_i.repository))
|
gh_repo = gh_connect.get_repo(str(wk_i.repository))
|
||||||
readme_file = gh_repo.get_readme()
|
target = qualify_target(gh_repo)
|
||||||
logger.debug("Decoding readme contents\n")
|
logger.debug("Decoding readme contents\n")
|
||||||
readme_contents = str(readme_file.decoded_content, encoding="utf-8")
|
|
||||||
if new_content := churn(readme_contents):
|
readme_contents = str(target.this.decoded_content, encoding="utf-8")
|
||||||
logger.debug("WakaReadme stats has changed")
|
if not (new_content := churn(readme_contents)):
|
||||||
gh_repo.update_file(
|
logger.info("WakaReadme was not updated")
|
||||||
path=readme_file.path,
|
|
||||||
message=wk_i.commit_message,
|
|
||||||
content=new_content,
|
|
||||||
sha=readme_file.sha,
|
|
||||||
)
|
|
||||||
logger.info("Stats updated successfully")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
logger.info("WakaReadme was not updated")
|
logger.debug("WakaReadme stats has changed")
|
||||||
|
update_metric = partial(
|
||||||
|
gh_repo.update_file,
|
||||||
|
path=target.path,
|
||||||
|
message=target.commit_message,
|
||||||
|
content=new_content,
|
||||||
|
sha=target.sha,
|
||||||
|
branch=target.branch,
|
||||||
|
)
|
||||||
|
if target.committer:
|
||||||
|
update_metric = partial(update_metric, committer=target.committer)
|
||||||
|
if target.author:
|
||||||
|
update_metric = partial(update_metric, author=target.author)
|
||||||
|
update_metric()
|
||||||
|
logger.info("Stats updated successfully")
|
||||||
|
|
||||||
|
|
||||||
################### driver ###################
|
################### driver ###################
|
||||||
@ -438,9 +512,12 @@ if __name__ == "__main__":
|
|||||||
try:
|
try:
|
||||||
genesis()
|
genesis()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print()
|
print("\r", end=" ")
|
||||||
logger.error("Interrupt signal received\n")
|
logger.error("Interrupt signal received\n")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
except RuntimeError as err:
|
||||||
|
logger.error(f"{type(err).__name__}: {err}\n")
|
||||||
|
sys.exit(1)
|
||||||
except (GithubException, RequestException) as rq_exp:
|
except (GithubException, RequestException) as rq_exp:
|
||||||
logger.critical(f"{rq_exp}\n")
|
logger.critical(f"{rq_exp}\n")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
92
pdm.lock
generated
92
pdm.lock
generated
@ -164,7 +164,7 @@ summary = "Python Build Reasonableness"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "platformdirs"
|
name = "platformdirs"
|
||||||
version = "3.8.1"
|
version = "3.9.1"
|
||||||
requires_python = ">=3.7"
|
requires_python = ">=3.7"
|
||||||
summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ summary = "Read key-value pairs from a .env file and set them as environment var
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyyaml"
|
name = "pyyaml"
|
||||||
version = "6.0"
|
version = "6.0.1"
|
||||||
requires_python = ">=3.6"
|
requires_python = ">=3.6"
|
||||||
summary = "YAML parser and emitter for Python"
|
summary = "YAML parser and emitter for Python"
|
||||||
|
|
||||||
@ -569,9 +569,9 @@ content_hash = "sha256:556dbbc029f8bf24b5608115fbc838f9f5743e20cc635eaed181ea54d
|
|||||||
{url = "https://files.pythonhosted.org/packages/01/06/4ab11bf70db5a60689fc521b636849c8593eb67a2c6bdf73a16c72d16a12/pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"},
|
{url = "https://files.pythonhosted.org/packages/01/06/4ab11bf70db5a60689fc521b636849c8593eb67a2c6bdf73a16c72d16a12/pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"},
|
||||||
{url = "https://files.pythonhosted.org/packages/02/d8/acee75603f31e27c51134a858e0dea28d321770c5eedb9d1d673eb7d3817/pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"},
|
{url = "https://files.pythonhosted.org/packages/02/d8/acee75603f31e27c51134a858e0dea28d321770c5eedb9d1d673eb7d3817/pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"},
|
||||||
]
|
]
|
||||||
"platformdirs 3.8.1" = [
|
"platformdirs 3.9.1" = [
|
||||||
{url = "https://files.pythonhosted.org/packages/92/38/3dd18a282991c004851ea1f0953105a186cfc691eee2792778ac2ca060f8/platformdirs-3.8.1.tar.gz", hash = "sha256:f87ca4fcff7d2b0f81c6a748a77973d7af0f4d526f98f308477c3c436c74d528"},
|
{url = "https://files.pythonhosted.org/packages/6d/a7/47b7088a28c8fe5775eb15281bf44d39facdbe4bc011a95ccb89390c2db9/platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"},
|
||||||
{url = "https://files.pythonhosted.org/packages/9e/d8/563a9fc17153c588c8c2042d2f0f84a89057cdb1c30270f589c88b42d62c/platformdirs-3.8.1-py3-none-any.whl", hash = "sha256:cec7b889196b9144d088e4c57d9ceef7374f6c39694ad1577a0aab50d27ea28c"},
|
{url = "https://files.pythonhosted.org/packages/a1/70/c1d14c0c58d975f06a449a403fac69d3c9c6e8ae2a529f387d77c29c2e56/platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"},
|
||||||
]
|
]
|
||||||
"pycparser 2.21" = [
|
"pycparser 2.21" = [
|
||||||
{url = "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
|
{url = "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
|
||||||
@ -609,47 +609,47 @@ content_hash = "sha256:556dbbc029f8bf24b5608115fbc838f9f5743e20cc635eaed181ea54d
|
|||||||
{url = "https://files.pythonhosted.org/packages/31/06/1ef763af20d0572c032fa22882cfbfb005fba6e7300715a37840858c919e/python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
|
{url = "https://files.pythonhosted.org/packages/31/06/1ef763af20d0572c032fa22882cfbfb005fba6e7300715a37840858c919e/python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
|
||||||
{url = "https://files.pythonhosted.org/packages/44/2f/62ea1c8b593f4e093cc1a7768f0d46112107e790c3e478532329e434f00b/python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
|
{url = "https://files.pythonhosted.org/packages/44/2f/62ea1c8b593f4e093cc1a7768f0d46112107e790c3e478532329e434f00b/python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
|
||||||
]
|
]
|
||||||
"pyyaml 6.0" = [
|
"pyyaml 6.0.1" = [
|
||||||
{url = "https://files.pythonhosted.org/packages/02/25/6ba9f6bb50a3d4fbe22c1a02554dc670682a07c8701d1716d19ddea2c940/PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
|
{url = "https://files.pythonhosted.org/packages/02/74/b2320ebe006b6a521cf929c78f12a220b9db319b38165023623ed195654b/PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
|
||||||
{url = "https://files.pythonhosted.org/packages/08/f4/ffa743f860f34a5e8c60abaaa686f82c9ac7a2b50e5a1c3b1eb564d59159/PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
|
{url = "https://files.pythonhosted.org/packages/03/f7/4f8b71f3ce8cfb2c06e814aeda5b26ecc62ecb5cf85f5c8898be34e6eb6a/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
|
||||||
{url = "https://files.pythonhosted.org/packages/0f/93/5f81d1925ce3b531f5ff215376445ec220887cd1c9a8bde23759554dbdfd/PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
|
{url = "https://files.pythonhosted.org/packages/06/92/e0224aa6ebf9dc54a06a4609da37da40bb08d126f5535d81bff6b417b2ae/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
|
||||||
{url = "https://files.pythonhosted.org/packages/12/fc/a4d5a7554e0067677823f7265cb3ae22aed8a238560b5133b58cda252dad/PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
|
{url = "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
|
||||||
{url = "https://files.pythonhosted.org/packages/21/67/b42191239c5650c9e419c4a08a7a022bbf1abf55b0391c380a72c3af5462/PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
|
{url = "https://files.pythonhosted.org/packages/1e/ae/964ccb88a938f20ece5754878f182cfbd846924930d02d29d06af8d4c69e/PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
|
||||||
{url = "https://files.pythonhosted.org/packages/2e/b3/13dfd4eeb5e4b2d686b6d1822b40702e991bf3a4194ca5cbcce8d43749db/PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
|
{url = "https://files.pythonhosted.org/packages/24/62/7fcc372442ec8ea331da18c24b13710e010c5073ab851ef36bf9dacb283f/PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
|
||||||
{url = "https://files.pythonhosted.org/packages/36/2b/61d51a2c4f25ef062ae3f74576b01638bebad5e045f747ff12643df63844/PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
{url = "https://files.pythonhosted.org/packages/24/97/9b59b43431f98d01806b288532da38099cc6f2fea0f3d712e21e269c0279/PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
|
||||||
{url = "https://files.pythonhosted.org/packages/44/e5/4fea13230bcebf24b28c0efd774a2dd65a0937a2d39e94a4503438b078ed/PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
|
{url = "https://files.pythonhosted.org/packages/27/d5/fb4f7a3c96af89c214387af42c76117d2c2a0a40576e217632548a6e1aff/PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
|
||||||
{url = "https://files.pythonhosted.org/packages/4d/7d/c2ab8da648cd2b937de11fb35649b127adab4851cbeaf5fd9b60a2dab0f7/PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
|
{url = "https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
|
||||||
{url = "https://files.pythonhosted.org/packages/55/e3/507a92589994a5b3c3d7f2a7a066339d6ff61c5c839bae56f7eff03d9c7b/PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
|
{url = "https://files.pythonhosted.org/packages/29/0f/9782fa5b10152abf033aec56a601177ead85ee03b57781f2d9fced09eefc/PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
|
||||||
{url = "https://files.pythonhosted.org/packages/56/8f/e8b49ad21d26111493dc2d5cae4d7efbd0e2e065440665f5023515f87f64/PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
|
{url = "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
|
||||||
{url = "https://files.pythonhosted.org/packages/59/00/30e33fcd2a4562cd40c49c7740881009240c5cbbc0e41ca79ca4bba7c24b/PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
|
{url = "https://files.pythonhosted.org/packages/41/9a/1c4c51f1a0d2b6fd805973701ab0ec84d5e622c5aaa573b0e1157f132809/PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
|
||||||
{url = "https://files.pythonhosted.org/packages/5e/f4/7b4bb01873be78fc9fde307f38f62e380b7111862c165372cf094ca2b093/PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
|
{url = "https://files.pythonhosted.org/packages/4a/4b/c71ef18ef83c82f99e6da8332910692af78ea32bd1d1d76c9787dfa36aea/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
|
||||||
{url = "https://files.pythonhosted.org/packages/63/6b/f5dc7942bac17192f4ef00b2d0cdd1ae45eea453d05c1944c0573debe945/PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
|
{url = "https://files.pythonhosted.org/packages/4d/f1/08f06159739254c8947899c9fc901241614195db15ba8802ff142237664c/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
|
||||||
{url = "https://files.pythonhosted.org/packages/67/d4/b95266228a25ef5bd70984c08b4efce2c035a4baa5ccafa827b266e3dc36/PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
|
{url = "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
|
||||||
{url = "https://files.pythonhosted.org/packages/68/3f/c027422e49433239267c62323fbc6320d6ac8d7d50cf0cb2a376260dad5f/PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
|
{url = "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
|
||||||
{url = "https://files.pythonhosted.org/packages/6c/3d/524c642f3db37e7e7ab8d13a3f8b0c72d04a619abc19100097d987378fc6/PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
|
{url = "https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
|
||||||
{url = "https://files.pythonhosted.org/packages/74/68/3c13deaa496c14a030c431b7b828d6b343f79eb241b4848c7918091a64a2/PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
|
{url = "https://files.pythonhosted.org/packages/62/2a/df7727c52e151f9e7b852d7d1580c37bd9e39b2f29568f0f81b29ed0abc2/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
|
||||||
{url = "https://files.pythonhosted.org/packages/77/da/e845437ffe0dffae4e7562faf23a4f264d886431c5d2a2816c853288dc8e/PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
|
{url = "https://files.pythonhosted.org/packages/73/9c/766e78d1efc0d1fca637a6b62cea1b4510a7fb93617eb805223294fef681/PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
|
||||||
{url = "https://files.pythonhosted.org/packages/7f/d9/6a0d14ac8d3b5605dc925d177c1d21ee9f0b7b39287799db1e50d197b2f4/PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
|
{url = "https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
|
||||||
{url = "https://files.pythonhosted.org/packages/81/59/561f7e46916b78f3c4cab8d0c307c81656f11e32c846c0c97fda0019ed76/PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
|
{url = "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
|
||||||
{url = "https://files.pythonhosted.org/packages/89/26/0bfd7b756b34c68f8fd158b7bc762b6b1705fc1b3cebf4cdbb53fd9ea75b/PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
|
{url = "https://files.pythonhosted.org/packages/7f/5d/2779ea035ba1e533c32ed4a249b4e0448f583ba10830b21a3cddafe11a4e/PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
|
||||||
{url = "https://files.pythonhosted.org/packages/91/49/d46d7b15cddfa98533e89f3832f391aedf7e31f37b4d4df3a7a7855a7073/PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
|
{url = "https://files.pythonhosted.org/packages/84/4d/82704d1ab9290b03da94e6425f5e87396b999fd7eb8e08f3a92c158402bf/PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
|
||||||
{url = "https://files.pythonhosted.org/packages/9d/f6/7e91fbb58c9ee528759aea5892e062cccb426720c5830ddcce92eba00ff1/PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
|
{url = "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
|
||||||
{url = "https://files.pythonhosted.org/packages/a4/ba/e508fc780e3c94c12753a54fe8f74de535741a10d33b29a576a9bec03500/PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
|
{url = "https://files.pythonhosted.org/packages/ac/6c/967d91a8edf98d2b2b01d149bd9e51b8f9fb527c98d80ebb60c6b21d60c4/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
|
||||||
{url = "https://files.pythonhosted.org/packages/a4/e6/4d7a01bc0730c8f958a62d6a4c4f3df23b6139ad68c132b168970d84f192/PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
|
{url = "https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
|
||||||
{url = "https://files.pythonhosted.org/packages/a8/32/1bbe38477fb23f1d83041fefeabf93ef1cd6f0efcf44c221519507315d92/PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
|
{url = "https://files.pythonhosted.org/packages/b6/a0/b6700da5d49e9fed49dc3243d3771b598dad07abb37cc32e524607f96adc/PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
|
||||||
{url = "https://files.pythonhosted.org/packages/a8/5b/c4d674846ea4b07ee239fbf6010bcc427c4e4552ba5655b446e36b9a40a7/PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
|
{url = "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
|
||||||
{url = "https://files.pythonhosted.org/packages/b3/85/79b9e5b4e8d3c0ac657f4e8617713cca8408f6cdc65d2ee6554217cedff1/PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
|
{url = "https://files.pythonhosted.org/packages/c1/39/47ed4d65beec9ce07267b014be85ed9c204fa373515355d3efa62d19d892/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
|
||||||
{url = "https://files.pythonhosted.org/packages/b7/09/2f6f4851bbca08642fef087bade095edc3c47f28d1e7bff6b20de5262a77/PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
|
{url = "https://files.pythonhosted.org/packages/c7/d1/02baa09d39b1bb1ebaf0d850d106d1bdcb47c91958557f471153c49dc03b/PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
|
||||||
{url = "https://files.pythonhosted.org/packages/cb/5f/05dd91f5046e2256e35d885f3b8f0f280148568f08e1bf20421887523e9a/PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
|
{url = "https://files.pythonhosted.org/packages/c8/6b/6600ac24725c7388255b2f5add93f91e58a5d7efaf4af244fdbcc11a541b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
|
||||||
{url = "https://files.pythonhosted.org/packages/d1/c0/4fe04181b0210ee2647cfbb89ecd10a36eef89f10d8aca6a192c201bbe58/PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
|
{url = "https://files.pythonhosted.org/packages/cc/5c/fcabd17918348c7db2eeeb0575705aaf3f7ab1657f6ce29b2e31737dd5d1/PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
|
||||||
{url = "https://files.pythonhosted.org/packages/d7/42/7ad4b6d67a16229496d4f6e74201bdbebcf4bc1e87d5a70c9297d4961bd2/PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
|
{url = "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
|
||||||
{url = "https://files.pythonhosted.org/packages/db/4e/74bc723f2d22677387ab90cd9139e62874d14211be7172ed8c9f9a7c81a9/PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
|
{url = "https://files.pythonhosted.org/packages/d6/6a/439d1a6f834b9a9db16332ce16c4a96dd0e3970b65fe08cbecd1711eeb77/PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
|
||||||
{url = "https://files.pythonhosted.org/packages/df/75/ee0565bbf65133e5b6ffa154db43544af96ea4c42439e6b58c1e0eb44b4e/PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
|
{url = "https://files.pythonhosted.org/packages/d7/8f/db62b0df635b9008fe90aa68424e99cee05e68b398740c8a666a98455589/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
|
||||||
{url = "https://files.pythonhosted.org/packages/eb/5f/6e6fe6904e1a9c67bc2ca5629a69e7a5a0b17f079da838bab98a1e548b25/PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
|
{url = "https://files.pythonhosted.org/packages/e1/a1/27bfac14b90adaaccf8c8289f441e9f76d94795ec1e7a8f134d9f2cb3d0b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
|
||||||
{url = "https://files.pythonhosted.org/packages/ef/ad/b443cce94539e57e1a745a845f95c100ad7b97593d7e104051e43f730ecd/PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
|
{url = "https://files.pythonhosted.org/packages/e5/31/ba812efa640a264dbefd258986a5e4e786230cb1ee4a9f54eb28ca01e14a/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
|
||||||
{url = "https://files.pythonhosted.org/packages/f5/6f/b8b4515346af7c33d3b07cd8ca8ea0700ca72e8d7a750b2b87ac0268ca4e/PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
|
{url = "https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
|
||||||
{url = "https://files.pythonhosted.org/packages/f8/54/799b059314b13e1063473f76e908f44106014d18f54b16c83a16edccd5ec/PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
|
{url = "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
|
||||||
{url = "https://files.pythonhosted.org/packages/fc/48/531ecd926fe0a374346dd811bf1eda59a95583595bb80eadad511f3269b8/PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
|
{url = "https://files.pythonhosted.org/packages/fe/88/def2e57fe740544f2eefb1645f1d6e0094f56c00f4eade708140b6137ead/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
|
||||||
]
|
]
|
||||||
"requests 2.31.0" = [
|
"requests 2.31.0" = [
|
||||||
{url = "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
|
{url = "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "waka-readme"
|
name = "waka-readme"
|
||||||
version = "0.2.1"
|
version = "0.2.2"
|
||||||
description = "Wakatime Weekly Metrics on your Profile Readme."
|
description = "Wakatime Weekly Metrics on your Profile Readme."
|
||||||
license = { text = "MIT" }
|
license = { text = "MIT" }
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user