From 65681f5f292acf1496612cb505ad758d871e8203 Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 8 Dec 2023 14:19:30 +0100 Subject: [PATCH 1/2] translations: Check that there are no similar identifiers (TEDEFO-2851) There should not be 2 labels identifiers that only differ by upper/lower case or by separator (dash, underscore, or dot). --- .../eforms/sdk/analysis/fact/LabelFact.java | 5 ++++ .../sdk/analysis/drools/translationRules.drl | 11 ++++++++ .../invalid/translations/auxiliary_bg.xml | 8 ++++++ .../invalid/translations/field_bg.xml | 16 ++++++++++++ .../invalid/translations/translations.json | 18 +++++++++++++ .../valid/translations/auxiliary_bg.xml | 7 ++++++ .../valid/translations/field_bg.xml | 16 ++++++++++++ .../valid/translations/translations.json | 18 +++++++++++++ .../sdk/analysis/cucumber/tedefo-2851.feature | 25 +++++++++++++++++++ 9 files changed, 124 insertions(+) create mode 100644 src/main/resources/eu/europa/ted/eforms/sdk/analysis/drools/translationRules.drl create mode 100644 src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/auxiliary_bg.xml create mode 100644 src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/field_bg.xml create mode 100644 src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/translations.json create mode 100644 src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/auxiliary_bg.xml create mode 100644 src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/field_bg.xml create mode 100644 src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/translations.json create mode 100644 src/test/resources/eu/europa/ted/eforms/sdk/analysis/cucumber/tedefo-2851.feature diff --git a/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java b/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java index 151d7f2..a4dad77 100644 --- a/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java +++ b/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java @@ -16,6 +16,11 @@ public String getId() { return label.getId(); } + public String getNormalizedId() { + String id = label.getId(); + return id.trim().toLowerCase().replaceAll("[-_\\.]", ""); + } + @Override public String getTypeName() { return "label"; diff --git a/src/main/resources/eu/europa/ted/eforms/sdk/analysis/drools/translationRules.drl b/src/main/resources/eu/europa/ted/eforms/sdk/analysis/drools/translationRules.drl new file mode 100644 index 0000000..0538bf3 --- /dev/null +++ b/src/main/resources/eu/europa/ted/eforms/sdk/analysis/drools/translationRules.drl @@ -0,0 +1,11 @@ +package eu.europa.ted.eforms.sdk.analysis.drools; + +unit SdkUnit; + +rule "There are no labels with similar identifiers" +when + /labels[ $l: this, $id: id, $normalizedId: normalizedId ]; + /labels[ $otherId: id, $otherId < $id, normalizedId == $normalizedId ] +then + results.add(new ValidationResult($l, "Identifier is similar to " + $otherId, ValidationStatusEnum.ERROR)); +end diff --git a/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/auxiliary_bg.xml b/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/auxiliary_bg.xml new file mode 100644 index 0000000..ba889af --- /dev/null +++ b/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/auxiliary_bg.xml @@ -0,0 +1,8 @@ + + + +auxiliary in Bulgarian. File generated from metadata database version 1.5.0 created on the 2022-12-14T11:00 +Правно основание +Правно основание +Роля на организацията + diff --git a/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/field_bg.xml b/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/field_bg.xml new file mode 100644 index 0000000..25215bc --- /dev/null +++ b/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/field_bg.xml @@ -0,0 +1,16 @@ + + + +field in Bulgarian. File generated from metadata database. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Видът на обявлението според законодателството за обществените поръчки. +Видът на формуляра според законодателството за обществените поръчки. +Европейският идентификатор на процедурите за възлагане на обществени поръчки – единен идентификатор на процедурата за възлагане. Чрез включването на този идентификатор във всички публикувани версии на настоящото обявление (напр. публикувани в TED, национални портали за публикуване, регионални портали за публикуване) се осигурява еднозначно идентифициране на процедурите за възлагане в целия Съюз. + diff --git a/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/translations.json b/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/translations.json new file mode 100644 index 0000000..9ca5857 --- /dev/null +++ b/src/test/resources/eforms-sdk-tests/tedefo-2851/invalid/translations/translations.json @@ -0,0 +1,18 @@ +{ + "files" : [ { + "assetType" : "field", + "twoLetterCode" : "bg", + "threeLetterCode" : "bul", + "filename" : "field_bg.xml" + }, { + "assetType" : "auxiliary", + "twoLetterCode" : "bg", + "threeLetterCode" : "bul", + "filename" : "auxiliary_bg.xml" + } ], + "languages" : [ { + "description" : "Bulgarian", + "twoLetterCode" : "bg", + "threeLetterCode" : "bul" + } ] +} \ No newline at end of file diff --git a/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/auxiliary_bg.xml b/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/auxiliary_bg.xml new file mode 100644 index 0000000..23d709e --- /dev/null +++ b/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/auxiliary_bg.xml @@ -0,0 +1,7 @@ + + + +auxiliary in Bulgarian. File generated from metadata database version 1.5.0 created on the 2022-12-14T11:00 +Правно основание +Роля на организацията + diff --git a/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/field_bg.xml b/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/field_bg.xml new file mode 100644 index 0000000..784811f --- /dev/null +++ b/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/field_bg.xml @@ -0,0 +1,16 @@ + + + +field in Bulgarian. File generated from metadata database. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Правното основание (напр. съюзен или национален нормативен акт), на което се провежда процедурата за възлагане или – при обявленията за предварителна информация – на което ще се проведе процедурата (процедурите) за възлагане. +Видът на обявлението според законодателството за обществените поръчки. +Видът на формуляра според законодателството за обществените поръчки. +Европейският идентификатор на процедурите за възлагане на обществени поръчки – единен идентификатор на процедурата за възлагане. Чрез включването на този идентификатор във всички публикувани версии на настоящото обявление (напр. публикувани в TED, национални портали за публикуване, регионални портали за публикуване) се осигурява еднозначно идентифициране на процедурите за възлагане в целия Съюз. + diff --git a/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/translations.json b/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/translations.json new file mode 100644 index 0000000..9ca5857 --- /dev/null +++ b/src/test/resources/eforms-sdk-tests/tedefo-2851/valid/translations/translations.json @@ -0,0 +1,18 @@ +{ + "files" : [ { + "assetType" : "field", + "twoLetterCode" : "bg", + "threeLetterCode" : "bul", + "filename" : "field_bg.xml" + }, { + "assetType" : "auxiliary", + "twoLetterCode" : "bg", + "threeLetterCode" : "bul", + "filename" : "auxiliary_bg.xml" + } ], + "languages" : [ { + "description" : "Bulgarian", + "twoLetterCode" : "bg", + "threeLetterCode" : "bul" + } ] +} \ No newline at end of file diff --git a/src/test/resources/eu/europa/ted/eforms/sdk/analysis/cucumber/tedefo-2851.feature b/src/test/resources/eu/europa/ted/eforms/sdk/analysis/cucumber/tedefo-2851.feature new file mode 100644 index 0000000..3285774 --- /dev/null +++ b/src/test/resources/eu/europa/ted/eforms/sdk/analysis/cucumber/tedefo-2851.feature @@ -0,0 +1,25 @@ +@tedefo-2851 +Feature: Translation - Check label identifiers + TEDEFO-2851: Check for duplicate label identifiers. + Test files under under "src/test/resources/eforms-sdk-tests/tedefo-2851" + + Background: + Given The following rules + | There are no labels with similar identifiers | + + Scenario: There are no labels with similar identifiers + Given A "tedefo-2851" folder with "valid" files + When I load all labels + And I execute validation + Then I should get 0 SDK validation errors + + Scenario Outline: Some label identifiers are similar + Given A "tedefo-2851" folder with "invalid" files + When I load all labels + And I execute validation + Then Rule "" should have been fired + Then I should get 2 SDK validation errors + + Examples: + | expected rule | + | There are no labels with similar identifiers | From 24a08cfac09b8160d23a2de56b5cc533d5c0f430 Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 8 Dec 2023 17:51:30 +0100 Subject: [PATCH 2/2] LabelFact: Use strip() to handle non-ASCII whitespace --- .../java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java b/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java index a4dad77..c97e1a1 100644 --- a/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java +++ b/src/main/java/eu/europa/ted/eforms/sdk/analysis/fact/LabelFact.java @@ -18,7 +18,7 @@ public String getId() { public String getNormalizedId() { String id = label.getId(); - return id.trim().toLowerCase().replaceAll("[-_\\.]", ""); + return id.strip().toLowerCase().replaceAll("[-_\\.]", ""); } @Override