Skip to content

Commit 496b9d2

Browse files
Peetee06claude
andauthored
fix: ensure consistent file naming for tags with alphanumeric suffixes (#354)
Co-authored-by: Claude <[email protected]>
1 parent fab129c commit 496b9d2

File tree

19 files changed

+445
-5
lines changed

19 files changed

+445
-5
lines changed

swagger_parser/lib/src/generator/generator/fill_controller.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ final class FillController {
5656
dioOptionsParameterByDefault: config.dioOptionsParameterByDefault,
5757
originalHttpResponse: config.originalHttpResponse,
5858
useMultipartFile: config.useMultipartFile,
59+
fileName: fileName,
5960
),
6061
);
6162
}
@@ -65,6 +66,10 @@ final class FillController {
6566
final rootClientName = config.rootClientName ?? 'RestClient';
6667
final postfix = config.clientPostfix ?? 'Client';
6768
final clientsNames = clients.map((c) => c.name.toPascal).toSet();
69+
// Create a map from Pascal names to snake names
70+
final clientsNameMap = <String, String>{
71+
for (final client in clients) client.name.toPascal: client.name.toSnake
72+
};
6873

6974
return GeneratedFile(
7075
name: '${rootClientName.toSnake}.${config.language.fileExtension}',
@@ -75,6 +80,7 @@ final class FillController {
7580
postfix: postfix.toPascal,
7681
putClientsInFolder: config.putClientsInFolder,
7782
markFilesAsGenerated: config.markFilesAsGenerated,
83+
clientsNameMap: clientsNameMap,
7884
),
7985
);
8086
}

