Tagging module PLCAPI - PLCAPI-5.0-1
[plcapi.git] / PLC / Legacy / Types.py
1 # Thierry Parmentelat - INRIA
2 # $Id$
3
4 from PLC.Method import Method
5
6 def import_deep(name):
7     mod = __import__(name)
8     components = name.split('.')
9     for comp in components[1:]:
10         mod = getattr(mod, comp)
11     return mod
12
13 map = {
14     "AddSliceAttributeType"         : "AddTagType",
15     "DeleteSliceAttributeType"      : "DeleteTagType",
16     "GetSliceAttributeTypes"        : "GetTagTypes",
17     "UpdateSliceAttributeType"      : "UpdateTagType",
18     "AddNodeNetworkSettingType"     : "AddTagType",
19     "DeleteNodeNetworkSettingType"  : "DeleteTagType",
20     "GetNodeNetworkSettingTypes"    : "GetTagTypes",
21     "UpdateNodeNetworkSettingType"  : "UpdateTagType",
22 }    
23
24 methods = map.keys()
25
26 # does any required renaming
27 def rename (x):
28     if x=='name':
29         return 'tagname'
30     else:
31         return x
32
33 # apply rename on list (columns) or dict (filter) args
34 def patch_legacy_arg (arg):
35     if isinstance(arg,list):
36         return [rename(x) for x in arg]
37     if isinstance(arg,dict):
38         return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
39     return arg
40
41 def legacy_method (legacyname, newname):
42     # locate new class
43     newclass=getattr(import_deep("PLC.Methods."+newname),newname)
44     # create class for legacy name
45     legacyclass = type(legacyname,(newclass,), 
46                        {"__doc__":"Legacy method - please use %s instead"%newname})
47     for internal in ["roles","accepts","returns"]:
48         setattr(legacyclass,internal,getattr(newclass,internal))
49     # turn off type checking, as introspection code fails on wrapped_call
50     setattr(legacyclass,"skip_typecheck",True)
51     # rewrite call
52     def wrapped_call (self,auth,*args, **kwds):
53         newargs=[patch_legacy_arg(x) for x in args]
54         newkwds=dict ( [ (k,patch_legacy_arg(v)) for (k,v) in kwds.iteritems() ] )
55         return getattr(newclass,"call")(self,auth,*newargs,**newkwds)
56     setattr(legacyclass,"call",wrapped_call)
57
58     return legacyclass
59
60 import sys
61 current_module=sys.modules[__name__]
62
63 for (legacyname,newname) in map.iteritems():
64     setattr(current_module,legacyname,legacy_method(legacyname,newname))
65