mirror of
https://github.com/microsoft/PowerToys.git
synced 2024-12-13 19:19:23 +08:00
Merge pull request #145 from jjw24/pluginInitFail
plugin init fail continue - create query builder and re-enable tests.
This commit is contained in:
commit
e5cc2ccaab
@ -13,8 +13,7 @@ namespace Wox.Plugin.PluginIndicator
|
|||||||
var results = from keyword in PluginManager.NonGlobalPlugins.Keys
|
var results = from keyword in PluginManager.NonGlobalPlugins.Keys
|
||||||
where keyword.StartsWith(query.Terms[0])
|
where keyword.StartsWith(query.Terms[0])
|
||||||
let metadata = PluginManager.NonGlobalPlugins[keyword].Metadata
|
let metadata = PluginManager.NonGlobalPlugins[keyword].Metadata
|
||||||
let disabled = PluginManager.Settings.Plugins[metadata.ID].Disabled
|
where !metadata.Disabled
|
||||||
where !disabled
|
|
||||||
select new Result
|
select new Result
|
||||||
{
|
{
|
||||||
Title = keyword,
|
Title = keyword,
|
||||||
|
@ -120,7 +120,7 @@ namespace Wox.Core.Plugin
|
|||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Log.Exception(nameof(PluginManager), $"Fail to Init plugin: {pair.Metadata.Name}", 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);
|
failedPlugins.Enqueue(pair);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -149,35 +149,6 @@ namespace Wox.Core.Plugin
|
|||||||
PluginInstaller.Install(path);
|
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<PluginPair> ValidPluginsForQuery(Query query)
|
public static List<PluginPair> ValidPluginsForQuery(Query query)
|
||||||
{
|
{
|
||||||
if (NonGlobalPlugins.ContainsKey(query.ActionKeyword))
|
if (NonGlobalPlugins.ContainsKey(query.ActionKeyword))
|
||||||
|
50
Wox.Core/Plugin/QueryBuilder.cs
Normal file
50
Wox.Core/Plugin/QueryBuilder.cs
Normal file
@ -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<string, PluginPair> 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<string> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -53,6 +53,7 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Plugin\ExecutablePlugin.cs" />
|
<Compile Include="Plugin\ExecutablePlugin.cs" />
|
||||||
<Compile Include="Plugin\PluginsLoader.cs" />
|
<Compile Include="Plugin\PluginsLoader.cs" />
|
||||||
|
<Compile Include="Plugin\QueryBuilder.cs" />
|
||||||
<Compile Include="Updater.cs" />
|
<Compile Include="Updater.cs" />
|
||||||
<Compile Include="Resource\AvailableLanguages.cs" />
|
<Compile Include="Resource\AvailableLanguages.cs" />
|
||||||
<Compile Include="Resource\Internationalization.cs" />
|
<Compile Include="Resource\Internationalization.cs" />
|
||||||
|
@ -39,7 +39,11 @@ namespace Wox.Infrastructure.UserSettings
|
|||||||
{
|
{
|
||||||
public string ID { get; set; }
|
public string ID { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public List<string> ActionKeywords { get; set; }
|
public List<string> ActionKeywords { get; set; } // a reference of the action keywords from plugin manager
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used only to save the state of the plugin in settings
|
||||||
|
/// </summary>
|
||||||
public bool Disabled { get; set; }
|
public bool Disabled { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
51
Wox.Test/QueryBuilderTest.cs
Normal file
51
Wox.Test/QueryBuilderTest.cs
Normal file
@ -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<string, PluginPair>
|
||||||
|
{
|
||||||
|
{">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List<string> {">"}}}}
|
||||||
|
};
|
||||||
|
|
||||||
|
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<string, PluginPair>
|
||||||
|
{
|
||||||
|
{">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List<string> {">"}, 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<string, PluginPair>());
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -45,7 +45,7 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="FuzzyMatcherTest.cs" />
|
<Compile Include="FuzzyMatcherTest.cs" />
|
||||||
<Compile Include="Plugins\PluginInitTest.cs" />
|
<Compile Include="Plugins\PluginInitTest.cs" />
|
||||||
<Compile Include="QueryTest.cs" />
|
<Compile Include="QueryBuilderTest.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="UrlPluginTest.cs" />
|
<Compile Include="UrlPluginTest.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -215,6 +215,7 @@ namespace Wox
|
|||||||
private void OnPluginToggled(object sender, RoutedEventArgs e)
|
private void OnPluginToggled(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var id = _viewModel.SelectedPlugin.PluginPair.Metadata.ID;
|
var id = _viewModel.SelectedPlugin.PluginPair.Metadata.ID;
|
||||||
|
// 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;
|
_settings.PluginSettings.Plugins[id].Disabled = _viewModel.SelectedPlugin.PluginPair.Metadata.Disabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +377,7 @@ namespace Wox.ViewModel
|
|||||||
|
|
||||||
ProgressBarVisibility = Visibility.Hidden;
|
ProgressBarVisibility = Visibility.Hidden;
|
||||||
_isQueryRunning = true;
|
_isQueryRunning = true;
|
||||||
var query = PluginManager.QueryInit(QueryText.Trim());
|
var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins);
|
||||||
if (query != null)
|
if (query != null)
|
||||||
{
|
{
|
||||||
// handle the exclusiveness of plugin using action keyword
|
// handle the exclusiveness of plugin using action keyword
|
||||||
@ -401,8 +401,7 @@ namespace Wox.ViewModel
|
|||||||
{
|
{
|
||||||
Parallel.ForEach(plugins, parallelOptions, plugin =>
|
Parallel.ForEach(plugins, parallelOptions, plugin =>
|
||||||
{
|
{
|
||||||
var config = _settings.PluginSettings.Plugins[plugin.Metadata.ID];
|
if (!plugin.Metadata.Disabled)
|
||||||
if (!config.Disabled)
|
|
||||||
{
|
{
|
||||||
var results = PluginManager.QueryForPlugin(plugin, query);
|
var results = PluginManager.QueryForPlugin(plugin, query);
|
||||||
UpdateResultView(results, plugin.Metadata, query);
|
UpdateResultView(results, plugin.Metadata, query);
|
||||||
|
@ -150,26 +150,11 @@ namespace Wox.ViewModel
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var plugins = PluginManager.AllPlugins;
|
var metadatas = PluginManager.AllPlugins
|
||||||
var settings = Settings.PluginSettings.Plugins;
|
.OrderBy(x => x.Metadata.Disabled)
|
||||||
plugins.Sort((a, b) =>
|
.ThenBy(y => y.Metadata.Name)
|
||||||
{
|
.Select(p => new PluginViewModel { PluginPair = p})
|
||||||
var d1 = settings[a.Metadata.ID].Disabled;
|
.ToList();
|
||||||
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();
|
|
||||||
return metadatas;
|
return metadatas;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user