rabbitmq-spec 1.0.1 → 1.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: 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.