4
4
from typing import Any , Callable , Dict , Generic , List , Optional , Set , Type , TypeVar , Union
5
5
6
6
from .collections import ensure_list
7
- from .strings import first_char_to_lower
7
+ from .strings import first_char_to_lower , first_char_to_upper
8
8
9
9
ComplexType = Union [List , Dict , object ]
10
10
@@ -155,8 +155,10 @@ def recurse_object(obj: ComplexType, func: Callable, path: str = "") -> ComplexT
155
155
return obj
156
156
157
157
158
- def keys_to_lower (obj : ComplexType , skip_children_of : List [str ] = None ) -> ComplexType :
159
- """Recursively changes all dict keys to first character lowercase. Skip children
158
+ def keys_to (
159
+ obj : ComplexType , op : Callable [[str ], str ], skip_children_of : List [str ] = None
160
+ ) -> ComplexType :
161
+ """Recursively changes all dict keys to apply op. Skip children
160
162
of any elements whose names are contained in skip_children_of (e.g., ['Tags'])"""
161
163
skip_children_of = ensure_list (skip_children_of or [])
162
164
@@ -166,13 +168,21 @@ def fix_keys(o, path="", **kwargs):
166
168
if isinstance (o , dict ):
167
169
for k , v in dict (o ).items ():
168
170
o .pop (k )
169
- o [first_char_to_lower (k )] = v
171
+ o [op (k )] = v
170
172
return o
171
173
172
174
result = recurse_object (obj , fix_keys )
173
175
return result
174
176
175
177
178
+ def keys_to_lower (obj : ComplexType , skip_children_of : List [str ] = None ) -> ComplexType :
179
+ return keys_to (obj , first_char_to_lower , skip_children_of )
180
+
181
+
182
+ def keys_to_upper (obj : ComplexType , skip_children_of : List [str ] = None ) -> ComplexType :
183
+ return keys_to (obj , first_char_to_upper , skip_children_of )
184
+
185
+
176
186
def singleton_factory (factory : Callable [[], _T ]) -> Callable [[], _T ]:
177
187
"""
178
188
Decorator for methods that create a particular value once and then return the same value in a thread safe way.
0 commit comments