[ruby-trunk - Feature #7767][Open] Tempfileで自動的にファイルを削除する

Issue #7767 has been reported by kyanagi (Kouhei Y.).


Feature #7767: Tempfileで自動的にファイルを削除する

Author: kyanagi (Kouhei Y.)
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

2013/2/1 kyanagi (Kouhei Y.) [email protected]:

$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

Issue #7767 has been updated by yhara (Yutaka HARA).

Category set to lib
Target version set to next minor


Feature #7767: Tempfileで自動的にファイルを削除する

Author: kyanagi (Kouhei Y.)
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

Issue #7767 has been updated by akr (Akira T.).

Parent task set to #5707


Feature #7767: Tempfileで自動的にファイルを削除する

Author: kyanagi (Kouhei Y.)
Status: Open
Priority: Normal
Assignee: akr (Akira T.)
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

Issue #7767 has been updated by shugo (Shugo M.).

akr (Akira T.) wrote:

メソッド名ですが、

  • 使いやすさを考えると、openと同じくらいに書きやすい(短い)ものがよい
  • Tempfile.openはブロックを抜けるときにcloseするが、提案する新メソッドではclose!する
    という点を考えて、ひとまずTempfile.open!を提案してみます。

名前が通るといいですねぇ。

Tempfile.openとTempfile.open!で違うクラスのインスタンスが作成されるのは
ちょっとわかりにくいような気がしますので、openから派生した名前でない方がよいの
ではないでしょうか。
例えば、Tempfile.createはどうでしょう。


Feature #7767: Tempfileで自動的にファイルを削除する

Author: kyanagi (Kouhei Y.)
Status: Open
Priority: Normal
Assignee: akr (Akira T.)
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

2013$BG/(B4$B7n(B4$BF|(B 18:34 shugo (Shugo M.)
[email protected]:

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

Issue #7767 has been updated by ko1 (Koichi Sasada).

Assignee set to akr (Akira T.)

誰にアサインすればわからなかったのですが、
詳しそうな田中さんにアサインさせて頂きます。

Feature #7767: Tempfileで自動的にファイルを削除する

Author: kyanagi (Kouhei Y.)
Status: Open
Priority: Normal
Assignee: akr (Akira T.)
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

Issue #7767 has been updated by akr (Akira T.).

Status changed from Open to Closed


Feature #7767: Tempfileで自動的にファイルを削除する

Author: kyanagi (Kouhei Y.)
Status: Closed
Priority: Normal
Assignee: akr (Akira T.)
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