From 025303781a3a2ef1784e7bbed35101e8a7587665 Mon Sep 17 00:00:00 2001 From: Denis Defreyne Date: Mon, 22 Aug 2016 11:49:14 +0200 Subject: [PATCH] Fix assigns in filters defined with Filter.define --- lib/nanoc/base/compilation/filter.rb | 4 +-- spec/nanoc/base/filter_spec.rb | 38 ++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/nanoc/base/compilation/filter.rb b/lib/nanoc/base/compilation/filter.rb index cbbc9c17f9..11d5aac798 100644 --- a/lib/nanoc/base/compilation/filter.rb +++ b/lib/nanoc/base/compilation/filter.rb @@ -38,10 +38,10 @@ class Filter < Nanoc::Int::Context extend Nanoc::Int::PluginRegistry::PluginMethods class << self - def define(ident) + def define(ident, &block) filter_class = Class.new(::Nanoc::Filter) { identifier(ident) } filter_class.send(:define_method, :run) do |content, params| - yield(content, params) + instance_exec(content, params, &block) end end diff --git a/spec/nanoc/base/filter_spec.rb b/spec/nanoc/base/filter_spec.rb index b69ad52007..1398d593e3 100644 --- a/spec/nanoc/base/filter_spec.rb +++ b/spec/nanoc/base/filter_spec.rb @@ -1,17 +1,39 @@ describe Nanoc::Filter do describe '.define' do - before do - Nanoc::Filter.define(:nanoc_filter_define_sample) do |content, _params| - content.upcase + context 'simple filter' do + let(:filter_name) { 'b5355bbb4d772b9853d21be57da614dba521dbbb' } + let(:filter_class) { Nanoc::Filter.named(filter_name) } + + before do + Nanoc::Filter.define(filter_name) do |content, _params| + content.upcase + end end - end - it 'defines a filter' do - expect(Nanoc::Filter.named(:nanoc_filter_define_sample)).not_to be_nil + it 'defines a filter' do + expect(filter_class).not_to be_nil + end + + it 'defines a callable filter' do + expect(filter_class.new.run('foo', {})).to eql('FOO') + end end - it 'defines a callable filter' do - expect(Nanoc::Filter.named(:nanoc_filter_define_sample).new.run('foo', {})).to eql('FOO') + context 'filter that accesses assigns' do + let(:filter_name) { 'd7ed105d460e99a3d38f46af023d9490c140fdd9' } + let(:filter_class) { Nanoc::Filter.named(filter_name) } + let(:filter) { filter_class.new(assigns) } + let(:assigns) { { animal: 'Giraffe' } } + + before do + Nanoc::Filter.define(filter_name) do |_content, _params| + @animal + end + end + + it 'can access assigns' do + expect(filter.setup_and_run(:__irrelevant__, {})).to eq('Giraffe') + end end end end