Skip to content

Commit 95c36ad

Browse files
Merge pull request #133 from icapps/fix-enum-map-and-extension
Fix enum map and extension
2 parents aa15fda + 32d9b5b commit 95c36ad

17 files changed

+364
-38
lines changed

Diff for: CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
# Changelog
2+
## [6.2.1] - 2023-03-07
3+
- Updated the enum model generator to correctly generate the (reverse)Mapping based on the item_type
4+
25
## [6.2.0] - 2023-02-23
36
- Better enum support. Right now, String, int, double can be used to map a value to an enum.
47

Diff for: example/analysis_options.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ linter:
5555
- file_names
5656
- hash_and_equals
5757
- implementation_imports
58-
- invariant_booleans
5958
- iterable_contains_unrelated_type
6059
- join_return_with_assignment
6160
- library_names

Diff for: example/lib/model/status/double_status.dart

+36
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: example/lib/model/status/status.dart

+22
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: example/model_generator/enums.yaml

+19
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@ Gender:
1818
value:
1919
GENDER_lap:
2020
value: GENDER_lap
21+
2122
Status:
2223
path: status
2324
type: enum
2425
item_type: int
26+
generate_map: true
27+
generate_extensions: true
2528
properties:
2629
status_0:
2730
value: 0
@@ -31,3 +34,19 @@ Status:
3134
value: 2
3235
status_3:
3336
value: 3
37+
38+
DoubleStatus:
39+
path: status
40+
type: enum
41+
item_type: double
42+
generate_map: true
43+
generate_extensions: true
44+
properties:
45+
status_0:
46+
value: 0.0
47+
status_1:
48+
value: 1.0
49+
status_2:
50+
value: 2.0
51+
status_3:
52+
value: 3.0

Diff for: lib/util/case_util.dart

+11-7
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,11 @@ class CaseUtil {
4141
return words;
4242
}
4343

44-
String get snakeCase => _getSnakeCase();
45-
4644
String get camelCase => _getCamelCase();
4745

48-
String _getSnakeCase({String separator = '_'}) =>
49-
_words.map((word) => word.toLowerCase()).toList().join(separator);
46+
String get pascalCase => _getPascalCase();
47+
48+
String get snakeCase => _getSnakeCase();
5049

5150
String _getCamelCase({String separator = ''}) {
5251
final words = _words.map(_upperCaseFirstLetter).toList();
@@ -55,7 +54,12 @@ class CaseUtil {
5554
return words.join(separator);
5655
}
5756

58-
static String _upperCaseFirstLetter(String word) {
59-
return '${word.substring(0, 1).toUpperCase()}${word.substring(1).toLowerCase()}';
60-
}
57+
String _getPascalCase({String separator = ''}) =>
58+
_words.map(_upperCaseFirstLetter).toList().join(separator);
59+
60+
String _getSnakeCase({String separator = '_'}) =>
61+
_words.map((word) => word.toLowerCase()).toList().join(separator);
62+
63+
String _upperCaseFirstLetter(String word) =>
64+
'${word.substring(0, 1).toUpperCase()}${word.substring(1).toLowerCase()}';
6165
}

Diff for: lib/writer/enum_model_writer.dart

+42-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import 'package:model_generator/model/item_type/double_type.dart';
12
import 'package:model_generator/model/item_type/string_type.dart';
23
import 'package:model_generator/model/model/enum_model.dart';
4+
import 'package:model_generator/util/case_util.dart';
35
import 'package:model_generator/writer/object_model_writer.dart';
46

