Ferramentas/AjustaFundos/actions/string/file_name_generator.py

59 lines
1.8 KiB
Python

import re
import unicodedata
from datetime import datetime
from typing import Optional
class FileNameGenerator:
"""
Gera nomes de arquivos seguros e consistentes a partir de uma string de entrada.
- Remove acentos, espaços e caracteres inválidos
- Pode adicionar timestamp e extensão
- Não grava em disco, apenas retorna a string final
"""
@staticmethod
def _sanitize(text: str) -> str:
"""Remove acentos, espaços e símbolos inválidos do nome do arquivo."""
text = (
unicodedata.normalize("NFKD", text)
.encode("ASCII", "ignore")
.decode("ASCII")
)
text = re.sub(r"[^a-zA-Z0-9_-]+", "_", text)
text = re.sub(r"_+", "_", text).strip("_")
return text.lower()
@classmethod
def generate(
cls,
base_name: str,
extension: str = ".txt",
include_timestamp: bool = False,
counter: Optional[int] = None,
) -> str:
"""
Retorna um nome de arquivo limpo, como string.
:param base_name: Texto base (ex: título, nome, descrição)
:param extension: Extensão desejada (ex: .pdf, .json)
:param include_timestamp: Se True, adiciona timestamp no nome
:param counter: Número opcional para diferenciar nomes repetidos
:return: String do nome final do arquivo
"""
if not base_name:
raise ValueError("O nome base não pode estar vazio.")
safe_name = cls._sanitize(base_name)
if include_timestamp:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
safe_name = f"{safe_name}_{timestamp}"
if counter is not None:
safe_name = f"{safe_name}_{counter}"
if not extension.startswith("."):
extension = f".{extension}"
return f"{safe_name}{extension}"