mantle 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +2 -0
  5. data/Gemfile.lock +55 -0
  6. data/README.md +107 -0
  7. data/Rakefile +5 -0
  8. data/bin/mantle +14 -0
  9. data/circle.yml +3 -0
  10. data/config.ru +7 -0
  11. data/lib/generators/mantle/install/install_generator.rb +20 -0
  12. data/lib/generators/mantle/install/templates/mantle.rb +9 -0
  13. data/lib/generators/mantle/install/templates/mantle_message_handler.rb +7 -0
  14. data/lib/mantle.rb +45 -0
  15. data/lib/mantle/catch_up.rb +84 -0
  16. data/lib/mantle/cli.rb +73 -0
  17. data/lib/mantle/configuration.rb +27 -0
  18. data/lib/mantle/error.rb +6 -0
  19. data/lib/mantle/local_redis.rb +42 -0
  20. data/lib/mantle/message.rb +21 -0
  21. data/lib/mantle/message_bus.rb +44 -0
  22. data/lib/mantle/message_handler.rb +7 -0
  23. data/lib/mantle/message_router.rb +16 -0
  24. data/lib/mantle/railtie.rb +6 -0
  25. data/lib/mantle/version.rb +3 -0
  26. data/lib/mantle/workers/catch_up_cleanup_worker.rb +15 -0
  27. data/lib/mantle/workers/process_worker.rb +15 -0
  28. data/mantle.gemspec +25 -0
  29. data/spec/lib/mantle/catch_up_spec.rb +174 -0
  30. data/spec/lib/mantle/configuration_spec.rb +59 -0
  31. data/spec/lib/mantle/local_redis_spec.rb +29 -0
  32. data/spec/lib/mantle/message_bus_spec.rb +50 -0
  33. data/spec/lib/mantle/message_handler_spec.rb +12 -0
  34. data/spec/lib/mantle/message_router_spec.rb +61 -0
  35. data/spec/lib/mantle/message_spec.rb +23 -0
  36. data/spec/lib/mantle/workers/catch_up_cleanup_worker_spec.rb +20 -0
  37. data/spec/lib/mantle/workers/process_worker_spec.rb +25 -0
  38. data/spec/lib/mantle_spec.rb +26 -0
  39. data/spec/spec_helper.rb +18 -0
  40. 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
+
@@ -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: