Skip to content

Commit 99fbf4d

Browse files
Merge pull request #109 from icapps/feature/DetectDartVersion
Detect dart version and use new features where possible
2 parents 723a473 + 81e0f98 commit 99fbf4d

33 files changed

+198
-31
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
# Changelog
2+
## [5.8.1] - 2021-12-09
3+
- Detect the current min dart version and use newer features when available. (Fixes #108)
4+
25
## [5.8.0] - 2021-11-25
36
- Added `retrofit_compute` option to generate top-level functions compatible with retrofit's compute mode. (Fixes #106)
47
-

lib/config/pubspec_config.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import 'dart:io';
22

3+
import 'package:meta/meta.dart';
4+
import 'package:model_generator/util/language_version.dart';
5+
import 'package:pub_semver/pub_semver.dart';
36
import 'package:yaml/yaml.dart';
47

58
class PubspecConfig {
@@ -18,6 +21,7 @@ class PubspecConfig {
1821
late bool staticCreate;
1922
late bool uppercaseEnums;
2023
late bool retrofitMappers;
24+
LanguageVersion? languageVersion;
2125
final extraImports = <String>[];
2226
final extraAnnotations = <String>[];
2327

@@ -27,6 +31,7 @@ class PubspecConfig {
2731
throw Exception('Could not parse the pubspec.yaml');
2832
}
2933
final projectName = doc['name'];
34+
languageVersion = parseLanguageVersion(doc);
3035

3136
if (projectName == null || projectName.isEmpty) {
3237
throw Exception(
@@ -71,4 +76,23 @@ class PubspecConfig {
7176
.forEach((element) => this.extraAnnotations.add(element.toString()));
7277
}
7378
}
79+
80+
@visibleForTesting
81+
static LanguageVersion? parseLanguageVersion(YamlMap doc) {
82+
final environmentRoot = doc['environment'];
83+
if (environmentRoot is! YamlMap) return null;
84+
final sdk = environmentRoot['sdk'];
85+
if (sdk is! String) return null;
86+
87+
final range = VersionConstraint.parse(sdk);
88+
if (range is Version) {
89+
return LanguageVersion(range.major, range.minor, range.patch);
90+
} else if (range is VersionRange) {
91+
final min = range.min;
92+
if (min == null) return null;
93+
return LanguageVersion(min.major, min.minor, min.patch);
94+
}
95+
96+
return null;
97+
}
7498
}

lib/util/language_version.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class LanguageVersion {
2+
final int major;
3+
final int minor;
4+
final int patch;
5+
6+
LanguageVersion(this.major, this.minor, this.patch);
7+
8+
bool isAtLeast(int major, [int? minor, int? patch]) {
9+
return (this.major >= major &&
10+
(minor == null || this.minor >= minor) &&
11+
(patch == null || this.patch >= patch));
12+
}
13+
14+
@override
15+
String toString() {
16+
return '$major.$minor.$patch';
17+
}
18+
}

lib/writer/object_model_writer.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,18 +319,22 @@ class ObjectModelWriter {
319319
}
320320

321321
void createRetrofitMappers(StringBuffer sb) {
322+
final hasConstructorTearOffs =
323+
pubspecConfig.languageVersion?.isAtLeast(2, 15) ?? false;
322324
sb
323325
..writeln()
324-
..writeln(
325-
'${jsonModel.name} deserialize${jsonModel.name}(Map<String, dynamic> json) => ${jsonModel.name}.fromJson(json);')
326+
..writeln(hasConstructorTearOffs
327+
? 'const deserialize${jsonModel.name} = ${jsonModel.name}.fromJson;'
328+
: '${jsonModel.name} deserialize${jsonModel.name}(Map<String, dynamic> json) => ${jsonModel.name}.fromJson(json);')
326329
..writeln()
327330
..writeln(
328331
'Map<String, dynamic> serialize${jsonModel.name}(${jsonModel.name} object) => object.toJson();')
329332
..writeln()
330333
..writeln(
331334
'List<${jsonModel.name}> deserialize${jsonModel.name}List(List<Map<String, dynamic>> jsonList)')
332-
..writeln(
333-
' => jsonList.map((json) => ${jsonModel.name}.fromJson(json)).toList();')
335+
..writeln(hasConstructorTearOffs
336+
? ' => jsonList.map(${jsonModel.name}.fromJson).toList();'
337+
: ' => jsonList.map((json) => ${jsonModel.name}.fromJson(json)).toList();')
334338
..writeln()
335339
..writeln(
336340
'List<Map<String, dynamic>> serialize${jsonModel.name}List(List<${jsonModel.name}> objects)')

pubspec.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: model_generator
22
description: Dart tool to automaticly generate models from a yml file to speed up your development flow.
3-
version: 5.8.0
3+
version: 5.8.1
44
homepage: https://github.com/icapps/flutter-model-generator
55

66
environment:
@@ -10,9 +10,9 @@ dependencies:
1010
args: ^2.3.0
1111
meta: ^1.3.0
1212
path: ^1.8.0
13+
pub_semver: ^2.1.0
1314
yaml: ^3.1.0
1415

1516
dev_dependencies:
16-
flutter_test:
17-
sdk: flutter
17+
test: 1.19.5
1818
lints: ^1.0.1

test/config/pubspec_config_test.dart

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import 'dart:io';
22

3-
import 'package:flutter_test/flutter_test.dart';
43
import 'package:model_generator/config/pubspec_config.dart';
4+
import 'package:test/test.dart';
5+
import 'package:yaml/yaml.dart';
56

67
import 'config_test_helper.dart';
78

@@ -101,5 +102,35 @@ void main() {
101102
expect(errorMessage,
102103
'Exception: Could not parse the pubspec.yaml, project name not found');
103104
});
105+
test('Test parse any version', () {
106+
expect(
107+
PubspecConfig.parseLanguageVersion(YamlMap.wrap({
108+
'environment': {'sdk': 'any'}
109+
})),
110+
null);
111+
});
112+
test('Test parse fixed version', () {
113+
expect(
114+
PubspecConfig.parseLanguageVersion(YamlMap.wrap({
115+
'environment': {'sdk': '2.14.0'}
116+
}))!
117+
.toString(),
118+
'2.14.0');
119+
});
120+
test('Test parse max version', () {
121+
expect(
122+
PubspecConfig.parseLanguageVersion(YamlMap.wrap({
123+
'environment': {'sdk': '<2.14.0'}
124+
})),
125+
null);
126+
});
127+
test('Test parse min and max version', () {
128+
expect(
129+
PubspecConfig.parseLanguageVersion(YamlMap.wrap({
130+
'environment': {'sdk': '>=2.14.0 <3.0.0'}
131+
}))!
132+
.toString(),
133+
'2.14.0');
134+
});
104135
});
105136
}

test/config/yml_generator_config_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import 'package:flutter_test/flutter_test.dart';
21
import 'package:model_generator/config/pubspec_config.dart';
32
import 'package:model_generator/config/yml_generator_config.dart';
43
import 'package:model_generator/model/item_type/object_type.dart';
54
import 'package:model_generator/model/model/custom_model.dart';
65
import 'package:model_generator/model/model/enum_model.dart';
76
import 'package:model_generator/model/model/object_model.dart';
7+
import 'package:test/test.dart';
88

99
import 'config_test_helper.dart';
1010

test/model/field_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:flutter_test/flutter_test.dart';
1+
import 'package:test/test.dart';
22
import 'package:model_generator/model/field.dart';
33
import 'package:model_generator/model/item_type/string_type.dart';
44

test/model/item_type/array_type_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:model_generator/model/item_type/array_type.dart';
2-
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:test/test.dart';
33

44
void main() {
55
group('Array Type', () {

test/model/item_type/bool_type_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:model_generator/model/item_type/boolean_type.dart';
2-
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:test/test.dart';
33

44
void main() {
55
group('BooleanType', () {

0 commit comments

Comments
 (0)