A modificação do serializer de categoria está se comportando de forma diferente na 2.4.0

Após a atualização para Release v2.4.0.beta2 · discourse/discourse · GitHub, quase todos os nossos plugins (ou seja, pré-visualizações de listas de tópicos, eventos, localizações, classificações, etc.) estão apresentando um problema com o método add_to_serializer no plugin.rb.

O uso existente seguia este formato:

add_to_serializer(:serializer, property) { value }

Isso não funciona mais em um ambiente de produção. Ainda funciona em um ambiente de desenvolvimento.

Inicialmente, pensei que pudesse ter algo a ver com a forma como a ativação de plugins é tratada. Como o método _include? do add_to_serializer usa o estado enabled?

if define_include_method
   # Não inclua métodos serializados se o plugin estiver desativado
  klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
end

No entanto, o uso do sistema enabled_site_setting não parece resolver o problema. Além disso, enabled? parece ainda retornar true por padrão:

def enabled?
  @enabled_site_setting ? SiteSetting.get(@enabled_site_setting) : true
end

Para corrigir o problema imediato, alteramos a forma como nossos plugins serializam dados, mas gostaria de entender o que está acontecendo, se possível. Alguém tem alguma ideia sobre o que está ocorrendo aqui?

cc @merefield, @fzngagan

Isso é altamente incomum, já que usamos isso em pesquisas e elas certamente não estão quebradas. A única coisa que consigo pensar é que elas estavam quebradas na versão beta, mas foram corrigidas na master? Você pode tentar em tests-passed e ver se funcionam?

Vou testar mais a fundo hoje. O uso em enquetes é ligeiramente diferente, pois o método _include? sempre é precedido por um terceiro parâmetro false. Suspeito que o método include? possa ser o problema.

add_to_serializer(:post, :polls_votes, false)

Parece que esse problema é específico de modificações nos serializers de categoria.

https://staging.discourse.angusmcleod.com.au tem um único plugin instalado: “test-add-to-serializer”

Como você pode ver no plugin.rb, várias modificações são feitas nos serializers.

As modificações nos serializers que não são de categoria parecem estar funcionando, mas as modificações no serializer basic_category só funcionam em desenvolvimento.

Você não encontrará as propriedades da categoria de teste em

https://staging.discourse.angusmcleod.com.au/categories.json

ou

https://staging.discourse.angusmcleod.com.au/c/records-musicians.json

Mas você encontrará as outras propriedades de teste em

https://staging.discourse.angusmcleod.com.au/t/this-is-a-title-of-a-topic/42.json

ou

https://staging.discourse.angusmcleod.com.au/latest.json

Portanto, o problema parece não estar no método add_to_serializer em si, mas na modificação do serializer basic_category.

@j.jaffeux @dan Olá :), parece que vocês fizeram algum trabalho recente no discourse-voting para resolver o mesmo problema que descrevi acima.

Vocês sabem por que não é mais suficiente adicionar propriedades ao basic_category_serializer?

Posso confirmar que isso está afetando os testes-passados

Dan está fora, mas essencialmente existem três locais diferentes onde serializamos categorias com quantidades variadas de dados. Veremos se há alguma maneira de eliminar o mixin aqui, o que torna mais difícil de raciocinar.

Corrigido e portado de volta para as versões stable e beta.

Dan configurou corretamente a estrutura de herança; o problema era apenas um bug central de longa data, muito, muito, muito antigo.

Obrigado, @sam, muito apreciado.

Obrigado por reportar e insistir nisso. Foi muito difícil identificar o problema; passei algum tempo lendo a estrutura interna do Rails para entendê-lo.

Não deixe de conferir o novo teste se tiver curiosidade sobre como garantimos que isso funcione bem daqui para frente.

Muito obrigado, @sam, por corrigir isso rapidamente.

@angus, nosso plugin funcionará sem as alterações recentes que fizemos devido a essa correção?