Skip to content

Commit afa2cb7

Browse files
authored
Fix bug where the scan was strictly based on the alias result (#27)
1 parent beb6a9e commit afa2cb7

File tree

5 files changed

+42
-26
lines changed

5 files changed

+42
-26
lines changed

src/ConfigCat.Cli.Models/Scan/AliasScanResult.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,5 @@ public class AliasScanResult
88
{
99
public FileInfo ScannedFile { get; set; }
1010

11-
public ConcurrentDictionary<FlagModel, ConcurrentBag<string>> FlagAliases { get; set; } = new ConcurrentDictionary<FlagModel, ConcurrentBag<string>>();
12-
13-
public ConcurrentBag<FlagModel> FoundFlags { get; set; } = [];
11+
public ConcurrentDictionary<string, ConcurrentBag<string>> FlagAliases { get; set; } = new();
1412
}

src/ConfigCat.Cli.Services/Scan/AliasCollector.cs

+2-8
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,8 @@ public async Task<AliasScanResult> CollectAsync(FlagModel[] flags, FileInfo file
7171
var found = match.Groups[1].Value;
7272
var flag = flags.FirstOrDefault(f => f.Key == key);
7373

74-
if (flag != null)
75-
result.FoundFlags.Add(flag);
76-
7774
if (flag != null && !found.IsEmpty() && Similarity(flag.Key, found) > 0.3)
78-
result.FlagAliases.AddOrUpdate(flag, [found], (k, v) => { v.Add(found); return v; });
75+
result.FlagAliases.AddOrUpdate(flag.Key, [found], (k, v) => { v.Add(found); return v; });
7976

8077
match = match.NextMatch();
8178
}
@@ -100,11 +97,8 @@ public async Task<AliasScanResult> CollectAsync(FlagModel[] flags, FileInfo file
10097

10198
var flag = flags.FirstOrDefault(f => f.Key == keyGroup.Value);
10299

103-
if (flag != null)
104-
result.FoundFlags.Add(flag);
105-
106100
if (flag != null && !found.Value.IsEmpty())
107-
result.FlagAliases.AddOrUpdate(flag, [found.Value], (k, v) => { v.Add(found.Value); return v; });
101+
result.FlagAliases.AddOrUpdate(flag.Key, [found.Value], (k, v) => { v.Add(found.Value); return v; });
108102

109103
regMatch = regMatch.NextMatch();
110104
}

src/ConfigCat.Cli.Services/Scan/FileScanner.cs

+10-7
Original file line numberDiff line numberDiff line change
@@ -53,25 +53,28 @@ public async Task<IEnumerable<FlagReferenceResult>> ScanAsync(FlagModel[] flags,
5353
this.output.Verbose($"Searching for flag ALIASES...", ConsoleColor.Magenta);
5454
if (matchPatterns.Length > 0)
5555
this.output.Verbose($"Using the following custom alias patterns: {string.Join(", ", matchPatterns.Select(p => $"'{p}'"))}");
56+
if (usagePatterns.Length > 0)
57+
this.output.Verbose($"Using the following custom usage patterns: {string.Join(", ", usagePatterns.Select(p => $"'{p}'"))}");
5658
var aliasTasks = filesToScan.TakeWhile(file => !cancellation.IsCancellationRequested)
5759
.Select(file => this.aliasCollector.CollectAsync(flags, file, matchPatterns, token));
5860

5961
var aliasResults = (await Task.WhenAll(aliasTasks)).Where(r => r is not null).ToArray();
6062

61-
foreach (var (key, value) in aliasResults.SelectMany(a => a.FlagAliases))
63+
foreach (var (key, aliases) in aliasResults.SelectMany(a => a.FlagAliases))
6264
{
63-
key.Aliases ??= [];
64-
key.Aliases.AddRange(value);
65-
key.Aliases = key.Aliases.Distinct().ToList();
65+
var flag = flags.FirstOrDefault(f => f.Key == key);
66+
if (flag is null) continue;
67+
68+
flag.Aliases ??= [];
69+
flag.Aliases.AddRange(aliases);
70+
flag.Aliases = flag.Aliases.Distinct().ToList();
6671
}
6772

68-
var foundFlags = aliasResults.SelectMany(a => a.FoundFlags).Distinct().ToArray();
69-
7073
this.output.Verbose($"Scanning for flag REFERENCES...", ConsoleColor.Magenta);
7174
var scanTasks = aliasResults
7275
.Select(r => r.ScannedFile)
7376
.TakeWhile(file => !cancellation.IsCancellationRequested)
74-
.Select(file => this.referenceCollector.CollectAsync(foundFlags, file, contextLines, usagePatterns, cancellation));
77+
.Select(file => this.referenceCollector.CollectAsync(flags, file, contextLines, usagePatterns, cancellation));
7578

7679
var referenceResults = (await Task.WhenAll(scanTasks)).Where(r => r is not null);
7780

test/ConfigCat.Cli.Tests/ScanTests.cs

+25-7
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public async Task Scan()
7878
var file = new FileInfo("refs.txt");
7979

8080
var result = await aliasCollector.CollectAsync(new[] { flag }, file, [], CancellationToken.None);
81-
flag.Aliases = result.FlagAliases[flag].ToList();
81+
flag.Aliases = result.FlagAliases[flag.Key].ToList();
8282

8383
var references = await scanner.CollectAsync(new[] { flag }, file, 0, [], CancellationToken.None);
8484

@@ -227,7 +227,7 @@ public async Task Alias_Custom()
227227
var file = new FileInfo("custom.txt");
228228

229229
var result = await aliasCollector.CollectAsync(new[] { flag }, file, [@"(\w+) = :CC_KEY"], CancellationToken.None);
230-
flag.Aliases = result.FlagAliases[flag].ToList();
230+
flag.Aliases = result.FlagAliases[flag.Key].ToList();
231231

232232
Assert.Contains("CUS_TEST_FLAG", flag.Aliases);
233233

@@ -248,7 +248,7 @@ public async Task Alias_Custom_Other()
248248
var file = new FileInfo("custom.txt");
249249

250250
var result = await aliasCollector.CollectAsync(new[] { flag }, file, [@"(\w+) := FLAGS(CC_KEY)"], CancellationToken.None);
251-
flag.Aliases = result.FlagAliases[flag].ToList();
251+
flag.Aliases = result.FlagAliases[flag.Key].ToList();
252252

253253
Assert.Contains("is_test_flag_on", flag.Aliases);
254254

@@ -259,7 +259,7 @@ public async Task Alias_Custom_Other()
259259
Assert.Contains("Reference to is_test_flag_on", referenceLines);
260260

261261
result = await aliasCollector.CollectAsync(new[] { flag }, file, [@"(\w+) = client_wrapper\.get_flag\(:CC_KEY\)"], CancellationToken.None);
262-
flag.Aliases = result.FlagAliases[flag].ToList();
262+
flag.Aliases = result.FlagAliases[flag.Key].ToList();
263263

264264
Assert.Contains("CUS2_TEST_FLAG", flag.Aliases);
265265

@@ -270,7 +270,7 @@ public async Task Alias_Custom_Other()
270270
Assert.Contains("Reference to CUS2_TEST_FLAG", referenceLines);
271271

272272
result = await aliasCollector.CollectAsync(new[] { flag }, file, [@"client_wrapper\.get_flag\(:CC_KEY, (\w+) =>"], CancellationToken.None);
273-
flag.Aliases = result.FlagAliases[flag].ToList();
273+
flag.Aliases = result.FlagAliases[flag.Key].ToList();
274274

275275
Assert.Contains("cust_flag_val", flag.Aliases);
276276

@@ -293,7 +293,7 @@ public async Task Alias_Patterns_Bad()
293293
Assert.Empty(result.FlagAliases);
294294
}
295295

296-
[Fact]
296+
[Fact]
297297
public async Task Usage_Custom()
298298
{
299299
var aliasCollector = new AliasCollector(new BotPolicy<AliasScanResult>(), Mock.Of<IOutput>());
@@ -303,7 +303,7 @@ public async Task Usage_Custom()
303303
var file = new FileInfo("custom.txt");
304304

305305
var result = await aliasCollector.CollectAsync([flag], file, [@"(\w+) = client_wrapper\.get_flag\(:CC_KEY\)"], CancellationToken.None);
306-
flag.Aliases = result.FlagAliases[flag].ToList();
306+
flag.Aliases = result.FlagAliases[flag.Key].ToList();
307307

308308
Assert.Contains("is_test_flag_on", flag.Aliases);
309309

@@ -316,4 +316,22 @@ public async Task Usage_Custom()
316316
Assert.Contains("client_wrapper.get_flag(:test_flag, cust_flag_val => {", referenceLines);
317317
Assert.Contains("Reference to CUS2_TEST_FLAG", referenceLines);
318318
}
319+
320+
[Fact]
321+
public async Task Usage_Custom_Direct()
322+
{
323+
var aliasCollector = new AliasCollector(new BotPolicy<AliasScanResult>(), Mock.Of<IOutput>());
324+
var scanner = new ReferenceCollector(new BotPolicy<FlagReferenceResult>(), Mock.Of<IOutput>());
325+
326+
var flag = new FlagModel { Key = "test_direct", SettingType = "boolean" };
327+
var file = new FileInfo("custom.txt");
328+
329+
var result = await aliasCollector.CollectAsync([flag], file, [], CancellationToken.None);
330+
Assert.Empty(result.FlagAliases);
331+
332+
var references = await scanner.CollectAsync(new[] { flag }, file, 0, [":CC_KEY"], CancellationToken.None);
333+
var referenceLines = references.References.Select(r => r.ReferenceLine.LineText);
334+
335+
Assert.Contains("if FLAGS.enabled(:test_direct) {", referenceLines);
336+
}
319337
}

test/ConfigCat.Cli.Tests/custom.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,7 @@ Reference to is_test_flag_on
1616

1717
Reference to CUS2_TEST_FLAG
1818

19-
Reference to cust_flag_val
19+
Reference to cust_flag_val
20+
21+
if FLAGS.enabled(:test_direct) {
22+
}

0 commit comments

Comments
 (0)