mirror of
https://github.com/Second-Hand-Friends/kleinanzeigen-bot.git
synced 2026-07-09 20:51:05 +02:00
## ℹ️ Description This refactor reduces return-count complexity for the next PLR0911 ratchet while preserving existing behavior. No related issue. ## 📋 Changes Summary - Extract German and English pluralization helpers while keeping translation and prefix handling in `pluralize()`. - Remove one early return from `check_for_updates()` by sharing the existing final state update/save path. - Ratchet Ruff `PLR0911` `max-returns` from 12 to 10. - Document the one-lower discovery result: `check_for_updates()` is the next limiter at 10 returns for `max-returns = 9`. - No dependencies, configuration requirements, documentation updates, or generated artifacts are introduced. ### ⚙️ Type of Change Select the type(s) of change(s) included in this pull request: - [ ] 🐞 Bug fix (non-breaking change which fixes an issue) - [ ] ✨ New feature (adds new functionality without breaking existing usage) - [ ] 💥 Breaking change (changes that might break existing user setups, scripts, or configurations) ## ✅ Checklist Before requesting a review, confirm the following: - [x] I have reviewed my changes to ensure they meet the project's standards. - [x] I have tested my changes and ensured that all tests pass (`pdm run test`). - [x] I have formatted the code (`pdm run format`). - [x] I have verified that linting passes (`pdm run lint`). - [x] I have updated documentation where necessary. No documentation changes were needed. By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Refactor** * Reorganized pluralization logic and simplified update-checking control flow for improved code maintainability. * **Tests** * Expanded test coverage for pluralization with additional German and English language variations. * **Chores** * Updated code quality configuration standards. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
# SPDX-FileCopyrightText: © Sebastian Thomschke and contributors
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
# SPDX-ArtifactOfProjectHomePage: https://github.com/Second-Hand-Friends/kleinanzeigen-bot/
|
|
import pytest
|
|
from _pytest.monkeypatch import MonkeyPatch # pylint: disable=import-private-name
|
|
|
|
from kleinanzeigen_bot.utils import i18n
|
|
|
|
|
|
@pytest.mark.parametrize(("lang", "expected"), [
|
|
(None, ("en", "US", "UTF-8")), # Test with no LANG variable (should default to ("en", "US", "UTF-8"))
|
|
("fr", ("fr", None, "UTF-8")), # Test with just a language code
|
|
("fr_CA", ("fr", "CA", "UTF-8")), # Test with language + region, no encoding
|
|
("pt_BR.iso8859-1", ("pt", "BR", "ISO8859-1")), # Test with language + region + encoding
|
|
])
|
|
def test_detect_locale(monkeypatch:MonkeyPatch, lang:str | None, expected:i18n.Locale) -> None:
|
|
"""
|
|
Pytest test case to verify detect_system_language() behavior under various LANG values.
|
|
"""
|
|
# Clear or set the LANG environment variable as needed.
|
|
if lang is None:
|
|
monkeypatch.delenv("LANG", raising = False)
|
|
else:
|
|
monkeypatch.setenv("LANG", lang)
|
|
|
|
# Call the function and compare the result to the expected output.
|
|
result = i18n._detect_locale() # pylint: disable=protected-access
|
|
assert result == expected, f"For LANG={lang}, expected {expected} but got {result}"
|
|
|
|
|
|
@pytest.mark.parametrize(("lang", "noun", "count", "prefix_with_count", "expected"), [
|
|
("en", "field", 1, True, "1 field"),
|
|
("en", "field", 2, True, "2 fields"),
|
|
("en", "field", 2, False, "fields"),
|
|
("en", "attribute", 2, False, "attributes"),
|
|
("en", "bus", 2, False, "buses"),
|
|
("en", "city", 2, False, "cities"),
|
|
("de", "Feld", 1, True, "1 Feld"),
|
|
("de", "Feld", 2, True, "2 Felder"),
|
|
("de", "Feld", 2, False, "Felder"),
|
|
("de", "Anzeige", 2, False, "Anzeigen"),
|
|
("de", "Attribute", 2, False, "Attribute"),
|
|
("de", "Bild", 2, False, "Bilder"),
|
|
("de", "Datei", 2, False, "Dateien"),
|
|
("de", "Kategorie", 2, False, "Kategorien"),
|
|
("de", "Keller", 2, True, "2 Keller"), # el/er/en -> no suffix
|
|
("de", "Auto", 2, True, "2 Autos"), # vowel ending -> add s
|
|
("de", "Hund", 2, True, "2 Hunde"), # default -> add e
|
|
("en", "x", 2, True, "2 xs"), # len < 2 -> add s
|
|
])
|
|
def test_pluralize(
|
|
lang:str,
|
|
noun:str,
|
|
count:int,
|
|
prefix_with_count:bool,
|
|
expected:str
|
|
) -> None:
|
|
i18n.set_current_locale(i18n.Locale(lang, "US", "UTF_8"))
|
|
|
|
result = i18n.pluralize(noun, count, prefix_with_count = prefix_with_count)
|
|
assert result == expected, f"For LANG={lang}, expected {expected} but got {result}"
|