rabbitmq-spec 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5d1814e687f3b0ce55d3baca067879c62365a0b8
4
- data.tar.gz: e6af3aaea895f09c47893d4996e10e59120635bb
3
+ metadata.gz: 016cfd923683057289d676445546b13f59314f89
4
+ data.tar.gz: da4ce486cd8e02f41bd3dc7d7b1573b3e8659d35
5
5
  SHA512:
6
- metadata.gz: 97f57760a21a605dc747db947c62b0049bdfdf57a1b026aee8c5b3ca4e6c9b44d3c7fc87de49b9ff4c7ae7a6352f364857bb9fbf5d0aafc44c2b524c51620cbc
7
- data.tar.gz: ce151b629973854e7cdfad63a78e45a5109e5573131ccad9b9678cdbee97016230cc1647ff23638b8b29aa6936469b0b7a4b46956aa3e721b673455b7c78101c
6
+ metadata.gz: 16270c70679b6eeb18689da2f88b07139e89024d3d6e572d0372a4e7d0bcb2949f104802c306ad12d0060d2a41c5bb456cd58835be8308bc8835eb9a5ad4fd81
7
+ data.tar.gz: 04607f00200dc540f61875d2a81f26e1101e3d7d1b5f45016e614f6c762f1caa575852ef0d37307a9edb379922d28f34249b2f96324fc794fa00595ffe150b01
data/.rubocop.yml CHANGED
@@ -9,6 +9,10 @@ Style/ClassAndModuleChildren:
9
9
  Style/FrozenStringLiteralComment:
10
10
  Enabled: false
11
11
 
12
+ Metrics/LineLength:
13
+ Max: 100
14
+ IgnoredPatterns: ['\A#']
15
+
12
16
  AllCops:
13
17
  Exclude:
14
18
  - rabbitmq-spec.gemspec
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --no-private
2
+ --markup markdown
3
+ --default-return void
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem 'yard', '~> 0.9.9', require: false
4
+
3
5
  # Specify your gem's dependencies in rabbitmq-spec.gemspec
4
6
  gemspec
data/README.md CHANGED
@@ -74,6 +74,15 @@ On each mqspec file. You can use the following syntax:
74
74
  end
75
75
  end
76
76
  end
