Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions weblate/trans/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,16 +118,21 @@ class DetectedDiscoveryPreset(TypedDict):

def get_discovery_result_key(
result: DiscoveryResult,
) -> tuple[str, str, str, str, str]:
) -> tuple[str, str, str, str, str, str]:
return (
str(result.get("file_format", "")),
str(result.get("filemask", "")),
str(result.get("template", "")),
str(result.get("new_base", "")),
str(result.get("intermediate", "")),
get_discovery_language_regex(result),
)


def get_discovery_language_regex(result: DiscoveryResult) -> str:
return str(result.get("language_regex") or "^[^.]+$")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Bump translation-finder before reading language_regex

With the dependency still pinned to translation-finder==3.0 in pyproject.toml, the discovered results produced by that release do not include a language_regex field, so this helper always falls back to ^[^.]+$ in the real discovery/create flows. The new tests inject language_regex manually, but users choosing detected presets from discover() will still not get the source-language exclusion until the dependency is updated to a version that actually emits the field.

Useful? React with 👍 / 👎.



def split_discovery_path(value: str) -> list[str]:
return value.split("/") if value else []

Expand Down Expand Up @@ -296,6 +301,10 @@ def build_detected_discovery_preset(
if first.get("file_format") != second.get("file_format"):
return None

language_regex = get_discovery_language_regex(first)
if language_regex != get_discovery_language_regex(second):
return None

filemasks = [str(first.get("filemask", "")), str(second.get("filemask", ""))]
if any(not filemask or filemask.count("*") != 1 for filemask in filemasks):
return None
Expand Down Expand Up @@ -370,7 +379,7 @@ def build_detected_discovery_preset(
"match": match,
"file_format": str(first["file_format"]),
"name_template": DISCOVERY_PRESET_COMPONENT_TEMPLATE,
"language_regex": "^[^.]+$",
"language_regex": language_regex,
"base_file_template": base_file_template,
"new_base_template": new_base_template,
"intermediate_template": intermediate_template,
Expand All @@ -385,7 +394,7 @@ def build_detected_discovery_preset(
def get_detected_discovery_presets_from_results(
discovered: list[DiscoveryResult],
) -> list[DetectedDiscoveryPreset]:
unique_results: dict[tuple[str, str, str, str, str], DiscoveryResult] = {}
unique_results: dict[tuple[str, str, str, str, str, str], DiscoveryResult] = {}
for result in discovered:
key = get_discovery_result_key(result)
if key[0] and key[1]:
Expand Down
5 changes: 3 additions & 2 deletions weblate/trans/tests/test_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ def test_create_component_wizard_discovery_file_format_params(self) -> None:
"properties_encoding": "utf-8",
"strings_encoding": "utf-16",
},
"language_regex": "^(?!en$).+$",
},
)
)
Expand Down Expand Up @@ -244,8 +245,9 @@ def test_create_component_wizard_discovery_file_format_params(self) -> None:
data["file_format_params"],
{"properties_encoding": "utf-8"},
)
self.assertEqual(data["language_regex"], "^(?!en$).+$")

file_format_params = data.pop("file_format_params")
file_format_params = cast("dict[str, str]", data.pop("file_format_params"))
data.update(
{
f"file_format_params_{key}": value
Expand All @@ -254,7 +256,6 @@ def test_create_component_wizard_discovery_file_format_params(self) -> None:
)
data["project"] = self.project.pk
data["source_language"] = get_default_lang()
data["language_regex"] = "^[^.]+$"
data["new_base"] = ""
data["new_lang"] = "contact"
with override_settings(CREATE_GLOSSARIES=self.CREATE_GLOSSARIES):
Expand Down
46 changes: 43 additions & 3 deletions weblate/trans/tests/test_discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import os
import pathlib
import tempfile
from typing import TYPE_CHECKING
from typing import TYPE_CHECKING, cast
from unittest.mock import call, patch

from django.test import SimpleTestCase
Expand Down Expand Up @@ -490,8 +490,9 @@ def make_discovery_result(
file_format: str = "",
intermediate: str = "",
new_base: str = "",
language_regex: str = "",
) -> DiscoveryResult:
data: ResultDict = {}
data: dict[str, object] = {}
if name:
data["name"] = name
if filemask:
Expand All @@ -504,8 +505,10 @@ def make_discovery_result(
data["intermediate"] = intermediate
if new_base:
data["new_base"] = new_base
if language_regex:
data["language_regex"] = language_regex

result = DiscoveryResult(data)
result = DiscoveryResult(cast("ResultDict", data))
result.meta = {"priority": 1000, "origin": None}
return result

Expand Down Expand Up @@ -535,6 +538,43 @@ def test_detected_presets_deduplicate_discovery_results(self) -> None:
"{{ component }}/values/strings.xml",
)

def test_detected_presets_preserve_language_regex(self) -> None:
first = self.make_discovery_result(
file_format="po",
filemask="django/conf/locale/*/LC_MESSAGES/messages.po",
new_base="django/conf/locale/en/LC_MESSAGES/messages.po",
language_regex="^(?!en$).+$",
)
second = self.make_discovery_result(
file_format="po",
filemask="djangojs/conf/locale/*/LC_MESSAGES/messages.po",
new_base="djangojs/conf/locale/en/LC_MESSAGES/messages.po",
language_regex="^(?!en$).+$",
)

presets = get_detected_discovery_presets_from_results([first, second])

self.assertEqual(len(presets), 1)
self.assertEqual(presets[0]["values"]["language_regex"], "^(?!en$).+$")

def test_detected_presets_do_not_combine_different_language_regexes(self) -> None:
first = self.make_discovery_result(
file_format="po",
filemask="django/conf/locale/*/LC_MESSAGES/messages.po",
new_base="django/conf/locale/en/LC_MESSAGES/messages.po",
language_regex="^(?!en$).+$",
)
second = self.make_discovery_result(
file_format="po",
filemask="djangojs/conf/locale/*/LC_MESSAGES/messages.po",
new_base="djangojs/conf/locale/en_GB/LC_MESSAGES/messages.po",
language_regex="^(?!en_GB$).+$",
)

presets = get_detected_discovery_presets_from_results([first, second])

self.assertEqual(presets, [])

def test_detected_presets_keep_filename_suffix_from_translation_finder_cases(
self,
) -> None:
Expand Down
Loading