summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--NEWS4
-rw-r--r--lib/tempfile.rb45
-rw-r--r--test/test_tempfile.rb21
4 files changed, 76 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index fd3acb7ac4..eb8317f919 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Apr 20 22:47:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/tempfile.rb (Tempfile.create): New method.
+ The method name is proposed by Shugo Maeda. [ruby-dev:47220]
+ [ruby-core:41478] [Feature #5707]
+
Sat Apr 20 14:22:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* marshal.c (w_object): dump no ivars to the original by marshal_dump.
diff --git a/NEWS b/NEWS
index 7c4ecc4b23..3215497518 100644
--- a/NEWS
+++ b/NEWS
@@ -70,5 +70,9 @@ with all sufficient information, see the ChangeLog file.
* Rinda now supports multicast sockets. See Rinda::RingServer and
Rinda::RingFinger for details.
+* Tempfile
+ * New methods:
+ * Tempfile.create
+
=== Stdlib compatibility issues (excluding feature bug fixes)
=== C API updates
diff --git a/lib/tempfile.rb b/lib/tempfile.rb
index fe7839158a..fd334c173a 100644
--- a/lib/tempfile.rb
+++ b/lib/tempfile.rb
@@ -332,6 +332,51 @@ class Tempfile < DelegateClass(File)
end
end
+# Creates a temporally file as usual File object (not Tempfile).
+# It don't use finalizer and delegation.
+#
+# If no block is given, this is similar to Tempfile.new except
+# creating File instead of Tempfile.
+# The created file is not removed automatically.
+# You should use File.unlink to remove it.
+#
+# If a block is given, then a File object will be constructed,
+# and the block is invoked with the object as the argument.
+# The File object will be automatically closed and
+# the temporally file is removed after the block terminates.
+# The call returns the value of the block.
+#
+# In any case, all arguments (+*args+) will be treated as Tempfile.new.
+#
+# Tempfile.create('foo', '/home/temp') do |f|
+# ... do something with f ...
+# end
+#
+def Tempfile.create(basename, *rest)
+ tmpfile = nil
+ Dir::Tmpname.create(basename, *rest) do |tmpname, n, opts|
+ mode = File::RDWR|File::CREAT|File::EXCL
+ perm = 0600
+ if opts
+ mode |= opts.delete(:mode) || 0
+ opts[:perm] = perm
+ perm = nil
+ else
+ opts = perm
+ end
+ tmpfile = File.open(tmpname, mode, opts)
+ end
+ if block_given?
+ begin
+ yield tmpfile
+ ensure
+ File.unlink tmpfile
+ end
+ else
+ tmpfile
+ end
+end
+
if __FILE__ == $0
# $DEBUG = true
f = Tempfile.new("foo")
diff --git a/test/test_tempfile.rb b/test/test_tempfile.rb
index 1462a981f7..4f7e26f606 100644
--- a/test/test_tempfile.rb
+++ b/test/test_tempfile.rb
@@ -304,5 +304,26 @@ puts Tempfile.new('foo').path
assert_equal(0600, t.stat.mode & 0777)
end
end
+
+ def test_create_with_block
+ path = nil
+ Tempfile.create("tempfile-create") {|f|
+ path = f.path
+ assert(File.exist?(path))
+ }
+ assert(!File.exist?(path))
+ end
+
+ def test_create_without_block
+ path = nil
+ f = Tempfile.create("tempfile-create")
+ path = f.path
+ assert(File.exist?(path))
+ f.close
+ assert(File.exist?(path))
+ ensure
+ f.close if f && !f.closed?
+ File.unlink path if path
+ end
end