Chromium Code Reviews| Index: tools/telemetry/telemetry/core/camel_case.py |
| diff --git a/tools/telemetry/telemetry/core/camel_case.py b/tools/telemetry/telemetry/core/camel_case.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4c2939be10fabc6371ba178efd1d1973ddb968e2 |
| --- /dev/null |
| +++ b/tools/telemetry/telemetry/core/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): |
|
tonyg
2013/08/16 23:46:30
Really clean implementation, I like it
dtu
2013/08/17 00:19:34
Thanks!
|
| + """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: |
| + raise NotImplementedError() |