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

Posted by kyanagi (Kouhei Yanagita) (Guest)
on 2013-02-01 13:27
(Received via mailing list)
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
Posted by Tanaka Akira (Guest)
on 2013-02-01 13:58
(Received via mailing list)
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
Posted by yhara (Yutaka HARA) (Guest)
on 2013-02-13 10:32
(Received via mailing list)
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
Posted by ko1 (Koichi Sasada) (Guest)
on 2013-02-22 01:08
(Received via mailing list)
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
Posted by akr (Akira Tanaka) (Guest)
on 2013-04-04 10:20
(Received via mailing list)
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
Posted by shugo (Shugo Maeda) (Guest)
on 2013-04-04 11:34
(Received via mailing list)
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
Posted by Tanaka Akira (Guest)
on 2013-04-05 02:53
(Received via mailing list)
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
Posted by akr (Akira Tanaka) (Guest)
on 2013-04-20 16:01
(Received via mailing list)
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
No account? Register here.