From e1e7387c73e928c4c05b6d73ce09a52f7cbf003e Mon Sep 17 00:00:00 2001 From: clueless <14300910+theClueless@users.noreply.github.com> Date: Sat, 22 Feb 2020 11:02:07 +0200 Subject: [PATCH] create query builder and re-enable tests. make the plugin manager plugin data the source for disabled plugins --- Plugins/Wox.Plugin.PluginIndicator/Main.cs | 3 +- Wox.Core/Plugin/PluginManager.cs | 31 +---------- Wox.Core/Plugin/QueryBuilder.cs | 50 ++++++++++++++++++ Wox.Core/Wox.Core.csproj | 1 + .../UserSettings/PluginSettings.cs | 8 ++- Wox.Test/QueryBuilderTest.cs | 51 +++++++++++++++++++ Wox.Test/QueryTest.cs | 33 ------------ Wox.Test/Wox.Test.csproj | 2 +- Wox/SettingWindow.xaml.cs | 3 +- Wox/ViewModel/MainViewModel.cs | 5 +- Wox/ViewModel/SettingWindowViewModel.cs | 25 ++------- 11 files changed, 120 insertions(+), 92 deletions(-) create mode 100644 Wox.Core/Plugin/QueryBuilder.cs create mode 100644 Wox.Test/QueryBuilderTest.cs delete mode 100644 Wox.Test/QueryTest.cs diff --git a/Plugins/Wox.Plugin.PluginIndicator/Main.cs b/Plugins/Wox.Plugin.PluginIndicator/Main.cs index 5f9ec07be..54dcf007a 100644 --- a/Plugins/Wox.Plugin.PluginIndicator/Main.cs +++ b/Plugins/Wox.Plugin.PluginIndicator/Main.cs @@ -13,8 +13,7 @@ namespace Wox.Plugin.PluginIndicator var results = from keyword in PluginManager.NonGlobalPlugins.Keys where keyword.StartsWith(query.Terms[0]) let metadata = PluginManager.NonGlobalPlugins[keyword].Metadata - let disabled = PluginManager.Settings.Plugins[metadata.ID].Disabled - where !disabled + where !metadata.Disabled select new Result { Title = keyword, diff --git a/Wox.Core/Plugin/PluginManager.cs b/Wox.Core/Plugin/PluginManager.cs index 27e2d4851..0166690b7 100644 --- a/Wox.Core/Plugin/PluginManager.cs +++ b/Wox.Core/Plugin/PluginManager.cs @@ -120,7 +120,7 @@ namespace Wox.Core.Plugin catch (Exception e) { Log.Exception(nameof(PluginManager), $"Fail to Init plugin: {pair.Metadata.Name}", e); - pair.Metadata.Disabled = true; // TODO: not sure this really disable it later on + pair.Metadata.Disabled = true; failedPlugins.Enqueue(pair); } }); @@ -149,35 +149,6 @@ namespace Wox.Core.Plugin PluginInstaller.Install(path); } - public static Query QueryInit(string text) //todo is that possible to move it into type Query? - { - // replace multiple white spaces with one white space - var terms = text.Split(new[] { Query.TermSeperater }, StringSplitOptions.RemoveEmptyEntries); - var rawQuery = string.Join(Query.TermSeperater, terms); - var actionKeyword = string.Empty; - var search = rawQuery; - var actionParameters = terms.ToList(); - if (terms.Length == 0) return null; - if (NonGlobalPlugins.ContainsKey(terms[0]) && - !Settings.Plugins[NonGlobalPlugins[terms[0]].Metadata.ID].Disabled) - { - actionKeyword = terms[0]; - actionParameters = terms.Skip(1).ToList(); - search = string.Join(Query.TermSeperater, actionParameters.ToArray()); - } - var query = new Query - { - Terms = terms, - RawQuery = rawQuery, - ActionKeyword = actionKeyword, - Search = search, - // Obsolete value initialisation - ActionName = actionKeyword, - ActionParameters = actionParameters - }; - return query; - } - public static List ValidPluginsForQuery(Query query) { if (NonGlobalPlugins.ContainsKey(query.ActionKeyword)) diff --git a/Wox.Core/Plugin/QueryBuilder.cs b/Wox.Core/Plugin/QueryBuilder.cs new file mode 100644 index 000000000..b8ac41988 --- /dev/null +++ b/Wox.Core/Plugin/QueryBuilder.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Wox.Plugin; + +namespace Wox.Core.Plugin +{ + public static class QueryBuilder + { + public static Query Build(string text, Dictionary nonGlobalPlugins) + { + // replace multiple white spaces with one white space + var terms = text.Split(new[] { Query.TermSeperater }, StringSplitOptions.RemoveEmptyEntries); + if (terms.Length == 0) + { // nothing was typed + return null; + } + + var rawQuery = string.Join(Query.TermSeperater, terms); + string actionKeyword, search; + string possibleActionKeyword = terms[0]; + List actionParameters; + if (nonGlobalPlugins.TryGetValue(possibleActionKeyword, out var pluginPair) && !pluginPair.Metadata.Disabled) + { // use non global plugin for query + actionKeyword = possibleActionKeyword; + actionParameters = terms.Skip(1).ToList(); + search = rawQuery.Substring(actionKeyword.Length + 1); + } + else + { // non action keyword + actionKeyword = string.Empty; + actionParameters = terms.ToList(); + search = rawQuery; + } + + var query = new Query + { + Terms = terms, + RawQuery = rawQuery, + ActionKeyword = actionKeyword, + Search = search, + // Obsolete value initialisation + ActionName = actionKeyword, + ActionParameters = actionParameters + }; + + return query; + } + } +} \ No newline at end of file diff --git a/Wox.Core/Wox.Core.csproj b/Wox.Core/Wox.Core.csproj index c1758fdb3..bb5fbdc3c 100644 --- a/Wox.Core/Wox.Core.csproj +++ b/Wox.Core/Wox.Core.csproj @@ -53,6 +53,7 @@ + diff --git a/Wox.Infrastructure/UserSettings/PluginSettings.cs b/Wox.Infrastructure/UserSettings/PluginSettings.cs index c47fe7c15..346d98e53 100644 --- a/Wox.Infrastructure/UserSettings/PluginSettings.cs +++ b/Wox.Infrastructure/UserSettings/PluginSettings.cs @@ -28,7 +28,7 @@ namespace Wox.Infrastructure.UserSettings { ID = metadata.ID, Name = metadata.Name, - ActionKeywords = metadata.ActionKeywords, + ActionKeywords = metadata.ActionKeywords, Disabled = metadata.Disabled }; } @@ -39,7 +39,11 @@ namespace Wox.Infrastructure.UserSettings { public string ID { get; set; } public string Name { get; set; } - public List ActionKeywords { get; set; } + public List ActionKeywords { get; set; } // a reference of the action keywords from plugin manager + + /// + /// Used only to save the state of the plugin in settings + /// public bool Disabled { get; set; } } } diff --git a/Wox.Test/QueryBuilderTest.cs b/Wox.Test/QueryBuilderTest.cs new file mode 100644 index 000000000..0402d2ae8 --- /dev/null +++ b/Wox.Test/QueryBuilderTest.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using NUnit.Framework; +using Wox.Core.Plugin; +using Wox.Plugin; + +namespace Wox.Test +{ + public class QueryBuilderTest + { + [Test] + public void ExclusivePluginQueryTest() + { + var nonGlobalPlugins = new Dictionary + { + {">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List {">"}}}} + }; + + Query q = QueryBuilder.Build("> file.txt file2 file3", nonGlobalPlugins); + + Assert.AreEqual("file.txt file2 file3", q.Search); + Assert.AreEqual(">", q.ActionKeyword); + } + + [Test] + public void ExclusivePluginQueryIgnoreDisabledTest() + { + var nonGlobalPlugins = new Dictionary + { + {">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List {">"}, Disabled = true}}} + }; + + Query q = QueryBuilder.Build("> file.txt file2 file3", nonGlobalPlugins); + + Assert.AreEqual("> file.txt file2 file3", q.Search); + } + + [Test] + public void GenericPluginQueryTest() + { + Query q = QueryBuilder.Build("file.txt file2 file3", new Dictionary()); + + Assert.AreEqual("file.txt file2 file3", q.Search); + Assert.AreEqual("", q.ActionKeyword); + + Assert.AreEqual("file.txt", q.FirstSearch); + Assert.AreEqual("file2", q.SecondSearch); + Assert.AreEqual("file3", q.ThirdSearch); + Assert.AreEqual("file2 file3", q.SecondToEndSearch); + } + } +} diff --git a/Wox.Test/QueryTest.cs b/Wox.Test/QueryTest.cs deleted file mode 100644 index b7a0917ef..000000000 --- a/Wox.Test/QueryTest.cs +++ /dev/null @@ -1,33 +0,0 @@ -using NUnit.Framework; -using Wox.Core.Plugin; -using Wox.Plugin; - -namespace Wox.Test -{ - public class QueryTest - { - [Test] - [Ignore("Current query is tightly integrated with GUI, can't be tested.")] - public void ExclusivePluginQueryTest() - { - Query q = PluginManager.QueryInit("> file.txt file2 file3"); - - Assert.AreEqual(q.FirstSearch, "file.txt"); - Assert.AreEqual(q.SecondSearch, "file2"); - Assert.AreEqual(q.ThirdSearch, "file3"); - Assert.AreEqual(q.SecondToEndSearch, "file2 file3"); - } - - [Test] - [Ignore("Current query is tightly integrated with GUI, can't be tested.")] - public void GenericPluginQueryTest() - { - Query q = PluginManager.QueryInit("file.txt file2 file3"); - - Assert.AreEqual(q.FirstSearch, "file.txt"); - Assert.AreEqual(q.SecondSearch, "file2"); - Assert.AreEqual(q.ThirdSearch, "file3"); - Assert.AreEqual(q.SecondToEndSearch, "file2 file3"); - } - } -} diff --git a/Wox.Test/Wox.Test.csproj b/Wox.Test/Wox.Test.csproj index 7a3ef1f0c..2b1e6a78a 100644 --- a/Wox.Test/Wox.Test.csproj +++ b/Wox.Test/Wox.Test.csproj @@ -45,7 +45,7 @@ - + diff --git a/Wox/SettingWindow.xaml.cs b/Wox/SettingWindow.xaml.cs index 67d67351e..52addf362 100644 --- a/Wox/SettingWindow.xaml.cs +++ b/Wox/SettingWindow.xaml.cs @@ -215,7 +215,8 @@ namespace Wox private void OnPluginToggled(object sender, RoutedEventArgs e) { var id = _viewModel.SelectedPlugin.PluginPair.Metadata.ID; - _settings.PluginSettings.Plugins[id].Disabled = _viewModel.SelectedPlugin.PluginPair.Metadata.Disabled; + // used to sync the current status from the plugin manager into the setting to keep consistency after save + _settings.PluginSettings.Plugins[id].Disabled = _viewModel.SelectedPlugin.PluginPair.Metadata.Disabled; } private void OnPluginActionKeywordsClick(object sender, MouseButtonEventArgs e) diff --git a/Wox/ViewModel/MainViewModel.cs b/Wox/ViewModel/MainViewModel.cs index bd1314a27..acdd7c040 100644 --- a/Wox/ViewModel/MainViewModel.cs +++ b/Wox/ViewModel/MainViewModel.cs @@ -377,7 +377,7 @@ namespace Wox.ViewModel ProgressBarVisibility = Visibility.Hidden; _isQueryRunning = true; - var query = PluginManager.QueryInit(QueryText.Trim()); + var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins); if (query != null) { // handle the exclusiveness of plugin using action keyword @@ -401,8 +401,7 @@ namespace Wox.ViewModel { Parallel.ForEach(plugins, parallelOptions, plugin => { - var config = _settings.PluginSettings.Plugins[plugin.Metadata.ID]; - if (!config.Disabled) + if (!plugin.Metadata.Disabled) { var results = PluginManager.QueryForPlugin(plugin, query); UpdateResultView(results, plugin.Metadata, query); diff --git a/Wox/ViewModel/SettingWindowViewModel.cs b/Wox/ViewModel/SettingWindowViewModel.cs index 923e456b0..ce2c10a20 100644 --- a/Wox/ViewModel/SettingWindowViewModel.cs +++ b/Wox/ViewModel/SettingWindowViewModel.cs @@ -150,26 +150,11 @@ namespace Wox.ViewModel { get { - var plugins = PluginManager.AllPlugins; - var settings = Settings.PluginSettings.Plugins; - plugins.Sort((a, b) => - { - var d1 = settings[a.Metadata.ID].Disabled; - var d2 = settings[b.Metadata.ID].Disabled; - if (d1 == d2) - { - return string.Compare(a.Metadata.Name, b.Metadata.Name, StringComparison.CurrentCulture); - } - else - { - return d1.CompareTo(d2); - } - }); - - var metadatas = plugins.Select(p => new PluginViewModel - { - PluginPair = p, - }).ToList(); + var metadatas = PluginManager.AllPlugins + .OrderBy(x => x.Metadata.Disabled) + .ThenBy(y => y.Metadata.Name) + .Select(p => new PluginViewModel { PluginPair = p}) + .ToList(); return metadatas; } }