Create a Fields class

This commit is contained in:
Tobe O 2018-03-09 07:39:21 -05:00
parent ea9322a930
commit 039f0b3443
11 changed files with 163 additions and 41 deletions

View file

@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="watch.dart" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application" singleton="true" nameIsGenerated="true">
<option name="filePath" value="$PROJECT_DIR$/angel_serialize_generator/tool/watch.dart" />
<option name="workingDirectory" value="$PROJECT_DIR$/angel_serialize_generator" />
<method />
</configuration>
</component>

View file

@ -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

View file

@ -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`.

View file

@ -25,6 +25,7 @@ class SerializerGenerator extends GeneratorForAnnotation<Serializable> {
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<Serializable> {
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)}'");
}));
}
}));
}
}

View file

@ -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 <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/serialize

View file

@ -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';
}

View file

@ -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';
}

View file

@ -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<BuildAction> 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<String> inputs) {
return new BuildAction(
new PartBuilder([const JsonModelGenerator()]),
'angel_serialize_generator',
inputs: inputs,
);
}
BuildAction angelSerialize(List<String> inputs) {
return new BuildAction(
new PartBuilder(
[const SerializerGenerator()],
generatedExtension: '.serializer.g.dart',
),
'angel_serialize_generator',
inputs: inputs,
);
}
*/

View file

@ -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<BuilderApplication> 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<BuildAction> 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<String> inputs) {
return new BuildAction(
new PartBuilder([const JsonModelGenerator()]),
'angel_serialize_generator',
inputs: inputs,
);
}
BuildAction angelSerialize(List<String> inputs) {
return new BuildAction(
new PartBuilder(
[const SerializerGenerator()],
generatedExtension: '.serializer.g.dart',
),
'angel_serialize_generator',
inputs: inputs,
);
}
*/

View file

@ -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);
*/
main() => build(applications, deleteFilesByDefault: true, verbose: false);

View file

@ -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);
*/
main() => watch(applications, deleteFilesByDefault: true, verbose: false);