Skip to content

Commit

Permalink
New coprus action, tests
Browse files Browse the repository at this point in the history
  • Loading branch information
RiabushenkoA committed Dec 26, 2024
1 parent 51db2f5 commit aabf2ed
Show file tree
Hide file tree
Showing 32 changed files with 834 additions and 5 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -367,3 +367,4 @@ MigrationBackup/
FodyWeavers.xsd
/ConsoleApp1/ConsoleApp1.csproj
/ConsoleApp1/Program.cs
/SystranTests/appsettings.json
11 changes: 10 additions & 1 deletion App.sln → App.Systran.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35527.113 d17.12
VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apps.Systran", "Apps.App\Apps.Systran.csproj", "{EB25604E-8EBA-464E-BEDF-30EA95395AD3}"
EndProject
Expand All @@ -10,6 +10,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\
{EB25604E-8EBA-464E-BEDF-30EA95395AD3} = {EB25604E-8EBA-464E-BEDF-30EA95395AD3}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystranTests", "SystranTests\SystranTests.csproj", "{0EEEE9C9-A8D7-4A38-8416-C875E9CF0CFE}"
ProjectSection(ProjectDependencies) = postProject
{EB25604E-8EBA-464E-BEDF-30EA95395AD3} = {EB25604E-8EBA-464E-BEDF-30EA95395AD3}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -24,6 +29,10 @@ Global
{4A700043-C72D-4A1C-93B7-8FD89030EBF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A700043-C72D-4A1C-93B7-8FD89030EBF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A700043-C72D-4A1C-93B7-8FD89030EBF5}.Release|Any CPU.Build.0 = Release|Any CPU
{0EEEE9C9-A8D7-4A38-8416-C875E9CF0CFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0EEEE9C9-A8D7-4A38-8416-C875E9CF0CFE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0EEEE9C9-A8D7-4A38-8416-C875E9CF0CFE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0EEEE9C9-A8D7-4A38-8416-C875E9CF0CFE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
89 changes: 89 additions & 0 deletions Apps.App/Actions/CorpusActions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
using Apps.App.Api;
using Apps.App.Invocables;
using Apps.Systran.Models.Request;
using Apps.Systran.Models.Response;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Actions;
using Blackbird.Applications.Sdk.Common.Exceptions;
using Blackbird.Applications.Sdk.Common.Files;
using Blackbird.Applications.Sdk.Common.Invocation;
using Blackbird.Applications.SDK.Extensions.FileManagement.Interfaces;
using RestSharp;

namespace Apps.Systran.Actions
{
[ActionList]
public class CorpusActions(InvocationContext invocationContext, IFileManagementClient fileManagementClient) : SystranInvocable(invocationContext)
{

[Action("Export corpus", Description = "Export a corpus file by its ID")]
public async Task<FileReference> ExportCorpus([ActionParameter] ExportCorpusParameters parameters)
{
var request = new SystranRequest($"/resources/corpus/export", RestSharp.Method.Get);
request.AddQueryParameter("corpusId", parameters.CorpusId);

var response = await Client.ExecuteAsync(request, cancellationToken: default);
if (!response.IsSuccessful || response.RawBytes == null)
throw new Exception($"Failed to export corpus. Status: {response.StatusCode}, Error: {response.ErrorMessage}");


await using var memoryStream = new MemoryStream(response.RawBytes);

var fileReference = await fileManagementClient.UploadAsync(
memoryStream,
response.ContentType,
parameters.CorpusId
);

return fileReference;
}

[Action("Import corpus from TMX file", Description = "Add a new corpus from an existing corpus.")]
public async Task<ImportCorpusResponse> ImportCorpus([ActionParameter] ImportCorpusParameters parameters)
{
var request = new SystranRequest($"/resources/corpus/import", RestSharp.Method.Post);

request.AddQueryParameter("name", parameters.Name);
request.AddQueryParameter("format", parameters.Format);

if (parameters.Tag != null && parameters.Tag.Any())
{
foreach (var tag in parameters.Tag)
{
request.AddQueryParameter("tag", tag);
}
}

if (!string.IsNullOrEmpty(parameters.Input))
{
request.AddParameter("input", parameters.Input);
}
else if (parameters.InputFile != null)
{
var fileBytes = await fileManagementClient.DownloadAsync(parameters.InputFile);
using (var memoryStream = new MemoryStream())
{
await fileBytes.CopyToAsync(memoryStream);
request.AddFile("inputFile", memoryStream.ToArray(), parameters.InputFile.Name, MediaTypeNames.Application.Octet);
}
}
else
{
throw new PluginMisconfigurationException("Either input or inputFile must be provided");
}

var response = await Client.ExecuteAsync<ImportCorpusResponse>(request);

return response.Data;
}
}



}
26 changes: 26 additions & 0 deletions Apps.App/Actions/DictionaryActions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Apps.App.Api;
using Apps.App.Invocables;
using Apps.Systran.Models.Request;
using Apps.Systran.Models.Response;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Actions;
using Blackbird.Applications.Sdk.Common.Files;
using Blackbird.Applications.Sdk.Common.Invocation;
using Blackbird.Applications.Sdk.Glossaries.Utils.Converters;
using Blackbird.Applications.SDK.Extensions.FileManagement.Interfaces;
using RestSharp;

namespace Apps.Systran.Actions
{
[ActionList]
public class DictionaryActions(InvocationContext invocationContext, IFileManagementClient fileManagementClient) : SystranInvocable(invocationContext)
{

}
}

64 changes: 64 additions & 0 deletions Apps.App/Actions/TranslateFileActions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Apps.App.Api;
using Apps.App.Invocables;
using Blackbird.Applications.Sdk.Common.Actions;
using Blackbird.Applications.Sdk.Common;
using Blackbird.Applications.Sdk.Common.Invocation;
using RestSharp;
using Apps.Systran.Models.Request;
using Apps.Systran.Models.Response;
using Blackbird.Applications.SDK.Extensions.FileManagement.Interfaces;

namespace Apps.Systran.Actions
{
[ActionList]
public class TranslateFileActions(InvocationContext invocationContext, IFileManagementClient fileManagementClient) : SystranInvocable(invocationContext)
{

[Action("Translate file", Description = "Translate a file from source language to target language")]
public async Task<TranslateFileResponse> TranslateFile([ActionParameter] TranslateFileRequest input)
{
var baseUrl = InvocationContext.AuthenticationCredentialsProviders
.First(p => p.KeyName == "url").Value;

var request = new SystranRequest("/translation/file/translate", Method.Post)
{
AlwaysMultipartFormData = true
};

if (!string.IsNullOrEmpty(input.Source))
request.AddQueryParameter("source", input.Source);
if (!string.IsNullOrEmpty(input.Target))
request.AddQueryParameter("target", input.Target);
if (!string.IsNullOrEmpty(input.Format))
request.AddQueryParameter("format", input.Format);
if (!string.IsNullOrEmpty(input.Profile))
request.AddQueryParameter("profile", input.Profile);
if (input.WithInfo == true)
request.AddQueryParameter("withInfo", "true");
if (input.WithSource == true)
request.AddQueryParameter("withSource", "true");
if (input.WithAnnotations == true)
request.AddQueryParameter("withAnnotations", "true");
if (input.Async == true)
request.AddQueryParameter("async", "true");
if (!string.IsNullOrEmpty(input.Owner))
request.AddQueryParameter("owner", input.Owner);
if (!string.IsNullOrEmpty(input.Domain))
request.AddQueryParameter("domain", input.Domain);
if (!string.IsNullOrEmpty(input.Size))
request.AddQueryParameter("size", input.Size);



var response = await Client.ExecuteWithErrorHandling<TranslateFileResponse>(request);

return response;
}
}
}

2 changes: 1 addition & 1 deletion Apps.App/Api/SystranClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ protected override Exception ConfigureErrorException(RestResponse response)

public override async Task<RestResponse> ExecuteWithErrorHandling(RestRequest request)
{

var restResponse = await ExecuteAsync(request);
if (!restResponse.IsSuccessStatusCode)
throw ConfigureErrorException(restResponse);

try
{
var error = JsonConvert.DeserializeObject<SystranError>(restResponse.Content!);
Expand Down
3 changes: 2 additions & 1 deletion Apps.App/Apps.Systran.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@

<ItemGroup>
<PackageReference Include="Blackbird.Applications.Sdk.Common" Version="2.11.0" />
<PackageReference Include="Blackbird.Applications.Sdk.Utils" Version="1.0.25" />
<PackageReference Include="Blackbird.Applications.Sdk.Glossaries.Utils" Version="1.0.1" />
<PackageReference Include="Blackbird.Applications.Sdk.Utils" Version="1.0.26" />
</ItemGroup>

</Project>
33 changes: 33 additions & 0 deletions Apps.App/DataSourceHandlers/CorporaDataHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Apps.App.Api;
using Apps.App.Invocables;
using Apps.Systran.Models.Response;
using Blackbird.Applications.Sdk.Common.Dynamic;
using Blackbird.Applications.Sdk.Common.Invocation;

namespace Apps.Systran.DataSourceHandlers
{
public class CorporaDataHandler : SystranInvocable, IAsyncDataSourceItemHandler
{
public CorporaDataHandler(InvocationContext invocationContext) : base(invocationContext) { }

public async Task<IEnumerable<DataSourceItem>> GetDataAsync(DataSourceContext context, CancellationToken cancellationToken)
{
var request = new SystranRequest("/resources/corpus/list", RestSharp.Method.Get);
var response = await Client.ExecuteWithErrorHandling<CorporaListResponse>(request);

return response.Files
.Where(corpus => string.IsNullOrWhiteSpace(context.SearchString) ||
corpus.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase))
.Take(50)
.Select(corpus => new DataSourceItem(
corpus.Id,
$"{corpus.Name} ({corpus.SourceLang} -> {string.Join(", ", corpus.TargetLangs ?? Enumerable.Empty<string>())})"
));
}
}
}
32 changes: 32 additions & 0 deletions Apps.App/DataSourceHandlers/DictionaryDataHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Apps.App.Api;
using Apps.App.Invocables;
using Apps.Systran.Models.Response;
using Blackbird.Applications.Sdk.Common.Dynamic;
using Blackbird.Applications.Sdk.Common.Invocation;

namespace Apps.Systran.DataSourceHandlers
{
public class DictionaryDataHandler : SystranInvocable, IAsyncDataSourceItemHandler
{
public DictionaryDataHandler(InvocationContext invocationContext):base(invocationContext) { }
public async Task<IEnumerable<DataSourceItem>> GetDataAsync(DataSourceContext context, CancellationToken cancellationToken)
{
var request = new SystranRequest("/resources/dictionary/list", RestSharp.Method.Post);
var response = await Client.ExecuteWithErrorHandling<DictionaryDataHandlerResponse>(request);

return response.Dictionaries
.Where(dictionary => string.IsNullOrWhiteSpace(context.SearchString) ||
dictionary.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase))
.Take(50)
.Select(dictionary => new DataSourceItem(
dictionary.Id,
$"{dictionary.Name} ({dictionary.SourceLang} -> {dictionary.TargetLangs})"
));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Blackbird.Applications.Sdk.Common.Dictionaries;
using Blackbird.Applications.Sdk.Common.Dynamic;

namespace Apps.Systran.DataSourceHandlers.EnumDataHandlers
{
public class CorpusFormatDataHandler : IStaticDataSourceItemHandler
{
protected Dictionary<string, string> EnumValues => new()
{
{ "application/x-tmx+xml", "TMX XML" },
{ "text/bitext", "Bitext" }
};

public IEnumerable<DataSourceItem> GetData()
{
return EnumValues.Select(item => new DataSourceItem
{
Value = item.Key,
DisplayName = item.Value
});
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Blackbird.Applications.Sdk.Common.Dictionaries;
using Blackbird.Applications.Sdk.Common.Dynamic;

namespace Apps.Systran.DataSourceHandlers.EnumDataHandlers
{
public class DictionaryTypeDataHandler : IStaticDataSourceItemHandler
{
protected Dictionary<string, string> EnumValues => new()
{
{"UD", "User Dictionary"},
{"NORM", "Normalization Dictionary"}
};

public IEnumerable<DataSourceItem> GetData()
{
return EnumValues.Select(item => new DataSourceItem
{
Value = item.Key,
DisplayName = item.Value
});
}
}
}
Loading

0 comments on commit aabf2ed

Please sign in to comment.