[macruby-changes] [3301] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Jan 19 15:56:49 PST 2010


Revision: 3301
          http://trac.macosforge.org/projects/ruby/changeset/3301
Author:   ernest.prabhakar at gmail.com
Date:     2010-01-19 15:56:47 -0800 (Tue, 19 Jan 2010)
Log Message:
-----------
First checking of Dispatch::Queue convenience methods for Sources

Added Paths:
-----------
    MacRuby/trunk/gcd_prelude.rb
    MacRuby/trunk/spec/macruby/core/gcd/prelude_spec.rb

Removed Paths:
-------------
    MacRuby/trunk/spec/macruby/core/gcd/source_spec_disabled.rb

Added: MacRuby/trunk/gcd_prelude.rb
===================================================================
--- MacRuby/trunk/gcd_prelude.rb	                        (rev 0)
+++ MacRuby/trunk/gcd_prelude.rb	2010-01-19 23:56:47 UTC (rev 3301)
@@ -0,0 +1,61 @@
+module Dispatch
+  class Source
+    @@proc_events = {
+       exit:PROC_EXIT,
+       fork:PROC_FORK,
+       exec:PROC_EXEC,
+       signal:PROC_SIGNAL}
+    def self.proc_event(e)
+      (e.is_a? Numeric) ? e.to_i : @@proc_events[e]
+    end
+
+    @@vnode_events = {
+      delete:VNODE_DELETE,
+      write:VNODE_WRITE, 
+      append:VNODE_EXTEND, 
+      attrib:VNODE_ATTRIB, 
+      link:VNODE_LINK, 
+      rename:VNODE_RENAME, 
+      revoke:VNODE_REVOKE}
+    def self.vnode_event(e)
+      (e.is_a? Numeric) ? e.to_i : @@vnode_events[e]
+    end
+  end
+  
+  class Queue
+    def on_add(&block)
+      Dispatch::Source.new(Dispatch::Source::DATA_ADD, 0, 0, self, &block)
+    end
+
+    def on_or(&block)
+      Dispatch::Source.new(Dispatch::Source::DATA_OR, 0, 0, self, &block)
+    end
+
+    def on_process_event(pid, *events, &block)
+      mask = events.collect {|e| Dispatch::Source::proc_event(x)}.reduce(:|)
+      Dispatch::Source.new(Dispatch::Source::DATA_PROC, pid, mask, self, &block)
+    end
+
+    def on_signal(signal, &block)
+      signal = Signal.list[signal.to_s] if signal.to_i == 0
+      Dispatch::Source.new(Dispatch::Source::DATA_SIGNAL, signal, 0, self, &block)
+    end
+
+    def on_read(file, &block)
+      Dispatch::Source.new(Dispatch::Source::DATA_READ, file, 0, self, &block)
+    end
+
+    def on_write(file, &block)
+      Dispatch::Source.new(Dispatch::Source::DATA_WRITE, file, 0, self, &block)
+    end
+
+    def on_file_event(file, *events, &block)
+      mask = events.collect {|e| Dispatch::Source::vnode_event(x)}.reduce(:|)
+      Dispatch::Source.new(Dispatch::Source::DATA_VNODE, file,mask, self,&block)
+    end
+
+    def on_interval(sec, &block)
+      Dispatch::Source.timer(0, sec, 0, self, &block)
+    end
+  end
+end

