Skip to content

Commit 53b711a

Browse files
committed
fix: fixes useEnumExtension and other non string additional properties fields throwing error
Relevant issue #110
1 parent 45af1cf commit 53b711a

File tree

10 files changed

+234
-67
lines changed

10 files changed

+234
-67
lines changed

openapi-generator-annotations/lib/src/openapi_generator_annotations_base.dart

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -545,9 +545,7 @@ class DioProperties extends AdditionalProperties {
545545

546546
DioProperties.fromMap(Map<String, dynamic> map)
547547
: dateLibrary = EnumTransformer.dioDateLibrary(map['dateLibrary']),
548-
nullableFields = map['nullableFields'] != null
549-
? map['nullableFields'] == 'true'
550-
: null,
548+
nullableFields = map['nullableFields'],
551549
serializationLibrary = EnumTransformer.dioSerializationLibrary(
552550
map['serializationLibrary']),
553551
super.fromMap(map);
@@ -621,12 +619,9 @@ class DioAltProperties extends AdditionalProperties {
621619
wrapper: wrapper);
622620

623621
DioAltProperties.fromMap(Map<String, dynamic> map)
624-
: nullSafe = map['nullSafe'] != null ? map['nullSafe'] == 'true' : null,
625-
nullSafeArrayDefault = map['nullSafeArrayDefault'] != null
626-
? map['nullSafeArrayDefault'] == 'true'
627-
: null,
628-
listAnyOf =
629-
map['listAnyOf'] != null ? map['listAnyOf'] == 'true' : null,
622+
: nullSafe = map['nullSafe'],
623+
nullSafeArrayDefault = map['nullSafeArrayDefault'],
624+
listAnyOf = map['listAnyOf'],
630625
pubspecDependencies = map['pubspecDependencies'],
631626
pubspecDevDependencies = map['pubspecDevDependencies'],
632627
super.fromMap(map);

openapi-generator-annotations/test/additional_properties_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ void main() {
175175
'sortParamsByRequiredFlag': props.sortParamsByRequiredFlag,
176176
'sourceFolder': props.sourceFolder,
177177
'wrapper': 'none',
178-
'nullableFields': '${props.nullableFields}',
178+
'nullableFields': props.nullableFields,
179179
'dateLibrary': 'core',
180180
'serializationLibrary': 'json_serializable',
181181
};
@@ -289,9 +289,9 @@ void main() {
289289
'sortParamsByRequiredFlag': props.sortParamsByRequiredFlag,
290290
'sourceFolder': props.sourceFolder,
291291
'wrapper': 'none',
292-
'nullSafe': '${props.nullSafe}',
293-
'nullSafeArrayDefault': '${props.nullSafeArrayDefault}',
294-
'listAnyOf': '${props.listAnyOf}',
292+
'nullSafe': props.nullSafe,
293+
'nullSafeArrayDefault': props.nullSafeArrayDefault,
294+
'listAnyOf': props.listAnyOf,
295295
'pubspecDevDependencies': props.pubspecDevDependencies,
296296
'pubspecDependencies': props.pubspecDependencies,
297297
};

openapi-generator/lib/src/extensions/type_methods.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,10 @@ extension ReadProperty on ConstantReader {
144144
) as T;
145145
}
146146

