Skip to content

Commit 336aa26

Browse files
authored
[flutter_tools] General info project validator (#103653)
1 parent 680bc17 commit 336aa26

File tree

4 files changed

+151
-5
lines changed

4 files changed

+151
-5
lines changed

packages/flutter_tools/lib/src/flutter_manifest.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ class FlutterManifest {
6969
/// A map representation of the `flutter` section in the `pubspec.yaml` file.
7070
Map<String, Object?> _flutterDescriptor = <String, Object?>{};
7171

72+
Map<String, Object?> get flutterDescriptor => _flutterDescriptor;
73+
7274
/// True if the `pubspec.yaml` file does not exist.
7375
bool get isEmpty => _descriptor.isEmpty;
7476

packages/flutter_tools/lib/src/project_validator.dart

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'flutter_manifest.dart';
56
import 'project.dart';
67
import 'project_validator_result.dart';
78

@@ -11,7 +12,100 @@ abstract class ProjectValidator {
1112
/// Can return more than one result in case a file/command have a lot of info to share to the user
1213
Future<List<ProjectValidatorResult>> start(FlutterProject project);
1314
/// new ProjectValidators should be added here for the ValidateProjectCommand to run
14-
static const List <ProjectValidator> allProjectValidators = <ProjectValidator>[
15-
// TODO(jasguerrero): add validators
15+
static List <ProjectValidator> allProjectValidators = <ProjectValidator>[
16+
GeneralInfoProjectValidator(),
1617
];
1718
}
19+
20+
/// Validator run for all platforms that extract information from the pubspec.yaml.
21+
///
22+
/// Specific info from different platforms should be written in their own ProjectValidator.
23+
class GeneralInfoProjectValidator extends ProjectValidator{
24+
@override
25+
Future<List<ProjectValidatorResult>> start(FlutterProject project) async {
26+
final FlutterManifest flutterManifest = project.manifest;
27+
final List<ProjectValidatorResult> result = <ProjectValidatorResult>[];
28+
final ProjectValidatorResult appNameValidatorResult = _getAppNameResult(flutterManifest);
29+
result.add(appNameValidatorResult);
30+
final String supportedPlatforms = _getSupportedPlatforms(project);
31+
if (supportedPlatforms.isEmpty) {
32+
return result;
33+
}
34+
final ProjectValidatorResult supportedPlatformsResult = ProjectValidatorResult(
35+
name: 'Supported Platforms',
36+
value: supportedPlatforms,
37+
status: StatusProjectValidator.success
38+
);
39+
final ProjectValidatorResult isFlutterPackage = _isFlutterPackageValidatorResult(flutterManifest);
40+
result.addAll(<ProjectValidatorResult>[supportedPlatformsResult, isFlutterPackage]);
41+
if (flutterManifest.flutterDescriptor.isNotEmpty) {
42+
result.add(_materialDesignResult(flutterManifest));
43+
result.add(_pluginValidatorResult(flutterManifest));
44+
}
45+
return result;
46+
}
47+
48+
ProjectValidatorResult _getAppNameResult(FlutterManifest flutterManifest) {
49+
final String appName = flutterManifest.appName;
50+
const String name = 'App Name';
51+
if (appName.isEmpty) {
52+
return const ProjectValidatorResult(
53+
name: name,
54+
value: 'name not found',
55+
status: StatusProjectValidator.error
56+
);
57+
}
58+
return ProjectValidatorResult(
59+
name: name,
60+
value: appName,
61+
status: StatusProjectValidator.success
62+
);
63+
}
64+
65+
ProjectValidatorResult _isFlutterPackageValidatorResult(FlutterManifest flutterManifest) {
66+
final String value;
67+
final StatusProjectValidator status;
68+
if (flutterManifest.flutterDescriptor.isNotEmpty) {
69+
value = 'yes';
70+
status = StatusProjectValidator.success;
71+
} else {
72+
value = 'no';
73+
status = StatusProjectValidator.warning;
74+
}
75+
76+
return ProjectValidatorResult(
77+
name: 'Is Flutter Package',
78+
value: value,
79+
status: status
80+
);
81+
}
82+
83+
ProjectValidatorResult _materialDesignResult(FlutterManifest flutterManifest) {
84+
return ProjectValidatorResult(
85+
name: 'Uses Material Design',
86+
value: flutterManifest.usesMaterialDesign? 'yes' : 'no',
87+
status: StatusProjectValidator.success
88+
);
89+
}
90+
91+
String _getSupportedPlatforms(FlutterProject project) {
92+
return project.getSupportedPlatforms().map((SupportedPlatform platform) => platform.name).join(', ');
93+
}
94+
95+
ProjectValidatorResult _pluginValidatorResult(FlutterManifest flutterManifest) {
96+
return ProjectValidatorResult(
97+
name: 'Is Plugin',
98+
value: flutterManifest.isPlugin? 'yes' : 'no',
99+
status: StatusProjectValidator.success
100+
);
101+
}
102+
103+
@override
104+
bool supportsProject(FlutterProject project) {
105+
// this validator will run for any type of project
106+
return true;
107+
}
108+
109+
@override
110+
String get title => 'General Info';
111+
}

packages/flutter_tools/test/commands.shard/hermetic/project_validator_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import '../../src/test_flutter_command_runner.dart';
1818

1919
class ProjectValidatorDummy extends ProjectValidator {
2020
@override
21-
Future<List<ProjectValidatorResult>> start(FlutterProject project) async{
21+
Future<List<ProjectValidatorResult>> start(FlutterProject project, {Logger logger, FileSystem fileSystem}) async{
2222
return <ProjectValidatorResult>[
2323
const ProjectValidatorResult(name: 'pass', value: 'value', status: StatusProjectValidator.success),
2424
const ProjectValidatorResult(name: 'fail', value: 'my error', status: StatusProjectValidator.error),
@@ -37,7 +37,7 @@ class ProjectValidatorDummy extends ProjectValidator {
3737

3838
class ProjectValidatorSecondDummy extends ProjectValidator {
3939
@override
40-
Future<List<ProjectValidatorResult>> start(FlutterProject project) async{
40+
Future<List<ProjectValidatorResult>> start(FlutterProject project, {Logger logger, FileSystem fileSystem}) async{
4141
return <ProjectValidatorResult>[
4242
const ProjectValidatorResult(name: 'second', value: 'pass', status: StatusProjectValidator.success),
4343
const ProjectValidatorResult(name: 'other fail', value: 'second fail', status: StatusProjectValidator.error),
@@ -55,7 +55,7 @@ class ProjectValidatorSecondDummy extends ProjectValidator {
5555

5656
class ProjectValidatorCrash extends ProjectValidator {
5757
@override
58-
Future<List<ProjectValidatorResult>> start(FlutterProject project) async{
58+
Future<List<ProjectValidatorResult>> start(FlutterProject project, {Logger logger, FileSystem fileSystem}) async{
5959
throw Exception('my exception');
6060
}
6161

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2014 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
// @dart = 2.8
6+
7+
import 'package:args/command_runner.dart';
8+
import 'package:flutter_tools/src/base/file_system.dart';
9+
import 'package:flutter_tools/src/base/logger.dart';
10+
import 'package:flutter_tools/src/commands/validate_project.dart';
11+
import 'package:flutter_tools/src/globals.dart' as globals;
12+
import 'package:flutter_tools/src/project_validator.dart';
13+
14+
import '../src/context.dart';
15+
import '../src/test_flutter_command_runner.dart';
16+
17+
void main() {
18+
FileSystem fileSystem;
19+
20+
group('analyze project command', () {
21+
22+
setUp(() {
23+
fileSystem = globals.localFileSystem;
24+
});
25+
26+
testUsingContext('General Info Project Validator', () async {
27+
final BufferLogger loggerTest = BufferLogger.test();
28+
final ValidateProjectCommand command = ValidateProjectCommand(
29+
fileSystem: fileSystem,
30+
logger: loggerTest,
31+
allProjectValidators: <ProjectValidator>[GeneralInfoProjectValidator()]
32+
);
33+
final CommandRunner<void> runner = createTestCommandRunner(command);
34+
35+
await runner.run(<String>['validate-project', '../../dev/integration_tests/flutter_gallery']);
36+
37+
const String expected = '\n'
38+
'┌────────────────────────────────────────────────────────────────────────────┐\n'
39+
'│ General Info │\n'
40+
'│ [✓] App Name: flutter_gallery │\n'
41+
'│ [✓] Supported Platforms: android, ios, web, macos, linux, windows, fuchsia │\n'
42+
'│ [✓] Is Flutter Package: yes │\n'
43+
'│ [✓] Uses Material Design: yes │\n'
44+
'│ [✓] Is Plugin: no │\n'
45+
'└────────────────────────────────────────────────────────────────────────────┘\n';
46+
47+
expect(loggerTest.statusText, contains(expected));
48+
});
49+
});
50+
}

0 commit comments

Comments
 (0)