Unverified Commit 53c7ca7d authored by Amir Hardon's avatar Amir Hardon Committed by GitHub

Allow unknown fields in pubspec plugin section (#45303)

parent 6b66d794
...@@ -151,15 +151,25 @@ class Plugin { ...@@ -151,15 +151,25 @@ class Plugin {
} }
static List<String> validatePluginYaml(YamlMap yaml) { static List<String> validatePluginYaml(YamlMap yaml) {
if (yaml.containsKey('platforms')) {
final int numKeys = yaml.keys.toSet().length; final bool usesOldPluginFormat = const <String>{
if (numKeys != 1) { 'androidPackage',
return <String>[ 'iosPrefix',
'Invalid plugin specification. There must be only one key: "platforms", found multiple: ${yaml.keys.join(',')}', 'pluginClass',
]; }.any(yaml.containsKey);
} else {
return _validateMultiPlatformYaml(yaml['platforms'] as YamlMap); final bool usesNewPluginFormat = yaml.containsKey('platforms');
if (usesOldPluginFormat && usesNewPluginFormat) {
const String errorMessage =
'The flutter.plugin.platforms key cannot be used in combination with the old'
'flutter.plugin.{androidPackage,iosPrefix,pluginClass} keys.'
'See: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin';
return <String>[errorMessage];
} }
if (usesNewPluginFormat) {
return _validateMultiPlatformYaml(yaml['platforms'] as YamlMap);
} else { } else {
return _validateLegacyYaml(yaml); return _validateLegacyYaml(yaml);
} }
......
...@@ -78,5 +78,52 @@ void main() { ...@@ -78,5 +78,52 @@ void main() {
expect(webPlugin.fileName, 'web_plugin.dart'); expect(webPlugin.fileName, 'web_plugin.dart');
expect(windowsPlugin.pluginClass, 'WinSamplePlugin'); expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
}); });
test('Unknown fields are allowed (allows some future compatibility)', () {
const String pluginYamlRaw = 'implements: same_plugin\n' // this should be ignored by the tool
'platforms:\n'
' android:\n'
' package: com.flutter.dev\n'
' pluginClass: ASamplePlugin\n'
' anUnknownField: ASamplePlugin\n' // this should be ignored by the tool
' ios:\n'
' pluginClass: ISamplePlugin\n'
' linux:\n'
' pluginClass: LSamplePlugin\n'
' macos:\n'
' pluginClass: MSamplePlugin\n'
' web:\n'
' pluginClass: WebSamplePlugin\n'
' fileName: web_plugin.dart\n'
' windows:\n'
' pluginClass: WinSamplePlugin\n';
final dynamic pluginYaml = loadYaml(pluginYamlRaw);
final Plugin plugin =
Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml);
final AndroidPlugin androidPlugin =
plugin.platforms[AndroidPlugin.kConfigKey];
final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey];
final LinuxPlugin linuxPlugin =
plugin.platforms[LinuxPlugin.kConfigKey];
final MacOSPlugin macOSPlugin =
plugin.platforms[MacOSPlugin.kConfigKey];
final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey];
final WindowsPlugin windowsPlugin =
plugin.platforms[WindowsPlugin.kConfigKey];
final String androidPluginClass = androidPlugin.pluginClass;
final String iosPluginClass = iosPlugin.pluginClass;
expect(iosPluginClass, 'ISamplePlugin');
expect(androidPluginClass, 'ASamplePlugin');
expect(iosPlugin.classPrefix, '');
expect(androidPlugin.package, 'com.flutter.dev');
expect(linuxPlugin.pluginClass, 'LSamplePlugin');
expect(macOSPlugin.pluginClass, 'MSamplePlugin');
expect(webPlugin.pluginClass, 'WebSamplePlugin');
expect(webPlugin.fileName, 'web_plugin.dart');
expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
});
}); });
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment