From 00f20b74b9656404dbd37d54a1e1bb7cc168175e Mon Sep 17 00:00:00 2001 From: Tobe O Date: Thu, 21 Dec 2017 15:08:45 -0500 Subject: [PATCH] 1.2.0 --- CHANGELOG.md | 4 +++ lib/angel_client.dart | 23 ++++++-------- lib/base_angel_client.dart | 63 +++++++++++++++++++++++++++++--------- pubspec.yaml | 2 +- 4 files changed, 63 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 167b834d..18598df0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 1.2.0 +* `ServiceList` now uses `Equality` from `package:collection` to compare items. +* `Service`s will now add service errors to corresponding streams if there is a listener. + # 1.1.0+3 * `ServiceList` no longer ignores empty `index` events. diff --git a/lib/angel_client.dart b/lib/angel_client.dart index 0d412330..dba4f644 100644 --- a/lib/angel_client.dart +++ b/lib/angel_client.dart @@ -144,8 +144,10 @@ class ServiceList extends DelegatingList { /// See https://github.com/angel-dart/paginate. final bool asPaginated; - /// A function used to compare two items for equality. - final bool Function(dynamic, dynamic) compare; + /// A function used to compare the ID's two items for equality. + /// + /// Defaults to comparing the [idField] of `Map` instances. + final Equality _compare; final Service service; @@ -153,8 +155,9 @@ class ServiceList extends DelegatingList { final List _subs = []; ServiceList(this.service, - {this.idField, this.asPaginated: false, this.compare}) - : super([]) { + {this.idField, this.asPaginated: false, Equality compare}) + : _compare = compare ?? new EqualityBy((map) => map[idField ?? 'id']), + super([]) { // Index _subs.add(service.onIndexed.listen((data) { var items = asPaginated == true ? data['data'] : data; @@ -175,7 +178,7 @@ class ServiceList extends DelegatingList { var indices = []; for (int i = 0; i < length; i++) { - if (compareItems(item, this[i])) indices.add(i); + if (_compare.equals(item, this[i])) indices.add(i); } if (indices.isNotEmpty) { @@ -192,7 +195,7 @@ class ServiceList extends DelegatingList { // Removed _subs.add(service.onRemoved.listen((item) { - removeWhere((x) => compareItems(item, x)); + removeWhere((x) => _compare.equals(item, x)); _onChange.add(this); })); } @@ -203,12 +206,4 @@ class ServiceList extends DelegatingList { Future close() async { _onChange.close(); } - - bool compareItems(a, b) { - if (compare != null) return compare(a, b); - if (a is Map) - return a[idField ?? 'id'] == b[idField ?? 'id']; - else - return a == b; - } } diff --git a/lib/base_angel_client.dart b/lib/base_angel_client.dart index 6e97a426..527775b3 100644 --- a/lib/base_angel_client.dart +++ b/lib/base_angel_client.dart @@ -191,8 +191,7 @@ abstract class BaseAngelClient extends Angel { } @override - Service service(String path, - {Type type, AngelDeserializer deserializer}) { + Service service(String path, {Type type, AngelDeserializer deserializer}) { String uri = path.toString().replaceAll(straySlashes, ""); var s = new BaseAngelService(client, this, '$basePath/$uri', deserializer: deserializer); @@ -308,7 +307,10 @@ class BaseAngelService extends Service { try { if (_invalid(response)) { - throw failure(response); + if (_onIndexed.hasListener) + _onIndexed.addError(failure(response)); + else + throw failure(response); } final json = JSON.decode(response.body); @@ -322,7 +324,10 @@ class BaseAngelService extends Service { _onIndexed.add(r); return r; } catch (e, st) { - throw failure(response, error: e, stack: st); + if (_onIndexed.hasListener) + _onIndexed.addError(e, st); + else + throw failure(response, error: e, stack: st); } } @@ -333,14 +338,20 @@ class BaseAngelService extends Service { try { if (_invalid(response)) { - throw failure(response); + if (_onRead.hasListener) + _onRead.addError(failure(response)); + else + throw failure(response); } var r = deserialize(JSON.decode(response.body)); _onRead.add(r); return r; } catch (e, st) { - throw failure(response, error: e, stack: st); + if (_onRead.hasListener) + _onRead.addError(e, st); + else + throw failure(response, error: e, stack: st); } } @@ -351,14 +362,20 @@ class BaseAngelService extends Service { try { if (_invalid(response)) { - throw failure(response); + if (_onCreated.hasListener) + _onCreated.addError(failure(response)); + else + throw failure(response); } var r = deserialize(JSON.decode(response.body)); _onCreated.add(r); return r; } catch (e, st) { - throw failure(response, error: e, stack: st); + if (_onCreated.hasListener) + _onCreated.addError(e, st); + else + throw failure(response, error: e, stack: st); } } @@ -369,14 +386,20 @@ class BaseAngelService extends Service { try { if (_invalid(response)) { - throw failure(response); + if (_onModified.hasListener) + _onModified.addError(failure(response)); + else + throw failure(response); } var r = deserialize(JSON.decode(response.body)); _onModified.add(r); return r; } catch (e, st) { - throw failure(response, error: e, stack: st); + if (_onModified.hasListener) + _onModified.addError(e, st); + else + throw failure(response, error: e, stack: st); } } @@ -387,14 +410,20 @@ class BaseAngelService extends Service { try { if (_invalid(response)) { - throw failure(response); + if (_onUpdated.hasListener) + _onUpdated.addError(failure(response)); + else + throw failure(response); } var r = deserialize(JSON.decode(response.body)); _onUpdated.add(r); return r; } catch (e, st) { - throw failure(response, error: e, stack: st); + if (_onUpdated.hasListener) + _onUpdated.addError(e, st); + else + throw failure(response, error: e, stack: st); } } @@ -405,14 +434,20 @@ class BaseAngelService extends Service { try { if (_invalid(response)) { - throw failure(response); + if (_onRemoved.hasListener) + _onRemoved.addError(failure(response)); + else + throw failure(response); } var r = deserialize(JSON.decode(response.body)); _onRemoved.add(r); return r; } catch (e, st) { - throw failure(response, error: e, stack: st); + if (_onRemoved.hasListener) + _onRemoved.addError(e, st); + else + throw failure(response, error: e, stack: st); } } } diff --git a/pubspec.yaml b/pubspec.yaml index 6ee4138c..4b6a2d57 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_client -version: 1.1.0+3 +version: 1.2.0 description: Client library for the Angel framework. author: Tobe O homepage: https://github.com/angel-dart/angel_client