From ef89b586d8039626a4acd5ac847ae383c62d93c7 Mon Sep 17 00:00:00 2001 From: Akinori MUSHA Date: Wed, 12 Jul 2023 23:20:45 +0900 Subject: [PATCH] Add a new filter `fromjson` The name is taken from jq. --- app/concerns/liquid_interpolatable.rb | 6 ++++++ spec/concerns/liquid_interpolatable_spec.rb | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/app/concerns/liquid_interpolatable.rb b/app/concerns/liquid_interpolatable.rb index 309248cb3f..a59da8641e 100644 --- a/app/concerns/liquid_interpolatable.rb +++ b/app/concerns/liquid_interpolatable.rb @@ -263,6 +263,12 @@ def json(input) JSON.dump(input) end + def fromjson(input) + JSON.parse(input.to_s) + rescue StandardError + nil + end + def hex_encode(input) input.to_s.unpack1('H*') end diff --git a/spec/concerns/liquid_interpolatable_spec.rb b/spec/concerns/liquid_interpolatable_spec.rb index 084e17b471..d59756be5e 100644 --- a/spec/concerns/liquid_interpolatable_spec.rb +++ b/spec/concerns/liquid_interpolatable_spec.rb @@ -303,6 +303,16 @@ def @filter.to_xpath_roundtrip(string) end end + describe 'fromjson' do + let(:agent) { Agents::InterpolatableAgent.new(name: "test") } + + it 'should parse a JSON string' do + agent.interpolation_context['json'] = '{"array": ["a", "b", "c"], "number": 42}' + agent.options['key'] = '{% assign obj = json | fromjson %}{{ obj["array"][1] }} and {{ obj.number }}' + expect(agent.interpolated['key']).to eq('b and 42') + end + end + context 'as_object' do let(:agent) { Agents::InterpolatableAgent.new(name: "test") }