Skip to content

feat(masking): keep first N chars of the original surname; configurable prefix and faker locale (v3.0.8) - #51

Merged
click0 merged 1 commit into
mainfrom
claude/refactor-data-masking-lIcWN
Sep 8, 2026
Merged

click0 merged 1 commit into
mainfrom
claude/refactor-data-masking-lIcWN

Conversation

@click0

@click0 click0 commented Sep 8, 2026

Copy link
Copy Markdown
Owner

v3.0.8 — префікс оригінального прізвища в масці; налаштування префікса і локалі faker

Реалізація вимог ТЗ:

1. Перші символи прізвища зберігаються

Маска прізвища = перші N символів оригіналу + синтетична основа + відмінкове закінчення оригіналу: Петренку → Петаченку, Іванова → Іварунова, Лисенко → Ливченко. N типово 3; для коротких прізвищ — не більше половини слова (Ґудзь → Ґу…, Ткач → Тк…, Рак → Р…); хоча б один символ основи завжди змінюється. Префікс береться з самого слова незалежно від того, де починається закінчення, але в закінчення не заходить. Усі no-leak перевірки лишаються (маска не дорівнює/не містить оригінал, його основу чи слово документа); стик префікса й хвоста вимовний (голосна + приголосна).

2. Число в конфігу

masking_rules.surname_prefix_length (YAML) / DATA_MASKING_SURNAME_PREFIX_LENGTH (ENV). 0 = повністю синтетична маска (поведінка 3.0.2–3.0.7); від'ємне чи не-ціле — фатальна помилка конфігу. Є в шаблоні --init-config.

3. Локаль faker у конфігу

system.faker_locale (YAML) / DATA_MASKING_FAKER_LOCALE (ENV), типово uk_UA. Faker('uk_UA') більше не зашитий при імпорті — constants.set_faker_locale(). Морфологія (закінчення прізвищ, відмінки звань, рід по батькові) лишається українською; локалі без по батькові (більшість) отримують fallback на uk_UA; невідома локаль відхиляється на старті з чіткою помилкою.

Тести

tests/test_surname_prefix.py — 45 тестів (довжини префікса включно з короткими, збереження закінчення/регістру, дефісні прізвища, вимовний стик, YAML/ENV, перемикання локалі, невідома локаль, fallback по батькові). 771 passed, mypy 0.

Сумісність

Маски прізвищ відрізняються від 3.0.2–3.0.7; розмаскування файлів будь-якої попередньої версії не зачеплено.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XT6iUWaQgahXDB9TWX9Bq7


Generated by Claude Code

…le prefix and faker locale (v3.0.8)

- surname mask = first N chars of the original + synthetic stem +
  original grammatical ending; N default 3, short surnames keep at most
  half of the word, and at least one stem char always changes; no-leak
  checks unchanged; prefix/stem joint kept pronounceable
- masking_rules.surname_prefix_length / DATA_MASKING_SURNAME_PREFIX_LENGTH
  (0 = fully synthetic as in 3.0.2-3.0.7); invalid values are fatal
- system.faker_locale / DATA_MASKING_FAKER_LOCALE (default uk_UA):
  Faker no longer hard-wired at import (constants.set_faker_locale);
  unknown locale rejected; locales without patronymics fall back to
  uk_UA for them
- README EN/UK note; tests/test_surname_prefix.py (45 tests). 771 passed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XT6iUWaQgahXDB9TWX9Bq7
@click0
click0 merged commit 8b8b76e into main Sep 8, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants