Repository: biolink/biolink-model-toolkit

Issue:
Camel-case names with acronyms are not parsed well
Classes like "RNA product", etc. behave in strange ways.

```python
>>> print(tk.get_element("RNA product").class_uri)
biolink:RNAProduct
>>> print(tk.get_element("biolink:RNAProduct"))
None
```

I suspect that we are failing to convert "RNAProduct" to the expected sentence-case representation.

Discussion:

Patch:
diff --git a/bmt/utils.py b/bmt/utils.py
index f2ac488..e9a1d7c 100644
--- a/bmt/utils.py
+++ b/bmt/utils.py
@@ -4,6 +4,18 @@ import stringcase
 from linkml_runtime.linkml_model.meta import ClassDefinition, SlotDefinition, Element, ClassDefinitionName, \
     SlotDefinitionName, ElementName, TypeDefinition
 
+lowercase_pattern = re.compile(r"[a-zA-Z]*[a-z][a-zA-Z]*")
+underscore_pattern = re.compile(r"(?<!^)(?=[A-Z][a-z])")
+
+
+def from_camel(s: str, sep: str = " ") -> str:
+    underscored = underscore_pattern.sub(sep, s)
+    lowercased = lowercase_pattern.sub(
+        lambda match: match.group(0).lower(),
+        underscored,
+    )
+    return lowercased
+
 
 def camelcase_to_sentencecase(s: str) -> str:
     """
@@ -18,7 +30,7 @@ def camelcase_to_sentencecase(s: str) -> str:
     str
         string in sentence case form
     """
-    return stringcase.sentencecase(s).lower()
+    return from_camel(s, sep=" ")
 
 
 def snakecase_to_sentencecase(s: str) -> str:


Test patch:
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
index 3a7203f..a72f7fa 100644
--- a/tests/unit/test_utils.py
+++ b/tests/unit/test_utils.py
@@ -18,6 +18,7 @@ from bmt.utils import parse_name
     ('RNA product', 'RNA product'),
     ('RNA Product', 'RNA Product'),
     ('Rna Product', 'Rna Product'),
+    ('biolink:RNAProduct', 'RNA product'),
 ])
 def test_parse_name(query):
     n = parse_name(query[0])