Skip to content

Commit 646270d

Browse files
committed
Sanitize api names
1 parent c457e9f commit 646270d

5 files changed

Lines changed: 26 additions & 4 deletions

File tree

.generator/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,8 @@ def undo_operations():
337337
def api(context, api_version, specs, name):
338338
"""Return an API instance."""
339339
assert name in {tag["name"].replace(" ", "") for tag in specs[api_version]["tags"]}
340-
context["api_instance"] = {"name": name}
340+
sanitized_name = name.replace("-", "_")
341+
context["api_instance"] = {"name": sanitized_name}
341342

342343

343344
@given(parsers.parse('operation "{name}" enabled'))

.generator/src/generator/cli.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def cli(specs, output):
3636
env.filters["parameters"] = openapi.parameters
3737
env.filters["return_type"] = openapi.return_type
3838
env.filters["safe_snake_case"] = formatter.safe_snake_case
39+
env.filters["class_name"] = formatter.class_name
3940
env.filters["docstring"] = formatter.docstring
4041

4142
env.globals["enumerate"] = enumerate

.generator/src/generator/formatter.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,26 @@ def snake_case(value):
9191
return PATTERN_DOUBLE_UNDERSCORE.sub("_", s1)
9292

9393

94+
def class_name(value):
95+
"""
96+
Convert a string into a valid Python API class name by:
97+
1. Removing all non-alphanumeric characters
98+
2. Appending 'Api' suffix
99+
100+
Args:
101+
value (str): The input string to convert
102+
103+
Returns:
104+
str: A valid Python class name ending in 'Api'
105+
106+
Example:
107+
>>> class_name("On-Call")
108+
'OnCallApi'
109+
"""
110+
value = re.sub(r'[^a-zA-Z0-9]', '', value)
111+
return value + "Api"
112+
113+
94114
def safe_snake_case(value):
95115
for token, replacement in EDGE_CASES.items():
96116
value = value.replace(token, replacement)

.generator/src/generator/templates/api.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ from {{ package }}.model_utils import (
2222
from {{ package }}.{{ version }}.model.{{ model|safe_snake_case }} import {{ model }}
2323
{%- endfor %}
2424

25-
{% set classname = name.replace(" ", "") + "Api" %}
25+
{% set classname = name|class_name %}
2626
class {{ classname }}:
2727
"""
2828
{{ description|docstring|indent(4) }}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{%- for api in apis %}
2-
{%- set classname = api.replace(" ", "") + "Api" %}
2+
{%- set classname = api|class_name %}
33
from {{ package }}.{{ version }}.api.{{ classname|safe_snake_case }} import {{ classname }}
44
{%- endfor %}
55

66

77
__all__ = [
88
{%- for api in apis %}
9-
{%- set classname = api.replace(" ", "") + "Api" %}
9+
{%- set classname = api|class_name %}
1010
"{{ classname }}",
1111
{%- endfor %}
1212
]

0 commit comments

Comments
 (0)