diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | lib/pathname.rb | 96 |
2 files changed, 101 insertions, 0 deletions
@@ -1,3 +1,8 @@ +Mon Aug 29 01:43:05 2005 Tanaka Akira <akr@m17n.org> + + * lib/pathname.rb (Pathname#descend): new method. + (Pathname#ascend): ditto. + Mon Aug 29 00:35:09 2005 Tanaka Akira <akr@m17n.org> * 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:/> + # #<Pathname:/path> + # #<Pathname:/path/to> + # #<Pathname:/path/to/some> + # #<Pathname:/path/to/some/file.rb> + # + # Pathname.new('path/to/some/file.rb').descend {|v| p v} + # #<Pathname:path> + # #<Pathname:path/to> + # #<Pathname:path/to/some> + # #<Pathname:path/to/some/file.rb> + # + 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:/path/to/some/file.rb> + # #<Pathname:/path/to/some> + # #<Pathname:/path/to> + # #<Pathname:/path> + # #<Pathname:/> + # + # Pathname.new('path/to/some/file.rb').ascend {|v| p v} + # #<Pathname:path/to/some/file.rb> + # #<Pathname:path/to/some> + # #<Pathname:path/to> + # #<Pathname:path> + # + 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 |