gorg_service 0.1.2 → 0.2.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 +4 -4
- data/.gitignore +2 -1
- data/.todo.reek +26 -0
- data/.travis.yml +6 -1
- data/Gemfile +1 -0
- data/README.md +84 -4
- data/gorg_service.gemspec +4 -0
- data/lib/gorg_service/configuration.rb +6 -2
- data/lib/gorg_service/errors.rb +20 -1
- data/lib/gorg_service/listener.rb +43 -43
- data/lib/gorg_service/message.rb +17 -13
- data/lib/gorg_service/version.rb +1 -1
- data/lib/gorg_service.rb +30 -6
- metadata +59 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c367d16bc5790468c190d509d84e89effef69fbb
|
4
|
+
data.tar.gz: 1951f35a70ffacddb8f1f141df9febeadc890420
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 912bc14211df2c260d360023f3e6ee378bb228db615408d46615197bb0db4f0acaa4957aeb10bb1d3ba1c1a2b6e7593fbbb12b99a50467583fce7326b22028b4
|
7
|
+
data.tar.gz: 7c1bc8ac7f5f3268d35b5d481efe7fb2821b5d2abb6fdbfb3389a47c2de453f1b6660bfdd1e267ba4cbbba90318953b4c2e9bf313e8b3a0ef51c8dc430680d2e
|
data/.gitignore
CHANGED
data/.todo.reek
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
Attribute:
|
3
|
+
exclude:
|
4
|
+
- GorgService#configuration
|
5
|
+
- GorgService::Configuration#application_id
|
6
|
+
- GorgService::Configuration#application_name
|
7
|
+
- GorgService::Configuration#message_handler_map
|
8
|
+
- GorgService::Configuration#rabbitmq_deferred_time
|
9
|
+
- GorgService::Configuration#rabbitmq_exchange_name
|
10
|
+
- GorgService::Configuration#rabbitmq_host
|
11
|
+
- GorgService::Configuration#rabbitmq_max_attempts
|
12
|
+
- GorgService::Configuration#rabbitmq_password
|
13
|
+
- GorgService::Configuration#rabbitmq_port
|
14
|
+
- GorgService::Configuration#rabbitmq_queue_name
|
15
|
+
- GorgService::Configuration#rabbitmq_user
|
16
|
+
- GorgService::Configuration#rabbitmq_vhost
|
17
|
+
- GorgService::Message#data
|
18
|
+
- GorgService::Message#errors
|
19
|
+
- GorgService::Message#event
|
20
|
+
- GorgService::Message#id
|
21
|
+
TooManyInstanceVariables:
|
22
|
+
exclude:
|
23
|
+
- GorgService::Configuration
|
24
|
+
ControlParameter:
|
25
|
+
exclude:
|
26
|
+
- GorgService::Message#initialize
|
data/.travis.yml
CHANGED
@@ -4,4 +4,9 @@ rvm:
|
|
4
4
|
before_install: gem install bundler -v 1.11.2
|
5
5
|
addons:
|
6
6
|
code_climate:
|
7
|
-
repo_token: 8a2a969cd1d481fbc952943cc27b54584b2f27217ea2e2905e77652d44c502be
|
7
|
+
repo_token: 8a2a969cd1d481fbc952943cc27b54584b2f27217ea2e2905e77652d44c502be
|
8
|
+
before_script:
|
9
|
+
- cp spec/gorg_service/support/conf/rabbit_mq.yml.travis spec/gorg_service/support/conf/rabbit_mq.yml
|
10
|
+
sudo: required
|
11
|
+
services:
|
12
|
+
- rabbitmq
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# GorgService
|
2
|
-
[](https://codeclimate.com/github/Zooip/gorg_service) [](https://codeclimate.com/github/Zooip/gorg_service/coverage) [](https://travis-ci.org/Zooip/gorg_service)
|
2
|
+
[](https://codeclimate.com/github/Zooip/gorg_service) [](https://codeclimate.com/github/Zooip/gorg_service/coverage) [](https://travis-ci.org/Zooip/gorg_service) [](https://badge.fury.io/rb/gorg_service) [](https://gemnasium.com/github.com/Zooip/gorg_service)
|
3
|
+
Standard RabbitMQ bot used in Gadz.org SOA
|
3
4
|
|
4
5
|
## Installation
|
5
6
|
|
@@ -19,7 +20,7 @@ Or install it yourself as:
|
|
19
20
|
|
20
21
|
## Setup
|
21
22
|
|
22
|
-
Before being used
|
23
|
+
Before being used, GorgService must be configured. In Rails app, put it in an Initializer.
|
23
24
|
|
24
25
|
```ruby
|
25
26
|
GorgService.configure do |c|
|
@@ -45,18 +46,97 @@ GorgService.configure do |c|
|
|
45
46
|
# c.rabbitmq_queue_name = c.application_name
|
46
47
|
# c.rabbitmq_exchange_name = "exchange"
|
47
48
|
#
|
48
|
-
# time before trying again on softfail (temporary error)
|
49
|
+
# time before trying again on softfail in milliseconds (temporary error)
|
49
50
|
# c.rabbitmq_deferred_time = 1800000 # 30min
|
50
51
|
#
|
51
52
|
# maximum number of try before discard a message
|
52
53
|
# c.rabbitmq_max_attempts = 48 # 24h with default deferring delay
|
54
|
+
#
|
55
|
+
# Routing hash
|
56
|
+
# map routing_key of received message with MessageHandler
|
57
|
+
# exemple:
|
58
|
+
# c.message_handler_map={
|
59
|
+
# "some.routing.key" => MyMessageHandler,
|
60
|
+
# "Another.routing.key" => OtherMessageHandler,
|
61
|
+
# "third.routing.key" => MyMessageHandler,
|
62
|
+
# }
|
63
|
+
c.message_handler_map= {} #TODO : Set my routing hash
|
53
64
|
|
54
65
|
end
|
55
66
|
```
|
56
67
|
|
57
68
|
## Usage
|
58
69
|
|
59
|
-
|
70
|
+
To start the RabbitMQ consummer use :
|
71
|
+
```ruby
|
72
|
+
my_service = GorgService.new
|
73
|
+
my_service.run
|
74
|
+
```
|
75
|
+
### Routing and MessageHandler
|
76
|
+
When running, GorgService act as a consumer on Gadz.org RabbitMQ network.
|
77
|
+
It bind its queue on the main exchange and subscribes to routing keys defines in `message_handler_map`
|
78
|
+
|
79
|
+
Each received message will be routed to the corresponding `MessageHandler`
|
80
|
+
> **Warning** : RabbitMQ wildcards characters `#` and `*`are NOT supported for now
|
81
|
+
|
82
|
+
A `MessageHandler` is a kind of controller. This is where you put the message is processed.
|
83
|
+
A `MessageHandler` expect a `GorgService::Message` as param of its `initializer`method.
|
84
|
+
|
85
|
+
Here is an exemple `MessageHandler` :
|
86
|
+
```ruby
|
87
|
+
require 'json'
|
88
|
+
require 'json-schema' #Checkout https://github.com/ruby-json-schema/json-schema
|
89
|
+
|
90
|
+
class ExampleMessageHandler < GorgService::MessageHandler
|
91
|
+
|
92
|
+
EXPECTED_SCHEMA = {
|
93
|
+
"type" => "object",
|
94
|
+
"required" => ["user_id"],
|
95
|
+
"properties" => {
|
96
|
+
"user_id" => {"type" => "integer"}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
def initialize(msg)
|
101
|
+
data=msg.data
|
102
|
+
begin
|
103
|
+
JSON::Validator.validate!(EXPECTED_SCHEMA, data)
|
104
|
+
rescue JSON::Schema::ValidationError => e
|
105
|
+
#This message can't be processed, it will be discarded
|
106
|
+
raise_hardfail("Invalid message",e)
|
107
|
+
end
|
108
|
+
|
109
|
+
begin
|
110
|
+
MyAPI.send(msg.data)
|
111
|
+
rescue MyAPI::UnavailableConnection => e
|
112
|
+
# This message can be processed but external resources
|
113
|
+
# are not available at this moment, retry later
|
114
|
+
raise_softfail("Can't connect to MyAPI",e)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
```
|
119
|
+
|
120
|
+
As showed in this example,`GorgService::MessageHandler` provides 2 helpers :
|
121
|
+
|
122
|
+
- `raise_hardfail`: This will raise a `HardfailError`exception. The message can't be processed and will never be. It is logged and send back to main exchange for audit purpose.
|
123
|
+
|
124
|
+
- `raise_softfail`: This will raise a `SoftfailError`exception. The message can't be processed at this moment but may be processed in future : connection problems, rate limiting API, etc. It is sent to a deferred queue where it will be delayed for `rabbitmq_deferred_time`millisecconds before being sent back in the main exchange for re-queuing.
|
125
|
+
|
126
|
+
Each one of this helpers expect two params :
|
127
|
+
|
128
|
+
- `message` : The information to be displayed in message's error log
|
129
|
+
- `exception` (optional) : The runtime esception causing the hardfail, for debug purpose
|
130
|
+
|
131
|
+
### Message structure
|
132
|
+
`GorgService::Message` is defined [here](https://github.com/Zooip/gorg_service/blob/master/lib/gorg_service/message.rb)
|
133
|
+
|
134
|
+
It provides 4 attributes :
|
135
|
+
|
136
|
+
- `event` : this is the same as the routing key
|
137
|
+
- `id`: message UUID
|
138
|
+
- `errors`: `Hash` containing the message error log with previous errors
|
139
|
+
- `data`: `Hash` containing the data to be processed
|
60
140
|
|
61
141
|
## Development
|
62
142
|
|
data/gorg_service.gemspec
CHANGED
@@ -31,4 +31,8 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "bundler", "~> 1.11"
|
32
32
|
spec.add_development_dependency "rake", "~> 10.0"
|
33
33
|
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
+
spec.add_development_dependency "codeclimate-test-reporter", "~> 3.0"
|
35
|
+
spec.add_development_dependency 'bogus', '~> 0.1.6'
|
36
|
+
spec.add_development_dependency 'bunny-mock', '~> 1.4'
|
37
|
+
spec.add_development_dependency 'byebug', '~> 9.0'
|
34
38
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# Add configuration features to GorgService
|
1
2
|
class GorgService
|
2
3
|
class << self
|
3
4
|
attr_writer :configuration
|
@@ -8,10 +9,12 @@ class GorgService
|
|
8
9
|
|
9
10
|
|
10
11
|
def configure
|
12
|
+
@configuration = Configuration.new
|
11
13
|
yield(configuration)
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
17
|
+
# Hold configuration of GorgService in instance variables
|
15
18
|
class Configuration
|
16
19
|
attr_accessor :application_name,
|
17
20
|
:application_id,
|
@@ -23,11 +26,11 @@ class GorgService
|
|
23
26
|
:rabbitmq_max_attempts,
|
24
27
|
:rabbitmq_user,
|
25
28
|
:rabbitmq_password,
|
26
|
-
:
|
29
|
+
:rabbitmq_vhost,
|
30
|
+
:message_handler_map
|
27
31
|
|
28
32
|
|
29
33
|
def initialize
|
30
|
-
|
31
34
|
@application_name = "GorgService"
|
32
35
|
@application_id = "gs"
|
33
36
|
@message_handler_map = {}
|
@@ -38,6 +41,7 @@ class GorgService
|
|
38
41
|
@rabbitmq_exchange_name = "exchange"
|
39
42
|
@rabbitmq_user = nil
|
40
43
|
@rabbitmq_password = nil
|
44
|
+
@rabbitmq_vhost = "/"
|
41
45
|
@rabbitmq_max_attempts = 48 #24h with default timeout
|
42
46
|
end
|
43
47
|
end
|
data/lib/gorg_service/errors.rb
CHANGED
@@ -2,17 +2,36 @@
|
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
4
|
class GorgService
|
5
|
+
|
6
|
+
#Common behavior of failling errors
|
5
7
|
class FailError < StandardError
|
6
8
|
attr_reader :error_raised
|
7
9
|
|
8
|
-
def initialize(error_raised)
|
10
|
+
def initialize(message = nil, error_raised = nil)
|
11
|
+
@message = message
|
9
12
|
@error_raised = error_raised
|
10
13
|
end
|
14
|
+
|
15
|
+
def message
|
16
|
+
@message
|
17
|
+
end
|
18
|
+
|
19
|
+
def type
|
20
|
+
""
|
21
|
+
end
|
11
22
|
end
|
12
23
|
|
24
|
+
#Softfail error : This message should be processed again later
|
13
25
|
class SoftfailError < FailError
|
26
|
+
def type
|
27
|
+
"softfail"
|
28
|
+
end
|
14
29
|
end
|
15
30
|
|
31
|
+
#Hardfail error : This message is not processable and will never be
|
16
32
|
class HardfailError < FailError
|
33
|
+
def type
|
34
|
+
"hardfail"
|
35
|
+
end
|
17
36
|
end
|
18
37
|
end
|
@@ -6,16 +6,13 @@ require "bunny"
|
|
6
6
|
class GorgService
|
7
7
|
class Listener
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@host=host
|
11
|
-
@port=port
|
9
|
+
def initialize(bunny_session: nil,queue_name: "gapps", exchange_name: nil, message_handler_map: {default: DefaultMessageHandler}, deferred_time: 1800000, max_attempts: 48)
|
12
10
|
@queue_name=queue_name
|
13
11
|
@exchange_name=exchange_name
|
14
|
-
@rabbitmq_user=rabbitmq_user
|
15
|
-
@rabbitmq_password=rabbitmq_password
|
16
12
|
@message_handler_map=message_handler_map
|
17
13
|
@deferred_time=deferred_time
|
18
|
-
|
14
|
+
@max_attempts=max_attempts
|
15
|
+
@rmq_connection=bunny_session
|
19
16
|
end
|
20
17
|
|
21
18
|
def listen
|
@@ -31,52 +28,55 @@ class GorgService
|
|
31
28
|
|
32
29
|
q.bind(@exchange_name, :routing_key => '#')
|
33
30
|
|
34
|
-
puts " [*] Waiting for messages in #{q.name}. To exit press CTRL+C"
|
35
31
|
ch.prefetch(1)
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
else
|
47
|
-
raise HardfailError.new(), "Unknown routing_key"
|
48
|
-
end
|
49
|
-
rescue SoftfailError => e
|
50
|
-
message.log_error(e)
|
51
|
-
puts " [*] SOFTFAIL ERROR : #{e.message}"
|
52
|
-
if message.errors.count > 5
|
53
|
-
puts " [*] DISCARD MESSAGE : #{message.errors.count} errors in message log"
|
54
|
-
else
|
55
|
-
|
56
|
-
send_to_deferred_queue(message)
|
57
|
-
end
|
58
|
-
rescue HardfailError => e
|
59
|
-
puts " [*] SOFTFAIL ERROR : #{e.message}"
|
60
|
-
puts " [*] DISCARD MESSAGE"
|
61
|
-
end
|
62
|
-
|
63
|
-
ch.ack(delivery_info.delivery_tag)
|
64
|
-
end
|
65
|
-
rescue Interrupt => _
|
66
|
-
conn.close
|
33
|
+
q.subscribe(:manual_ack => true) do |delivery_info, properties, body|
|
34
|
+
routing_key=delivery_info[:routing_key]
|
35
|
+
puts " [#] Received message with routing key #{routing_key} containing : #{body}"
|
36
|
+
message_handler=message_handler_for routing_key
|
37
|
+
message=Message.parse_body(body)
|
38
|
+
|
39
|
+
call_message_handler(message_handler, message)
|
40
|
+
|
41
|
+
ch.ack(delivery_info.delivery_tag)
|
67
42
|
end
|
43
|
+
|
68
44
|
end
|
69
45
|
|
70
46
|
def rmq_connection
|
71
|
-
|
72
|
-
|
47
|
+
@rmq_connection.start unless @rmq_connection.connected?
|
48
|
+
@rmq_connection
|
49
|
+
end
|
50
|
+
|
51
|
+
def call_message_handler(message_handler, message)
|
52
|
+
begin
|
53
|
+
raise HardfailError.new(), "Routing error" unless message_handler
|
54
|
+
message_handler.new(message)
|
55
|
+
|
56
|
+
rescue SoftfailError => e
|
57
|
+
message.log_error(e)
|
58
|
+
process_softfail(e,message)
|
59
|
+
|
60
|
+
rescue HardfailError => e
|
61
|
+
message.log_error(e)
|
62
|
+
process_hardfail(e)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def process_softfail(e,message)
|
67
|
+
puts " [*] SOFTFAIL ERROR : #{e.message}"
|
68
|
+
if message.errors.count >= @max_attempts
|
69
|
+
puts " [*] DISCARD MESSAGE : #{message.errors.count} errors in message log"
|
73
70
|
else
|
74
|
-
|
75
|
-
@rmq_connection.start
|
76
|
-
@rmq_connection
|
71
|
+
send_to_deferred_queue(message)
|
77
72
|
end
|
78
73
|
end
|
79
74
|
|
75
|
+
def process_hardfail(e)
|
76
|
+
puts " [*] SOFTFAIL ERROR : #{e.message}"
|
77
|
+
puts " [*] DISCARD MESSAGE"
|
78
|
+
end
|
79
|
+
|
80
80
|
def send_to_deferred_queue(msg)
|
81
81
|
conn=rmq_connection
|
82
82
|
@delayed_chan||=conn.create_channel
|
@@ -89,7 +89,7 @@ class GorgService
|
|
89
89
|
}
|
90
90
|
)
|
91
91
|
puts " [*] DEFER MESSAGE : message sent to #{@queue_name}_deferred qith routing key #{msg.event}"
|
92
|
-
q.publish(msg.
|
92
|
+
q.publish(msg.to_json, :routing_key => msg.event)
|
93
93
|
end
|
94
94
|
|
95
95
|
def message_handler_for routing_key
|
data/lib/gorg_service/message.rb
CHANGED
@@ -23,16 +23,8 @@ class GorgService
|
|
23
23
|
@errors=errors
|
24
24
|
end
|
25
25
|
|
26
|
-
# Generate new id
|
27
|
-
#
|
28
|
-
# TODO
|
29
|
-
# Avoid using AppConfig
|
30
|
-
def generate_id
|
31
|
-
"#{GorgService.configuration.application_id}_#{Time.now.to_i}"
|
32
|
-
end
|
33
|
-
|
34
26
|
# Generate RabbitMQ message body
|
35
|
-
def
|
27
|
+
def to_json
|
36
28
|
body={
|
37
29
|
id: @id,
|
38
30
|
event: @event,
|
@@ -48,7 +40,7 @@ class GorgService
|
|
48
40
|
# Log FailError in message body
|
49
41
|
def log_error error
|
50
42
|
errors<<{
|
51
|
-
type: error.
|
43
|
+
type: error.type.downcase,
|
52
44
|
message: error.message,
|
53
45
|
timestamp: Time.now.utc.iso8601,
|
54
46
|
extra: error.error_raised.inspect,
|
@@ -66,15 +58,19 @@ class GorgService
|
|
66
58
|
begin
|
67
59
|
json_body=JSON.parse(body)
|
68
60
|
|
69
|
-
self.new(
|
61
|
+
msg=self.new(
|
70
62
|
id: json_body["id"],
|
71
63
|
event: json_body["event"],
|
72
64
|
data: convert_keys_to_sym(json_body["data"]),
|
73
|
-
errors:
|
65
|
+
errors: json_body["errors"]&&json_body["errors"].map{|e| convert_keys_to_sym(e)},
|
74
66
|
)
|
75
67
|
|
68
|
+
msg.errors=msg.errors.each do |e|
|
69
|
+
e[:timestamp]=(e[:timestamp] ? DateTime.parse(e[:timestamp]) : nil)
|
70
|
+
end
|
71
|
+
msg
|
76
72
|
rescue JSON::ParserError => e
|
77
|
-
raise HardfailError(e), "Unprocessable message : Unable to parse JSON message body"
|
73
|
+
raise GorgService::HardfailError.new(e), "Unprocessable message : Unable to parse JSON message body"
|
78
74
|
end
|
79
75
|
end
|
80
76
|
|
@@ -91,6 +87,14 @@ class GorgService
|
|
91
87
|
end
|
92
88
|
s2s[input_hash]
|
93
89
|
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
# Generate new id
|
94
|
+
def generate_id
|
95
|
+
"#{GorgService.configuration.application_id}_#{Time.now.to_i}"
|
96
|
+
end
|
97
|
+
|
94
98
|
|
95
99
|
|
96
100
|
end
|
data/lib/gorg_service/version.rb
CHANGED
data/lib/gorg_service.rb
CHANGED
@@ -6,20 +6,44 @@ require "gorg_service/message"
|
|
6
6
|
require "gorg_service/message_handler"
|
7
7
|
|
8
8
|
class GorgService
|
9
|
-
def initialize()
|
10
|
-
|
9
|
+
def initialize(listener: nil, bunny_session: nil)
|
10
|
+
|
11
|
+
@bunny_session= bunny_session || Bunny.new(
|
12
|
+
:hostname => GorgService.configuration.rabbitmq_host,
|
13
|
+
:port => GorgService.configuration.rabbitmq_port,
|
14
|
+
:user => GorgService.configuration.rabbitmq_user,
|
15
|
+
:pass => GorgService.configuration.rabbitmq_password,
|
16
|
+
:vhost => GorgService.configuration.rabbitmq_vhost
|
17
|
+
)
|
18
|
+
|
19
|
+
@listener= listener || Listener.new(
|
20
|
+
bunny_session: @bunny_session,
|
11
21
|
message_handler_map:GorgService.configuration.message_handler_map,
|
12
|
-
host: GorgService.configuration.rabbitmq_host,
|
13
|
-
port: GorgService.configuration.rabbitmq_port,
|
14
22
|
queue_name: GorgService.configuration.rabbitmq_queue_name,
|
15
23
|
exchange_name: GorgService.configuration.rabbitmq_exchange_name,
|
16
|
-
rabbitmq_user: GorgService.configuration.rabbitmq_user,
|
17
|
-
rabbitmq_password: GorgService.configuration.rabbitmq_password,
|
18
24
|
deferred_time: GorgService.configuration.rabbitmq_deferred_time,
|
25
|
+
max_attempts: GorgService.configuration.rabbitmq_max_attempts,
|
19
26
|
)
|
20
27
|
end
|
21
28
|
|
22
29
|
def run
|
30
|
+
begin
|
31
|
+
self.start
|
32
|
+
puts " [*] Waiting for messages. To exit press CTRL+C"
|
33
|
+
loop do
|
34
|
+
sleep(1)
|
35
|
+
end
|
36
|
+
rescue SystemExit, Interrupt => _
|
37
|
+
self.stop
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def start
|
42
|
+
@bunny_session.start
|
23
43
|
@listener.listen
|
24
44
|
end
|
45
|
+
|
46
|
+
def stop
|
47
|
+
@bunny_session.close
|
48
|
+
end
|
25
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gorg_service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre Narbonne
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -72,6 +72,62 @@ dependencies:
|
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '3.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: codeclimate-test-reporter
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '3.0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '3.0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: bogus
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 0.1.6
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.1.6
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: bunny-mock
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.4'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '1.4'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: byebug
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '9.0'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '9.0'
|
75
131
|
description:
|
76
132
|
email:
|
77
133
|
- alexandre.narbonne@gadz.org
|
@@ -81,6 +137,7 @@ extra_rdoc_files: []
|
|
81
137
|
files:
|
82
138
|
- ".gitignore"
|
83
139
|
- ".rspec"
|
140
|
+
- ".todo.reek"
|
84
141
|
- ".travis.yml"
|
85
142
|
- Gemfile
|
86
143
|
- LICENSE.txt
|