diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml index e47bf66..9e0fcc4 100644 --- a/.github/workflows/test-package.yml +++ b/.github/workflows/test-package.yml @@ -47,7 +47,7 @@ jobs: matrix: # Add macos-latest and/or windows-latest if relevant for this package. os: [ubuntu-latest] - sdk: [2.12.0, dev] + sdk: [2.15.0, dev] steps: - uses: actions/checkout@v2 - uses: dart-lang/setup-dart@v1.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index e64acb6..cd42d75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ -## 3.0.2-dev +## 3.0.2 +* Switch to using `package:lints`. * Address a few analysis hint violations. * Populate the pubspec `repository` field. diff --git a/README.md b/README.md index fef7008..2564d8a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +[![Dart CI](https://github.com/dart-lang/json_rpc_2/actions/workflows/test-package.yml/badge.svg)](https://github.com/dart-lang/json_rpc_2/actions/workflows/test-package.yml) +[![pub package](https://img.shields.io/pub/v/json_rpc_2.svg)](https://pub.dev/packages/json_rpc_2) +[![package publisher](https://img.shields.io/pub/publisher/json_rpc_2.svg)](https://pub.dev/packages/json_rpc_2/publisher) + A library that implements the [JSON-RPC 2.0 spec][spec]. [spec]: https://www.jsonrpc.org/specification diff --git a/analysis_options.yaml b/analysis_options.yaml index bff1a74..9ec6408 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,5 +1,15 @@ -# Defines a default set of lint rules enforced for -# projects at Google. For details and rationale, -# see https://github.com/dart-lang/pedantic#enabled-lints. -include: package:pedantic/analysis_options.yaml +include: package:lints/recommended.yaml +linter: + rules: + - always_declare_return_types + # - avoid_dynamic_calls + - avoid_unused_constructor_parameters + - cancel_subscriptions + - directives_ordering + - omit_local_variable_types + - package_api_docs + - prefer_single_quotes + - test_types_in_equals + - throw_in_finally + - unawaited_futures diff --git a/example/client.dart b/example/client.dart index 243b83e..d23be94 100644 --- a/example/client.dart +++ b/example/client.dart @@ -2,8 +2,9 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'dart:async'; + import 'package:json_rpc_2/json_rpc_2.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; void main() async { diff --git a/lib/error_code.dart b/lib/error_code.dart index f4ca462..14e0543 100644 --- a/lib/error_code.dart +++ b/lib/error_code.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: constant_identifier_names + /// Error codes defined in the [JSON-RPC 2.0 specificiation][spec]. /// /// These codes are generally used for protocol-level communication. Most of diff --git a/lib/src/client.dart b/lib/src/client.dart index 7e040cc..cc1ca59 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -173,7 +173,10 @@ class Client { /// invokes [callback] without creating another batch. This means that /// responses are batched until the first batch ends. void withBatch(Function() callback) { - if (_batch != null) return callback(); + if (_batch != null) { + callback(); + return; + } _batch = []; return tryFinally(callback, () { diff --git a/lib/src/exception.dart b/lib/src/exception.dart index 64c97d0..ad39ff2 100644 --- a/lib/src/exception.dart +++ b/lib/src/exception.dart @@ -24,7 +24,7 @@ class RpcException implements Exception { /// This must be a JSON-serializable object. If it's a [Map] without a /// `"request"` key, a copy of the request that caused the error will /// automatically be injected. - final data; + final Object? data; RpcException(this.code, this.message, {this.data}); @@ -44,9 +44,9 @@ class RpcException implements Exception { /// Converts this exception into a JSON-serializable object that's a valid /// JSON-RPC 2.0 error response. Map serialize(request) { - var modifiedData; - if (data is Map && !data.containsKey('request')) { - modifiedData = Map.from(data); + dynamic modifiedData; + if (data is Map && !(data as Map).containsKey('request')) { + modifiedData = Map.from(data as Map); modifiedData['request'] = request; } else if (data == null) { modifiedData = {'request': request}; diff --git a/lib/src/parameters.dart b/lib/src/parameters.dart index 665765b..7cf3f2f 100644 --- a/lib/src/parameters.dart +++ b/lib/src/parameters.dart @@ -27,7 +27,7 @@ class Parameters { /// If this is accessed for a [Parameter] that was not passed, the request /// will be automatically rejected. To avoid this, use [Parameter.valueOr]. dynamic get value => _value; - final _value; + final dynamic _value; Parameters(this.method, this._value); @@ -111,7 +111,7 @@ class Parameter extends Parameters { final Parameters _parent; /// The key used to access [this], used to construct [_path]. - final _key; + final dynamic _key; /// A human-readable representation of the path of getters used to get this. /// diff --git a/lib/src/server.dart b/lib/src/server.dart index afcc4ca..5cb2937 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -172,7 +172,7 @@ class Server { /// if no response should be sent. [callback] may send custom /// errors by throwing an [RpcException]. Future _handleRequest(request) async { - var response; + dynamic response; if (request is List) { if (request.isEmpty) { response = RpcException(error_code.INVALID_REQUEST, @@ -301,7 +301,7 @@ class Server { Future _tryFallbacks(Parameters params) { var iterator = _fallbacks.toList().iterator; - Future _tryNext() async { + Future tryNext() async { if (!iterator.moveNext()) { throw RpcException.methodNotFound(params.method); } @@ -310,10 +310,10 @@ class Server { return await iterator.current(params); } on RpcException catch (error) { if (error.code != error_code.METHOD_NOT_FOUND) rethrow; - return _tryNext(); + return tryNext(); } } - return _tryNext(); + return tryNext(); } } diff --git a/lib/src/utils.dart b/lib/src/utils.dart index 37523f0..305945c 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -28,7 +28,7 @@ String getErrorMessage(error) => /// This is synchronicity-agnostic relative to [body]. If [body] returns a /// [Future], this wil run asynchronously; otherwise it will run synchronously. void tryFinally(Function() body, Function() whenComplete) { - var result; + dynamic result; try { result = body(); } catch (_) { @@ -38,7 +38,6 @@ void tryFinally(Function() body, Function() whenComplete) { if (result is! Future) { whenComplete(); - return result; } else { result.whenComplete(whenComplete); } diff --git a/pubspec.yaml b/pubspec.yaml index 48bc0b6..7d4897e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: json_rpc_2 -version: 3.0.2-dev +version: 3.0.2 description: >- Utilities to write a client or server using the JSON-RPC 2.0 spec. repository: https://github.com/dart-lang/json_rpc_2 @@ -12,6 +12,6 @@ dependencies: stream_channel: ^2.1.0 dev_dependencies: - pedantic: ^1.11.0 + lints: '>=1.0.0 < 3.0.0' test: ^1.16.0 web_socket_channel: ^2.0.0 diff --git a/test/client/client_test.dart b/test/client/client_test.dart index 1c9ce10..df9c033 100644 --- a/test/client/client_test.dart +++ b/test/client/client_test.dart @@ -2,14 +2,15 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:test/test.dart'; import 'package:json_rpc_2/error_code.dart' as error_code; import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; +import 'package:test/test.dart'; import 'utils.dart'; void main() { - var controller; + late ClientController controller; + setUp(() => controller = ClientController()); test('sends a message and returns the response', () { diff --git a/test/client/stream_test.dart b/test/client/stream_test.dart index 4080064..b33778e 100644 --- a/test/client/stream_test.dart +++ b/test/client/stream_test.dart @@ -4,15 +4,15 @@ import 'dart:async'; +import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; -import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; - void main() { - var responseController; - var requestController; - var client; + late StreamController responseController; + late StreamController requestController; + late json_rpc.Client client; + setUp(() { responseController = StreamController(); requestController = StreamController(); diff --git a/test/client/utils.dart b/test/client/utils.dart index 398c558..45342cf 100644 --- a/test/client/utils.dart +++ b/test/client/utils.dart @@ -5,11 +5,10 @@ import 'dart:async'; import 'dart:convert'; +import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; -import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; - /// A controller used to test a [json_rpc.Client]. class ClientController { /// The controller for the client's response stream. diff --git a/test/peer_test.dart b/test/peer_test.dart index e209763..4b4c44a 100644 --- a/test/peer_test.dart +++ b/test/peer_test.dart @@ -5,17 +5,16 @@ import 'dart:async'; import 'dart:convert'; -import 'package:pedantic/pedantic.dart'; -import 'package:stream_channel/stream_channel.dart'; -import 'package:test/test.dart'; - import 'package:json_rpc_2/error_code.dart' as error_code; import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; +import 'package:stream_channel/stream_channel.dart'; +import 'package:test/test.dart'; void main() { - var incoming; - var outgoing; - var peer; + late StreamSink incoming; + late Stream outgoing; + late json_rpc.Peer peer; + setUp(() { var incomingController = StreamController(); incoming = incomingController.sink; @@ -240,6 +239,7 @@ void main() { ); peer ..registerMethod('foo', () => throw exception) + // ignore: unawaited_futures ..listen(); incomingController.add({'jsonrpc': '2.0', 'method': 'foo'}); diff --git a/test/server/batch_test.dart b/test/server/batch_test.dart index c9411b3..b8b8fea 100644 --- a/test/server/batch_test.dart +++ b/test/server/batch_test.dart @@ -2,13 +2,14 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:test/test.dart'; import 'package:json_rpc_2/error_code.dart' as error_code; +import 'package:test/test.dart'; import 'utils.dart'; void main() { - var controller; + late ServerController controller; + setUp(() { controller = ServerController(); controller.server diff --git a/test/server/invalid_request_test.dart b/test/server/invalid_request_test.dart index a67afec..4fa4de1 100644 --- a/test/server/invalid_request_test.dart +++ b/test/server/invalid_request_test.dart @@ -2,13 +2,13 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:test/test.dart'; import 'package:json_rpc_2/error_code.dart' as error_code; +import 'package:test/test.dart'; import 'utils.dart'; void main() { - var controller; + late ServerController controller; setUp(() => controller = ServerController()); test('a non-Array/Object request is invalid', () { diff --git a/test/server/parameters_test.dart b/test/server/parameters_test.dart index 069daf3..9ecfb1f 100644 --- a/test/server/parameters_test.dart +++ b/test/server/parameters_test.dart @@ -2,14 +2,14 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:test/test.dart'; import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; +import 'package:test/test.dart'; import 'utils.dart'; void main() { group('with named parameters', () { - var parameters; + late json_rpc.Parameters parameters; setUp(() { parameters = json_rpc.Parameters('foo', { 'num': 1.5, @@ -277,7 +277,7 @@ void main() { }); group('with a nested parameter map', () { - var nested; + late json_rpc.Parameter nested; setUp(() => nested = parameters['map']); test('[int] fails with a type error', () { @@ -312,7 +312,8 @@ void main() { }); group('with a nested parameter list', () { - var nested; + late json_rpc.Parameter nested; + setUp(() => nested = parameters['list']); test('[string] fails with a type error', () { @@ -348,7 +349,7 @@ void main() { }); group('with positional parameters', () { - var parameters; + late json_rpc.Parameters parameters; setUp(() => parameters = json_rpc.Parameters('foo', [1, 2, 3, 4, 5])); test('value returns the wrapped value', () { diff --git a/test/server/server_test.dart b/test/server/server_test.dart index 8213ee7..10f2678 100644 --- a/test/server/server_test.dart +++ b/test/server/server_test.dart @@ -4,14 +4,15 @@ import 'dart:convert'; -import 'package:test/test.dart'; import 'package:json_rpc_2/error_code.dart' as error_code; import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; +import 'package:test/test.dart'; import 'utils.dart'; void main() { - var controller; + late ServerController controller; + setUp(() => controller = ServerController()); test('calls a registered method with the given name', () { diff --git a/test/server/stream_test.dart b/test/server/stream_test.dart index 7105cd6..2f95150 100644 --- a/test/server/stream_test.dart +++ b/test/server/stream_test.dart @@ -4,15 +4,15 @@ import 'dart:async'; +import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; -import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; - void main() { - var requestController; - var responseController; - var server; + late StreamController requestController; + late StreamController responseController; + late json_rpc.Server server; + setUp(() { requestController = StreamController(); responseController = StreamController(); diff --git a/test/server/utils.dart b/test/server/utils.dart index 92f1d32..481d342 100644 --- a/test/server/utils.dart +++ b/test/server/utils.dart @@ -5,12 +5,11 @@ import 'dart:async'; import 'dart:convert'; +import 'package:json_rpc_2/error_code.dart' as error_code; +import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; -import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; -import 'package:json_rpc_2/error_code.dart' as error_code; - /// A controller used to test a [json_rpc.Server]. class ServerController { /// The controller for the server's request stream. @@ -50,7 +49,7 @@ class ServerController { void expectErrorResponse( ServerController controller, request, int errorCode, String message, {data}) { - var id; + dynamic id; if (request is Map) id = request['id']; data ??= {'request': request};