77
+
78
+ # you can declare queues outside exchanges.
79
+ # The setup process will not bind them to anything
80
+ queue 'queue-name' do
81
+ description 'queue1 description'
82
+ options do
83
+ durable true
84
+ end
85
+ end
77
86
  `````
78
87
 
79
88
  ## RabbitMQ Setup
data/lib/rabbitmq-spec.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'rabbitmq-spec/version'
2
2
 
3
+ # Global RabbitMQ namespace
3
4
  module RabbitMQSpec
4
5
  autoload :DSL, 'rabbitmq-spec/dsl'
5
6
  autoload :Entity, 'rabbitmq-spec/entity'
@@ -1,7 +1,19 @@
1
+ # Namespace for all DSL logic.
2
+ # Use this module to evaluate a string in our DSL format
3
+ # and fetch a world instance containing all the entities extracted
4
+ # from the DSL specification
5
+ # @example
6
+ # RabbitMQSpec::DSL.evaluate(%Q{
7
+ # exchange 'name1' do
8
+ # description %Q{ My Exchange }
9
+ # end
10
+ # })
1
11
  module RabbitMQSpec::DSL
2
12
  autoload :World, 'rabbitmq-spec/dsl/world'
3
13
  autoload :Builder, 'rabbitmq-spec/dsl/builder'
4
14
 
15
+ # @param dsl String in the DSL format to be evaluated by.
16
+ # @return [World] Configured by the DSL definition.
5
17
  def self.evaluate(dsl)
6
18
  world = World.new
7
19
  world.instance_eval(dsl)
@@ -1,3 +1,6 @@
1
+ # @api private
2
+ # Namespace for all DSL builders.
3
+ # Each builder is a class that implements the methods that are called when evaluating the DSL
1
4
  class RabbitMQSpec::DSL::Builder
2
5
  autoload :Base, 'rabbitmq-spec/dsl/builder/base'
3
6
  autoload :Queue, 'rabbitmq-spec/dsl/builder/queue'
@@ -1,22 +1,44 @@
1
+ # Base class for each builder.
2
+ # A Builder is a class where the DSL evaluator will run
3
+ # the DSL files. It is where we define our DSL syntax.
4
+ # For more info to know how to use it,
5
+ # see the specs related to the builders.
1
6
  class RabbitMQSpec::DSL::Builder::Base
2
7
  # class methods
8
+
9
+ # @private
10
+ # Helper method to inhereted classes.
11
+ # We declare witch methods will be allowed to be called
12
+ # inside a builder instance in order to store the value
13
+ # passed to the method
3
14
  def self.define_dsl_attribute(attribute_name)
4
15
  @allowed_dsl_attributes ||= []
5
16
  @allowed_dsl_attributes << attribute_name.to_sym
6
17
  end
7
18
 
19
+ # @private
20
+ # Helper method to inhereted classes.
21
+ # The child class must call this method
22
+ # Passing and entity to be builded after
23
+ # all the the attributes was filled
8
24
  def self.define_entity_class(entity_class)
9
25
  @entity_class = entity_class
10
26
  end
11
27
 
28
+ # @private
12
29
  def self.get_entity_class
13
30
  @entity_class
14
31
  end
15
32
 
33
+ # @private
16
34
  def self.has_dsl_attribute?(attribute_name)
17
35
  @allowed_dsl_attributes.include?(attribute_name.to_sym)
18
36
  end
19
37
 
38
+ # @public
39
+ # This method evaluates the given blog inside
40
+ # a new instance of the Builder class
41
+ # and asks for the class to build the correlated entity
20
42
  def self.build(default_entity_values = {}, &block)
21
43
  builder = new(default_entity_values)
22
44
  builder.instance_eval(&block)
@@ -28,6 +50,9 @@ class RabbitMQSpec::DSL::Builder::Base
28
50
  @builded_attributes = {}.merge(default_entity_values)
29
51
  end
30
52
 
53
+ # For each method called we verify if it's
54
+ # an defined attribute for the builder.
55
+ # If it is then we store the argument as value of the attribute
31
56
  def method_missing(method_name, *args, &block)
32
57
  if self.class.has_dsl_attribute?(method_name.to_sym)
33
58
  @builded_attributes[method_name.to_sym] = if block_given?
@@ -51,6 +76,8 @@ class RabbitMQSpec::DSL::Builder::Base
51
76
 
52
77
  private
53
78
 
79
+ # Helper class to evaluate blocks that are passe
80
+ # to the defined attributes for the inhereted classes
54
81
  class HashBuilder
55
82
  def initialize
56
83
  @hash = {}
@@ -1,3 +1,4 @@
1
+ # Behavior inside the "exchange" DSL keyword
1
2
  class RabbitMQSpec::DSL::Builder::Exchange < RabbitMQSpec::DSL::Builder::Base
2
3
  define_entity_class RabbitMQSpec::Entity::Exchange
3
4
 
@@ -1,3 +1,4 @@
1
+ # Behavior inside the "queue" DSL keyword
1
2
  class RabbitMQSpec::DSL::Builder::Queue < RabbitMQSpec::DSL::Builder::Base
2
3
  define_entity_class RabbitMQSpec::Entity::Queue
3
4
 
@@ -1,12 +1,30 @@
1
+ # Class to generate instances for the DSL evaluation
2
+ # @api private
3
+ # @attr exchanges [Array<RabbitMQSpec::Entity::Exchange>]
4
+ # @attr single_queues [Array<RabbitMQSpec::Entity::Queue>]
5
+
1
6
  class RabbitMQSpec::DSL::World
2
7
  attr_reader :exchanges
8
+ attr_reader :single_queues
3
9
 
4
10
  def initialize
5
11
  @exchanges = []
12
+ @single_queues = []
6
13
  end
7
14
 
15
+ # DSL exchange keyword
16
+ # @attr name [String] Name of the exchange
17
+ # @yield Block to be evaluated on RabbitMQSpec::DSL::Builder::Exchange build proccess
8
18
  def exchange(name, &block)
9
19
  new_exchange = RabbitMQSpec::DSL::Builder::Exchange.build(name: name, &block)
10
20
  @exchanges << new_exchange
11
21
  end
22
+
23
+ # DSL queue keyword
24
+ # @attr name [String] Name of the queue
25
+ # @yield Block to be evaluated on RabbitMQSpec::DSL::Builder::Exchange build proccess
26
+ def queue(name, &block)
27
+ new_queue = RabbitMQSpec::DSL::Builder::Queue.build(name: name, &block)
28
+ @single_queues << new_queue
29
+ end
12
30
  end
@@ -1,3 +1,4 @@
1
+ # Namespace for all entities related to our Business Logic
1
2
  module RabbitMQSpec::Entity
2
3
  autoload :Exchange, 'rabbitmq-spec/entity/exchange'
3
4
  autoload :Queue, 'rabbitmq-spec/entity/queue'
@@ -1,3 +1,9 @@
1
+ # Represents an exchange in the AMPQ broker
2
+ # @attr name [String]
3
+ # @attr description [String]
4
+ # @attr queues [Array<RabbitMQSpec::Entity::Queue>]
5
+ # @attr options [Hash] Configuration options
6
+
1
7
  class RabbitMQSpec::Entity::Exchange
2
8
  attr_accessor :name
3
9
  attr_accessor :description
@@ -1,3 +1,9 @@
1
+ # Represents an queue in the AMPQ broker
2
+ # @attr name [String]
3
+ # @attr description [String]
4
+ # @attr routing_key [String]
5
+ # @attr options [Hash] Configuration options
6
+
1
7
  class RabbitMQSpec::Entity::Queue
2
8
  attr_accessor :name
3
9
  attr_accessor :description
@@ -1,5 +1,10 @@
1
1
  require 'bunny'
2
2
 
3
+ # Does the AMPQ Broker setup by reading all mqspecs files,
4
+ # evaluating them and connecting to the broker using the provided url
5
+ # in order to create all exchanges, queues and bindings
6
+ # @example
7
+ # RabbitMQSpec::Setup.run(['/my/path/folde1', 'my/direct_mqspec/file.rb'], 'amqp://guest:guest@localhost:5672')
3
8
  class RabbitMQSpec::Setup
4
9
  autoload :Runner, 'rabbitmq-spec/setup/runner'
5
10
  autoload :WorldSetupper, 'rabbitmq-spec/setup/world_setupper'
@@ -12,6 +17,7 @@ class RabbitMQSpec::Setup
12
17
  end
13
18
  end
14
19
 
20
+ # @private
15
21
  def with_client(ampq_broker_url)
16
22
  client = Bunny.new(ampq_broker_url, automatically_recover: false)
17
23
  channel = nil
@@ -22,8 +28,8 @@ class RabbitMQSpec::Setup
22
28
  rescue Exception => ex
23
29
  raise ex
24
30
  ensure
25
- channel and channel.close
26
- client and client.close
31
+ channel && channel.close
32
+ client && client.close
27
33
  end
28
34
  end
29
35
  end
@@ -1,3 +1,12 @@
1
+ # @api private
2
+ # Read each file and setups RabbitMQ based on
3
+ # each mqspec defined on them
4
+ # @example
5
+ # RabbitMQSpec::Setup::Runner.run(
6
+ # [
7
+ # '/my/path/folde1',
8
+ # 'my/direct_mqspec/file.rb']
9
+ # ], bunny_client)
1
10
  class RabbitMQSpec::Setup::Runner
2
11
  def initialize(paths_to_read, client)
3
12
  @paths_to_read = paths_to_read
@@ -10,11 +19,12 @@ class RabbitMQSpec::Setup::Runner
10
19
  end
11
20
  end
12
21
 
13
- def worlds
22
+ # private methods
23
+ private def worlds
14
24
  @paths_to_read.map { |path| RabbitMQSpec::Setup::WorldFetcher.call(path) }
15
25
  end
16
26
 
17
- def setup_world(world)
27
+ private def setup_world(world)
18
28
  RabbitMQSpec::Setup::WorldSetupper.call(world, @client)
19
29
  end
20
30
  end
@@ -1,3 +1,8 @@
1
+ # @api private
2
+ # Given a file path it opens the file and
3
+ # evaluate its content using the DSL
4
+ # @example
5
+ # RabbitMQSpec::Setup::WorldFetcher.('/my/file/path.rb')
1
6
  module RabbitMQSpec::Setup::WorldFetcher
2
7
  class << self
3
8
  def call(mqspec_file_path)
@@ -1,9 +1,17 @@
1
+ # @api private
2
+ # It uses the client to configure the RabbitMQ
3
+ # according with the world object
4
+ # @example
5
+ # RabbitMQSpec::Setup::WorldSetupper.(world, client)
1
6
  module RabbitMQSpec::Setup::WorldSetupper
2
7
  class << self
3
8
  def call(world, client)
4
9
  world.exchanges.each do |exchange|
5
10
  setup_exchange(exchange, client)
6
11
  end
12
+ world.single_queues.each do |queue|
13
+ setup_queue(queue, client)
14
+ end
7
15
  end
8
16
 
9
17
  def setup_exchange(exchange, client)
@@ -17,5 +25,9 @@ module RabbitMQSpec::Setup::WorldSetupper
17
25
  end
18
26
  end
19
27
  end
28
+
29
+ def setup_queue(queue, client)
30
+ client.queue(queue.name, queue.options)
31
+ end
20
32
  end
21
33
  end
@@ -1,3 +1,4 @@
1
1
  module RabbitMQSpec
2
- VERSION = '1.0.1'.freeze
2
+ # Current gem version (semantic versioning)
3
+ VERSION = '1.1.0'.freeze
3
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rabbitmq-spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vinicius Oyama
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-15 00:00:00.000000000 Z
11
+ date: 2017-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cri
@@ -139,6 +139,7 @@ files:
139
139
  - ".ruby-gemset"
140
140
  - ".ruby-version"
141
141
  - ".travis.yml"
142
+ - ".yardopts"
142
143
  - Gemfile
143
144
  - LICENSE.txt
144
145
  - README.md
@@ -183,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
184
  version: '0'
184
185
  requirements: []
185
186
  rubyforge_project:
186
- rubygems_version: 2.6.11
187
+ rubygems_version: 2.6.12
187
188
  signing_key:
188
189
  specification_version: 4
189
190
  summary: Gem for documenting and configuring RabbitMQ brokers.