22Module pour l'exportation des données.
33"""
44
5- from os .path import abspath , dirname , isdir
5+ from os .path import abspath , isdir , join
66from json import dump
7+ from altair import Chart
8+ from pandas import DataFrame
79
810
911class Exporteur :
@@ -12,88 +14,131 @@ class Exporteur:
1214 vers un fichier de sortie.
1315
1416 Attributes:
15- _chemin_sortie (str): Le chemin du fichier vers lequel
16- les données seront exportées.
17+ _chemin_sortie (str): Le chemin du dossier vers lequel les données
18+ vont être exportées.
1719 """
1820
1921 def __init__ (self , chemin_sortie : str ):
20- """
21- Initialise un exporteur de données.
22-
23- Args:
24- chemin_sortie (str): Le chemin du fichier vers lequel
25- les données seront exportées.
26-
27- Raises:
28- TypeError: Le chemin de sortie n'est pas une chaîne de caractère.
29- ExportationDossierParentException: Exportation impossible à cause de
30- l'inexistance du dossier parent du fichier d'exportation.
31- """
32- # Vérification du type du paramètre
22+ # Vérification du paramètre
3323 if not isinstance (chemin_sortie , str ):
34- raise TypeError ("Le chemin de sortie doit être une chaîne de caractère." )
35- # Vérification du chemin d'exportation
36- self .verification_exportation_possible (chemin_sortie )
37- # Ajout du chemin d'exportation
24+ raise TypeError ("Le chemin de sortie doit être une chaîne de caractères." )
25+ # Vérification du chemin
26+ chemin_sortie_absolue = abspath (chemin_sortie )
27+ if not isdir (chemin_sortie_absolue ):
28+ raise ExportationDossierIntrouvableException (f"Impossible d'exporter vers le "
29+ f"dossier { chemin_sortie } ({ chemin_sortie_absolue } ), "
30+ "le dossier n'existe pas." )
31+ # Ajout du chemin
3832 self ._chemin_sortie = chemin_sortie
3933
40- def verification_exportation_possible (self , chemin_sortie : str ) -> None :
34+ def export_vers_json (self , donnees : dict , nom_fichier : str ) -> None :
4135 """
42- Vérifie qu'une exportation est possible vers le chemin du fichier indiqué. Renvoie une
43- exception expliquant le problème si elle n'est pas possible.
36+ Export le dictionnaire fourni vers le ``chemin de sortie``.
4437
4538 Args:
46- chemin_sortie (str): Le chemin du fichier d'exportation.
39+ donnees (dict): Le dictionnaire qui contient les données.
40+ nom_fichier (str): Le nom du fichier JSON.
4741
4842 Returns:
4943 None
5044
5145 Raises:
52- ExportationDossierParentException: Le dossier parent du fichier n'existe pas.
46+ TypeError: Le paramètre ``donnees`` n'est pas un dictionnaire.
47+ ExportationJsonException: Une erreur lors de l'écriture dans le fichier JSON.
5348 """
54- # Vérification du type du paramètre
55- if not isinstance (chemin_sortie , str ):
56- raise TypeError ("Le chemin de sortie doit être une chaîne de caractères." )
57- # Vérification du chemin
58- chemin_sortie_absolue = abspath (chemin_sortie )
59- dossier_parent = dirname (chemin_sortie_absolue )
60- if not isdir (dossier_parent ):
61- raise ExportationDossierParentException (f"Impossible d'exporter vers le "
62- f"fichier { chemin_sortie } , son dossier parent "
63- f"{ dossier_parent } n'existe pas." )
49+ # Vérification du type des paramètres
50+ if not isinstance (donnees , dict ):
51+ raise TypeError ("Les statistiques à exporter doivent être sous une forme "
52+ "de dictionnaire." )
53+ if not isinstance (nom_fichier , str ):
54+ raise TypeError ("Le nom du fichier doit être une chaîne de caractère." )
55+ # Vérification du nom du fichier
56+ if not nom_fichier .endswith (".json" ):
57+ raise ValueError ("Le fichier JSON doit terminé par l'extention '.json'." )
58+ # Exportation
59+ chemin_fichier = join (self ._chemin_sortie , nom_fichier )
60+ try :
61+ with open (chemin_fichier , 'w' , encoding = "utf-8" ) as fichier :
62+ dump (donnees , fichier , indent = 4 )
63+ except Exception as ex :
64+ raise ExportationJsonException (str (ex )) from ex
6465
65- def export_vers_json (self , donnees : dict ) -> None :
66+ def export_vers_html_camembert (self ,
67+ donnees : list ,
68+ nom_fichier : str ) -> None :
6669 """
67- Export le dictionnaire fourni vers le :attr:` chemin de sortie`.
70+ Export la liste fournie vers un camembert HTML vers le `` chemin de sortie` `.
6871
6972 Args:
70- donnees (dict): Le dictionnaire qui contient les données.
73+ donnees (list): Les données du camembert. La liste doit contenir
74+ des listes de deux éléments où le premier reprèsente le nom de cette
75+ partie du camembert et le deuxième sa valeur.
76+ nom_fichier (str): Le nom du fichier HTML.
7177
7278 Returns:
7379 None
7480
7581 Raises:
76- TypeError: Le paramètre ``donnees`` n'est pas un dictionnaire.
77- ExportationException: Une erreur lors de l'écriture dans le fichier JSON.
82+ TypeError: Les paramètres ne sont pas du type attendu ou la liste ``donnees``
83+ contient un élément qui n'est pas une liste.
84+ ValueError: Le paramètre ``nom_fichier`` ne termine pas par .html ou le paramètre
85+ ``donnees`` ne contient pas des listes de longueur 2.
86+ ExportationCamembertHtmlException: Erreur lors de l'exportation du camembert.
7887 """
79- # Vérification du type du paramètre
80- if not isinstance (donnees , dict ):
81- raise TypeError ("Les données à exporter doivent être sous une forme "
82- "de dictionnaire." )
88+ # Vérification du type des paramètres
89+ if not isinstance (donnees , list ):
90+ raise TypeError ("Les données de l'histogramme à exporter doit être sous une forme "
91+ "de liste." )
92+ if not isinstance (nom_fichier , str ):
93+ raise TypeError ("Le nom du fichier doit être une chaîne de caractère." )
94+ # Vérification du nom du fichier
95+ if not nom_fichier .endswith (".html" ):
96+ raise ValueError ("Le fichier HTML doit terminé par l'extention '.html'." )
97+ # Récupération des axes du graphique
98+ axe_x = []
99+ axe_y = []
100+ for donnee in donnees :
101+ if not isinstance (donnee , list ):
102+ raise ValueError ("La liste des données de l'histogramme à exporter ne doit "
103+ "contenir que des listes." )
104+ if not len (donnee ) == 2 :
105+ raise ValueError ("La liste des données de l'histogramme à exporter ne doit "
106+ "contenir que des listes de deux éléments (x, y)." )
107+ axe_x .append (donnee [0 ])
108+ axe_y .append (donnee [1 ])
109+ axes = DataFrame ({"x" : axe_x , "y" : axe_y })
83110 # Exportation
84111 try :
85- with open (self ._chemin_sortie , 'w' , encoding = "utf-8" ) as fichier :
86- dump (donnees , fichier , indent = 4 )
112+ chemin_fichier = join (self ._chemin_sortie , nom_fichier )
113+ camembert = Chart (axes ).mark_arc ().encode (
114+ theta = 'y:Q' ,
115+ color = 'x:N' ,
116+ tooltip = ['x:N' , 'y:Q' ]
117+ )
118+ camembert .save (chemin_fichier )
87119 except Exception as ex :
88- raise ExportationException (str (ex )) from ex
120+ raise ExportationCamembertHtmlException ("Erreur lors de l'exportation "
121+ f"du camembert { nom_fichier } ." ) from ex
122+
89123
90124class ExportationException (Exception ):
91125 """
92126 Représente une erreur lors de l'exportation de données.
93127 """
94128
95- class ExportationDossierParentException (ExportationException ):
129+ class ExportationJsonException (ExportationException ):
130+ """
131+ Représente une erreur lors de l'exportation de données vers un format JSON.
132+ """
133+
134+ class ExportationCamembertHtmlException (ExportationException ):
135+ """
136+ Représente une erreur lors de l'exportation de données vers un histogramme
137+ au format HTML.
138+ """
139+
140+ class ExportationDossierIntrouvableException (ExportationException ):
96141 """
97142 Représente une erreur lorsque une exportation est impossible
98- lorsque le dossier parent du fichier d 'exportation n'existe pas.
143+ lorsque le dossier de l 'exportation n'existe pas.
99144 """
0 commit comments