|  | # Copyright 2021 The gRPC Authors | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | # Follows convention set in objectivec_helpers.cc in the protobuf ObjC compiler. | 
|  |  | 
|  | """ | 
|  | Contains generic helper utilities. | 
|  | """ | 
|  |  | 
|  | _upper_segments_list = ["url", "http", "https"] | 
|  |  | 
|  | def strip_extension(str): | 
|  | return str.rpartition(".")[0] | 
|  |  | 
|  | def capitalize(word): | 
|  | if word in _upper_segments_list: | 
|  | return word.upper() | 
|  | else: | 
|  | return word.capitalize() | 
|  |  | 
|  | def lower_underscore_to_upper_camel(str): | 
|  | """Converts from lower underscore case to upper camel case. | 
|  |  | 
|  | Args: | 
|  | str: The snake case string to convert. | 
|  |  | 
|  | Returns: | 
|  | The title case version of str. | 
|  | """ | 
|  | str = strip_extension(str) | 
|  | camel_case_str = "" | 
|  | word = "" | 
|  | for c in str.elems():  # NB: assumes ASCII! | 
|  | if c.isalpha(): | 
|  | word += c.lower() | 
|  | else: | 
|  | # Last word is finished. | 
|  | if len(word): | 
|  | camel_case_str += capitalize(word) | 
|  | word = "" | 
|  | if c.isdigit(): | 
|  | camel_case_str += c | 
|  |  | 
|  | # Otherwise, drop the character. See UnderscoresToCamelCase in: | 
|  | # third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc | 
|  |  | 
|  | if len(word): | 
|  | camel_case_str += capitalize(word) | 
|  | return camel_case_str | 
|  |  | 
|  | def file_to_upper_camel(src): | 
|  | elements = src.rpartition("/") | 
|  | upper_camel = lower_underscore_to_upper_camel(elements[-1]) | 
|  | return "".join(list(elements[:-1]) + [upper_camel]) | 
|  |  | 
|  | def file_with_extension(src, ext): | 
|  | elements = src.rpartition("/") | 
|  | return "".join(list(elements[:-1]) + [elements[-1], "." + ext]) | 
|  |  | 
|  | def to_upper_camel_with_extension(src, ext): | 
|  | src = file_to_upper_camel(src) | 
|  | return file_with_extension(src, ext) |