11 Commits

Author SHA1 Message Date
d4d595ed68 Ajout d'un fichier de test avec pytest
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 17:07:12 +01:00
9026dd56cc Changement dans l'exécution du script
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:52:15 +01:00
6bd2b3c66c On exécute le programme
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:50:52 +01:00
01337279fc Ajout de docstrings. Pylint est content
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:47:46 +01:00
d8c6b6e6bf Factorisation de tests
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:45:23 +01:00
ecec88e230 Il faut aussi renommer les variables dans leurs usages
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:43:18 +01:00
9018ab4996 On renomme a, b et c qui ne sont pas suffisamment explicites
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:41:07 +01:00
ca69954315 On quitte un programme avec sys.exit
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:37:48 +01:00
4c241eeb60 On ne redéfinit pas des fonctions pré-implémentées
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:35:59 +01:00
5e55a65b3f Pas d'espace entre le nom du paramètre et la valeur par défaut. flake8 est content
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:33:45 +01:00
e551f8b98d Les lignes ne doivent pas être trop longues
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
2021-01-26 16:32:03 +01:00
4 changed files with 94 additions and 47 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
*.pyc
venv

View File

@ -1,5 +1,6 @@
stages:
- linting
- test
flake8:
@ -18,3 +19,9 @@ pylint:
- pip install pylint --no-cache-dir
script: pylint main.py
allow_failure: true
test:
stage: test
image: python:3-alpine
script: pytest --show-locals .

108
main.py Normal file → Executable file
View File

