Created
December 29, 2013 13:51
-
-
Save yahyaKacem/8170675 to your computer and use it in GitHub Desktop.
Convert camel-case to snake-case in python.
e.g.: CamelCase -> snake_case
e.g.: snake_case -> CamelCase
e.g.: CamelCase -> dash-case
e.g.: dash-case -> CamelCase
By: Jay Taylor [@jtaylor]
Me<modifier>: Yahya Kacem <[email protected]>
Original gist: https://gist.github.com/jaytaylor/3660565
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
""" | |
Convert camel-case to snake-case in python. | |
e.g.: CamelCase -> snake_case | |
e.g.: snake_case -> CamelCase | |
e.g.: CamelCase -> dash-case | |
e.g.: dash-case -> CamelCase | |
By: Jay Taylor [@jtaylor] | |
Me<modifier>: Yahya Kacem <[email protected]> | |
Original gist: https://gist.github.com/jaytaylor/3660565 | |
""" | |
import re | |
class Converter: | |
def __init__(self): | |
self._first_cap_re = re.compile(r'(.)([A-Z][a-z]+)') | |
self._all_cap_re = re.compile('([a-z0-9])([A-Z])') | |
def camel_to_snake(self, camelCasedStr): | |
""" | |
This function converts to snake_case from camelCase | |
""" | |
sub1 = self._first_cap_re.sub(r'\1_\2', camelCasedStr) | |
snake_cased_str = self._all_cap_re.sub(r'\1_\2', sub1).lower() | |
return snake_cased_str.replace('__', '_') | |
def camelToDash(self, camelCasedStr): | |
""" | |
This function converts to dashed_case from camelCase | |
""" | |
sub2 = self._first_cap_re.sub(r'\1-\2', camelCasedStr) | |
dashed_case_str = self._all_cap_re.sub(r'\1-\2', sub2).lower() | |
return dashed_case_str.replace('--', '-') | |
def snakeToCamel(self, snake_cased_str): | |
return self._convertToCamel(snake_cased_str, "_") | |
def dashToCamel(self, snake_cased_str): | |
return self._convertToCamel(snake_cased_str, "-") | |
def _convertToCamel(self, snake_cased_str, separator): | |
components = snake_cased_str.split(separator) | |
preffix = "" | |
suffix = "" | |
if components[0] == "": | |
components = components[1:] | |
preffix = separator | |
if components[-1] == "": | |
components = components[:-1] | |
suffix = separator | |
if len(components) > 1: | |
camelCasedStr = components[0].lower() | |
for x in components[1:]: | |
if x.isupper() or x.istitle(): | |
camelCasedStr += x | |
else: | |
camelCasedStr += x.title() | |
else: | |
camelCasedStr = components[0] | |
return preffix + camelCasedStr + suffix |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
""" | |
Convert camel-case to snake-case in python. | |
e.g.: CamelCase -> snake_case | |
e.g.: snake_case -> CamelCase | |
e.g.: CamelCase -> dash-case | |
e.g.: dash-case -> CamelCase | |
By: Jay Taylor [@jtaylor] | |
Me<modifier>: Yahya Kacem <[email protected]> | |
Original gist: https://gist.github.com/jaytaylor/3660565 | |
""" | |
import Converter as C | |
Converter = C.Converter() | |
def test_camel_to_snake(): | |
assert Converter.camel_to_snake('snakesOnAPlane') == 'snakes_on_a_plane' | |
assert Converter.camel_to_snake('SnakesOnAPlane') == 'snakes_on_a_plane' | |
assert Converter.camel_to_snake('_Snakes_On_APlane_') == '_snakes_on_a_plane_' | |
assert Converter.camel_to_snake('snakes_on_a_plane') == 'snakes_on_a_plane' | |
assert Converter.camel_to_snake('IPhoneHysteria') == 'i_phone_hysteria' | |
assert Converter.camel_to_snake('iPhoneHysteria') == 'i_phone_hysteria' | |
assert Converter.camel_to_snake('iPHONEHysteria') == 'i_phone_hysteria' | |
assert Converter.camel_to_snake('_iPHONEHysteria') == '_i_phone_hysteria' | |
assert Converter.camel_to_snake('iPHONEHysteria_') == 'i_phone_hysteria_' | |
print "all camelCase to snake_case tests passed" | |
def testCamelToDash(): | |
assert Converter.camelToDash('snakesOnAPlane') == 'snakes-on-a-plane' | |
assert Converter.camelToDash('SnakesOnAPlane') == 'snakes-on-a-plane' | |
assert Converter.camelToDash('-Snakes-On-APlane-') == '-snakes-on-a-plane-' | |
assert Converter.camelToDash('snakes-on-a-plane') == 'snakes-on-a-plane' | |
assert Converter.camelToDash('IPhoneHysteria') == 'i-phone-hysteria' | |
assert Converter.camelToDash('iPhoneHysteria') == 'i-phone-hysteria' | |
assert Converter.camelToDash('iPHONEHysteria') == 'i-phone-hysteria' | |
assert Converter.camelToDash('-iPHONEHysteria') == '-i-phone-hysteria' | |
assert Converter.camelToDash('iPHONEHysteria-') == 'i-phone-hysteria-' | |
print "all camelCase to dash-case tests passed" | |
def testSnakeToCamel(): | |
assert Converter.snakeToCamel('_snakes_on_a_plane_') == '_snakesOnAPlane_' | |
assert Converter.snakeToCamel('snakes_on_a_plane') == 'snakesOnAPlane' | |
assert Converter.snakeToCamel('Snakes_on_a_plane') == 'snakesOnAPlane' | |
assert Converter.snakeToCamel('snakesOnAPlane') == 'snakesOnAPlane' | |
assert Converter.snakeToCamel('I_phone_hysteria') == 'iPhoneHysteria' | |
assert Converter.snakeToCamel('i_phone_hysteria') == 'iPhoneHysteria' | |
assert Converter.snakeToCamel('i_PHONE_hysteria') == 'iPHONEHysteria' | |
assert Converter.snakeToCamel('_i_phone_hysteria') == '_iPhoneHysteria' | |
assert Converter.snakeToCamel('i_phone_hysteria_') == 'iPhoneHysteria_' | |
print "all snake_case to camelCase tests passed" | |
def testDashToCamel(): | |
assert Converter.dashToCamel('-snakes-on-a-plane-') == '-snakesOnAPlane-' | |
assert Converter.dashToCamel('snakes-on-a-plane') == 'snakesOnAPlane' | |
assert Converter.dashToCamel('Snakes-on-a-plane') == 'snakesOnAPlane' | |
assert Converter.dashToCamel('snakesOnAPlane') == 'snakesOnAPlane' | |
assert Converter.dashToCamel('I-phone-hysteria') == 'iPhoneHysteria' | |
assert Converter.dashToCamel('i-phone-hysteria') == 'iPhoneHysteria' | |
assert Converter.dashToCamel('i-PHONE-hysteria') == 'iPHONEHysteria' | |
assert Converter.dashToCamel('-i-phone-hysteria') == '-iPhoneHysteria' | |
assert Converter.dashToCamel('i-phone-hysteria-') == 'iPhoneHysteria-' | |
print "all dash-case to camelCase tests passed" | |
def run_tests(): | |
test_camel_to_snake() | |
print "################################################################" | |
testCamelToDash() | |
print "################################################################" | |
testSnakeToCamel() | |
print "################################################################" | |
testDashToCamel() | |
print "################################################################" | |
if __name__ == '__main__': | |
print "################################################################" | |
print "################################################################" | |
run_tests() | |
print 'All tests passed.' | |
print "################################################################" | |
print "################################################################" |
+1 on @mbylstra suggestion, I realise we don't have to turn Python into JS where each single-liner becomes its own dependency but some things just deserve to be
The Inflection library handle this case and is already in PIP.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This looks good. It would be great if this was turned into a github project and was put in PyPI - an equivalent to https://www.npmjs.com/package/change-case. It seems there are a million gists and stack overflow answers on how to do this, but just having the one official repo that was well tested by the community is the way to go!