Skip to content

Commit

Permalink
Suggest a potential valid name for the flutter project when using `fl…
Browse files Browse the repository at this point in the history
…utter create` (flutter#130900)

Fixes flutter#109775

*If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*
  • Loading branch information
ValentinVignal authored and vashworth committed Aug 2, 2023
1 parent 7e67cdc commit 07119d8
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 4 deletions.
30 changes: 28 additions & 2 deletions packages/flutter_tools/lib/src/commands/create_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -784,12 +784,38 @@ bool isValidPackageName(String name) {
!_keywords.contains(name);
}

/// Returns a potential valid name from the given [name].
///
/// If a valid name cannot be found, returns `null`.
@visibleForTesting
String? potentialValidPackageName(String name){
String newName = name.toLowerCase();
if (newName.startsWith(RegExp(r'[0-9]'))) {
newName = '_$newName';
}
newName = newName.replaceAll('-', '_');
if (isValidPackageName(newName)) {
return newName;
} else {
return null;
}
}

// Return null if the project name is legal. Return a validation message if
// we should disallow the project name.
String? _validateProjectName(String projectName) {
if (!isValidPackageName(projectName)) {
return '"$projectName" is not a valid Dart package name.\n\n'
'See https://dart.dev/tools/pub/pubspec#name for more information.';
final String? potentialValidName = potentialValidPackageName(projectName);

return <String>[
'"$projectName" is not a valid Dart package name.',
'\n\n',
'The name should be all lowercase, with underscores to separate words, "just_like_this".',
'Use only basic Latin letters and Arabic digits: [a-z0-9_].',
"Also, make sure the name is a valid Dart identifier—that it doesn't start with digits and isn't a reserved word.\n",
'See https://dart.dev/tools/pub/pubspec#name for more information.',
if (potentialValidName != null) '\nTry "$potentialValidName" instead.',
].join();
}
if (_packageDependencies.contains(projectName)) {
return "Invalid project name: '$projectName' - this will conflict with Flutter "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -735,10 +735,13 @@ void main() {
testUsingContext('plugin project with invalid custom project name', () async {
expect(
() => _createProject(projectDir,
<String>['--no-pub', '--template=plugin', '--project-name', 'xyz.xyz', '--platforms', 'android,ios',],
<String>['--no-pub', '--template=plugin', '--project-name', 'xyz-xyz', '--platforms', 'android,ios',],
<String>[],
),
throwsToolExit(message: '"xyz.xyz" is not a valid Dart package name.'),
allOf(
throwsToolExit(message: '"xyz-xyz" is not a valid Dart package name.'),
throwsToolExit(message: 'Try "xyz_xyz" instead.'),
),
);
});

Expand Down
12 changes: 12 additions & 0 deletions packages/flutter_tools/test/general.shard/create_config_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,18 @@ void main() {
expect(isValidPackageName('Foo_bar'), false);
});

test('Suggests a valid Pub package name', () {
expect(potentialValidPackageName('92'), '_92');
expect(potentialValidPackageName('a-b-c'), 'a_b_c');


expect(potentialValidPackageName('Foo_bar'), 'foo_bar');
expect(potentialValidPackageName('foo-_bar'), 'foo__bar');

expect(potentialValidPackageName('잘못된 이름'), isNull, reason: 'It should return null if it cannot find a valid name.');

});

test('kWindowsDrivePattern', () {
expect(CreateBase.kWindowsDrivePattern.hasMatch(r'D:\'), isFalse);
expect(CreateBase.kWindowsDrivePattern.hasMatch(r'z:\'), isFalse);
Expand Down

0 comments on commit 07119d8

Please sign in to comment.