"""
Module pour l'exportation des données.
"""
from os.path import abspath, isdir, join
from json import dump
from altair import Chart, Theta, Color
from pandas import DataFrame
[docs]
class Exporteur:
"""
Représente un exporteur de données pour exporter des données
vers un fichier de sortie.
Attributes:
_chemin_sortie (str): Le chemin du dossier vers lequel les données
vont être exportées.
"""
def __init__(self, chemin_sortie: str):
# Vérification du paramètre
if not isinstance(chemin_sortie, str):
raise TypeError("Le chemin de sortie doit être une chaîne de caractères.")
# Vérification du chemin
chemin_sortie_absolue = abspath(chemin_sortie)
if not isdir(chemin_sortie_absolue):
raise ExportationDossierIntrouvableException(f"Impossible d'exporter vers le "
f"dossier {chemin_sortie} ({chemin_sortie_absolue}), "
"le dossier n'existe pas.")
# Ajout du chemin
self._chemin_sortie = chemin_sortie
[docs]
def export_vers_json(self, donnees: dict, nom_fichier: str) -> None:
"""
Export le dictionnaire fourni vers le ``chemin de sortie``.
Args:
donnees (dict): Le dictionnaire qui contient les données.
nom_fichier (str): Le nom du fichier JSON.
Returns:
None
Raises:
TypeError: Le paramètre ``donnees`` n'est pas un dictionnaire.
ExportationJsonException: Une erreur lors de l'écriture dans le fichier JSON.
"""
# Vérification du type des paramètres
if not isinstance(donnees, dict):
raise TypeError("Les statistiques à exporter doivent être sous une forme "
"de dictionnaire.")
if not isinstance(nom_fichier, str):
raise TypeError("Le nom du fichier doit être une chaîne de caractère.")
# Vérification du nom du fichier
if not nom_fichier.endswith(".json"):
raise ValueError("Le fichier JSON doit terminé par l'extention '.json'.")
# Exportation
chemin_fichier = join(self._chemin_sortie, nom_fichier)
try:
with open(chemin_fichier, 'w', encoding="utf-8") as fichier:
dump(donnees, fichier, indent=4)
except Exception as ex:
raise ExportationJsonException(str(ex)) from ex
[docs]
def export_vers_html_camembert(self,
donnees: list,
nom_fichier: str) -> None:
"""
Export la liste fournie vers un camembert HTML vers le ``chemin de sortie``.
Args:
donnees (list): Les données du camembert. La liste doit contenir
des listes de deux éléments où le premier reprèsente le nom de cette
partie du camembert et le deuxième sa valeur.
nom_fichier (str): Le nom du fichier HTML.
Returns:
None
Raises:
TypeError: Les paramètres ne sont pas du type attendu ou la liste ``donnees``
contient un élément qui n'est pas une liste.
ValueError: Le paramètre ``nom_fichier`` ne termine pas par .html ou le paramètre
``donnees`` ne contient pas des listes de longueur 2.
ExportationCamembertHtmlException: Erreur lors de l'exportation du camembert.
"""
# Vérification du type des paramètres
if not isinstance(donnees, list):
raise TypeError("Les données de l'histogramme à exporter doit être sous une forme "
"de liste.")
if not isinstance(nom_fichier, str):
raise TypeError("Le nom du fichier doit être une chaîne de caractère.")
# Vérification du nom du fichier
if not nom_fichier.endswith(".html"):
raise ValueError("Le fichier HTML doit terminé par l'extention '.html'.")
# Récupération des axes du graphique
axe_x = []
axe_y = []
for donnee in donnees:
if not isinstance(donnee, list):
raise ValueError("La liste des données de l'histogramme à exporter ne doit "
"contenir que des listes.")
if not len(donnee) == 2:
raise ValueError("La liste des données de l'histogramme à exporter ne doit "
"contenir que des listes de deux éléments (x, y).")
axe_x.append(donnee[0])
axe_y.append(donnee[1])
axes = DataFrame({"x": axe_x, "y": axe_y})
# Exportation
try:
chemin_fichier = join(self._chemin_sortie, nom_fichier)
base = Chart(axes).encode(
theta=Theta(field="y", type="quantitative"),
color=Color(field="x", type="nominal"),
tooltip=['x:N', 'y:Q']
)
camembert = base.mark_arc(outerRadius=200)
graphique = (camembert).properties(
width=400,
height=400
)
graphique.save(chemin_fichier)
except Exception as ex:
raise ExportationCamembertHtmlException("Erreur lors de l'exportation "
f"du camembert {nom_fichier} {ex}.") from ex
[docs]
class ExportationException(Exception):
"""
Représente une erreur lors de l'exportation de données.
"""
[docs]
class ExportationJsonException(ExportationException):
"""
Représente une erreur lors de l'exportation de données vers un format JSON.
"""
[docs]
class ExportationCamembertHtmlException(ExportationException):
"""
Représente une erreur lors de l'exportation de données vers un histogramme
au format HTML.
"""
[docs]
class ExportationDossierIntrouvableException(ExportationException):
"""
Représente une erreur lorsque une exportation est impossible
lorsque le dossier de l'exportation n'existe pas.
"""