Skip to content

Commit 0c4a928

Browse files
authored
[dart][dart-dio] Enable strong-mode and strict types (OpenAPITools#8231)
* [dart-dio] Enable strong-mode and strict types This will make it easier to eventually transition to NNBD. Also fix some formatting things. * [dart-dio] Add implicit-casts: false to analysis options * [dart-dio] Add dartanalyzer to integration tests * raise minimum Dart version to 2.6 (to support spread collection) * add header to all files for language version * fix some missing imports that can be fixed (some remain due to missing inheritance support)
1 parent 604ac6d commit 0c4a928

File tree

120 files changed

+1707
-871
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

120 files changed

+1707
-871
lines changed
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
analyzer:
1+
analyzer:
2+
language:
3+
strict-inference: true
4+
strict-raw-types: true
5+
strong-mode:
6+
implicit-dynamic: false
7+
implicit-casts: false
8+
exclude:
9+
- test/*.dart

modules/openapi-generator/src/main/resources/dart-dio/api.mustache

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{{>header}}
12
import 'dart:async';
23
import 'dart:convert';
34
import 'package:dio/dio.dart';
@@ -31,8 +32,8 @@ class {{classname}} {
3132
}) async {
3233
final String _path = '{{{path}}}'{{#pathParams}}.replaceAll('{' r'{{baseName}}' '}', {{{paramName}}}.toString()){{/pathParams}};
3334

34-
final Map<String, dynamic> queryParams = {};
35-
final Map<String, dynamic> headerParams = {
35+
final queryParams = <String, dynamic>{};
36+
final headerParams = <String, dynamic>{
3637
if (headers != null) ...headers,
3738
};
3839
dynamic bodyData;
@@ -43,15 +44,15 @@ class {{classname}} {
4344
{{#queryParams}}
4445
queryParams[r'{{baseName}}'] = {{paramName}};
4546
{{/queryParams}}
46-
queryParams.removeWhere((key, value) => value == null);
47-
headerParams.removeWhere((key, value) => value == null);
47+
queryParams.removeWhere((key, dynamic value) => value == null);
48+
headerParams.removeWhere((key, dynamic value) => value == null);
4849

49-
final List<String> contentTypes = [{{^hasConsumes}}];{{/hasConsumes}}{{#hasConsumes}}{{#consumes}}
50+
final contentTypes = <String>[{{^hasConsumes}}];{{/hasConsumes}}{{#hasConsumes}}{{#consumes}}
5051
'{{{mediaType}}}',{{/consumes}}
5152
];{{/hasConsumes}}
5253
{{#hasFormParams}}
5354

54-
final Map<String, dynamic> formData = {};
55+
final formData = <String, dynamic>{};
5556
{{#isMultipart}}
5657
{{#formParams}}
5758
{{^isFile}}
@@ -93,7 +94,7 @@ class {{classname}} {
9394
bodyData = json{{paramName}};
9495
{{/bodyParam}}
9596

96-
return _dio.request(
97+
return _dio.request<dynamic>(
9798
_path,
9899
queryParameters: queryParams,
99100
data: bodyData,
@@ -103,8 +104,8 @@ class {{classname}} {
103104
responseType: ResponseType.bytes,
104105
{{/isResponseFile}}
105106
headers: headerParams,
106-
extra: {
107-
'secure': [{{^hasAuthMethods}}],{{/hasAuthMethods}}{{#hasAuthMethods}}
107+
extra: <String, dynamic>{
108+
'secure': <Map<String, String>>[{{^hasAuthMethods}}],{{/hasAuthMethods}}{{#hasAuthMethods}}
108109
{{#authMethods}}{
109110
'type': '{{type}}',
110111
'name': '{{name}}',{{#isApiKey}}
@@ -130,14 +131,22 @@ class {{classname}} {
130131
final data = response.data as {{{returnType}}};
131132
{{/returnTypeIsPrimitive}}
132133
{{^returnTypeIsPrimitive}}
133-
final serializer = _serializers.serializerForType({{{returnType}}});
134-
final data = _serializers.deserializeWith<{{{returnType}}}>(serializer, response.data is String ? jsonDecode(response.data) : response.data);
134+
final serializer = _serializers.serializerForType({{{returnType}}}) as Serializer<{{{returnType}}}>;
135+
final data = _serializers.deserializeWith<{{{returnType}}}>(
136+
serializer,
137+
response.data is String ? jsonDecode(response.data as String) : response.data,
138+
);
135139
{{/returnTypeIsPrimitive}}
136140
{{/returnSimpleType}}
137141
{{^returnSimpleType}}
138142
const collectionType = {{#isMap}}BuiltMap{{/isMap}}{{^isMap}}BuiltList{{/isMap}};
139143
const type = FullType(collectionType, [{{#isMap}}FullType(String), {{/isMap}}FullType({{{returnBaseType}}})]);
140-
final {{{returnType}}} data = _serializers.deserialize(response.data is String ? jsonDecode(response.data) : response.data, specifiedType: type);
144+
final data = _serializers.deserialize(
145+
response.data is String
146+
? jsonDecode(response.data as String)
147+
: response.data,
148+
specifiedType: type,
149+
) as {{{returnType}}};
141150
{{/returnSimpleType}}
142151
{{/isResponseFile}}
143152

modules/openapi-generator/src/main/resources/dart-dio/api_util.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{{>header}}
12
import 'dart:convert';
23

34
import 'package:built_value/serializer.dart';

modules/openapi-generator/src/main/resources/dart-dio/apilib.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{{>header}}
12
library {{pubName}}.api;
23

34
import 'package:dio/dio.dart';

modules/openapi-generator/src/main/resources/dart-dio/auth/api_key_auth.mustache

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{{>header}}
12
import 'dart:async';
23
import 'package:{{pubName}}/auth/auth.dart';
34
import 'package:dio/dio.dart';
@@ -6,12 +7,12 @@ class ApiKeyAuthInterceptor extends AuthInterceptor {
67
Map<String, String> apiKeys = {};
78

89
@override
9-
Future onRequest(RequestOptions options) {
10-
final authInfo = getAuthInfo(options, "apiKey");
11-
for (var info in authInfo) {
12-
final authName = info["name"];
13-
final authKeyName = info["keyName"];
14-
final authWhere = info["where"];
10+
Future<dynamic> onRequest(RequestOptions options) {
11+
final authInfo = getAuthInfo(options, 'apiKey');
12+
for (final info in authInfo) {
13+
final authName = info['name'] as String;
14+
final authKeyName = info['keyName'] as String;
15+
final authWhere = info['where'] as String;
1516
final apiKey = apiKeys[authName];
1617
if (apiKey != null) {
1718
if (authWhere == 'query') {

modules/openapi-generator/src/main/resources/dart-dio/auth/auth.mustache

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import 'dart:async';
2-
1+
{{>header}}
32
import 'package:dio/dio.dart';
43

54
abstract class AuthInterceptor extends Interceptor {
@@ -8,11 +7,11 @@ abstract class AuthInterceptor extends Interceptor {
87
* Can return null if type is not present on auth data or if route doesn't need authentication
98
*/
109
List<Map<String, dynamic>> getAuthInfo(RequestOptions route, String type) {
11-
if (route.extra.containsKey("secure")) {
12-
final auth = route.extra["secure"];
13-
List<Map<String, dynamic>> results = [];
14-
for (var info in auth) {
15-
if(info["type"] == type) {
10+
if (route.extra.containsKey('secure')) {
11+
final auth = route.extra['secure'] as List<Map<String, String>>;
12+
final results = <Map<String, dynamic>>[];
13+
for (final info in auth) {
14+
if (info['type'] == type) {
1615
results.add(info);
1716
}
1817
}

modules/openapi-generator/src/main/resources/dart-dio/auth/basic_auth.mustache

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{{>header}}
12
import 'dart:async';
23
import 'dart:convert';
34
import 'package:{{pubName}}/auth/auth.dart';
@@ -14,13 +15,13 @@ class BasicAuthInterceptor extends AuthInterceptor {
1415
Map<String, BasicAuthInfo> authInfo = {};
1516

1617
@override
17-
Future onRequest(RequestOptions options) {
18+
Future<dynamic> onRequest(RequestOptions options) {
1819
final metadataAuthInfo = getAuthInfo(options, 'basic');
19-
for (var info in metadataAuthInfo) {
20-
final authName = info['name'];
20+
for (final info in metadataAuthInfo) {
21+
final authName = info['name'] as String;
2122
final basicAuthInfo = authInfo[authName];
22-
if(basicAuthInfo != null) {
23-
String basicAuth = 'Basic ' + base64Encode(utf8.encode('${basicAuthInfo.username}:${basicAuthInfo.password}'));
23+
if (basicAuthInfo != null) {
24+
final basicAuth = 'Basic ' + base64Encode(utf8.encode('${basicAuthInfo.username}:${basicAuthInfo.password}'));
2425
options.headers['Authorization'] = basicAuth;
2526
break;
2627
}

modules/openapi-generator/src/main/resources/dart-dio/auth/oauth.mustache

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{{>header}}
12
import 'dart:async';
23
import 'package:{{pubName}}/auth/auth.dart';
34
import 'package:dio/dio.dart';
@@ -6,12 +7,12 @@ class OAuthInterceptor extends AuthInterceptor {
67
Map<String, String> tokens = {};
78

89
@override
9-
Future onRequest(RequestOptions options) {
10-
final authInfo = getAuthInfo(options, "oauth");
11-
for (var info in authInfo) {
12-
final token = tokens[info["name"]];
13-
if(token != null) {
14-
options.headers["Authorization"] = "Bearer ${token}";
10+
Future<dynamic> onRequest(RequestOptions options) {
11+
final authInfo = getAuthInfo(options, 'oauth');
12+
for (final info in authInfo) {
13+
final token = tokens[info['name']];
14+
if (token != null) {
15+
options.headers['Authorization'] = 'Bearer ${token}';
1516
break;
1617
}
1718
}

modules/openapi-generator/src/main/resources/dart-dio/class.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ abstract class {{classname}} implements Built<{{classname}}, {{classname}}Builde
2525
static void _initializeBuilder({{{classname}}}Builder b) => b{{#vars}}{{#defaultValue}}
2626
..{{{name}}} = {{#isEnum}}{{^isContainer}}const {{{classname}}}{{{enumName}}}._({{/isContainer}}{{/isEnum}}{{{defaultValue}}}{{#isEnum}}{{^isContainer}}){{/isContainer}}{{/isEnum}}{{/defaultValue}}{{/vars}};
2727

28-
factory {{classname}}([updates({{classname}}Builder b)]) = _${{classname}};
28+
factory {{classname}}([void updates({{classname}}Builder b)]) = _${{classname}};
2929
static Serializer<{{classname}}> get serializer => _${{#lambda.camelcase}}{{{classname}}}{{/lambda.camelcase}}Serializer;
3030
}
3131
{{!
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//
2+
// AUTO-GENERATED FILE, DO NOT MODIFY!
3+
//
4+
// @dart=2.6
5+
6+
// ignore_for_file: unused_import

0 commit comments

Comments
 (0)