ElmerFudd 0.0.31 → 0.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab165633c5bf22a99da71cdf6e59e5c80be5c40f
4
- data.tar.gz: 8779dd799a08063b95e0d513a1a3afde5db2b9b0
3
+ metadata.gz: 1f3b594d1565a291ef8f3ea7fd8974e7f5881710
4
+ data.tar.gz: 4437ba2cf870d5a76cbee31dec91dcdc1e5541d0
5
5
  SHA512:
6
- metadata.gz: 2891a053f9cdc278e4e7b62971bfe7bc5a226067f4b019e2cb6db86954914259274eb0cb4c066be17b51a5e779417ead2a9caee57ca22a93da56d463149de9d2
7
- data.tar.gz: 1b60fdeaf5edcb5fa156d905b665782d48dae590269ee88d97b4a764025d6f9ba724e7537af16db48ca606a96b6becadfe8bda24bd846640065bd1b54ad50a48
6
+ metadata.gz: 8487db7dbd04a30b7cda67f0a923cf7f2edd1d1cfbc810409a33412bb6fbb9b999050abf791232a3716ec4fbc2aa8915acfcdcb5d63cc4c6838f507541879a6f
7
+ data.tar.gz: 21f18bace52a65eaca2f72adc4b901b15f2c6d469fdb1879bcf0be1b1f7afcffc8282393d445c68ea3634276b57b1e0c7e6db02444d3b88409c24effea85b94a
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
+ .idea
6
7
  Gemfile.lock
7
8
  InstalledFiles
8
9
  _yardoc
data/ElmerFudd.gemspec CHANGED
@@ -19,7 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "bunny", '>= 1.6.3'
22
+ spec.add_dependency "connection_pool", '>= 2.2.0'
23
+ spec.add_development_dependency "rake", "~> 10.4"
22
24
  spec.add_development_dependency "bundler", "~> 1.5"
23
- spec.add_development_dependency "rake"
24
- spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "minitest", "~> 5.7"
25
26
  end
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
-
3
2
  # Specify your gem's dependencies in ElmerFudd.gemspec
4
3
  gemspec
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Be vewwy, vewwy quiet...I'm hunting wabbits! [![Build Status](https://travis-ci.org/bonusboxme/ElmerFudd.svg)](https://travis-ci.org/bonusboxme/ElmerFudd)
1
+ # Be vewwy, vewwy quiet...I'm hunting wabbits! [![Build Status](https://travis-ci.org/bonusboxme/ElmerFudd.svg)](https://travis-ci.org/bonusboxme/ElmerFudd) ![Build status](https://circleci.com/gh/sevos/ElmerFudd.svg?style=shield&circle-token=:circle-token)
2
2
 
