Skip to content

Commit d3127b7

Browse files
authored
Merge pull request #230 from taooceros/PluginAPIExpand
Expand Plugin API
2 parents 0c5d166 + e31bef7 commit d3127b7

File tree

10 files changed

+171
-117
lines changed

10 files changed

+171
-117
lines changed

Flow.Launcher.Infrastructure/StringMatcher.cs

Lines changed: 1 addition & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
using Flow.Launcher.Plugin.SharedModels;
12
using System;
23
using System.Collections.Generic;
3-
using System.ComponentModel;
44
using System.Linq;
5-
using static Flow.Launcher.Infrastructure.StringMatcher;
65

76
namespace Flow.Launcher.Infrastructure
87
{
@@ -239,74 +238,6 @@ private static int CalculateSearchScore(string query, string stringToCompare, in
239238

240239
return score;
241240
}
242-
243-
public enum SearchPrecisionScore
244-
{
245-
Regular = 50,
246-
Low = 20,
247-
None = 0
248-
}
249-
}
250-
251-
public class MatchResult
252-
{
253-
public MatchResult(bool success, SearchPrecisionScore searchPrecision)
254-
{
255-
Success = success;
256-
SearchPrecision = searchPrecision;
257-
}
258-
259-
public MatchResult(bool success, SearchPrecisionScore searchPrecision, List<int> matchData, int rawScore)
260-
{
261-
Success = success;
262-
SearchPrecision = searchPrecision;
263-
MatchData = matchData;
264-
RawScore = rawScore;
265-
}
266-
267-
public bool Success { get; set; }
268-
269-
/// <summary>
270-
/// The final score of the match result with search precision filters applied.
271-
/// </summary>
272-
public int Score { get; private set; }
273-
274-
/// <summary>
275-
/// The raw calculated search score without any search precision filtering applied.
276-
/// </summary>
277-
private int _rawScore;
278-
279-
public int RawScore
280-
{
281-
get { return _rawScore; }
282-
set
283-
{
284-
_rawScore = value;
285-
Score = ScoreAfterSearchPrecisionFilter(_rawScore);
286-
}
287-
}
288-
289-
/// <summary>
290-
/// Matched data to highlight.
291-
/// </summary>
292-
public List<int> MatchData { get; set; }
293-
294-
public SearchPrecisionScore SearchPrecision { get; set; }
295-
296-
public bool IsSearchPrecisionScoreMet()
297-
{
298-
return IsSearchPrecisionScoreMet(_rawScore);
299-
}
300-
301-
private bool IsSearchPrecisionScoreMet(int rawScore)
302-
{
303-
return rawScore >= (int)SearchPrecision;
304-
}
305-
306-
private int ScoreAfterSearchPrecisionFilter(int rawScore)
307-
{
308-
return IsSearchPrecisionScoreMet(rawScore) ? rawScore : 0;
309-
}
310241
}
311242

312243
public class MatchOption

Flow.Launcher.Infrastructure/UserSettings/Settings.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Drawing;
44
using System.Text.Json.Serialization;
55
using Flow.Launcher.Plugin;
6+
using Flow.Launcher.Plugin.SharedModels;
67

