edit: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/kernel/open_tags.txt;C1473028
File: open_tags.txt
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/kernel/open_tags.txt;C1473028  (server)    1/20/2010 3:53 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/kernel/open_tags.txt;open
@@ -1,18 +1,5 @@
-fails:Kernel#open is a private method
-fails:Kernel#open opens a file when given a valid filename
 fails:Kernel#open opens a file when called with a block
-fails:Kernel#open sets a default permission of writable
 fails:Kernel#open sets permissions of newly created file
 fails:Kernel#open sets the file as writable if perm is nil
-fails:Kernel#open ignores perm for existing file
-fails:Kernel#open opens an io when path starts with a pipe
-fails:Kernel#open opens an io when called with a block
-fails:Kernel#open returns block return value
-fails:Kernel#open raises an ArgumentError if not passed one argument
-fails:Kernel#open raises a TypeError if passed nil for path
-fails:Kernel#open accepts String-like objects for path
-fails:Kernel#open allows nil for mode
-fails:Kernel#open allows String-like objects for mode
 fails:Kernel#open allows nil for perm
 fails:Kernel#open allows Integer-like objects for perm
-fails:Kernel#open raises a TypeError if not passed a String type
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/kernel/open_spec.rb;C1473028
File: open_spec.rb
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/kernel/open_spec.rb;C1473028  (server)    1/20/2010 3:47 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/kernel/open_spec.rb;open
@@ -7,8 +7,8 @@
   end
   
   before :each do
-    @file = "kernel_test.txt"
-    @newfile = "kernel_test.new"
+    @file = tmp("kernel_test.txt")
+    @newfile = tmp("kernel_test.new")
     @fh = nil
     touch(@file) { |f| f.write "This is a test" }
   end
@@ -29,6 +29,7 @@
   end
   
   it "sets a default permission of writable" do
+    @fh = open(@file)
     File.writable?(@file).should be_true  
   end
   
@@ -72,6 +73,10 @@
       @output = open("|date /t") { |f| f.gets }
       @output.should_not == ''
     end
+    
+    it "NotImplementedError when called with |-" do
+      lambda { open("|-") }.should raise_error(NotImplementedError)
+    end
   
   end
     
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/IoOps.cs;C1286631
File: IoOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/IoOps.cs;C1286631  (server)    1/20/2010 3:57 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/IoOps.cs;open
@@ -217,8 +217,13 @@
         [RubyMethod("popen", RubyMethodAttributes.PublicSingleton, BuildConfig = "!SILVERLIGHT")]
         public static RubyIO/*!*/ OpenPipe(RubyContext/*!*/ context, RubyClass/*!*/ self,
             [DefaultProtocol, NotNull]MutableString/*!*/ command, [DefaultProtocol, Optional, NotNull]MutableString modeString) {
+            return OpenPipe(context, command, IOModeEnum.Parse(modeString));
+        }
 
-            IOMode mode = IOModeEnum.Parse(modeString);
+        public static RubyIO/*!*/ OpenPipe(
+            RubyContext/*!*/ context, 
+            MutableString/*!*/ command, 
+            IOMode mode) {
 
             bool redirectStandardInput = mode.CanWrite();
             bool redirectStandardOutput = mode.CanRead();
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;C1473028
File: KernelOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;C1473028  (server)    1/20/2010 3:38 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/KernelOps.cs;open
@@ -1315,15 +1315,20 @@
             RubyContext/*!*/ context,
             object self,
             [DefaultProtocol, NotNull]MutableString/*!*/ path,
-            [DefaultProtocol, Optional]MutableString mode,
+            [DefaultProtocol, Optional]MutableString modeString,
             [DefaultProtocol, DefaultParameterValue(RubyFileOps.ReadWriteMode)]int permission) {
 
+            IOMode mode = IOModeEnum.Parse(modeString);
+
             string fileName = path.ConvertToString();
             if (fileName.Length > 0 && fileName[0] == '|') {
-                throw new NotImplementedError();
+                if (fileName.Length > 1 && fileName[1] == '-') {
+                    throw new NotImplementedError("forking a process is not supported");
+                }
+                return RubyIOOps.OpenPipe(context, path.GetSlice(1), mode);
             }
 
-            RubyIO file = new RubyFile(context, fileName, IOModeEnum.Parse(mode));
+            RubyIO file = new RubyFile(context, fileName, mode);
 
             SetPermission(context, fileName, permission);
 
@@ -1355,7 +1360,10 @@
 
             string fileName = path.ConvertToString();
             if (fileName.Length > 0 && fileName[0] == '|') {
-                throw new NotImplementedError();
+                if (fileName.Length > 1 && fileName[1] == '-') {
+                    throw new NotImplementedError("forking a process is not supported");
+                }
+                return RubyIOOps.OpenPipe(context, path.GetSlice(1), (IOMode)mode);
             }
 
             RubyIO file = new RubyFile(context, fileName, (IOMode)mode);
===================================================================
