super-poller 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -10,25 +10,4 @@ Rake::TestTask.new do |t|
10
10
  t.verbose = true
11
11
  end
12
12
 
13
- spec = Gem::Specification.new do |s|
14
- s.name = "super-poller"
15
- s.version = "0.1.0"
16
- s.summary = "Tools for dealing with queues."
17
- s.description = "Small modular library for dealing with queues and pollers."
18
- s.author = "Tom Lea"
19
- s.email = "contrib@tomlea.co.uk"
20
- s.homepage = "http://tomlea.co.uk"
21
- s.has_rdoc = true
22
-
23
- s.files = %w(Rakefile super_poller.gemspec) + Dir.glob("{bin,test,lib}/**/*")
24
- s.executables = FileList["bin/*"].map { |f| File.basename(f) }
25
-
26
- s.require_paths = ["lib"]
27
- s.rubyforge_project = "super-poller"
28
- end
29
-
30
- Rake::GemPackageTask.new(spec) do |pkg|
31
- pkg.gem_spec = spec
32
- file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
33
- File.open(file, "w") {|f| f << spec.to_ruby }
34
- end
13
+ Rake::GemPackageTask.new(eval(File.read('super-poller.gemspec'))){ }
@@ -22,6 +22,14 @@ class ErrorReporterTest < Test::Unit::TestCase
22
22
  assert has_caught
23
23
  end
24
24
 
25
+ should "not catch errors that do not inherit from StandardError" do
26
+ raiser = proc{|msg| raise Exception, "Error doing a #{msg}" }
27
+
28
+ assert_raise(Exception) do
29
+ ErrorReporter.new(raiser){ flunk }.call("Hello")
30
+ end
31
+ end
32
+
25
33
  should "not catch errors if they don't happen" do
26
34
  ErrorReporter.new(stub("handler", :call)){|*args| flunk "Should not have tried to raise!" }.call("Hello")
27
35
  end
metadata CHANGED
@@ -1,15 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: super-poller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 1
9
+ version: 0.1.1
5
10
  platform: ruby
6
11
  authors:
7
12
  - Tom Lea
13
+ - George Brocklehurst
8
14
  autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2009-10-09 00:00:00 +01:00
18
+ date: 2010-07-27 00:00:00 +01:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
@@ -22,16 +28,8 @@ extensions: []
22
28
  extra_rdoc_files: []
23
29
 
24
30
  files:
25
- - Rakefile
26
- - super_poller.gemspec
27
31
  - bin/queue
28
- - bin/scripts/queue_choose
29
- - bin/scripts/queue_copy
30
- - bin/scripts/queue_flush
31
- - bin/scripts/queue_grep
32
- - bin/scripts/queue_interactive_move
33
- - bin/scripts/queue_move
34
- - bin/scripts/queue_scan
32
+ - lib/super_poller.rb
35
33
  - test/aggregating_error_logger_test.rb
36
34
  - test/buffered_handler_test.rb
37
35
  - test/error_reporter_test.rb
@@ -40,20 +38,9 @@ files:
40
38
  - test/router_test.rb
41
39
  - test/starling_queue_test.rb
42
40
  - test/test_helper.rb
43
- - lib/super_poller/aggregating_error_logger.rb
44
- - lib/super_poller/buffered_handler.rb
45
- - lib/super_poller/error_reporter.rb
46
- - lib/super_poller/handler.rb
47
- - lib/super_poller/none_blocking_poller.rb
48
- - lib/super_poller/poller.rb
49
- - lib/super_poller/queue_itterator.rb
50
- - lib/super_poller/queue_url.rb
51
- - lib/super_poller/router.rb
52
- - lib/super_poller/starling_queue.rb
53
- - lib/super_poller/test_case.rb
54
- - lib/super_poller.rb
41
+ - Rakefile
55
42
  has_rdoc: true
56
- homepage: http://tomlea.co.uk
43
+ homepage: http://tomlea.co.uk/
57
44
  licenses: []
58
45
 
59
46
  post_install_message:
@@ -65,18 +52,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
52
  requirements:
66
53
  - - ">="
67
54
  - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
68
57
  version: "0"
69
- version:
70
58
  required_rubygems_version: !ruby/object:Gem::Requirement
71
59
  requirements:
72
60
  - - ">="
73
61
  - !ruby/object:Gem::Version
62
+ segments:
63
+ - 0
74
64
  version: "0"
