diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/build-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/build-dto.ts index 40affd6551..e3b95e4053 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/build-dto.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/build-dto.ts @@ -1,6 +1,5 @@ import { ProjectScriptureRange } from 'realtime-server/lib/esm/scriptureforge/models/translate-config'; import { BuildStates } from './build-states'; -import { QuotationAnalysis } from './quotation-denormalization'; import { ResourceDto } from './resource-dto'; export interface BuildDto extends ResourceDto { @@ -26,5 +25,5 @@ export interface ServalBuildAdditionalInfo { translationScriptureRanges: ProjectScriptureRange[]; trainingDataFileIds: string[]; requestedByUserId?: string; - quotationDenormalization: QuotationAnalysis; + canDenormalizeQuotes: boolean; } diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/quotation-denormalization.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/quotation-denormalization.ts deleted file mode 100644 index 6907b4186e..0000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/quotation-denormalization.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum QuotationAnalysis { - Successful = 'successful', - Unsuccessful = 'unsuccessful' -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.spec.ts index 0d2f5cf7cf..23eb2933ee 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.spec.ts @@ -33,7 +33,6 @@ import { SF_TYPE_REGISTRY } from '../../../core/models/sf-type-registry'; import { SFProjectService } from '../../../core/sf-project.service'; import { BuildDto } from '../../../machine-api/build-dto'; import { BuildStates } from '../../../machine-api/build-states'; -import { QuotationAnalysis } from '../../../machine-api/quotation-denormalization'; import { ServalAdministrationService } from '../../../serval-administration/serval-administration.service'; import { provideQuillRegistrations } from '../../../shared/text/quill-editor-registration/quill-providers'; import { EDITOR_READY_TIMEOUT } from '../../../shared/text/text.component'; @@ -184,7 +183,7 @@ describe('DraftUsfmFormatComponent', () => { })); it('should initialize and default to best guess and automatic quotes', fakeAsync(async () => { - const env = new TestEnvironment({ quotationAnalysis: QuotationAnalysis.Successful }); + const env = new TestEnvironment({ canDenormalizeQuotes: true }); expect(env.component.paragraphFormat.value).toBe(ParagraphBreakFormat.BestGuess); expect(env.component.quoteFormat.value).toBe(QuoteFormat.Denormalized); expect(await env.component.confirmLeave()).toBe(true); @@ -278,7 +277,7 @@ describe('DraftUsfmFormatComponent', () => { })); it('shows a notice if unable to detect the quote convention for the project', fakeAsync(() => { - const env = new TestEnvironment({ quotationAnalysis: QuotationAnalysis.Unsuccessful }); + const env = new TestEnvironment({ canDenormalizeQuotes: false }); expect(env.quoteFormatWarning).not.toBeNull(); })); }); @@ -290,11 +289,11 @@ class TestEnvironment { readonly projectId = 'project01'; onlineStatusService: TestOnlineStatusService; - constructor(args: { project?: Partial; quotationAnalysis?: QuotationAnalysis } = {}) { + constructor(args: { project?: Partial; canDenormalizeQuotes?: boolean } = {}) { const userDoc = mock(UserDoc); this.onlineStatusService = TestBed.inject(OnlineStatusService) as TestOnlineStatusService; when(mockedDraftGenerationService.getLastCompletedBuild(anything())).thenReturn( - of(this.getTestBuildDto(args.quotationAnalysis ?? QuotationAnalysis.Successful)) + of(this.getTestBuildDto(args.canDenormalizeQuotes ?? true)) ); when(mockedUserService.getCurrentUser()).thenResolve(userDoc); when(mockedDraftHandlingService.getDraft(anything(), anything())).thenReturn( @@ -369,7 +368,7 @@ class TestEnvironment { when(mockedActivatedProjectService.projectDoc).thenReturn(projectDoc); } - private getTestBuildDto(quotationAnalysis: QuotationAnalysis): BuildDto { + private getTestBuildDto(canDenormalizeQuotes: boolean): BuildDto { return { id: 'build01', state: BuildStates.Completed, @@ -387,7 +386,7 @@ class TestEnvironment { translationScriptureRanges: [{ projectId: 'source01', scriptureRange: 'EXO' }], trainingScriptureRanges: [{ projectId: 'source01', scriptureRange: 'GEN' }], trainingDataFileIds: [] as string[], - quotationDenormalization: quotationAnalysis + canDenormalizeQuotes } }; } diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.ts index 586a23f75e..11ef2a8d8f 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/draft-usfm-format.component.ts @@ -27,7 +27,6 @@ import { OnlineStatusService } from 'xforge-common/online-status.service'; import { filterNullish, quietTakeUntilDestroyed } from 'xforge-common/util/rxjs-util'; import { TextDocId } from '../../../core/models/text-doc'; import { SFProjectService } from '../../../core/sf-project.service'; -import { QuotationAnalysis } from '../../../machine-api/quotation-denormalization'; import { ServalAdministrationService } from '../../../serval-administration/serval-administration.service'; import { BookChapterChooserComponent } from '../../../shared/book-chapter-chooser/book-chapter-chooser.component'; import { NoticeComponent } from '../../../shared/notice/notice.component'; @@ -79,7 +78,7 @@ export class DraftUsfmFormatComponent extends DataLoadingComponent implements Af private updateDraftConfig$: Subject = new Subject(); private lastSavedState?: DraftUsfmConfig; - private quotationDenormalization: QuotationAnalysis = QuotationAnalysis.Successful; + private canDenormalizeQuotes?: boolean = undefined; constructor( private readonly activatedRoute: ActivatedRoute, @@ -100,10 +99,7 @@ export class DraftUsfmFormatComponent extends DataLoadingComponent implements Af .pipe(filterNullish(), first(), quietTakeUntilDestroyed(this.destroyRef)) .subscribe(async projectId => { const currentBuild = await firstValueFrom(this.draftGenerationService.getLastCompletedBuild(projectId)); - this.quotationDenormalization = - currentBuild?.additionalInfo?.quotationDenormalization === QuotationAnalysis.Successful - ? QuotationAnalysis.Successful - : QuotationAnalysis.Unsuccessful; + this.canDenormalizeQuotes = currentBuild?.additionalInfo?.canDenormalizeQuotes; }); } @@ -125,7 +121,7 @@ export class DraftUsfmFormatComponent extends DataLoadingComponent implements Af } get showQuoteFormatWarning(): boolean { - return this.quotationDenormalization !== QuotationAnalysis.Successful; + return this.canDenormalizeQuotes === false; } private get currentFormat(): DraftUsfmConfig | undefined { diff --git a/src/SIL.XForge.Scripture/Models/ServalBuildAdditionalInfo.cs b/src/SIL.XForge.Scripture/Models/ServalBuildAdditionalInfo.cs index be91f5c0b8..1b8b8df81c 100644 --- a/src/SIL.XForge.Scripture/Models/ServalBuildAdditionalInfo.cs +++ b/src/SIL.XForge.Scripture/Models/ServalBuildAdditionalInfo.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using SIL.Converters.Usj; namespace SIL.XForge.Scripture.Models; @@ -20,13 +17,5 @@ public class ServalBuildAdditionalInfo public HashSet TrainingDataFileIds { get; init; } = []; public string TranslationEngineId { get; init; } = string.Empty; public HashSet TranslationScriptureRanges { get; init; } = []; - - [JsonConverter(typeof(StringEnumConverter), typeof(LowerCaseNamingStrategy))] - public QuotationAnalysis QuotationDenormalization { get; set; } = QuotationAnalysis.Unsuccessful; -} - -public enum QuotationAnalysis -{ - Successful, - Unsuccessful, + public bool CanDenormalizeQuotes { get; set; } = false; } diff --git a/src/SIL.XForge.Scripture/Services/MachineApiService.cs b/src/SIL.XForge.Scripture/Services/MachineApiService.cs index 75b14e7955..85de230a67 100644 --- a/src/SIL.XForge.Scripture/Services/MachineApiService.cs +++ b/src/SIL.XForge.Scripture/Services/MachineApiService.cs @@ -2251,6 +2251,8 @@ string bookId in ScriptureRangeParser private static ServalBuildDto CreateDto(TranslationBuild translationBuild) { string? parallelCorpusId = translationBuild.Pretranslate?.FirstOrDefault()?.ParallelCorpus?.Id; + var matchingCorpus = translationBuild.Analysis?.FirstOrDefault(a => a.ParallelCorpusRef == parallelCorpusId); + var buildDto = new ServalBuildDto { Id = translationBuild.Id, @@ -2285,16 +2287,7 @@ .. translationBuild .Where(id => !string.IsNullOrEmpty(id)) ?? [], ] ), - QuotationDenormalization = - parallelCorpusId is not null - && translationBuild.Analysis?.FirstOrDefault(a => - a.ParallelCorpusRef == parallelCorpusId - && !string.IsNullOrEmpty(a.SourceQuoteConvention) - && !string.IsNullOrEmpty(a.TargetQuoteConvention) - ) - is not null - ? QuotationAnalysis.Successful - : QuotationAnalysis.Unsuccessful, + CanDenormalizeQuotes = matchingCorpus?.CanDenormalizeQuotes == true, DateFinished = translationBuild.DateFinished, Step = translationBuild.Step, TranslationEngineId = translationBuild.Engine.Id, diff --git a/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs b/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs index 286f57a65d..d235865907 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs @@ -989,6 +989,7 @@ public async Task GetBuildAsync_IncludesAdditionalInfo() ParallelCorpusRef = parallelCorpusId1, SourceQuoteConvention = "standard_english", TargetQuoteConvention = "standard_english", + CanDenormalizeQuotes = true, }, ], }; @@ -1027,7 +1028,7 @@ public async Task GetBuildAsync_IncludesAdditionalInfo() Assert.AreEqual(parallelCorpusId1, actual.AdditionalInfo.ParallelCorporaIds!.ElementAt(0)); Assert.AreEqual(parallelCorpusId2, actual.AdditionalInfo.ParallelCorporaIds.ElementAt(1)); Assert.AreEqual(TrainingDataId01, actual.AdditionalInfo.TrainingDataFileIds.Single()); - Assert.AreEqual(actual.AdditionalInfo.QuotationDenormalization, QuotationAnalysis.Successful); + Assert.That(actual.AdditionalInfo.CanDenormalizeQuotes, Is.True); } [Test] @@ -1274,6 +1275,7 @@ public async Task GetBuildsAsync_SuccessWithEventMetrics() ParallelCorpusRef = ParallelCorpusId01, SourceQuoteConvention = "standard_english", TargetQuoteConvention = "standard_english", + CanDenormalizeQuotes = true, }, ]; translationBuild.Pretranslate = @@ -1361,7 +1363,7 @@ public async Task GetBuildsAsync_SuccessWithEventMetrics() builds[0].AdditionalInfo.TrainingScriptureRanges.Single().ScriptureRange ); Assert.AreEqual(TrainingDataId01, builds[0].AdditionalInfo.TrainingDataFileIds.Single()); - Assert.AreEqual(builds[0].AdditionalInfo!.QuotationDenormalization, QuotationAnalysis.Successful); + Assert.That(builds[0].AdditionalInfo.CanDenormalizeQuotes, Is.True); } [Test] @@ -1403,7 +1405,7 @@ public async Task GetBuildsAsync_SuccessWithFallbackToLegacyBuild() trainingScriptureRange, builds[0].AdditionalInfo?.TrainingScriptureRanges.Single().ScriptureRange ); - Assert.AreEqual(builds[0].AdditionalInfo!.QuotationDenormalization, QuotationAnalysis.Unsuccessful); + Assert.That(builds[0].AdditionalInfo!.CanDenormalizeQuotes, Is.False); } [Test] @@ -1455,7 +1457,7 @@ public async Task GetBuildsAsync_SuccessWithFallbackToPreTranslateBuild() trainingScriptureRange, builds[0].AdditionalInfo?.TrainingScriptureRanges.Single().ScriptureRange ); - Assert.AreEqual(builds[0].AdditionalInfo!.QuotationDenormalization, QuotationAnalysis.Unsuccessful); + Assert.That(builds[0].AdditionalInfo!.CanDenormalizeQuotes, Is.False); } [Test]