Aller au contenu

Générer votre profil github dynamiquement en python

logo

Github permet de personnaliser son profil avec un simple fichier Readme. Pour l’activer rien de plus simple, il suffit juste de créer un repository portant le même nom que votre compte github.

Par exemple, mon compte github se nomme stephrobert, il a suffit donc que je crée un repository stephrobert et d’y déposer un fichier Readme:MD dedans. Dans ce fichier, vous pouvez mettre du contenu au format markdown ou html.

profil stephrobert

Vous pouvez vous inspirer de cette longue liste de profils.

Rendre son profil github dynamique

Rien de plus simple il suffit d’utiliser le langage de votre choix, celui que vous maîtrisez. Personnellement, je l’ai écrit en Python.

Pour cela plutôt que d’écrire tout le code, j’ai décidé d’utiliser le package python profile-readme.

Au lieu de faire un fork du projet et vu que ce package peut être utilisé dans comme librairie, je vous propose de vous montrer comment y arriver le plus simplement et d’y ajouter tout ce qui vous ferait plaisir.

Création de votre projet

J’utilise poetry comme gestionnaire de packages python. Commençons par initialiser le projet et ajoutons le package :

Terminal window
pip install poetry
poetry init
This command will guide you through creating your pyproject.toml config.
Package name [test]: stephrobert
Version [0.1.0]:
Description []:
Author [Stephane Robert <stephane.robert.28@gmil.com>, n to skip]: n
License []:
Compatible Python versions [^3.10]:
Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file
[tool.poetry]
name = "stephrobert"
version = "0.1.0"
description : ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.10"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Do you confirm generation? (yes/no) [yes]

Maintenant ajoutons le package profile-readme :

Terminal window
poetry add profile-readme
Creating virtualenv stephrobert-CHLv_kh8-py3.10 in /home/vagrant/.cache/pypoetry/virtualenvs
Using version ^0.1.2 for profile-readme
Updating dependencies
Resolving dependencies... (0.6s)
Writing lock file
Package operations: 19 installs, 0 updates, 0 removals
Installing attrs (22.1.0)
Installing certifi (2022.6.15.1)
Installing charset-normalizer (2.1.1)
Installing exceptiongroup (1.0.0rc9)
Installing idna (3.3)
Installing six (1.16.0)
Installing urllib3 (1.26.12)
Installing appdirs (1.4.4)
Installing cattrs (22.1.0)
Installing click (8.1.3)
Installing markupsafe (2.1.1)
Installing requests (2.28.1)
Installing url-normalize (1.4.3)
Installing click-help-colors (0.9.1)
Installing jinja2 (3.1.2)
Installing python-dateutil (2.8.2)
Installing python-dotenv (0.21.0)
Installing requests-cache (0.9.6)
Installing profile-readme (0.1.2)

Pour ajouter des packages qui ne sont utilisés que pour le développement. Exemple black le formateur python :

Terminal window
poetry add -- group dev black
Using version ^22.8.0 for black
Updating dependencies
Resolving dependencies... (0.2s)
Writing lock file
Package operations: 5 installs, 0 updates, 0 removals
Installing mypy-extensions (0.4.3)
Installing pathspec (0.10.1)
Installing platformdirs (2.5.2)
Installing tomli (2.0.1)
Installing black (22.8.0)

Vous devriez obtenir ce fichier :

[tool.poetry]
name = "stephrobert"
version = "0.1.0"
description : ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.10"
profile-readme = "^0.1.2"
[tool.poetry.group.dev.dependencies]
black = "^22.8.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Écriture du générateur de profil github

Il faut créer deux fichiers. Le premier se nomme build.py :

from profile_readme import get_github_context, ProfileGenerator
if __name__ == "__main__":
context = {}
# If you don't need the GitHub data you can remove the next line
context.update(**get_github_context('votre_compte'))
ProfileGenerator.render(
template_path="README-TEMPLATE.j2",
output_path="README.md",
context=context
)

Remplacez votre_compte par le nom de votre compte github. Et un second fichier qui se nomme README-TEMPLATE.md : avec ce contenu :

# Hey! Nice to see you
Welcome to my page!
I'm my_name, a geek from **Lille, France**....
{% if USER.blog %}
**My blog**: [myblog.exemple.com](https://myblog.exemple.com)
{% endif %}

Maintenant pour générer le fichier Readme.md, il suffit de lancer votre programme python :

Terminal window
poetry shell
python3 build.py

Vous devriez obtenir ce fichier README.md :

# Hey! Nice to see you
Welcome to my page!
I'm my_name, a geek from **Lille, France**....
**My blog**: [myblog.exemple.com](https://myblog.exemple.com)

Bien sûr, le contenu dépend de votre profil github. Le lien vers le blog existe que si dans votre profil, il existe.

Ajouter vos informations

Pour ajouter des informations à votre profil, il faut ajouter des champs au dictionnaire contexte. Par exemple je vais vous montrer comment ajouter la météo actuelle. Pour cela je fais appel au site wttr.in avec le paramètre

Terminal window
curl https://wttr.in/
Tourcoing, France: ☀️ +23°C

Ce qui se traduit en python en utilisant la librairie requests :

Terminal window
from profile_readme import get_github_context, ProfileGenerator
import requests
def get_weather(city):
# declare the client. format defaults to the metric system (celcius, km/h, etc.)
url = 'https://wttr.in/{}?format=3'.format(city)
res = requests.get(url)
return res.text
if __name__ == "__main__":
weather = get_weather("Lille")
context = {
"weather" : weather,
}
context.update(**get_github_context("votre_profil"))
ProfileGenerator.render(
template_path="README-TEMPLATE.j2",
output_path="README.md",
context=context,
)

On update la variable contexte avec la fonction du même nom. Ensuite dans le fichier template on ajoute ces lignes :

## Weather
{{ weather }}

On relance la génération et on obtient :

# Hey! Nice to see you
Welcome to my page!
I'm my_name, a geek from **Lille, France**....
**My blog**: [myblog.exemple.com](https://myblog.exemple.com)
Tourcoing, France: ☀️ +23°C

Vous avez compris le principe ? Si oui il vous reste plus qu’à … Mais non, allez dans mon profil et copiez les quelques fonctions que j’ai écrites :

  • ajouter de bagdes du projet shields.io
  • ajouts de liens
  • ajoutes des 3 derniers billets de mon blog