Issue #7767 has been reported by kyanagi (Kouhei Yanagita). ---------------------------------------- Feature #7767: Tempfileで自動的にファイルを削除する https://bugs.ruby-lang.org/issues/7767 Author: kyanagi (Kouhei Yanagita) Status: Open Priority: Normal Assignee: Category: Target version: ソースコードのコメント(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
on 2013-02-01 13:27
on 2013-02-01 13:58
2013/2/1 kyanagi (Kouhei Yanagita) <redmine@ruby-lang.org>: > > $B$7$+$7!"(BTempfile.open$B$K%V%m%C%/$rEO$9$H<+F0E*$K(Bclose$B$9$k$H$3$m$^$G$O$d$C$F$/$l$k$N$K!"(B > $B:o=|$r$o$6$o$6L@<(E*$K=q$+$J$$$H$$$1$J$$$H$$$&$N$O>/$7;DG0$J5$$b$7$^$9!#(B > > Tempfile.open$B$NN`?d$G!"%V%m%C%/$rH4$1$k$H<+F0E*$K(Bclose!$B$7$F$/$l$k%a%=%C%I$,$"$k$H!"(B > $B:o=|$K5$$r;H$o$J$/$F$b$h$/$J$j!";H$$$d$9$$$N$G$O$J$$$+$H;W$$$^$7$?$,$$$+$,$G$7$g$&$+!#(B $B$h$$$H;W$&$N$G$9$,!"%V%m%C%/$rH4$1$k$H$-$K>C$9$J$i!"(BGC $B$G>C$9I,MW$O$J$$$N$G$O$J$$$G$7$g$&$+!#(B Tempfile $B$N%$%s%9%?%s%9$G$"$kI,MW$b$J$$$G$9$h$M!"(B $B$H$$$&$3$H$G!"(Bhttp://bugs.ruby-lang.org/issues/5707 $B$rDs0F$7$?$s$G$9$,!"(B $BL>A0$,LdBj$G;_$^$C$F$$$^$9!#(B > $B%a%=%C%IL>$G$9$,!"(B > * $B;H$$$d$9$5$r9M$($k$H!"(Bopen$B$HF1$8$/$i$$$K=q$-$d$9$$!JC;$$!K$b$N$,$h$$(B > * Tempfile.open$B$O%V%m%C%/$rH4$1$k$H$-$K(Bclose$B$9$k$,!"Ds0F$9$k?7%a%=%C%I$G$O(Bclose!$B$9$k(B > $B$H$$$&E@$r9M$($F!"$R$H$^$:(BTempfile.open!$B$rDs0F$7$F$_$^$9!#(B $BL>A0$,DL$k$H$$$$$G$9$M$'!#(B
on 2013-02-13 10:32
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
on 2013-02-22 01:08
Issue #7767 has been updated by ko1 (Koichi Sasada). Assignee set to akr (Akira Tanaka) 誰にアサインすればわからなかったのですが、 詳しそうな田中さんにアサインさせて頂きます。 ---------------------------------------- Feature #7767: Tempfileで自動的にファイルを削除する https://bugs.ruby-lang.org/issues/7767#change-36736 Author: kyanagi (Kouhei Yanagita) Status: Open Priority: Normal Assignee: akr (Akira Tanaka) 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
on 2013-04-04 10:20
Issue #7767 has been updated by akr (Akira Tanaka). Parent task set to #5707 ---------------------------------------- Feature #7767: Tempfileで自動的にファイルを削除する https://bugs.ruby-lang.org/issues/7767#change-38211 Author: kyanagi (Kouhei Yanagita) Status: Open Priority: Normal Assignee: akr (Akira Tanaka) 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
on 2013-04-04 11:34
Issue #7767 has been updated by shugo (Shugo Maeda). akr (Akira Tanaka) wrote: > > メソッド名ですが、 > > * 使いやすさを考えると、openと同じくらいに書きやすい(短い)ものがよい > > * Tempfile.openはブロックを抜けるときにcloseするが、提案する新メソッドではclose!する > > という点を考えて、ひとまずTempfile.open!を提案してみます。 > > 名前が通るといいですねぇ。 Tempfile.openとTempfile.open!で違うクラスのインスタンスが作成されるのは ちょっとわかりにくいような気がしますので、openから派生した名前でない方がよいの ではないでしょうか。 例えば、Tempfile.createはどうでしょう。 ---------------------------------------- Feature #7767: Tempfileで自動的にファイルを削除する https://bugs.ruby-lang.org/issues/7767#change-38212 Author: kyanagi (Kouhei Yanagita) Status: Open Priority: Normal Assignee: akr (Akira Tanaka) 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
on 2013-04-05 02:53
2013$BG/(B4$B7n(B4$BF|(B 18:34 shugo (Shugo Maeda) <redmine@ruby-lang.org>: > Tempfile.open$B$H(BTempfile.open!$B$G0c$&%/%i%9$N%$%s%9%?%s%9$,:n@.$5$l$k$N$O(B > $B$A$g$C$H$o$+$j$K$/$$$h$&$J5$$,$7$^$9$N$G!"(Bopen$B$+$iGI@8$7$?L>A0$G$J$$J}$,$h$$$N(B > $B$G$O$J$$$G$7$g$&$+!#(B > $BNc$($P!"(BTempfile.create$B$O$I$&$G$7$g$&!#(B $B$$$$$h$&$J5$$,$7$^$9!#$=$&$7$^$9$+!#(B
on 2013-04-20 16:01
Issue #7767 has been updated by akr (Akira Tanaka). Status changed from Open to Closed ---------------------------------------- Feature #7767: Tempfileで自動的にファイルを削除する https://bugs.ruby-lang.org/issues/7767#change-38784 Author: kyanagi (Kouhei Yanagita) Status: Closed Priority: Normal Assignee: akr (Akira Tanaka) 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
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.