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 +1 -22
- data/test/error_reporter_test.rb +8 -0
- metadata +17 -28
- data/bin/scripts/queue_choose +0 -17
- data/bin/scripts/queue_copy +0 -4
- data/bin/scripts/queue_flush +0 -3
- data/bin/scripts/queue_grep +0 -51
- data/bin/scripts/queue_interactive_move +0 -13
- data/bin/scripts/queue_move +0 -4
- data/bin/scripts/queue_scan +0 -3
- data/lib/super_poller/aggregating_error_logger.rb +0 -33
- data/lib/super_poller/buffered_handler.rb +0 -28
- data/lib/super_poller/error_reporter.rb +0 -12
- data/lib/super_poller/handler.rb +0 -22
- data/lib/super_poller/none_blocking_poller.rb +0 -13
- data/lib/super_poller/poller.rb +0 -24
- data/lib/super_poller/queue_itterator.rb +0 -30
- data/lib/super_poller/queue_url.rb +0 -18
- data/lib/super_poller/router.rb +0 -29
- data/lib/super_poller/starling_queue.rb +0 -20
- data/lib/super_poller/test_case.rb +0 -13
- data/super_poller.gemspec +0 -26
data/Rakefile
CHANGED
@@ -10,25 +10,4 @@ Rake::TestTask.new do |t|
|
|
10
10
|
t.verbose = true
|
11
11
|
end
|
12
12
|
|
13
|
-
|
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'))){ }
|
data/test/error_reporter_test.rb
CHANGED
@@ -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
|
-
|
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:
|
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
|
-
-
|
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
|
-
-
|
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:
|
79
|
-
rubygems_version: 1.3.
|
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.
|
data/bin/scripts/queue_choose
DELETED
@@ -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!
|
data/bin/scripts/queue_copy
DELETED
data/bin/scripts/queue_flush
DELETED
data/bin/scripts/queue_grep
DELETED
@@ -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
|
data/bin/scripts/queue_move
DELETED
data/bin/scripts/queue_scan
DELETED
@@ -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
|
data/lib/super_poller/handler.rb
DELETED
@@ -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
|
data/lib/super_poller/poller.rb
DELETED
@@ -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
|
data/lib/super_poller/router.rb
DELETED
@@ -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
|