basquiat 1.3.0.pre.1 → 1.3.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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/Guardfile +8 -7
  4. data/README.md +4 -2
  5. data/Rakefile +2 -0
  6. data/basquiat.gemspec +5 -5
  7. data/lib/basquiat/adapters/base_adapter.rb +10 -9
  8. data/lib/basquiat/adapters/base_message.rb +1 -0
  9. data/lib/basquiat/adapters/rabbitmq/configuration.rb +14 -13
  10. data/lib/basquiat/adapters/rabbitmq/connection.rb +7 -4
  11. data/lib/basquiat/adapters/rabbitmq/events.rb +3 -4
  12. data/lib/basquiat/adapters/rabbitmq/message.rb +6 -1
  13. data/lib/basquiat/adapters/rabbitmq/requeue_strategies/auto_acknowledge.rb +1 -0
  14. data/lib/basquiat/adapters/rabbitmq/requeue_strategies/base_strategy.rb +2 -1
  15. data/lib/basquiat/adapters/rabbitmq/requeue_strategies/basic_acknowledge.rb +1 -0
  16. data/lib/basquiat/adapters/rabbitmq/requeue_strategies/dead_lettering.rb +2 -3
  17. data/lib/basquiat/adapters/rabbitmq/requeue_strategies/delayed_delivery.rb +24 -25
  18. data/lib/basquiat/adapters/rabbitmq/requeue_strategies.rb +1 -0
  19. data/lib/basquiat/adapters/rabbitmq/session.rb +6 -0
  20. data/lib/basquiat/adapters/rabbitmq_adapter.rb +2 -1
  21. data/lib/basquiat/adapters/test_adapter.rb +1 -0
  22. data/lib/basquiat/adapters.rb +1 -0
  23. data/lib/basquiat/errors/strategy_not_registered.rb +1 -0
  24. data/lib/basquiat/errors/subclass_responsibility.rb +1 -3
  25. data/lib/basquiat/errors.rb +1 -0
  26. data/lib/basquiat/interfaces/base.rb +7 -1
  27. data/lib/basquiat/rails/railtie.rb +1 -0
  28. data/lib/basquiat/support/configuration.rb +3 -2
  29. data/lib/basquiat/support/hash_refinements.rb +1 -0
  30. data/lib/basquiat/support/json.rb +1 -0
  31. data/lib/basquiat/support.rb +1 -0
  32. data/lib/basquiat/version.rb +2 -1
  33. data/lib/basquiat.rb +2 -1
  34. data/spec/lib/adapters/base_adapter_spec.rb +1 -0
  35. data/spec/lib/adapters/base_message_spec.rb +1 -0
  36. data/spec/lib/adapters/rabbitmq/configuration_spec.rb +1 -0
  37. data/spec/lib/adapters/rabbitmq/connection_spec.rb +1 -0
  38. data/spec/lib/adapters/rabbitmq/events_spec.rb +1 -0
  39. data/spec/lib/adapters/rabbitmq/message_spec.rb +1 -0
  40. data/spec/lib/adapters/rabbitmq/requeue_strategies/auto_acknowledge_spec.rb +1 -0
  41. data/spec/lib/adapters/rabbitmq/requeue_strategies/base_strategy_spec.rb +11 -0
  42. data/spec/lib/adapters/rabbitmq/requeue_strategies/basic_acknowledge_spec.rb +12 -5
  43. data/spec/lib/adapters/rabbitmq/requeue_strategies/dead_lettering_spec.rb +15 -12
  44. data/spec/lib/adapters/rabbitmq/requeue_strategies/delayed_delivery_spec.rb +7 -8
  45. data/spec/lib/adapters/rabbitmq_adapter_spec.rb +4 -3
  46. data/spec/lib/adapters/test_adapter_spec.rb +1 -0
  47. data/spec/lib/basquiat_spec.rb +1 -0
  48. data/spec/lib/interfaces/base_spec.rb +1 -0
  49. data/spec/lib/support/configuration_spec.rb +1 -0
  50. data/spec/lib/support/hash_refinements_spec.rb +1 -0
  51. data/spec/lib/support/json_spec.rb +1 -0
  52. data/spec/spec_helper.rb +3 -0
  53. data/spec/support/rabbitmq_queue_matchers.rb +1 -0
  54. data/spec/support/shared_examples/basquiat_adapter_shared_examples.rb +2 -1
  55. metadata +7 -17
  56. data/.codeclimate.yml +0 -50
  57. data/.gitignore +0 -23
  58. data/.metrics +0 -6
  59. data/.reek +0 -2
  60. data/.rspec +0 -5
  61. data/.rubocop.yml +0 -14
  62. data/.ruby-gemset +0 -1
  63. data/.ruby-version +0 -1
  64. data/basquiat_docker.sh +0 -35
  65. data/docker/Dockerfile +0 -15
  66. data/docker/guard_start.sh +0 -3
  67. data/docker-compose.yml +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e62fb7f48142250951c4e6c7d471fe3bbff47f4
