1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 __doc__ = \
21 """
22 pywurfl WURFL class hierarchy serializer
23 """
24
25 from time import ctime
26
27 try:
28 from xml.etree.ElementTree import ElementTree, Element, SubElement
29 except ImportError:
30 try:
31 from cElementTree import ElementTree, Element, SubElement
32 except ImportError:
33 from elementtree.ElementTree import ElementTree, Element, SubElement
34
35 from pywurfl import __version__ as pw_version
36 from pywurfl.exceptions import WURFLException
37
38
39 __author__ = "Armand Lynch <lyncha@users.sourceforge.net>"
40 __copyright__ = "Copyright 2006-2009, Armand Lynch"
41 __license__ = "LGPL"
42 __url__ = "http://celljam.net/"
43 __all__ = ['Serialize']
44
45
48 self.root_device = devices.select_id('generic', instance=False)
49 self.common_caps = ['actual_device_root', 'children', 'devid', 'devua',
50 'groups', 'fall_back']
51 self.cap_groups = {}
52
54 group = self.cap_groups.get(cap)
55 if group is None:
56 for group in self.root_device.groups:
57 if cap in self.root_device.groups[group]:
58 self.cap_groups[cap] = group
59 return group
60 else:
61 msg = "'%s' capability does not belong to a generic group"
62 raise WURFLException(msg % cap)
63 return group
64
66 if isinstance(x, bool):
67 if x:
68 return "true"
69 else:
70 return "false"
71 if isinstance(x, (int, float, long)):
72 return str(x)
73 return x
74
75 - def _walk(self, device, devices):
76 new_dev = SubElement(devices, 'device')
77 new_dev.set('fall_back', device.fall_back)
78 new_dev.set('id', device.devid)
79 new_dev.set('user_agent', device.devua)
80 if device.actual_device_root:
81 new_dev.set('actual_device_root', 'true')
82
83 groups = {}
84 for cap in (c for c in device.__dict__ if c not in self.common_caps and
85 not c.startswith('_')):
86 value = self._get_value(getattr(device, cap))
87 try:
88 groups[self._find_group(cap)].append((cap, value))
89 except (AttributeError, KeyError):
90 groups[self._find_group(cap)] = [(cap, value)]
91
92
93 for group in groups:
94 new_group = SubElement(new_dev, 'group')
95 new_group.set('id', group)
96 for cap, value in groups[group]:
97 new_cap = SubElement(new_group, 'capability')
98 new_cap.set('name', cap)
99 new_cap.set('value', value)
100
101 for child in device.children:
102 self._walk(child, devices)
103
105 """
106 Serialize pywurfl's WURFL class hierarchy to xml
107
108 @param filename: The filename to save the hierarchy to
109 @type filename: string
110 """
111
112 root = Element('wurfl')
113 version = SubElement(root, 'version')
114 ver = SubElement(version, 'ver')
115 ver.text = "Generated by pywurfl v%s" % pw_version
116 last_updated = SubElement(version, 'last_updated')
117 last_updated.text = ctime()
118
119 devs = SubElement(root, 'devices')
120
121 self._walk(self.root_device, devs)
122
123 tree = ElementTree(root)
124 tree.write(filename)
125
126
127 if __name__ == '__main__':
128 from wurfl import devices
129 Serialize(devices).to_xml('my.xml')
130