@ -1,84 +1,98 @@
#!/usr/bin/env python
#!/usr/bin/env python3
"""
Ce script est utilisé en guise d'appui pour le séminaire Crans d'introduction
à l'intégration continue.
Le dépôt est présent sur https://gitlab.crans.org/ynerant/seminaire-ci.git
Plus d'informations sur les séminaires : https://www.crans.org/fr/seminaire/
"""
from random import choice
import sys
def main():
"""
Fonction principale, qui va attendre les instructions de l'utilisateur.
"""
print("Bienvenue dans le chatbot du séminaire de l'intégration continue !")
print("Veuillez taper une commande. Tapez \"help\" pour afficher l'aide.")
print("Veuillez taper une commande. Tapez \"aide\" pour afficher l'aide.")
while True:
command = input("> ")
args = command.split(" ")
print(globals()[args[0]](*args[1:]))
print(commande(args[0], *args[1:]))
def help():
def commande(name: str, *args):
return globals()[name](*args)
def aide():
"""
Affiche l'aide
"""
print("help\t\tAffiche l'aide")
print("aide\t\tAffiche l'aide")
print("seminaire\tLance le séminaire")
print("blague\t\tRaconte une blague")
print("calcul\t\tVérifie une opération arithmétique. Par exemple, check(1, 2, 3, '+') renvoie True")
print("calcul\t\tVérifie une opération arithmétique. "
"Par exemple, check(1, 2, 3, '+') renvoie True")
print("tri\t\tTrie une liste d'entiers.")
print("quit\t\tQuitte le programme")
print("stop\t\tQuitte le programme")
def seminaire():
"""
Affiche les slides du séminaire.
"""
print("\x4c\x61\x69\x73\x73\x65\x20\x74\x6f\x6d\x62\x65\x72\x2c\x20\x74\x6f\x6e\x20\x74\x72\x75\x63\x20\x65\x73\x74\x20\x74\x72\x6f\x70\x20\x62\x65\x75\x67\x75\xe9\x2c\x20\x74\x75\x20\x64\x65\x76\x72\x61\x69\x73\x20\x70\x61\x73\x73\x65\x72\x20\x64\x75\x20\x74\x65\x6d\x70\x73\x20\xe0\x20\xe9\x63\x72\x69\x72\x65\x20\x64\x65\x73\x20\x74\x65\x73\x74\x73\x20\x65\x74\x20\x66\x61\x69\x72\x65\x20\x64\xe9\x66\x69\x6c\x65\x72\x20\x74\x65\x73\x20\x73\x6c\x69\x64\x65\x73")
print("\x4c\x61\x69\x73\x73\x65\x20\x74\x6f\x6d\x62\x65"
"\x72\x2c\x20\x74\x6f\x6e\x20\x74\x72\x75\x63\x20"
"\x65\x73\x74\x20\x74\x72\x6f\x70\x20\x62\x65\x75"
"\x67\x75\xe9\x2c\x20\x74\x75\x20\x64\x65\x76\x72"
"\x61\x69\x73\x20\x70\x61\x73\x73\x65\x72\x20\x64"
"\x75\x20\x74\x65\x6d\x70\x73\x20\xe0\x20\xe9\x63"
"\x72\x69\x72\x65\x20\x64\x65\x73\x20\x74\x65\x73"
"\x74\x73\x20\x65\x74\x20\x66\x61\x69\x72\x65\x20"
"\x64\xe9\x66\x69\x6c\x65\x72\x20\x74\x65\x73\x20"
"\x73\x6c\x69\x64\x65\x73")
def blague():
"""
Renvoie une blague aléatoire.
"""
return choice(["Je vais vous raconter une blague sur, mais vous ne l'aurez peut-être pas.", "Connaissez-vous la différence entre la théroie et la pratique ? Il n'y en a pas, en théorie."])
return choice(
["Je vais vous raconter une blague sur, mais vous "
"ne l'aurez peut-être pas.",
"Connaissez-vous la différence entre la théroie "
"et la pratique ? Il n'y en left pas, en théorie."])
def calcul(a, b, c, operation = '+'):
def calcul(left: int, right: int, res: int, operation='+'):
"""
Vérifie si a operation b == c, où a, b et c sont des entiers.
Vérifie si left operation b == c, où a, b et c sont des entiers.
L'opération peut être +, -, *, /, &, |, ^, % ou l'un de ses alias anglais.
"""
if operation == '+':
result = a + b
if operation == 'sum':
result = a + b
if operation == 'add':
result = a + b
if operation == '-':
result = a - b
if operation == 'sub':
result = a - b
if operation == '*':
result = a * b
if operation == 'mul':
result = a * b
if operation == 'prod':
result = a * b
if operation == '/':
result = a / b
if operation == 'div':
result = a / b
if operation == '&':
result = a & b
if operation == 'and':
result = a & b
if operation == '|':
result = a | b
if operation == 'or':
result = a | b
if operation == '^':
result = a ^ b
if operation == 'xor':
result = a ^ b
if operation in ['+', 'add', 'sum']:
result = left + right
if operation in ['-', 'sub']:
result = left - right
if operation in ['*', 'mul', 'prod']:
result = left * right
if operation in ['/', 'div']:
result = left / right
if operation in ['&', 'and']:
result = left & right
if operation in ['|', 'or']:
result = left | right
if operation in ['^', 'xor']:
result = left ^ right
else:
result = a % b
return c == result
result = left % right
return res == result
def tri(*args):
@ -88,12 +102,12 @@ def tri(*args):
return sorted(args)
def quit(exit_code: int = 0):
def stop(exit_code: int = 0):
"""
Stoppe le programme avec le code d'erreur donné.
"""
print("Fin du programme, merci !")
exit(exit_code)
sys.exit(exit_code)
if __name__ == '__main__':

24
main_test.py Executable file
View File

@ -0,0 +1,24 @@
#!/usr/bin/env python3
"""
Exécution des tests du script.
"""
import unittest
import main
def test_aide():
"""
On essaie d'afficher l'aide, et on vérifie si ça affiche la bonne chose.
"""
res = main.commande("aide")
lines = res.split("\n")
assert len(lines) == 6
assert lines[0].startswith("aide")
assert lines[1].startswith("seminaire")
assert lines[2].startswith("blague")
assert lines[3].startswith("calcul")
assert lines[4].startswith("tri")
assert lines[5].startswith("stop")