diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc5bd90 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/pkg 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/Rakefile b/Rakefile index 01c6483..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 = ["README", "VERSION", "lib/**/*.rb", "test/**/*.rb"] - gem.require_paths = ["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 diff --git a/lib/select.rb b/lib/select.rb index 1af7859..306285a 100644 --- a/lib/select.rb +++ b/lib/select.rb @@ -1,89 +1,205 @@ +# 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 < 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