Descreva o bug
A classe abstrata GenericStaticABC em genericparser/plugins/domain/generic_class.py:8 declara o método abstrato como:
def extract(self, kwargs): # parâmetro posicional chamado 'kwargs'
Porém, ambos os plugins implementam com keyword-args:
# plugins/statics/sonarqube.py
def extract(self, **kwargs): # ** (kwargs reais)
Resultado: o ABC não força a assinatura correta. Plugin que herde de GenericStaticABC e implemente exatamente como o ABC (def extract(self, kwargs)) vai quebrar quando chamado com keyword args. Plugins existentes funcionam por terem ignorado o ABC.
Risco: novo plugin escrito seguindo a assinatura do ABC vai quebrar; plugin antigo continua funcionando por acidente.
Como reproduzir
from genericparser.plugins.domain.generic_class import GenericStaticABC
class MeuPlugin(GenericStaticABC):
def extract(self, kwargs): # como o ABC declara
return kwargs
# Quando chamado pelo orquestrador via parser(input_value=...):
plugin = MeuPlugin()
plugin.extract(input_value="x") # TypeError: extract() got unexpected keyword argument 'input_value'
Comportamento esperado
Decidir o contrato e padronizar:
Opção A (recomendada): mudar o ABC para def extract(self, **kwargs) — alinha com plugins existentes.
@abstractmethod
def extract(self, **kwargs):
raise NotImplementedError
Opção B: corrigir os plugins para def extract(self, kwargs) — mas isso quebra qualquer chamada externa que passe kwargs nomeados.
Adicionar teste que instancia subclasse mínima do ABC e chama extract(...) com a assinatura padrão dos plugins existentes.
Informações adicionais
- ABC:
genericparser/plugins/domain/generic_class.py:8
- Plugins:
genericparser/plugins/statics/sonarqube.py, genericparser/plugins/dinamic/github.py
- Achado durante auditoria sistemática do Giovanni pelos repositórios em 2026-05-04.
Descreva o bug
A classe abstrata
GenericStaticABCemgenericparser/plugins/domain/generic_class.py:8declara o método abstrato como:Porém, ambos os plugins implementam com keyword-args:
Resultado: o ABC não força a assinatura correta. Plugin que herde de
GenericStaticABCe implemente exatamente como o ABC (def extract(self, kwargs)) vai quebrar quando chamado com keyword args. Plugins existentes funcionam por terem ignorado o ABC.Risco: novo plugin escrito seguindo a assinatura do ABC vai quebrar; plugin antigo continua funcionando por acidente.
Como reproduzir
Comportamento esperado
Decidir o contrato e padronizar:
Opção A (recomendada): mudar o ABC para
def extract(self, **kwargs)— alinha com plugins existentes.Opção B: corrigir os plugins para
def extract(self, kwargs)— mas isso quebra qualquer chamada externa que passe kwargs nomeados.Adicionar teste que instancia subclasse mínima do ABC e chama
extract(...)com a assinatura padrão dos plugins existentes.Informações adicionais
genericparser/plugins/domain/generic_class.py:8genericparser/plugins/statics/sonarqube.py,genericparser/plugins/dinamic/github.py