From d27d39ad8a5aeece79f73c43beeaa7de95ea5aed Mon Sep 17 00:00:00 2001 From: WilliamVerhaeghe Date: Wed, 4 Jan 2023 14:22:28 +0100 Subject: [PATCH 1/2] Added jsonValue field in enums --- CHANGELOG.md | 1 + .../article/custom_base_directory_obj.dart | 6 ++--- example/lib/database/model/book/book.dart | 6 +++-- .../article/no_custom_base_directory_obj.dart | 6 ++--- example/lib/model/book/book.dart | 6 +++-- example/lib/model/book/book_category.dart | 12 +++++++--- example/lib/model/ogm.dart | 4 ++-- example/lib/model/user/person/gender.dart | 22 +++++++++++-------- example/lib/model/user/person/person.dart | 4 ++-- .../user/profile/admin_profile_data.dart | 5 ++--- .../model/user/profile/user_profile_data.dart | 5 ++--- .../profile/user_profile_data_extended.dart | 6 ++--- example/lib/model/user/project/project.dart | 4 ++-- example/lib/model/user/testing.dart | 4 ++-- example/model_generator/config.yaml | 1 + example/pubspec.yaml | 2 +- lib/writer/drift_model_writer.dart | 4 ++-- lib/writer/enum_model_writer.dart | 16 +++++++++++++- .../drift_model_writer/enum_field/output.txt | 4 ++-- .../enum_field_twice/output.txt | 4 ++-- .../custom-value-map-extension.txt | 8 +++++-- .../enum_model_writer/custom-value-map.txt | 8 +++++-- .../writer/enum_model_writer/custom-value.txt | 8 +++++-- test/writer/enum_model_writer/no-fields.txt | 4 ++++ .../enum_model_writer/normal-description.txt | 8 +++++-- test/writer/enum_model_writer/normal.txt | 8 +++++-- test/writer/enum_model_writer/null-value.txt | 8 +++++-- 27 files changed, 112 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c1a75f..2ff0cab 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## [7.0.0] - 2022-12-25 - Added support for generating drift tables by adding `generate_drift_table: true` on model definition +- Added jsonValue to enum values to easily map from/to json values (Note, breaks Dart <2.17) ## [6.1.0] - 2022-10-14 - Support passing a directory instead of a file. All .yaml files inside this folder (recursively) will be used to build the final model data. diff --git a/example/lib/custom_model_directory/article/custom_base_directory_obj.dart b/example/lib/custom_model_directory/article/custom_base_directory_obj.dart index bee091e..2dab8ff 100644 --- a/example/lib/custom_model_directory/article/custom_base_directory_obj.dart +++ b/example/lib/custom_model_directory/article/custom_base_directory_obj.dart @@ -36,9 +36,7 @@ class CustomBaseDirectoryObj { '}'; } -CustomBaseDirectoryObj deserializeCustomBaseDirectoryObj( - Map json) => - CustomBaseDirectoryObj.fromJson(json); +const deserializeCustomBaseDirectoryObj = CustomBaseDirectoryObj.fromJson; Map serializeCustomBaseDirectoryObj( CustomBaseDirectoryObj object) => @@ -46,7 +44,7 @@ Map serializeCustomBaseDirectoryObj( List deserializeCustomBaseDirectoryObjList( List> jsonList) => - jsonList.map((json) => CustomBaseDirectoryObj.fromJson(json)).toList(); + jsonList.map(CustomBaseDirectoryObj.fromJson).toList(); List> serializeCustomBaseDirectoryObjList( List objects) => diff --git a/example/lib/database/model/book/book.dart b/example/lib/database/model/book/book.dart index dddf47a..031b6cb 100644 --- a/example/lib/database/model/book/book.dart +++ b/example/lib/database/model/book/book.dart @@ -1,3 +1,5 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + import 'package:drift/drift.dart'; import 'package:model_generator_example/database/model_generator_example_database.dart'; import 'package:model_generator_example/model/book/book.dart'; @@ -64,13 +66,13 @@ class BookTableBookCategoryConverter @override BookCategory fromSql(String fromDb) { for (final value in BookCategory.values) { - if (value.toString() == fromDb) return value; + if (value.jsonValue == fromDb) return value; } return BookCategory.values.first; } @override String toSql(BookCategory value) { - return value.toString(); + return value.jsonValue; } } diff --git a/example/lib/model/article/no_custom_base_directory_obj.dart b/example/lib/model/article/no_custom_base_directory_obj.dart index b6555e5..306bd77 100644 --- a/example/lib/model/article/no_custom_base_directory_obj.dart +++ b/example/lib/model/article/no_custom_base_directory_obj.dart @@ -37,9 +37,7 @@ class NoCustomBaseDirectoryObj { '}'; } -NoCustomBaseDirectoryObj deserializeNoCustomBaseDirectoryObj( - Map json) => - NoCustomBaseDirectoryObj.fromJson(json); +const deserializeNoCustomBaseDirectoryObj = NoCustomBaseDirectoryObj.fromJson; Map serializeNoCustomBaseDirectoryObj( NoCustomBaseDirectoryObj object) => @@ -47,7 +45,7 @@ Map serializeNoCustomBaseDirectoryObj( List deserializeNoCustomBaseDirectoryObjList( List> jsonList) => - jsonList.map((json) => NoCustomBaseDirectoryObj.fromJson(json)).toList(); + jsonList.map(NoCustomBaseDirectoryObj.fromJson).toList(); List> serializeNoCustomBaseDirectoryObjList( List objects) => diff --git a/example/lib/model/book/book.dart b/example/lib/model/book/book.dart index 45e7efb..0ba4202 100644 --- a/example/lib/model/book/book.dart +++ b/example/lib/model/book/book.dart @@ -1,3 +1,5 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + import 'package:flutter/foundation.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:model_generator_example/model/book/book_category.dart'; @@ -90,12 +92,12 @@ class Book { '}'; } -Book deserializeBook(Map json) => Book.fromJson(json); +const deserializeBook = Book.fromJson; Map serializeBook(Book object) => object.toJson(); List deserializeBookList(List> jsonList) => - jsonList.map((json) => Book.fromJson(json)).toList(); + jsonList.map(Book.fromJson).toList(); List> serializeBookList(List objects) => objects.map((object) => object.toJson()).toList(); diff --git a/example/lib/model/book/book_category.dart b/example/lib/model/book/book_category.dart index 39322f5..32bca6f 100644 --- a/example/lib/model/book/book_category.dart +++ b/example/lib/model/book/book_category.dart @@ -1,10 +1,16 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + import 'package:json_annotation/json_annotation.dart'; enum BookCategory { @JsonValue('UNKOWN') - UNKOWN, + UNKOWN('UNKOWN'), @JsonValue('FICTION') - FICTION, + FICTION('FICTION'), @JsonValue('FANTASY') - FANTASY, + FANTASY('FANTASY'); + + final String jsonValue; + + const BookCategory(this.jsonValue); } diff --git a/example/lib/model/ogm.dart b/example/lib/model/ogm.dart index 0c5f31e..1cf58fb 100644 --- a/example/lib/model/ogm.dart +++ b/example/lib/model/ogm.dart @@ -103,12 +103,12 @@ class OGM { '}'; } -OGM deserializeOGM(Map json) => OGM.fromJson(json); +const deserializeOGM = OGM.fromJson; Map serializeOGM(OGM object) => object.toJson(); List deserializeOGMList(List> jsonList) => - jsonList.map((json) => OGM.fromJson(json)).toList(); + jsonList.map(OGM.fromJson).toList(); List> serializeOGMList(List objects) => objects.map((object) => object.toJson()).toList(); diff --git a/example/lib/model/user/person/gender.dart b/example/lib/model/user/person/gender.dart index d9ed6bf..0b782ff 100644 --- a/example/lib/model/user/person/gender.dart +++ b/example/lib/model/user/person/gender.dart @@ -4,21 +4,25 @@ import 'package:json_annotation/json_annotation.dart'; enum Gender { @JsonValue('_mAl3') - MALE, + MALE('_mAl3'), @JsonValue('femAle') - FEMALE, + FEMALE('femAle'), @JsonValue('X') - X, + X('X'), @JsonValue('GENDER_X') - GENDER_X, + GENDER_X('GENDER_X'), @JsonValue('GENDER_Y') - GENDER_Y, + GENDER_Y('GENDER_Y'), @JsonValue('gender_z') - GENDER_Z, + GENDER_Z('gender_z'), @JsonValue('GENDER_abC') - GENDER_ABC, + GENDER_ABC('GENDER_abC'), @JsonValue('GENDER_def') - GENDER_DEF, + GENDER_DEF('GENDER_def'), @JsonValue('GENDER_lap') - GENDER_LAP, + GENDER_LAP('GENDER_lap'); + + final String jsonValue; + + const Gender(this.jsonValue); } diff --git a/example/lib/model/user/person/person.dart b/example/lib/model/user/person/person.dart index 1c5b051..1606912 100644 --- a/example/lib/model/user/person/person.dart +++ b/example/lib/model/user/person/person.dart @@ -45,12 +45,12 @@ class Person { '}'; } -Person deserializePerson(Map json) => Person.fromJson(json); +const deserializePerson = Person.fromJson; Map serializePerson(Person object) => object.toJson(); List deserializePersonList(List> jsonList) => - jsonList.map((json) => Person.fromJson(json)).toList(); + jsonList.map(Person.fromJson).toList(); List> serializePersonList(List objects) => objects.map((object) => object.toJson()).toList(); diff --git a/example/lib/model/user/profile/admin_profile_data.dart b/example/lib/model/user/profile/admin_profile_data.dart index 50f9586..ac5a8af 100644 --- a/example/lib/model/user/profile/admin_profile_data.dart +++ b/example/lib/model/user/profile/admin_profile_data.dart @@ -79,15 +79,14 @@ class AdminProfileData extends UserProfileDataExtended { '}'; } -AdminProfileData deserializeAdminProfileData(Map json) => - AdminProfileData.fromJson(json); +const deserializeAdminProfileData = AdminProfileData.fromJson; Map serializeAdminProfileData(AdminProfileData object) => object.toJson(); List deserializeAdminProfileDataList( List> jsonList) => - jsonList.map((json) => AdminProfileData.fromJson(json)).toList(); + jsonList.map(AdminProfileData.fromJson).toList(); List> serializeAdminProfileDataList( List objects) => diff --git a/example/lib/model/user/profile/user_profile_data.dart b/example/lib/model/user/profile/user_profile_data.dart index 3c94ac8..84b9c2d 100644 --- a/example/lib/model/user/profile/user_profile_data.dart +++ b/example/lib/model/user/profile/user_profile_data.dart @@ -100,15 +100,14 @@ class UserProfileData { '}'; } -UserProfileData deserializeUserProfileData(Map json) => - UserProfileData.fromJson(json); +const deserializeUserProfileData = UserProfileData.fromJson; Map serializeUserProfileData(UserProfileData object) => object.toJson(); List deserializeUserProfileDataList( List> jsonList) => - jsonList.map((json) => UserProfileData.fromJson(json)).toList(); + jsonList.map(UserProfileData.fromJson).toList(); List> serializeUserProfileDataList( List objects) => diff --git a/example/lib/model/user/profile/user_profile_data_extended.dart b/example/lib/model/user/profile/user_profile_data_extended.dart index 0a361fe..c0e77fb 100644 --- a/example/lib/model/user/profile/user_profile_data_extended.dart +++ b/example/lib/model/user/profile/user_profile_data_extended.dart @@ -76,9 +76,7 @@ class UserProfileDataExtended extends UserProfileData { '}'; } -UserProfileDataExtended deserializeUserProfileDataExtended( - Map json) => - UserProfileDataExtended.fromJson(json); +const deserializeUserProfileDataExtended = UserProfileDataExtended.fromJson; Map serializeUserProfileDataExtended( UserProfileDataExtended object) => @@ -86,7 +84,7 @@ Map serializeUserProfileDataExtended( List deserializeUserProfileDataExtendedList( List> jsonList) => - jsonList.map((json) => UserProfileDataExtended.fromJson(json)).toList(); + jsonList.map(UserProfileDataExtended.fromJson).toList(); List> serializeUserProfileDataExtendedList( List objects) => diff --git a/example/lib/model/user/project/project.dart b/example/lib/model/user/project/project.dart index b463530..a2e5635 100644 --- a/example/lib/model/user/project/project.dart +++ b/example/lib/model/user/project/project.dart @@ -48,12 +48,12 @@ class Project { '}'; } -Project deserializeProject(Map json) => Project.fromJson(json); +const deserializeProject = Project.fromJson; Map serializeProject(Project object) => object.toJson(); List deserializeProjectList(List> jsonList) => - jsonList.map((json) => Project.fromJson(json)).toList(); + jsonList.map(Project.fromJson).toList(); List> serializeProjectList(List objects) => objects.map((object) => object.toJson()).toList(); diff --git a/example/lib/model/user/testing.dart b/example/lib/model/user/testing.dart index c49e8f9..cc44e3f 100644 --- a/example/lib/model/user/testing.dart +++ b/example/lib/model/user/testing.dart @@ -43,12 +43,12 @@ class Testing { Map toJson() => _$TestingToJson(this); } -Testing deserializeTesting(Map json) => Testing.fromJson(json); +const deserializeTesting = Testing.fromJson; Map serializeTesting(Testing object) => object.toJson(); List deserializeTestingList(List> jsonList) => - jsonList.map((json) => Testing.fromJson(json)).toList(); + jsonList.map(Testing.fromJson).toList(); List> serializeTestingList(List objects) => objects.map((object) => object.toJson()).toList(); diff --git a/example/model_generator/config.yaml b/example/model_generator/config.yaml index 3367f48..642af3a 100644 --- a/example/model_generator/config.yaml +++ b/example/model_generator/config.yaml @@ -198,6 +198,7 @@ Book: publishers: type: array required: false # this is NOT required, so will be added to the getModel method as optional + ignore_for_table: true items: type: Person category: BookCategory diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 4a1635a..a000b45 100755 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -3,7 +3,7 @@ description: A project used to demo the model generator version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0 <3.0.0" dependencies: drift: ^2.3.0 # This is added since we can now generate database tables diff --git a/lib/writer/drift_model_writer.dart b/lib/writer/drift_model_writer.dart index 3c4900b..dabc1f3 100644 --- a/lib/writer/drift_model_writer.dart +++ b/lib/writer/drift_model_writer.dart @@ -164,14 +164,14 @@ class DriftModelWriter { @override $uppercaseFieldName fromSql(String fromDb) { for (final value in $uppercaseFieldName.values) { - if (value.toString() == fromDb) return value; + if (value.jsonValue == fromDb) return value; } return $uppercaseFieldName.values.first; } @override String toSql($uppercaseFieldName value) { - return value.toString(); + return value.jsonValue; } }"""); } diff --git a/lib/writer/enum_model_writer.dart b/lib/writer/enum_model_writer.dart index 7076658..9d09317 100644 --- a/lib/writer/enum_model_writer.dart +++ b/lib/writer/enum_model_writer.dart @@ -19,18 +19,32 @@ class EnumModelWriter { } sb.writeln('enum ${jsonModel.name} {'); + var first = true; jsonModel.fields?.forEach((key) { final jsonValue = key.value == null || key.value?.isEmpty == null ? key.serializedName : key.value; final description = key.description; + + if (!first) { + sb.writeln(','); + } else { + first = false; + } if (description != null) { sb.writeln(' ///$description'); } sb ..writeln(" @JsonValue('$jsonValue')") - ..writeln(' ${key.name},'); + ..write(" ${key.name}('$jsonValue')"); }); + if (jsonModel.fields?.isNotEmpty == true) { + sb.writeln(';'); + } + sb.writeln(''); + sb.writeln(' final String jsonValue;'); + sb.writeln(''); + sb.writeln(' const ${jsonModel.name}(this.jsonValue);'); sb.writeln('}'); if (jsonModel.generateMap) { diff --git a/test/writer/drift_model_writer/enum_field/output.txt b/test/writer/drift_model_writer/enum_field/output.txt index 2c220a8..1d7e6f2 100644 --- a/test/writer/drift_model_writer/enum_field/output.txt +++ b/test/writer/drift_model_writer/enum_field/output.txt @@ -33,13 +33,13 @@ class PersonTableGenderConverter extends TypeConverter { @override Gender fromSql(String fromDb) { for (final value in Gender.values) { - if (value.toString() == fromDb) return value; + if (value.jsonValue == fromDb) return value; } return Gender.values.first; } @override String toSql(Gender value) { - return value.toString(); + return value.jsonValue; } } diff --git a/test/writer/drift_model_writer/enum_field_twice/output.txt b/test/writer/drift_model_writer/enum_field_twice/output.txt index f0b3c05..d2138e5 100644 --- a/test/writer/drift_model_writer/enum_field_twice/output.txt +++ b/test/writer/drift_model_writer/enum_field_twice/output.txt @@ -37,13 +37,13 @@ class PersonTableGenderConverter extends TypeConverter { @override Gender fromSql(String fromDb) { for (final value in Gender.values) { - if (value.toString() == fromDb) return value; + if (value.jsonValue == fromDb) return value; } return Gender.values.first; } @override String toSql(Gender value) { - return value.toString(); + return value.jsonValue; } } diff --git a/test/writer/enum_model_writer/custom-value-map-extension.txt b/test/writer/enum_model_writer/custom-value-map-extension.txt index 61f6dc2..4b73b7d 100644 --- a/test/writer/enum_model_writer/custom-value-map-extension.txt +++ b/test/writer/enum_model_writer/custom-value-map-extension.txt @@ -4,9 +4,13 @@ import 'package:json_annotation/json_annotation.dart'; enum MyEnumModel { @JsonValue('customValue') - MY_VALUE_1, + MY_VALUE_1('customValue'), @JsonValue('MY_VALUE_2') - MY_VALUE_2, + MY_VALUE_2('MY_VALUE_2'); + + final String jsonValue; + + const MyEnumModel(this.jsonValue); } const MyEnumModelMapping = { diff --git a/test/writer/enum_model_writer/custom-value-map.txt b/test/writer/enum_model_writer/custom-value-map.txt index 0cdd234..69217ed 100644 --- a/test/writer/enum_model_writer/custom-value-map.txt +++ b/test/writer/enum_model_writer/custom-value-map.txt @@ -4,9 +4,13 @@ import 'package:json_annotation/json_annotation.dart'; enum MyEnumModel { @JsonValue('customValue') - MY_VALUE_1, + MY_VALUE_1('customValue'), @JsonValue('MY_VALUE_2') - MY_VALUE_2, + MY_VALUE_2('MY_VALUE_2'); + + final String jsonValue; + + const MyEnumModel(this.jsonValue); } const MyEnumModelMapping = { diff --git a/test/writer/enum_model_writer/custom-value.txt b/test/writer/enum_model_writer/custom-value.txt index 102c3f4..5dd0c65 100644 --- a/test/writer/enum_model_writer/custom-value.txt +++ b/test/writer/enum_model_writer/custom-value.txt @@ -4,7 +4,11 @@ import 'package:json_annotation/json_annotation.dart'; enum MyEnumModel { @JsonValue('MY_VALUE_1') - MY_VALUE_1, + MY_VALUE_1('MY_VALUE_1'), @JsonValue('custom_value_2') - MY_VALUE_2, + MY_VALUE_2('custom_value_2'); + + final String jsonValue; + + const MyEnumModel(this.jsonValue); } diff --git a/test/writer/enum_model_writer/no-fields.txt b/test/writer/enum_model_writer/no-fields.txt index 005c481..d636996 100644 --- a/test/writer/enum_model_writer/no-fields.txt +++ b/test/writer/enum_model_writer/no-fields.txt @@ -3,4 +3,8 @@ import 'package:json_annotation/json_annotation.dart'; enum MyEnumModel { + + final String jsonValue; + + const MyEnumModel(this.jsonValue); } diff --git a/test/writer/enum_model_writer/normal-description.txt b/test/writer/enum_model_writer/normal-description.txt index f6f33bb..afd4254 100644 --- a/test/writer/enum_model_writer/normal-description.txt +++ b/test/writer/enum_model_writer/normal-description.txt @@ -6,7 +6,11 @@ import 'package:json_annotation/json_annotation.dart'; enum MyEnumModel { ///A good description of this field @JsonValue('MY_VALUE_1') - MY_VALUE_1, + MY_VALUE_1('MY_VALUE_1'), @JsonValue('MY_VALUE_2') - MY_VALUE_2, + MY_VALUE_2('MY_VALUE_2'); + + final String jsonValue; + + const MyEnumModel(this.jsonValue); } diff --git a/test/writer/enum_model_writer/normal.txt b/test/writer/enum_model_writer/normal.txt index 526caef..b3a5c3c 100644 --- a/test/writer/enum_model_writer/normal.txt +++ b/test/writer/enum_model_writer/normal.txt @@ -5,7 +5,11 @@ import 'package:json_annotation/json_annotation.dart'; enum MyEnumModel { ///A good description of this field @JsonValue('MY_VALUE_1') - MY_VALUE_1, + MY_VALUE_1('MY_VALUE_1'), @JsonValue('MY_VALUE_2') - MY_VALUE_2, + MY_VALUE_2('MY_VALUE_2'); + + final String jsonValue; + + const MyEnumModel(this.jsonValue); } diff --git a/test/writer/enum_model_writer/null-value.txt b/test/writer/enum_model_writer/null-value.txt index 0b50f98..6fba5d3 100644 --- a/test/writer/enum_model_writer/null-value.txt +++ b/test/writer/enum_model_writer/null-value.txt @@ -4,7 +4,11 @@ import 'package:json_annotation/json_annotation.dart'; enum MyEnumModel { @JsonValue('MY_VALUE_1') - MY_VALUE_1, + MY_VALUE_1('MY_VALUE_1'), @JsonValue('MY_VALUE_2') - MY_VALUE_2, + MY_VALUE_2('MY_VALUE_2'); + + final String jsonValue; + + const MyEnumModel(this.jsonValue); } From 66ced924f6a7099dcde27c15747edf618c6047fa Mon Sep 17 00:00:00 2001 From: WilliamVerhaeghe Date: Tue, 10 Jan 2023 15:12:26 +0100 Subject: [PATCH 2/2] PR fixes --- CHANGELOG.md | 5 +++-- lib/writer/enum_model_writer.dart | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ff0cab..3757fbf 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # Changelog -## [7.0.0] - 2022-12-25 +## [7.0.0] - 2023-01-10 +- Updated min dart version to >2.17 - Added support for generating drift tables by adding `generate_drift_table: true` on model definition -- Added jsonValue to enum values to easily map from/to json values (Note, breaks Dart <2.17) +- Added jsonValue to enum values to easily map from/to json values ## [6.1.0] - 2022-10-14 - Support passing a directory instead of a file. All .yaml files inside this folder (recursively) will be used to build the final model data. diff --git a/lib/writer/enum_model_writer.dart b/lib/writer/enum_model_writer.dart index 9d09317..d9c444a 100644 --- a/lib/writer/enum_model_writer.dart +++ b/lib/writer/enum_model_writer.dart @@ -26,10 +26,10 @@ class EnumModelWriter { : key.value; final description = key.description; - if (!first) { - sb.writeln(','); - } else { + if (first) { first = false; + } else { + sb.writeln(','); } if (description != null) { sb.writeln(' ///$description');