3
3
  ![Elmer Fudd](https://raw.githubusercontent.com/bonusboxme/ElmerFudd/master/elmer-fudd.jpg)
4
4
 
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rake/testtask'
2
3
 
3
- require 'rspec/core/rake_task'
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task :default => :spec
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ t.pattern = "test/**/*_test.rb"
7
+ end
data/circleci.yml ADDED
@@ -0,0 +1,4 @@
1
+ machine:
2
+ ruby: 2.2.0
3
+ services:
4
+ - rabbitmq-server
data/lib/ElmerFudd.rb CHANGED
@@ -19,9 +19,11 @@ module ElmerFudd
19
19
 
20
20
  require 'ElmerFudd/active_record_connection_pool_filter'
21
21
  require 'ElmerFudd/airbrake_filter'
22
+ require 'ElmerFudd/exception_notification_filter'
22
23
  require 'ElmerFudd/discard_return_value_filter'
23
24
  require 'ElmerFudd/drop_failed_filter'
24
25
  require 'ElmerFudd/json_filter'
25
26
  require 'ElmerFudd/redirect_failed_filter'
26
27
  require 'ElmerFudd/retry_filter'
28
+ require 'ElmerFudd/benchmark_filter'
27
29
  end
@@ -0,0 +1,38 @@
1
+ require 'benchmark'
2
+
3
+ module ElmerFudd
4
+ class BenchmarkFilter
5
+ include Filter
6
+
7
+ def initialize(printer: method(:default_printer),
8
+ benchmark: Benchmark)
9
+ @printer = printer
10
+ @benchmark = benchmark
11
+ end
12
+
13
+ def call(env, message, filters)
14
+ result = nil
15
+ exception = nil
16
+
17
+ bm = @benchmark.measure do
18
+ begin
19
+ result = call_next(env, message, filters)
20
+ rescue Exception => e
21
+ exception = e
22
+ end
23
+ end
24
+ @printer.call(bm, exception, message.route, env.logger)
25
+ exception.nil? ? result : raise(exception)
26
+ end
27
+
28
+ private
29
+
30
+ def default_printer(bm, exception, route, logger)
31
+ if exception.nil?
32
+ logger.info "ElmerFudd::Benchmark Queue: #{route.queue_name} | Success | Total CPU: #{bm.total} | Wall time: #{bm.real}"
33
+ else
34
+ logger.info "ElmerFudd::Benchmark Queue: #{route.queue_name} | Exception: #{exception.class.name} | Total CPU: #{bm.total} | Wall time: #{bm.real}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -32,7 +32,7 @@ module ElmerFudd
32
32
  end
33
33
 
34
34
  def call(env, message)
35
- env.logger.debug "ElmerFudd DirectHandler.call queue_name: #{@route.queue_name}, exchange_name: #{@route.exchange_name}, filters: #{filters_names}, message: #{message.payload}"
35
+ env.logger.debug "ElmerFudd #{self.class.name}.call (#{object_id}) queue_name: #{@route.queue_name}, exchange_name: #{@route.exchange_name}, filters: #{filters_names}, message: #{message.payload}"
36
36
  call_next(env, message, @filters + [@callback])
37
37
  end
38
38
 
@@ -0,0 +1,17 @@
1
+ module ElmerFudd
2
+ class ExceptionNotificationFilter
3
+ extend Filter
4
+ def self.call(env, message, filters)
5
+ call_next(env, message, filters)
6
+ rescue Exception => e
7
+ ExceptionNotifier.notify_exception(e, data: {
8
+ payload: message.payload,
9
+ queue: message.route.queue_name,
10
+ exchange_name: message.route.exchange_name,
11
+ routing_key: message.delivery_info.routing_key,
12
+ matched_routing_key: message.route.routing_keys
13
+ })
14
+ raise
15
+ end
16
+ end
17
+ end
@@ -1,49 +1,84 @@
1
+ require 'connection_pool'
2
+
1
3
  module ElmerFudd
2
4
  class Publisher
3
- def initialize(connection, uuid_service: -> { rand.to_s }, logger: Logger.new($stdout))
5
+ class Exchange
6
+ def initialize(connection)
7
+ @channel = connection.create_channel
8
+ @reply_channel = connection.create_channel
9
+ @direct = @channel.default_exchange
10
+ @topic_x = {}
11
+ end
12
+
13
+ attr_reader :direct
14
+
15
+ def rpc_reply_queue
16
+ @rpc_reply_queue ||= @reply_channel.queue("", exclusive: true)
17
+ end
18
+
19
+ def cancel_reply_consumer(consumer_tag)
20
+ @reply_channel.consumers[consumer_tag].cancel
21
+ end
22
+
23
+ def topic(name)
24
+ @topic_x[name] ||= @channel.topic(name)
25
+ end
26
+ end
27
+
28
+ def initialize(connection, uuid_service: -> { rand.to_s }, logger: Logger.new($stdout),
29
+ max_threads: 4)
4
30
  @connection = connection
5
31
  @logger = logger
6
32
  @uuid_service = uuid_service
7
- @topic_x = {}
33
+ @exchange = ConnectionPool.new(size: max_threads, timeout: 3) do
34
+ Exchange.new(connection)
35
+ end
8
36
  end
9
37
 
10
38
  def notify(topic_exchange, routing_key, payload)
11
- @logger.debug "ElmerFudd: NOTIFY - topic_exchange: #{topic_exchange}, routing_key: #{routing_key}, payload: #{payload}"
12
- @topic_x[topic_exchange] ||= channel.topic(topic_exchange)
13
- @topic_x[topic_exchange].publish payload.to_s, routing_key: routing_key
39
+ @exchange.with do |exchange|
40
+ @logger.debug "ElmerFudd: NOTIFY - topic_exchange: #{topic_exchange}, routing_key: #{routing_key}, payload: #{payload}"
41
+ exchange.topic(topic_exchange).publish payload.to_s, routing_key: routing_key
42
+ end
14
43
  nil
15
44
  end
16
45
 
17
46
  def cast(queue_name, payload)
18
- @logger.debug "ElmerFudd: CAST - queue_name: #{queue_name}, payload: #{payload}"
19
- x.publish(payload.to_s, routing_key: queue_name)
47
+ @exchange.with do |exchange|
48
+ @logger.debug "ElmerFudd: CAST - queue_name: #{queue_name}, payload: #{payload}"
49
+ exchange.direct.publish(payload.to_s, routing_key: queue_name)
50
+ end
20
51
  nil
21
52
  end
22
53
 
23
54
  def call(queue_name, payload, timeout: 10)
24
- @logger.debug "ElmerFudd: CALL - queue_name: #{queue_name}, payload: #{payload}, timeout: #{timeout}"
25
- mutex = Mutex.new
26
- resource = ConditionVariable.new
27
- correlation_id = @uuid_service.call
28
- consumer_tag = @uuid_service.call
29
- response = nil
55
+ @exchange.with do |exchange|
56
+ begin
57
+ @logger.debug "ElmerFudd: CALL - queue_name: #{queue_name}, payload: #{payload}, timeout: #{timeout}"
58
+ mutex = Mutex.new
59
+ resource = ConditionVariable.new
60
+ correlation_id = @uuid_service.call
61
+ consumer_tag = @uuid_service.call
62
+ response = nil
30
63
 
31
- Timeout.timeout(timeout) do
32
- rpc_reply_queue.subscribe(manual_ack: false, block: false, consumer_tag: consumer_tag) do |delivery_info, properties, payload|
33
- if properties[:correlation_id] == correlation_id
34
- response = payload
35
- mutex.synchronize { resource.signal }
36
- end
37
- end
64
+ Timeout.timeout(timeout) do
65
+ exchange.rpc_reply_queue.subscribe(manual_ack: false, block: false, consumer_tag: consumer_tag) do |delivery_info, properties, payload|
66
+ if properties[:correlation_id] == correlation_id
67
+ response = payload
68
+ mutex.synchronize { resource.signal }
69
+ end
70
+ end
38
71
 
39
- x.publish(payload.to_s, routing_key: queue_name, reply_to: rpc_reply_queue.name,
40
- correlation_id: correlation_id)
72
+ exchange.direct.publish(payload.to_s, routing_key: queue_name, reply_to: exchange.rpc_reply_queue.name,
73
+ correlation_id: correlation_id)
41
74
 
42
- mutex.synchronize { resource.wait(mutex) unless response }
43
- response
75
+ mutex.synchronize { resource.wait(mutex) unless response }
76
+ response
77
+ end
78
+ ensure
79
+ exchange.cancel_reply_consumer(consumer_tag)
80
+ end
44
81
  end
45
- ensure
46
- reply_channel.consumers[consumer_tag].cancel
47
82
  end
48
83
 
49
84
  private
@@ -53,21 +88,5 @@ module ElmerFudd
53
88
  c.start unless c.connected?
54
89
  end
55
90
  end
56
-
57
- def x
58
- @x ||= channel.default_exchange
59
- end
60
-
61
- def channel
62
- @channel ||= connection.create_channel
63
- end
64
-
65
- def reply_channel
66
- @reply_channel ||= connection.create_channel
67
- end
68
-
69
- def rpc_reply_queue
70
- @rpc_reply_queue ||= reply_channel.queue("", exclusive: true)
71
- end
72
91
  end
73
92
  end
@@ -1,3 +1,3 @@
1
1
  module ElmerFudd
2
- VERSION = "0.0.31"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+
3
+ class CallTest < MiniTest::Test
4
+ include RabbitHelper
5
+ TEST_QUEUE = "test.ElmerFudd.call"
6
+
7
+ class TestWorker < ElmerFudd::Worker
8
+ default_filters ElmerFudd::JsonFilter
9
+
10
+ handle_call(Route(TEST_QUEUE)) do |_env, message|
11
+ raise "unexpected error" if message.payload["raise"]
12
+ if delay = message.payload["delay"]
13
+ sleep delay
14
+ end
15
+
16
+ message.payload["message"]
17
+ end
18
+ end
19
+
20
+ def setup
21
+ super
22
+ start_worker TestWorker
23
+ end
24
+
25
+ def teardown
26
+ remove_queue TEST_QUEUE
27
+ super
28
+ end
29
+
30
+ def test_call_returns_the_value_from_worker
31
+ assert_equal({"result" => "hello"},
32
+ @publisher.call(TEST_QUEUE, message: "hello"))
33
+ end
34
+
35
+ def test_call_timeouts_if_worker_time_outs
36
+ response = nil
37
+ assert_raises Timeout::Error do
38
+ # The default timeout is different and greater than 0
39
+ response = @publisher.call(TEST_QUEUE, {message: "hello", delay: 2},
40
+ timeout: 0.5)
41
+ assert_nil response
42
+ end
43
+ end
44
+
45
+ def test_call_timeouts_if_worker_crashes
46
+ response = nil
47
+ assert_raises Timeout::Error do
48
+ # The default timeout is different and greater than 0
49
+ response = @publisher.call(TEST_QUEUE, {message: "hello", raise: true},
50
+ timeout: 0.5)
51
+ assert_nil response
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,80 @@
1
+ require 'test_helper'
2
+
3
+ class CastTest < MiniTest::Test
4
+ include RabbitHelper
5
+ TEST_QUEUE = "test.ElmerFudd.cast"
6
+
7
+ class TestWorker < ElmerFudd::Worker
8
+ default_filters ElmerFudd::JsonFilter
9
+
10
+ handle_cast(Route(TEST_QUEUE)) do |_env, message|
11
+ raise "unexpected error" if message.payload["raise"]
12
+ if delay = message.payload["delay"]
13
+ sleep delay
14
+ end
15
+
16
+ $responses << message.payload["message"]
17
+ end
18
+ end
19
+
20
+ def teardown
21
+ remove_queue TEST_QUEUE
22
+ super
23
+ end
24
+
25
+ def test_basic_cast
26
+ start_worker TestWorker
27
+ @publisher.cast TEST_QUEUE, message: "hello"
28
+
29
+ Timeout.timeout(0.5) do
30
+ assert "hello", $responses.pop
31
+ end
32
+ end
33
+
34
+ def test_basic_cast_blocks_worker_if_unexpected_exception_occurs
35
+ start_worker TestWorker
36
+ @publisher.cast TEST_QUEUE, message: "hello", raise: true
37
+ @publisher.cast TEST_QUEUE, message: "hello"
38
+
39
+ assert_always { $responses.empty? }
40
+ end
41
+
42
+ def test_workers_continues_if_concurency_greater_than_1
43
+ start_worker TestWorker, concurrency: 2
44
+ @publisher.cast TEST_QUEUE, message: "hello", raise: true
45
+ @publisher.cast TEST_QUEUE, message: "hello2"
46
+
47
+ Timeout.timeout(0.5) do
48
+ assert "hello2", $responses.pop
49
+ end
50
+ end
51
+
52
+ def test_work_in_parallel_if_concurrency_greater_than_1
53
+ skip "TODO: investigate why it fails"
54
+ start_worker TestWorker, concurrency: 2
55
+ @publisher.cast TEST_QUEUE, message: "hello", delay: 0.5
56
+ @publisher.cast TEST_QUEUE, message: "hello2", delay: 0.5
57
+
58
+ result = []
59
+ Timeout.timeout(1) do
60
+ 2.times { result << $responses.pop }
61
+ end rescue Timeout::Error fail "jobs did not execute in parallel"
62
+
63
+ assert_equal %w(hello hello2), result.sort
64
+ end
65
+
66
+ def test_multiple_workers_on_same_connection_work_in_parallel
67
+ start_worker TestWorker, connection: (conn = get_new_connection)
68
+ start_worker TestWorker, connection: conn
69
+
70
+ @publisher.cast TEST_QUEUE, message: "hello", delay: 0.5
71
+ @publisher.cast TEST_QUEUE, message: "hello2", delay: 0.5
72
+
73
+ result = []
74
+ Timeout.timeout(1) do
75
+ 2.times { result << $responses.pop }
76
+ end rescue Timeout::Error fail "jobs did not execute in parallel"
77
+
78
+ assert_equal %w(hello hello2), result.sort
79
+ end
80
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ class EventTest < MiniTest::Test
4
+ include RabbitHelper
5
+ TEST_QUEUE_1 = "test.ElmerFudd.event.all"
6
+ TEST_QUEUE_2 = "test.ElmerFudd.event.high_prio"
7
+ TEST_QUEUE_3 = "test.ElmerFudd.event.another"
8
+
9
+ class TestWorker < ElmerFudd::Worker
10
+ default_filters ElmerFudd::JsonFilter
11
+
12
+ handle_event(Route(TEST_QUEUE_1, "x_topic" => "event.#")) do |_env, message|
13
+ $responses.push message.payload["message"]
14
+ end
15
+
16
+ handle_event(Route(TEST_QUEUE_2, "x_topic" => "event.high.*")) do |_env, message|
17
+ $high_prio_responses.push message.payload["message"]
18
+ end
19
+
20
+ handle_event(Route(TEST_QUEUE_3, "x_topic" => ["multi-event.one", "multi-event.two"])) do |_env, message|
21
+ $responses.push message.payload["message"]
22
+ end
23
+ end
24
+
25
+ def setup
26
+ super
27
+ $high_prio_responses = Queue.new
28
+ start_worker TestWorker
29
+ end
30
+
31
+ def teardown
32
+ get_new_connection.channel.topic("x_topic").delete
33
+ remove_queue TEST_QUEUE_1
34
+ remove_queue TEST_QUEUE_2
35
+ remove_queue TEST_QUEUE_3
36
+ super
37
+ end
38
+
39
+ def test_notify_matches_event_name
40
+ @publisher.notify "x_topic", "event.some_event", message: "hello"
41
+
42
+ Timeout.timeout(0.5) { assert_equal "hello", $responses.pop }
43
+ assert_always { $high_prio_responses.empty? }
44
+ end
45
+
46
+ def test_message_can_match_multiple_queues
47
+ @publisher.notify "x_topic", "event.high.some_event", message: "hello2"
48
+
49
+ Timeout.timeout(0.5) { assert_equal "hello2", $responses.pop }
50
+ Timeout.timeout(0.5) { assert_equal "hello2", $high_prio_responses.pop }
51
+ assert_always { $responses.empty? }
52
+ assert_always { $high_prio_responses.empty? }
53
+ end
54
+
55
+ def test_listening_on_many_events_does_not_deliver_twice
56
+ @publisher.notify "x_topic", "multi-event.two", message: "foo"
57
+ Timeout.timeout(0.5) { assert_equal "foo", $responses.pop }
58
+ assert_always { $responses.empty? }
59
+ assert_always { $high_prio_responses.empty? }
60
+ end
61
+ end
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+
3
+ class ExternalHandlersTest < MiniTest::Test
4
+ include RabbitHelper
5
+ TEST_QUEUE = "test.ElmerFudd.cast"
6
+
7
+ module Handler
8
+ extend self
9
+ def call(_env, message)
10
+ run(text: message.payload["text"])
11
+ end
12
+
13
+ def run(text:, **_ignore_rest_of_the_payload)
14
+ $responses.push text
15
+ end
16
+ end
17
+
18
+ class TestWorker1 < ElmerFudd::Worker
19
+ default_filters ElmerFudd::JsonFilter
20
+ handle_cast(Route(TEST_QUEUE), handler: Handler)
21
+ end
22
+
23
+ class TestWorker2 < ElmerFudd::Worker
24
+ default_filters ElmerFudd::JsonFilter
25
+ handle_cast(Route(TEST_QUEUE),
26
+ handler: payload_as_kwargs(Handler.method(:run)))
27
+ end
28
+
29
+ def teardown
30
+ remove_queue TEST_QUEUE
31
+ super
32
+ end
33
+
34
+ def test_external_handler
35
+ start_worker TestWorker1
36
+ @publisher.cast TEST_QUEUE, text: "hello"
37
+
38
+ Timeout.timeout(0.5) do
39
+ assert "hello", $responses.pop
40
+ end
41
+ end
42
+
43
+ def test_payload_as_kwargs
44
+ start_worker TestWorker2
45
+ @publisher.cast TEST_QUEUE, text: "hello", ignored_param: true
46
+
47
+ Timeout.timeout(0.5) do
48
+ assert "hello", $responses.pop
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,65 @@
1
+ require 'ElmerFudd'
2
+ require 'minitest'
3
+ require 'minitest/unit'
4
+ require 'minitest/autorun'
5
+ require 'minitest/pride'
6
+
7
+ class NullLoger < Logger
8
+ def initialize(*args)
9
+ end
10
+
11
+ def add(*args, &block)
12
+ end
13
+ end
14
+
15
+ module RabbitHelper
16
+ def setup
17
+ super
18
+ @publisher = ElmerFudd::JsonPublisher.new(get_new_connection, logger: NullLoger.new)
19
+ $responses = Queue.new
20
+ end
21
+
22
+ def teardown
23
+ sleep 0.1
24
+ rabbit_close_connections
25
+ super
26
+ end
27
+
28
+ def rabbitmq_url
29
+ ENV.fetch('RABBITMQ_URL', 'amqp://localhost:5672')
30
+ end
31
+
32
+ def get_new_connection(url: rabbitmq_url, auto_start: true)
33
+ Bunny.new(url, logger: NullLoger.new).tap do |connection|
34
+ connection.start if auto_start
35
+ (@rabbit_connections ||= []) << connection
36
+ end
37
+ end
38
+
39
+ def remove_queue(queue_name)
40
+ conn = get_new_connection
41
+ channel = conn.channel
42
+ channel.queue(queue_name).delete
43
+ rescue Bunny::PreconditionFailed
44
+ channel = conn.channel
45
+ channel.queue(queue_name, durable: true).delete
46
+ end
47
+
48
+ def rabbit_close_connections
49
+ if @rabbit_connections
50
+ @rabbit_connections.each(&:close)
51
+ @rabbit_connections.clear
52
+ end
53
+ end
54
+
55
+ def start_worker(worker_class, concurrency: 1, connection: get_new_connection)
56
+ worker_class.new(connection, concurrency: concurrency,
57
+ logger: NullLoger.new).tap(&:start)
58
+ end
59
+ end
60
+
61
+ def assert_always(timeout = 0.5, &condition)
62
+ Timeout.timeout(timeout) do
63
+ loop { assert condition.call; sleep timeout / 10.0 }
64
+ end rescue Timeout::Error
65
+ end
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+
3
+ class BenchmarkFilterTest < MiniTest::Test
4
+ class FakeLogger
5
+ attr_reader :logs
6
+
7
+ def initialize
8
+ @logs = Hash.new { |h, key| h[key] = [] }
9
+ end
10
+
11
+ def method_missing(log_level, message)
12
+ @logs[log_level.to_sym] << message
13
+ end
14
+ end
15
+
16
+ def bm_filter(**kwargs)
17
+ ElmerFudd::BenchmarkFilter.new(**kwargs)
18
+ end
19
+
20
+ def env
21
+ Struct.new(:logger).new(@logger)
22
+ end
23
+
24
+ def setup
25
+ @logger = FakeLogger.new
26
+ end
27
+
28
+ def test_measures_time_of_the_block
29
+ message = OpenStruct.new(route: OpenStruct.new(queue_name: "foo"))
30
+ ElmerFudd::BenchmarkFilter.new.call(env, message, [->(*){ sleep 1 }])
31
+ log_entry = @logger.logs[:info].first
32
+ assert_match /Queue: foo/, log_entry
33
+ assert_match /Wall time: 1\.\d+/, log_entry
34
+ end
35
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ElmerFudd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.31
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrzej Sliwa
@@ -9,64 +9,78 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-29 00:00:00.000000000 Z
12
+ date: 2016-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bunny
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: 1.6.3
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: 1.6.3
28
28
  - !ruby/object:Gem::Dependency
29
- name: bundler
29
+ name: connection_pool
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '1.5'
35
- type: :development
34
+ version: 2.2.0
35
+ type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '1.5'
41
+ version: 2.2.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rake
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
48
+ version: '10.4'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '0'
55
+ version: '10.4'
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.5'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.5'
56
70
  - !ruby/object:Gem::Dependency
57
- name: rspec
71
+ name: minitest
58
72
  requirement: !ruby/object:Gem::Requirement
59
73
  requirements:
60
- - - '>='
74
+ - - "~>"
61
75
  - !ruby/object:Gem::Version
62
- version: '0'
76
+ version: '5.7'
63
77
  type: :development
64
78
  prerelease: false
65
79
  version_requirements: !ruby/object:Gem::Requirement
66
80
  requirements:
67
- - - '>='
81
+ - - "~>"
68
82
  - !ruby/object:Gem::Version
69
- version: '0'
83
+ version: '5.7'
70
84
  description: Be vewwy, vewwy quiet...I'm hunting wabbits!
71
85
  email:
72
86
  - andrzej.sliwa@i-tool.eu
@@ -75,22 +89,23 @@ executables: []
75
89
  extensions: []
76
90
  extra_rdoc_files: []
77
91
  files:
78
- - .gitignore
79
- - .rspec
80
- - .ruby-gemset
81
- - .ruby-version
92
+ - ".gitignore"
93
+ - ".rspec"
82
94
  - ElmerFudd.gemspec
83
95
  - Gemfile
84
96
  - LICENSE.txt
85
97
  - README.md
86
98
  - Rakefile
99
+ - circleci.yml
87
100
  - elmer-fudd.jpg
88
101
  - lib/ElmerFudd.rb
89
102
  - lib/ElmerFudd/active_record_connection_pool_filter.rb
90
103
  - lib/ElmerFudd/airbrake_filter.rb
104
+ - lib/ElmerFudd/benchmark_filter.rb
91
105
  - lib/ElmerFudd/direct_handler.rb
92
106
  - lib/ElmerFudd/discard_return_value_filter.rb
93
107
  - lib/ElmerFudd/drop_failed_filter.rb
108
+ - lib/ElmerFudd/exception_notification_filter.rb
94
109
  - lib/ElmerFudd/filter.rb
95
110
  - lib/ElmerFudd/json_filter.rb
96
111
  - lib/ElmerFudd/json_publisher.rb
@@ -102,7 +117,12 @@ files:
102
117
  - lib/ElmerFudd/topic_handler.rb
103
118
  - lib/ElmerFudd/version.rb
104
119
  - lib/ElmerFudd/worker.rb
105
- - spec/spec_helper.rb
120
+ - test/smoke/call_test.rb
121
+ - test/smoke/cast_test.rb
122
+ - test/smoke/event_test.rb
123
+ - test/smoke/external_handlers_test.rb
124
+ - test/test_helper.rb
125
+ - test/unit/benchmark_filter_test.rb
106
126
  homepage: https://github.com/bonusboxme/ElmerFudd
107
127
  licenses:
108
128
  - MIT
@@ -113,19 +133,24 @@ require_paths:
113
133
  - lib
114
134
  required_ruby_version: !ruby/object:Gem::Requirement
115
135
  requirements:
116
- - - '>='
136
+ - - ">="
117
137
  - !ruby/object:Gem::Version
118
138
  version: '0'
119
139
  required_rubygems_version: !ruby/object:Gem::Requirement
120
140
  requirements:
121
- - - '>='
141
+ - - ">="
122
142
  - !ruby/object:Gem::Version
123
143
  version: '0'
124
144
  requirements: []
125
145
  rubyforge_project:
126
- rubygems_version: 2.4.6
146
+ rubygems_version: 2.4.8
127
147
  signing_key:
128
148
  specification_version: 4
129
149
  summary: RabbitMQ in OTP way
130
150
  test_files:
131
- - spec/spec_helper.rb
151
+ - test/smoke/call_test.rb
152
+ - test/smoke/cast_test.rb
153
+ - test/smoke/event_test.rb
154
+ - test/smoke/external_handlers_test.rb
155
+ - test/test_helper.rb
156
+ - test/unit/benchmark_filter_test.rb
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- ElmerFudd
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.0.0
data/spec/spec_helper.rb DELETED
@@ -1,17 +0,0 @@
1
- # This file was generated by the `rspec --init` command. Conventionally, all
2
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
- # Require this file using `require "spec_helper"` to ensure that it is only
4
- # loaded once.
5
- #
6
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
- RSpec.configure do |config|
8
- config.treat_symbols_as_metadata_keys_with_true_values = true
9
- config.run_all_when_everything_filtered = true
10
- config.filter_run :focus
11
-
12
- # Run specs in random order to surface order dependencies. If you find an
13
- # order dependency and want to debug it, you can fix the order by providing
14
- # the seed, which is printed after each run.
15
- # --seed 1234
16
- config.order = 'random'
17
- end