enable and fix a number of lints
diff --git a/analysis_options.yaml b/analysis_options.yaml
index e0b01ee..8870dbb 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -13,8 +13,11 @@
linter:
rules:
- avoid_bool_literals_in_conditional_expressions
+ - avoid_catching_errors
- avoid_classes_with_only_static_members
- avoid_function_literals_in_foreach_calls
+ - avoid_private_typedef_functions
+ - avoid_redundant_argument_values
- avoid_renaming_method_parameters
- avoid_returning_null
- avoid_returning_null_for_future
@@ -22,10 +25,11 @@
- avoid_returning_this
- avoid_single_cascade_in_expression_statements
- avoid_unused_constructor_parameters
+ - avoid_void_async
- await_only_futures
- camel_case_types
- cancel_subscriptions
- #- cascade_invocations
+ - cascade_invocations
- comment_references
- constant_identifier_names
- control_flow_in_finally
@@ -37,21 +41,34 @@
- invariant_booleans
- iterable_contains_unrelated_type
- join_return_with_assignment
+ - lines_longer_than_80_chars
- list_remove_unrelated_type
- literal_only_boolean_expressions
+ - missing_whitespace_between_adjacent_strings
- no_adjacent_strings_in_list
+ - no_runtimeType_toString
- non_constant_identifier_names
- only_throw_errors
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
+ - prefer_asserts_in_initializer_lists
- prefer_const_constructors
- #- prefer_final_locals
+ - prefer_const_declarations
+ - prefer_expression_function_bodies
+ - prefer_final_locals
+ - prefer_function_declarations_over_variables
- prefer_initializing_formals
+ - prefer_inlined_adds
- prefer_interpolation_to_compose_strings
+ - prefer_is_not_operator
- prefer_null_aware_operators
+ - prefer_relative_imports
- prefer_typing_uninitialized_variables
+ - prefer_void_to_null
+ - provide_deprecation_message
+ - sort_pub_dependencies
- test_types_in_equals
- throw_in_finally
- unnecessary_await_in_return
@@ -59,6 +76,9 @@
- unnecessary_getters_setters
- unnecessary_lambdas
- unnecessary_null_aware_assignments
+ - unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
+ - unnecessary_string_interpolations
+ - use_string_buffers
- void_checks
diff --git a/lib/http_retry.dart b/lib/http_retry.dart
index 5bb3695..825b5a2 100644
--- a/lib/http_retry.dart
+++ b/lib/http_retry.dart
@@ -48,20 +48,21 @@
/// the client has a chance to perform side effects like logging. The
/// `response` parameter will be null if the request was retried due to an
/// error for which [whenError] returned `true`.
- RetryClient(this._inner,
- {int retries,
- bool when(BaseResponse response),
- bool whenError(error, StackTrace stackTrace),
- Duration delay(int retryCount),
- void onRetry(BaseRequest request, BaseResponse response, int retryCount)})
- : _retries = retries ?? 3,
+ RetryClient(
+ this._inner, {
+ int retries,
+ bool Function(BaseResponse) when,
+ bool Function(Object, StackTrace) whenError,
+ Duration Function(int retryCount) delay,
+ void Function(BaseRequest, BaseResponse, int retryCount) onRetry,
+ }) : _retries = retries ?? 3,
_when = when ?? ((response) => response.statusCode == 503),
_whenError = whenError ?? ((_, __) => false),
_delay = delay ??
((retryCount) =>
- Duration(milliseconds: 500) * math.pow(1.5, retryCount)),
+ const Duration(milliseconds: 500) * math.pow(1.5, retryCount)),
_onRetry = onRetry {
- RangeError.checkNotNegative(_retries, "retries");
+ RangeError.checkNotNegative(_retries, 'retries');
}
/// Like [new RetryClient], but with a pre-computed list of [delays]
@@ -70,27 +71,38 @@
/// This will retry a request at most `delays.length` times, using each delay
/// in order. It will wait for `delays[0]` after the initial request,
/// `delays[1]` after the first retry, and so on.
- RetryClient.withDelays(Client inner, Iterable<Duration> delays,
- {bool when(BaseResponse response),
- bool whenError(error, StackTrace stackTrace),
- void onRetry(BaseRequest request, BaseResponse response, int retryCount)})
- : this._withDelays(inner, delays.toList(),
- when: when, whenError: whenError, onRetry: onRetry);
+ RetryClient.withDelays(
+ Client inner,
+ Iterable<Duration> delays, {
+ bool Function(BaseResponse) when,
+ bool Function(Object, StackTrace) whenError,
+ void Function(BaseRequest, BaseResponse, int retryCount) onRetry,
+ }) : this._withDelays(
+ inner,
+ delays.toList(),
+ when: when,
+ whenError: whenError,
+ onRetry: onRetry,
+ );
- RetryClient._withDelays(Client inner, List<Duration> delays,
- {bool when(BaseResponse response),
- bool whenError(error, StackTrace stackTrace),
- void onRetry(BaseRequest request, BaseResponse response, int retryCount)})
- : this(inner,
- retries: delays.length,
- delay: (retryCount) => delays[retryCount],
- when: when,
- whenError: whenError,
- onRetry: onRetry);
+ RetryClient._withDelays(
+ Client inner,
+ List<Duration> delays, {
+ bool Function(BaseResponse) when,
+ bool Function(Object, StackTrace) whenError,
+ void Function(BaseRequest, BaseResponse, int) onRetry,
+ }) : this(
+ inner,
+ retries: delays.length,
+ delay: (retryCount) => delays[retryCount],
+ when: when,
+ whenError: whenError,
+ onRetry: onRetry,
+ );
@override
Future<StreamedResponse> send(BaseRequest request) async {
- var splitter = StreamSplitter(request.finalize());
+ final splitter = StreamSplitter(request.finalize());
var i = 0;
for (;;) {
@@ -117,12 +129,12 @@
/// Returns a copy of [original] with the given [body].
StreamedRequest _copyRequest(BaseRequest original, Stream<List<int>> body) {
- var request = StreamedRequest(original.method, original.url);
- request.contentLength = original.contentLength;
- request.followRedirects = original.followRedirects;
- request.headers.addAll(original.headers);
- request.maxRedirects = original.maxRedirects;
- request.persistentConnection = original.persistentConnection;
+ final request = StreamedRequest(original.method, original.url)
+ ..contentLength = original.contentLength
+ ..followRedirects = original.followRedirects
+ ..headers.addAll(original.headers)
+ ..maxRedirects = original.maxRedirects
+ ..persistentConnection = original.persistentConnection;
body.listen(request.sink.add,
onError: request.sink.addError,
diff --git a/test/http_retry_test.dart b/test/http_retry_test.dart
index b51ed1f..bce4b73 100644
--- a/test/http_retry_test.dart
+++ b/test/http_retry_test.dart
@@ -10,129 +10,129 @@
void main() {
group("doesn't retry when", () {
- test("a request has a non-503 error code", () async {
- var client = RetryClient(
- MockClient(expectAsync1((_) async => Response("", 502), count: 1)));
- var response = await client.get("http://example.org");
+ test('a request has a non-503 error code', () async {
+ final client = RetryClient(
+ MockClient(expectAsync1((_) async => Response('', 502), count: 1)));
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(502));
});
test("a request doesn't match when()", () async {
- var client = RetryClient(
- MockClient(expectAsync1((_) async => Response("", 503), count: 1)),
+ final client = RetryClient(
+ MockClient(expectAsync1((_) async => Response('', 503), count: 1)),
when: (_) => false);
- var response = await client.get("http://example.org");
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(503));
});
- test("retries is 0", () async {
- var client = RetryClient(
- MockClient(expectAsync1((_) async => Response("", 503), count: 1)),
+ test('retries is 0', () async {
+ final client = RetryClient(
+ MockClient(expectAsync1((_) async => Response('', 503), count: 1)),
retries: 0);
- var response = await client.get("http://example.org");
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(503));
});
});
- test("retries on a 503 by default", () async {
+ test('retries on a 503 by default', () async {
var count = 0;
- var client = RetryClient(
+ final client = RetryClient(
MockClient(expectAsync1((request) async {
count++;
- return count < 2 ? Response("", 503) : Response("", 200);
+ return count < 2 ? Response('', 503) : Response('', 200);
}, count: 2)),
delay: (_) => Duration.zero);
- var response = await client.get("http://example.org");
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(200));
});
- test("retries on any request where when() returns true", () async {
+ test('retries on any request where when() returns true', () async {
var count = 0;
- var client = RetryClient(
+ final client = RetryClient(
MockClient(expectAsync1((request) async {
count++;
- return Response("", 503,
- headers: {"retry": count < 2 ? "true" : "false"});
+ return Response('', 503,
+ headers: {'retry': count < 2 ? 'true' : 'false'});
}, count: 2)),
- when: (response) => response.headers["retry"] == "true",
+ when: (response) => response.headers['retry'] == 'true',
delay: (_) => Duration.zero);
- var response = await client.get("http://example.org");
- expect(response.headers, containsPair("retry", "false"));
+ final response = await client.get('http://example.org');
+ expect(response.headers, containsPair('retry', 'false'));
expect(response.statusCode, equals(503));
});
- test("retries on any request where whenError() returns true", () async {
+ test('retries on any request where whenError() returns true', () async {
var count = 0;
- var client = RetryClient(
+ final client = RetryClient(
MockClient(expectAsync1((request) async {
count++;
- if (count < 2) throw StateError("oh no");
- return Response("", 200);
+ if (count < 2) throw StateError('oh no');
+ return Response('', 200);
}, count: 2)),
whenError: (error, _) =>
- error is StateError && error.message == "oh no",
+ error is StateError && error.message == 'oh no',
delay: (_) => Duration.zero);
- var response = await client.get("http://example.org");
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(200));
});
test("doesn't retry a request where whenError() returns false", () async {
- var client = RetryClient(
- MockClient(expectAsync1((request) async => throw StateError("oh no"))),
- whenError: (error, _) => error == "oh yeah",
+ final client = RetryClient(
+ MockClient(expectAsync1((request) async => throw StateError('oh no'))),
+ whenError: (error, _) => error == 'oh yeah',
delay: (_) => Duration.zero);
- expect(client.get("http://example.org"),
- throwsA(isStateError.having((e) => e.message, 'message', "oh no")));
+ expect(client.get('http://example.org'),
+ throwsA(isStateError.having((e) => e.message, 'message', 'oh no')));
});
- test("retries three times by default", () async {
- var client = RetryClient(
- MockClient(expectAsync1((_) async => Response("", 503), count: 4)),
+ test('retries three times by default', () async {
+ final client = RetryClient(
+ MockClient(expectAsync1((_) async => Response('', 503), count: 4)),
delay: (_) => Duration.zero);
- var response = await client.get("http://example.org");
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(503));
});
- test("retries the given number of times", () async {
- var client = RetryClient(
- MockClient(expectAsync1((_) async => Response("", 503), count: 13)),
+ test('retries the given number of times', () async {
+ final client = RetryClient(
+ MockClient(expectAsync1((_) async => Response('', 503), count: 13)),
retries: 12,
delay: (_) => Duration.zero);
- var response = await client.get("http://example.org");
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(503));
});
- test("waits 1.5x as long each time by default", () {
+ test('waits 1.5x as long each time by default', () {
FakeAsync().run((fake) {
var count = 0;
- var client = RetryClient(MockClient(expectAsync1((_) async {
+ final client = RetryClient(MockClient(expectAsync1((_) async {
count++;
if (count == 1) {
expect(fake.elapsed, equals(Duration.zero));
} else if (count == 2) {
- expect(fake.elapsed, equals(Duration(milliseconds: 500)));
+ expect(fake.elapsed, equals(const Duration(milliseconds: 500)));
} else if (count == 3) {
- expect(fake.elapsed, equals(Duration(milliseconds: 1250)));
+ expect(fake.elapsed, equals(const Duration(milliseconds: 1250)));
} else if (count == 4) {
- expect(fake.elapsed, equals(Duration(milliseconds: 2375)));
+ expect(fake.elapsed, equals(const Duration(milliseconds: 2375)));
}
- return Response("", 503);
+ return Response('', 503);
}, count: 4)));
- expect(client.get("http://example.org"), completes);
- fake.elapse(Duration(minutes: 10));
+ expect(client.get('http://example.org'), completes);
+ fake.elapse(const Duration(minutes: 10));
});
});
- test("waits according to the delay parameter", () {
+ test('waits according to the delay parameter', () {
FakeAsync().run((fake) {
var count = 0;
- var client = RetryClient(
+ final client = RetryClient(
MockClient(expectAsync1((_) async {
count++;
if (count == 1) {
@@ -140,84 +140,88 @@
} else if (count == 2) {
expect(fake.elapsed, equals(Duration.zero));
} else if (count == 3) {
- expect(fake.elapsed, equals(Duration(seconds: 1)));
+ expect(fake.elapsed, equals(const Duration(seconds: 1)));
} else if (count == 4) {
- expect(fake.elapsed, equals(Duration(seconds: 3)));
+ expect(fake.elapsed, equals(const Duration(seconds: 3)));
}
- return Response("", 503);
+ return Response('', 503);
}, count: 4)),
delay: (requestCount) => Duration(seconds: requestCount));
- expect(client.get("http://example.org"), completes);
- fake.elapse(Duration(minutes: 10));
+ expect(client.get('http://example.org'), completes);
+ fake.elapse(const Duration(minutes: 10));
});
});
- test("waits according to the delay list", () {
+ test('waits according to the delay list', () {
FakeAsync().run((fake) {
var count = 0;
- var client = RetryClient.withDelays(
+ final client = RetryClient.withDelays(
MockClient(expectAsync1((_) async {
count++;
if (count == 1) {
expect(fake.elapsed, equals(Duration.zero));
} else if (count == 2) {
- expect(fake.elapsed, equals(Duration(seconds: 1)));
+ expect(fake.elapsed, equals(const Duration(seconds: 1)));
} else if (count == 3) {
- expect(fake.elapsed, equals(Duration(seconds: 61)));
+ expect(fake.elapsed, equals(const Duration(seconds: 61)));
} else if (count == 4) {
- expect(fake.elapsed, equals(Duration(seconds: 73)));
+ expect(fake.elapsed, equals(const Duration(seconds: 73)));
}
- return Response("", 503);
+ return Response('', 503);
}, count: 4)),
- [Duration(seconds: 1), Duration(minutes: 1), Duration(seconds: 12)]);
+ const [
+ Duration(seconds: 1),
+ Duration(minutes: 1),
+ Duration(seconds: 12)
+ ]);
- expect(client.get("http://example.org"), completes);
- fake.elapse(Duration(minutes: 10));
+ expect(client.get('http://example.org'), completes);
+ fake.elapse(const Duration(minutes: 10));
});
});
- test("calls onRetry for each retry", () async {
+ test('calls onRetry for each retry', () async {
var count = 0;
- var client = RetryClient(
- MockClient(expectAsync1((_) async => Response("", 503), count: 3)),
+ final client = RetryClient(
+ MockClient(expectAsync1((_) async => Response('', 503), count: 3)),
retries: 2,
delay: (_) => Duration.zero,
onRetry: expectAsync3((request, response, retryCount) {
- expect(request.url, equals(Uri.parse("http://example.org")));
+ expect(request.url, equals(Uri.parse('http://example.org')));
expect(response.statusCode, equals(503));
expect(retryCount, equals(count));
count++;
}, count: 2));
- var response = await client.get("http://example.org");
+ final response = await client.get('http://example.org');
expect(response.statusCode, equals(503));
});
- test("copies all request attributes for each attempt", () async {
- var client = RetryClient.withDelays(
+ test('copies all request attributes for each attempt', () async {
+ final client = RetryClient.withDelays(
MockClient(expectAsync1((request) async {
expect(request.contentLength, equals(5));
expect(request.followRedirects, isFalse);
- expect(request.headers, containsPair("foo", "bar"));
+ expect(request.headers, containsPair('foo', 'bar'));
expect(request.maxRedirects, equals(12));
- expect(request.method, equals("POST"));
+ expect(request.method, equals('POST'));
expect(request.persistentConnection, isFalse);
- expect(request.url, equals(Uri.parse("http://example.org")));
- expect(request.body, equals("hello"));
- return Response("", 503);
+ expect(request.url, equals(Uri.parse('http://example.org')));
+ expect(request.body, equals('hello'));
+ return Response('', 503);
}, count: 2)),
[Duration.zero]);
- var request = Request("POST", Uri.parse("http://example.org"));
- request.body = "hello";
- request.followRedirects = false;
- request.headers["foo"] = "bar";
- request.maxRedirects = 12;
- request.persistentConnection = false;
+ final request = Request('POST', Uri.parse('http://example.org'))
+ ..body = 'hello'
+ ..followRedirects = false
+ ..headers['foo'] = 'bar'
+ ..maxRedirects = 12
+ ..persistentConnection = false;
- var response = await client.send(request);
+ final response = await client.send(request);
expect(response.statusCode, equals(503));
});
}