From 20606b006bcd99ace4ea10c77530c67ec8f30dd3 Mon Sep 17 00:00:00 2001 From: David Morgan Date: Tue, 29 May 2018 11:29:18 +0200 Subject: [PATCH] Support serializing BuiltSet with StandardJsonPlugin. --- CHANGELOG.md | 6 ++- built_value/lib/standard_json_plugin.dart | 3 +- .../test/standard_json_plugin_test.dart | 29 ++++++++++---- end_to_end_test/lib/serializers.g.dart | 3 ++ end_to_end_test/lib/standard_json.dart | 1 + end_to_end_test/lib/standard_json.g.dart | 40 +++++++++++++++++-- .../test/standard_json_serializer_test.dart | 9 ++++- 7 files changed, 75 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 496b497f..2b0aaff5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ # Changelog -# 5.4.6 +# 5.5.0 -- Fix code generation when inherited generic fields are made non-generic. +- Support serializing `BuiltSet` with `StandardJsonPlugin`. It's serialized to + a JSON list. +- Fix code generation when inherited generic fields are made non-generic. # 5.4.5 diff --git a/built_value/lib/standard_json_plugin.dart b/built_value/lib/standard_json_plugin.dart index e5150ae2..1d750992 100644 --- a/built_value/lib/standard_json_plugin.dart +++ b/built_value/lib/standard_json_plugin.dart @@ -11,7 +11,7 @@ import 'dart:convert' show json; /// [SerializersBuilder.addPlugin] to install this plugin. class StandardJsonPlugin implements SerializerPlugin { static final BuiltSet _unsupportedTypes = - new BuiltSet([BuiltSet, BuiltListMultimap, BuiltSetMultimap]); + new BuiltSet([BuiltListMultimap, BuiltSetMultimap]); /// The field used to specify the value type if needed. Defaults to `$`. final String discriminator; @@ -35,6 +35,7 @@ class StandardJsonPlugin implements SerializerPlugin { Object afterSerialize(Object object, FullType specifiedType) { if (object is List && specifiedType.root != BuiltList && + specifiedType.root != BuiltSet && specifiedType.root != JsonObject) { if (specifiedType.isUnspecified) { return _toMapWithDiscriminator(object); diff --git a/built_value/test/standard_json_plugin_test.dart b/built_value/test/standard_json_plugin_test.dart index 82336987..e614f6a7 100644 --- a/built_value/test/standard_json_plugin_test.dart +++ b/built_value/test/standard_json_plugin_test.dart @@ -18,6 +18,9 @@ void main() { const FullType(BuiltList, const [const FullType(int)]) ]), () => new ListBuilder>()) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(int)]), + () => new SetBuilder()) ..addBuilderFactory( const FullType( BuiltMap, const [const FullType(int), const FullType(String)]), @@ -50,14 +53,6 @@ void main() { throwsA(new isInstanceOf())); }); - test('throws on serialize of sets', () { - final data = new BuiltSet([1, 2, 3]); - final specifiedType = - const FullType(BuiltSet, const [const FullType(int)]); - expect(() => serializers.serialize(data, specifiedType: specifiedType), - throwsA(new isInstanceOf())); - }); - test('throws on serialize of set multimaps', () { final data = new BuiltSetMultimap({ 1: ['one'], @@ -106,6 +101,24 @@ void main() { }); }); + group('can take a set and', () { + final data = new BuiltSet([1, 2, 3]); + final specifiedType = + const FullType(BuiltSet, const [const FullType(int)]); + final serialized = [1, 2, 3]; + + test('serialize it', () { + expect(serializers.serialize(data, specifiedType: specifiedType), + serialized); + }); + + test('deserialize it', () { + expect( + serializers.deserialize(serialized, specifiedType: specifiedType), + data); + }); + }); + group('can take a nested list and', () { final data = new BuiltList>([ new BuiltList([1, 2, 3]), diff --git a/end_to_end_test/lib/serializers.g.dart b/end_to_end_test/lib/serializers.g.dart index 9a8d44ec..7a230ea1 100644 --- a/end_to_end_test/lib/serializers.g.dart +++ b/end_to_end_test/lib/serializers.g.dart @@ -104,6 +104,9 @@ Serializers _$serializers = (new Serializers().toBuilder() ..addBuilderFactory( const FullType(BuiltList, const [const FullType(Animal)]), () => new ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(Animal)]), + () => new SetBuilder()) ..addBuilderFactory( const FullType(BuiltList, const [const FullType(String)]), () => new ListBuilder()) diff --git a/end_to_end_test/lib/standard_json.dart b/end_to_end_test/lib/standard_json.dart index bb954432..45562ba7 100644 --- a/end_to_end_test/lib/standard_json.dart +++ b/end_to_end_test/lib/standard_json.dart @@ -21,6 +21,7 @@ abstract class StandardJsonValue String get text; BuiltMap get keyValues; BuiltList get zoo; + BuiltSet get uniqueZoo; @nullable BuiltList get strings; diff --git a/end_to_end_test/lib/standard_json.g.dart b/end_to_end_test/lib/standard_json.g.dart index 8624e829..f4e53c0b 100644 --- a/end_to_end_test/lib/standard_json.g.dart +++ b/end_to_end_test/lib/standard_json.g.dart @@ -40,6 +40,10 @@ class _$StandardJsonValueSerializer serializers.serialize(object.zoo, specifiedType: const FullType(BuiltList, const [const FullType(Animal)])), + 'uniqueZoo', + serializers.serialize(object.uniqueZoo, + specifiedType: + const FullType(BuiltSet, const [const FullType(Animal)])), ]; if (object.strings != null) { result @@ -84,6 +88,12 @@ class _$StandardJsonValueSerializer const FullType(BuiltList, const [const FullType(Animal)])) as BuiltList); break; + case 'uniqueZoo': + result.uniqueZoo.replace(serializers.deserialize(value, + specifiedType: + const FullType(BuiltSet, const [const FullType(Animal)])) + as BuiltSet); + break; case 'strings': result.strings.replace(serializers.deserialize(value, specifiedType: @@ -107,13 +117,20 @@ class _$StandardJsonValue extends StandardJsonValue { @override final BuiltList zoo; @override + final BuiltSet uniqueZoo; + @override final BuiltList strings; factory _$StandardJsonValue([void updates(StandardJsonValueBuilder b)]) => (new StandardJsonValueBuilder()..update(updates)).build(); _$StandardJsonValue._( - {this.number, this.text, this.keyValues, this.zoo, this.strings}) + {this.number, + this.text, + this.keyValues, + this.zoo, + this.uniqueZoo, + this.strings}) : super._() { if (number == null) throw new BuiltValueNullFieldError('StandardJsonValue', 'number'); @@ -123,6 +140,8 @@ class _$StandardJsonValue extends StandardJsonValue { throw new BuiltValueNullFieldError('StandardJsonValue', 'keyValues'); if (zoo == null) throw new BuiltValueNullFieldError('StandardJsonValue', 'zoo'); + if (uniqueZoo == null) + throw new BuiltValueNullFieldError('StandardJsonValue', 'uniqueZoo'); } @override @@ -141,6 +160,7 @@ class _$StandardJsonValue extends StandardJsonValue { text == other.text && keyValues == other.keyValues && zoo == other.zoo && + uniqueZoo == other.uniqueZoo && strings == other.strings; } @@ -148,9 +168,11 @@ class _$StandardJsonValue extends StandardJsonValue { int get hashCode { return $jf($jc( $jc( - $jc($jc($jc(0, number.hashCode), text.hashCode), - keyValues.hashCode), - zoo.hashCode), + $jc( + $jc($jc($jc(0, number.hashCode), text.hashCode), + keyValues.hashCode), + zoo.hashCode), + uniqueZoo.hashCode), strings.hashCode)); } @@ -161,6 +183,7 @@ class _$StandardJsonValue extends StandardJsonValue { ..add('text', text) ..add('keyValues', keyValues) ..add('zoo', zoo) + ..add('uniqueZoo', uniqueZoo) ..add('strings', strings)) .toString(); } @@ -188,6 +211,11 @@ class StandardJsonValueBuilder ListBuilder get zoo => _$this._zoo ??= new ListBuilder(); set zoo(ListBuilder zoo) => _$this._zoo = zoo; + SetBuilder _uniqueZoo; + SetBuilder get uniqueZoo => + _$this._uniqueZoo ??= new SetBuilder(); + set uniqueZoo(SetBuilder uniqueZoo) => _$this._uniqueZoo = uniqueZoo; + ListBuilder _strings; ListBuilder get strings => _$this._strings ??= new ListBuilder(); @@ -201,6 +229,7 @@ class StandardJsonValueBuilder _text = _$v.text; _keyValues = _$v.keyValues?.toBuilder(); _zoo = _$v.zoo?.toBuilder(); + _uniqueZoo = _$v.uniqueZoo?.toBuilder(); _strings = _$v.strings?.toBuilder(); _$v = null; } @@ -228,6 +257,7 @@ class StandardJsonValueBuilder text: text, keyValues: keyValues.build(), zoo: zoo.build(), + uniqueZoo: uniqueZoo.build(), strings: _strings?.build()); } catch (_) { String _$failedField; @@ -236,6 +266,8 @@ class StandardJsonValueBuilder keyValues.build(); _$failedField = 'zoo'; zoo.build(); + _$failedField = 'uniqueZoo'; + uniqueZoo.build(); _$failedField = 'strings'; _strings?.build(); } catch (e) { diff --git a/end_to_end_test/test/standard_json_serializer_test.dart b/end_to_end_test/test/standard_json_serializer_test.dart index a957f7a4..ba54ab9e 100644 --- a/end_to_end_test/test/standard_json_serializer_test.dart +++ b/end_to_end_test/test/standard_json_serializer_test.dart @@ -22,7 +22,10 @@ void main() { ..keyValues['five'] = new JsonObject({'one': 1, 'two': 2}) ..zoo.add(new Cat((b) => b ..tail = true - ..legs = 4))); + ..legs = 4)) + ..uniqueZoo.add(new Cat((b) => b + ..tail = false + ..legs = 3))); final specifiedType = new FullType(StandardJsonValue); final serializersWithPlugin = (serializers.toBuilder()..addPlugin(new StandardJsonPlugin())).build(); @@ -39,6 +42,9 @@ void main() { 'zoo': [ {r'$': 'Cat', 'tail': true, 'legs': 4} ], + 'uniqueZoo': [ + {r'$': 'Cat', 'tail': false, 'legs': 3} + ], }; test('can be serialized', () { @@ -124,6 +130,7 @@ void main() { 'zoo': [ {r'$': 'Cat', 'tail': true, 'legs': 4} ], + 'uniqueZoo': [], }; test('can be serialized', () {