Copied: MacRuby/trunk/spec/macruby/core/gcd/prelude_spec.rb (from rev 3300, MacRuby/trunk/spec/macruby/core/gcd/source_spec_disabled.rb)
===================================================================
--- MacRuby/trunk/spec/macruby/core/gcd/prelude_spec.rb	                        (rev 0)
+++ MacRuby/trunk/spec/macruby/core/gcd/prelude_spec.rb	2010-01-19 23:56:47 UTC (rev 3301)
@@ -0,0 +1,146 @@
+require File.dirname(__FILE__) + "/../../spec_helper"
+
+if MACOSX_VERSION >= 10.6
+
+  describe "Dispatch::Queue source methods" do
+    before :each do
+      @q = Dispatch::Queue.new('org.macruby.gcd_spec.sources')
+      @src = nil
+    end
+
+    after :each do
+      @src.cancel! if not @src.nil? and not @src.cancelled?
+      @q.sync { }
+    end
+
+    describe "on_add" do
+      it "fires with data on summed inputs" do
+        @count = 0
+        @src = @q.on_add {|s| @count += s.data}
+        @src.suspend
+        @src << 20
+        @src << 22
+        @src.resume
+        @q.sync {}
+        @count.should == 42
+      end
+    end    
+
+    describe "on_or" do
+      it "fires with data on ORed inputs" do
+        @count = 0
+        @src = @q.on_or {|s| @count += s.data}
+        @src.suspend
+        @src << 0xb101_000
+        @src << 0xb000_010
+        @src.resume
+        @q.sync {}
+        @count.should == 42
+      end
+    end    
+
+    describe "on_process_event" do
+      it "fires with data indicating which process event(s)" do
+        @signal = Signal.list["USR1"]
+        @event = nil
+        @src = @q.on_process_event($$, :exit,:fork,:exec,:reap,:signal) do 
+           |s| @event = s.data
+        end
+        Process.kill(@signal, $$)
+        @q.sync {}
+        @event.should == Dispatch::Source::PROC_SIGNAL
+      end
+    end
+
+    describe "on_signal" do
+      it "fires with data on how often the process was signaled" do
+        @signal = Signal.list["USR1"]
+        @count = 0
+        @src = @q.on_signal(@signal) {|s| @count += s.data}
+        Signal.trap(@signal, "IGNORE")
+        Process.kill(@signal, $$)
+        Process.kill(@signal, $$)
+        Signal.trap(@signal, "DEFAULT")
+        @q.sync {}
+        @count.should == 2
+        @src.cancel!
+      end
+    end    
+
+    describe "on_interval" do
+      it "fires with data on how often the timer has fired" do
+        @count = -1
+        repeats = 2
+        @interval = 0.02
+        @src = @q.on_interval(@interval) {|s| @count += s.data}
+        sleep repeats*@interval
+        @q.sync { }
+        @count.should == repeats
+      end
+    end
+    
+    describe "file:" do
+      before :each do
+        @msg = "#{$$}: #{Time.now}"
+        @filename = "/var/tmp/gcd_spec_source-#{$$}-#{Time.now}"
+        @file = nil
+        @src = nil
+      end
+
+      after :each do
+        @src.cancel! if not @src.nil? and not @src.cancelled?
+        @q.sync { }
+        @file.close if not @file.closed?
+        File.delete(@filename)
+      end
+
+      describe "on_read" do
+        it "fires with data on how many bytes can be read" do
+          File.open(@filename, "w") {|f| f.print @msg}
+          @file = File.open(@filename, "r")
+          @result = ""
+          @src = @q.on_read(@file, close:true) {|s| @result<<@file.read(s.data)}
+          while (@result.size < @msg.size) do; end
+          @q.sync { }
+          @result.should == @msg
+        end
+      end    
+
+      describe "on_write" do
+        it "fires with data on how many bytes can be written" do
+          @file = File.open(@filename, "w")
+          @pos = 0
+          @message = @msg
+          @src = @q.on_read(@file, close:true) do |s|
+            pos = s.data
+            if not @message.nil? then
+              next_msg = @message[0..pos-1]
+              @file.write(next_msg)
+              @message = @message[pos..-1]
+            end
+          end
+          while (@result.size < @msg.size) do; end
+          @q.sync { }
+          @result.should == @msg
+        end
+      end
+      
+      describe "on_file_event" do
+        it "fires with data on how many bytes can be written" do
+          @file = File.open(@filename, "w")
+          @fired = false
+          @src = @q.on_file_event(@file, :delete, :write, :extend, :attrib, :link, :rename, :revoke) do |s|
+              @flag = s.data
+              @fired = true
+          end
+          @file.write(@msg)
+          @file.flush
+          @q.sync { }
+          #while (@fired == false) do; end
+          @fired.should == true
+          @flag.should == Dispatch::Source::VNODE_WRITE
+        end
+      end          
+    end
+  end
+end

