/[ambar]/ambar/guion.py
ViewVC logotype

Diff of /ambar/guion.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2.2 by amoyav, Mon Jun 16 05:54:12 2003 UTC revision 2.3 by TuringTest, Sun Aug 24 23:34:41 2003 UTC
# Line 62  class Guion(object): Line 62  class Guion(object):
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
# Line 249  class Guion(object): Line 249  class Guion(object):
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.

Legend:
Removed from v.2.2  
changed lines
  Added in v.2.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26