From e2a2033228c615b47c01ef18644704c5d65175d5 Mon Sep 17 00:00:00 2001 From: AntonioTerceiro Date: Fri, 21 Dec 2007 15:07:49 +0000 Subject: [PATCH] ActionItem23: adding traversal method to acts_as_filesystem --- lib/acts_as_filesystem.rb | 15 +++++++++++++++ test/unit/acts_as_filesystem_test.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 0 deletions(-) diff --git a/lib/acts_as_filesystem.rb b/lib/acts_as_filesystem.rb index 82a491f..23186b3 100644 --- a/lib/acts_as_filesystem.rb +++ b/lib/acts_as_filesystem.rb @@ -150,6 +150,21 @@ module ActsAsFileSystem @hierarchy end + def map_traversal(&block) + stack = [] + result = [] + stack.push(self) + while !stack.empty? + element = stack.pop + result.push(element) + element.children.each do |item| + stack.push(item) + end + end + block ||= (lambda { |x| x }) + result.map(&block) + end + end end diff --git a/test/unit/acts_as_filesystem_test.rb b/test/unit/acts_as_filesystem_test.rb index e9da8dc..4346bec 100644 --- a/test/unit/acts_as_filesystem_test.rb +++ b/test/unit/acts_as_filesystem_test.rb @@ -21,4 +21,33 @@ class ActsAsFilesystemTest < Test::Unit::TestCase assert_not_same list, a.hierarchy(true) end + should 'list the full tree' do + profile = create_user('testinguser').person + + a1 = profile.articles.build(:name => 'a1'); a1.save! + + a1_1 = profile.articles.build(:name => 'a1.1'); a1_1.parent = a1; a1_1.save! + a1_2 = profile.articles.build(:name => 'a1.2'); a1_2.parent = a1; a1_2.save! + + a1_1_1 = profile.articles.build(:name => 'a1.1.1'); a1_1_1.parent = a1_1; a1_1_1.save! + a1_1_2 = profile.articles.build(:name => 'a1.1.2'); a1_1_2.parent = a1_1; a1_1_2.save! + + assert_equivalent [a1, a1_1, a1_2, a1_1_1, a1_1_2], a1.map_traversal + end + + should 'be able to traverse with a block' do + profile = create_user('testinguser').person + + a1 = profile.articles.build(:name => 'a1'); a1.save! + + a1_1 = profile.articles.build(:name => 'a1.1'); a1_1.parent = a1; a1_1.save! + a1_2 = profile.articles.build(:name => 'a1.2'); a1_2.parent = a1; a1_2.save! + + a1_1_1 = profile.articles.build(:name => 'a1.1.1'); a1_1_1.parent = a1_1; a1_1_1.save! + a1_1_2 = profile.articles.build(:name => 'a1.1.2'); a1_1_2.parent = a1_1; a1_1_2.save! + + assert_equivalent ['a1', 'a1.1', 'a1.2', 'a1.1.1', 'a1.1.2'], a1.map_traversal { |item| item.name } + + end + end -- libgit2 0.21.2