Ce workshop vous apprendra a créer une api avec Fast-api puis à la tester avec POSTMAN.
L'API créee vous permettra de gérer les données de la moulinette afin de créer une liste de tâches à faire pour chaque Projet EPITECH
Documentation Github Client: https://cli.github.com/manual/
Documentation Fast-Api: https://fastapi.tiangolo.com/tutorial/
Il vous faudra d'abord si ce n'est pas déjà fait installer Fast-Api et POSTMAN sur votre machine:
Lien pour installer POSTMAN : https://www.postman.com/downloads/
pip install "fastapi[all]"Pour vérifier l'installation ajouter le script suivant dans le fichier main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}Puis exécuter la commande suivante dans votre terminal :
uvicorn main:app --reloadUne fois l'API lancée, vous pouvez tester son bon fonctionnement de la manière suivante grâce à POSTMAN en utilisant le lien sur lequel votre api se host :
Si tout se passe bien vous devriez obtenir cela :
Pour cela, il va nous falloir envoyer une requête à l'api de TekMe , nous devons d'en un premier temps importé la librairie python requests dans notre main.py
Puis effectué la ligne suivante dans laquelle il vous faut remplacer TOKEN-TEKME par votre token que vous devrez trouver sur tekme sur la page des moulinette en faisant F12 en cliquant sur l'onglet réseau :
import requests
resultat = requests.get('https://tekme.eu/api/profile/moulinettes', headers={'Authorization': 'TOKEN-TEKME'})Pour vérifier le résultat, on ajoute au path de notre api /mouli de la manière suivante :
@app.get("/mouli")
async def root():
return resultat.json()Effectuer une requête à l'aide de postman :

Il nous faut maintenant être capable de récupérer les informations d'un projet.
Pour cela, nous allons faire en sorte de pouvoir mettre le nom d'un projet dans le path de l'api afin qu'elle nous sorte les infos de celui-ci, collé le code suivant dans main.py:
@app.get("/{item_name}")
async def read_item(item_name: str):
passed = True
index = 0
os.makedirs('/tmp/mouli', exist_ok=True)
##création des fichiers pour les issues et le repo
issue = open('/tmp/mouli/data.txt', "w")
repo = open('/tmp/mouli/repo.txt', "w")
##on parcours jobs pour trouver le projet
##on regarde si le projet est celui qu'on cherche
##si oui on écrit l'URL du repo dans le fichier repo.txt
##on parcours les skills pour récupérer les tests qui ne sont pas passés
for i in resultat.json().get('jobs'):
if i.get('project') == item_name:
repo.write(i.get('trace').get('githubUrl'))
get_failed_test(issue, i, passed, index)
issue.close()
return 0
return 84Complété le code de get_failed_test() et de write_issue() appelé dans get_failed_test() :
def get_failed_test(issue, i, passed, index):
for skill in i.get('trace').get('skills'):
## on attribue a chaque skills un numero selon leur ordre d'apparition
## afin de les retrouver plus facilement
index += 1
## on parcourt les tests de chaque skills pour voir si ils sont tous passés
## à compléter
## si un test n'est pas passé, on passe la variable passed a False
## à compléter
if passed == False:
write_issue(issue, skill, index)
passed = Truedef write_issue(issue, skill, index):
## ecrit dans le fichier issue.txt le nom du skill et le numero du skill
## pour chaque skill qui n'a pas passé les tests
issue.write("Skill " + str(index) + " : " + skill.get('name') + "\n")
for test in skill.get('tests'):
if test.get('comment') == "PASSED":
continue
## ecrit dans le fichier issue.txt le nom du test et le commentaire du test
## dans le format suivant :
## "TX : Nom du test : commentaire du test"
## X est le numero du test
passFaite un cat de /tmp/mouli/data pour vérifier si le parsing est correcte
Nous avons désormais notre API nous permettant de récupérer les données de la mouli
Créer un Personnal Access Token depuis les developer settings dans les paramètres
Lancer la commande suivante et suivait les instruction :
gh auth loginune fois, cela fait prenez le temps de jeter un coup d’œil au fonctionnement de Github client.
Créer un fichier nommé ManageIssue.sh
ManageIssue.sh s’exécutera de la manière suivante :
./ManageIssue [NomDuProjet]Envoyer, une requête a notre api dans ManageIssue.sh afin d'obtenir les données traitées plus tôt
args=("$@")
## on récupère les différents arguments.
repo=${args[0]}
## on récupère le premier argument soit [NomDuProjet]
title=("")
i = 0
sleep 1
## on effectue une request a notre api
curl --location --request GET "http://XXX.X.X.X:XXXX/$repo" --header 'Content-Type: application/json'On a maintenant nos données dans /tmp/mouli/data.txt et dans /tmp/mouli/repo.txt
Grace a l'URL enregistré dans /tmp/mouli/repo.txt vous devez a l'aide github CLI récupéré la liste des issue dans un répo. Vous devriez obtenir cela si le repo ne possède aucune issue:
There are no open issues in EpitechPromo20XX/B-PSU-200-MPL-2-1-minishell1-prenom.nom
Créer manuellement une issue dans le repo puis relancer la commande
Showing 1 of 1 open issue in EpitechPromo20XX/B-PSU-200-MPL-2-1-minishell1-prenom.nom
#68 test less than a minute agoPour nous rendre la tache plus facile, nous allons faire en sorte de récupéré uniquement les numéros des issues sous forme de JSON grâce au flag --json number qu'on va venir ajouter a la commande ce qui va nous permettre d'obtenir le résultat suivant :
[
{
"number": 68
}
]A l'aide de la commande Github CLI gh issue create crée une issue dans le repo de votre choix, vous devriez obtenir le message suivant :
Creating issue in EpitechPromo2028/B-PSU-200-MPL-2-1-minishell1-prenom.nom
voici le code pour le parsing:
while read -r line; do
if [ -z "$line" ] && [ "$i" -eq "1" ]; then
gh issue create --title "$title" --body "$(cat /tmp/mouli/tmp.txt)" --repo $full_name
rm /tmp/mouli/tmp.txt
i=0
fi
if [ "$i" -eq "0" ] && [ ! -z "$line" ]; then
title=$line
i=1
else
echo "$line" >> /tmp/mouli/tmp.txt
fi
done < /tmp/mouli/data.txtVous disposez maintenant de toutes les clés afin de pouvoir compléter le fichier ManageIssue.sh bien évidemment si vous préférez, vous pouvez le faire dans un autre langage
Voici un exemple de ce que vous pouvez obtenir :
0 EpitechPromo2028/B-PSU-100-MPL-1-1-myls-julien.sery
✓ Closed issue #8 (06 - char device tests)
✓ Closed issue #7 (05 - '-t' option tests)
Creating issue in EpitechPromo2028/B-PSU-100-MPL-1-1-myls-julien.sery
https://github.com/EpitechPromo2028/B-PSU-100-MPL-1-1-myls-julien.sery/issues/9
Creating issue in EpitechPromo2028/B-PSU-100-MPL-1-1-myls-julien.sery
https://github.com/EpitechPromo2028/B-PSU-100-MPL-1-1-myls-julien.sery/issues/10
Issues posted successfully
https://github.com/EpitechPromo2028/B-PSU-100-MPL-1-1-myls-julien.sery/À vous de faire le vôtre et de le personnaliser à votre guise



