DEV: Improve add_to_serializer include_* options (#21220)

- Move the old '`define_include_method`' arg to a `respect_plugin_enabled` kwarg

- Introduce an `include_condition` kwarg which can be passed a lambda with inclusion logic. Lambda will be run via `instance_exec` in the context of the serializer instance

This is backwards compatible - old-style invocations will trigger a deprecation message
This commit is contained in:
David Taylor
2023-04-24 12:17:51 +01:00
committed by GitHub
parent aa5038a352
commit 26b7f8a63b
5 changed files with 115 additions and 54 deletions

View File

@@ -75,6 +75,14 @@ RSpec.describe Plugin::Instance do
# Serializer
@plugin.add_to_serializer(:trout, :scales) { 1024 }
@plugin.add_to_serializer(:trout, :unconditional_scales, respect_plugin_enabled: false) do
2048
end
@plugin.add_to_serializer(
:trout,
:conditional_scales,
include_condition: -> { !!object.data&.[](:has_scales) },
) { 4096 }
@serializer = TroutSerializer.new(@trout)
@child_serializer = TroutJuniorSerializer.new(@trout)
@@ -100,6 +108,7 @@ RSpec.describe Plugin::Instance do
expect(@hello_count).to eq(1)
expect(@serializer.scales).to eq(1024)
expect(@serializer.include_scales?).to eq(false)
expect(@serializer.include_unconditional_scales?).to eq(true)
expect(@serializer.name).to eq("a trout")
expect(@child_serializer.scales).to eq(1024)
@@ -107,6 +116,25 @@ RSpec.describe Plugin::Instance do
expect(@child_serializer.name).to eq("a trout jr")
end
it "can control the include_* implementation" do
@plugin.enabled = true
expect(@serializer.scales).to eq(1024)
expect(@serializer.include_scales?).to eq(true)
expect(@serializer.unconditional_scales).to eq(2048)
expect(@serializer.include_unconditional_scales?).to eq(true)
expect(@serializer.include_conditional_scales?).to eq(false)
@trout.data = { has_scales: true }
expect(@serializer.include_conditional_scales?).to eq(true)
@plugin.enabled = false
expect(@serializer.include_scales?).to eq(false)
expect(@serializer.include_unconditional_scales?).to eq(true)
expect(@serializer.include_conditional_scales?).to eq(false)
end
it "only returns HTML if enabled" do
ctx = Trout.new
ctx.data = "hello"