mantle 2.0.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 +18 -0
- data/.rspec +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +55 -0
- data/README.md +107 -0
- data/Rakefile +5 -0
- data/bin/mantle +14 -0
- data/circle.yml +3 -0
- data/config.ru +7 -0
- data/lib/generators/mantle/install/install_generator.rb +20 -0
- data/lib/generators/mantle/install/templates/mantle.rb +9 -0
- data/lib/generators/mantle/install/templates/mantle_message_handler.rb +7 -0
- data/lib/mantle.rb +45 -0
- data/lib/mantle/catch_up.rb +84 -0
- data/lib/mantle/cli.rb +73 -0
- data/lib/mantle/configuration.rb +27 -0
- data/lib/mantle/error.rb +6 -0
- data/lib/mantle/local_redis.rb +42 -0
- data/lib/mantle/message.rb +21 -0
- data/lib/mantle/message_bus.rb +44 -0
- data/lib/mantle/message_handler.rb +7 -0
- data/lib/mantle/message_router.rb +16 -0
- data/lib/mantle/railtie.rb +6 -0
- data/lib/mantle/version.rb +3 -0
- data/lib/mantle/workers/catch_up_cleanup_worker.rb +15 -0
- data/lib/mantle/workers/process_worker.rb +15 -0
- data/mantle.gemspec +25 -0
- data/spec/lib/mantle/catch_up_spec.rb +174 -0
- data/spec/lib/mantle/configuration_spec.rb +59 -0
- data/spec/lib/mantle/local_redis_spec.rb +29 -0
- data/spec/lib/mantle/message_bus_spec.rb +50 -0
- data/spec/lib/mantle/message_handler_spec.rb +12 -0
- data/spec/lib/mantle/message_router_spec.rb +61 -0
- data/spec/lib/mantle/message_spec.rb +23 -0
- data/spec/lib/mantle/workers/catch_up_cleanup_worker_spec.rb +20 -0
- data/spec/lib/mantle/workers/process_worker_spec.rb +25 -0
- data/spec/lib/mantle_spec.rb +26 -0
- data/spec/spec_helper.rb +18 -0
- metadata +152 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle::LocalRedis do
|
4
|
+
describe ".set_message_successfully_received" do
|
5
|
+
it "saves the time" do
|
6
|
+
time = "1234"
|
7
|
+
response = Mantle::LocalRedis.set_message_successfully_received(time)
|
8
|
+
expect(Mantle::LocalRedis.last_message_successfully_received_at).to eq(1234.0)
|
9
|
+
expect(response).to eq(1234.0)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".last_message_successfully_received_at" do
|
14
|
+
it "returns time as a float" do
|
15
|
+
Mantle::LocalRedis.set_message_successfully_received
|
16
|
+
expect(Mantle::LocalRedis.last_message_successfully_received_at).to be_a(Float)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns nil if nothing has been set" do
|
20
|
+
expect(Mantle::LocalRedis.last_message_successfully_received_at).to eq(nil)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sets and gets the last time the catch up was cleaned up' do
|
25
|
+
Mantle::LocalRedis.set_catch_up_cleanup(1234.0)
|
26
|
+
expect(Mantle::LocalRedis.last_catch_up_cleanup_at).to eq(1234.0)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle::MessageBus do
|
4
|
+
describe "#publish" do
|
5
|
+
it "sends the message to the message on the right channel" do
|
6
|
+
redis = double("redis")
|
7
|
+
channel = "create:deal"
|
8
|
+
message = { id: 1 }
|
9
|
+
json_message = JSON.generate(message)
|
10
|
+
|
11
|
+
mb = Mantle::MessageBus.new
|
12
|
+
mb.redis = redis
|
13
|
+
|
14
|
+
expect(redis).to receive(:publish).with(channel, json_message)
|
15
|
+
|
16
|
+
mb.publish(channel, message)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#listen" do
|
21
|
+
it "delegates to catch up" do
|
22
|
+
# Don't want to see the output of the log
|
23
|
+
Mantle.logger.level = Logger::WARN
|
24
|
+
|
25
|
+
mb = Mantle::MessageBus.new
|
26
|
+
expect(mb).to receive(:catch_up) { true }
|
27
|
+
expect(mb).to receive(:subscribe_to_channels) { true }
|
28
|
+
|
29
|
+
mb.listen
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#catchup" do
|
34
|
+
it "delegates to the catch up handler" do
|
35
|
+
expect_any_instance_of(Mantle::CatchUp).to receive(:catch_up)
|
36
|
+
Mantle::MessageBus.new.catch_up
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#subscribe_to_channels" do
|
41
|
+
it "raises without redis connection" do
|
42
|
+
mb = Mantle::MessageBus.new
|
43
|
+
mb.redis = nil
|
44
|
+
|
45
|
+
expect {
|
46
|
+
mb.subscribe_to_channels
|
47
|
+
}.to raise_error(Mantle::Error::MissingRedisConnection)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle::MessageHandler do
|
4
|
+
describe ".receive" do
|
5
|
+
it 'raises with warning about implementation' do
|
6
|
+
expect {
|
7
|
+
Mantle::MessageHandler.receive("person:update", {})
|
8
|
+
}.to raise_error(Mantle::Error::MissingImplementation)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle::MessageRouter do
|
4
|
+
let(:message) { {'data' => {'whatever' => 1234}} }
|
5
|
+
|
6
|
+
describe "#route" do
|
7
|
+
it "doesn't enqueue a job if no message is supplied" do
|
8
|
+
expect {
|
9
|
+
Mantle::MessageRouter.new("person:create", nil).route
|
10
|
+
}.to_not change{ Mantle::Workers::ProcessWorker.jobs.size }
|
11
|
+
end
|
12
|
+
|
13
|
+
context "routing create messages" do
|
14
|
+
it "enqueues job and gets message" do
|
15
|
+
expect {
|
16
|
+
Mantle::MessageRouter.new("person:create", message).route
|
17
|
+
}.to change(Mantle::Workers::ProcessWorker.jobs, :size).by(1)
|
18
|
+
|
19
|
+
args = Mantle::Workers::ProcessWorker.jobs.first["args"]
|
20
|
+
expect(args.first).to eq("person:create")
|
21
|
+
expect(args.last).to eq(message)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "routing update messages" do
|
26
|
+
it "enqueues job and gets message" do
|
27
|
+
expect {
|
28
|
+
Mantle::MessageRouter.new("person:update", message).route
|
29
|
+
}.to change(Mantle::Workers::ProcessWorker.jobs, :size).by(1)
|
30
|
+
|
31
|
+
args = Mantle::Workers::ProcessWorker.jobs.first["args"]
|
32
|
+
expect(args.first).to eq("person:update")
|
33
|
+
expect(args.last).to eq(message)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "routing delete messages" do
|
38
|
+
it "enqueues job and gets message" do
|
39
|
+
expect {
|
40
|
+
Mantle::MessageRouter.new("person:delete", message).route
|
41
|
+
}.to change(Mantle::Workers::ProcessWorker.jobs, :size).by(1)
|
42
|
+
|
43
|
+
args = Mantle::Workers::ProcessWorker.jobs.first["args"]
|
44
|
+
expect(args.first).to eq("person:delete")
|
45
|
+
expect(args.last).to eq(message)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "routing non-CRUD messages" do
|
50
|
+
it "enqueues job and gets message" do
|
51
|
+
expect {
|
52
|
+
Mantle::MessageRouter.new("user:login", message).route
|
53
|
+
}.to change(Mantle::Workers::ProcessWorker.jobs, :size).by(1)
|
54
|
+
|
55
|
+
args = Mantle::Workers::ProcessWorker.jobs.first["args"]
|
56
|
+
expect(args.first).to eq("user:login")
|
57
|
+
expect(args.last).to eq(message)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle::Message do
|
4
|
+
describe "#publish" do
|
5
|
+
it "sends message to message bus" do
|
6
|
+
bus = double("message bus")
|
7
|
+
catch_up = double("catch up")
|
8
|
+
channel = "create:person"
|
9
|
+
message = { id: 1 }
|
10
|
+
|
11
|
+
mantle_message = Mantle::Message.new(channel)
|
12
|
+
mantle_message.message_bus = bus
|
13
|
+
mantle_message.catch_up = catch_up
|
14
|
+
|
15
|
+
expect(bus).to receive(:publish).with(channel, message)
|
16
|
+
expect(catch_up).to receive(:add_message).with(channel, message)
|
17
|
+
|
18
|
+
mantle_message.publish(message)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle::Workers::CatchUpCleanupWorker do
|
4
|
+
describe "#perform" do
|
5
|
+
it "clears expired messages from catch up set" do
|
6
|
+
cu = double("catch_up")
|
7
|
+
allow(Mantle::CatchUp).to receive_messages(new: cu)
|
8
|
+
|
9
|
+
expect(cu).to receive(:clear_expired)
|
10
|
+
Mantle::Workers::CatchUpCleanupWorker.new.perform
|
11
|
+
end
|
12
|
+
|
13
|
+
it "sets catch up cleanup time" do
|
14
|
+
expect(Mantle::LocalRedis).to receive(:set_catch_up_cleanup)
|
15
|
+
Mantle::Workers::CatchUpCleanupWorker.new.perform
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle::Workers::ProcessWorker do
|
4
|
+
let(:message) { {'data' => {'whatever' => 1234}} }
|
5
|
+
|
6
|
+
describe "#perform" do
|
7
|
+
it "processes message" do
|
8
|
+
expect(Mantle).to receive(:receive_message).with("person:update", message) { true }
|
9
|
+
Mantle::Workers::ProcessWorker.new.perform("person:update", message)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "sets the last processed message" do
|
13
|
+
allow(Mantle).to receive_messages(receive_message: true)
|
14
|
+
expect(Mantle::LocalRedis).to receive(:set_message_successfully_received){ true }
|
15
|
+
Mantle::Workers::ProcessWorker.new.perform("person:update", message)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "runs the expire clean on catch up" do
|
19
|
+
allow(Mantle).to receive_messages(receive_message: true)
|
20
|
+
expect_any_instance_of(Mantle::CatchUp).to receive(:enqueue_clear_if_ready)
|
21
|
+
Mantle::Workers::ProcessWorker.new.perform("person:update", message)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mantle do
|
4
|
+
describe ".configure" do
|
5
|
+
it 'allows multiple configuration' do
|
6
|
+
Mantle.configure { |c| }
|
7
|
+
Mantle.configuration.message_bus_redis = "redis"
|
8
|
+
expect(Mantle.configuration.message_bus_redis).to eq("redis")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe ".receive_message" do
|
13
|
+
it 'delegates to message handler' do
|
14
|
+
expect(Mantle.configuration.message_handler).to receive(:receive).with("deal:update", {})
|
15
|
+
Mantle.receive_message("deal:update", {})
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".logger" do
|
20
|
+
it 'delegates to logger on configuration' do
|
21
|
+
expect(Mantle.logger).to eq(Mantle.configuration.logger)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'mantle'
|
2
|
+
require 'pry'
|
3
|
+
require 'sidekiq/testing'
|
4
|
+
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.before(:each) do
|
8
|
+
|
9
|
+
Mantle.configure do |config|
|
10
|
+
config.message_bus_redis = Redis.new(host: "localhost", db: 9)
|
11
|
+
end
|
12
|
+
|
13
|
+
Mantle::LocalRedis.set_message_successfully_received(nil)
|
14
|
+
Mantle::LocalRedis.set_catch_up_cleanup(nil)
|
15
|
+
|
16
|
+
Sidekiq::Worker.clear_all
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mantle
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Grant Ammons
|
8
|
+
- Brandon Hilkert
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-05-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: redis
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: sidekiq
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rspec
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: pry
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
description: Ruby application message bus subscriptions with Sidekiq and Redis Pubsub.
|
71
|
+
email:
|
72
|
+
- gammons@gmail.com
|
73
|
+
- brandonhilkert@gmail.com
|
74
|
+
executables:
|
75
|
+
- mantle
|
76
|
+
extensions: []
|
77
|
+
extra_rdoc_files: []
|
78
|
+
files:
|
79
|
+
- ".gitignore"
|
80
|
+
- ".rspec"
|
81
|
+
- Gemfile
|
82
|
+
- Gemfile.lock
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- bin/mantle
|
86
|
+
- circle.yml
|
87
|
+
- config.ru
|
88
|
+
- lib/generators/mantle/install/install_generator.rb
|
89
|
+
- lib/generators/mantle/install/templates/mantle.rb
|
90
|
+
- lib/generators/mantle/install/templates/mantle_message_handler.rb
|
91
|
+
- lib/mantle.rb
|
92
|
+
- lib/mantle/catch_up.rb
|
93
|
+
- lib/mantle/cli.rb
|
94
|
+
- lib/mantle/configuration.rb
|
95
|
+
- lib/mantle/error.rb
|
96
|
+
- lib/mantle/local_redis.rb
|
97
|
+
- lib/mantle/message.rb
|
98
|
+
- lib/mantle/message_bus.rb
|
99
|
+
- lib/mantle/message_handler.rb
|
100
|
+
- lib/mantle/message_router.rb
|
101
|
+
- lib/mantle/railtie.rb
|
102
|
+
- lib/mantle/version.rb
|
103
|
+
- lib/mantle/workers/catch_up_cleanup_worker.rb
|
104
|
+
- lib/mantle/workers/process_worker.rb
|
105
|
+
- mantle.gemspec
|
106
|
+
- spec/lib/mantle/catch_up_spec.rb
|
107
|
+
- spec/lib/mantle/configuration_spec.rb
|
108
|
+
- spec/lib/mantle/local_redis_spec.rb
|
109
|
+
- spec/lib/mantle/message_bus_spec.rb
|
110
|
+
- spec/lib/mantle/message_handler_spec.rb
|
111
|
+
- spec/lib/mantle/message_router_spec.rb
|
112
|
+
- spec/lib/mantle/message_spec.rb
|
113
|
+
- spec/lib/mantle/workers/catch_up_cleanup_worker_spec.rb
|
114
|
+
- spec/lib/mantle/workers/process_worker_spec.rb
|
115
|
+
- spec/lib/mantle_spec.rb
|
116
|
+
- spec/spec_helper.rb
|
117
|
+
homepage: https://github.com/PipelineDeals/mantle
|
118
|
+
licenses: []
|
119
|
+
metadata: {}
|
120
|
+
post_install_message:
|
121
|
+
rdoc_options: []
|
122
|
+
require_paths:
|
123
|
+
- lib
|
124
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
requirements: []
|
135
|
+
rubyforge_project:
|
136
|
+
rubygems_version: 2.4.5
|
137
|
+
signing_key:
|
138
|
+
specification_version: 4
|
139
|
+
summary: Ruby application message bus subscriptions with Sidekiq and Redis Pubsub.
|
140
|
+
test_files:
|
141
|
+
- spec/lib/mantle/catch_up_spec.rb
|
142
|
+
- spec/lib/mantle/configuration_spec.rb
|
143
|
+
- spec/lib/mantle/local_redis_spec.rb
|
144
|
+
- spec/lib/mantle/message_bus_spec.rb
|
145
|
+
- spec/lib/mantle/message_handler_spec.rb
|
146
|
+
- spec/lib/mantle/message_router_spec.rb
|
147
|
+
- spec/lib/mantle/message_spec.rb
|
148
|
+
- spec/lib/mantle/workers/catch_up_cleanup_worker_spec.rb
|
149
|
+
- spec/lib/mantle/workers/process_worker_spec.rb
|
150
|
+
- spec/lib/mantle_spec.rb
|
151
|
+
- spec/spec_helper.rb
|
152
|
+
has_rdoc:
|