diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/pathname/lib/pathname.rb | 16 | ||||
-rw-r--r-- | test/pathname/test_pathname.rb | 12 |
4 files changed, 36 insertions, 2 deletions
@@ -1,3 +1,9 @@ +Mon Jun 15 00:14:33 2015 Tanaka Akira <akr@fsij.org> + + * ext/pathname/lib/pathname.rb (descend): Blockless form supported. + (ascend): Ditto. + [ruby-core:68820] [Feature #11052] Patch by Piotr Szotkowski. + Sun Jun 14 20:09:25 2015 Tanaka Akira <akr@fsij.org> * time.c (time_getlocaltime): [DOC] Add examples of valid utc_offset @@ -78,6 +78,10 @@ with all sufficient information, see the ChangeLog file. * OpenSSL::SSL::SSLSocket#accept_nonblock and OpenSSL::SSL::SSLSocket#connect_nonblock supports `exception: false`. +* Pathname + * Pathname#descend and Pathname#ascend supported blockless form. + [Feature #11052] + * io/wait * IO#wait_readable no longer checks FIONREAD, it may be used for non-bytestream IO such as listen sockets. diff --git a/ext/pathname/lib/pathname.rb b/ext/pathname/lib/pathname.rb index f5db526b8c..9f23ba502e 100644 --- a/ext/pathname/lib/pathname.rb +++ b/ext/pathname/lib/pathname.rb @@ -278,9 +278,17 @@ class Pathname # #<Pathname:path/to/some> # #<Pathname:path/to/some/file.rb> # + # Returns an Enumerator if no block was given. + # + # enum = Pathname.new("/usr/bin/ruby").descend + # # ... do stuff ... + # enum.each { |e| ... } + # # yields Pathnames /, /usr, /usr/bin, and /usr/bin/ruby. + # # It doesn't access the filesystem. # def descend + return to_enum(__method__) unless block_given? vs = [] ascend {|v| vs << v } vs.reverse_each {|v| yield v } @@ -303,9 +311,17 @@ class Pathname # #<Pathname:path/to> # #<Pathname:path> # + # Returns an Enumerator if no block was given. + # + # enum = Pathname.new("/usr/bin/ruby").ascend + # # ... do stuff ... + # enum.each { |e| ... } + # # yields Pathnames /usr/bin/ruby, /usr/bin, /usr, and /. + # # It doesn't access the filesystem. # def ascend + return to_enum(__method__) unless block_given? path = @path yield self while r = chop_basename(path) diff --git a/test/pathname/test_pathname.rb b/test/pathname/test_pathname.rb index 046f3f034f..b012633a8c 100644 --- a/test/pathname/test_pathname.rb +++ b/test/pathname/test_pathname.rb @@ -430,7 +430,7 @@ class TestPathname < Test::Unit::TestCase end def descend(path) - Pathname.new(path).enum_for(:descend).map {|v| v.to_s } + Pathname.new(path).descend.map(&:to_s) end defassert(:descend, %w[/ /a /a/b /a/b/c], "/a/b/c") @@ -439,7 +439,7 @@ class TestPathname < Test::Unit::TestCase defassert(:descend, %w[a/], "a/") def ascend(path) - Pathname.new(path).enum_for(:ascend).map {|v| v.to_s } + Pathname.new(path).ascend.map(&:to_s) end defassert(:ascend, %w[/a/b/c /a/b /a /], "/a/b/c") @@ -447,6 +447,14 @@ class TestPathname < Test::Unit::TestCase defassert(:ascend, %w[./a/b/c ./a/b ./a .], "./a/b/c") defassert(:ascend, %w[a/], "a/") + def test_blockless_ascend_is_enumerator + assert_kind_of(Enumerator, Pathname.new('a').ascend) + end + + def test_blockless_descend_is_enumerator + assert_kind_of(Enumerator, Pathname.new('a').descend) + end + def test_initialize p1 = Pathname.new('a') assert_equal('a', p1.to_s) |