From dc294bb63ee2d21537a6469eb581e7e15560017b Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Sat, 20 Mar 2010 23:24:49 +0100 Subject: [PATCH 1/6] little changes: metafiles --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 01c6483..f737155 100644 --- a/Rakefile +++ b/Rakefile @@ -10,8 +10,8 @@ begin gem.email = "Denis.Knauf@gmail.com" gem.homepage = "http://github.com/DenisKnauf/select" gem.authors = ["Denis Knauf"] - gem.files = ["README", "VERSION", "lib/**/*.rb", "test/**/*.rb"] - gem.require_paths = ["lib"] + gem.files = %w[README.md VERSION lib/**/*.rb test/**/*.rb] + gem.require_paths = %w[lib] end Jeweler::GemcutterTasks.new rescue LoadError From 66ce7eb20949bc412375dd8c8e3f487734b6af2f Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Wed, 31 Mar 2010 00:19:43 +0200 Subject: [PATCH 2/6] exit_on_empty default true! --- lib/select.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/select.rb b/lib/select.rb index 1af7859..c347bc9 100644 --- a/lib/select.rb +++ b/lib/select.rb @@ -20,7 +20,7 @@ class Select def initialize timeout = 30 @read, @write, @error = {}, {}, {} @read.default = @write.default = @error.default = lambda{} - @timeout, @tevent, @exit = timeout, lambda{}, false + @timeout, @tevent, @exit, @exit_on_empty = timeout, lambda{}, false, true end def timeout timeout = nil, &event From 17f37684532e05504a3979954609778ea84c8bf3 Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Wed, 6 Jul 2011 05:23:46 -0700 Subject: [PATCH 3/6] lambda{} want to have 0 arguments and raises ArgumentError. proc{} doesn't. --- lib/select.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/select.rb b/lib/select.rb index c347bc9..61514f5 100644 --- a/lib/select.rb +++ b/lib/select.rb @@ -19,8 +19,8 @@ class Select def initialize timeout = 30 @read, @write, @error = {}, {}, {} - @read.default = @write.default = @error.default = lambda{} - @timeout, @tevent, @exit, @exit_on_empty = timeout, lambda{}, false, true + @read.default = @write.default = @error.default = proc{} + @timeout, @tevent, @exit, @exit_on_empty = timeout, proc{}, false, true end def timeout timeout = nil, &event From d265ec4d8c0739421a1f44a11c99714348cafff1 Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Wed, 6 Jul 2011 15:35:36 +0200 Subject: [PATCH 4/6] #at added: at a timestamp, please do something --- lib/select.rb | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/lib/select.rb b/lib/select.rb index 61514f5..9d92d90 100644 --- a/lib/select.rb +++ b/lib/select.rb @@ -18,7 +18,7 @@ class Select end def initialize timeout = 30 - @read, @write, @error = {}, {}, {} + @read, @write, @error, @times = {}, {}, {}, [] @read.default = @write.default = @error.default = proc{} @timeout, @tevent, @exit, @exit_on_empty = timeout, proc{}, false, true end @@ -68,22 +68,57 @@ class Select def run_once timeout = @timeout r, w, e = Kernel.select( @read.keys, @write.keys, @error.keys, timeout) - return @tevent.call unless r or w or e - r.each {|h| @read[ h].call h, :read } - w.each {|h| @write[ h].call h, :write } - e.each {|h| @error[ h].call h, :error } + r and r.each {|h| @read[ h].call h, :read } + w and w.each {|h| @write[ h].call h, :write } + e and e.each {|h| @error[ h].call h, :error } end def run &e if e until @exit || (@exit_on_empty && self.empty?) - self.run_once + cron + self.run_once 1 e.call end else - self.run_once until @exit || (@exit_on_empty && self.empty?) + until @exit || (@exit_on_empty && self.empty?) + cron + self.run_once 1 + end end end + + attr_reader :times + def cron + @times.each do |e| + return if e > Time.now + e.call + @times.shift + end + end + + class Entry < Time + attr_reader :do + def do &e + @do = e + end + + def call *p + @do.call *p + end + + def self.new *a, &e + x = self.at *a + x.do &e + x + end + end + + def at a, &e + a = Entry.new a, &e if e + @times << a + @times.sort! + end end class Select::Buffer Date: Thu, 25 Aug 2016 22:28:32 +0200 Subject: [PATCH 5/6] README.md added. select: on/off/one (like event-based jquery). --- README.md | 4 ++ lib/select.rb | 171 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 130 insertions(+), 45 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..03aab8a --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +Select +====== + +IO-Management select-based. diff --git a/lib/select.rb b/lib/select.rb index 9d92d90..306285a 100644 --- a/lib/select.rb +++ b/lib/select.rb @@ -1,87 +1,168 @@ +# IO-Management +# Fires if IO is ready a given block. +# +# Select.open do |sel| +# sock = TCPSocket.new 'localhost', 8090 +# buffer = '' +# +# sel.on_read serv do |sock| +# buffer << sock.sysread +# end +# +# sel.on_write STDOUT do |sock| +# return if buffer.empty? +# written = sock.syswrite buffer +# buffer = buffer[written..-1] +# end +# +# sel.on_error sock do |sock| +# sel.close +# end +# end + class Select READ, WRITE, ERROR = 1, 2, 3 attr_reader :read, :write, :error attr_accessor :exit, :exit_on_empty + # There are no events to wait? def empty? @read.empty? && @write.empty? && @error.empty? end - def self.new *p, &e - r = super *p - if e - e.call r - r.close - else r + class < Date: Thu, 25 Aug 2016 22:33:27 +0200 Subject: [PATCH 6/6] Rakefile updated, license defined --- .gitignore | 1 + Rakefile | 71 +++++++++++++++++++++++++++--------------------------- 2 files changed, 37 insertions(+), 35 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc5bd90 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/pkg diff --git a/Rakefile b/Rakefile index f737155..2084b4a 100644 --- a/Rakefile +++ b/Rakefile @@ -2,56 +2,57 @@ require 'rubygems' require 'rake' begin - require 'jeweler' - Jeweler::Tasks.new do |gem| - gem.name = "select" - gem.summary = %Q{IO-event-handler based on select} - gem.description = %Q{Select based event-handler for servers and sockets} - gem.email = "Denis.Knauf@gmail.com" - gem.homepage = "http://github.com/DenisKnauf/select" - gem.authors = ["Denis Knauf"] - gem.files = %w[README.md VERSION lib/**/*.rb test/**/*.rb] - gem.require_paths = %w[lib] - end - Jeweler::GemcutterTasks.new + require 'jeweler' + Jeweler::Tasks.new do |gem| + gem.name = "select" + gem.summary = %Q{IO-event-handler based on select} + gem.description = %Q{Select based event-handler for servers and sockets} + gem.email = "ich@denkn.at" + gem.license = 'LGPL-3.0' + gem.homepage = "http://github.com/DenisKnauf/select" + gem.authors = ["Denis Knauf"] + gem.files = %w[README.md VERSION lib/**/*.rb test/**/*.rb] + gem.require_paths = %w[lib] + end + Jeweler::GemcutterTasks.new rescue LoadError - puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" + puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" end require 'rake/testtask' Rake::TestTask.new(:test) do |test| - test.libs << 'lib' << 'test' << 'ext' - test.pattern = 'test/**/*_test.rb' - test.verbose = true + test.libs << 'lib' << 'test' << 'ext' + test.pattern = 'test/**/*_test.rb' + test.verbose = true end begin - require 'rcov/rcovtask' - Rcov::RcovTask.new do |test| - test.libs << 'test' - test.pattern = 'test/**/*_test.rb' - test.verbose = true - end + require 'rcov/rcovtask' + Rcov::RcovTask.new do |test| + test.libs << 'test' + test.pattern = 'test/**/*_test.rb' + test.verbose = true + end rescue LoadError - task :rcov do - abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov" - end + task :rcov do + abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov" + end end task :test => :check_dependencies task :default => :test -require 'rake/rdoctask' +require 'rdoc/task' Rake::RDocTask.new do |rdoc| - if File.exist?('VERSION') - version = File.read('VERSION') - else - version = "" - end + if File.exist?('VERSION') + version = File.read('VERSION') + else + version = "" + end - rdoc.rdoc_dir = 'rdoc' - rdoc.title = "sbdb #{version}" - rdoc.rdoc_files.include('README*') - rdoc.rdoc_files.include('lib/**/*.rb') + rdoc.rdoc_dir = 'rdoc' + rdoc.title = "select #{version}" + rdoc.rdoc_files.include('README*') + rdoc.rdoc_files.include('lib/**/*.rb') end