Skip to content

Commit c6b0ec9

Browse files
authored
⬆️ Constraint dart_style v3 which also bumps the SDK constraint to 3.4 (#681)
## What does this change? Use the `dart_style` v3 to cover the short-style formatting of old projects. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue)
1 parent fd63623 commit c6b0ec9

21 files changed

+123
-89
lines changed

.github/workflows/build.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,5 @@ jobs:
6161
6262
- name: Check for any formatting and statically analyze the code.
6363
run: |
64-
melos format
64+
melos run format
6565
melos analyze

examples/example/lib/gen/assets.gen.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class $AssetsLottieGen {
107107
cat,
108108
geometricalAnimation,
109109
hamburgerArrow,
110-
spinningCarrousel,
110+
spinningCarrousel
111111
];
112112
}
113113

examples/example/pubspec.yaml

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ description: A sample project using FlutterGen.
33
publish_to: 'none'
44

55
environment:
6-
sdk: '>=3.2.0 <4.0.0'
7-
flutter: '>=3.16.0'
6+
sdk: ^3.4.0
87

98
dependencies:
109
flutter:

examples/example_resources/lib/gen/assets.gen.dart

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class $AssetsImagesGen {
2424
SvgGenImage get dart => const SvgGenImage('assets/images/dart.svg');
2525

2626
/// File path: assets/images/favorite.flr
27-
String get favorite => 'assets/images/favorite.flr';
27+
String get favorite =>
28+
'packages/example_resources/assets/images/favorite.flr';
2829

2930
/// File path: assets/images/flutter3.jpg
3031
AssetGenImage get flutter3 =>
@@ -54,7 +55,7 @@ class $AssetsUnknownGen {
5455
}
5556

5657
class ResAssets {
57-
ResAssets._();
58+
const ResAssets._();
5859

5960
static const String package = 'example_resources';
6061

examples/example_resources/pubspec.yaml

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ description: A sample project using FlutterGen.
33
publish_to: 'none'
44

55
environment:
6-
sdk: '>=3.2.0 <4.0.0'
7-
flutter: '>=3.16.0'
6+
sdk: ^3.4.0
87

98
dependencies:
109
flutter:

melos.yaml

+4-6
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,11 @@ scripts:
2828
flutter: false
2929
description: dart pub upgrade
3030

31-
analyze:
32-
exec: flutter analyze
33-
description: flutter analyze
34-
3531
format:
36-
run: dart format --set-exit-if-changed .
37-
description: dart format --set-exit-if-changed .
32+
run: |
33+
dart format --set-exit-if-changed .
34+
git --no-pager diff --exit-code
35+
description: Format Dart files and exit if unstaged changes exist
3836

3937
build:
4038
exec: flutter build apk

packages/command/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ documentation: https://github.com/FlutterGen/flutter_gen
77
issue_tracker: https://github.com/FlutterGen/flutter_gen/issues
88

99
environment:
10-
sdk: ^3.0.0
10+
sdk: ^3.4.0
1111

1212
executables:
1313
fluttergen: flutter_gen_command

packages/core/lib/flutter_generator.dart

+20-22
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import 'dart:io' show stdout, Directory, File;
22

3-
import 'package:dart_style/dart_style.dart' show DartFormatter;
43
import 'package:flutter_gen_core/generators/assets_generator.dart';
54
import 'package:flutter_gen_core/generators/colors_generator.dart';
65
import 'package:flutter_gen_core/generators/fonts_generator.dart';
76
import 'package:flutter_gen_core/settings/config.dart';
87
import 'package:flutter_gen_core/utils/file.dart';
8+
import 'package:flutter_gen_core/utils/formatter.dart';
99
import 'package:path/path.dart' show join, normalize;
1010

1111
class FlutterGenerator {
@@ -15,29 +15,26 @@ class FlutterGenerator {
1515
this.assetsName = 'assets.gen.dart',
1616
this.colorsName = 'colors.gen.dart',
1717
this.fontsName = 'fonts.gen.dart',
18+
this.overrideOutputPath,
1819
});
1920

2021
final File pubspecFile;
2122
final File? buildFile;
2223
final String assetsName;
2324
final String colorsName;
2425
final String fontsName;
26+
final String? overrideOutputPath;
2527

2628
Future<void> build({Config? config, FileWriter? writer}) async {
2729
config ??= loadPubspecConfigOrNull(pubspecFile, buildFile: buildFile);
2830
if (config == null) {
2931
return;
3032
}
3133

34+
final formatter = buildDartFormatterFromConfig(config);
3235
final flutter = config.pubspec.flutter;
3336
final flutterGen = config.pubspec.flutterGen;
3437
final output = config.pubspec.flutterGen.output;
35-
final lineLength = config.pubspec.flutterGen.lineLength;
36-
final formatter = DartFormatter(
37-
languageVersion: DartFormatter.latestLanguageVersion,
38-
pageWidth: lineLength,
39-
lineEnding: '\n',
40-
);
4138

4239
void defaultWriter(String contents, String path) {
4340
final file = File(path);
@@ -49,39 +46,40 @@ class FlutterGenerator {
4946

5047
writer ??= defaultWriter;
5148

52-
final absoluteOutput =
53-
Directory(normalize(join(pubspecFile.parent.path, output)));
49+
final absoluteOutput = Directory(
50+
normalize(overrideOutputPath ?? join(pubspecFile.parent.path, output)),
51+
);
5452
if (!absoluteOutput.existsSync()) {
5553
absoluteOutput.createSync(recursive: true);
5654
}
5755

58-
if (flutterGen.colors.enabled && flutterGen.colors.inputs.isNotEmpty) {
59-
final generated =
60-
generateColors(pubspecFile, formatter, flutterGen.colors);
61-
final colorsPath =
62-
normalize(join(pubspecFile.parent.path, output, colorsName));
63-
writer(generated, colorsPath);
64-
stdout.writeln('[FlutterGen] Generated: $colorsPath');
65-
}
66-
6756
if (flutterGen.assets.enabled && flutter.assets.isNotEmpty) {
6857
final generated = await generateAssets(
6958
AssetsGenConfig.fromConfig(pubspecFile, config),
7059
formatter,
7160
);
72-
final assetsPath =
73-
normalize(join(pubspecFile.parent.path, output, assetsName));
61+
final assetsPath = normalize(join(absoluteOutput.path, assetsName));
7462
writer(generated, assetsPath);
7563
stdout.writeln('[FlutterGen] Generated: $assetsPath');
7664
}
7765

66+
if (flutterGen.colors.enabled && flutterGen.colors.inputs.isNotEmpty) {
67+
final generated = generateColors(
68+
pubspecFile,
69+
formatter,
70+
flutterGen.colors,
71+
);
72+
final colorsPath = normalize(join(absoluteOutput.path, colorsName));
73+
writer(generated, colorsPath);
74+
stdout.writeln('[FlutterGen] Generated: $colorsPath');
75+
}
76+
7877
if (flutterGen.fonts.enabled && flutter.fonts.isNotEmpty) {
7978
final generated = generateFonts(
8079
FontsGenConfig.fromConfig(config),
8180
formatter,
8281
);
83-
final fontsPath =
84-
normalize(join(pubspecFile.parent.path, output, fontsName));
82+
final fontsPath = normalize(join(absoluteOutput.path, fontsName));
8583
writer(generated, fontsPath);
8684
stdout.writeln('[FlutterGen] Generated: $fontsPath');
8785
}

packages/core/lib/settings/config.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ Config loadPubspecConfig(File pubspecFile, {File? buildFile}) {
8686
Config? loadPubspecConfigOrNull(File pubspecFile, {File? buildFile}) {
8787
try {
8888
return loadPubspecConfig(pubspecFile, buildFile: buildFile);
89-
} on FileSystemException catch (e) {
90-
stderr.writeln(e.message);
91-
} on InvalidSettingsException catch (e) {
92-
stderr.writeln(e.message);
89+
} on FileSystemException catch (e, s) {
90+
stderr.writeln('$e\n$s');
91+
} on InvalidSettingsException catch (e, s) {
92+
stderr.writeln('$e\n$s');
9393
}
9494
return null;
9595
}

packages/core/lib/settings/pubspec.dart

+47
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:json_annotation/json_annotation.dart';
2+
import 'package:pub_semver/pub_semver.dart' show VersionConstraint;
23

34
part 'pubspec.g.dart';
45

@@ -8,6 +9,7 @@ part 'pubspec.g.dart';
89
class Pubspec {
910
const Pubspec({
1011
required this.packageName,
12+
required this.environment,
1113
required this.flutterGen,
1214
required this.flutter,
1315
});
@@ -17,13 +19,58 @@ class Pubspec {
1719
@JsonKey(name: 'name', required: true)
1820
final String packageName;
1921

22+
@JsonKey(name: 'environment', fromJson: _environmentFromJson)
23+
final Map<String, VersionConstraint?> environment;
24+
2025
@JsonKey(name: 'flutter_gen', required: true)
2126
final FlutterGen flutterGen;
2227

2328
@JsonKey(name: 'flutter', required: true)
2429
final Flutter flutter;
2530
}
2631

32+
// https://github.com/dart-lang/tools/blob/d3b54e89c4f71a114554499dec00ecd87a491b2b/pkgs/pubspec_parse/lib/src/pubspec.dart#L203
33+
Map<String, VersionConstraint?> _environmentFromJson(Map? source) {
34+
if (source == null) {
35+
return {};
36+
}
37+
return source.map((k, value) {
38+
final key = k as String;
39+
if (key == 'dart') {
40+
// github.com/dart-lang/pub/blob/d84173eeb03c3/lib/src/pubspec.dart#L342
41+
// 'dart' is not allowed as a key!
42+
throw CheckedFromJsonException(
43+
source,
44+
'dart',
45+
'VersionConstraint',
46+
'Use "sdk" to for Dart SDK constraints.',
47+
badKey: true,
48+
);
49+
}
50+
51+
VersionConstraint? constraint;
52+
if (value == null) {
53+
constraint = null;
54+
} else if (value is String) {
55+
try {
56+
constraint = VersionConstraint.parse(value);
57+
} on FormatException catch (e) {
58+
throw CheckedFromJsonException(source, key, 'Pubspec', e.message);
59+
}
60+
61+
return MapEntry(key, constraint);
62+
} else {
63+
throw CheckedFromJsonException(
64+
source,
65+
key,
66+
'VersionConstraint',
67+
'`$value` is not a String.',
68+
);
69+
}
70+
return MapEntry(key, constraint);
71+
});
72+
}
73+
2774
@JsonSerializable(disallowUnrecognizedKeys: false)
2875
class Flutter {
2976
const Flutter({

packages/core/lib/settings/pubspec.g.dart

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:dart_style/dart_style.dart' show DartFormatter;
2+
import 'package:pub_semver/pub_semver.dart' show VersionConstraint;
3+
4+
import '../settings/config.dart' show Config;
5+
6+
/// The formatter will only use the tall-style if the SDK constraint is ^3.7.
7+
DartFormatter buildDartFormatterFromConfig(Config config) {
8+
final sdkConstraint = config.pubspec.environment['sdk'];
9+
final useShort = switch (sdkConstraint) {
10+
final c? => c.allowsAny(VersionConstraint.parse('<3.7.0')),
11+
_ => true,
12+
};
13+
return DartFormatter(
14+
languageVersion: useShort
15+
? DartFormatter.latestShortStyleLanguageVersion
16+
: DartFormatter.latestLanguageVersion,
17+
pageWidth: config.pubspec.flutterGen.lineLength,
18+
lineEnding: '\n',
19+
);
20+
}

packages/core/lib/utils/identifer.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/// 2. Built-in identifiers.
88
/// 3. Limited reserved words.
99
/// 4. Reserved words, which can’t be identifiers.
10-
///
10+
// ignore: unnecessary_library_name
1111
library identifer;
1212

1313
// 1. Contextual keywords, which have meaning only in specific places. They’re

packages/core/pubspec.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ documentation: https://github.com/FlutterGen/flutter_gen
77
issue_tracker: https://github.com/FlutterGen/flutter_gen/issues
88

99
environment:
10-
sdk: ^3.0.0
10+
sdk: ^3.4.0
1111

1212
version_gen:
1313
path: lib/
@@ -24,7 +24,7 @@ dependencies:
2424
json_annotation: ^4.4.0
2525
glob: ^2.0.0
2626

27-
dart_style: '>=2.3.7 <4.0.0'
27+
dart_style: ^3.0.0
2828
archive: '>=3.4.0 <5.0.0'
2929
args: ^2.0.0
3030
pub_semver: ^2.0.0

packages/core/test/assets_gen_test.dart

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import 'dart:io';
22

3-
import 'package:dart_style/dart_style.dart';
43
import 'package:dartx/dartx.dart';
54
import 'package:flutter_gen_core/generators/assets_generator.dart';
65
import 'package:flutter_gen_core/generators/generator_helper.dart';
76
import 'package:flutter_gen_core/settings/asset_type.dart';
87
import 'package:flutter_gen_core/settings/config.dart';
98
import 'package:flutter_gen_core/utils/error.dart';
9+
import 'package:flutter_gen_core/utils/formatter.dart';
1010
import 'package:flutter_gen_core/utils/string.dart';
1111
import 'package:test/test.dart';
1212

@@ -59,11 +59,7 @@ void main() {
5959
test('Assets with No lists on pubspec.yaml', () async {
6060
final pubspec = File('test_resources/pubspec_assets_no_list.yaml');
6161
final config = loadPubspecConfig(pubspec);
62-
final formatter = DartFormatter(
63-
languageVersion: dartFormatterLanguageVersion,
64-
pageWidth: config.pubspec.flutterGen.lineLength,
65-
lineEnding: '\n',
66-
);
62+
final formatter = buildDartFormatterFromConfig(config);
6763

6864
expect(
6965
() => generateAssets(

packages/core/test/colors_gen_test.dart

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:io';
22

3-
import 'package:dart_style/dart_style.dart';
43
import 'package:flutter_gen_core/generators/colors_generator.dart';
54
import 'package:flutter_gen_core/settings/color_path.dart';
65
import 'package:flutter_gen_core/settings/config.dart';
76
import 'package:flutter_gen_core/utils/error.dart';
7+
import 'package:flutter_gen_core/utils/formatter.dart';
88
import 'package:test/test.dart';
99

1010
import 'gen_test_helper.dart';
@@ -22,11 +22,7 @@ void main() {
2222
test('Wrong colors settings on pubspec.yaml', () async {
2323
final pubspec = File('test_resources/pubspec_colors_no_inputs.yaml');
2424
final config = loadPubspecConfig(pubspec);
25-
final formatter = DartFormatter(
26-
languageVersion: dartFormatterLanguageVersion,
27-
pageWidth: config.pubspec.flutterGen.lineLength,
28-
lineEnding: '\n',
29-
);
25+
final formatter = buildDartFormatterFromConfig(config);
3026

3127
expect(
3228
() => generateColors(
@@ -41,11 +37,7 @@ void main() {
4137
test('Wrong colors settings on pubspec.yaml', () async {
4238
final pubspec = File('test_resources/pubspec_colors_no_inputs_list.yaml');
4339
final config = loadPubspecConfig(pubspec);
44-
final formatter = DartFormatter(
45-
languageVersion: dartFormatterLanguageVersion,
46-
pageWidth: config.pubspec.flutterGen.lineLength,
47-
lineEnding: '\n',
48-
);
40+
final formatter = buildDartFormatterFromConfig(config);
4941

5042
expect(
5143
() {

0 commit comments

Comments
 (0)