4
- data.tar.gz: 044bfbfdeeeec35150d679eae3425db38ab3699e
3
+ metadata.gz: f2fd0255f1924260c2253d4b0ffe3bd5434184cc
4
+ data.tar.gz: 1db61ca0abc893884328a3de429ad0a9a7007578
5
5
  SHA512:
6
- metadata.gz: fd73d055c57de8b20fd623876d270d18ddd8f0f8fd29443e76610dbd00c30dc5011010e49b1c3fa0f21a457a43a4a74f49ecdbe35db04e0b3bf9c759b743e545
7
- data.tar.gz: e8e3af0254e4693d759defe4724f02bb4a6408c98df126303b214f491023fce078c57308967dbf37c72ded09d4eacb569b6d08cc3fc6db068e05cf55f04988dc
6
+ metadata.gz: a4755306fa1d78f6aab9e05c4504fa333c508aecafaab2784afcf64d847ae1c56d1e7f4f6c81b94e3cbfa8ca145ddbd5098dcf2cc38a466feba1e64c4dc4ce15
7
+ data.tar.gz: d41074fe39816491a4eba28241e928b60186d38154a04d2c0a5efbec747b16caa90957c12e5baca3d85977f373c55efcbfa03cbcb4515c52c7b257fa6ac29d74
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  # Specify your gem's dependencies in basquiat.gemspec
data/Guardfile CHANGED
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  guard :bundler do
2
3
  watch('Gemfile')
3
4
  watch('basquiat.gemspec')
4
5
  end
5
6
 
6
- guard :rspec, { cmd: 'bundle exec rspec', all_on_start: true,
7
- keep: true, all_after_pass: true, run_all: { cmd: 'rspec -f progress' } } do
7
+ guard :rspec, cmd: 'bundle exec rspec', all_on_start: true,
8
+ keep: true, all_after_pass: true, run_all: { cmd: 'rspec -f progress' } do
8
9
  watch(%r{^spec/.+_spec.rb$})
9
10
  watch(%r{^spec/lib/.+_spec.rb$})
10
11
  watch(%r{^lib/basquiat/(.+)\.rb$}) { |matchdata| "spec/lib/#{matchdata[1]}_spec.rb" }
