diff --git a/Makefile b/Makefile index 7f2392bced974..5d218655c797e 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ UID ?= $(shell id -u) export USER_UID:=${UID} export CPU_COUNT=$(shell nproc || echo 1) - +export MSYS_NO_PATHCONV=1 DOCKER_COMPOSE=docker-compose --env-file=${ENV_FILE} # we run tests in a specific project name to be separated from dev instances @@ -224,6 +224,10 @@ test-int: guard-test # usage: make test-one test=test-file.t stop_tests: ${DOCKER_COMPOSE_TEST} stop +update_tests_results: + @echo "🥫 Updated expected test results with actuals for easy Git diff" + ${DOCKER_COMPOSE_TEST} run --rm -w /opt/product-opener/tests backend bash update_tests_results.sh + # check perl compiles, (pattern rule) / but only for newer files %.pm %.pl: _FORCE if [ -f $@ ]; then perl -c -CS -Ilib $@; else true; fi diff --git a/lib/ProductOpener/Ingredients.pm b/lib/ProductOpener/Ingredients.pm index 3bedc39c3e6ec..dffd47522f8af 100644 --- a/lib/ProductOpener/Ingredients.pm +++ b/lib/ProductOpener/Ingredients.pm @@ -2468,6 +2468,10 @@ Otherwise use 0 for percent_min and total_max for percent_max. =cut sub init_percent_values ($total_min, $total_max, $ingredients_ref) { + # Set maximum percentages if defined in the taxonomy (only do this for top-level ingredients) + if ($total_max == 100) { + set_percent_max_from_taxonomy($ingredients_ref); + } # Determine if percent listed are absolute (default) or relative to a parent ingredient @@ -2542,6 +2546,66 @@ sub init_percent_values ($total_min, $total_max, $ingredients_ref) { return; } +=head2 set_percent_max_from_taxonomy ( ingredients_ref ) + +Set the percentage maximum for ingredients like flavouring where this is defined +on the Ingredients taxonomy. The percent_max will not be applied in the following cases: + + - if applying the percent_max would mean that it is not possible for the ingredient + total to add up to 100% + - If a later ingredient has a higher percentage than the percent_max of the restricted ingredient + +=cut + +sub set_percent_max_from_taxonomy ($ingredients_ref) { + # Exit if the first ingredient is constrained + if (!@{$ingredients_ref} + || defined get_inherited_property("ingredients", $ingredients_ref->[0]{id}, "percent_max:en")) + { + return; + } + + # Loop backwards through ingredients, checking that we don't set a percent_max that + # would be lower than the defined percentage of any ingredient that comes afterwards + my $highest_later_percent = 0; + for (my $index = scalar @{$ingredients_ref} - 1; $index > 0; $index--) { + my $ingredient = $ingredients_ref->[$index]; + my $current_percent = $ingredient->{percent}; + if (defined $current_percent) { + if ($current_percent > $highest_later_percent) { + $highest_later_percent = $current_percent; + } + } + else { + # See if taxonomy defines a maximum percent + my $percent_max = get_inherited_property("ingredients", $ingredient->{id}, "percent_max:en"); + if (defined $percent_max and $percent_max >= $highest_later_percent) { + # Maximum percantage for ingredients like flavourings + $ingredient->{percent_max} = $percent_max; + } + } + } + + # Loop forwards through the ingredients to make sure that the maximum + # does not limit preceding ingredients where percent is specified + my $remaining_percent = 100; + for my $ingredient (@{$ingredients_ref}) { + my $defined_percent = $ingredient->{percent}; + if (!defined $defined_percent) { + my $percent_max = $ingredient->{percent_max}; + if (defined $percent_max && $percent_max < $remaining_percent) { + delete $ingredient->{percent_max}; + } + last; + } + else { + $remaining_percent = $remaining_percent - $defined_percent; + } + } + + return; +} + sub set_percent_max_values ($total_min, $total_max, $ingredients_ref) { my $changed = 0; diff --git a/taxonomies/ingredients.all.txt b/taxonomies/ingredients.all.txt index 9d0bfdc6ace3e..965318fb864a4 100644 --- a/taxonomies/ingredients.all.txt +++ b/taxonomies/ingredients.all.txt @@ -21,6 +21,7 @@ fi: Happo, Happoa, Hapot, Happoja fr: Acidifiant, acide alimentaire, acide, acidulants, acide alimentaire ga: Aigéad he:חומצה +hr: kiselina, kiseline, sredstva kiselosti hu: Étkezési sav it: Acidificante, acidificanti ja: 酸味料 @@ -59,7 +60,7 @@ description:sv:Syror: ämnen som ökar surheten hos ett livsmedel och/eller ger en: Acidity regulator, alkali, base, buffer, buffering agent, pH adjusting agent, corrector of acidity, acid regulator, controls acidity -bg: Регулатор на киселинност, регулатор на киселинността +bg: Регулатор на киселинност, регулатор на киселинността, регулатори на киселинността ca: Corrector de l'acidesa, correctors de l'acidesa, correctiu de l acidesa cs: Regulátor kyselosti da: Surhedsregulerende middel, Surhedsregulerende midler @@ -71,6 +72,7 @@ fi: Happamuudensäätöaine, Happamuudensäätöaineet, Happamuudensäätöainet fr: Correcteur d’acidité, régulateur de l'acidité, régulateur d'acidité, agent tampon, ajusteur du pH, alcali, base, tampon ga: Rialtán aigéadachta he:מווסת חומציות +hr: regulator kiselosti, regulatori kiselosti hu: Savanyúságot szabályozó anyag, Savanyúságot szabályozó anyagok, Savanyúságot szabályzó anyag, Savanyúságot szabályzó anyagok id: pengatur keasaman is: Sýrustillir, Sýrustillar @@ -82,7 +84,7 @@ nb: Surhetsregulerende middel, Surhetsregulerende midler nl: Zuurteregelaar, Zuurteregelaars pl: Regulator kwasowości, Regulatory kwasowości pt: Regulador de acidez, regulador de ácidez, reguladores de acidez -ro: Corector de aciditate, Regulator de aciditate +ro: Corector de aciditate, Regulator de aciditate, regulatori de aciditate ru:Регулятор кислотности, регуляторы кислотности sk: Regulátor kyslosti sl: Sredstvo za uravnavanje kislosti @@ -121,6 +123,7 @@ et: Paakumisvastane aine fi: Paakkuuntumisenestoaine, Paakkuuntumisenestoainetta, Paakkuuntumisenestoaineet, Paakkuuntumisenestoaineita fr: Antiagglomérant, agent antiadhésif, agent de pulvérisation sèche, agent dessicateur, anti-agglomérant, poudre de fleurage ga: Oibreán frithstolptha +hr: sredstvo protiv zgrudnjavanja, tvar za sprečavanje zgrudnjavanja hu: Csomósodást és lesülést gátló anyag, Csomósodást gátló anyag it: Agente antiagglomerante, agenti antiagglomeranti, antiagglomerante, antiagglomeranti lt: Lipnumą reguliuojanti medžiaga @@ -202,7 +205,7 @@ description:sl:Sredstva proti penjenju so snovi, ki preprečujejo ali zmanjšuje description:sv:Skumdämpningsmedel: ämnen som förhindrar eller minskar skumbildning. en: Antioxidant, antibrowning agent, antioxidant synergist -bg: Антиоксидант +bg: Антиоксидант, антиоксиданти ca: Antioxidant, antioxidants, agent antienfosquiment cs: Antioxidant, antioxidanty da: Antioxidant, Antioxidanter @@ -213,6 +216,7 @@ et: Antioksüdant fi: Hapettumisenestoaine, Hapettumisenestoainetta, Hapettumisenestoaineet, Hapettumisenestoaineita, Antioksidantti fr: Antioxydant, antioxygène, antibrunissant, antioxydant synergique, anti-oxydant ga: Frithocsaídeoir +hr: antioksidans hu: Antioxidáns, antioxidánsok it: Antiossidante, antiossidanti, agente antiossidante, agenti antiossidanti ja: 酸化防止剤 @@ -252,6 +256,9 @@ description:sv:Antioxidationsmedel: ämnen som förlänger hållbarheten hos liv en:natural antioxidant +en:release agent +fr:agent de démoulage + en:Bleaching agent es:Decolorante, blanqueador, blanqueadores fi:Valkaisuaine, Valkaisuainetta, Valkaisuaineet, Valkaisuaineita @@ -275,6 +282,7 @@ et: Mahuaine fi: Täyteaine, Täyteainetta, Täyteaineet, Täyteaineita fr: Agent de charge ga: Toirteoir +hr: sredstva za povećanje zapremine hu: Tömegnövelő szer, térfogatnövelőszer, térfogatnövelőszerek it: Agente di carica, agenti di carica lt: Užpildas @@ -347,7 +355,7 @@ fi: Väri, Väriä, Värit, Värejä, Väriaine, Väriainetta, Väriaineet, Vär fr: Colorant, colorant de surface, pigment décoratif, pigment colorant, colorants, colorant alimentaire, colorants alimentaires ga:Dath he:צבע -hr:Boja +hr: boja, bojila, bojilo, bojenje hu: Színezék, mesterséges színezék, színezőanyag, színezékek, színezőanyagok, színező anyag is: Litarefni it: Colorante, coloranti, alimento colorante @@ -431,7 +439,7 @@ description:fr:Additif alimentaire qui stabilise, retient ou intensifie la coule # nova:en:emulsifier -en: Emulsifier, clouding agent, crystallization inhibitor, density adjustment agent, dispersing agent, emulsifier blend, emulsifying agent, plasticizer, surface active agent, suspension agent +en: Emulsifier, clouding agent, crystallization inhibitor, density adjustment agent, dispersing agent, emulsifier blend, emulsifying agent, emulsifying, plasticizer, surface active agent, suspension agent bg: Емулгатор, емулгатори ca:Emulsionant, emulgent, emulgents, emulsiu, agent dispersant, agents dispersants cs: Emulgátor @@ -443,7 +451,7 @@ et: Emulgaator fi: Emulgointiaine, Emulgointiainetta, Emulgointiaineet, Emulgointiaineita fr: Émulsifiant, agent de dispersion, agent de surface, agent de suspension, agent d'ajustement de la densité, inhibiteur de cristallisation, nébulisant, plastifiant ga: Eiblitheoir -hr: Emulgator, emulgatori +hr: emulgator, emulgatori hu: Emulgeálószer, emulgeálószerek, kristályosodásgátló, sűrűségszabályozó szer, diszpergálószer, lágyító, felületaktív anyag, szuszpenziós szer is: Yruefni it: Emulsionante, emulsionanti, agente emulsionante, agenti emulsionanti @@ -546,6 +554,7 @@ et: Tardaine fi: Kiinteyttämisaine, Kiinteyttämisainetta, Kiinteyttämisaineet, Kiinteyttämisaineita fr: Affermissant, agent affermissant ga: Oibreán teannta +hr: učvršćivač, učvršćivač za učvršćivanje hu: Szilárdítóanyag it: Agente di resistenza, agenti di resistenza lt: Kietiklis @@ -597,6 +606,7 @@ et: Lõhna- ja maitsetugevdaja fi: Arominvahvenne, Arominvahvennetta, Arominvahventeet, Arominvahventeita, Aromivahvenne, Aromivahvennetta, Aromivahventeen, Aromivahventeita fr: Exhausteur de goût, exhausteurs de goût, Exaltateur d'arôme, agent de sapidité, activateur d'arôme, exaltateur de goût, exhausteur d'arôme, exhausteurs de saveur, exhausteur de saveur ga: Méadaitheoir blais +hr: pojačivač okusa, pojačivači okusa, sirup pojačivač okusa hu: Ízfokozó, Ízfokozók it: Esaltatore di sapidità, esaltatori di sapidità lt: Aromato ir skonio stipriklis @@ -648,6 +658,7 @@ et: Jahu parendaja fi: Jauhonparanne, Jauhoparannetta, Jauhonparanteet, Jauhonparanteita fr: Agent de traitement de la farine, agents de traitement de la farine, agent de traitement de farine, agent de blanchiment de la farine, agent de conditionnement des pâtes, agent de réhaussement des pâtes, améliorant de la farine ga: Oibreán plúrchóireála +hr: tvar za tretiranje brašna hu: Lisztkezelő szer, lisztkezelőszer, lisztjavító szer, lisztjavítószer it: Agente di trattamento della farina, agenti di trattamento della farina, agente di trattamento delle farine lv: Miltu apstrādes līdzeklis @@ -743,6 +754,7 @@ et:Želeeriv aine fi:Hyytelöimisaine, Hyytelöimisainetta, Hyytelöimisaineet, Hyytelöimisaineita fr:Gélifiant, Agent gélifiant ga:Oibreán glóthúcháin +hr:tvar za želiranje hu:Zselésítőanyag, zselésítő anyag, zselésítő it:Gelificante, gelificanti, agente gelificante, agenti gelificanti lt:Stingdiklis @@ -838,6 +850,7 @@ fi: Kosteudensäilyttäjä, Kosteudensäilyttäjää, Kosteudensäilyttäjät, K et: Niiskusesäilitaja fr: Humectant, agent de rétention d'eau, agent de rétention d'humidité, mouillant, agent mouillant ga: Taisleán +hr: tvar za zadržavanje vlage hu: Nedvesítőszer it: Umidificante, umidificanti, agente umidificante, agenti umidificanti, umettante, umettanti lt: Drėgmę išlaikanti medžiaga @@ -845,7 +858,7 @@ lv: Mitrumuzturētājs nb: Fuktighetsbevarer nl: Bevochtigingsmiddel pt: Humidificante, humidificantes -pl: Substancja utrzymująca wilgoć, Substancje utrzymujące wilgoć +pl: Substancja utrzymująca wilgoć, Substancje utrzymujące wilgoć, Substancja utrzymująca wilgotność, Substancje utrzymujące wilgotność ro: Agent de umezire ru: влагоудерживающий агент, влагоудерживающие агенты, агент влагоудерживающий, агент-влагоудерживающий sk: Zvlhčovadlo @@ -873,6 +886,7 @@ description:sl:Sredstva za ohranjanje vlage so snovi, ki preprečujejo izsušite description:sv:Fuktighetsbevarande medel: ämnen som förhindrar uttorkning av livsmedel genom att motverka effekten av luft med låg fuktighet, eller förbättrar upplösningen av pulver i vattenlösningar. en: Modified starch +bg: Модифицирано нишесте, модифицирана скорбяла ca: Midó modificat ga: Stáirse modhnaithe de: Modifizierte Stärke, Modifizierte Stärken @@ -921,6 +935,7 @@ fi: Säilöntäaine, Säilöntäainetta, Säilöntäaineet, Säilöntäaineita fr: Conservateur, agent conservateur, agent antimoisissure et antifilant, agent antimoisissure, antifilant, agent antimycoses, agent de conservation, agent de conservation antimicrobien, agent de contrôle bactériologique, antimicrobien synergique, agent antimicrobien, antimicrobien, fongiostatique, agent antifongique ga: Leasaitheach he:חומר משמר +hr: konzervans, konzervansi, tvar za zadržavanje svježine, tvar za održavanje svježine hu: Tartósítószer, tartósítószerek is: Rotvarnarefni it: Conservante, conservanti, agente conservante, agenti conservanti @@ -1029,6 +1044,7 @@ et: Kergitusaine, kergitusained fi: Nostatusaine, Nostatusainetta, Nostatusaineet, Nostatusaineita fr: Agent levant, agent de levuration, poudres levantes, poudre à lever, poudres à lever, poudre levante ga: Oibreán éiritheach +hr: sredstvo za rahljenje, tvar za rahljenje, tvari za rahljenje, tvar za rahljenje za dizanje tijesta, tvari za podizanje hu: Térfogatnövelő szer, térfogatnövelő szerek is: Lyftiefni it: Agente lievitante, agenti lievitanti, lievitante, lievitanti @@ -1130,7 +1146,7 @@ es: Estabilizador, estabilizadores, estabilizadores coloidales, estabilizadores et: Stabilisaator fi: Stabilointiaine, Stabilointiainetta, Stabilointiaineet, Stabilointiaineita, sideaine, sidonta-aine, sidonta-aineet fr: Stabilisant, liant, stabilisateur colloïdal, stabilisateur d'émulsion, stabilisateur de mousse, agent stabilisant, stabilisateur, stabilisateurs -hr: Stabilizator +hr: Stabilizator, stabilizatori hu: Stabilizátor, stabilizátorok, kötőanyag ga: Cobhsaitheoir is:bindiefni @@ -1178,7 +1194,7 @@ en:natural stabilizer # nova:en:sweetener en: Sweetener, bulk sweetener, intense sweetener -bg: Подсладител +bg: Подсладител, подсладители ca: Edulcorant, esdulcorants cs: Sladidlo da: Sødestof, Sødestoffer, Kunstigt sødemiddel, sødemiddel @@ -1189,6 +1205,7 @@ et: Magusaine fi: Makeutusaine, Makeutusainetta, Makeutusaineet, Makeutusaineita fr: Édulcorant, édulcorant de charge, édulcorant intense ga: Milseoir +hr: sladila, sladilo, zaslađivač hu: Édesítőszer, édesítőszerek it: Edulcorante, edulcoranti, dolcificante, dolcificanti ja: 甘味料 @@ -1231,7 +1248,7 @@ description:sv:Sötningsmedel: ämnen som används för att ge livsmedel söt sm en: Thickener, bodying agent, texturizing agent, thickener synergist, thickening agent, provides body, provides thickness bg: Сгъстител, сгъстители -ca:Espessidor, espessidors, agent espessidor, agents espessidors, espessant, espessants +ca: Espessidor, espessidors, agent espessidor, agents espessidors, espessant, espessants cs: Zahušťovadlo da: Fortykningsmiddel, Fortykningsmidler de: Verdickungsmittel @@ -1241,6 +1258,7 @@ et: Paksendaja, Paksendajad fi: Sakeuttamisaine, Sakeuttamisainetta, Sakeuttamisaineet, Sakeuttamisaineita, luonnollinen sakeutusaine fr: Épaississant, agent de texture, épaississan synergiste, raffermissant, agent épaississant, agents épaississants ga: Tiúsóir +hr: zgušnjivač, zgušnjivači hu: Sűrítőanyag, sűrítőanyagok it: Addensante, addensanti, agente addensante, agenti addensanti ja: 増粘剤 @@ -1290,6 +1308,7 @@ es:Vitaminas et:Vitamiinid fi:Vitamiinit, Vitamiineja fr:Vitamines +hr:vitamini hu:Vitaminok it:Vitamine lt:Vitaminai @@ -1467,18 +1486,17 @@ hu:Egyéb táplálkozási anyagok, egyéb tápanyagok it:Altre sostanze nutrizionali, altre sostanze nutritive # See also Firming agent -en:coagulant, coagulum, coagulating agent +en:coagulant, coagulum, coagulating agent, clotting agents +bg:коагулант ca:Agent coagulant, agents coagulants -de:Koagulat, Gerinnungsmittel -en:agente coagulante, agentes coagulantes, coagulante -es:Agente coagulante, agentes coagulantes +de:Koagulationsmittel, Koagulat, Gerinnungsmittel +es:Agente coagulante, agentes coagulantes, agentes cuajantes, coagulante, coagulantes fi:hyydyte, koagulantti fr:agent de coagulation, coagulant hu:koagulálószer, koaguláló, koaguláns it:agente coagulante, coagulante, agenti coagulanti, coagulanti # ingredient/fr:agents-de-coagulation has 37 products in 5 languages @2019-02-08 - en:salt substitute bg:заместител на сол de:Speisesalzersatz, kochsalzersatz @@ -1514,6 +1532,7 @@ nl:verbeteraar # also in ingredients.txt "en", ingredients_text => "milk, flavouring"}, + [ + { + 'id' => 'en:milk', + 'percent_estimate' => 97.5, + 'percent_max' => 100, + 'percent_min' => 95, + 'text' => 'milk' + }, + { + 'id' => 'en:flavouring', + 'percent_estimate' => 2.5, + 'percent_max' => 5, + 'percent_min' => 0, + 'text' => 'flavouring' + } + ] + ], + + # Can get percent_max from parent ingredient + [ + {lc => "en", ingredients_text => "milk, natural flavouring"}, + [ + { + 'id' => 'en:milk', + 'percent_estimate' => 97.5, + 'percent_max' => 100, + 'percent_min' => 95, + 'text' => 'milk' + }, + { + 'id' => 'en:natural-flavouring', + 'percent_estimate' => 2.5, + 'percent_max' => 5, + 'percent_min' => 0, + 'text' => 'natural flavouring' + } + ] + ], + + # Where flavourings are the first ingredient then ignore maximum percentages + [ + {lc => "en", ingredients_text => "flavouring, lemon flavouring"}, + [ + { + 'id' => 'en:flavouring', + 'percent_estimate' => 75, + 'percent_max' => 100, + 'percent_min' => 50, + 'text' => 'flavouring' + }, + { + 'id' => 'en:lemon-flavouring', + 'percent_estimate' => 25, + 'percent_max' => 50, + 'percent_min' => 0, + 'text' => 'lemon flavouring' + } + ] + ], + + # Where maximum would prevent ingredients from adding up to 100% then ignore it + [ + {lc => "en", ingredients_text => "milk 80%, flavouring"}, + [ + { + 'id' => 'en:milk', + 'percent' => 80, + 'percent_estimate' => 80, + 'percent_max' => 80, + 'percent_min' => 80, + 'text' => 'milk' + }, + { + 'id' => 'en:flavouring', + 'percent_estimate' => 20, + 'percent_max' => 20, + 'percent_min' => 20, + 'text' => 'flavouring' + } + ] + ], + + # Where maximum is lower than later ingredients then ignore it + [ + {lc => "en", ingredients_text => "milk, flavouring, sugar 10%"}, + [ + { + 'id' => 'en:milk', + 'percent_estimate' => 62.5, + 'percent_max' => 80, + 'percent_min' => 45, + 'text' => 'milk' + }, + { + 'id' => 'en:flavouring', + 'percent_estimate' => 23.75, + 'percent_max' => 45, + 'percent_min' => 10, + 'text' => 'flavouring' + }, + { + 'id' => 'en:sugar', + 'percent' => 10, + 'percent_estimate' => 13.75, + 'percent_max' => 10, + 'percent_min' => 10, + 'text' => 'sugar' + } + ] + ], + + # Where two ingredients have a maximum then apply it + [ + {lc => "en", ingredients_text => "milk, lemon flavouring, orange flavouring"}, + [ + { + 'id' => 'en:milk', + 'percent_estimate' => 95, + 'percent_max' => 100, + 'percent_min' => 90, + 'text' => 'milk' + }, + { + 'id' => 'en:lemon-flavouring', + 'percent_estimate' => 2.5, + 'percent_max' => 5, + 'percent_min' => 0, + 'text' => 'lemon flavouring' + }, + { + 'id' => 'en:orange-flavouring', + 'percent_estimate' => 2.5, + 'percent_max' => 5, + 'percent_min' => 0, + 'text' => 'orange flavouring' + } + ] + ], + ); foreach my $test_ref (@tests) {