"""Registry para gerenciar escopos de diferentes bancos."""
from pypix_api.scopes.base import BankScopesBase, ScopeGroup
[docs]
class ScopeRegistry:
"""Registry centralizado para escopos de bancos."""
_banks: dict[str, type[BankScopesBase]] = {}
[docs]
@classmethod
def register(cls, bank_code: str, scope_class: type[BankScopesBase]) -> None:
"""Registra uma classe de escopos para um código de banco.
Args:
bank_code: Código do banco (ex: '001', '756', 'bb', 'sicoob')
scope_class: Classe que define os escopos do banco
"""
cls._banks[bank_code.lower()] = scope_class
[docs]
@classmethod
def get_scopes(cls, bank_code: str) -> type[BankScopesBase]:
"""Obtém a classe de escopos para um código de banco.
Args:
bank_code: Código do banco
Returns:
Type[BankScopesBase]: Classe de escopos do banco
Raises:
ValueError: Se o banco não estiver registrado
"""
bank_code = bank_code.lower()
if bank_code not in cls._banks:
available = ', '.join(cls._banks.keys())
raise ValueError(
f"Banco '{bank_code}' não encontrado. Bancos disponíveis: {available}"
)
return cls._banks[bank_code]
[docs]
@classmethod
def get_pix_scopes(cls, bank_code: str) -> ScopeGroup:
"""Obtém os escopos PIX para um código de banco.
Args:
bank_code: Código do banco
Returns:
ScopeGroup: Escopos PIX do banco
"""
scope_class = cls.get_scopes(bank_code)
return scope_class.get_pix_scopes()
[docs]
@classmethod
def get_scope_group(cls, bank_code: str, group_name: str) -> ScopeGroup:
"""Obtém um grupo específico de escopos para um banco.
Args:
bank_code: Código do banco
group_name: Nome do grupo de escopos
Returns:
ScopeGroup: Grupo de escopos solicitado
"""
scope_class = cls.get_scopes(bank_code)
return scope_class.get_scope_group(group_name)
[docs]
@classmethod
def list_banks(cls) -> list[str]:
"""Lista todos os bancos registrados."""
return list(cls._banks.keys())
[docs]
@classmethod
def list_scope_groups(cls, bank_code: str) -> list[str]:
"""Lista todos os grupos de escopos disponíveis para um banco.
Args:
bank_code: Código do banco
Returns:
List[str]: Lista de nomes dos grupos de escopos
"""
scope_class = cls.get_scopes(bank_code)
return scope_class.list_available_groups()
[docs]
@classmethod
def combine_scopes(cls, bank_code: str, *group_names: str) -> str:
"""Combina múltiplos grupos de escopos de um banco.
Args:
bank_code: Código do banco
*group_names: Nomes dos grupos a serem combinados
Returns:
str: Escopos combinados separados por espaço
"""
scope_class = cls.get_scopes(bank_code)
groups = [scope_class.get_scope_group(name) for name in group_names]
return scope_class.combine_scopes(*groups)
# Função de conveniência para obter escopos
[docs]
def get_bank_scopes(bank_code: str) -> type[BankScopesBase]:
"""Função de conveniência para obter escopos de um banco."""
return ScopeRegistry.get_scopes(bank_code)
[docs]
def get_pix_scopes(bank_code: str) -> str:
"""Função de conveniência para obter escopos PIX como string."""
return ScopeRegistry.get_pix_scopes(bank_code).as_string()