@@ -12,11 +13,11 @@ guard :rspec, { cmd: 'bundle exec rspec', all_on_start: true,
12
13
  watch(%r{spec/support/.+\.rb}) { 'spec' }
13
14
  end
14
15
 
15
- guard :rubocop, { cmd: 'rubocop', cli: '-fs -c./.rubocop.yml' } do
16
- #watch(%r{.+\.rb$})
17
- #watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
16
+ guard :rubocop, cmd: 'rubocop', cli: '-fs -c./.rubocop.yml' do
17
+ # watch(%r{.+\.rb$})
18
+ # watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
18
19
  end
19
20
 
20
- guard 'yard', { cli: '-r' } do
21
- watch(%r{lib/.+\.rb})
21
+ guard 'yard', cli: '-r' do
22
+ watch %r{lib/.+\.rb}
22
23
  end
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Basquiat
2
2
 
3
- [![Code Climate](https://codeclimate.com/github/VAGAScom/basquiat/badges/gpa.svg)](https://codeclimate.com/github/VAGAScom/basquiat)
3
+ [![Issue Count](https://codeclimate.com/github/VAGAScom/basquiat/badges/issue_count.svg)](https://codeclimate.com/github/VAGAScom/basquiat)
4
+ [![Test Coverage](https://codeclimate.com/github/VAGAScom/basquiat/badges/coverage.svg)](https://codeclimate.com/github/VAGAScom/basquiat/coverage)
4
5
 
5
6
  **Basquiat** is library aimed to hide (almost) all the complexity when working with some kind of message queue from the application internals.
6
7
 
@@ -106,7 +107,8 @@ development: #full example of the RabbitMq option
106
107
  password: 'guest'
107
108
  requeue:
108
109
  enabled: true
109
- delayed_delivery:
110
+ strategy: delayed_delivery
111
+ options:
110
112
  retries: 10
111
113
  queue_name_preffix: wait.for_it
112
114
  exchange_name: legendary
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
  require 'rubocop/rake_task'
data/basquiat.gemspec CHANGED
@@ -1,4 +1,5 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'basquiat/version'
@@ -15,9 +16,9 @@ EOD
15
16
  spec.homepage = 'http://github.com/VAGAScom/basquiat'
16
17
  spec.license = 'MIT'
17
18
 
18
- spec.files = `git ls-files`.split($RS)
19
- spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
20
- spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
+ spec.files = `git ls-files`.split($RS).reject { |f| f =~ /^\.|docker/ }
20
+ spec.executables = spec.files.grep(%r{/^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
22
  spec.require_paths = %w(lib)
22
23
 
23
24
  spec.add_development_dependency 'bundler'
@@ -36,7 +37,6 @@ EOD
36
37
  spec.add_development_dependency 'codeclimate-test-reporter'
37
38
  spec.add_development_dependency 'yard'
38
39
 
39
-
40
40
  spec.add_dependency 'multi_json'
41
41
  spec.add_dependency 'naught'
42
42
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  require 'delegate'
2
3
  require 'basquiat/adapters/base_message'
3
4
 
4
5
  module Basquiat
5
6
  module Adapters
6
- # Base implementation for an adapter
7
+ # Base implementation for an adapter in uses {HashRefinements} internally.
7
8
  class Base
8
9
  using Basquiat::HashRefinements
9
10
 
@@ -21,9 +22,9 @@ module Basquiat
21
22
  strategies[config_name.to_sym] = klass
22
23
  end
23
24
 
24
- # Return the Strategy Class registered on key
25
+ # Return the Strategy Class registered on given key
25
26
  # @param key [#to_sym] configured key for the wanted strategy
26
- # @return [Class] return the strategy class
27
+ # @return [Class] the strategy class
27
28
  # @raise [Errors::StrategyNotRegistered] if it fails to find the key
28
29
  def strategy(key)
29
30
  strategies.fetch(key)
@@ -32,7 +33,7 @@ module Basquiat
32
33
  end
33
34
  end
34
35
 
35
- # @param procs: [Object]
36
+ # @param procs [Object]
36
37
  # It's a hash by default, but usually will be superseded by the adapter implementation
37
38
  def initialize(procs: {})
38
39
  @options = base_options
@@ -61,8 +62,9 @@ module Basquiat
61
62
  end
62
63
 
63
64
  # The default adapter options, merged with the {Basquiat::Configuration#adapter_options}. Used internally.
64
- # @todo rename this method
65
+ # @api private
65
66
  # @return [Hash] the full options hash
67
+ # @todo rename this method
66
68
  def base_options
67
69
  default_options.merge(Basquiat.configuration.adapter_options)
68
70
  end
@@ -76,19 +78,18 @@ module Basquiat
76
78
  # @!group Adapter specific implementations
77
79
  # @abstract Publish an event to the event stream
78
80
  def publish
79
- fail Basquiat::Errors::SubclassResponsibility
81
+ raise Basquiat::Errors::SubclassResponsibility
80
82
  end
81
83
 
82
84
  # @abstract subscribe_to the event stream
83
85
  def subscribe_to
84
- fail Basquiat::Errors::SubclassResponsibility
86
+ raise Basquiat::Errors::SubclassResponsibility
85
87
  end
86
88
 
87
89
  # @abstract Disconnect from the message queue
88
90
  def disconnect
89
- fail Basquiat::Errors::SubclassResponsibility
91
+ raise Basquiat::Errors::SubclassResponsibility
90
92
  end
91
-
92
93
  # @!endgroup
93
94
 
94
95
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  # The simplest Message class. It's encouraged to tailor it to your adapter needs (hence BaseMessage).
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
@@ -7,21 +8,21 @@ module Basquiat
7
8
 
8
9
  def initialize
9
10
  @options = { connection:
10
- { hosts: ['localhost'],
11
- port: 5672,
12
- auth: { user: 'guest', password: 'guest' }
13
- },
14
- queue: {
15
- name: Basquiat.configuration.queue_name,
11
+ { hosts: ['localhost'],
12
+ port: 5672,
13
+ auth: { user: 'guest', password: 'guest' }
14
+ },
15
+ queue: {
16
+ name: Basquiat.configuration.queue_name,
16
17
  durable: true,
17
18
  options: {} },
18
- exchange: {
19
- name: Basquiat.configuration.exchange_name,
19
+ exchange: {
20
+ name: Basquiat.configuration.exchange_name,
20
21
  durable: true,
21
22
  options: {} },
22
23
  publisher: { confirm: true, persistent: false },
23
- consumer: { prefetch: 1000, manual_ack: true },
24
- requeue: { enabled: false } }
24
+ consumer: { prefetch: 1000, manual_ack: true },
25
+ requeue: { enabled: false } }
25
26
  end
26
27
 
27
28
  def base_options
@@ -47,10 +48,10 @@ module Basquiat
47
48
 
48
49
  # @return [Hash] the session options
49
50
  def session_options
50
- { exchange: @options[:exchange],
51
+ { exchange: @options[:exchange],
51
52
  publisher: @options[:publisher],
52
- consumer: @options[:consumer],
53
- queue: @options[:queue] }.deep_merge(strategy.session_options)
53
+ consumer: @options[:consumer],
54
+ queue: @options[:queue] }.deep_merge(strategy.session_options)
54
55
  end
55
56
 
56
57
  # @return [BaseStrategy] the requeue strategy or {BasicAcknowledge} if none is configured
@@ -1,15 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
4
5
  # Control the connection to the RabitMQ server. Delegates calls to {Bunny::Connection}
5
6
  class Connection < SimpleDelegator
6
7
  # @param hosts: [Array<String>] IPs or FQDN of the RabbitMQ instances
7
- # @param port: [Fixnum] Port that the RabbitMQ instances run
8
- # @param failover: [Hash]
8
+ # @param port [Fixnum] Port that the RabbitMQ instances run
9
9
  # @option failover: [Fixnum] :max_retries (5) Maximum number of reconnection retries
10
10
  # @option failover: [Fixnum] :default_timeout (5) Interval between to reconnect attempts
11
11
  # @option failover: [Fixnum] :connection_timeout (5) Allowed time before a connection attempt timeouts
12
- # @param auth: [Hash]
13
12
  # @option auth: [String] :user ('guest')
14
13
  # @option auth: [String] :password ('guest')
15
14
  def initialize(hosts:, port: 5672, failover: {}, auth: {})
@@ -23,19 +22,22 @@ module Basquiat
23
22
  # @return [Bunny::Channel]
24
23
  def create_channel
25
24
  connection.start
25
+ Basquiat.logger.debug 'Creating a new channel'
26
26
  connection.create_channel
27
27
  end
28
28
 
29
29
  # Starts the connection if needed
30
30
  def start
31
+ Basquiat.logger.debug 'Connecting to RabbitMQ'
31
32
  connection.start unless connection.connected?
32
33
  end
33
34
 
35
+ # checks if the connection is started
34
36
  def connected?
35
37
  connection.status == :started
36
38
  end
37
39
 
38
- # Closes the channels and the connection.
40
+ # Closes all channels and then the connection.
39
41
  def disconnect
40
42
  connection.close_all_channels
41
43
  connection.close
@@ -46,6 +48,7 @@ module Basquiat
46
48
 
47
49
  def reset
48
50
  @connection = nil
51
+ __setobj__(nil)
49
52
  end
50
53
 
51
54
  def connection
@@ -1,5 +1,4 @@
1
- require 'set'
2
-
1
+ # frozen_string_literal: true
3
2
  module Basquiat
4
3
  module Adapters
5
4
  class RabbitMq
@@ -13,7 +12,7 @@ module Basquiat
13
12
  end
14
13
 
15
14
  def []=(key, value)
16
- if key =~ /\*|\#/
15
+ if key =~ /\*|#/
17
16
  set_pattern_key(key, value)
18
17
  else
19
18
  @exact[key] = value
@@ -34,7 +33,7 @@ module Basquiat
34
33
  key = if key =~ /\*/
35
34
  /^#{key.gsub('*', '[^.]+')}$/
36
35
  else
37
- /^#{key.gsub(/\#/, '.*')}$/
36
+ /^#{key.gsub(/#/, '.*')}$/
38
37
  end
39
38
  @patterns[key] = value
40
39
  end
@@ -1,9 +1,13 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
5
+ # A RabbitMQ message, with it's delivery info and properties
6
+ # It's used instead of a simple hash so we can access more easily
7
+ # the properties needed for acks and requeues
4
8
  class Message < Basquiat::Adapters::BaseMessage
5
9
  attr_reader :delivery_info, :props
6
- alias_method :di, :delivery_info
10
+ alias di delivery_info
7
11
  # @!attribute [r] delivery_info
8
12
  # @return [Hash] RabbitMQ delivery_info.
9
13
  # @!attribute [r] props
@@ -25,6 +29,7 @@ module Basquiat
25
29
  end
26
30
 
27
31
  # Shorthand for delivery_info.delivery_tag
32
+ # @return [String] the message's Delivery Tag
28
33
  def delivery_tag
29
34
  delivery_info.delivery_tag
30
35
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
@@ -17,7 +18,7 @@ module Basquiat
17
18
  end
18
19
 
19
20
  def run(_message)
20
- fail Basquiat::Errors::SubclassResponsibility
21
+ raise Basquiat::Errors::SubclassResponsibility
21
22
  end
22
23
 
23
24
  def ack(message)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
@@ -11,13 +12,11 @@ module Basquiat
11
12
  queue: {
12
13
  options: {
13
14
  'x-dead-letter-exchange' => opts.fetch(:exchange, 'basquiat.dlx') } } },
14
- dlx: { ttl: opts.fetch(:ttl, 1_000) } }
15
+ dlx: { ttl: opts.fetch(:ttl, 1_000) } }
15
16
  end
16
17
 
17
18
  def session_options
18
19
  options.fetch :session
19
- rescue KeyError
20
- raise 'You have to setup the strategy first'
21
20
  end
22
21
  end
23
22
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
@@ -7,15 +8,16 @@ module Basquiat
7
8
  attr_reader :options
8
9
 
9
10
  def setup(opts)
10
- @options = { ddl: { retries: 5,
11
- exchange_name: 'basquiat.dlx',
12
- queue_name_preffix: 'basquiat.ddlq' } }.deep_merge(opts)
11
+ @options = { retries: 5,
12
+ exchange_name: 'basquiat.dlx',
13
+ queue_name_preffix: 'basquiat.ddlq' }.deep_merge(opts)
13
14
  end
14
15
  end
15
16
 
16
17
  def initialize(session)
17
18
  super
18
19
  setup_delayed_delivery
20
+ @queue_name = session.queue_name
19
21
  end
20
22
 
21
23
  def run(message)
@@ -36,10 +38,10 @@ module Basquiat
36
38
  # @return [String] the calculated routing key for a republish / requeue
37
39
  def requeue_route_for(key)
38
40
  event_name, timeout = extract_event_info(key)
39
- if timeout == 2**options[:retries] * 1_000
40
- "rejected.#{session.queue.name}.#{event_name}"
41
+ if timeout == max_timeout
42
+ "rejected.#{@queue_name}.#{event_name}"
41
43
  else
42
- "#{timeout * 2}.#{session.queue.name}.#{event_name}"
44
+ "#{timeout * 2}.#{@queue_name}.#{event_name}"
43
45
  end
44
46
  end
45
47
 
@@ -47,43 +49,40 @@ module Basquiat
47
49
  # @return [Array<String, Integer>] a 2 item array composed of the event.name (aka original routing_key) and
48
50
  # the current timeout
49
51
  def extract_event_info(key)
50
- md = key.match(/^(\d+)\.#{session.queue.name}\.(.+)$/)
51
- if md
52
- [md.captures[1], md.captures[0].to_i]
53
- else
54
- # So timeout can turn into 1 second, weird but spares some checking
55
- [key, 500]
56
- end
52
+ matched = key.match(/^(\d+)\.#{session.queue.name}\.(.+)$/)
53
+ matched && [matched.captures[1], matched.captures[0].to_i] || [key, 500]
57
54
  end
58
55
 
59
56
  def options
60
- self.class.options[:ddl]
57
+ self.class.options
61
58
  end
62
59
 
63
60
  def setup_delayed_delivery
64
61
  @exchange = session.channel.topic(options[:exchange_name], durable: true)
65
62
  session.bind_queue("*.#{session.queue.name}.#")
66
63
  prepare_timeout_queues
64
+ create_and_bind_rejected_queue
65
+ end
66
+
67
+ def create_and_bind_rejected_queue
67
68
  queue = session.channel.queue("#{options[:queue_name_preffix]}_rejected", durable: true)
68
69
  queue.bind(@exchange, routing_key: 'rejected.#')
69
70
  end
70
71
 
71
72
  def prepare_timeout_queues
72
- queues = (0..options[:retries] - 1).map do |iteration|
73
+ (0..options[:retries] - 1).each do |iteration|
73
74
  timeout = 2**iteration
74
- session.channel.queue("#{options[:queue_name_preffix]}_#{timeout}", durable: true,
75
- arguments: {
76
- 'x-dead-letter-exchange' => session.exchange.name,
77
- 'x-message-ttl' => timeout * 1_000 })
75
+ queue = session.channel.queue("#{options[:queue_name_preffix]}_#{timeout}",
76
+ durable: true,
77
+ arguments: {
78
+ 'x-dead-letter-exchange' => session.exchange.name,
79
+ 'x-message-ttl' => timeout * 1_000 })
80
+ queue.bind(@exchange, routing_key: "#{timeout * 1_000}.#")
78
81
  end
79
- bind_timeout_queues(queues)
80
82
  end
81
83
 
82
- def bind_timeout_queues(queues)
83
- queues.each do |queue|
84
- timeout = queue.arguments['x-message-ttl'].to_i
85
- queue.bind(@exchange, routing_key: "#{timeout}.#")
86
- end
84
+ def max_timeout
85
+ 2**(options[:retries] - 1) * 1_000
87
86
  end
88
87
  end
89
88
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'basquiat/adapters/rabbitmq/requeue_strategies/base_strategy'
2
3
  require 'basquiat/adapters/rabbitmq/requeue_strategies/auto_acknowledge'
3
4
  require 'basquiat/adapters/rabbitmq/requeue_strategies/basic_acknowledge'
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  class RabbitMq
5
+ # A RabbitMQ session.
4
6
  class Session
5
7
  attr_reader :channel
6
8
 
@@ -34,6 +36,10 @@ module Basquiat
34
36
  arguments: (@options[:queue][:options] || {}))
35
37
  end
36
38
 
39
+ def queue_name
40
+ queue.name
41
+ end
42
+
37
43
  def exchange
38
44
  @exchange ||= channel.topic(@options[:exchange][:name],
39
45
  durable: @options[:exchange][:durable],
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'bunny'
2
3
  require 'delegate'
3
4
 
@@ -68,7 +69,7 @@ module Basquiat
68
69
  @strategy = nil
69
70
  end
70
71
 
71
- alias_method :disconnect, :reset_connection
72
+ alias disconnect reset_connection
72
73
 
73
74
  # Lazy initializes the requeue strategy configured for the adapter
74
75
  # @return [BaseStrategy]
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Adapters
3
4
  # An adapter to be used in testing
@@ -1,2 +1,3 @@
1
+ # frozen_string_literal: true
1
2
  require 'basquiat/adapters/base_adapter'
2
3
  require 'basquiat/adapters/test_adapter'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Errors
3
4
  class StrategyNotRegistered < KeyError
@@ -1,9 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module Errors
3
4
  class SubclassResponsibility < NoMethodError
4
- def message
5
- 'This method should be implemented by a subclass tailored to the adapter'
6
- end
7
5
  end
8
6
  end
9
7
  end
@@ -1,2 +1,3 @@
1
+ # frozen_string_literal: true
1
2
  require 'basquiat/errors/subclass_responsibility'
2
3
  require 'basquiat/errors/strategy_not_registered'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'set'
2
3
 
3
4
  module Basquiat
@@ -11,6 +12,10 @@ module Basquiat
11
12
  def descendants
12
13
  @descendants ||= []
13
14
  end
15
+
16
+ def reconfigure_children
17
+ descendants.each(&:reload_adapter_from_configuration)
18
+ end
14
19
  end
15
20
 
16
21
  def reload_adapter_from_configuration
@@ -25,7 +30,8 @@ module Basquiat
25
30
  def adapter=(adapter_klass)
26
31
  @adapter = adapter_klass.new
27
32
  end
28
- alias_method :event_adapter=, :adapter=
33
+
34
+ alias event_adapter= adapter=
29
35
 
30
36
  def adapter
31
37
  @adapter ||= Kernel.const_get(Basquiat.configuration.default_adapter).new
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  class Railtie < ::Rails::Railtie
3
4
  initializer 'load_basquiat_configuration' do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'naught'
2
3
  require 'erb'
3
4
  require 'basquiat/support/hash_refinements'
@@ -15,7 +16,7 @@ module Basquiat
15
16
  logger.error do
16
17
  { exception: exception, stack_trace: exception.stack_trace, message: message }.to_json
17
18
  end
18
- fail exception
19
+ raise exception
19
20
  end
20
21
  end
21
22
 
@@ -70,7 +71,7 @@ module Basquiat
70
71
 
71
72
  # Used by the railtie. Forces the reconfiguration of all extended classes
72
73
  def reload_classes
73
- Basquiat::Base.descendants.each(&:reload_adapter_from_configuration)
74
+ Basquiat::Base.reconfigure_children
74
75
  end
75
76
 
76
77
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  module HashRefinements
3
4
  # @!method deep_merge
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Basquiat
2
3
  # A simple MultiJson wrapper to protect against eventual API changes.
3
4
  module Json
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'basquiat/support/hash_refinements'
2
3
  require 'basquiat/support/configuration'
3
4
  require 'basquiat/support/json'
@@ -1,4 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  # Version file
2
3
  module Basquiat
3
- VERSION = '1.3.0-1'
4
+ VERSION = '1.3.0'
4
5
  end
data/lib/basquiat.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'multi_json'
2
3
  require 'naught'
3
4
  require 'yaml'
@@ -11,7 +12,7 @@ require 'basquiat/interfaces/base'
11
12
  # Overall namespace config class
12
13
  module Basquiat
13
14
  class << self
14
- # resets the gems configuration. Useful for testing and not much else
15
+ # resets the library configuration. Useful for testing and not much else
15
16
  def reset
16
17
  @configuration = Configuration.new
17
18
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  # Sample class used for testing
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Basquiat::Adapters::BaseMessage do