root / ncclient / content / builders.py @ 8b4b9936
History | View | Annotate | Download (2.9 kB)
1 | 1dd43130 | Shikhar Bhushan | # Copyright 2009 Shikhar Bhushan
|
---|---|---|---|
2 | 1dd43130 | Shikhar Bhushan | #
|
3 | 1dd43130 | Shikhar Bhushan | # Licensed under the Apache License, Version 2.0 (the "License");
|
4 | 1dd43130 | Shikhar Bhushan | # you may not use this file except in compliance with the License.
|
5 | 1dd43130 | Shikhar Bhushan | # You may obtain a copy of the License at
|
6 | 1dd43130 | Shikhar Bhushan | #
|
7 | 1dd43130 | Shikhar Bhushan | # http://www.apache.org/licenses/LICENSE-2.0
|
8 | 1dd43130 | Shikhar Bhushan | #
|
9 | 1dd43130 | Shikhar Bhushan | # Unless required by applicable law or agreed to in writing, software
|
10 | 1dd43130 | Shikhar Bhushan | # distributed under the License is distributed on an "AS IS" BASIS,
|
11 | 1dd43130 | Shikhar Bhushan | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12 | 1dd43130 | Shikhar Bhushan | # See the License for the specific language governing permissions and
|
13 | 1dd43130 | Shikhar Bhushan | # limitations under the License.
|
14 | 1dd43130 | Shikhar Bhushan | |
15 | 1dd43130 | Shikhar Bhushan | from xml.etree import cElementTree as ET |
16 | 1dd43130 | Shikhar Bhushan | |
17 | 1dd43130 | Shikhar Bhushan | from common import BASE_NS |
18 | 1dd43130 | Shikhar Bhushan | from common import qualify as _ |
19 | 1dd43130 | Shikhar Bhushan | |
20 | 1dd43130 | Shikhar Bhushan | class TreeBuilder: |
21 | 1dd43130 | Shikhar Bhushan | '''Build an ElementTree.Element instance from an XML tree specification
|
22 | 1dd43130 | Shikhar Bhushan | based on nested dictionaries.
|
23 | 1dd43130 | Shikhar Bhushan | '''
|
24 | 1dd43130 | Shikhar Bhushan | |
25 | 1dd43130 | Shikhar Bhushan | def __init__(self, spec): |
26 | 8b4b9936 | Shikhar Bhushan | self._root = TreeBuilder.build(spec)
|
27 | 1dd43130 | Shikhar Bhushan | |
28 | 1dd43130 | Shikhar Bhushan | def to_string(self, encoding='utf-8'): |
29 | 1dd43130 | Shikhar Bhushan | return ET.tostring(self._root, encoding) |
30 | 1dd43130 | Shikhar Bhushan | |
31 | 1dd43130 | Shikhar Bhushan | @property
|
32 | 1dd43130 | Shikhar Bhushan | def tree(self): |
33 | 1dd43130 | Shikhar Bhushan | return self._root |
34 | 1dd43130 | Shikhar Bhushan | |
35 | 1dd43130 | Shikhar Bhushan | @staticmethod
|
36 | 1dd43130 | Shikhar Bhushan | def build(spec): |
37 | 1dd43130 | Shikhar Bhushan | 'Returns constructed ElementTree.Element'
|
38 | 1dd43130 | Shikhar Bhushan | if spec.has_key('tag'): |
39 | 1dd43130 | Shikhar Bhushan | ele = ET.Element(spec.get('tag'), spec.get('attributes', {})) |
40 | 1dd43130 | Shikhar Bhushan | ele.text = spec.get('text', '') |
41 | 1dd43130 | Shikhar Bhushan | for child in spec.get('children', []): |
42 | 8b4b9936 | Shikhar Bhushan | ele.append(TreeBuilder.build(child)) |
43 | 1dd43130 | Shikhar Bhushan | return ele
|
44 | 1dd43130 | Shikhar Bhushan | elif spec.has_key('comment'): |
45 | 1dd43130 | Shikhar Bhushan | return ET.Comment(spec.get('comment')) |
46 | 1dd43130 | Shikhar Bhushan | else:
|
47 | 1dd43130 | Shikhar Bhushan | raise ValueError('Invalid tree spec') |
48 | 1dd43130 | Shikhar Bhushan | |
49 | 1dd43130 | Shikhar Bhushan | |
50 | 1dd43130 | Shikhar Bhushan | class HelloBuilder: |
51 | 1dd43130 | Shikhar Bhushan | |
52 | 1dd43130 | Shikhar Bhushan | @staticmethod
|
53 | 1dd43130 | Shikhar Bhushan | def build(capabilities, encoding='utf-8'): |
54 | 1dd43130 | Shikhar Bhushan | children = [{'tag': 'capability', 'text': uri } for uri in capabilities] |
55 | 1dd43130 | Shikhar Bhushan | spec = { |
56 | 8b4b9936 | Shikhar Bhushan | 'tag': _('hello', BASE_NS), |
57 | 1dd43130 | Shikhar Bhushan | 'children': [{
|
58 | 1dd43130 | Shikhar Bhushan | 'tag': 'capabilities', |
59 | 1dd43130 | Shikhar Bhushan | 'children': children
|
60 | 1dd43130 | Shikhar Bhushan | }] |
61 | 1dd43130 | Shikhar Bhushan | } |
62 | 1dd43130 | Shikhar Bhushan | return TreeBuilder(spec).to_string(encoding)
|
63 | 1dd43130 | Shikhar Bhushan | |
64 | 1dd43130 | Shikhar Bhushan | |
65 | 1dd43130 | Shikhar Bhushan | class RPCBuilder: |
66 | 1dd43130 | Shikhar Bhushan | |
67 | 1dd43130 | Shikhar Bhushan | @staticmethod
|
68 | 8b4b9936 | Shikhar Bhushan | def build(msgid, op, encoding='utf-8'): |
69 | 8b4b9936 | Shikhar Bhushan | if isinstance(opspec, basestring): |
70 | 8b4b9936 | Shikhar Bhushan | return build_from_string(msgid, op, encoding)
|
71 | 8b4b9936 | Shikhar Bhushan | else:
|
72 | 8b4b9936 | Shikhar Bhushan | return build_from_spec(msgid, op, encoding)
|
73 | 8b4b9936 | Shikhar Bhushan | |
74 | 8b4b9936 | Shikhar Bhushan | @staticmethod
|
75 | 1dd43130 | Shikhar Bhushan | def build_from_spec(msgid, opspec, encoding='utf-8'): |
76 | 1dd43130 | Shikhar Bhushan | if isinstance(opspec, dict): |
77 | 1dd43130 | Shikhar Bhushan | opspec = [opspec] |
78 | 1dd43130 | Shikhar Bhushan | return TreeBuilder({
|
79 | 8b4b9936 | Shikhar Bhushan | 'tag': _('rpc', BASE_NS), |
80 | 1dd43130 | Shikhar Bhushan | 'attributes': {'message-id': msgid}, |
81 | 1dd43130 | Shikhar Bhushan | 'children': opspec
|
82 | 1dd43130 | Shikhar Bhushan | }).to_string(encoding) |
83 | 1dd43130 | Shikhar Bhushan | |
84 | 1dd43130 | Shikhar Bhushan | @staticmethod
|
85 | 1dd43130 | Shikhar Bhushan | def build_from_string(msgid, opstr, encoding='utf-8'): |
86 | 1dd43130 | Shikhar Bhushan | decl = '<?xml version="1.0" encoding="%s"?>' % encoding
|
87 | 1dd43130 | Shikhar Bhushan | doc = (u'''<rpc message-id="%s" xmlns="%s">%s</rpc>''' %
|
88 | 1dd43130 | Shikhar Bhushan | (msgid, RPC.NS, opstr)).encode(encoding) |
89 | 1dd43130 | Shikhar Bhushan | return (decl + doc) |