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);