Skip to content

Commit 6704750

Browse files
authored
File Globbing (#197)
* File Globbing * Distinct * string.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase); * Case sensitive for linux * Print file paths * Fix tests
1 parent 1c9ea7d commit 6704750

File tree

9 files changed

+65
-14
lines changed

9 files changed

+65
-14
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* File globbing search

src/ModularPipelines/Engine/ModuleIgnoreHandler.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using EnumerableAsyncProcessor.Extensions;
33
using Microsoft.Extensions.Options;
44
using ModularPipelines.Attributes;
5-
using ModularPipelines.Extensions;
65
using ModularPipelines.Modules;
76
using ModularPipelines.Options;
87

src/ModularPipelines/FileSystem/File.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ public bool Equals(File? other)
186186
return true;
187187
}
188188

189+
if (OperatingSystem.IsWindows())
190+
{
191+
return string.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase);
192+
}
193+
189194
return Path == other.Path;
190195
}
191196

src/ModularPipelines/FileSystem/Folder.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Diagnostics.CodeAnalysis;
2+
using Microsoft.Extensions.FileSystemGlobbing;
3+
using Microsoft.Extensions.FileSystemGlobbing.Abstractions;
24

35
namespace ModularPipelines.FileSystem;
46

@@ -105,11 +107,23 @@ public Folder MoveTo(string path)
105107

106108
public IEnumerable<Folder> GetFolders(Func<Folder, bool> predicate) => DirectoryInfo.EnumerateDirectories("*", SearchOption.AllDirectories)
107109
.Select(x => new Folder(x))
110+
.Distinct()
108111
.Where(predicate);
109112

110113
public IEnumerable<File> GetFiles(Func<File, bool> predicate) => DirectoryInfo.EnumerateFiles("*", SearchOption.AllDirectories)
111114
.Select(x => new File(x))
115+
.Distinct()
112116
.Where(predicate);
117+
118+
public IEnumerable<File> GetFiles(string globPattern)
119+
{
120+
return new Matcher(StringComparison.OrdinalIgnoreCase)
121+
.AddInclude(globPattern)
122+
.Execute(new DirectoryInfoWrapper(DirectoryInfo))
123+
.Files
124+
.Select(x => new File(x.Path))
125+
.Distinct();
126+
}
113127

114128
public File? FindFile(Func<File, bool> predicate) => GetFiles(predicate).FirstOrDefault();
115129

@@ -118,13 +132,15 @@ public IEnumerable<File> GetFiles(Func<File, bool> predicate) => DirectoryInfo.E
118132
public IEnumerable<File> ListFiles()
119133
{
120134
return DirectoryInfo.EnumerateFiles("*", SearchOption.TopDirectoryOnly)
121-
.Select(x => new File(x));
135+
.Select(x => new File(x))
136+
.Distinct();
122137
}
123138

124139
public IEnumerable<Folder> ListFolders()
125140
{
126141
return DirectoryInfo.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
127-
.Select(x => new Folder(x));
142+
.Select(x => new Folder(x))
143+
.Distinct();
128144
}
129145

130146
public static Folder CreateTemporaryFolder()
@@ -179,6 +195,11 @@ public bool Equals(Folder? other)
179195
return true;
180196
}
181197

198+
if (OperatingSystem.IsWindows())
199+
{
200+
return string.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase);
201+
}
202+
182203
return Path == other.Path;
183204
}
184205

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Blah!
File renamed without changes.

test/ModularPipelines.UnitTests/FileTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Globalization;
22
using ModularPipelines.Extensions;
3+
using ModularPipelines.FileSystem;
34
using ModularPipelines.UnitTests.Attributes;
45
using File = ModularPipelines.FileSystem.File;
56

@@ -298,6 +299,31 @@ public void EqualityFalse()
298299
});
299300
}
300301

302+
[TestCase("**/Nest2/**/*.txt")]
303+
[TestCase("**/blah.txt")]
304+
[TestCase("**/Blah.txt")]
305+
[TestCase("**/Nest1/Nest2/Nest3/Nest4/Nest5/*.txt")]
306+
public void GlobTests(string globPattern)
307+
{
308+
var workingDirectory = new Folder(Environment.CurrentDirectory);
309+
var files = workingDirectory.GetFiles(globPattern).ToList();
310+
311+
Assert.That(files, Has.Count.EqualTo(1));
312+
Assert.That(files[0].Name, Is.EqualTo("Blah.txt"));
313+
}
314+
315+
[Test]
316+
public void GlobTest2()
317+
{
318+
var folder = new Folder(Environment.CurrentDirectory)
319+
.FindFolder(x => x.Name == "Nest5")!;
320+
321+
var files = folder.GetFiles("Blah.txt").ToList();
322+
323+
Assert.That(files, Has.Count.EqualTo(1));
324+
Assert.That(files[0].Name, Is.EqualTo("Blah.txt"));
325+
}
326+
301327
private static async Task<File> CreateRandomFile()
302328
{
303329
var path = File.GetNewTemporaryFilePath();

test/ModularPipelines.UnitTests/Helpers/ZipTests.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ private class ZipModule : Module<string>
1414
{
1515
await Task.Yield();
1616

17-
var directory = context.Git().RootDirectory.GetFolder("test").GetFolder("ModularPipelines.UnitTests").GetFolder("Data");
17+
var directory = context.Git().RootDirectory.GetFolder("test")
18+
.GetFolder("ModularPipelines.UnitTests")
19+
.GetFolder("Data")
20+
.GetFolder("Zip");
1821

1922
var fileToWrite = context.Environment.WorkingDirectory.GetFile("LoremData.zip");
2023

@@ -98,7 +101,7 @@ public async Task UnZipped_Folder_Exists()
98101
Assert.Multiple(() =>
99102
{
100103
Assert.That(expectedFolder.Exists, Is.True);
101-
Assert.That(expectedFolder.GetFiles("*", SearchOption.AllDirectories), Has.Length.GreaterThanOrEqualTo(1));
104+
Assert.That(expectedFolder.GetFiles("*", SearchOption.AllDirectories), Has.Length.EqualTo(1));
102105
});
103106
}
104107
}

test/ModularPipelines.UnitTests/ModularPipelines.UnitTests.csproj

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,9 @@
4747
</ItemGroup>
4848

4949
<ItemGroup>
50-
<None Update="Data\Foo.txt">
51-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
52-
</None>
53-
<None Update="Data\BashTest.sh">
54-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
55-
</None>
50+
<None Update="Data\**">
51+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
52+
</None>
5653
</ItemGroup>
57-
58-
59-
54+
6055
</Project>

0 commit comments

Comments
 (0)