Skip to content

Commit e6d8e57

Browse files
committed
bug chaotic-openapi: handle dash in parameter name
commit_hash:fe69186b6604dccdbfd15ed37d0a100c9dc0fd61
1 parent cb4c29c commit e6d8e57

File tree

2 files changed

+83
-72
lines changed

2 files changed

+83
-72
lines changed

chaotic-openapi/chaotic_openapi/back/cpp_client/translator.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
from chaotic_openapi.front import base_model
1515
from chaotic_openapi.front import model
1616

17+
# Search for '-' only inside '{...}' (not nested)
18+
DASH_IN_PATH_RE = re.compile('(-)(?=[^}]*})')
19+
1720

1821
class Translator:
1922
def __init__(
@@ -49,6 +52,10 @@ def __init__(
4952
msg=str(exc),
5053
)
5154

55+
def _transform_path(self, path: str) -> str:
56+
# <fmt> C++ library doesn't like '-' inside format variable names
57+
return re.sub(DASH_IN_PATH_RE, '_', path)
58+
5259
def translate(
5360
self,
5461
service: model.Service,
@@ -84,7 +91,7 @@ def translate(
8491

8592
op = types.Operation(
8693
method=operation.method.upper(),
87-
path=operation.path,
94+
path=self._transform_path(operation.path),
8895
operation_id=operation.operationId,
8996
description=operation.description,
9097
parameters=[self._translate_parameter(parameter) for parameter in operation.parameters],
@@ -349,9 +356,14 @@ def _translate_parameter(self, parameter: model.Parameter) -> types.Parameter:
349356
if not parameter.required:
350357
cpp_type.nullable = True
351358

359+
if in_ == model.In.path:
360+
name = parameter.name.replace('-', '_')
361+
else:
362+
name = parameter.name
363+
352364
return types.Parameter(
353365
description=parameter.description,
354-
raw_name=parameter.name,
366+
raw_name=name,
355367
cpp_name=cpp_name,
356368
cpp_type=cpp_type,
357369
parser=parser,

chaotic-openapi/tests/back/test_parameters.py

Lines changed: 69 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -28,42 +28,28 @@ def test_parameters(translate_single_schema):
2828
},
2929
},
3030
}
31-
assert translate_single_schema(schema) == types.ClientSpec(
32-
client_name='test',
33-
cpp_namespace='test_namespace',
34-
dynamic_config='',
35-
operations=[
36-
types.Operation(
37-
method='GET',
38-
path='/',
39-
operation_id=None,
40-
parameters=[
41-
types.Parameter(
42-
description='parameter description',
43-
raw_name='param',
44-
cpp_name='param',
45-
cpp_type=cpp_types.CppPrimitiveType(
46-
raw_cpp_type=type_name.TypeName('int'),
47-
user_cpp_type=None,
48-
nullable=True,
49-
json_schema=chaotic_types.Integer(
50-
type='integer',
51-
),
52-
validators=cpp_types.CppPrimitiveValidator(
53-
prefix='Parameter0',
54-
namespace='::test_namespace::root_::get',
55-
),
56-
),
57-
parser='openapi::TrivialParameter<openapi::In::kQuery, kparam, int, int>',
58-
required=False,
59-
query_log_mode_hide=False,
60-
),
61-
],
62-
request_bodies=[],
63-
responses=[],
31+
assert translate_single_schema(schema).operations[0].parameters == [
32+
types.Parameter(
33+
description='parameter description',
34+
raw_name='param',
35+
cpp_name='param',
36+
cpp_type=cpp_types.CppPrimitiveType(
37+
raw_cpp_type=type_name.TypeName('int'),
38+
user_cpp_type=None,
39+
nullable=True,
40+
json_schema=chaotic_types.Integer(
41+
type='integer',
42+
),
43+
validators=cpp_types.CppPrimitiveValidator(
44+
prefix='Parameter0',
45+
namespace='::test_namespace::root_::get',
46+
),
6447
),
65-
],
66-
)
48+
parser='openapi::TrivialParameter<openapi::In::kQuery, kparam, int, int>',
49+
required=False,
50+
query_log_mode_hide=False,
51+
),
52+
]
6753

6854

6955
def test_parameters_ref(translate_single_schema):
@@ -95,42 +81,28 @@ def test_parameters_ref(translate_single_schema):
9581
},
9682
},
9783
}
98-
assert translate_single_schema(schema) == types.ClientSpec(
99-
client_name='test',
100-
cpp_namespace='test_namespace',
101-
dynamic_config='',
102-
operations=[
103-
types.Operation(
104-
method='GET',
105-
path='/',
106-
operation_id=None,
107-
parameters=[
108-
types.Parameter(
109-
description='parameter description',
110-
raw_name='param',
111-
cpp_name='param',
112-
cpp_type=cpp_types.CppPrimitiveType(
113-
raw_cpp_type=type_name.TypeName('int'),
114-
user_cpp_type=None,
115-
nullable=True,
116-
json_schema=chaotic_types.Integer(
117-
type='integer',
118-
),
119-
validators=cpp_types.CppPrimitiveValidator(
120-
prefix='ParameterParameter',
121-
namespace='::test_namespace',
122-
),
123-
),
124-
parser='openapi::TrivialParameter<openapi::In::kQuery, kparam, int, int>',
125-
required=False,
126-
query_log_mode_hide=False,
127-
),
128-
],
129-
request_bodies=[],
130-
responses=[],
84+
assert translate_single_schema(schema).operations[0].parameters == [
85+
types.Parameter(
86+
description='parameter description',
87+
raw_name='param',
88+
cpp_name='param',
89+
cpp_type=cpp_types.CppPrimitiveType(
90+
raw_cpp_type=type_name.TypeName('int'),
91+
user_cpp_type=None,
92+
nullable=True,
93+
json_schema=chaotic_types.Integer(
94+
type='integer',
95+
),
96+
validators=cpp_types.CppPrimitiveValidator(
97+
prefix='ParameterParameter',
98+
namespace='::test_namespace',
99+
),
131100
),
132-
],
133-
)
101+
parser='openapi::TrivialParameter<openapi::In::kQuery, kparam, int, int>',
102+
required=False,
103+
query_log_mode_hide=False,
104+
),
105+
]
134106

135107

136108
def test_parameters_schemas_ref(translate_single_schema):
@@ -320,3 +292,30 @@ def test_parameters_too_complex_schema(translate_single_schema):
320292
Unsupported parameter type for parameter "param"
321293
==============================================================="""
322294
)
295+
296+
297+
def test_dash_in_name(translate_single_schema):
298+
schema = {
299+
'openapi': '3.0.0',
300+
'info': {'title': '', 'version': '1.0'},
301+
'paths': {
302+
'/{a-b-c}': {
303+
'get': {
304+
'parameters': [
305+
{
306+
'in': 'path',
307+
'name': 'a-b-c',
308+
'description': 'parameter description',
309+
'schema': {
310+
'type': 'integer',
311+
},
312+
},
313+
],
314+
'responses': {},
315+
},
316+
},
317+
},
318+
}
319+
spec = translate_single_schema(schema)
320+
assert spec.operations[0].parameters[0].raw_name == 'a_b_c'
321+
assert spec.operations[0].path == '/{a_b_c}'

0 commit comments

Comments
 (0)