Aller au contenu principal

Générer votre profil github dynamiquement en python

· 5 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.

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 :

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 :

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 :

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 :

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

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

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

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
  • ...