diff --git a/ChangeLog b/ChangeLog index f1bb4a6227..bc6cf96bbb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Aug 29 01:43:05 2005 Tanaka Akira + + * lib/pathname.rb (Pathname#descend): new method. + (Pathname#ascend): ditto. + Mon Aug 29 00:35:09 2005 Tanaka Akira * lib/time.rb: require 'date/format' instead of 'parsedate'. diff --git a/lib/pathname.rb b/lib/pathname.rb index fd7fa508b8..d9dabd0ca0 100644 --- a/lib/pathname.rb +++ b/lib/pathname.rb @@ -422,6 +422,74 @@ class Pathname @path.scan(%r{[^/]+}) { yield $& } end + # Iterates over and yields a new Pathname object + # for each element in the given path in descending order. + # + # Pathname.new('/path/to/some/file.rb').descend {|v| p v} + # # + # # + # # + # # + # # + # + # Pathname.new('path/to/some/file.rb').descend {|v| p v} + # # + # # + # # + # # + # + def descend + paths = [] + v = self + if absolute? + until v.root? + paths << v + v = v.dirname + end + paths << v + else + until v.to_s == '.' + paths << v + v = v.dirname + end + end + paths.reverse_each {|path| yield path } + end + + # Iterates over and yields a new Pathname object + # for each element in the given path in ascending order. + # + # Pathname.new('/path/to/some/file.rb').ascend {|v| p v} + # # + # # + # # + # # + # # + # + # Pathname.new('path/to/some/file.rb').ascend {|v| p v} + # # + # # + # # + # # + # + def ascend + paths = [] + v = self + if absolute? + until v.root? + paths << v + v = v.dirname + end + paths << v + else + until v.to_s == '.' + paths << v + v = v.dirname + end + end + paths.each {|path| yield path } + end + # # Pathname#+ appends a pathname fragment to this one to produce a new Pathname # object. @@ -1203,5 +1271,33 @@ if $0 == __FILE__ assert_equal(1, count) assert_equal(2, result) end + + def test_descend_abs + rs = %w[/ /a /a/b /a/b/c] + Pathname.new("/a/b/c").descend {|v| + assert_equal(Pathname.new(rs.shift), v) + } + end + + def test_descend_rel + rs = %w[a a/b a/b/c] + Pathname.new("a/b/c").descend {|v| + assert_equal(Pathname.new(rs.shift), v) + } + end + + def test_ascend_abs + rs = %w[/a/b/c /a/b /a /] + Pathname.new("/a/b/c").ascend {|v| + assert_equal(Pathname.new(rs.shift), v) + } + end + + def test_ascend_rel + rs = %w[a/b/c a/b a] + Pathname.new("a/b/c").ascend {|v| + assert_equal(Pathname.new(rs.shift), v) + } + end end end