]> git.llucax.com Git - z.facultad/75.43/tp1.git/blob - util/clases2spec.py
Informe actualizado con mi parte.
[z.facultad/75.43/tp1.git] / util / clases2spec.py
1 #!/usr/bin/env python
2 # -*- coding: iso-8859-1 -*-
3
4 from xml.sax import saxutils
5
6 # Estados
7 E_CLASS         = 1
8 E_CLASS_NAME    = 2
9 E_CLASS_COMMENT = 3
10 E_ATTRS         = 4
11 E_ATTR          = 5
12 E_ATTR_NAME     = 6
13 E_ATTR_COMMENT  = 7
14 E_ATTR_TYPE     = 8
15
16 # Caracteres a eliminar
17 STRIPCHARS = '#\t\n '
18
19 class ObjFinder(saxutils.DefaultHandler):
20     def __init__(self):
21         self.estado = None
22         self.clases = []
23         self.curr = None
24         self.curr_attr = None
25     def startElement(self, name, attrs):
26         #print " #### Start <%s %s>" % (name, dict(attrs))
27         if name == 'dia:object': # Comienzo de una clase
28             if attrs.get('type', None) == 'UML - Class':
29                 self.curr = {}
30                 self.estado = E_CLASS
31         elif name == 'dia:attribute':
32             name = attrs.get('name', None)
33             if self.estado == E_CLASS:   # Datos de la clase
34                 if name == 'name':     # Nombre de la clase
35                     self.curr['name'] = ''
36                     self.estado = E_CLASS_NAME
37                 elif name == 'comment':  # Es la descripción de la clase
38                     self.curr['comment'] = ''
39                     self.estado = E_CLASS_COMMENT
40                 elif name == 'attributes': # Paso empezó a encontrar atributos
41                     self.curr['attrs'] = []
42                     self.estado = E_ATTRS
43             elif self.estado == E_ATTR:  # Datos del atributo
44                 if name == 'name':       # Nombre del atributo
45                     self.curr_attr['name'] = ''
46                     self.estado = E_ATTR_NAME
47                 elif name == 'type':     # Es el tipo del atributo
48                     self.curr_attr['type'] = ''
49                     self.estado = E_ATTR_TYPE
50                 elif name == 'comment':  # Es la descripción del atributo
51                     self.curr_attr['comment'] = ''
52                     self.estado = E_ATTR_COMMENT
53         elif name == 'dia:composite': # Comienzo de attributos de clase
54             if self.estado == E_ATTRS:  # Si estoy en una clase
55                 self.curr_attr = {}
56                 self.estado = E_ATTR   # Paso a buscar sus atributos
57     def characters(self, data):
58         if self.estado == E_CLASS_NAME:
59             self.curr['name'] += data.strip(STRIPCHARS)
60         elif self.estado == E_CLASS_COMMENT:
61             self.curr['comment'] += data.strip(STRIPCHARS)
62         elif self.estado == E_ATTR_NAME:
63             self.curr_attr['name'] += data.strip(STRIPCHARS)
64         elif self.estado == E_ATTR_TYPE:
65             self.curr_attr['type'] += data.strip(STRIPCHARS)
66         elif self.estado == E_ATTR_COMMENT:
67             self.curr_attr['comment'] += data.strip(STRIPCHARS)
68     def endElement(self, name):
69         #print " #### Endt </%s>" % name
70         if name == 'dia:object':
71             if self.estado == E_CLASS:
72                 self.clases.append(self.curr)
73                 self.estado = None
74                 self.curr = None
75         elif name == 'dia:attribute':
76             if self.estado == E_CLASS_NAME:
77                 self.estado = E_CLASS
78             if self.estado == E_CLASS_COMMENT:
79                 self.estado = E_CLASS
80             if self.estado == E_ATTR_NAME:
81                 self.estado = E_ATTR
82             if self.estado == E_ATTR_TYPE:
83                 self.estado = E_ATTR
84             if self.estado == E_ATTR_COMMENT:
85                 self.estado = E_ATTR
86             if self.estado == E_ATTRS:
87                 self.estado = E_CLASS
88         elif name == 'dia:composite':
89             if self.estado == E_ATTR:
90                 self.curr['attrs'].append(self.curr_attr)
91                 self.curr_attr = None
92                 self.estado = E_ATTRS
93
94
95 if __name__ == '__main__':
96     import sys
97     from xml.sax import make_parser
98     from xml.sax.handler import feature_namespaces
99
100     # Verifica parámetros
101     if len(sys.argv) < 2:
102         print >>sys.stderr, 'Uso:', sys.argv[0], 'archivo.dia'
103         sys.exit(1)
104
105     # Create a parser
106     parser = make_parser()
107
108     # Tell the parser we are not interested in XML namespaces
109     parser.setFeature(feature_namespaces, 0)
110
111     # Create the handler
112     dh = ObjFinder()
113
114     # Tell the parser to use our handler
115     parser.setContentHandler(dh)
116
117     # Parse the input
118     parser.parse(sys.argv[1])
119
120     # Recorro clases obtenidas
121     for c in dh.clases:
122         print
123         print 'Clase:', c['name']
124         print 'Descripción:', c['comment']
125         print 'Atributos:'
126         for a in c['attrs']:
127             print '    %(name)s (%(type)s): %(comment)s' % a
128
129
130 # vim: set et sw=4 sts=4 :