fix that last commit.. hrm
[ncclient] / ncclient / capabilities.py
1 # Copyright 2009 Shikhar Bhushan
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #    http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 #_capability_map = {
16 #    "urn:liberouter:params:netconf:capability:power-control:1.0":
17 #        [":power-control", ":power-control:1.0"]
18 #}
19
20 def _abbreviate(uri):
21     if uri.startswith("urn:ietf:params:netconf:"):
22         splitted = uri.split(":")
23         if ":capability:" in uri:
24             return [ ":" + splitted[5], ":" + splitted[5] + ":" + splitted[6] ]
25         elif ":base:" in uri:
26             return [ ":base", ":base" + ":" + splitted[5] ]
27     #elif uri in _capability_map:
28     #    return _capability_map[uri]
29     return []
30
31 def schemes(url_uri):
32     """Given a URI that has a *scheme* query string (i.e. *:url* capability
33     URI), will return a list of supported schemes.
34     """
35     return url_uri.partition("?scheme=")[2].split(",")
36
37 class Capabilities:
38
39     """Represents the set of capabilities available to a NETCONF client or
40     server.
41     
42     Presence of a capability can be checked with the *in* operation. In addition
43     to the URI, for capabilities of the form
44     *urn:ietf:params:netconf:capability:$name:$version* their shorthand can be
45     used as a key. For example, for
46     *urn:ietf:params:netconf:capability:candidate:1.0* the shorthand would be
47     *:candidate*. If version is significant, use *:candidate:1.0* as key.
48     """
49     
50     def __init__(self, capabilities):
51         "Initializes with a list of capability URI's"
52         self._dict = {}
53         for uri in capabilities:
54             self._dict[uri] = _abbreviate(uri)
55
56     def __contains__(self, key):
57         if key in self._dict:
58             return True
59         for abbrs in self._dict.values():
60             if key in abbrs:
61                 return True
62         return False
63
64     def __len__(self):
65         return len(self._dict)
66
67     def __iter__(self):
68         return self._dict.keys().__iter__()
69
70     def __repr__(self):
71         return repr(self._dict.keys())
72
73     def __list__(self):
74         return self._dict.keys()
75
76     def add(self, uri):
77         "Add a capability"
78         self._dict[uri] = _abbreviate(uri)
79
80     def remove(self, uri):
81         "Remove a capability"
82         if key in self._dict:
83             del self._dict[key]
84     
85     def get_uri(self, shorthand):
86         for uri, abbrs in self._dict.items():
87             if shorthand in abbrs:
88                 return uri