Skip to content

Commit 0732b92

Browse files
committed
Add serializer for "DateTime" fields.
1 parent 9ba890e commit 0732b92

File tree

12 files changed

+155
-16
lines changed

12 files changed

+155
-16
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 0.5.6
4+
5+
- Add serializer for "DateTime" fields.
6+
37
## 0.5.5
48

59
- Add serializer for "num" fields.

benchmark/pubspec.yaml

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ environment:
1212
dependencies:
1313
browser: any
1414
built_collection: ^1.0.0
15-
built_value: ^0.5.5
15+
# built_value: ^0.5.5
16+
built_value:
17+
path: ../built_value
1618

1719
dev_dependencies:
1820
build: ^0.7.0
1921
build_runner: ^0.3.0
20-
built_value_generator: ^0.5.5
22+
# built_value_generator: ^0.5.5
23+
built_value_generator:
24+
path: ../built_value_generator
2125
source_gen: '>=0.5.0+03 <0.6.0'
2226
quiver: '>=0.21.0 <0.24.0'
2327
test: any

built_value/lib/serializer.dart

+3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
// license that can be found in the LICENSE file.
44

55
import 'package:built_collection/built_collection.dart';
6+
import 'package:built_value/src/date_time_serializer.dart';
67
import 'package:built_value/src/num_serializer.dart';
78
import 'package:quiver/core.dart';
9+
810
import 'src/bool_serializer.dart';
911
import 'src/built_json_serializers.dart';
1012
import 'src/built_list_multimap_serializer.dart';
@@ -31,6 +33,7 @@ abstract class Serializers {
3133
..add(new BuiltMapSerializer())
3234
..add(new BuiltSetSerializer())
3335
..add(new BuiltSetMultimapSerializer())
36+
..add(new DateTimeSerializer())
3437
..add(new DoubleSerializer())
3538
..add(new IntSerializer())
3639
..add(new NumSerializer())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright (c) 2017, Google Inc. Please see the AUTHORS file for details.
2+
// All rights reserved. Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
import 'package:built_collection/built_collection.dart';
6+
import 'package:built_value/serializer.dart';
7+
8+
/// Serializer for [DateTime].
9+
///
10+
/// An exception will be thrown on attempt to serialize local DateTime
11+
/// instances; you must use UTC.
12+
class DateTimeSerializer implements PrimitiveSerializer<DateTime> {
13+
final bool structured = false;
14+
@override
15+
final Iterable<Type> types = new BuiltList<Type>([DateTime]);
16+
@override
17+
final String wireName = 'DateTime';
18+
19+
@override
20+
Object serialize(Serializers serializers, DateTime dateTime,
21+
{FullType specifiedType: FullType.unspecified}) {
22+
if (!dateTime.isUtc) {
23+
throw new ArgumentError.value(
24+
dateTime, 'dateTime', 'Must be in utc for serialization.');
25+
}
26+
27+
return dateTime.millisecondsSinceEpoch;
28+
}
29+
30+
@override
31+
DateTime deserialize(Serializers serializers, Object serialized,
32+
{FullType specifiedType: FullType.unspecified}) {
33+
final millisecondsSinceEpoch = serialized as int;
34+
return new DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch,
35+
isUtc: true);
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) 2017, Google Inc. Please see the AUTHORS file for details.
2+
// All rights reserved. Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
import 'package:built_value/serializer.dart';
6+
import 'package:test/test.dart';
7+
8+
void main() {
9+
final serializers = new Serializers();
10+
11+
group('DateTime with known specifiedType', () {
12+
final data = new DateTime.utc(1980);
13+
final serialized = data.millisecondsSinceEpoch;
14+
final specifiedType = const FullType(DateTime);
15+
16+
test('can be serialized', () {
17+
expect(serializers.serialize(data, specifiedType: specifiedType),
18+
serialized);
19+
});
20+
21+
test('can be deserialized', () {
22+
expect(serializers.deserialize(serialized, specifiedType: specifiedType),
23+
data);
24+
});
25+
26+
test('serialize throws if not UTC', () {
27+
expect(() => serializers.serialize(new DateTime.now()), throws);
28+
});
29+
});
30+
31+
group('DateTime with unknown specifiedType', () {
32+
final data = new DateTime.utc(1980);
33+
final serialized = ['DateTime', data.millisecondsSinceEpoch];
34+
final specifiedType = FullType.unspecified;
35+
36+
test('can be serialized', () {
37+
expect(serializers.serialize(data, specifiedType: specifiedType),
38+
serialized);
39+
});
40+
41+
test('can be deserialized', () {
42+
expect(serializers.deserialize(serialized, specifiedType: specifiedType),
43+
data);
44+
});
45+
});
46+
}

built_value_generator/pubspec.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ dependencies:
1414
analyzer: '>=0.29.0 <0.30.0'
1515
build: ^0.7.0
1616
built_collection: ^1.0.0
17-
built_value: ^0.5.5
17+
# built_value: ^0.5.5
18+
built_value:
19+
path: ../built_value
1820
meta: ^1.0.4
1921
source_gen: '>=0.5.0+03 <0.6.0'
2022
quiver: ^0.23.0

chat_example/pubspec.yaml

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ environment:
1212
dependencies:
1313
browser: ^0.10.0
1414
built_collection: ^1.0.0
15-
built_value: ^0.5.5
15+
# built_value: ^0.5.5
16+
built_value:
17+
path: ../built_value
1618
shelf: ^0.6.0
1719
shelf_proxy: ^0.1.0
1820
shelf_web_socket: ^0.2.1
@@ -21,6 +23,8 @@ dependencies:
2123
dev_dependencies:
2224
build: ^0.7.0
2325
build_runner: ^0.3.0
24-
built_value_generator: ^0.5.5
26+
# built_value_generator: ^0.5.5
27+
built_value_generator:
28+
path: ../built_value_generator
2529
source_gen: '>=0.5.0+03 <0.6.0'
2630
test: any

end_to_end_test/lib/values.dart

+1
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ abstract class PrimitivesValue
153153
double get dbl;
154154
num get number;
155155
String get string;
156+
DateTime get dateTime;
156157

157158
factory PrimitivesValue([updates(PrimitivesValueBuilder b)]) =
158159
_$PrimitivesValue;

end_to_end_test/lib/values.g.dart

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

end_to_end_test/pubspec.yaml

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ environment:
1212
dependencies:
1313
meta: ^1.0.4
1414
built_collection: ^1.0.0
15-
built_value: ^0.5.5
15+
# built_value: ^0.5.5
16+
built_value:
17+
path: ../built_value
1618

1719
dev_dependencies:
1820
build: ^0.7.0
1921
build_runner: ^0.3.0
20-
built_value_generator: ^0.5.5
22+
# built_value_generator: ^0.5.5
23+
built_value_generator:
24+
path: ../built_value_generator
2125
source_gen: '>=0.5.0+03 <0.6.0'
2226
quiver: '>=0.21.0 <0.24.0'
2327
test: any

end_to_end_test/test/values_serializer_test.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ void main() {
116116
..integer = 42
117117
..dbl = 2.5
118118
..number = 17.5
119-
..string = 'test');
119+
..string = 'test'
120+
..dateTime = new DateTime.fromMillisecondsSinceEpoch(1000, isUtc: true));
120121
final serialized = [
121122
'PrimitivesValue',
122123
'boolean',
@@ -129,6 +130,8 @@ void main() {
129130
17.5,
130131
'string',
131132
'test',
133+
'dateTime',
134+
1000,
132135
];
133136

134137
test('can be serialized', () {

example/pubspec.yaml

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ environment:
1212
dependencies:
1313
meta: ^1.0.4
1414
built_collection: ^1.0.0
15-
built_value: ^0.5.5
15+
# built_value: ^0.5.5
16+
built_value:
17+
path: ../built_value
1618

1719
dev_dependencies:
1820
build: ^0.7.0
1921
build_runner: ^0.3.0
20-
built_value_generator: ^0.5.5
22+
# built_value_generator: ^0.5.5
23+
built_value_generator:
24+
path: ../built_value_generator
2125
source_gen: '>=0.5.0+03 <0.6.0'
2226
quiver: '>=0.21.0 <0.24.0'
2327
test: any

0 commit comments

Comments
 (0)