57
class EnumModelWriter {
@@ -19,7 +21,10 @@ class EnumModelWriter {
1921
sb.writeln("///$modelDescription");
2022
}
2123

22-
sb.writeln('enum ${jsonModel.name} {');
24+
final jsonModelName = CaseUtil(jsonModel.name);
25+
final itemTypeName = CaseUtil(jsonModel.itemType.name);
26+
27+
sb.writeln('enum ${jsonModelName.pascalCase} {');
2328
jsonModel.fields?.forEach((key) {
2429
final jsonValue = key.value == null || key.value?.isEmpty == null
2530
? key.serializedName
@@ -29,9 +34,12 @@ class EnumModelWriter {
2934
sb.writeln(' ///$description');
3035
}
3136
if (jsonModel.itemType is StringType) {
32-
sb.writeln(" @JsonValue('$jsonValue')");
37+
sb.writeln(' @JsonValue(\'$jsonValue\')');
38+
} else if (jsonModel.itemType is DoubleType && jsonValue != null) {
39+
final doubleValue = double.tryParse(jsonValue);
40+
sb.writeln(' @JsonValue($doubleValue)');
3341
} else {
34-
sb.writeln(" @JsonValue($jsonValue)");
42+
sb.writeln(' @JsonValue($jsonValue)');
3543
}
3644
sb.writeln(' ${key.name},');
3745
});
@@ -40,29 +48,46 @@ class EnumModelWriter {
4048
if (jsonModel.generateMap) {
4149
sb
4250
..writeln()
43-
..writeln('const ${jsonModel.name}Mapping = {');
51+
..writeln('const ${jsonModelName.camelCase}Mapping = {');
4452

4553
jsonModel.fields?.forEach((key) {
4654
final jsonValue = key.value == null || key.value?.isEmpty == null
4755
? key.serializedName
4856
: key.value;
49-
sb
50-
..write(' ${jsonModel.name}.${key.name}: ')
51-
..writeln('\'$jsonValue\',');
57+
sb.write(' ${jsonModelName.pascalCase}.${key.name}: ');
58+
if (jsonModel.itemType is StringType) {
59+
sb.writeln('\'$jsonValue\',');
60+
} else if (jsonModel.itemType is DoubleType && jsonValue != null) {
61+
final doubleValue = double.tryParse(jsonValue);
62+
sb.writeln('$doubleValue,');
63+
} else {
64+
sb.writeln('$jsonValue,');
65+
}
5266
});
5367

5468
sb
5569
..writeln('};')
56-
..writeln()
57-
..writeln('const reverse${jsonModel.name}Mapping = {');
70+
..writeln();
71+
72+
if (jsonModel.itemType is DoubleType) {
73+
sb.writeln('final reverse${jsonModelName.pascalCase}Mapping = {');
74+
} else {
75+
sb.writeln('const reverse${jsonModelName.pascalCase}Mapping = {');
76+
}
5877

5978
jsonModel.fields?.forEach((key) {
6079
final jsonValue = key.value == null || key.value?.isEmpty == null
6180
? key.serializedName
6281
: key.value;
63-
sb
64-
..write(' \'$jsonValue\': ')
65-
..writeln('${jsonModel.name}.${key.name},');
82+
if (jsonModel.itemType is StringType) {
83+
sb.write(' \'$jsonValue\': ');
84+
} else if (jsonModel.itemType is DoubleType && jsonValue != null) {
85+
final doubleValue = double.tryParse(jsonValue);
86+
sb.write(' $doubleValue: ');
87+
} else {
88+
sb.write(' $jsonValue: ');
89+
}
90+
sb.writeln('${jsonModelName.pascalCase}.${key.name},');
6691
});
6792

6893
sb.writeln('};');
@@ -71,14 +96,15 @@ class EnumModelWriter {
7196
sb
7297
..writeln()
7398
..writeln(
74-
'extension ${jsonModel.name}Extension on ${jsonModel.name} {')
99+
'extension ${jsonModelName.pascalCase}Extension on ${jsonModelName.pascalCase} {')
75100
..writeln(
76-
' String get stringValue => ${jsonModel.name}Mapping[this]!;')
101+
' ${itemTypeName.originalText} get ${itemTypeName.camelCase}Value => ${jsonModelName.camelCase}Mapping[this]!;')
77102
..writeln('}')
78103
..writeln()
79-
..writeln('extension ${jsonModel.name}StringExtension on String {')
80104
..writeln(
81-
' ${jsonModel.name}? get as${jsonModel.name} => reverse${jsonModel.name}Mapping[this];')
105+
'extension ${jsonModelName.pascalCase}${itemTypeName.pascalCase}Extension on ${itemTypeName.originalText} {')
106+
..writeln(
107+
' ${jsonModelName.pascalCase}? get as${jsonModelName.pascalCase} => reverse${jsonModelName.pascalCase}Mapping[this];')
82108
..writeln('}');
83109
}
84110
}

Diff for: pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: model_generator
22
description: Dart tool to automaticly generate models from a yml file to speed up your development flow.
3-
version: 6.2.0
3+
version: 6.2.1
44
homepage: https://github.com/icapps/flutter-model-generator
55

66
environment:

Diff for: test/util/case_util_test.dart

