freddy 0.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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.npmignore +8 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +49 -0
- data/LICENCE.txt +22 -0
- data/README.md +163 -0
- data/Rakefile +7 -0
- data/freddy.gemspec +25 -0
- data/lib/freddy.rb +86 -0
- data/lib/freddy/consumer.rb +64 -0
- data/lib/freddy/delivery.rb +10 -0
- data/lib/freddy/message_handler.rb +20 -0
- data/lib/freddy/message_handlers.rb +67 -0
- data/lib/freddy/producer.rb +28 -0
- data/lib/freddy/request.rb +106 -0
- data/lib/freddy/request_manager.rb +41 -0
- data/lib/freddy/responder_handler.rb +30 -0
- data/lib/freddy/sync_response_container.rb +32 -0
- data/spec/freddy/consumer_spec.rb +23 -0
- data/spec/freddy/freddy_spec.rb +223 -0
- data/spec/freddy/message_handler_spec.rb +27 -0
- data/spec/freddy/request_spec.rb +38 -0
- data/spec/freddy/responder_handler_spec.rb +33 -0
- data/spec/integration/logging_spec.rb +33 -0
- data/spec/spec_helper.rb +45 -0
- metadata +150 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Freddy::MessageHandler do
|
4
|
+
subject(:handler) { described_class.new(adapter, delivery) }
|
5
|
+
|
6
|
+
let(:adapter) { double }
|
7
|
+
let(:delivery) { double(properties: properties) }
|
8
|
+
let(:properties) { {reply_to: reply_to} }
|
9
|
+
|
10
|
+
let(:reply_to) { double }
|
11
|
+
|
12
|
+
describe '#success' do
|
13
|
+
it 'delegates to the adapter' do
|
14
|
+
expect(adapter).to receive(:success).with(reply_to, x: 'y')
|
15
|
+
|
16
|
+
subject.success(x: 'y')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#error' do
|
21
|
+
it 'delegates to the adapter' do
|
22
|
+
expect(adapter).to receive(:error).with(reply_to, error: 'text')
|
23
|
+
|
24
|
+
subject.error(error: 'text')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Freddy::Request do
|
4
|
+
let(:freddy) { Freddy.build(logger, config) }
|
5
|
+
|
6
|
+
let(:destination) { random_destination }
|
7
|
+
let(:payload) { {pay: 'load'} }
|
8
|
+
|
9
|
+
let(:request) { freddy.request }
|
10
|
+
|
11
|
+
it 'raises empty responder exception when responding without callback' do
|
12
|
+
expect {@responder = request.respond_to destination }.to raise_error described_class::EmptyResponder
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'requesting from multiple threads' do
|
16
|
+
let(:nr_of_threads) { 10 }
|
17
|
+
|
18
|
+
before do
|
19
|
+
freddy.respond_to 'thread-queue' do |payload, msg_handler|
|
20
|
+
msg_handler.success(payload)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'handles multiple threads' do
|
25
|
+
msg_counter = 0
|
26
|
+
nr_of_threads.times.map do
|
27
|
+
Thread.new do
|
28
|
+
response = freddy.deliver_with_response 'thread-queue', payload
|
29
|
+
msg_counter += 1
|
30
|
+
expect(response).to eq(payload)
|
31
|
+
end
|
32
|
+
end.each(&:join)
|
33
|
+
expect(msg_counter).to eq(nr_of_threads)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Freddy::ResponderHandler do
|
4
|
+
let(:freddy) { Freddy.build(logger, config) }
|
5
|
+
|
6
|
+
let(:destination) { random_destination }
|
7
|
+
let(:payload) { {pay: 'load'} }
|
8
|
+
|
9
|
+
it 'can cancel listening for messages' do
|
10
|
+
consumer_handler = freddy.respond_to destination do
|
11
|
+
@messages_count ||= 0
|
12
|
+
@messages_count += 1
|
13
|
+
end
|
14
|
+
deliver
|
15
|
+
consumer_handler.cancel
|
16
|
+
deliver
|
17
|
+
|
18
|
+
expect(@messages_count).to eq 1
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'can join the thread to the consumer' do
|
22
|
+
consumer_handler = freddy.respond_to destination do
|
23
|
+
end
|
24
|
+
unreachable = true
|
25
|
+
Thread.new do
|
26
|
+
consumer_handler.join
|
27
|
+
unreachable = false
|
28
|
+
end
|
29
|
+
wait_for { unreachable }
|
30
|
+
expect(unreachable).to be(true)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Logging' do
|
4
|
+
let(:freddy1) { Freddy.build(logger1, config) }
|
5
|
+
let(:freddy2) { Freddy.build(logger2, config) }
|
6
|
+
|
7
|
+
let(:logger1) { spy('logger1') }
|
8
|
+
let(:logger2) { spy('logger2') }
|
9
|
+
|
10
|
+
let(:destination) { random_destination }
|
11
|
+
let(:payload) { {pay: 'load'} }
|
12
|
+
|
13
|
+
before do
|
14
|
+
freddy1.respond_to destination do |payload, msg_handler|
|
15
|
+
msg_handler.success
|
16
|
+
end
|
17
|
+
|
18
|
+
freddy2.deliver_with_response(destination, payload) { }
|
19
|
+
default_sleep
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'logs all consumed messages' do
|
23
|
+
expect(logger1).to have_received(:debug).with(/Listening for requests on \S+/)
|
24
|
+
expect(logger1).to have_received(:debug).with(/Consuming messages on \S+/)
|
25
|
+
expect(logger1).to have_received(:debug).with(/Received message on \S+ with payload {:pay=>"load"}/)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'logs all produced messages' do
|
29
|
+
expect(logger2).to have_received(:debug).with(/Consuming messages on \S+/)
|
30
|
+
expect(logger2).to have_received(:debug).with(/Publishing request to \S+, waiting for response on amq.gen-\S+ with correlation_id .*/)
|
31
|
+
expect(logger2).to have_received(:debug).with(/Producing message {:pay=>"load"} to \S+/)
|
32
|
+
end
|
33
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'securerandom'
|
3
|
+
require 'freddy'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
|
+
config.run_all_when_everything_filtered = true
|
8
|
+
config.filter_run :focus
|
9
|
+
config.order = 'random'
|
10
|
+
end
|
11
|
+
|
12
|
+
class Freddy::Consumer
|
13
|
+
def create_queue(queue_name)
|
14
|
+
#want to auto_delete queues while testing
|
15
|
+
@channel.queue(queue_name, auto_delete: true)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def random_destination
|
20
|
+
SecureRandom.hex
|
21
|
+
end
|
22
|
+
|
23
|
+
def default_sleep
|
24
|
+
sleep 0.05
|
25
|
+
end
|
26
|
+
|
27
|
+
def wait_for(&block)
|
28
|
+
100.times do
|
29
|
+
return if block.call
|
30
|
+
sleep 0.005
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def deliver(custom_destination = destination)
|
35
|
+
freddy.deliver custom_destination, payload
|
36
|
+
default_sleep
|
37
|
+
end
|
38
|
+
|
39
|
+
def logger
|
40
|
+
Logger.new(STDOUT).tap { |l| l.level = Logger::ERROR }
|
41
|
+
end
|
42
|
+
|
43
|
+
def config
|
44
|
+
{host: 'localhost', port: 5672, user: 'guest', pass: 'guest'}
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: freddy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Urmas Talimaa
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bunny
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.6.3
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.6.3
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: symbolizer
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: hamster
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.0.1.pre.rc3
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.0.1.pre.rc3
|
83
|
+
description: Messaging API
|
84
|
+
email:
|
85
|
+
- urmas.talimaa@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- ".npmignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".ruby-gemset"
|
94
|
+
- ".ruby-version"
|
95
|
+
- ".travis.yml"
|
96
|
+
- Gemfile
|
97
|
+
- Gemfile.lock
|
98
|
+
- LICENCE.txt
|
99
|
+
- README.md
|
100
|
+
- Rakefile
|
101
|
+
- freddy.gemspec
|
102
|
+
- lib/freddy.rb
|
103
|
+
- lib/freddy/consumer.rb
|
104
|
+
- lib/freddy/delivery.rb
|
105
|
+
- lib/freddy/message_handler.rb
|
106
|
+
- lib/freddy/message_handlers.rb
|
107
|
+
- lib/freddy/producer.rb
|
108
|
+
- lib/freddy/request.rb
|
109
|
+
- lib/freddy/request_manager.rb
|
110
|
+
- lib/freddy/responder_handler.rb
|
111
|
+
- lib/freddy/sync_response_container.rb
|
112
|
+
- spec/freddy/consumer_spec.rb
|
113
|
+
- spec/freddy/freddy_spec.rb
|
114
|
+
- spec/freddy/message_handler_spec.rb
|
115
|
+
- spec/freddy/request_spec.rb
|
116
|
+
- spec/freddy/responder_handler_spec.rb
|
117
|
+
- spec/integration/logging_spec.rb
|
118
|
+
- spec/spec_helper.rb
|
119
|
+
homepage:
|
120
|
+
licenses:
|
121
|
+
- Private
|
122
|
+
metadata: {}
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubyforge_project:
|
139
|
+
rubygems_version: 2.2.2
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
142
|
+
summary: API for inter-application messaging supporting acknowledgements and request-response
|
143
|
+
test_files:
|
144
|
+
- spec/freddy/consumer_spec.rb
|
145
|
+
- spec/freddy/freddy_spec.rb
|
146
|
+
- spec/freddy/message_handler_spec.rb
|
147
|
+
- spec/freddy/request_spec.rb
|
148
|
+
- spec/freddy/responder_handler_spec.rb
|
149
|
+
- spec/integration/logging_spec.rb
|
150
|
+
- spec/spec_helper.rb
|