Skip to content

Commit

Permalink
Merge pull request #44 from dabutvin/ignored-files
Browse files Browse the repository at this point in the history
adds support for ignoredFiles (#2)
  • Loading branch information
dabutvin authored Oct 29, 2017
2 parents b1ddcf1 + 0a04666 commit 5eb94f0
Show file tree
Hide file tree
Showing 13 changed files with 257 additions and 6 deletions.
1 change: 1 addition & 0 deletions ImgBot.Common/RepoConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
public class RepoConfiguration
{
public string Schedule { get; set; }
public string[] IgnoredFiles { get; set; }
}
}
10 changes: 4 additions & 6 deletions ImgBot.Function/CompressImages.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ public static async Task RunAsync(CompressimagesParameters parameters)
var branch = Commands.Checkout(repo, BranchName);

// optimize images
var optimizedImages = OptimizeImages(repo, parameters.LocalPath);
var imagePaths = ImageQuery.FindImages(parameters.LocalPath, repoConfiguration);
var optimizedImages = OptimizeImages(repo, parameters.LocalPath, imagePaths);
if (optimizedImages.Count == 0)
return;

Expand All @@ -95,15 +96,12 @@ public static async Task RunAsync(CompressimagesParameters parameters)
await githubClient.PullRequest.Create(parameters.RepoOwner, parameters.RepoName, pr);
}

private static Dictionary<string, Percentage> OptimizeImages(LibGit2Sharp.Repository repo, string localPath)
private static Dictionary<string, Percentage> OptimizeImages(LibGit2Sharp.Repository repo, string localPath, string[] imagePaths)
{
// extract images
var images = KnownImgPatterns.ImgPatterns.AsParallel().SelectMany(pattern => Directory.EnumerateFiles(localPath, pattern, SearchOption.AllDirectories)).ToArray();

var optimizedImages = new Dictionary<string, Percentage>();

ImageOptimizer imageOptimizer = new ImageOptimizer();
Parallel.ForEach(images, image =>
Parallel.ForEach(imagePaths, image =>
{
try
{
Expand Down
28 changes: 28 additions & 0 deletions ImgBot.Function/ImageQuery.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System.IO;
using System.Linq;
using ImgBot.Common;

namespace ImgBot.Function
{
public static class ImageQuery
{
public static string[] FindImages(string localPath, RepoConfiguration repoConfiguration)
{
var images = KnownImgPatterns.ImgPatterns
.AsParallel()
.SelectMany(pattern => Directory.EnumerateFiles(localPath, pattern, SearchOption.AllDirectories));

if(repoConfiguration.IgnoredFiles != null)
{
// find all the ignored files and exclude them from the found images
var ignoredFiles = repoConfiguration.IgnoredFiles
.AsParallel()
.SelectMany(pattern => Directory.EnumerateFiles(localPath, pattern, SearchOption.AllDirectories));

images = images.Except(ignoredFiles);
}

return images.ToArray();
}
}
}
190 changes: 190 additions & 0 deletions ImgBot.Test/ImageQueryTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
using System.Linq;
using ImgBot.Common;
using ImgBot.Function;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace ImgBot.Test
{
[TestClass]
public class ImageQueryTests
{
[TestMethod]
public void GivenDefaultConfiguration_ShouldFindAllImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration());

Assert.AreEqual(7, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
images.Contains("item1.png");
images.Contains("item2.png");
images.Contains("item3.jpg");
images.Contains("deepimage.png");
}

[TestMethod]
public void GivenFullIgnoreFullPath_ShouldIgnoreImage()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"folder/item2.png"
}
});

Assert.AreEqual(6, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
images.Contains("item1.png");
images.Contains("item3.jpg");
images.Contains("deepimage.png");
}

[TestMethod]
public void GivenFolderSlash_ShouldIgnoreImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"folder/"
}
});

Assert.AreEqual(3, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
}

[TestMethod]
public void GivenFolderWildcard_ShouldIgnoreImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"folder/*"
}
});

Assert.AreEqual(3, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
}

[TestMethod]
public void GivenWildcardExtension_ShouldIgnoreImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"*.png"
}
});

Assert.AreEqual(2, images.Length);
images.Contains("a.jpg");
images.Contains("item3.jpg");
}

[TestMethod]
public void GivenWildcard_ShouldIgnoreAllImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"*"
}
});

Assert.AreEqual(0, images.Length);
}

[TestMethod]
public void GivenDifferentSlashPath_ShouldIgnoreImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"folder/item2.png",
"folder\\item3.jpg"
}
});

Assert.AreEqual(5, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
images.Contains("item1.png");
images.Contains("deepimage.png");
}

[TestMethod]
public void GivenDeeplyNestedImage_ShouldIgnoreImage()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"deepimage.png",
}
});

Assert.AreEqual(6, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
images.Contains("item1.png");
images.Contains("item2.png");
images.Contains("item3.jpg");
}

[TestMethod]
public void GivenDeeplyNestedPath_ShouldIgnoreImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"folder/deep/nested/*",
}
});

Assert.AreEqual(6, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
images.Contains("item1.png");
images.Contains("item2.png");
images.Contains("item3.jpg");
}

[TestMethod]
public void GivenDeeplyNestedPathOneUp_ShouldIgnoreImages()
{
var images = ImageQuery.FindImages("data", new RepoConfiguration
{
IgnoredFiles = new[]
{
"folder/deep/*",
}
});

Assert.AreEqual(6, images.Length);
images.Contains("a.jpg");
images.Contains("b.png");
images.Contains("c.png");
images.Contains("item1.png");
images.Contains("item2.png");
images.Contains("item3.jpg");
}
}
}
24 changes: 24 additions & 0 deletions ImgBot.Test/ImgBot.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="ImageQueryTests.cs" />
<Compile Include="ScheduleTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SimpleCommitLog.cs" />
Expand All @@ -72,6 +73,29 @@
<Name>ImgBot.Function</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="data\a.jpg">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="data\b.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="data\c.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="data\folder\deep\nested\deepimage.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="data\folder\item1.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="data\folder\item2.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="data\folder\item3.jpg">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
Expand Down
Binary file added ImgBot.Test/data/a.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ImgBot.Test/data/b.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ImgBot.Test/data/c.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ImgBot.Test/data/folder/deep/nested/deepimage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ImgBot.Test/data/folder/item1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ImgBot.Test/data/folder/item2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ImgBot.Test/data/folder/item3.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ This file should be placed in the root of the repository and set to your liking.
```
{
"schedule": "daily" // daily|weekly|monthly
"ignoredFiles": [
"*.jpg", // by extension
"image1.png", // by filename
"public/special_images/*", // by folderpath
]
}
```

Expand All @@ -77,6 +82,11 @@ to [email protected]
- Accepts: daily|weekly|monthly
- Limits the PRs from ImgBot to once a day, once a week, or once a month respectively
- The default behavior is to receive ImgBot PRs as images require optimization
- ignoredFiles
- optional
- Accepts the syntax for searchPattern on [Directory.EnumerateFiles()](https://docs.microsoft.com/en-us/dotnet/api/system.io.directory.enumeratefiles)
- Limits the images optimized by ImgBot by esentially ignoring them
- When ignoring by filename no path is neccesary, when ignoring by foldername full path from root is necessary

## The end result

Expand Down

0 comments on commit 5eb94f0

Please sign in to comment.