basquiat 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.metrics +5 -0
  4. data/.rspec +4 -0
  5. data/.rubocop.yml +12 -0
  6. data/.ruby-gemset +1 -0
  7. data/.ruby-version +1 -0
  8. data/.travis.yml +3 -0
  9. data/Gemfile +4 -0
  10. data/Guardfile +17 -0
  11. data/LICENSE.txt +22 -0
  12. data/README.md +95 -0
  13. data/Rakefile +13 -0
  14. data/basquiat.gemspec +39 -0
  15. data/docker/Dockerfile +11 -0
  16. data/docker/basquiat_start.sh +9 -0
  17. data/docker-compose.yml +11 -0
  18. data/lib/basquiat/adapters/base_adapter.rb +54 -0
  19. data/lib/basquiat/adapters/rabbitmq_adapter.rb +130 -0
  20. data/lib/basquiat/adapters/test_adapter.rb +52 -0
  21. data/lib/basquiat/adapters.rb +2 -0
  22. data/lib/basquiat/interfaces/base.rb +62 -0
  23. data/lib/basquiat/rails/railtie.rb +14 -0
  24. data/lib/basquiat/support/configuration.rb +62 -0
  25. data/lib/basquiat/support/hash_refinements.rb +24 -0
  26. data/lib/basquiat/support/json.rb +13 -0
  27. data/lib/basquiat/support.rb +3 -0
  28. data/lib/basquiat/version.rb +4 -0
  29. data/lib/basquiat.rb +27 -0
  30. data/spec/lib/adapters/base_adapter_spec.rb +11 -0
  31. data/spec/lib/adapters/rabbitmq_adapter_spec.rb +79 -0
  32. data/spec/lib/adapters/test_adapter_spec.rb +61 -0
  33. data/spec/lib/basquiat_spec.rb +27 -0
  34. data/spec/lib/interfaces/base_spec.rb +100 -0
  35. data/spec/lib/support/configuration_spec.rb +73 -0
  36. data/spec/lib/support/hash_refinements_spec.rb +24 -0
  37. data/spec/lib/support/json_spec.rb +5 -0
  38. data/spec/spec_helper.rb +22 -0
  39. data/spec/support/basquiat.yml +9 -0
  40. data/spec/support/shared_examples/basquiat_adapter_shared_examples.rb +23 -0
  41. metadata +305 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4d297e7591c1ea6247edd40cf816fd9886c9f8d7
