1616
1717def _cast_to_dict (obj ): return {cast (k ): cast (v ) for k , v in obj .items ()}
1818def _cast_to_list (obj ): return [cast (v ) for v in obj ]
19+ def _cast_to_set (obj ): return set (cast (v ) for v in obj )
20+ def _cast_to_tuple (obj ): return tuple (cast (v ) for v in obj )
1921def _cast_unsafe (obj ): return obj ._strip_unsafe ()
2022def _passthrough (obj ): return obj
23+ def _untag (obj ): return obj ._native_copy ()
2124
2225
2326# A dispatch table to cast objects based on their exact type.
@@ -26,30 +29,64 @@ def _passthrough(obj): return obj
2629 bytes : bytes ,
2730 dict : _cast_to_dict ,
2831 list : _cast_to_list ,
29- tuple : _cast_to_list ,
3032 mitogen .core .UnicodeType : mitogen .core .UnicodeType ,
3133}
3234_CAST_DISPATCH .update ({t : _passthrough for t in mitogen .utils .PASSTHROUGH })
3335
34- if ansible_mitogen .utils .ansible_version [:2 ] >= (2 , 19 ):
36+ _CAST_SUBTYPES = [
37+ dict ,
38+ list ,
39+ ]
40+
41+ if hasattr (ansible .utils .unsafe_proxy , 'TrustedAsTemplate' ):
42+ import datetime
43+ import ansible .module_utils ._internal ._datatag
3544 _CAST_DISPATCH .update ({
45+ set : _cast_to_set ,
46+ tuple : _cast_to_tuple ,
47+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedBytes : _untag ,
48+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedDate : _untag ,
49+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedDateTime : _untag ,
50+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedDict : _cast_to_dict ,
51+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedFloat : _untag ,
52+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedInt : _untag ,
53+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedList : _cast_to_list ,
54+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedSet : _cast_to_set ,
55+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedStr : _untag ,
56+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedTime : _untag ,
57+ ansible .module_utils ._internal ._datatag ._AnsibleTaggedTuple : _cast_to_tuple ,
3658 ansible .utils .unsafe_proxy .AnsibleUnsafeBytes : bytes ,
3759 ansible .utils .unsafe_proxy .AnsibleUnsafeText : mitogen .core .UnicodeType ,
60+ datetime .date : _passthrough ,
61+ datetime .datetime : _passthrough ,
62+ datetime .time : _passthrough ,
3863 })
64+ _CAST_SUBTYPES .extend ([
65+ set ,
66+ tuple ,
67+ ])
3968elif hasattr (ansible .utils .unsafe_proxy .AnsibleUnsafeText , '_strip_unsafe' ):
4069 _CAST_DISPATCH .update ({
70+ tuple : _cast_to_list ,
4171 ansible .utils .unsafe_proxy .AnsibleUnsafeBytes : _cast_unsafe ,
4272 ansible .utils .unsafe_proxy .AnsibleUnsafeText : _cast_unsafe ,
4373 ansible .utils .unsafe_proxy .NativeJinjaUnsafeText : _cast_unsafe ,
4474 })
75+ _CAST_SUBTYPES .extend ([
76+ tuple ,
77+ ])
4578elif ansible_mitogen .utils .ansible_version [:2 ] <= (2 , 16 ):
4679 _CAST_DISPATCH .update ({
80+ tuple : _cast_to_list ,
4781 ansible .utils .unsafe_proxy .AnsibleUnsafeBytes : bytes ,
4882 ansible .utils .unsafe_proxy .AnsibleUnsafeText : mitogen .core .UnicodeType ,
4983 })
84+ _CAST_SUBTYPES .extend ([
85+ tuple ,
86+ ])
5087else :
5188 mitogen_ver = '.' .join (str (v ) for v in mitogen .__version__ )
52- raise ImportError ("Mitogen %s can't unwrap Ansible %s AnsibleUnsafe objects"
89+ raise ImportError ("Mitogen %s can't cast Ansible %s objects"
5390 % (mitogen_ver , ansible .__version__ ))
5491
5592
@@ -78,7 +115,9 @@ def cast(obj):
78115 return unwrapper (obj )
79116
80117 # Slow path: obj is some unknown subclass
81- if isinstance (obj , dict ): return _cast_to_dict (obj )
82- if isinstance (obj , (list , tuple )): return _cast_to_list (obj )
118+ for typ_ in _CAST_SUBTYPES :
119+ if isinstance (obj , typ_ ):
120+ unwrapper = _CAST_DISPATCH [typ_ ]
121+ return unwrapper (obj )
83122
84123 return mitogen .utils .cast (obj )
0 commit comments