diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 247ece5..d97ece9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,15 +6,17 @@ jobs: strategy: matrix: dotnet-version: - - '2.1' - - '2.2' + - '9.0' name: .NET ${{ matrix.dotnet-version }} sample steps: - - uses: actions/checkout@v3 - - uses: actions/setup-dotnet@v2 + - uses: actions/checkout@v4 + - name: Setup .NET + uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ matrix.dotnet-version }} - - run: dotnet restore - - env: + - name: Restore dependencies + run: dotnet restore + - name: Run tests + env: DETECTLANGUAGE_API_KEY: ${{ secrets.DETECTLANGUAGE_API_KEY }} run: dotnet test diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..7eea7ae --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,24 @@ +name: Publish dotnet package + +on: + release: + types: [published] + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0 + - name: Build + run: dotnet build --configuration Release + - name: Pack + run: dotnet pack --configuration Release + - name: Publish the package to nuget.org + run: dotnet nuget push */bin/Release/*.nupkg -k $NUGET_AUTH_TOKEN -s https://api.nuget.org/v3/index.json + env: + NUGET_AUTH_TOKEN: ${{ secrets.NUGET_TOKEN }} diff --git a/.gitignore b/.gitignore index d0e4b10..88d3156 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ ## files generated by popular Visual Studio add-ons. # User-specific files +.env.local *.suo *.user *.sln.docstates diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..42a0908 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## v2.0.0 + +### Changed +- Switched to v3 API which uses updated language detection model +- ⚠️ Added `DetectResult` field `score`, removed `confidence` and `reliable` +- Renamed `GetUserStatusAsync` to `GetAccountStatusAsync` +- Updated `Newtonsoft.Json` dependency to `13.0.3` diff --git a/DetectLanguage.Tests/DetectLanguage.Tests.csproj b/DetectLanguage.Tests/DetectLanguage.Tests.csproj index 47ed67d..c6b114e 100644 --- a/DetectLanguage.Tests/DetectLanguage.Tests.csproj +++ b/DetectLanguage.Tests/DetectLanguage.Tests.csproj @@ -1,15 +1,15 @@ - netcoreapp2.0 + net9.0 false - - - + + + diff --git a/DetectLanguage.Tests/DetectLanguageClientTest.cs b/DetectLanguage.Tests/DetectLanguageClientTest.cs index 8d2e4c3..8671afe 100644 --- a/DetectLanguage.Tests/DetectLanguageClientTest.cs +++ b/DetectLanguage.Tests/DetectLanguageClientTest.cs @@ -24,8 +24,7 @@ public async Task TestDetectAsync() { var results = await client.DetectAsync("Labas rytas"); Assert.That(results[0].language, Is.EqualTo("lt")); - Assert.That(results[0].reliable, Is.EqualTo(true)); - Assert.That(results[0].confidence, Is.GreaterThan(0)); + Assert.That(results[0].score, Is.GreaterThan(0)); } [Test] @@ -37,7 +36,7 @@ public async Task TestDetectCodeAsync() { [Test] public async Task TestDetectCodeAsyncNull() { - string language = await client.DetectCodeAsync("-"); + string language = await client.DetectCodeAsync(" "); Assert.IsNull(language); } @@ -48,8 +47,7 @@ public async Task TestBatchDetectAsync() { var results = await client.BatchDetectAsync(texts); Assert.That(results[0][0].language, Is.EqualTo("en")); - Assert.That(results[0][0].reliable, Is.EqualTo(true)); - Assert.That(results[0][0].confidence, Is.GreaterThan(0)); + Assert.That(results[0][0].score, Is.GreaterThan(0)); Assert.That(results[1][0].language, Is.EqualTo("lt")); } @@ -58,12 +56,12 @@ public async Task TestGetLanguagesAsync() { var languages = await client.GetLanguagesAsync(); Assert.That(languages[0].code, Is.EqualTo("aa")); - Assert.That(languages[0].name, Is.EqualTo("AFAR")); + Assert.That(languages[0].name, Is.EqualTo("Afar")); } [Test] - public async Task TestGetUserStatusAsync() { - var userStatus = await client.GetUserStatusAsync(); + public async Task TestGetAccountStatusAsync() { + var userStatus = await client.GetAccountStatusAsync(); Assert.IsNotEmpty(userStatus.date); Assert.IsNotEmpty(userStatus.plan); @@ -75,9 +73,9 @@ public async Task TestGetUserStatusAsync() { } [Test] - public void TestGetUserStatusAsyncError() { + public void TestGetAccountStatusAsyncError() { var testClient = new DetectLanguageClient("someApiKey"); - var ex = Assert.ThrowsAsync(() => testClient.GetUserStatusAsync()); + var ex = Assert.ThrowsAsync(() => testClient.GetAccountStatusAsync()); Assert.IsNotEmpty(ex.Message); Assert.IsNotNull(ex.Error); diff --git a/DetectLanguage.Tests/DetectLanguageConfigurationTest.cs b/DetectLanguage.Tests/DetectLanguageConfigurationTest.cs index 975fcc5..b9686f7 100644 --- a/DetectLanguage.Tests/DetectLanguageConfigurationTest.cs +++ b/DetectLanguage.Tests/DetectLanguageConfigurationTest.cs @@ -10,7 +10,7 @@ public void TestApiKeyConstructor() { var config = new DetectLanguageConfiguration("someApiKey"); Assert.That(config.ApiKey, Is.EqualTo("someApiKey")); - Assert.That(config.ApiBase, Is.EqualTo("https://ws.detectlanguage.com/0.2/")); + Assert.That(config.ApiBase, Is.EqualTo("https://ws.detectlanguage.com/v3/")); Assert.That(config.UserAgent, Does.Match("detectlanguage-dotnet/\\d+")); } } diff --git a/DetectLanguage/DetectLanguage.csproj b/DetectLanguage/DetectLanguage.csproj index 6b34f36..d5f5ef0 100644 --- a/DetectLanguage/DetectLanguage.csproj +++ b/DetectLanguage/DetectLanguage.csproj @@ -4,7 +4,7 @@ Language Detection API Client for .NET (Official Library) DetectLanguage DetectLanguage - 1.0.0 + 2.0.0 detect;identify;language;text;detectlanguage;detection;identification;nlp Laurynas Butkus detectlanguage.com @@ -12,12 +12,12 @@ https://github.com/detectlanguage/detectlanguage-dotnet MIT https://www.nuget.org/profiles/detectlanguage/avatar?imageSize=128 - netstandard2.0 + net5.0;net6.0;net7.0;net8.0;net9.0 README.md - + diff --git a/DetectLanguage/DetectLanguageClient.cs b/DetectLanguage/DetectLanguageClient.cs index 95df218..95171f3 100644 --- a/DetectLanguage/DetectLanguageClient.cs +++ b/DetectLanguage/DetectLanguageClient.cs @@ -28,9 +28,7 @@ public DetectLanguageClient(DetectLanguageConfiguration configuration) { /// Thrown if the request fails. public async Task DetectAsync(string text) { var request = new DetectRequest{ q = text }; - var response = await httpClient.PostAsync("detect", request); - - return response.data.detections; + return await httpClient.PostAsync("detect", request); } /// @@ -56,17 +54,15 @@ public async Task DetectCodeAsync(string text) { /// Thrown if the request fails. public async Task BatchDetectAsync(string[] texts) { var request = new BatchDetectRequest{ q = texts }; - var response = await httpClient.PostAsync("detect", request); - - return response.data.detections; + return await httpClient.PostAsync("detect-batch", request); } /// /// Get account status /// /// Thrown if the request fails. - public async Task GetUserStatusAsync() { - return await httpClient.GetAsync("user/status"); + public async Task GetAccountStatusAsync() { + return await httpClient.GetAsync("account/status"); } /// diff --git a/DetectLanguage/DetectLanguageConfiguration.cs b/DetectLanguage/DetectLanguageConfiguration.cs index 757b78e..b9924dd 100644 --- a/DetectLanguage/DetectLanguageConfiguration.cs +++ b/DetectLanguage/DetectLanguageConfiguration.cs @@ -14,7 +14,7 @@ public class DetectLanguageConfiguration { /// /// The API base URI to use on a per-request basis /// - public string ApiBase { get; set; } = "https://ws.detectlanguage.com/0.2/"; + public string ApiBase { get; set; } = "https://ws.detectlanguage.com/v3/"; /// /// HTTP request timeout diff --git a/DetectLanguage/Entities/UserStatus.cs b/DetectLanguage/Entities/AccountStatus.cs similarity index 97% rename from DetectLanguage/Entities/UserStatus.cs rename to DetectLanguage/Entities/AccountStatus.cs index 46652e5..20f4acb 100644 --- a/DetectLanguage/Entities/UserStatus.cs +++ b/DetectLanguage/Entities/AccountStatus.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; namespace DetectLanguage { - public class UserStatus { + public class AccountStatus { /// /// Current date /// diff --git a/DetectLanguage/Entities/BatchDetectResponse.cs b/DetectLanguage/Entities/BatchDetectResponse.cs deleted file mode 100644 index 9f2e974..0000000 --- a/DetectLanguage/Entities/BatchDetectResponse.cs +++ /dev/null @@ -1,10 +0,0 @@ - -namespace DetectLanguage { - public class BatchDetectResponse { - public BatchDetectData data; - } - - public class BatchDetectData { - public DetectResult[][] detections; - } -} diff --git a/DetectLanguage/Entities/DetectResponse.cs b/DetectLanguage/Entities/DetectResponse.cs deleted file mode 100644 index b991d46..0000000 --- a/DetectLanguage/Entities/DetectResponse.cs +++ /dev/null @@ -1,10 +0,0 @@ - -namespace DetectLanguage { - public class DetectResponse { - public DetectData data; - } - - public class DetectData { - public DetectResult[] detections; - } -} diff --git a/DetectLanguage/Entities/DetectResult.cs b/DetectLanguage/Entities/DetectResult.cs index 0e4020d..f9f55fb 100644 --- a/DetectLanguage/Entities/DetectResult.cs +++ b/DetectLanguage/Entities/DetectResult.cs @@ -8,14 +8,8 @@ public class DetectResult { public string language; /// - /// Is detection reliable + /// Detection score (0-1) /// - [JsonProperty("isReliable")] - public bool reliable; - - /// - /// Detection confidence score - /// - public float confidence; + public float score; } } diff --git a/README.md b/README.md index d6bd80f..a7976bd 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,10 @@ From within Visual Studio: 5. Click on the DetectLanguage package, select the appropriate version in the right-tab and click *Install*. +### Upgrading + +When upgrading please check [changelog](CHANGELOG.md) for breaking changes. + ## Documentation For a comprehensive list of examples, check out the [API documentation][api-docs]. @@ -55,7 +59,7 @@ DetectLanguageClient client = new DetectLanguageClient("YOUR API KEY"); ### Language detection ```c# -DetectResult[] results = await client.DetectAsync("Buenos dias señor"); +DetectResult[] results = await client.DetectAsync("Dolce far niente"); ``` ### Single language code detection @@ -63,7 +67,7 @@ DetectResult[] results = await client.DetectAsync("Buenos dias señor"); If you need just a language code you can use `DetectCodeAsync`. It returns first detected language code. ```c# -string languageCode = await client.DetectCodeAsync("Buenos dias señor"); +string languageCode = await client.DetectCodeAsync("Dolce far niente"); ``` ### Batch detection @@ -80,7 +84,7 @@ DetectResult[][] results = await client.BatchDetectAsync(texts); ### Getting your account status ```c# -UserStatus userStatus = await client.GetUserStatusAsync(); +AccountStatus accountStatus = await client.GetAccountStatusAsync(); ``` ### Getting list supported languages diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..8a031e1 --- /dev/null +++ b/mise.toml @@ -0,0 +1,8 @@ +[tools] +dotnet = "9.0" + +[env] +_.file = ".env.local" + +[tasks] +test = "dotnet test"