4
+ data.tar.gz: 93b240d5a7353ed4ceb65ded88e3de66f64a18d9
5
+ SHA512:
6
+ metadata.gz: 2fffd158b4d20998d28e100351892571bd952874affb8a18fb83b7cf64d3815b6fbad980ea2826905eda70c88afa33249b10b23d3025a18697e1a1478ed67368
7
+ data.tar.gz: 45366c9864d178391f97ba52caad3bc6a2c77375a2c360ee66da325a37a3fb75c5066703582f50074acfb5bc2e1a29ab64a0b82168c0d22ed491c437242e2d8a
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea
19
+ bin
data/.metrics ADDED
@@ -0,0 +1,5 @@
1
+ MetricFu::Configuration.run do |config|
2
+ config.configure_metric(:cane) do |cane|
3
+ cane.line_length = 110
4
+ end
5
+ end
data/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --format documentation
2
+ --color
3
+ --fail-fast
4
+ --order rand
data/.rubocop.yml ADDED
@@ -0,0 +1,12 @@
1
+ AllCops:
2
+ Exclude:
3
+ - 'bin/*'
4
+ - 'docker/*'
5
+ Style/LineLength:
6
+ Max: 109
7
+
8
+ Style/AlignHash:
9
+ EnforcedHashRocketStyle: table
10
+
11
+ Style/Documentation:
12
+ Enabled: false
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ basquiat
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.5
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in basquiat.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,17 @@
1
+ guard :bundler do
2
+ watch('Gemfile')
3
+ watch('basquiat.gemspec')
4
+ end
5
+
6
+ guard :rspec, { all_on_start: true, keep: true, all_after_pass: true, run_all: { cmd: 'rspec -f progress'} } do
7
+ watch(%r{^spec/.+_spec.rb$})
8
+ watch(%r{^spec/lib/.+_spec.rb$})
9
+ watch(%r{^lib/basquiat/(.+)\.rb$}) { |matchdata| "spec/lib/#{matchdata[1]}_spec.rb" }
10
+ watch('spec/spec_helper.rb') { 'spec' }
11
+ watch(%r{spec/support/.+\.rb}) { 'spec' }
12
+ end
13
+
14
+ guard :rubocop, { cli: '-fs -c./.rubocop.yml'} do
15
+ #watch(%r{.+\.rb$})
16
+ #watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
17
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Marcello Rocha
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # Basquiat
2
+
3
+ **Basquiat** is intended to hide (almost) all the complexity of working with some kind of message queue from the application internals.
4
+
5
+ All the exchanges, connections, queues and sessions declarations are swept under rug. The main aim is to provide a simple yet flexible interface to work with message queues.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'basquiat'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install basquiat
20
+
21
+ You will also need the right gem for your MQ system. Bundled in this gem you will find 2 adapters for RabbitMQ and ActiveMQ which depends on the gems _bunny_ and _ruby-stomp_ respectively.
22
+
23
+ ## Basic Usage
24
+
25
+ First of all require the gem, the dependecy for the adapter and the adapter itself
26
+
27
+ require 'basquiat'
28
+ require 'bunny'
29
+ require 'basquiat/adapters/rabbitmq_adapter'
30
+
31
+ Then you can extend the class that you will use for communicating with the MQ
32
+
33
+ class TownCrier
34
+ extend Basquiat::Base
35
+ end
36
+
37
+ From here you can publish events to the queue
38
+
39
+ TownCrier.publish('some.nifty.event', {a: 'hash', of: 'values'})
40
+
41
+ And you can subscribe to one or more events using a proc that will get called when the message is received:
42
+
43
+ class TownCrier
44
+ extend Basquiat::Base
45
+
46
+ subscribe_to 'some.nifty.event', ->(msg) { msg.fetch(:of, '').upcase }
47
+ end
48
+
49
+ ## Configuration
50
+
51
+ You can setup Basquiat using the configure method. This method will yield a Configuration object:
52
+
53
+ Basquiat.configure do |config|
54
+ config.exchange_name = 'my_exchange'
55
+ end
56
+
57
+ The available options are:
58
+
59
+ - config_file= Receive a path to an YAML file (example here)
60
+ - queue_name= The default queue name
61
+ - exchange_name= The default exchange name
62
+ - environment= Forces the environment to something other than the value of BASQUIAT_ENV
63
+ - logger= The logger to be used. Defaults to a null logger.
64
+
65
+ The configuration can be reset using the Basquiat.reset method.
66
+
67
+ Yaml File configuration example:
68
+
69
+ test: #environment
70
+ exchange_name: 'my.test_exchange' #required
71
+ queue_name: 'my.nice_queue' #required
72
+ default_adapter: Basquiat::Adapters::Test #it will overwrite the adapter on all classes that extend Basquiat::Base
73
+ adapter_options: #Adapter specific options
74
+ :servers:
75
+ -
76
+ :host: 'localhost'
77
+ :port: '5672'
78
+ development: #full example of the RabbitMq options
79
+ exchange_name: 'my.exchange'
80
+ queue_name: 'my.queue'
81
+ default_adapter: Basquiat::Adapters::RabbitMq
82
+ adapter_options:
83
+ :servers:
84
+ -
85
+ :host: 'localhost'
86
+ :port: '5672'
87
+ :failover:
88
+ :default_timeout: 5
89
+ :max_retries: 5
90
+ :publisher:
91
+ :confirm: true
92
+ :persistent: true
93
+ :auth:
94
+ :user: 'guest'
95
+ :password: 'guest'
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new(:spec)
7
+
8
+ task default: :spec
9
+
10
+ desc 'Loads IRB with the gem already required'
11
+ task :console do
12
+ system 'irb -I./lib -rbasquiat'
13
+ end
data/basquiat.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'basquiat/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'basquiat'
8
+ spec.version = Basquiat::VERSION
9
+ spec.authors = ['Marcello "mereghost" Rocha']
10
+ spec.email = %w(marcello.rocha@gmail.com.br)
11
+ spec.description = <<EOD
12
+ Basquiat is a library that intends to abstract all the complexity of working with message queues
13
+ EOD
14
+ spec.summary = 'A pluggable library that aims to hide message queue complexity'
15
+ spec.homepage = 'http://www.vagas.com.br/'
16
+ spec.license = 'MIT'
17
+
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)\//)
21
+ spec.require_paths = %w(lib)
22
+
23
+ spec.add_development_dependency 'bundler'
24
+ spec.add_development_dependency 'rake'
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'guard'
27
+ spec.add_development_dependency 'guard-bundler'
28
+ spec.add_development_dependency 'guard-rspec'
29
+ spec.add_development_dependency 'guard-rubocop'
30
+ spec.add_development_dependency 'bunny'
31
+ spec.add_development_dependency 'stomp'
32
+ spec.add_development_dependency 'yajl-ruby'
33
+ spec.add_development_dependency 'simplecov'
34
+ spec.add_development_dependency 'metric_fu'
35
+ spec.add_development_dependency 'rubocop'
36
+
37
+ spec.add_dependency 'multi_json'
38
+ spec.add_dependency 'naught'
39
+ end
data/docker/Dockerfile ADDED
@@ -0,0 +1,11 @@
1
+ FROM mereghost/ruby:latest
2
+
3
+ RUN useradd -m -g users dev
4
+
5
+ VOLUME /basquiat
6
+ WORKDIR /basquiat
7
+
8
+ USER dev
9
+ ENV REFRESHED_AT 2015-03-29
10
+ COPY ../Gemfile /tmp/Gemfile
11
+ RUN bundle install
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/bash
2
+ echo '#### Installing bundle ####'
3
+ bundle install --binstubs
4
+
5
+ echo '#### Starting guard ####'
6
+ (
7
+ cd /basquiat
8
+ bin/guard start -c --no-notify -p
9
+ )
@@ -0,0 +1,11 @@
1
+ basquiat:
2
+ build: docker
3
+ command: /basquiat/docker/basquiat_start.sh
4
+ volumes:
5
+ - ./:/basquiat
6
+ links:
7
+ - rabbitmq
8
+ tty: true
9
+
10
+ rabbitmq:
11
+ image: mereghost/rabbitmq:latest
@@ -0,0 +1,54 @@
1
+ module Basquiat
2
+ module Adapters
3
+ # Base implementation for an adapter
4
+ module Base
5
+ using Basquiat::HashRefinements
6
+
7
+ def initialize
8
+ @options = base_options
9
+ @procs = {}
10
+ @retries = 0
11
+ end
12
+
13
+ # Used to set the options for the adapter. It is merged in
14
+ # to the default_options hash.
15
+ # @param [Hash] opts an adapter dependant hash of options
16
+ def adapter_options(opts)
17
+ @options.deep_merge(opts)
18
+ end
19
+
20
+ # Default options for the adapter
21
+ # @return [Hash]
22
+ def base_options
23
+ default_options.merge(Basquiat.configuration.adapter_options)
24
+ end
25
+
26
+ def default_options
27
+ {}
28
+ end
29
+
30
+ def update_config
31
+ end
32
+
33
+ def publish
34
+ end
35
+
36
+ def subscribe_to
37
+ end
38
+
39
+ def disconnect
40
+ end
41
+
42
+ def disconnected?
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :procs, :options
48
+
49
+ def logger
50
+ Basquiat.configuration.logger
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,130 @@
1
+ require 'bunny'
2
+
3
+ module Basquiat
4
+ module Adapters
5
+ # The RabbitMQ adapter for Basquiat
6
+ class RabbitMq
7
+ include Basquiat::Adapters::Base
8
+
9
+ def default_options
10
+ { failover: { default_timeout: 5, max_retries: 5 },
11
+ servers: [{ host: 'localhost', port: 5672 }],
12
+ queue: { name: Basquiat.configuration.queue_name, options: { durable: true } },
13
+ exchange: { name: Basquiat.configuration.exchange_name, options: { durable: true } },
14
+ publisher: { confirm: true, persistent: false },
15
+ auth: { user: 'guest', password: 'guest' } }
16
+ end
17
+
18
+ def subscribe_to(event_name, proc)
19
+ procs[event_name] = proc
20
+ end
21
+
22
+ def publish(event, message, persistent: options[:publisher][:persistent])
23
+ with_network_failure_handler do
24
+ channel.confirm_select if options[:publisher][:confirm]
25
+ exchange.publish(Basquiat::Json.encode(message), routing_key: event)
26
+ disconnect unless persistent
27
+ end
28
+ end
29
+
30
+ def listen(block: true)
31
+ with_network_failure_handler do
32
+ procs.keys.each { |key| bind_queue(key) }
33
+ queue.subscribe(block: block) do |di, _, msg|
34
+ message = Basquiat::Json.decode(msg)
35
+ procs[di.routing_key].call(message)
36
+ end
37
+ end
38
+ end
39
+
40
+ def connect
41
+ with_network_failure_handler do
42
+ connection.start
43
+ current_server[:retries] = 0
44
+ end
45
+ end
46
+
47
+ def connection_uri
48
+ current_server_uri
49
+ end
50
+
51
+ def disconnect
52
+ connection.close_all_channels
53
+ connection.close
54
+ reset_connection
55
+ end
56
+
57
+ def connected?
58
+ @connection
59
+ end
60
+
61
+ private
62
+ def with_network_failure_handler
63
+ yield if block_given?
64
+ rescue Bunny::ConnectionForced, Bunny::TCPConnectionFailed, Bunny::NetworkFailure => error
65
+ if current_server.fetch(:retries, 0) <= failover_opts[:max_retries]
66
+ handle_network_failures
67
+ retry
68
+ else
69
+ raise(error)
70
+ end
71
+ end
72
+
73
+ def failover_opts
74
+ options[:failover]
75
+ end
76
+
77
+ def bind_queue(event_name)
78
+ queue.bind(exchange, routing_key: event_name)
79
+ end
80
+
81
+ def reset_connection
82
+ @connection, @channel, @exchange, @queue = nil, nil, nil, nil
83
+ end
84
+
85
+ def rotate_servers
86
+ return unless options[:servers].any? { |server| server.fetch(:retries, 0) < failover_opts[:max_retries] }
87
+ options[:servers].rotate!
88
+ end
89
+
90
+ def handle_network_failures
91
+ logger.warn "[WARN] Handling connection to #{current_server_uri}"
92
+ retries = current_server.fetch(:retries, 0)
93
+ current_server[:retries] = retries + 1
94
+ if retries < failover_opts[:max_retries]
95
+ logger.warn("[WARN] Connection failed retrying in #{failover_opts[:default_timeout]} seconds")
96
+ sleep(failover_opts[:default_timeout])
97
+ else
98
+ rotate_servers
99
+ end
100
+ reset_connection
101
+ end
102
+
103
+ def connection
104
+ @connection ||= Bunny.new(current_server_uri)
105
+ end
106
+
107
+ def channel
108
+ connect
109
+ @channel ||= connection.create_channel
110
+ end
111
+
112
+ def queue
113
+ @queue ||= channel.queue(options[:queue][:name], options[:queue][:options])
114
+ end
115
+
116
+ def exchange
117
+ @exchange ||= channel.topic(options[:exchange][:name], options[:exchange][:options])
118
+ end
119
+
120
+ def current_server
121
+ options[:servers].first
122
+ end
123
+
124
+ def current_server_uri
125
+ auth = current_server[:auth] || options[:auth]
126
+ "amqp://#{auth[:user]}:#{auth[:password]}@#{current_server[:host]}:#{current_server[:port]}"
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,52 @@
1
+ module Basquiat
2
+ module Adapters
3
+ # An adapter to be used in testing
4
+ class Test
5
+ include Basquiat::Adapters::Base
6
+
7
+ class << self
8
+ def events
9
+ @events ||= Hash.new { |hash, key| hash[key] = [] }
10
+ end
11
+
12
+ def clean
13
+ @events.clear if @events
14
+ end
15
+ end
16
+
17
+ attr_reader :options
18
+
19
+ def default_options
20
+ @event_names = []
21
+ { host: '127.0.0.1', port: 123_456, durable: true }
22
+ end
23
+
24
+ def publish(event, message, _single_message = true)
25
+ self.class.events[event] << Basquiat::Json.encode(message)
26
+ end
27
+
28
+ def events(key)
29
+ self.class.events[key]
30
+ end
31
+
32
+ def subscribe_to(event_name, proc)
33
+ @event_names << event_name
34
+ procs[event_name] = proc
35
+ end
36
+
37
+ def listen(*)
38
+ event = subscribed_event
39
+ msg = self.class.events[event].shift
40
+ msg ? procs[event].call(Basquiat::Json.decode(msg)) : nil
41
+ end
42
+
43
+ private
44
+
45
+ def subscribed_event
46
+ event = @event_names.first
47
+ @event_names.rotate!
48
+ event
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,2 @@
1
+ require 'basquiat/adapters/base_adapter'
2
+ require 'basquiat/adapters/test_adapter'
@@ -0,0 +1,62 @@
1
+ require 'set'
2
+
3
+ module Basquiat
4
+ # base module extend the classes that will use the event infrastructure
5
+ module Base
6
+ class << self
7
+ def extended(klass)
8
+ descendants.push klass
9
+ end
10
+
11
+ def descendants
12
+ @descendants ||= []
13
+ end
14
+ end
15
+
16
+ def reload_adapter_from_configuration
17
+ @adapter = Kernel.const_get(Basquiat.configuration.default_adapter).new
18
+ @adapter.adapter_options Basquiat.configuration.adapter_options
19
+ end
20
+
21
+
22
+ def event_adapter=(adapter)
23
+ @adapter = adapter.new
24
+ end
25
+
26
+ def adapter
27
+ @adapter ||= Kernel.const_get(Basquiat.configuration.default_adapter).new
28
+ end
29
+
30
+ def adapter_options(opts = Basquiat.configuration.adapter_options)
31
+ adapter.adapter_options(opts)
32
+ end
33
+
34
+ def publish(event, message)
35
+ adapter.publish(event, message)
36
+ end
37
+
38
+ def subscribe_to(event_name, proc)
39
+ proc = make_callable(proc)
40
+ adapter.subscribe_to(event_name, proc)
41
+ end
42
+
43
+ def disconnect
44
+ adapter.disconnect
45
+ end
46
+
47
+ def connected?
48
+ adapter.connected?
49
+ end
50
+
51
+ def listen(block: true)
52
+ adapter.listen(block: block)
53
+ end
54
+
55
+ private
56
+
57
+ def make_callable(proc)
58
+ return proc if proc.respond_to? :call
59
+ method(proc)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,14 @@
1
+ module Basquiat
2
+ class Railtie < ::Rails::Railtie
3
+ initializer 'load_basquiat_configuration' do
4
+ ENV['BASQUIAT_ENV'] = Rails.env
5
+ Basquiat.configure do |config|
6
+ config.config_file = Rails.root + 'config/basquiat.yml'
7
+ end
8
+ end
9
+
10
+ config.after_initialize do
11
+ Basquiat.configuration.reload_classes
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,62 @@
1
+ require 'basquiat/support/hash_refinements'
2
+ require 'naught'
3
+ require 'erb'
4
+
5
+ module Basquiat
6
+ DefaultLogger = Naught.build { |config| config.mimic Logger }
7
+
8
+ class Configuration
9
+ using HashRefinements
10
+
11
+ attr_writer :queue_name, :exchange_name, :logger, :environment
12
+
13
+ def queue_name
14
+ @queue_name || 'basquiat.queue'
15
+ end
16
+
17
+ def exchange_name
18
+ @exchange_name || 'basquiat.exchange'
19
+ end
20
+
21
+ def logger
22
+ @logger || DefaultLogger.new
23
+ end
24
+
25
+ def environment
26
+ (@environment || ENV['BASQUIAT_ENV'] || 'development').to_sym
27
+ end
28
+
29
+ def config_file=(path)
30
+ load_yaml(path)
31
+ setup_basic_options
32
+ end
33
+
34
+ def adapter_options
35
+ config.fetch(:adapter_options) { Hash.new }
36
+ end
37
+
38
+ def default_adapter
39
+ config.fetch(:default_adapter) { Basquiat::Adapter::Test }
40
+ end
41
+
42
+ def reload_classes
43
+ Basquiat::Base.descendants.each do |klass|
44
+ klass.reload_adapter_from_configuration
45
+ end
46
+ end
47
+
48
+ private
49
+ def config
50
+ @yaml.fetch(environment)
51
+ end
52
+
53
+ def load_yaml(path)
54
+ @yaml = YAML.load(ERB.new(IO.readlines(path).join).result).symbolize_keys
55
+ end
56
+
57
+ def setup_basic_options
58
+ @queue_name ||= config.fetch(:queue_name) { 'basquiat.exchange' }
59
+ @exchange_name ||= config.fetch(:exchange_name) { 'basquiat.queue' }
60
+ end
61
+ end
62
+ end