Skip to content

Commit

Permalink
feat: Add binary option to support gzipped content
Browse files Browse the repository at this point in the history
`eavfw binary <content>` can work on binary content:
- unzip gzipped content and output to terminal or `-o|--output` path
- zip gzip content and output to terminal or `-o|--output` path
- pretty format unzipped content, supports json documents.
  • Loading branch information
thygesteffensen committed Oct 19, 2023
1 parent 7919320 commit 7bce546
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 76 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
using System.CommandLine.Parsing;
using System.ComponentModel;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands
namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip
{
public class GzipCommand : Command
{
Expand Down Expand Up @@ -43,21 +41,21 @@ public GzipCommand() : base("binary", "Work with binary gunzipped data used in E

private async Task<int> Run(ParseResult parseResult, IConsole console)
{
var (statusCode, output) = await ConstructString(Input, UnzipOption, ZipOption, PrettyPrintOption);
var (statusCode, output) = await GzipLogic.ConstructString(Input, UnzipOption, ZipOption, PrettyPrintOption);

if (statusCode != 0)
if (statusCode != 0 || OutputOption == null)
{
console.WriteLine(output);
return statusCode;
}

if (OutputOption == null)
{
console.WriteLine(output);
await WriteToFile(console, output);

return statusCode;
}
return statusCode;
}

private async Task WriteToFile(IConsole console, string output)
{
if (OutputOption.Exists)
console.WriteLine("Output exists and content will be overridden...");

Expand All @@ -71,64 +69,6 @@ private async Task<int> Run(ParseResult parseResult, IConsole console)
sourceStream.Close();

console.WriteLine($"Content written to {OutputOption.FullName}");

return statusCode;
}
public static async Task<(int, string)> ConstructString(
string input,
bool unzip = false,
bool zip = false,
bool prettyPrint = false)
{
if (string.IsNullOrWhiteSpace(input))
{
throw new Exception("Cannot operate on empty input");
}

if (unzip)
{
var unzipped = await Unzip(input);

if (!prettyPrint) return (0, unzipped);

var prettified = await FormatJson(unzipped);
return (0, prettified);
}

if (zip)
{
var zipped = await Zip(input);
return (0, zipped);
}

return (127, "Command not found");
}

internal static async Task<string> Unzip(string str)
{
var bytes = Convert.FromHexString(str[2..]);
using var tinyStream =
new StreamReader(new GZipStream(new MemoryStream(bytes), CompressionMode.Decompress));
return await tinyStream.ReadToEndAsync();
}

internal static async Task<string> Zip(string str)
{
using var memoryStream = new MemoryStream();
await using var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress);
await using var writer = new StreamWriter(gZipStream, Encoding.UTF8);
await writer.WriteAsync(str);
await writer.FlushAsync();

var compressedBytes = memoryStream.ToArray();

return Convert.ToHexString(compressedBytes);
}

internal static Task<string> FormatJson(string str)
{
using var jDoc = JsonDocument.Parse(str);
return Task.FromResult(JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true }));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,72 @@
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip
{
public class GzipLogic
{

public static async Task<(int, string)> ConstructString(
string input,
bool unzip = false,
bool zip = false,
bool prettyPrint = false)
{
if (string.IsNullOrWhiteSpace(input))
{
throw new Exception("Cannot operate on empty input");
}

if (unzip)
{
var unzipped = await Unzip(input);

if (!prettyPrint) return (0, unzipped);

var prettified = await FormatJson(unzipped);
return (0, prettified);
}

if (zip)
{
var zipped = await Zip(input);
return (0, zipped);
}

return (127, "Command not found");
}

internal static async Task<string> Unzip(string str)
{
if (str.StartsWith("0x"))
str = str[2..];

var bytes = Convert.FromHexString(str);
using var tinyStream =
new StreamReader(new GZipStream(new MemoryStream(bytes), CompressionMode.Decompress));
return await tinyStream.ReadToEndAsync();
}

internal static async Task<string> Zip(string str)
{
using var memoryStream = new MemoryStream();
await using var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress);
await using var writer = new StreamWriter(gZipStream, Encoding.UTF8);
await writer.WriteAsync(str);
await writer.FlushAsync();

var compressedBytes = memoryStream.ToArray();

return Convert.ToHexString(compressedBytes);
}

internal static Task<string> FormatJson(string str)
{
using var jDoc = JsonDocument.Parse(str);
return Task.FromResult(JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true }));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,6 @@
</ItemGroup>
<ItemGroup Condition="$(UseEAVFromNuget) != 'false'">
<PackageReference Include="EAVFramework" Version="4.0.2" />
<PackageReference Include="EAVFW.Extensions.CommandLine" Version="1.1.3" />
<PackageReference Include="EAVFW.Extensions.CommandLine" Version="1.2.0" />
</ItemGroup>
</Project>
6 changes: 3 additions & 3 deletions src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.CommandLine;
using System.CommandLine.Parsing;
using System.Threading.Tasks;
using EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip;

namespace EAVFW.Extensions.Manifest.ManifestEnricherTool
{
Expand All @@ -32,9 +32,9 @@ static IServiceCollection ConfigureServices(IServiceCollection serviceCollection
serviceCollection.AddSingleton<Command, SQLCommand>();
serviceCollection.AddSingleton<Command, ManifestCommand>();
serviceCollection.AddSingleton<Command, CertCommand>();
serviceCollection.AddSingleton<Command, GzipCommand>();
serviceCollection.AddGPT();



serviceCollection.AddHttpClient();
return serviceCollection;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
"profiles": {
"EAVFW.Extensions.Manifest.ManifestEnricherTool": {
"commandName": "Project",
"workingDirectory": "C:\\dev\\hafnia\\loi",
"workingDirectory": "/Users/thyge/dev/playground",
"commandLineArgs": "binary --unzip 0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF"
// "commandLineArgs": "binary --unzip --pretty-print 0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF"
// "commandLineArgs": "binary --unzip --pretty-print --output myjsonfile.json 0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF"
// "commandLineArgs": "binary --zip {\"actions\":{\"CreateLOIDataRequestMessageAction\":{\"input\":{\"loirequest\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]},\"status\":\"Succeded\",\"body\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"failedReason\":null}},\"triggers\":{\"Trigger\":{\"time\":\"2023-10-12T07:41:42.311509+00:00\",\"body\":{\"entityName\":\"LetterofindemnityRequests\",\"recordId\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"data\":{\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]}}}}}"
//"workingDirectory": "C:\\dev\\kfst_vanddata",
//"commandLineArgs": "--path c:\\dev\\kfst_vanddata\\apps\\KFST.Vanddata.ManagementPortal\\manifest.json --customizationprefix kfst",
//"commandLineArgs": "install EAVFW.Extensions.SecurityModel",
Expand All @@ -15,7 +19,7 @@
// "commandLineArgs": "--path C:\\dev\\MedlemsCentralen\\src\\MC.Models\\manifest.json --customizationprefix MC"

// "commandLineArgs": "sql ./src/Hafnia.Models",
"commandLineArgs": "gpt review pr --project https://github.com/delegateas/WorkflowEngine.git --pr 15"
// "commandLineArgs": "gpt review pr --project https://github.com/delegateas/WorkflowEngine.git --pr 15"
// "commandLineArgs": "sql ./apps/KFST.Vanddata.ManagementPortal"
//"commandLineArgs": "--path C:\\dev\\hafnia\\loi\\src\\Hafnia.Models\\manifest.json --customizationprefix hafnia"
}
Expand Down
73 changes: 72 additions & 1 deletion tests/EAVFW.Extensions.Manifest.Tests/Gzip/GzipLogicTest.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,78 @@
using System.Threading.Tasks;
using EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace EAVFW.Extensions.Manifest.Tests.Gzip
{
[TestClass]
public class GzipLogicTest
{

[TestMethod]
public async Task NoOptions()
{
// Arrange
var jsonString = "{ \"value\": 2 }";
var expectedStatusCode = 127;

// Act
var (statusCode, output) = await GzipLogic.ConstructString(jsonString);

// Assert
Assert.AreEqual(expectedStatusCode, statusCode);
}


[TestMethod]
public async Task ZipAndUnZipTests()
{
// Arrange
var jsonString = "{ \"value\": 2 }";
var expectedStatusCode = 0;

// Act
var (statusCode, output) =
await GzipLogic.ConstructString((await GzipLogic.ConstructString(jsonString, zip: true)).Item2,
unzip: true);

// Assert
Assert.AreEqual(expectedStatusCode, statusCode);
Assert.AreEqual(jsonString, output);
}

[TestMethod]
public async Task ZipAndUnZipWithPrettyPrintTests()
{
// Arrange
var jsonString = "{ \"value\": 2 }";
var prettyfied = "{\n \"value\": 2\n}";
var expectedStatusCode = 0;

// Act
var (statusCode, output) = await GzipLogic.ConstructString(
(await GzipLogic.ConstructString(jsonString, zip: true)).Item2, unzip: true, prettyPrint: true);

// Assert
Assert.AreEqual(expectedStatusCode, statusCode);
Assert.AreEqual(prettyfied, output);
}

[TestMethod]
public async Task UnZipEavfwGeneratedContent()
{
// Arrange
var zippedString =
"0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF";
var unzippedString =
"{\"actions\":{\"CreateLOIDataRequestMessageAction\":{\"input\":{\"loirequest\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]},\"status\":\"Succeded\",\"body\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"failedReason\":null}},\"triggers\":{\"Trigger\":{\"time\":\"2023-10-12T07:41:42.311509+00:00\",\"body\":{\"entityName\":\"LetterofindemnityRequests\",\"recordId\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"data\":{\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]}}}}}";

var expectedStatusCode = 0;

// Act
var (statusCode, output) = await GzipLogic.ConstructString(zippedString, unzip: true);

// Asset
Assert.AreEqual(expectedStatusCode, statusCode);
Assert.AreEqual(unzippedString, output);
}
}
}

0 comments on commit 7bce546

Please sign in to comment.