/
configuration.py
155 lines (131 loc) · 4.77 KB
/
configuration.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#
# Lopez Aliaume
#
# Un utilitaire de modification
# des fichiers de configuration
#
#
# Ce code a pour vocation d'être simple
# et compréhensible, afin de servir de modèle
# pour l'utilisation des modules « persistance »
# et l'utilisation des générateurs comme « fsm »
#
#
# Chaque ligne de code est comméntée le mieux possible,
# afin de vous permettre de comprendre les buts et
# moyens !
#
#
# OBJECTIF: permettre l'édition par un programme des
# variables de configuration, écrites dans des fichiers
# « illisibles » par l'utilisateur normal ... Permettant
# ainsi de configurer des comportements, en utilisant un
# outil adapté, qui empêche de faire n'importe quoi
import persistance
import iconsole
"""
Une FSM :
Variables:
- fichier
États:
- sélection fichier
* « help »
* « entrer »
* « liste »
- sélection variable
+ sélection fichier : « up »
+ sélection variable :
* « éditer »
* « liste »
* « ou »
* « help »
"""
def gen_fsm ():
""" Crée la FSM ... c'est toute la fonction la plus importante """
# Variables de la FSM
fichier = ""
st = "menu-fichier"
while True:
# Là est toute la magnificience
# on rend la main avec l'état actuel (comme ça les gens peuvent
# savoir où on est)
# mais la prochaine exécution ... demande une action à faire
# (et comme la boucle est infinie ... on revient toujours attendre
# à ce point exact de la boucle :-P.
req = (yield st) # on sauve dans une variable
if st == "menu-fichier": # Si on est dans le menu-fichier les commandes sont
if req == "list":
# On affiche la liste des fichiers
# disponnibles
iconsole.afficher (st, persistance.liste_fichiers ())
elif req == "entrer":
# Yop, on transite vers l'état menu-variable
# SI ET SEULEMENT SI l'utilisateur
# a sélectionné un fichier !!!
if fichier != "":
st = "menu-variable"
else:
iconsole.afficher (st,"Vous n'avez pas sélectionné un fichier ...")
elif req == "help":
# L'aide affiche la liste des commandes possibles
iconsole.afficher (st, "Les commandes sont : « quit », « list », « entrer », « help » et @Fichier")
else: # C'est un nom de fichier
# On suppose que si ce n'est pas une commande,
# c'est un nom de fichier, et on change donc
# le fichier sélectionné
fichier = req
iconsole.afficher (st,"Vous avez sélectionné " + req)
else: # il n'existe que deux états, celui là est donc menu-variable
# On a forcément définit un fichier,
# vu que l'on ne peut être arrivé à cet état
# QUE par une transition !
if req == "list":
# On affiche simplement la liste des variables disponnibles
iconsole.afficher (st, persistance.liste_variables (fichier))
elif req == "up":
# On retourne au menu fichier ... tout con
st = "menu-fichier"
elif req == "ou":
# On dit à l'utilisateur où il se trouve, c'est à dire le fichier courant
iconsole.afficher (st, "Le fichier courant est : "+ fichier)
elif req == "help":
# On affiche la liste des commandes disponnibles
iconsole.afficher (st, "Les commandes sont : « quit », « ou », « list », « help », « up » et @Variable")
else: # C'est une variable
# On suppose que si ce n'est pas une commande c'est une variable
# à modifier ... Donc on demande la nouvelle valeur
# et on modifie ...
try:
iconsole.afficher (st, "Valeur actuelle : " + str (persistance.get_propriete (fichier,req)))
except:
iconsole.afficher (st, "Nouvelle variable !")
val = iconsole.demander (st,"Nouvelle valeur")
persistance.set_propriete (fichier,req,val)
iconsole.afficher (st,"Bien modifié !")
if __name__ == '__main__':
# On initalise la persistance, pour
# avoir accès et charger les fichiers
persistance.init ()
# On crée une machine comme définit en début de fichier
machine = gen_fsm ()
#st = machine.next () # premier yield, pour savoir le nom de l'état et initialiser le générateur
st = next (machine)
# La boucle infinie ... moche !
while True:
# On actualise l'état courant à chaque
# tour de boucle ...
# Un prompt personnalisé, demande une commande
req = iconsole.demander (st, "Commande")
# Ici on fait un switch entre les états
# C'est là que se déroule toutes les
# redirections ... Je ne sais pas trop comment
# faire cela autrement :-)
# Quelque soit l'état ... on peut quitter ! :-)
if req == "quit":
break # On sort de la boucle, sauve, et quitte le programme
st = machine.send (req) # on l'envoie à la machine
# Une fois la boucle terminée, on doit
# sauver les modifications (sinon c'est con nan ?)
persistance.save ()