78
namespace Flow.Launcher.Infrastructure.UserSettings
89
{
@@ -38,7 +39,7 @@ public string Language
3839
/// </summary>
3940
public bool ShouldUsePinyin { get; set; } = false;
4041

41-
internal StringMatcher.SearchPrecisionScore QuerySearchPrecision { get; private set; } = StringMatcher.SearchPrecisionScore.Regular;
42+
internal SearchPrecisionScore QuerySearchPrecision { get; private set; } = SearchPrecisionScore.Regular;
4243

4344
[JsonIgnore]
4445
public string QuerySearchPrecisionString
@@ -48,8 +49,8 @@ public string QuerySearchPrecisionString
4849
{
4950
try
5051
{
51-
var precisionScore = (StringMatcher.SearchPrecisionScore)Enum
52-
.Parse(typeof(StringMatcher.SearchPrecisionScore), value);
52+
var precisionScore = (SearchPrecisionScore)Enum
53+
.Parse(typeof(SearchPrecisionScore), value);
5354

5455
QuerySearchPrecision = precisionScore;
5556
StringMatcher.Instance.UserSettingSearchPrecision = precisionScore;
@@ -58,8 +59,8 @@ public string QuerySearchPrecisionString
5859
{
5960
Logger.Log.Exception(nameof(Settings), "Failed to load QuerySearchPrecisionString value from Settings file", e);
6061

61-
QuerySearchPrecision = StringMatcher.SearchPrecisionScore.Regular;
62-
StringMatcher.Instance.UserSettingSearchPrecision = StringMatcher.SearchPrecisionScore.Regular;
62+
QuerySearchPrecision = SearchPrecisionScore.Regular;
63+
StringMatcher.Instance.UserSettingSearchPrecision = SearchPrecisionScore.Regular;
6364

6465
throw;
6566
}

Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
1+
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
22

33
<PropertyGroup>
44
<TargetFramework>netcoreapp3.1</TargetFramework>

Flow.Launcher.Plugin/IPublicAPI.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
using System;
1+
using Flow.Launcher.Plugin.SharedModels;
2+
using JetBrains.Annotations;
3+
using System;
24
using System.Collections.Generic;
5+
using System.IO;
6+
using System.Threading;
37
using System.Threading.Tasks;
48

59
namespace Flow.Launcher.Plugin
@@ -83,5 +87,18 @@ public interface IPublicAPI
8387
/// if you want to hook something like Ctrl+R, you should use this event
8488
/// </summary>
8589
event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
90+
91+
MatchResult FuzzySearch(string query, string stringToCompare);
92+
93+
Task<string> HttpGetStringAsync(string url, CancellationToken token = default);
94+
95+
Task<Stream> HttpGetStreamAsync(string url, CancellationToken token = default);
96+
97+
Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath);
98+
99+
void AddActionKeyword(string pluginId, string newActionKeyword);
100+
101+
void RemoveActionKeyword(string pluginId, string oldActionKeyword);
102+
86103
}
87104
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System.Collections.Generic;
2+
3+
namespace Flow.Launcher.Plugin.SharedModels
4+
{
5+
public class MatchResult
6+
{
7+
public MatchResult(bool success, SearchPrecisionScore searchPrecision)
8+
{
9+
Success = success;
10+
SearchPrecision = searchPrecision;
11+
}
12+
13+
public MatchResult(bool success, SearchPrecisionScore searchPrecision, List<int> matchData, int rawScore)
14+
{
15+
Success = success;
16+
SearchPrecision = searchPrecision;
17+
MatchData = matchData;
18+
RawScore = rawScore;
19+
}
20+
21+
public bool Success { get; set; }
22+
23+
/// <summary>
24+
/// The final score of the match result with search precision filters applied.
25+
/// </summary>
26+
public int Score { get; private set; }
27+
28+
/// <summary>
29+
/// The raw calculated search score without any search precision filtering applied.
30+
/// </summary>
31+
private int _rawScore;
32+
33+
public int RawScore
34+
{
35+
get { return _rawScore; }
36+
set
37+
{
38+
_rawScore = value;
39+
Score = ScoreAfterSearchPrecisionFilter(_rawScore);
40+
}
41+
}
42+
43+
/// <summary>
44+
/// Matched data to highlight.
45+
/// </summary>
46+
public List<int> MatchData { get; set; }
47+
48+
public SearchPrecisionScore SearchPrecision { get; set; }
49+
50+
public bool IsSearchPrecisionScoreMet()
51+
{
52+
return IsSearchPrecisionScoreMet(_rawScore);
53+
}
54+
55+
private bool IsSearchPrecisionScoreMet(int rawScore)
56+
{
57+
return rawScore >= (int)SearchPrecision;
58+
}
59+
60+
private int ScoreAfterSearchPrecisionFilter(int rawScore)
61+
{
62+
return IsSearchPrecisionScoreMet(rawScore) ? rawScore : 0;
63+
}
64+
}
65+
66+
public enum SearchPrecisionScore
67+
{
68+
Regular = 50,
69+
Low = 20,
70+
None = 0
71+
}
72+
}

Flow.Launcher.Test/FuzzyMatcherTest.cs

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using NUnit.Framework;
66
using Flow.Launcher.Infrastructure;
77
using Flow.Launcher.Plugin;
8+
using Flow.Launcher.Plugin.SharedModels;
89

910
namespace Flow.Launcher.Test
1011
{
@@ -37,8 +38,8 @@ public List<int> GetPrecisionScores()
3738
{
3839
var listToReturn = new List<int>();
3940

40-
Enum.GetValues(typeof(StringMatcher.SearchPrecisionScore))
41-
.Cast<StringMatcher.SearchPrecisionScore>()
41+
Enum.GetValues(typeof(SearchPrecisionScore))
42+
.Cast<SearchPrecisionScore>()
4243
.ToList()
4344
.ForEach(x => listToReturn.Add((int)x));
4445

@@ -145,20 +146,20 @@ public void WhenGivenQueryString_ThenShouldReturn_TheDesiredScoring(
145146
$"Expected score for compare string '{compareString}': {expectedScore}, Actual: {rawScore}");
146147
}
147148

148-
[TestCase("goo", "Google Chrome", StringMatcher.SearchPrecisionScore.Regular, true)]
149-
[TestCase("chr", "Google Chrome", StringMatcher.SearchPrecisionScore.Low, true)]
150-
[TestCase("chr", "Chrome", StringMatcher.SearchPrecisionScore.Regular, true)]
151-
[TestCase("chr", "Help cure hope raise on mind entity Chrome", StringMatcher.SearchPrecisionScore.Regular, false)]
152-
[TestCase("chr", "Help cure hope raise on mind entity Chrome", StringMatcher.SearchPrecisionScore.Low, true)]
153-
[TestCase("chr", "Candy Crush Saga from King", StringMatcher.SearchPrecisionScore.Regular, false)]
154-
[TestCase("chr", "Candy Crush Saga from King", StringMatcher.SearchPrecisionScore.None, true)]
155-
[TestCase("ccs", "Candy Crush Saga from King", StringMatcher.SearchPrecisionScore.Low, true)]
156-
[TestCase("cand", "Candy Crush Saga from King",StringMatcher.SearchPrecisionScore.Regular, true)]
157-
[TestCase("cand", "Help cure hope raise on mind entity Chrome", StringMatcher.SearchPrecisionScore.Regular, false)]
149+
[TestCase("goo", "Google Chrome", SearchPrecisionScore.Regular, true)]
150+
[TestCase("chr", "Google Chrome", SearchPrecisionScore.Low, true)]
151+
[TestCase("chr", "Chrome", SearchPrecisionScore.Regular, true)]
152+
[TestCase("chr", "Help cure hope raise on mind entity Chrome", SearchPrecisionScore.Regular, false)]
153+
[TestCase("chr", "Help cure hope raise on mind entity Chrome", SearchPrecisionScore.Low, true)]
154+
[TestCase("chr", "Candy Crush Saga from King", SearchPrecisionScore.Regular, false)]
155+
[TestCase("chr", "Candy Crush Saga from King", SearchPrecisionScore.None, true)]
156+
[TestCase("ccs", "Candy Crush Saga from King", SearchPrecisionScore.Low, true)]
157+
[TestCase("cand", "Candy Crush Saga from King",SearchPrecisionScore.Regular, true)]
158+
[TestCase("cand", "Help cure hope raise on mind entity Chrome", SearchPrecisionScore.Regular, false)]
158159
public void WhenGivenDesiredPrecision_ThenShouldReturn_AllResultsGreaterOrEqual(
159160
string queryString,
160161
string compareString,
161-
StringMatcher.SearchPrecisionScore expectedPrecisionScore,
162+
SearchPrecisionScore expectedPrecisionScore,
162163
bool expectedPrecisionResult)
163164
{
164165
// When
@@ -182,32 +183,32 @@ public void WhenGivenDesiredPrecision_ThenShouldReturn_AllResultsGreaterOrEqual(
182183
$"Precision Score: {(int)expectedPrecisionScore}");
183184
}
184185

185-
[TestCase("exce", "OverLeaf-Latex: An online LaTeX editor", StringMatcher.SearchPrecisionScore.Regular, false)]
186-
[TestCase("term", "Windows Terminal (Preview)", StringMatcher.SearchPrecisionScore.Regular, true)]
187-
[TestCase("sql s managa", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, false)]
188-
[TestCase("sql' s manag", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, false)]
189-
[TestCase("sql s manag", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, true)]
190-
[TestCase("sql manag", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, true)]
191-
[TestCase("sql", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, true)]
192-
[TestCase("sql serv", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, true)]
193-
[TestCase("servez", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, false)]
194-
[TestCase("sql servz", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, false)]
195-
[TestCase("sql serv man", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, true)]
196-
[TestCase("sql studio", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, true)]
197-
[TestCase("mic", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, true)]
198-
[TestCase("chr", "Shutdown", StringMatcher.SearchPrecisionScore.Regular, false)]
199-
[TestCase("mssms", MicrosoftSqlServerManagementStudio, StringMatcher.SearchPrecisionScore.Regular, false)]
200-
[TestCase("chr", "Change settings for text-to-speech and for speech recognition (if installed).", StringMatcher.SearchPrecisionScore.Regular, false)]
201-
[TestCase("ch r", "Change settings for text-to-speech and for speech recognition (if installed).", StringMatcher.SearchPrecisionScore.Regular, true)]
202-
[TestCase("a test", "This is a test", StringMatcher.SearchPrecisionScore.Regular, true)]
203-
[TestCase("test", "This is a test", StringMatcher.SearchPrecisionScore.Regular, true)]
204-
[TestCase("cod", VisualStudioCode, StringMatcher.SearchPrecisionScore.Regular, true)]
205-
[TestCase("code", VisualStudioCode, StringMatcher.SearchPrecisionScore.Regular, true)]
206-
[TestCase("codes", "Visual Studio Codes", StringMatcher.SearchPrecisionScore.Regular, true)]
186+
[TestCase("exce", "OverLeaf-Latex: An online LaTeX editor", SearchPrecisionScore.Regular, false)]
187+
[TestCase("term", "Windows Terminal (Preview)", SearchPrecisionScore.Regular, true)]
188+
[TestCase("sql s managa", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, false)]
189+
[TestCase("sql' s manag", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, false)]
190+
[TestCase("sql s manag", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, true)]
191+
[TestCase("sql manag", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, true)]
192+
[TestCase("sql", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, true)]
193+
[TestCase("sql serv", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, true)]
194+
[TestCase("servez", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, false)]
195+
[TestCase("sql servz", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, false)]
196+
[TestCase("sql serv man", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, true)]
197+
[TestCase("sql studio", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, true)]
198+
[TestCase("mic", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, true)]
199+
[TestCase("chr", "Shutdown", SearchPrecisionScore.Regular, false)]
200+
[TestCase("mssms", MicrosoftSqlServerManagementStudio, SearchPrecisionScore.Regular, false)]
201+
[TestCase("chr", "Change settings for text-to-speech and for speech recognition (if installed).", SearchPrecisionScore.Regular, false)]
202+
[TestCase("ch r", "Change settings for text-to-speech and for speech recognition (if installed).", SearchPrecisionScore.Regular, true)]
203+
[TestCase("a test", "This is a test", SearchPrecisionScore.Regular, true)]
204+
[TestCase("test", "This is a test", SearchPrecisionScore.Regular, true)]
205+
[TestCase("cod", VisualStudioCode, SearchPrecisionScore.Regular, true)]
206+
[TestCase("code", VisualStudioCode, SearchPrecisionScore.Regular, true)]
207+
[TestCase("codes", "Visual Studio Codes", SearchPrecisionScore.Regular, true)]
207208
public void WhenGivenQuery_ShouldReturnResults_ContainingAllQuerySubstrings(
208209
string queryString,
209210
string compareString,
210-
StringMatcher.SearchPrecisionScore expectedPrecisionScore,
211+
SearchPrecisionScore expectedPrecisionScore,
211212
bool expectedPrecisionResult)
212213
{
213214
// When
@@ -238,7 +239,7 @@ public void WhenGivenAQuery_Scoring_ShouldGiveMoreWeightToStartOfNewWord(
238239
string queryString, string compareString1, string compareString2)
239240
{
240241
// When
241-
var matcher = new StringMatcher { UserSettingSearchPrecision = StringMatcher.SearchPrecisionScore.Regular };
242+
var matcher = new StringMatcher { UserSettingSearchPrecision = SearchPrecisionScore.Regular };
242243

243244
// Given
244245
var compareString1Result = matcher.FuzzyMatch(queryString, compareString1);

0 commit comments

Comments
 (0)