1*99e0aae7SDavid Rees# Copyright 2019 Google LLC 2*99e0aae7SDavid Rees# 3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License"); 4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License. 5*99e0aae7SDavid Rees# You may obtain a copy of the License at 6*99e0aae7SDavid Rees# 7*99e0aae7SDavid Rees# https://www.apache.org/licenses/LICENSE-2.0 8*99e0aae7SDavid Rees# 9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software 10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS, 11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and 13*99e0aae7SDavid Rees# limitations under the License. 14*99e0aae7SDavid Rees 15*99e0aae7SDavid Rees"""Conversions between snake-, camel-, and shouty-case names.""" 16*99e0aae7SDavid Rees 17*99e0aae7SDavid Reesfrom enum import Enum 18*99e0aae7SDavid Rees 19*99e0aae7SDavid Rees 20*99e0aae7SDavid Reesclass Case(str, Enum): 21*99e0aae7SDavid Rees SNAKE = "snake_case" 22*99e0aae7SDavid Rees SHOUTY = "SHOUTY_CASE" 23*99e0aae7SDavid Rees CAMEL = "CamelCase" 24*99e0aae7SDavid Rees K_CAMEL = "kCamelCase" 25*99e0aae7SDavid Rees 26*99e0aae7SDavid Rees 27*99e0aae7SDavid Rees# Map of (from, to) cases to their conversion function. Initially only contains 28*99e0aae7SDavid Rees# identity case conversions, additional conversions are added with the 29*99e0aae7SDavid Rees# _case_conversion decorator. 30*99e0aae7SDavid Rees_case_conversions = {(case.value, case.value): lambda x: x for case in Case} 31*99e0aae7SDavid Rees 32*99e0aae7SDavid Rees 33*99e0aae7SDavid Reesdef _case_conversion(case_from, case_to): 34*99e0aae7SDavid Rees """Decorator to dynamically dispatch case conversions at runtime.""" 35*99e0aae7SDavid Rees def _func(f): 36*99e0aae7SDavid Rees _case_conversions[case_from, case_to] = f 37*99e0aae7SDavid Rees return f 38*99e0aae7SDavid Rees 39*99e0aae7SDavid Rees return _func 40*99e0aae7SDavid Rees 41*99e0aae7SDavid Rees 42*99e0aae7SDavid Rees@_case_conversion(Case.SNAKE, Case.CAMEL) 43*99e0aae7SDavid Rees@_case_conversion(Case.SHOUTY, Case.CAMEL) 44*99e0aae7SDavid Reesdef snake_to_camel(name): 45*99e0aae7SDavid Rees """Convert from snake_case to CamelCase. Also works from SHOUTY_CASE.""" 46*99e0aae7SDavid Rees return "".join(word.capitalize() for word in name.split("_")) 47*99e0aae7SDavid Rees 48*99e0aae7SDavid Rees 49*99e0aae7SDavid Rees@_case_conversion(Case.CAMEL, Case.K_CAMEL) 50*99e0aae7SDavid Reesdef camel_to_k_camel(name): 51*99e0aae7SDavid Rees """Convert from CamelCase to kCamelCase.""" 52*99e0aae7SDavid Rees return "k" + name 53*99e0aae7SDavid Rees 54*99e0aae7SDavid Rees 55*99e0aae7SDavid Rees@_case_conversion(Case.SNAKE, Case.K_CAMEL) 56*99e0aae7SDavid Rees@_case_conversion(Case.SHOUTY, Case.K_CAMEL) 57*99e0aae7SDavid Reesdef snake_to_k_camel(name): 58*99e0aae7SDavid Rees """Converts from snake_case to kCamelCase. Also works from SHOUTY_CASE.""" 59*99e0aae7SDavid Rees return camel_to_k_camel(snake_to_camel(name)) 60*99e0aae7SDavid Rees 61*99e0aae7SDavid Rees 62*99e0aae7SDavid Reesdef convert_case(case_from, case_to, value): 63*99e0aae7SDavid Rees """Converts cases based on runtime case values. 64*99e0aae7SDavid Rees 65*99e0aae7SDavid Rees Note: Cases can be strings or enum values.""" 66*99e0aae7SDavid Rees return _case_conversions[case_from, case_to](value) 67*99e0aae7SDavid Rees 68*99e0aae7SDavid Rees 69*99e0aae7SDavid Reesdef is_case_conversion_supported(case_from, case_to): 70*99e0aae7SDavid Rees """Determines if a case conversion would be supported""" 71*99e0aae7SDavid Rees return (case_from, case_to) in _case_conversions 72