147-
if (isA(v, Map)) {
147+
if (isA(v, Map<String, String>)) {
148148
return v.mapValue.map((key, value) => MapEntry(
149-
convertToPropertyValue(key!), convertToPropertyValue(value!))) as T;
149+
convertToPropertyValue(key!) as String,
150+
convertToPropertyValue(value!) as String)) as T;
150151
} else if (isA(v, bool)) {
151152
return v.boolValue as T;
152153
} else if (isA(v, double)) {

openapi-generator/lib/src/utils.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ String getMapAsString(Map<dynamic, dynamic> data) {
1818
}
1919

2020
/// Converts a [DartObject] to it's given type.
21-
String convertToPropertyValue(DartObject value) {
21+
dynamic convertToPropertyValue(DartObject value) {
2222
if (value.isNull) {
2323
return '';
2424
}
2525
return value.toStringValue() ??
26-
value.toBoolValue()?.toString() ??
27-
value.toIntValue()?.toString() ??
26+
value.toBoolValue() ??
27+
value.toIntValue() ??
2828
value.getField('_name')?.toStringValue() ??
2929
'';
3030
}

openapi-generator/pubspec.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@ dev_dependencies:
2424
source_gen_test:
2525
pedantic:
2626
coverage: ^1.6.3
27+
28+
dependency_overrides:
29+
openapi_generator_annotations:
30+
path: ../openapi-generator-annotations

openapi-generator/test/generator_arguments_test.dart

Lines changed: 149 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -153,50 +153,155 @@ void main() {
153153
),
154154
);
155155
});
156-
test('uses config', () async {
157-
final config = File(
158-
'${Directory.current.path}${Platform.pathSeparator}test${Platform.pathSeparator}specs${Platform.pathSeparator}test_config.dart')
159-
.readAsStringSync();
160-
final annotations = (await resolveSource(
161-
config,
162-
(resolver) async =>
163-
(await resolver.findLibraryByName('test_lib'))!))
164-
.getClass('TestClassConfig')!
165-
.metadata
166-
.map((e) => src_gen.ConstantReader(e.computeConstantValue()!))
167-
.first;
168-
final args = GeneratorArguments(annotations: annotations);
169-
expect(args.alwaysRun, isTrue);
170-
expect(args.useNextGen, isTrue);
171-
expect(args.cachePath, './test/specs/output/cache.json');
172-
expect(args.outputDirectory, './test/specs/output');
173-
expect(args.runSourceGen, isTrue);
174-
expect(args.shouldFetchDependencies, isTrue);
175-
expect(args.skipValidation, isFalse);
176-
expect(await args.inputFileOrFetch, './test/specs/openapi.test.yaml');
177-
expect(args.templateDirectory, 'template');
178-
expect(args.generator, Generator.dio);
179-
expect(args.wrapper, Wrapper.fvm);
180-
expect(args.importMappings, {'package': 'test'});
181-
expect(args.typeMappings, {'key': 'value'});
182-
expect(args.reservedWordsMappings, {'const': 'final'});
183-
expect(args.inlineSchemaNameMappings, {'200resp': 'OkResp'});
184-
expect(args.pubspecPath, './test/specs/dart_pubspec.test.yaml');
185-
expect(args.isRemote, isFalse);
186-
expect(args.generatorName, 'dart-dio');
187-
expect(args.shouldGenerateSources, isTrue);
188-
expect(await args.jarArgs, [
189-
'generate',
190-
'-o=${args.outputDirectory}',
191-
'-i=${await args.inputFileOrFetch}',
192-
'-t=${args.templateDirectory}',
193-
'-g=${args.generatorName}',
194-
'--reserved-words-mappings=${args.reservedWordsMappings.entries.fold('', foldStringMap())}',
195-
'--inline-schema-name-mappings=${args.inlineSchemaNameMappings.entries.fold('', foldStringMap())}',
196-
'--import-mappings=${args.importMappings.entries.fold('', foldStringMap())}',
197-
'--type-mappings=${args.typeMappings.entries.fold('', foldStringMap())}',
198-
'--additional-properties=${args.additionalProperties!.toMap().entries.fold('', foldStringMap(keyModifier: convertToPropertyKey))}'
199-
]);
156+
group('annotation specification', () {
157+
// https://github.com/gibahjoe/openapi-generator-dart/issues/110
158+
test('Processes annotations correctly', () async {
159+
final config = File(
160+
'${Directory.current.path}${Platform.pathSeparator}test${Platform.pathSeparator}specs${Platform.pathSeparator}test_config.dart')
161+
.readAsStringSync();
162+
final annotations = (await resolveSource(
163+
config,
164+
(resolver) async =>
165+
(await resolver.findLibraryByName('test_lib'))!))
166+
.getClass('TestClassConfig')!
167+
.metadata
168+
.map((e) => src_gen.ConstantReader(e.computeConstantValue()!))
169+
.first;
170+
final args = GeneratorArguments(annotations: annotations);
171+
expect(args.alwaysRun, isTrue);
172+
expect(args.useNextGen, isTrue);
173+
expect(args.cachePath, './test/specs/output/cache.json');
174+
expect(args.outputDirectory, './test/specs/output');
175+
expect(args.runSourceGen, isTrue);
176+
expect(args.shouldFetchDependencies, isTrue);
177+
expect(args.skipValidation, isFalse);
178+
expect(await args.inputFileOrFetch, './test/specs/openapi.test.yaml');
179+
expect(args.templateDirectory, 'template');
180+
expect(args.generator, Generator.dio);
181+
expect(args.wrapper, Wrapper.fvm);
182+
expect(args.importMappings, {'package': 'test'});
183+
expect(args.typeMappings, {'key': 'value'});
184+
expect(args.reservedWordsMappings, {'const': 'final'});
185+
expect(args.inlineSchemaNameMappings, {'200resp': 'OkResp'});
186+
expect(args.pubspecPath, './test/specs/dart_pubspec.test.yaml');
187+
expect(args.isRemote, isFalse);
188+
expect(args.generatorName, 'dart-dio');
189+
expect(args.shouldGenerateSources, isTrue);
190+
expect(args.additionalProperties?.useEnumExtension, isTrue);
191+
expect(args.additionalProperties?.pubAuthor, 'test author');
192+
expect(await args.jarArgs, [
193+
'generate',
194+
'-o=${args.outputDirectory}',
195+
'-i=${await args.inputFileOrFetch}',
196+
'-t=${args.templateDirectory}',
197+
'-g=${args.generatorName}',
198+
'--reserved-words-mappings=${args.reservedWordsMappings.entries.fold('', foldStringMap())}',
199+
'--inline-schema-name-mappings=${args.inlineSchemaNameMappings.entries.fold('', foldStringMap())}',
200+
'--import-mappings=${args.importMappings.entries.fold('', foldStringMap())}',
201+
'--type-mappings=${args.typeMappings.entries.fold('', foldStringMap())}',
202+
'--additional-properties=${args.additionalProperties!.toMap().entries.fold('', foldStringMap(keyModifier: convertToPropertyKey))}'
203+
]);
204+
});
205+
test('Processes annotation with DioProperties correctly', () async {
206+
final config = File(
207+
'${Directory.current.path}${Platform.pathSeparator}test${Platform.pathSeparator}specs${Platform.pathSeparator}dio_properties_test_config.dart')
208+
.readAsStringSync();
209+
final annotations = (await resolveSource(
210+
config,
211+
(resolver) async =>
212+
(await resolver.findLibraryByName('test_lib'))!))
213+
.getClass('DioPropertiesTestConfig')!
214+
.metadata
215+
.map((e) => src_gen.ConstantReader(e.computeConstantValue()!))
216+
.first;
217+
final args = GeneratorArguments(annotations: annotations);
218+
expect(args.alwaysRun, isTrue);
219+
expect(args.useNextGen, isTrue);
220+
expect(args.cachePath, './test/specs/output/cache.json');
221+
expect(args.outputDirectory, './test/specs/output');
222+
expect(args.runSourceGen, isTrue);
223+
expect(args.shouldFetchDependencies, isTrue);
224+
expect(args.skipValidation, isFalse);
225+
expect(await args.inputFileOrFetch, './test/specs/openapi.test.yaml');
226+
expect(args.templateDirectory, 'template');
227+
expect(args.generator, Generator.dio);
228+
expect(args.wrapper, Wrapper.fvm);
229+
expect(args.importMappings, {'package': 'test'});
230+
expect(args.typeMappings, {'key': 'value'});
231+
expect(args.reservedWordsMappings, {'const': 'final'});
232+
expect(args.inlineSchemaNameMappings, {'200resp': 'OkResp'});
233+
expect(args.pubspecPath, './test/specs/dart_pubspec.test.yaml');
234+
expect(args.isRemote, isFalse);
235+
expect(args.generatorName, 'dart-dio');
236+
expect(args.shouldGenerateSources, isTrue);
237+
expect(args.additionalProperties?.useEnumExtension, isTrue);
238+
expect((args.additionalProperties as DioProperties?)?.nullableFields,
239+
isTrue);
240+
expect(await args.jarArgs, [
241+
'generate',
242+
'-o=${args.outputDirectory}',
243+
'-i=${await args.inputFileOrFetch}',
244+
'-t=${args.templateDirectory}',
245+
'-g=${args.generatorName}',
246+
'--reserved-words-mappings=${args.reservedWordsMappings.entries.fold('', foldStringMap())}',
247+
'--inline-schema-name-mappings=${args.inlineSchemaNameMappings.entries.fold('', foldStringMap())}',
248+
'--import-mappings=${args.importMappings.entries.fold('', foldStringMap())}',
249+
'--type-mappings=${args.typeMappings.entries.fold('', foldStringMap())}',
250+
'--additional-properties=${args.additionalProperties!.toMap().entries.fold('', foldStringMap(keyModifier: convertToPropertyKey))}'
251+
]);
252+
});
253+
test('Processes annotation with DioAltProperties correctly', () async {
254+
final config = File(
255+
'${Directory.current.path}${Platform.pathSeparator}test${Platform.pathSeparator}specs${Platform.pathSeparator}dio_alt_properties_test_config.dart')
256+
.readAsStringSync();
257+
final annotations = (await resolveSource(
258+
config,
259+
(resolver) async =>
260+
(await resolver.findLibraryByName('test_lib'))!))
261+
.getClass('DioAltPropertiesTestConfig')!
262+
.metadata
263+
.map((e) => src_gen.ConstantReader(e.computeConstantValue()!))
264+
.first;
265+
final args = GeneratorArguments(annotations: annotations);
266+
expect(args.alwaysRun, isTrue);
267+
expect(args.useNextGen, isTrue);
268+
expect(args.cachePath, './test/specs/output/cache.json');
269+
expect(args.outputDirectory, './test/specs/output');
270+
expect(args.runSourceGen, isTrue);
271+
expect(args.shouldFetchDependencies, isTrue);
272+
expect(args.skipValidation, isFalse);
273+
expect(await args.inputFileOrFetch, './test/specs/openapi.test.yaml');
274+
expect(args.templateDirectory, 'template');
275+
expect(args.generator, Generator.dio);
276+
expect(args.wrapper, Wrapper.fvm);
277+
expect(args.importMappings, {'package': 'test'});
278+
expect(args.typeMappings, {'key': 'value'});
279+
expect(args.reservedWordsMappings, {'const': 'final'});
280+
expect(args.inlineSchemaNameMappings, {'200resp': 'OkResp'});
281+
expect(args.pubspecPath, './test/specs/dart_pubspec.test.yaml');
282+
expect(args.isRemote, isFalse);
283+
expect(args.generatorName, 'dart-dio');
284+
expect(args.shouldGenerateSources, isTrue);
285+
expect(args.additionalProperties?.useEnumExtension, isTrue);
286+
expect(
287+
(args.additionalProperties as DioAltProperties?)?.nullSafe, isTrue);
288+
expect(
289+
(args.additionalProperties as DioAltProperties?)
290+
?.nullSafeArrayDefault,
291+
isTrue);
292+
expect(await args.jarArgs, [
293+
'generate',
294+
'-o=${args.outputDirectory}',
295+
'-i=${await args.inputFileOrFetch}',
296+
'-t=${args.templateDirectory}',
297+
'-g=${args.generatorName}',
298+
'--reserved-words-mappings=${args.reservedWordsMappings.entries.fold('', foldStringMap())}',
299+
'--inline-schema-name-mappings=${args.inlineSchemaNameMappings.entries.fold('', foldStringMap())}',
300+
'--import-mappings=${args.importMappings.entries.fold('', foldStringMap())}',
301+
'--type-mappings=${args.typeMappings.entries.fold('', foldStringMap())}',
302+
'--additional-properties=${args.additionalProperties!.toMap().entries.fold('', foldStringMap(keyModifier: convertToPropertyKey))}'
303+
]);
304+
});
200305
});
201306
});
202307
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
library test_lib;
2+
3+
import 'package:openapi_generator_annotations/openapi_generator_annotations.dart';
4+
5+
@Openapi(
6+
inputSpecFile: './openapi.test.yaml',
7+
inputSpec: InputSpec(path: './test/specs/openapi.test.yaml'),
8+
generatorName: Generator.dio,
9+
useNextGen: true,
10+
cachePath: './test/specs/output/cache.json',
11+
typeMappings: {'key': 'value'},
12+
templateDirectory: 'template',
13+
alwaysRun: true,
14+
outputDirectory: './test/specs/output',
15+
runSourceGenOnOutput: true,
16+
apiPackage: 'test',
17+
skipSpecValidation: false,
18+
importMappings: {'package': 'test'},
19+
reservedWordsMappings: {'const': 'final'},
20+
additionalProperties: DioAltProperties(
21+
wrapper: Wrapper.fvm,
22+
useEnumExtension: true,
23+
pubAuthor: 'test author',
24+
nullSafe: true,
25+
nullSafeArrayDefault: true),
26+
inlineSchemaNameMappings: {'200resp': 'OkResp'},
27+
overwriteExistingFiles: true,
28+
projectPubspecPath: './test/specs/dart_pubspec.test.yaml',
29+
)
30+
class DioAltPropertiesTestConfig {}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
library test_lib;
2+
3+
import 'package:openapi_generator_annotations/openapi_generator_annotations.dart';
4+
5+
@Openapi(
6+
inputSpecFile: './openapi.test.yaml',
7+
inputSpec: InputSpec(path: './test/specs/openapi.test.yaml'),
8+
generatorName: Generator.dio,
9+
useNextGen: true,
10+
cachePath: './test/specs/output/cache.json',
11+
typeMappings: {'key': 'value'},
12+
templateDirectory: 'template',
13+
alwaysRun: true,
14+
outputDirectory: './test/specs/output',
15+
runSourceGenOnOutput: true,
16+
apiPackage: 'test',
17+
skipSpecValidation: false,
18+
importMappings: {'package': 'test'},
19+
reservedWordsMappings: {'const': 'final'},
20+
additionalProperties: DioProperties(
21+
wrapper: Wrapper.fvm,
22+
useEnumExtension: true,
23+
pubAuthor: 'test author',
24+
nullableFields: true),
25+
inlineSchemaNameMappings: {'200resp': 'OkResp'},
26+
overwriteExistingFiles: true,
27+
projectPubspecPath: './test/specs/dart_pubspec.test.yaml',
28+
)
29+
class DioPropertiesTestConfig {}

