aboutsummaryrefslogtreecommitdiff
path: root/catapult/common/py_utils/py_utils/camel_case.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/common/py_utils/py_utils/camel_case.py')
-rw-r--r--catapult/common/py_utils/py_utils/camel_case.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/catapult/common/py_utils/py_utils/camel_case.py b/catapult/common/py_utils/py_utils/camel_case.py
new file mode 100644
index 00000000..9a768902
--- /dev/null
+++ b/catapult/common/py_utils/py_utils/camel_case.py
@@ -0,0 +1,30 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import re
+
+
+def ToUnderscore(obj):
+ """Converts a string, list, or dict from camelCase to lower_with_underscores.
+
+ Descends recursively into lists and dicts, converting all dict keys.
+ Returns a newly allocated object of the same structure as the input.
+ """
+ if isinstance(obj, basestring):
+ return re.sub('(?!^)([A-Z]+)', r'_\1', obj).lower()
+
+ elif isinstance(obj, list):
+ return [ToUnderscore(item) for item in obj]
+
+ elif isinstance(obj, dict):
+ output = {}
+ for k, v in obj.iteritems():
+ if isinstance(v, list) or isinstance(v, dict):
+ output[ToUnderscore(k)] = ToUnderscore(v)
+ else:
+ output[ToUnderscore(k)] = v
+ return output
+
+ else:
+ return obj