75
- version:
76
65
  requirements: []
77
66
 
78
- rubyforge_project: super-poller
79
- rubygems_version: 1.3.5
67
+ rubyforge_project:
68
+ rubygems_version: 1.3.6
80
69
  signing_key:
81
70
  specification_version: 3
82
71
  summary: Tools for dealing with queues.
@@ -1,17 +0,0 @@
1
- require "super_poller"
2
- queue = SuperPoller::QueueUrl.parse(ARGV.shift).to_queue
3
-
4
- memo = {:memo => Time.now.to_f}
5
- queue.push(memo)
6
-
7
- SuperPoller::NoneBlockingPoller.new(queue, lambda{|msg|
8
- skip = false
9
- begin
10
- exit if msg == memo
11
- p msg
12
- print "Kill? > "
13
- skip = gets =~ /^[Yy]/
14
- ensure
15
- queue.push(msg) unless skip or msg == memo
16
- end
17
- }).start!
@@ -1,4 +0,0 @@
1
- require "super_poller"
2
- in_queue, out_queue = [nil,nil].map{|url| SuperPoller::QueueUrl.parse(ARGV.shift).to_queue }
3
-
4
- SuperPoller::QueueItterator.new(in_queue).each(&out_queue.method(:push))
@@ -1,3 +0,0 @@
1
- require "super_poller"
2
- queue = SuperPoller::QueueUrl.parse(ARGV.shift).to_queue
3
- SuperPoller::NoneBlockingPoller.new(queue, lambda{|msg| }).start!
@@ -1,51 +0,0 @@
1
- require "super_poller"
2
- require 'optparse'
3
-
4
- options = {}
5
- opts = OptionParser.new do |opts|
6
- opts.banner = "Usage queue grep QUEUE_URL [options]"
7
- opts.on("-f STRING", "--ruby-filter STRING", "Set ruby filter") do |v|
8
- options[:ruby_filter] = v
9
- end
10
-
11
- opts.on("-a STRING", "--ruby-action STRING", "Set ruby action") do |v|
12
- options[:ruby_action] = v
13
- end
14
-
15
- opts.on("-d", "--delete", "Delete all matches") do |v|
16
- options[:ruby_action] = ":delete"
17
- end
18
-
19
- opts.on("-c QUEUE", "--copy QUEUE", "Copy all matches") do |v|
20
- options[:ruby_action] = "SuperPoller::QueueUrl.parse(#{v.to_s.inspect}).to_queue.push(msg)"
21
- end
22
-
23
- opts.on("-m QUEUE", "--move QUEUE", "Move all matches") do |v|
24
- options[:ruby_action] = "SuperPoller::QueueUrl.parse(#{v.to_s.inspect}).to_queue.push(msg); :delete"
25
- end
26
-
27
- opts.on("-t TYPE", "--message-type TYPE", "Select messages of a given type") do |v|
28
- options[:ruby_filter] = "#{v.to_s.inspect} == msg[:name].to_s rescue false"
29
- end
30
-
31
- opts.on_tail("-h", "--help", "Show this message") do
32
- puts opts
33
- exit 1
34
- end
35
- end
36
-
37
- opts.parse!
38
-
39
- unless queue_url = ARGV.shift
40
- puts opts
41
- exit 1
42
- end
43
-
44
- queue = SuperPoller::QueueUrl.parse(queue_url).to_queue
45
-
46
- eval "def matcher_matches?(msg); #{ options[:ruby_filter] || "true" }; end"
47
- eval "def action(msg); #{ options[:ruby_action] || "p msg" }; end"
48
-
49
- SuperPoller::QueueItterator.new(queue).each do |msg|
50
- action(msg) if matcher_matches? msg
51
- end
@@ -1,13 +0,0 @@
1
- require "super_poller"
2
- queue_one = SuperPoller::QueueUrl.parse(ARGV.shift).to_queue
3
- queue_two = SuperPoller::QueueUrl.parse(ARGV.shift).to_queue
4
-
5
- SuperPoller::QueueItterator.new(queue_one).each do |msg|
6
- p msg
7
- print "Move to #{queue_two}? > "
8
-
9
- if gets =~ /^[Yy]/
10
- queue_two.push(msg)
11
- :delete
12
- end
13
- end
@@ -1,4 +0,0 @@
1
- require "super_poller"
2
- in_queue, out_queue = [nil,nil].map{|url| SuperPoller::QueueUrl.parse(ARGV.shift).to_queue }
3
-
4
- SuperPoller::NoneBlockingPoller.new(in_queue, out_queue.method(:push)).start!
@@ -1,3 +0,0 @@
1
- require "super_poller"
2
- queue = SuperPoller::QueueUrl.parse(ARGV.shift).to_queue
3
- SuperPoller::QueueItterator.new(queue).each(&method(:p))
@@ -1,33 +0,0 @@
1
- class SuperPoller::AggregatingErrorLogger
2
- def initialize(stats_file, queue)
3
- @stats_file, @queue = stats_file, queue
4
- end
5
-
6
- def call(error, failed_message)
7
- update_error_queue(error, failed_message)
8
- update_error_stats(error, failed_message[:name] || :unknown)
9
- end
10
-
11
- protected
12
- def update_error_queue(error, failed_message)
13
- error_class_name = error.class.name.to_sym
14
- error_description = {:class => error_class_name, :message => error.message}
15
- @queue.push(failed_message.merge(:error => error_description))
16
- end
17
-
18
- def update_error_stats(error, message_name)
19
- stats = load_stats
20
- error_class_name = error.class.name.to_sym
21
- stats_for_name = (stats[message_name] ||= {})
22
- stats_for_name[error_class_name] ||= 0
23
- stats_for_name[error_class_name] += 1
24
-
25
- File.open(@stats_file, "w") do |file|
26
- file << YAML.dump(stats)
27
- end
28
- end
29
-
30
- def load_stats
31
- File.exists?(@stats_file) && YAML.load(File.read(@stats_file)) || {}
32
- end
33
- end
@@ -1,28 +0,0 @@
1
- class SuperPoller::BufferedHandler < SuperPoller::Handler
2
- class << self
3
- def buffer_size(size)
4
- @max_buffer_size = size
5
- end
6
-
7
- def max_buffer_size
8
- @max_buffer_size || []
9
- end
10
- end
11
-
12
- def initialize
13
- @buffer = []
14
- end
15
-
16
- def call(msg)
17
- @buffer.push msg
18
- if @buffer.size >= self.class.max_buffer_size
19
- handle_batch @buffer
20
- @buffer = []
21
- end
22
- end
23
-
24
- def handle_batch(batch)
25
- raise NotImplementedError, "You must define a batch handler."
26
- end
27
-
28
- end
@@ -1,12 +0,0 @@
1
- class SuperPoller::ErrorReporter
2
- def initialize(message_handler, error_handler = nil, &block)
3
- @message_handler = message_handler
4
- @error_handler = error_handler || block
5
- end
6
-
7
- def call(*args)
8
- @message_handler.call(*args)
9
- rescue Object => e
10
- @error_handler.call(e, *args)
11
- end
12
- end
@@ -1,22 +0,0 @@
1
- class SuperPoller::Handler
2
- autoload :TestCase, "super_poller/test_case"
3
-
4
- class << self
5
- def handles(*new_message_names)
6
- @message_names = (message_names + new_message_names).uniq
7
- end
8
-
9
- def message_names
10
- @message_names || []
11
- end
12
- end
13
-
14
- def can_handle?(message)
15
- self.class.message_names.include? message[:name].to_sym
16
- end
17
-
18
- def call(message)
19
- raise NotImplementedError, "You must define a call handler."
20
- end
21
-
22
- end
@@ -1,13 +0,0 @@
1
- class SuperPoller::NoneBlockingPoller < SuperPoller::Poller
2
- EmptyQueue = Class.new(Exception)
3
-
4
- def start!
5
- super
6
- rescue EmptyQueue
7
- end
8
-
9
- protected
10
- def get_message
11
- @queue.fetch or raise EmptyQueue
12
- end
13
- end
@@ -1,24 +0,0 @@
1
- class SuperPoller::Poller
2
- def initialize(queue, message_handler)
3
- @message_handler, @queue = message_handler, queue
4
- end
5
-
6
- def poll
7
- @message_handler.call(get_message)
8
- end
9
-
10
- def start!
11
- poll while true
12
- end
13
-
14
- protected
15
- def get_message
16
- @queue.pop
17
- rescue Interrupt
18
- raise
19
- rescue Object => e
20
- STDERR.puts "Error while fetching from the queue: #{e.class}: #{e.message}"
21
- sleep 10
22
- retry
23
- end
24
- end
@@ -1,30 +0,0 @@
1
- class SuperPoller::QueueItterator
2
- def initialize(queue)
3
- @queue = queue
4
- end
5
-
6
- def each(&block)
7
- @memo = {:memo => Time.now.to_f}
8
- @queue.push @memo
9
- while @memo
10
- begin
11
- break unless msg = @queue.fetch
12
- if msg == @memo
13
- msg = @memo = nil
14
- else
15
- msg = nil if :delete == block.call(msg)
16
- end
17
- ensure
18
- @queue.push msg if msg
19
- end
20
- end
21
- ensure
22
- destroy_the_memo
23
- end
24
-
25
- def destroy_the_memo
26
- while @memo and msg = @queue.fetch and msg != @memo
27
- @queue.push(msg)
28
- end
29
- end
30
- end
@@ -1,18 +0,0 @@
1
- require "uri"
2
-
3
- class SuperPoller::QueueUrl < URI::Generic
4
- def self.parse(url)
5
- url = "starling://localhost:22122/#{url}" if url =~ /^[a-zA-Z0-9_-]+$/
6
- new(*URI.parse(url).send(:component_ary))
7
- end
8
-
9
- def to_queue
10
- raise URI::InvalidURIError unless respond_to? "to_#{scheme}_queue"
11
- send("to_#{scheme}_queue")
12
- end
13
-
14
- protected
15
- def to_starling_queue
16
- SuperPoller::StarlingQueue.new(path, "#{host}:#{port}")
17
- end
18
- end
@@ -1,29 +0,0 @@
1
- class SuperPoller::Router
2
- RoutingError = Class.new(Exception)
3
-
4
- def initialize()
5
- @handlers = []
6
- end
7
-
8
- def add_handler(handler)
9
- @handlers.push handler
10
- @handlers.uniq!
11
- self
12
- end
13
-
14
- alias << add_handler
15
-
16
- def call(message)
17
- handler = best_handler_for_message(message)
18
- handler.call(message[:body])
19
- end
20
-
21
- protected
22
-
23
- def best_handler_for_message(messsage)
24
- @handlers.each do |handler|
25
- return handler if handler.can_handle? messsage
26
- end
27
- raise RoutingError, "No handler found"
28
- end
29
- end
@@ -1,20 +0,0 @@
1
- require "starling"
2
-
3
- class SuperPoller::StarlingQueue
4
- def initialize(queue_name, *args)
5
- @queue_name = queue_name.to_s
6
- @queue = Starling.new(*args)
7
- end
8
-
9
- def pop
10
- @queue.get(@queue_name)
11
- end
12
-
13
- def push(v)
14
- @queue.set(@queue_name, v)
15
- end
16
-
17
- def fetch
18
- @queue.fetch(@queue_name)
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- class SuperPoller::Handler::TestCase < (defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase)
2
-
3
- def handler
4
- @handler ||= self.class.name.gsub(/Test$/, "").constantize.new
5
- end
6
-
7
- def self.should_handle(name)
8
- should "handle a #{name.inspect} message" do
9
- assert handler.can_handle?(:name => name)
10
- end
11
- end
12
-
13
- end
data/super_poller.gemspec DELETED
@@ -1,26 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- Gem::Specification.new do |s|
4
- s.name = %q{super_poller}
5
- s.version = "0.1.0"
6
-
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Your name"]
9
- s.date = %q{2009-09-28}
10
- s.email = %q{you@example.com}
11
- s.files = ["test/aggregating_error_logger_test.rb", "test/buffered_handler_test.rb", "test/error_reporter_test.rb", "test/handler_test.rb", "test/poller_test.rb", "test/router_test.rb", "test/starling_queue_test.rb", "test/test_helper.rb", "lib/super_poller", "lib/super_poller/aggregating_error_logger.rb", "lib/super_poller/buffered_handler.rb", "lib/super_poller/error_reporter.rb", "lib/super_poller/handler.rb", "lib/super_poller/poller.rb", "lib/super_poller/router.rb", "lib/super_poller/starling_queue.rb", "lib/super_poller/test_case.rb", "lib/super_poller.rb"]
12
- s.homepage = %q{http://example.com}
13
- s.require_paths = ["lib"]
14
- s.rubygems_version = %q{1.3.5}
15
- s.summary = %q{What this thing does}
16
-
17
- if s.respond_to? :specification_version then
18
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
19
- s.specification_version = 3
20
-
21
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
22
- else
23
- end
24
- else
25
- end
26
- end