openapi-generator/test/specs/test_config.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,14 @@ import 'package:openapi_generator_annotations/openapi_generator_annotations.dart
1717
skipSpecValidation: false,
1818
importMappings: {'package': 'test'},
1919
reservedWordsMappings: {'const': 'final'},
20-
additionalProperties: AdditionalProperties(wrapper: Wrapper.fvm),
20+
additionalProperties: AdditionalProperties(
21+
wrapper: Wrapper.fvm,
22+
useEnumExtension: true,
23+
pubAuthor: 'test author',
24+
sortModelPropertiesByRequiredFlag: true,
25+
legacyDiscriminatorBehavior: true),
2126
inlineSchemaNameMappings: {'200resp': 'OkResp'},
2227
overwriteExistingFiles: true,
2328
projectPubspecPath: './test/specs/dart_pubspec.test.yaml',
2429
)
25-
class TestClassConfig extends OpenapiGeneratorConfig {}
30+
class TestClassConfig {}

openapi-generator/test/test_annotations/test_configs.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ const useNextGen = false;
4545
@Openapi(
4646
inputSpecFile: '',
4747
generatorName: Generator.dart,
48-
additionalProperties: AdditionalProperties(
49-
wrapper: Wrapper.flutterw,
50-
),
48+
additionalProperties: AdditionalProperties(wrapper: Wrapper.flutterw),
5149
)
5250
class TestClassHasCustomAnnotations extends OpenapiGeneratorConfig {}
5351

0 commit comments

Comments
 (0)