summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-08-09 13:15:49 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-08-09 13:15:49 +0000
commitec5bb26fa031288fd8f935443805f68e5637ee75 (patch)
tree044e5291fb5eb8ed50ad75979ebf409be64de5d9
parent55584cb206746bd632ef13356cf88036cc59c353 (diff)
* ext/pathname/pathname.c (path_open): Pathname#open
translated from pathname.rb. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28941 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--ext/pathname/lib/pathname.rb5
-rw-r--r--ext/pathname/pathname.c20
-rw-r--r--test/pathname/test_pathname.rb20
4 files changed, 44 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 8c36dd8ee8..a93a9a08cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Aug 9 22:15:19 2010 Tanaka Akira <akr@fsij.org>
+
+ * ext/pathname/pathname.c (path_open): Pathname#open
+ translated from pathname.rb.
+
Mon Aug 9 22:11:09 2010 Tanaka Akira <akr@fsij.org>
* test/ruby/test_signal.rb (TestSignal#test_exit_action): use
diff --git a/ext/pathname/lib/pathname.rb b/ext/pathname/lib/pathname.rb
index b685309e7c..197c9e6bf4 100644
--- a/ext/pathname/lib/pathname.rb
+++ b/ext/pathname/lib/pathname.rb
@@ -512,11 +512,6 @@ end
class Pathname # * File *
- # See <tt>File.open</tt>. Opens the file for reading or writing.
- def open(*args, &block) # :yield: file
- File.open(@path, *args, &block)
- end
-
# See <tt>File.readlink</tt>. Read symbolic link.
def readlink() self.class.new(File.readlink(@path)) end
diff --git a/ext/pathname/pathname.c b/ext/pathname/pathname.c
index fb023f334e..f7686717d8 100644
--- a/ext/pathname/pathname.c
+++ b/ext/pathname/pathname.c
@@ -337,6 +337,25 @@ path_make_link(VALUE self, VALUE old)
}
/*
+ * See <tt>File.open</tt>. Opens the file for reading or writing.
+ */
+static VALUE
+path_open(int argc, VALUE *argv, VALUE self)
+{
+ VALUE args[4];
+ int n;
+
+ args[0] = get_strpath(self);
+ n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
+ if (rb_block_given_p()) {
+ return rb_block_call(rb_cFile, rb_intern("open"), 1+n, args, 0, 0);
+ }
+ else {
+ return rb_funcall2(rb_cFile, rb_intern("open"), 1+n, args);
+ }
+}
+
+/*
* == Pathname
*
* Pathname represents a pathname which locates a file in a filesystem.
@@ -547,4 +566,5 @@ Init_pathname()
rb_define_method(rb_cPathname, "fnmatch?", path_fnmatch, -1);
rb_define_method(rb_cPathname, "ftype", path_ftype, 0);
rb_define_method(rb_cPathname, "make_link", path_make_link, 1);
+ rb_define_method(rb_cPathname, "open", path_open, -1);
}
diff --git a/test/pathname/test_pathname.rb b/test/pathname/test_pathname.rb
index 815713b039..25e0423033 100644
--- a/test/pathname/test_pathname.rb
+++ b/test/pathname/test_pathname.rb
@@ -818,9 +818,27 @@ class TestPathname < Test::Unit::TestCase
def test_open
with_tmpchdir('rubytest-pathname') {|dir|
open("a", "w") {|f| f.write "abc" }
- Pathname("a").open {|f|
+ path = Pathname("a")
+
+ path.open {|f|
+ assert_equal("abc", f.read)
+ }
+
+ path.open("r") {|f|
assert_equal("abc", f.read)
}
+
+ Pathname("b").open("w", 0444) {|f| f.write "def" }
+ assert_equal(0444, File.stat("b").mode & 0777)
+ assert_equal("def", File.read("b"))
+
+ Pathname("c").open("w", 0444, {}) {|f| f.write "ghi" }
+ assert_equal(0444, File.stat("c").mode & 0777)
+ assert_equal("ghi", File.read("c"))
+
+ g = path.open
+ assert_equal("abc", g.read)
+ g.close
}
end