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.
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: