Skip to content

Commit

Permalink
fix: Ensure original name case returns valid python identifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
tefra committed Feb 19, 2024
1 parent b4b6a58 commit e33113e
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 20 deletions.
12 changes: 3 additions & 9 deletions tests/utils/test_text.py
Expand Up @@ -16,7 +16,6 @@
screaming_snake_case,
snake_case,
split_words,
variable,
)


Expand All @@ -25,9 +24,11 @@ def test_original_case(self):
self.assertEqual("p00p", original_case("p00p", foobar=True))
self.assertEqual("p00p", original_case("p00p"))
self.assertEqual("USERName", original_case("USERName"))
self.assertEqual("_USERName", original_case("_USERName"))
self.assertEqual("UserNAME", original_case("UserNAME"))
self.assertEqual("USER_name", original_case("USER_name"))
self.assertEqual("USER-NAME", original_case("USER-NAME"))
self.assertEqual("USER_name", original_case("3USER_name"))
self.assertEqual("USERNAME", original_case("USER-NAME"))
self.assertEqual("User_Name", original_case("User_Name"))
self.assertEqual("user_name", original_case("user_name"))
self.assertEqual("SUserNAME", original_case("SUserNAME"))
Expand Down Expand Up @@ -146,13 +147,6 @@ def test_alnum(self):
self.assertEqual("foo1", alnum(" foo*1"))
self.assertEqual("1", alnum(" βιβλίο*1"))

def test_variable(self):
self.assertEqual("foO1", variable("foO1"))
self.assertEqual("foo_1", variable("foo_1"))
self.assertEqual("foo1", variable("foo-1"))
self.assertEqual("foo1", variable("@foo1"))
self.assertEqual("foo1", variable("1foo1"))

def test_classify(self):
for ltr in string.ascii_uppercase:
self.assertEqual(CharType.UPPER, classify(ltr))
Expand Down
2 changes: 1 addition & 1 deletion xsdata/formats/dataclass/filters.py
Expand Up @@ -384,7 +384,7 @@ def safe_name(
if not slug or not slug[0].isalpha():
return self.safe_name(f"{prefix}_{name}", prefix, name_case, **kwargs)

result = text.variable(name_case(name, **kwargs))
result = name_case(name, **kwargs)
if text.is_reserved(result):
return self.safe_name(f"{name}_{prefix}", prefix, name_case, **kwargs)

Expand Down
15 changes: 5 additions & 10 deletions xsdata/utils/text.py
Expand Up @@ -87,8 +87,11 @@ def capitalize(value: str, **kwargs: Any) -> str:


def original_case(value: str, **kwargs: Any) -> str:
"""Return the input string without any modifications."""
return value
"""Return the input string but ensure it's a valid Python variable."""
# Strip out all characters that are not alphanumeric or underscores
value = re.sub(r"\W", "", value)
# Then strip out leading digit and underscore characters
return re.sub(r"^[^a-zA-Z_]+", "", value)


def pascal_case(value: str, **kwargs: Any) -> str:
Expand Down Expand Up @@ -214,11 +217,3 @@ def replace(match: Match) -> str:
def alnum(value: str) -> str:
"""Return the ascii alphanumerical characters in lower case."""
return "".join(filter(__alnum_ascii__.__contains__, value)).lower()


def variable(value: str) -> str:
"""Returns a version of the string that will be a valid Python variable."""
# Strip out all characters that are not alphanumeric or underscores
value = re.sub(r"\W", "", value)
# Then strip out leading digit and underscore characters
return re.sub(r"^[^a-zA-Z]+", "", value)

0 comments on commit e33113e

Please sign in to comment.