diff --git a/.idea/runConfigurations/watch_dart.xml b/.idea/runConfigurations/watch_dart.xml new file mode 100644 index 00000000..03d1b631 --- /dev/null +++ b/.idea/runConfigurations/watch_dart.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/README.md b/README.md index e74a315f..3eaac010 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,18 @@ myFunction() { // For compatibility with `JSON.encode`, a `toJson` method // is included that forwards to `BookSerializer.toMap`: expect(book.toJson(), map); + +} +``` + +As of `2.0.2`, the generated output also includes information +about the serialized names of keys on your model class. + +```dart + myOtherFunction() { + // Relying on the serialized key of a field? No worries. + map[BookFields.author] = 'Zora Neale Hurston'; + } } ``` ## Customizing Serialization diff --git a/angel_serialize_generator/CHANGELOG.md b/angel_serialize_generator/CHANGELOG.md index 1222e07f..bdbab0b7 100644 --- a/angel_serialize_generator/CHANGELOG.md +++ b/angel_serialize_generator/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.0.2 +* Generates an `XFields` class with the serialized names of +all fields in a model class `X`. + # 2.0.1 * Ensured that `List` is only transformed if it generically references a `Model`. \ No newline at end of file diff --git a/angel_serialize_generator/lib/serialize.dart b/angel_serialize_generator/lib/serialize.dart index 91026185..b670b7a3 100644 --- a/angel_serialize_generator/lib/serialize.dart +++ b/angel_serialize_generator/lib/serialize.dart @@ -25,6 +25,7 @@ class SerializerGenerator extends GeneratorForAnnotation { var lib = new Library((b) { generateClass(serializers.map((s) => s.toIntValue()).toList(), ctx, b); + generateFieldsClass(ctx, b); }); var buf = lib.accept(new DartEmitter()); @@ -183,4 +184,23 @@ class SerializerGenerator extends GeneratorForAnnotation { method.body = new Code(buf.toString()); })); } + + void generateFieldsClass(BuildContext ctx, LibraryBuilder file) { + file.body.add(new Class((clazz) { + clazz + ..abstract = true + ..name = '${ctx.modelClassNameRecase.pascalCase}Fields'; + + for (var field in ctx.fields) { + clazz.fields.add(new Field((b) { + b + ..static = true + ..modifier = FieldModifier.constant + ..type = new Reference('String') + ..name = field.name + ..assignment = new Code("'${ctx.resolveFieldName(field.name)}'"); + })); + } + })); + } } diff --git a/angel_serialize_generator/pubspec.yaml b/angel_serialize_generator/pubspec.yaml index 61d26f16..d597606a 100644 --- a/angel_serialize_generator/pubspec.yaml +++ b/angel_serialize_generator/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_serialize_generator -version: 2.0.1 +version: 2.0.2 description: Model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling. author: Tobe O homepage: https://github.com/angel-dart/serialize diff --git a/angel_serialize_generator/test/models/author.serializer.g.dart b/angel_serialize_generator/test/models/author.serializer.g.dart index de267d3b..cb1f75fa 100644 --- a/angel_serialize_generator/test/models/author.serializer.g.dart +++ b/angel_serialize_generator/test/models/author.serializer.g.dart @@ -48,6 +48,26 @@ abstract class AuthorSerializer { } } +abstract class AuthorFields { + static const String id = 'id'; + + static const String name = 'name'; + + static const String age = 'age'; + + static const String books = 'books'; + + static const String newestBook = 'newest_book'; + + static const String secret = 'secret'; + + static const String obscured = 'obscured'; + + static const String createdAt = 'created_at'; + + static const String updatedAt = 'updated_at'; +} + abstract class LibrarySerializer { static Library fromMap(Map map, {String id, @@ -81,3 +101,13 @@ abstract class LibrarySerializer { }; } } + +abstract class LibraryFields { + static const String id = 'id'; + + static const String collection = 'collection'; + + static const String createdAt = 'created_at'; + + static const String updatedAt = 'updated_at'; +} diff --git a/angel_serialize_generator/test/models/book.serializer.g.dart b/angel_serialize_generator/test/models/book.serializer.g.dart index fbcadf2c..52c1c642 100644 --- a/angel_serialize_generator/test/models/book.serializer.g.dart +++ b/angel_serialize_generator/test/models/book.serializer.g.dart @@ -44,3 +44,21 @@ abstract class BookSerializer { }; } } + +abstract class BookFields { + static const String id = 'id'; + + static const String author = 'author'; + + static const String title = 'title'; + + static const String description = 'description'; + + static const String pageCount = 'page_count'; + + static const String notModels = 'not_models'; + + static const String createdAt = 'created_at'; + + static const String updatedAt = 'updated_at'; +} diff --git a/angel_serialize_generator/tool/actions.dart b/angel_serialize_generator/tool/actions.dart deleted file mode 100644 index f99df7c7..00000000 --- a/angel_serialize_generator/tool/actions.dart +++ /dev/null @@ -1,32 +0,0 @@ -/* -import 'package:build_runner/build_runner.dart'; -import 'package:source_gen/source_gen.dart'; -import 'package:angel_serialize_generator/angel_serialize_generator.dart'; - -final List actions = [ - jsonModel(const ['test/models/book.dart']), - jsonModel(const ['test/models/author.dart']), - angelSerialize(const ['test/models/book.dart']), - angelSerialize(const ['test/models/author.dart']), -]; - -BuildAction jsonModel(List inputs) { - return new BuildAction( - new PartBuilder([const JsonModelGenerator()]), - 'angel_serialize_generator', - inputs: inputs, - ); -} - -BuildAction angelSerialize(List inputs) { - return new BuildAction( - new PartBuilder( - [const SerializerGenerator()], - generatedExtension: '.serializer.g.dart', - ), - 'angel_serialize_generator', - inputs: inputs, - ); -} - -*/ \ No newline at end of file diff --git a/angel_serialize_generator/tool/applications.dart b/angel_serialize_generator/tool/applications.dart new file mode 100644 index 00000000..3be1c5c6 --- /dev/null +++ b/angel_serialize_generator/tool/applications.dart @@ -0,0 +1,65 @@ +import 'package:angel_serialize_generator/angel_serialize_generator.dart'; +import 'package:build_config/build_config.dart'; +import 'package:build_runner/build_runner.dart'; +import 'package:source_gen/source_gen.dart'; + +const InputSet standalone = + const InputSet(include: const ['test/models/book.dart']); +const InputSet dependent = + const InputSet(include: const ['test/models/author.dart']); +const InputSet all = const InputSet(include: const ['test/models/*.dart']); + +final List applications = [ + applyToRoot( + new PartBuilder([ + const JsonModelGenerator(), + ]), + generateFor: standalone, + ), + applyToRoot( + new PartBuilder([ + const JsonModelGenerator(), + ]), + generateFor: dependent, + ), + applyToRoot( + new PartBuilder( + [const SerializerGenerator()], + generatedExtension: '.serializer.g.dart', + ), + generateFor: all, + ), +]; + +/* +import 'package:build_runner/build_runner.dart'; +import 'package:source_gen/source_gen.dart'; +import 'package:angel_serialize_generator/angel_serialize_generator.dart'; + +final List actions = [ + jsonModel(const ['test/models/book.dart']), + jsonModel(const ['test/models/author.dart']), + angelSerialize(const ['test/models/book.dart']), + angelSerialize(const ['test/models/author.dart']), +]; + +BuildAction jsonModel(List inputs) { + return new BuildAction( + new PartBuilder([const JsonModelGenerator()]), + 'angel_serialize_generator', + inputs: inputs, + ); +} + +BuildAction angelSerialize(List inputs) { + return new BuildAction( + new PartBuilder( + [const SerializerGenerator()], + generatedExtension: '.serializer.g.dart', + ), + 'angel_serialize_generator', + inputs: inputs, + ); +} + +*/ diff --git a/angel_serialize_generator/tool/build.dart b/angel_serialize_generator/tool/build.dart index 5b5a2c9d..8bb0bc7e 100644 --- a/angel_serialize_generator/tool/build.dart +++ b/angel_serialize_generator/tool/build.dart @@ -1,5 +1,4 @@ -/*import 'package:build_runner/build_runner.dart'; -import 'actions.dart'; +import 'package:build_runner/build_runner.dart'; +import 'applications.dart'; -main() => build(actions, deleteFilesByDefault: true); -*/ \ No newline at end of file +main() => build(applications, deleteFilesByDefault: true, verbose: false); \ No newline at end of file diff --git a/angel_serialize_generator/tool/watch.dart b/angel_serialize_generator/tool/watch.dart index 97f5bbf1..0e7b2b2f 100644 --- a/angel_serialize_generator/tool/watch.dart +++ b/angel_serialize_generator/tool/watch.dart @@ -1,5 +1,4 @@ -/*import 'package:build_runner/build_runner.dart'; -import 'actions.dart'; +import 'package:build_runner/build_runner.dart'; +import 'applications.dart'; -main() => watch(actions, deleteFilesByDefault: true); -*/ \ No newline at end of file +main() => watch(applications, deleteFilesByDefault: true, verbose: false);