+21-6
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,42 @@ void main() {
66
test('Case Util normal text all lowercase', () {
77
expect(CaseUtil('hallokes').originalText, 'hallokes');
88
expect(CaseUtil('hallokes').camelCase, 'hallokes');
9+
expect(CaseUtil('hallokes').pascalCase, 'Hallokes');
910
expect(CaseUtil('hallokes').snakeCase, 'hallokes');
1011
});
11-
test('Case Util normal text all Uppercase', () {
12+
13+
test('Case Util normal text all uppercase', () {
1214
expect(CaseUtil('HALLOKES').originalText, 'HALLOKES');
1315
expect(CaseUtil('HALLOKES').camelCase, 'hallokes');
16+
expect(CaseUtil('HALLOKES').pascalCase, 'Hallokes');
1417
expect(CaseUtil('HALLOKES').snakeCase, 'hallokes');
1518
});
1619

20+
test('Case Util camel case', () {
21+
expect(CaseUtil('hiThere').originalText, 'hiThere');
22+
expect(CaseUtil('hiThere').camelCase, 'hiThere');
23+
expect(CaseUtil('hiThere').pascalCase, 'HiThere');
24+
expect(CaseUtil('hiThere').snakeCase, 'hi_there');
25+
});
26+
27+
test('Case Util pascal case', () {
28+
expect(CaseUtil('HiThere').originalText, 'HiThere');
29+
expect(CaseUtil('HiThere').camelCase, 'hiThere');
30+
expect(CaseUtil('HiThere').pascalCase, 'HiThere');
31+
expect(CaseUtil('HiThere').snakeCase, 'hi_there');
32+
});
33+
1734
test('Case Util snake case', () {
1835
expect(CaseUtil('hi_there').originalText, 'hi_there');
1936
expect(CaseUtil('hi_there').camelCase, 'hiThere');
37+
expect(CaseUtil('hi_there').pascalCase, 'HiThere');
2038
expect(CaseUtil('hi_there').snakeCase, 'hi_there');
2139
});
22-
test('Case Util camelCase', () {
23-
expect(CaseUtil('hiThere').originalText, 'hiThere');
24-
expect(CaseUtil('hiThere').camelCase, 'hiThere');
25-
expect(CaseUtil('hiThere').snakeCase, 'hi_there');
26-
});
40+
2741
test('Case Util ', () {
2842
expect(CaseUtil('hi-there').originalText, 'hi-there');
2943
expect(CaseUtil('hi-there').camelCase, 'hiThere');
44+
expect(CaseUtil('hi-there').pascalCase, 'HiThere');
3045
expect(CaseUtil('hi-there').snakeCase, 'hi_there');
3146
});
3247
});

Diff for: test/writer/enum_model_writer/custom-value-map-extension.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ enum MyEnumModel {
99
MY_VALUE_2,
1010
}
1111

12-
const MyEnumModelMapping = {
12+
const myEnumModelMapping = {
1313
MyEnumModel.MY_VALUE_1: 'customValue',
1414
MyEnumModel.MY_VALUE_2: 'MY_VALUE_2',
1515
};
@@ -20,7 +20,7 @@ const reverseMyEnumModelMapping = {
2020
};
2121

2222
extension MyEnumModelExtension on MyEnumModel {
23-
String get stringValue => MyEnumModelMapping[this]!;
23+
String get stringValue => myEnumModelMapping[this]!;
2424
}
2525

2626
extension MyEnumModelStringExtension on String {

Diff for: test/writer/enum_model_writer/custom-value-map.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ enum MyEnumModel {
99
MY_VALUE_2,
1010
}
1111

12-
const MyEnumModelMapping = {
12+
const myEnumModelMapping = {
1313
MyEnumModel.MY_VALUE_1: 'customValue',
1414
MyEnumModel.MY_VALUE_2: 'MY_VALUE_2',
1515
};

Diff for: test/writer/enum_model_writer/normal_with_double_type.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:json_annotation/json_annotation.dart';
44

55
enum MyEnumModel {
66
///A good description of this field
7-
@JsonValue(1)
7+
@JsonValue(1.0)
88
MY_VALUE_1,
99
@JsonValue(2.2)
1010
MY_VALUE_2,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// GENERATED CODE - DO NOT MODIFY BY HAND
2+
3+
import 'package:json_annotation/json_annotation.dart';
4+
5+
enum MyEnumModel {
6+
///A good description of this field
7+
@JsonValue(1.0)
8+
MY_VALUE_1,
9+
@JsonValue(2.2)
10+
MY_VALUE_2,
11+
}
12+
13+
const myEnumModelMapping = {
14+
MyEnumModel.MY_VALUE_1: 1.0,
15+
MyEnumModel.MY_VALUE_2: 2.2,
16+
};
17+
18+
final reverseMyEnumModelMapping = {
19+
1.0: MyEnumModel.MY_VALUE_1,
20+
2.2: MyEnumModel.MY_VALUE_2,
21+
};

0 commit comments

Comments
 (0)