62 |
|
|
63 |
id = property(__leer_id, |
id = property(__leer_id, |
64 |
doc="""(string): identifica univocamente al guion, si ha sido leido desde |
doc="""(string): identifica univocamente al guion, si ha sido leido desde |
65 |
un fichero. Si el guión es parte de otro fichero distinto, id = None. |
un fichero. Si el guión es parte de otro fichero distinto, id = None. |
66 |
|
|
67 |
No puede contener espacios. |
No puede contener espacios. |
68 |
""") |
""") |
69 |
|
|
70 |
def __leer_version(self): return self.__version |
def __leer_version(self): return self.__version |
71 |
|
|
72 |
version = property(__leer_version, |
version = property(__leer_version, |
73 |
doc="""(int): la versión del sistema de guiones. |
doc="""(int): la versión del sistema de guiones. |
74 |
|
|
75 |
Invariantes: |
Invariantes: |
76 |
version != None |
version != None |
77 |
""") |
""") |
78 |
|
|
79 |
def __leer_autor(self): return self.__autor |
def __leer_autor(self): return self.__autor |
80 |
|
|
81 |
autor = property(__leer_autor, |
autor = property(__leer_autor, |
82 |
doc="""autor (string): identifica al autor del guion. |
doc="""autor (string): identifica al autor del guion. |
83 |
|
|
84 |
Invariantes: |
Invariantes: |
85 |
autor != None |
autor != None |
86 |
""") |
""") |
87 |
|
|
88 |
def __leer_comentario(self): return self.__comentario |
def __leer_comentario(self): return self.__comentario |
89 |
|
|
90 |
comentario = property(__leer_comentario, |
comentario = property(__leer_comentario, |
91 |
doc="""(string): un metacomentario acerca del guion. |
doc="""(string): un metacomentario acerca del guion. |
92 |
|
|
93 |
Invariantes: |
Invariantes: |
94 |
comentario != None |
comentario != None |
95 |
""") |
""") |
96 |
|
|
97 |
|
|
98 |
def __leer_secuencia(self): return self.__secuencia |
def __leer_secuencia(self): return self.__secuencia |
99 |
|
|
100 |
secuencia = property(__leer_secuencia, |
secuencia = property(__leer_secuencia, |
101 |
doc="""(Requisito|Accion[]): lista de requisitos y acciones, en orden. |
doc="""(Requisito|Accion[]): lista de requisitos y acciones, en orden. |
102 |
|
|
103 |
Los requisitos, a su vez, contienen guiones dentro de <cumplido> y <no_cumplido>. |
Los requisitos, a su vez, contienen guiones dentro de <cumplido> y <no_cumplido>. |
104 |
|
|
105 |
Invariantes: |
Invariantes: |
106 |
secuencia != None |
secuencia != None |
107 |
""") |
""") |
108 |
|
|
109 |
|
|
110 |
# Constructor |
# Constructor |
111 |
|
|
112 |
def __init__(self, elem_guion, macros, macros_extra = {}): |
def __init__(self, elem_guion, macros, macros_extra = {}): |
113 |
"""Parsea un nodo conteniendo una lista de elementos <accion>, <requisito> o <guion>. |
"""Parsea un nodo conteniendo una lista de elementos <accion>, <requisito> o <guion>. |
114 |
|
|
115 |
macros ((string, string)[]) es una lista con los nombres y tipos de las |
macros ((string, string)[]) es una lista con los nombres y tipos de las |
116 |
macros permitidos en el contexto de este guion. |
macros permitidos en el contexto de este guion. |
117 |
|
|
118 |
macros_extra (string:any) es un diccionario de macros que serán pasados |
macros_extra (string:any) es un diccionario de macros que serán pasados |
119 |
al guion cuando se ejecute, además de los que se pasen al método ejecutar(). |
al guion cuando se ejecute, además de los que se pasen al método ejecutar(). |
120 |
|
|
121 |
Requiere: |
Requiere: |
122 |
elem_guion != None |
elem_guion != None |
123 |
macros != None |
macros != None |
124 |
""" |
""" |
125 |
|
|
126 |
# Atributos privados: |
# Atributos privados: |
127 |
# |
# |
128 |
# __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripción. |
# __fecha_fichero (int): fecha de la ultima modificacion del fichero de descripción. |
129 |
# __macros_extra (string:any): macros que se pasan a la ejecución del guion, desde |
# __macros_extra (string:any): macros que se pasan a la ejecución del guion, desde |
130 |
# el sitio en el fichero ha sido invocado. |
# el sitio en el fichero ha sido invocado. |
131 |
# |
# |
132 |
# Invariantes: |
# Invariantes: |
133 |
# __id == None -> __fecha_fichero = None |
# __id == None -> __fecha_fichero = None |
134 |
# __id != None -> __fecha_fichero >= 0 |
# __id != None -> __fecha_fichero >= 0 |
135 |
|
|
136 |
|
if extraer_nombre_xml(elem_guion) == 'desc_guion': |
137 |
|
|
138 |
if extraer_nombre_xml(elem_guion) == 'desc_guion': |
# Estamos leyendo un fichero XML de descripcion de guion. |
139 |
|
self.__id = extraer_atributo_xml(elem_guion, 'id') |
140 |
# Estamos leyendo un fichero XML de descripcion de guion. |
version_desc_guion = extraer_atributo_xml(elem_guion,'version') |
141 |
self.__id = extraer_atributo_xml(elem_guion, 'id') |
if version_desc_guion != Guion.VERSION_DESC_GUION: |
142 |
|
raise ValueError("Version incorrecta del fichero descriptor de guion " + |
143 |
version_desc_guion = extraer_atributo_xml(elem_guion,'version') |
self.__id + ": " + version_desc_guion + " cuando se esperaba " + |
144 |
if version_desc_guion != Guion.VERSION_DESC_GUION: |
Guion.VERSION_DESC_GUION) |
145 |
raise ValueError("Version incorrecta del fichero descriptor de guion " + |
|
146 |
self.__id + ": " + version_desc_guion + " cuando se esperaba " + |
self.__version = Guion.VERSION_GUION |
147 |
Guion.VERSION_DESC_GUION) |
|
148 |
|
self.__autor = extraer_atributo_xml(elem_guion,'autor') |
149 |
self.__version = Guion.VERSION_GUION |
|
150 |
|
if elem_guion.hasAttribute('comentario'): |
151 |
self.__autor = extraer_atributo_xml(elem_guion,'autor') |
self.__comentario = extraer_atributo_xml(elem_guion,'comentario') |
152 |
|
else: |
153 |
if elem_guion.hasAttribute('comentario'): |
self.__comentario = "" |
154 |
self.__comentario = extraer_atributo_xml(elem_guion,'comentario') |
|
155 |
else: |
else: |
156 |
self.__comentario = "" |
|
157 |
|
# Estamos leyendo un guion incrustado dentro de otro fichero XML |
158 |
else: |
self.__id = None |
159 |
|
self.__version = None |
160 |
# Estamos leyendo un guion incrustado dentro de otro fichero XML |
self.__autor = None |
161 |
self.__id = None |
self.__comentario = None |
162 |
self.__version = None |
self.__fecha_fichero = None |
163 |
self.__autor = None |
|
164 |
self.__comentario = None |
self.__macros_extra = macros_extra |
165 |
self.__fecha_fichero = None |
self.__secuencia = [] |
166 |
|
|
167 |
self.__macros_extra = macros_extra |
for elem in elem_guion.childNodes: |
168 |
self.__secuencia = [] |
if extraer_nombre_xml(elem) == "accion": |
169 |
|
acc = Accion.nueva_xml(elem, macros) |
170 |
for elem in elem_guion.childNodes: |
self.__secuencia.append(Accion.nueva_xml(elem, macros)) |
171 |
if extraer_nombre_xml(elem) == "accion": |
elif extraer_nombre_xml(elem) == "requisito": |
172 |
acc = Accion.nueva_xml(elem, macros) |
self.__secuencia.append(Requisito.nuevo_xml(elem, macros)) |
173 |
self.__secuencia.append(Accion.nueva_xml(elem, macros)) |
elif extraer_nombre_xml(elem) == "guion": |
174 |
elif extraer_nombre_xml(elem) == "requisito": |
self.__parsear_fichero(elem, macros, macros_extra) |
|
self.__secuencia.append(Requisito.nuevo_xml(elem, macros)) |
|
|
elif extraer_nombre_xml(elem) == "guion": |
|
|
self.__parsear_fichero(elem, macros, macros_extra) |
|
175 |
|
|
176 |
|
|
177 |
# Métodos privados |
# Métodos privados |
178 |
|
|
179 |
def __parsear_fichero(self, elem_guion, macros, macros_extra): |
def __parsear_fichero(self, elem_guion, macros, macros_extra): |
180 |
id = extraer_atributo_xml(elem_guion, 'id') |
id = extraer_atributo_xml(elem_guion, 'id') |
181 |
|
|
182 |
for i in range(0, elem_guion.attributes.length): |
for i in range(0, elem_guion.attributes.length): |
183 |
attr = elem_guion.attributes.item(i) |
attr = elem_guion.attributes.item(i) |
184 |
if attr.name != 'id': |
if attr.name != 'id': |
185 |
macros_extra["$" + attr.name] = extraer_atributo_xml(elem_guion, attr.name) |
macros_extra["$" + attr.name] = extraer_atributo_xml(elem_guion, attr.name) |
186 |
|
|
187 |
archivo = os.path.join(Guion.DIR_DESC_GUIONES, id + Guion.EXT_DESC_GUIONES) |
archivo = os.path.join(Guion.DIR_DESC_GUIONES, id + Guion.EXT_DESC_GUIONES) |
188 |
self.__fecha_fichero = os.path.getmtime(archivo) |
self.__fecha_fichero = os.path.getmtime(archivo) |
189 |
arbol_xml = minidom.parse(archivo) |
arbol_xml = minidom.parse(archivo) |
190 |
|
|
191 |
elem_desc_guion = arbol_xml.documentElement |
elem_desc_guion = arbol_xml.documentElement |
192 |
|
|
193 |
self.__secuencia.append(Guion(elem_desc_guion, macros, macros_extra)) |
self.__secuencia.append(Guion(elem_desc_guion, macros, macros_extra)) |
194 |
# Observar que un guion puede contener recursivamente otros guiones |
# Observar que un guion puede contener recursivamente otros guiones |
195 |
|
|
196 |
|
|
197 |
# Métodos normales |
# Métodos normales |
198 |
|
|
199 |
def ejecutar(self, macros): |
def ejecutar(self, macros): |
200 |
"""Ejecuta el guion en cuestion. |
"""Ejecuta el guion en cuestion. |
201 |
|
|
202 |
macros({String:any}) es un diccionario de los nombres de las macros a su valor |
macros({String:any}) es un diccionario de los nombres de las macros a su valor |
203 |
final. |
final. |
204 |
|
|
205 |
Devuelve el resultado final de "aceptar" (1) o "cancelar" (0), o bien None |
Devuelve el resultado final de "aceptar" (1) o "cancelar" (0), o bien None |
206 |
si no se ha especificado (la serie no contiene ninguna de las dos acciones). |
si no se ha especificado (la serie no contiene ninguna de las dos acciones). |
207 |
|
|
208 |
Requiere: |
Requiere: |
209 |
macros != None |
macros != None |
210 |
""" |
""" |
211 |
resultado = None |
trazar("ejecutando guion clasico" % self.__id, "pnj", 2) |
212 |
|
resultado = None |
213 |
macros_total = macros |
|
214 |
macros_total.update(self.__macros_extra) |
macros_total = macros |
215 |
|
macros_total.update(self.__macros_extra) |
216 |
for instancia in self.__secuencia: |
|
217 |
if instancia.__class__.__name__ == "Accion": |
for instancia in self.__secuencia: |
218 |
if instancia.nombre == "aceptar": |
if instancia.__class__.__name__ == "Accion": |
219 |
resultado = 1 |
if instancia.nombre == "aceptar": |
220 |
elif instancia.nombre == "cancelar": |
resultado = 1 |
221 |
resultado = 0 |
elif instancia.nombre == "cancelar": |
222 |
else: |
resultado = 0 |
223 |
instancia.ejecutar(macros_total) |
else: |
224 |
elif instancia.__class__.__name__ == "Requisito": |
instancia.ejecutar(macros_total) |
225 |
r = instancia.comprobar(macros_total) |
elif instancia.__class__.__name__ == "Requisito": |
226 |
if r != None: |
r = instancia.comprobar(macros_total) |
227 |
resultado = r |
if r != None: |
228 |
elif instancia.__class__.__name__ == "Guion": |
resultado = r |
229 |
instancia.ejecutar(macros_total) |
elif instancia.__class__.__name__ == "Guion": |
230 |
|
instancia.ejecutar(macros_total) |
231 |
|
|
232 |
return resultado |
return resultado |
233 |
|
|
234 |
|
|
235 |
#%% def activar(self): |
#%% def activar(self): |
236 |
#%% """Realiza algunos chequeos periodicos de integridad del guion. |
#%% """Realiza algunos chequeos periodicos de integridad del guion. |
237 |
#%% Los chequeos se pueden hacer, por ejemplo, al coger el guion. |
#%% Los chequeos se pueden hacer, por ejemplo, al coger el guion. |
238 |
#%% """ |
#%% """ |
239 |
#%% archivo = os.path.join(Guion.DIR_DESC_GUIONES, self.__id + Guion.EXT_DESC_GUIONES) |
#%% archivo = os.path.join(Guion.DIR_DESC_GUIONES, self.__id + Guion.EXT_DESC_GUIONES) |
240 |
#%% if self.__fecha_fichero < os.path.getmtime(archivo): |
#%% if self.__fecha_fichero < os.path.getmtime(archivo): |
241 |
#%% # Si se modifica el fichero descriptor, recargarlo de nuevo |
#%% # Si se modifica el fichero descriptor, recargarlo de nuevo |
242 |
#%% # reseteando completamente el guion |
#%% # reseteando completamente el guion |
243 |
#%% escribir("Recargando guion " + self.__id + " desde el fichero de descripcion") |
#%% escribir("Recargando guion " + self.__id + " desde el fichero de descripcion") |
244 |
#%% self.__inicializar_guion(???????) |
#%% self.__inicializar_guion(???????) |
245 |
|
|
246 |
|
|
247 |
# Métodos especiales |
# Métodos especiales |
249 |
def __setstate__(self, atributos): |
def __setstate__(self, atributos): |
250 |
"""Método llamado para restaurar los atributos provinientes de un pickle.""" |
"""Método llamado para restaurar los atributos provinientes de un pickle.""" |
251 |
|
|
252 |
self.__dict__ = atributos |
self.__dict__ = atributos |
253 |
|
|
254 |
if self.__id != None: |
if self.__id != None: |
255 |
# Verificar la versión (sólo para guiones leídos de fichero). |
# Verificar la versión (sólo para guiones leídos de fichero). |
256 |
if not self.__dict__.has_key("_Guion__version"): |
if not self.__dict__.has_key("_Guion__version"): |
257 |
raise ValueError("Cargado guion " + self.id + " obsoleto: sin versión," + |
raise ValueError("Cargado guion " + self.id + " obsoleto: sin versión," + |
258 |
" cuando se esperaba " + Guion.VERSION_GUION) |
" cuando se esperaba " + Guion.VERSION_GUION) |
259 |
|
|
260 |
assert(Guion.VERSION_GUION == "1.0.0") |
assert(Guion.VERSION_GUION == "1.0.0") |
261 |
while self.__version != "1.0.0": |
while self.__version != "1.0.0": |
262 |
|
|
263 |
# Aquí se irá poniendo el código para convertir automáticamente a versiones futuras. |
# Aquí se irá poniendo el código para convertir automáticamente a versiones futuras. |
264 |
|
|
265 |
raise ValueError("Cargado guion " + self.__id + " con versión desconocida: " + |
raise ValueError("Cargado guion " + self.__id + " con versión desconocida: " + |
266 |
str(self.__version) + " cuando se esperaba " + Guion.VERSION_GUION) |
str(self.__version) + " cuando se esperaba " + Guion.VERSION_GUION) |
267 |
|
|
268 |
|
|
269 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |