Skip to content

Commit a695d8d

Browse files
authored
fix for nested all off (#391)
Co-authored-by: Vasiliy Ditsyak <[email protected]>
1 parent 80a9803 commit a695d8d

File tree

12 files changed

+251
-7
lines changed

12 files changed

+251
-7
lines changed

swagger_parser/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 1.33.0
2+
- Support correct processing of nested allOf classes
3+
14
## 1.32.1
25
- Fix CHANGELOG duplication
36

swagger_parser/lib/src/parser/parser/open_api_parser.dart

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -952,14 +952,41 @@ class OpenApiParser {
952952
_enumClasses.clear();
953953

954954
// check for `allOf`
955-
final allOfClasses = dataClasses.where(
956-
(dc) => dc is UniversalComponentClass && dc.allOf != null,
957-
);
958-
for (final allOfClass in allOfClasses) {
959-
if (allOfClass is! UniversalComponentClass) {
960-
continue;
955+
// Process allOf classes in topological order (resolve dependencies first)
956+
final allOfClasses = dataClasses
957+
.where(
958+
(dc) => dc is UniversalComponentClass && dc.allOf != null,
959+
)
960+
.cast<UniversalComponentClass>()
961+
.toList();
962+
963+
// Build a map of class names to classes for quick lookup
964+
final classMap = <String, UniversalDataClass>{};
965+
for (final dc in dataClasses) {
966+
classMap[dc.name] = dc;
967+
}
968+
969+
// Track which classes have been resolved
970+
final resolved = <String>{};
971+
972+
// Recursive function to resolve allOf for a class
973+
void resolveAllOf(UniversalComponentClass allOfClass) {
974+
// If already resolved, skip
975+
if (resolved.contains(allOfClass.name)) {
976+
return;
961977
}
978+
962979
final refs = allOfClass.allOf!.refs;
980+
981+
// First, resolve all referenced classes recursively
982+
for (final ref in refs) {
983+
final refClass = classMap[ref];
984+
if (refClass is UniversalComponentClass && refClass.allOf != null) {
985+
resolveAllOf(refClass);
986+
}
987+
}
988+
989+
// Now collect parameters from resolved references
963990
final foundClasses = dataClasses.where((e) => refs.contains(e.name));
964991
// allOf could be stack of different refs and properties
965992
// there is some chance that combined props will overlap by name
@@ -1001,6 +1028,12 @@ class OpenApiParser {
10011028
}
10021029

10031030
allOfClass.parameters.addAll(parameters.values);
1031+
resolved.add(allOfClass.name);
1032+
}
1033+
1034+
// Resolve all allOf classes
1035+
for (final allOfClass in allOfClasses) {
1036+
resolveAllOf(allOfClass);
10041037
}
10051038

10061039
// check for discriminated oneOf

swagger_parser/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: swagger_parser
22
description: Package that generates REST clients and data classes from OpenApi definition file
3-
version: 1.32.1
3+
version: 1.33.0
44
repository: https://github.com/Carapacik/swagger_parser/tree/main/swagger_parser
55
topics:
66
- swagger

swagger_parser/test/e2e/e2e_test.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,19 @@ void main() {
255255
);
256256
});
257257

258+
test('nested_allOf', () async {
259+
await e2eTest(
260+
'basic/nested_allOf',
261+
(outputDirectory, schemaPath) => SWPConfig(
262+
outputDirectory: outputDirectory,
263+
schemaPath: schemaPath,
264+
jsonSerializer: JsonSerializer.freezed,
265+
putClientsInFolder: true,
266+
),
267+
schemaFileName: 'openapi.yaml',
268+
);
269+
});
270+
258271
test('enum_class', () async {
259272
await e2eTest(
260273
'basic/enum_class',

swagger_parser/test/e2e/tests/basic/nested_allOf/expected_files/clients/fallback_client.dart

Lines changed: 22 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/basic/nested_allOf/expected_files/export.dart

Lines changed: 13 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/basic/nested_allOf/expected_files/models/pet_a.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/basic/nested_allOf/expected_files/models/pet_b.dart

Lines changed: 18 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/basic/nested_allOf/expected_files/models/pet_c.dart

Lines changed: 17 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/basic/nested_allOf/expected_files/models/pet_main.dart

Lines changed: 21 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)