diff --git a/lib/nanoc/base/entities/props.rb b/lib/nanoc/base/entities/props.rb index 1bf6c5de09..8436d20bc5 100644 --- a/lib/nanoc/base/entities/props.rb +++ b/lib/nanoc/base/entities/props.rb @@ -9,7 +9,7 @@ class Props attr_reader :raw_content # TODO: Split raw_content for documents and collections - C_RAW_CONTENT = C::Or[C::IterOf[String], C::Bool] + C_RAW_CONTENT = C::Or[C::IterOf[C::Or[String, Regexp]], C::Bool] C_ATTRS = C::Or[C::IterOf[Symbol], C::Bool] contract C::KeywordArgs[raw_content: C::Optional[C_RAW_CONTENT], attributes: C::Optional[C_ATTRS], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any def initialize(raw_content: false, attributes: false, compiled_content: false, path: false) diff --git a/lib/nanoc/base/repos/dependency_store.rb b/lib/nanoc/base/repos/dependency_store.rb index 9f2e5c064b..f17256437a 100644 --- a/lib/nanoc/base/repos/dependency_store.rb +++ b/lib/nanoc/base/repos/dependency_store.rb @@ -88,7 +88,7 @@ def objects_causing_outdatedness_of(object) refs2objs(@graph.direct_predecessors_of(obj2ref(object))) end - C_RAW_CONTENT = C::Or[C::IterOf[String], C::Bool] + C_RAW_CONTENT = C::Or[C::IterOf[C::Or[String, Regexp]], C::Bool] C_ATTR = C::Or[C::IterOf[Symbol], C::Bool] C_KEYWORD_PROPS = C::KeywordArgs[raw_content: C::Optional[C_RAW_CONTENT], attributes: C::Optional[C_ATTR], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] diff --git a/lib/nanoc/base/services/dependency_tracker.rb b/lib/nanoc/base/services/dependency_tracker.rb index d4375039e0..4844354ac1 100644 --- a/lib/nanoc/base/services/dependency_tracker.rb +++ b/lib/nanoc/base/services/dependency_tracker.rb @@ -6,7 +6,7 @@ class DependencyTracker include Nanoc::Int::ContractsSupport C_OBJ = C::Or[Nanoc::Int::Item, Nanoc::Int::Layout, Nanoc::Int::Configuration, Nanoc::Int::IdentifiableCollection] - C_RAW_CONTENT = C::Or[C::IterOf[String], C::Bool] + C_RAW_CONTENT = C::Or[C::IterOf[C::Or[String, Regexp]], C::Bool] C_ATTR = C::Or[C::IterOf[Symbol], C::Bool] C_ARGS = C::KeywordArgs[raw_content: C::Optional[C_RAW_CONTENT], attributes: C::Optional[C_ATTR], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] diff --git a/lib/nanoc/base/views/identifiable_collection_view.rb b/lib/nanoc/base/views/identifiable_collection_view.rb index 7ec6e50b5b..d2adadce39 100644 --- a/lib/nanoc/base/views/identifiable_collection_view.rb +++ b/lib/nanoc/base/views/identifiable_collection_view.rb @@ -47,13 +47,12 @@ def size # # @return [Enumerable] def find_all(arg) - # TODO: support regex prop_attribute = case arg - when String - [arg] - when Nanoc::Identifier + when String, Nanoc::Identifier [arg.to_s] + when Regexp + [arg] else true end @@ -85,13 +84,12 @@ def find_all(arg) # # @return [#identifier] if an object was found def [](arg) - # TODO: support regex prop_attribute = case arg - when String - [arg] - when Nanoc::Identifier + when String, Nanoc::Identifier [arg.to_s] + when Regexp + [arg] else true end diff --git a/spec/nanoc/base/services/outdatedness_checker_spec.rb b/spec/nanoc/base/services/outdatedness_checker_spec.rb index 51a29d05d3..c7a8e06dde 100644 --- a/spec/nanoc/base/services/outdatedness_checker_spec.rb +++ b/spec/nanoc/base/services/outdatedness_checker_spec.rb @@ -572,7 +572,7 @@ end end - context 'dependency on specific new items' do + context 'dependency on specific new items (string)' do before do dependency_tracker = Nanoc::Int::DependencyTracker.new(dependency_store) dependency_tracker.enter(item) @@ -613,6 +613,48 @@ it { is_expected.not_to be } end end + + context 'dependency on specific new items (regex)' do + before do + dependency_tracker = Nanoc::Int::DependencyTracker.new(dependency_store) + dependency_tracker.enter(item) + dependency_tracker.bounce(items, raw_content: [%r{^/new.*}]) + dependency_store.store + end + + context 'nothing changed' do + it { is_expected.not_to be } + end + + context 'matching item added' do + before do + new_item = Nanoc::Int::Item.new('stuff', {}, '/newblahz.md') + dependency_store.items = Nanoc::Int::ItemCollection.new(config, items.to_a + [new_item]) + dependency_store.load + end + + it { is_expected.to be } + end + + context 'non-matching item added' do + before do + new_item = Nanoc::Int::Item.new('stuff', {}, '/nublahz.md') + dependency_store.items = Nanoc::Int::ItemCollection.new(config, items.to_a + [new_item]) + dependency_store.load + end + + it { is_expected.not_to be } + end + + context 'item removed' do + before do + dependency_store.items = Nanoc::Int::ItemCollection.new(config, []) + dependency_store.load + end + + it { is_expected.not_to be } + end + end end context 'only layout collection dependency' do diff --git a/spec/nanoc/base/views/identifiable_collection_view_spec.rb b/spec/nanoc/base/views/identifiable_collection_view_spec.rb index bec39d1cb4..2483037ddc 100644 --- a/spec/nanoc/base/views/identifiable_collection_view_spec.rb +++ b/spec/nanoc/base/views/identifiable_collection_view_spec.rb @@ -215,7 +215,7 @@ let(:arg) { %r{\A/home} } it 'creates dependency' do - expect(dependency_tracker).to receive(:bounce).with(wrapped, raw_content: true) + expect(dependency_tracker).to receive(:bounce).with(wrapped, raw_content: [%r{\A/home}]) subject end @@ -261,7 +261,7 @@ let(:arg) { %r{\.css\z} } it 'creates dependency' do - expect(dependency_tracker).to receive(:bounce).with(wrapped, raw_content: true) + expect(dependency_tracker).to receive(:bounce).with(wrapped, raw_content: [%r{\.css\z}]) subject end