[#46902] [ruby-trunk - Feature #7767][Open] Tempfileで自動的にファイルを削除する — "kyanagi (Kouhei Yanagita)" <redmine@...>
8 messages
2013/02/01
[#46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV — "ktsj (Kazuki Tsujimoto)" <kazuki@...>
16 messages
2013/02/03
[#46921] Re: [ruby-dev:46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV
— SASADA Koichi <ko1@...>
2013/02/05
> Issue #7774 has been reported by ktsj (Kazuki Tsujimoto).
[#46960] Re: [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV
— Kazuki Tsujimoto <kazuki@...>
2013/02/09
辻本です。
[#46929] Re: [ruby-changes:27041] usa:r39093 (ruby_1_9_3): merge revision(s) 33210,33212: [Backport #5278] — Kouhei Sutou <kou@...>
須藤です。
4 messages
2013/02/06
[#46930] Re: [ruby-changes:27041] usa:r39093 (ruby_1_9_3): merge revision(s) 33210,33212: [Backport #5278]
— "U.Nakamura" <usa@...>
2013/02/06
こんにちは、なかむら(う)です。
[#46933] Re: [ruby-cvs:46289] zzak:r39120 (trunk): * doc/security.rb: Translate japanese kanji to english — "Martin J. Dürst" <duerst@...>
Hello Zachary,
3 messages
2013/02/07
[#46990] [ruby-trunk - Bug #7101] 拡張ライブラリの質問 — "mame (Yusuke Endoh)" <mame@...>
1 message
2013/02/15
[#47075] [ruby-trunk - Bug #7924][Open] r39232 以降 net/http で正しく reponse を取得出来ないケースがある — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>
15 messages
2013/02/23
[#47088] Test on NetBSD/amd64 6.0_STABLE — Takahiro Kambe <taca@...>
こんにちは。
3 messages
2013/02/24
[ruby-dev:46979] [ruby-trunk - Feature #7767] Tempfileで自動的にファイルを削除する
From:
"yhara (Yutaka HARA)" <redmine@...>
Date:
2013-02-13 09:31:37 UTC
List:
ruby-dev #46979
Issue #7767 has been updated by yhara (Yutaka HARA).
Category set to lib
Target version set to next minor
----------------------------------------
Feature #7767: Tempfileで自動的にファイルを削除する
https://bugs.ruby-lang.org/issues/7767#change-36219
Author: kyanagi (Kouhei Yanagita)
Status: Open
Priority: Normal
Assignee:
Category: lib
Target version: next minor
ソースコードのコメント(tempfile.rbのGood practicesの項)にも書かれている通り、
Tempfileは使用後、明示的に削除することが推奨されています。
しかし、Tempfile.openにブロックを渡すと自動的にcloseするところまではやってくれるのに、
削除をわざわざ明示的に書かないといけないというのは少し残念な気もします。
Tempfile.openの類推で、ブロックを抜けると自動的にclose!してくれるメソッドがあると、
削除に気を使わなくてもよくなり、使いやすいのではないかと思いましたがいかがでしょうか。
メソッド名ですが、
* 使いやすさを考えると、openと同じくらいに書きやすい(短い)ものがよい
* Tempfile.openはブロックを抜けるときにcloseするが、提案する新メソッドではclose!する
という点を考えて、ひとまずTempfile.open!を提案してみます。
Index: lib/tempfile.rb
===================================================================
--- lib/tempfile.rb (revision 39003)
+++ lib/tempfile.rb (working copy)
@@ -305,6 +305,9 @@
#
# In any case, all arguments (+*args+) will be passed to Tempfile.new.
#
+ # +open!+ is same as +open+, except that the file will be deleted immediately
+ # after the block terminates.
+ #
# Tempfile.open('foo', '/home/temp') do |f|
# ... do something with f ...
# end
@@ -316,14 +319,23 @@
# ensure
# f.close
# end
- def open(*args)
+ def open(*args, &block)
+ _open(false, *args, &block)
+ end
+
+ def open!(*args, &block)
+ _open(true, *args, &block)
+ end
+
+ private
+ def _open(unlink_at_block_end, *args, &block)
tempfile = new(*args)
if block_given?
begin
yield(tempfile)
ensure
- tempfile.close
+ tempfile.close(unlink_at_block_end)
end
else
tempfile
Index: test/test_tempfile.rb
===================================================================
--- test/test_tempfile.rb (revision 39003)
+++ test/test_tempfile.rb (working copy)
@@ -304,5 +304,13 @@
assert_equal(0600, t.stat.mode & 0777)
end
end
+
+ def test_open_bang_with_block
+ path = nil
+ Tempfile.open!('foo') do |f|
+ path = f.path
+ end
+ assert !File.exist?(path)
+ end
end
--
http://bugs.ruby-lang.org/