swagger_parser/lib/src/generator/model/programming_language.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ enum ProgrammingLanguage {
122122
bool extrasParameterByDefault = false,
123123
bool dioOptionsParameterByDefault = false,
124124
bool originalHttpResponse = false,
125+
String? fileName,
125126
}) =>
126127
switch (this) {
127128
dart => dartRetrofitClientTemplate(
@@ -133,6 +134,7 @@ enum ProgrammingLanguage {
133134
dioOptionsParameterByDefault: dioOptionsParameterByDefault,
134135
originalHttpResponse: originalHttpResponse,
135136
useMultipartFile: useMultipartFile,
137+
fileName: fileName,
136138
),
137139
kotlin => kotlinRetrofitClientTemplate(
138140
restClient: restClient,
@@ -149,6 +151,7 @@ enum ProgrammingLanguage {
149151
required String postfix,
150152
required bool putClientsInFolder,
151153
required bool markFilesAsGenerated,
154+
Map<String, String>? clientsNameMap,
152155
}) =>
153156
switch (this) {
154157
dart => dartRootClientTemplate(
@@ -158,6 +161,7 @@ enum ProgrammingLanguage {
158161
postfix: postfix,
159162
putClientsInFolder: putClientsInFolder,
160163
markFileAsGenerated: markFilesAsGenerated,
164+
clientsNameMap: clientsNameMap,
161165
),
162166
kotlin => '',
163167
};

swagger_parser/lib/src/generator/templates/dart_retrofit_client_template.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ String dartRetrofitClientTemplate({
1616
bool extrasParameterByDefault = false,
1717
bool dioOptionsParameterByDefault = false,
1818
bool originalHttpResponse = false,
19+
String? fileName,
1920
}) {
2021
final parameterTypes = restClient.requests
2122
.expand((r) => r.parameters.map((p) => p.type))
@@ -24,7 +25,7 @@ String dartRetrofitClientTemplate({
2425
${generatedFileComment(markFileAsGenerated: markFileAsGenerated)}${_convertImport(restClient)}${ioImport(parameterTypes, useMultipartFile: useMultipartFile)}import 'package:dio/dio.dart'${_hideHeaders(restClient, defaultContentType)};
2526
import 'package:retrofit/retrofit.dart';
2627
${dartImports(imports: restClient.imports, pathPrefix: '../models/')}
27-
part '${name.toSnake}.g.dart';
28+
part '${fileName ?? name.toSnake}.g.dart';
2829
2930
@RestApi()
3031
abstract class $name {

swagger_parser/lib/src/generator/templates/dart_root_client_template.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ String dartRootClientTemplate({
99
required String postfix,
1010
required bool putClientsInFolder,
1111
required bool markFileAsGenerated,
12+
Map<String, String>? clientsNameMap,
1213
}) {
1314
if (clientsNames.isEmpty) {
1415
return '';
@@ -32,7 +33,7 @@ String dartRootClientTemplate({
3233

3334
return '''
3435
${generatedFileComment(markFileAsGenerated: markFileAsGenerated)}import 'package:dio/dio.dart';
35-
${_clientsImport(clientsNames, postfix, putClientsInFolder: putClientsInFolder)}
36+
${_clientsImport(clientsNames, postfix, putClientsInFolder: putClientsInFolder, clientsNameMap: clientsNameMap)}
3637
${descriptionComment(comment)}class $className {
3738
$className(
3839
Dio dio, {
@@ -53,9 +54,13 @@ ${_getters(clientsNames, postfix)}
5354
}
5455

5556
String _clientsImport(Set<String> imports, String postfix,
56-
{required bool putClientsInFolder}) =>
57-
'\n${imports.map((import) => "import '${putClientsInFolder ? 'clients' : import.toSnake}/"
58-
"${'${import}_$postfix'.toSnake}.dart';").join('\n')}\n';
57+
{required bool putClientsInFolder, Map<String, String>? clientsNameMap}) {
58+
return '\n${imports.map((import) {
59+
final snakeName = clientsNameMap?[import] ?? import.toSnake;
60+
return "import '${putClientsInFolder ? 'clients' : snakeName}/"
61+
"${snakeName}_${postfix.toSnake}.dart';";
62+
}).join('\n')}\n';
63+
}
5964

6065
String _privateFields(Set<String> names, String postfix) => names
6166
.map((n) => ' ${n.toPascal + postfix.toPascal}? _${n.toCamel};')

swagger_parser/test/e2e/e2e_test.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,5 +533,32 @@ void main() {
533533
schemaFileName: 'wrapping_collections.3.0.json',
534534
);
535535
});
536+
537+
// https://github.com/Carapacik/swagger_parser/issues/353
538+
test('tag_with_alphanumeric', () async {
539+
await e2eTest(
540+
'tag_with_alphanumeric',
541+
(outputDirectory, schemaPath) => SWPConfig(
542+
outputDirectory: outputDirectory,
543+
schemaPath: schemaPath,
544+
jsonSerializer: JsonSerializer.freezed,
545+
putClientsInFolder: true,
546+
),
547+
schemaFileName: 'openapi.json',
548+
);
549+
});
550+
551+
test('tag_edge_cases', () async {
552+
await e2eTest(
553+
'tag_edge_cases',
554+
(outputDirectory, schemaPath) => SWPConfig(
555+
outputDirectory: outputDirectory,
556+
schemaPath: schemaPath,
557+
jsonSerializer: JsonSerializer.freezed,
558+
putClientsInFolder: true,
559+
),
560+
schemaFileName: 'openapi.yaml',
561+
);
562+
});
536563
});
537564
}

swagger_parser/test/e2e/tests/tag_edge_cases/expected_files/clients/items_2a3_version_4b5_client.dart

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

swagger_parser/test/e2e/tests/tag_edge_cases/expected_files/clients/items_draft_client.dart

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

swagger_parser/test/e2e/tests/tag_edge_cases/expected_files/clients/very_long_tag_name_with_numbers_123_and_more_text_client.dart

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

swagger_parser/test/e2e/tests/tag_edge_cases/expected_files/export.dart

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

swagger_parser/test/e2e/tests/tag_edge_cases/expected_files/models/draft_item.dart

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)