Deleted: MacRuby/trunk/spec/macruby/core/gcd/source_spec_disabled.rb
===================================================================
--- MacRuby/trunk/spec/macruby/core/gcd/source_spec_disabled.rb	2010-01-19 19:29:11 UTC (rev 3300)
+++ MacRuby/trunk/spec/macruby/core/gcd/source_spec_disabled.rb	2010-01-19 23:56:47 UTC (rev 3301)
@@ -1,146 +0,0 @@
-require File.dirname(__FILE__) + "/../../spec_helper"
-
-if MACOSX_VERSION >= 10.6
-
-  describe "Dispatch::Queue source methods" do
-    before :each do
-      @q = Dispatch::Queue.new('org.macruby.gcd_spec.sources')
-      @src = nil
-    end
-
-    after :each do
-      @src.cancel! if not @src.nil? and not @src.cancelled?
-      @q.sync { }
-    end
-
-    describe "on_add" do
-      it "fires with data on summed inputs" do
-        @count = 0
-        @src = @q.on_add {|s| @count += s.data}
-        @src.suspend
-        @src << 20
-        @src << 22
-        @src.resume
-        @q.sync {}
-        @count.should == 42
-      end
-    end    
-
-    describe "on_or" do
-      it "fires with data on ORed inputs" do
-        @count = 0
-        @src = @q.on_or {|s| @count += s.data}
-        @src.suspend
-        @src << 0xb101_000
-        @src << 0xb000_010
-        @src.resume
-        @q.sync {}
-        @count.should == 42
-      end
-    end    
-
-    describe "on_process_event" do
-      it "fires with data indicating which process event(s)" do
-        @signal = Signal.list["USR1"]
-        @event = nil
-        @src = @q.on_process_event($$, :exit,:fork,:exec,:reap,:signal) do 
-           |s| @event = s.data
-        end
-        Process.kill(@signal, $$)
-        @q.sync {}
-        @event.should == Dispatch::Source::PROC_SIGNAL
-      end
-    end
-
-    describe "on_signal" do
-      it "fires with data on how often the process was signaled" do
-        @signal = Signal.list["USR1"]
-        @count = 0
-        @src = @q.on_signal(@signal) {|s| @count += s.data}
-        Signal.trap(@signal, "IGNORE")
-        Process.kill(@signal, $$)
-        Process.kill(@signal, $$)
-        Signal.trap(@signal, "DEFAULT")
-        @q.sync {}
-        @count.should == 2
-        @src.cancel!
-      end
-    end    
-
-    describe "on_interval" do
-      it "fires with data on how often the timer has fired" do
-        @count = -1
-        repeats = 2
-        @interval = 0.02
-        @src = @q.on_interval(@interval) {|s| @count += s.data}
-        sleep repeats*@interval
-        @q.sync { }
-        @count.should == repeats
-      end
-    end
-    
-    describe "file:" do
-      before :each do
-        @msg = "#{$$}: #{Time.now}"
-        @filename = "/var/tmp/gcd_spec_source-#{$$}-#{Time.now}"
-        @file = nil
-        @src = nil
-      end
-
-      after :each do
-        @src.cancel! if not @src.nil? and not @src.cancelled?
-        @q.sync { }
-        @file.close if not @file.closed?
-        File.delete(@filename)
-      end
-
-      describe "on_read" do
-        it "fires with data on how many bytes can be read" do
-          File.open(@filename, "w") {|f| f.print @msg}
-          @file = File.open(@filename, "r")
-          @result = ""
-          @src = @q.on_read(@file, close:true) {|s| @result<<@file.read(s.data)}
-          while (@result.size < @msg.size) do; end
-          @q.sync { }
-          @result.should == @msg
-        end
-      end    
-
-      describe "on_write" do
-        it "fires with data on how many bytes can be written" do
-          @file = File.open(@filename, "w")
-          @pos = 0
-          @message = @msg
-          @src = @q.on_read(@file, close:true) do |s|
-            pos = s.data
-            if not @message.nil? then
-              next_msg = @message[0..pos-1]
-              @file.write(next_msg)
-              @message = @message[pos..-1]
-            end
-          end
-          while (@result.size < @msg.size) do; end
-          @q.sync { }
-          @result.should == @msg
-        end
-      end
-      
-      describe "on_file_event" do
-        it "fires with data on how many bytes can be written" do
-          @file = File.open(@filename, "w")
-          @fired = false
-          @src = @q.on_file_event(@file, :delete, :write, :extend, :attrib, :link, :rename, :revoke) do |s|
-              @flag = s.data
-              @fired = true
-          end
-          @file.write(@msg)
-          @file.flush
-          @q.sync { }
-          #while (@fired == false) do; end
-          @fired.should == true
-          @flag.should == Dispatch::Source::VNODE_WRITE
-        end
-      end          
-    end
-  end
-end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100119/ac296c55/attachment-0001.html>


More information about the macruby-changes mailing list