diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-14 15:14:46 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-14 15:14:46 +0000 |
commit | d6566a46ad1591860c97492bb45486518473ff88 (patch) | |
tree | bce0e4da41f5fe3d2e3b6547a4a0ec5cfb0eaca0 | |
parent | b1e118eec1a4239ffa0eacace7ee6c864dbce28b (diff) | |
download | ruby-d6566a46ad1591860c97492bb45486518473ff88.tar.gz |
* ext/pathname/lib/pathname.rb (descend): Blockless form supported.
(ascend): Ditto.
[ruby-core:68820] [Feature #11052] Patch by Piotr Szotkowski.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50897 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-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) |