From 698eb908df37afb1cc62b8a68ce1d7ba90f38775 Mon Sep 17 00:00:00 2001 From: Denis Defreyne Date: Sat, 1 Apr 2017 10:33:15 +0200 Subject: [PATCH 1/2] Add IdentifiableCollection#find_all --- .../base/entities/identifiable_collection.rb | 6 ++++ .../views/identifiable_collection_view.rb | 3 +- .../entities/identifiable_collection_spec.rb | 34 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lib/nanoc/base/entities/identifiable_collection.rb b/lib/nanoc/base/entities/identifiable_collection.rb index a5d6114b27..2c16cf1903 100644 --- a/lib/nanoc/base/entities/identifiable_collection.rb +++ b/lib/nanoc/base/entities/identifiable_collection.rb @@ -37,6 +37,12 @@ def [](arg) end end + contract C::Any => C::IterOf[C::RespondTo[:identifier]] + def find_all(arg) + pat = Nanoc::Int::Pattern.from(arg) + select { |i| pat.match?(i.identifier) } + end + contract C::None => C::ArrayOf[C::RespondTo[:identifier]] def to_a @objects.to_a diff --git a/lib/nanoc/base/views/identifiable_collection_view.rb b/lib/nanoc/base/views/identifiable_collection_view.rb index 68fa27b1f8..979aed3dd6 100644 --- a/lib/nanoc/base/views/identifiable_collection_view.rb +++ b/lib/nanoc/base/views/identifiable_collection_view.rb @@ -43,8 +43,7 @@ def size # # @return [Enumerable] def find_all(arg) - pat = Nanoc::Int::Pattern.from(arg) - select { |i| pat.match?(i.identifier) } + @objects.find_all(arg).map { |i| view_class.new(i, @context) } end # @overload [](string) diff --git a/spec/nanoc/base/entities/identifiable_collection_spec.rb b/spec/nanoc/base/entities/identifiable_collection_spec.rb index 36e8d02477..3938e11ff5 100644 --- a/spec/nanoc/base/entities/identifiable_collection_spec.rb +++ b/spec/nanoc/base/entities/identifiable_collection_spec.rb @@ -9,4 +9,38 @@ it { is_expected.to be_a(described_class) } end + + describe '#find_all' do + let(:objects) do + [ + double(:identifiable, identifier: Nanoc::Identifier.new('/about.css')), + double(:identifiable, identifier: Nanoc::Identifier.new('/about.md')), + double(:identifiable, identifier: Nanoc::Identifier.new('/style.css')), + ] + end + + let(:arg) { raise 'override me' } + + subject { identifiable_collection.find_all(arg) } + + context 'with string' do + let(:arg) { '/*.css' } + + it 'contains objects' do + expect(subject.size).to eql(2) + expect(subject.find { |iv| iv.identifier == '/about.css' }).to eq(objects[0]) + expect(subject.find { |iv| iv.identifier == '/style.css' }).to eq(objects[2]) + end + end + + context 'with regex' do + let(:arg) { %r{\.css\z} } + + it 'contains objects' do + expect(subject.size).to eql(2) + expect(subject.find { |iv| iv.identifier == '/about.css' }).to eq(objects[0]) + expect(subject.find { |iv| iv.identifier == '/style.css' }).to eq(objects[2]) + end + end + end end From 9e336205e7830ab78cf7c113714dd48188e6dd1f Mon Sep 17 00:00:00 2001 From: Denis Defreyne Date: Sat, 1 Apr 2017 10:37:28 +0200 Subject: [PATCH 2/2] Memoize #find_all --- .../base/entities/identifiable_collection.rb | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/nanoc/base/entities/identifiable_collection.rb b/lib/nanoc/base/entities/identifiable_collection.rb index 2c16cf1903..4dd0967b14 100644 --- a/lib/nanoc/base/entities/identifiable_collection.rb +++ b/lib/nanoc/base/entities/identifiable_collection.rb @@ -39,8 +39,11 @@ def [](arg) contract C::Any => C::IterOf[C::RespondTo[:identifier]] def find_all(arg) - pat = Nanoc::Int::Pattern.from(arg) - select { |i| pat.match?(i.identifier) } + if frozen? + find_all_memoized(arg) + else + find_all_unmemoized(arg) + end end contract C::None => C::ArrayOf[C::RespondTo[:identifier]] @@ -83,6 +86,18 @@ def get_memoized(arg) end memoize :get_memoized + contract C::Any => C::IterOf[C::RespondTo[:identifier]] + def find_all_unmemoized(arg) + pat = Nanoc::Int::Pattern.from(arg) + select { |i| pat.match?(i.identifier) } + end + + contract C::Any => C::IterOf[C::RespondTo[:identifier]] + def find_all_memoized(arg) + find_all_unmemoized(arg) + end + memoize :find_all_memoized + def object_with_identifier(identifier) if frozen? @mapping[identifier.to_s]