[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