routemaster-drain 1.0.5 → 1.1.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 +5 -1
- data/.gitmodules +0 -3
- data/.ruby-version +1 -1
- data/.travis.yml +4 -10
- data/Gemfile +14 -10
- data/Gemfile.lock +96 -62
- data/LICENSE.txt +2 -1
- data/README.md +13 -11
- data/lib/routemaster/cache.rb +16 -41
- data/lib/routemaster/config.rb +4 -0
- data/lib/routemaster/dirty/map.rb +1 -1
- data/lib/routemaster/drain.rb +1 -1
- data/lib/routemaster/fetcher.rb +29 -28
- data/lib/routemaster/jobs/backends/resque.rb +25 -0
- data/lib/routemaster/jobs/backends/sidekiq.rb +27 -0
- data/lib/routemaster/jobs/cache.rb +2 -2
- data/lib/routemaster/jobs/cache_and_sweep.rb +1 -1
- data/lib/routemaster/jobs/client.rb +30 -0
- data/lib/routemaster/jobs/job.rb +23 -0
- data/lib/routemaster/middleware/cache.rb +4 -4
- data/lib/routemaster/middleware/caching.rb +71 -0
- data/routemaster-drain.gemspec +3 -4
- data/spec/routemaster/cache_spec.rb +69 -81
- data/spec/routemaster/drain/caching_spec.rb +2 -2
- data/spec/routemaster/fetcher_spec.rb +6 -2
- data/spec/routemaster/integration/cache_spec.rb +68 -0
- data/spec/routemaster/jobs/backends/backend_examples.rb +21 -0
- data/spec/routemaster/jobs/backends/resque_spec.rb +16 -0
- data/spec/routemaster/jobs/backends/sidekiq_spec.rb +11 -0
- data/spec/routemaster/jobs/client_spec.rb +46 -0
- data/spec/routemaster/middleware/cache_spec.rb +7 -8
- data/spec/spec_helper.rb +5 -0
- metadata +28 -27
@@ -12,7 +12,7 @@ describe Routemaster::Drain::Caching do
|
|
12
12
|
|
13
13
|
let(:app) { described_class.new }
|
14
14
|
let(:listener) { double 'listener' }
|
15
|
-
|
15
|
+
|
16
16
|
before { app.subscribe(listener, prefix: true) }
|
17
17
|
|
18
18
|
let(:path) { '/' }
|
@@ -40,7 +40,7 @@ describe Routemaster::Drain::Caching do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'schedules caching jobs' do
|
43
|
-
|
43
|
+
expect_any_instance_of(Routemaster::Jobs::Client).to receive(:enqueue).exactly(3).times
|
44
44
|
perform
|
45
45
|
end
|
46
46
|
end
|
@@ -1,17 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'spec/support/uses_dotenv'
|
3
|
+
require 'spec/support/uses_redis'
|
3
4
|
require 'spec/support/uses_webmock'
|
4
5
|
require 'routemaster/fetcher'
|
5
6
|
require 'json'
|
6
7
|
|
7
8
|
describe Routemaster::Fetcher do
|
8
9
|
uses_dotenv
|
10
|
+
uses_redis
|
9
11
|
uses_webmock
|
10
12
|
|
11
13
|
describe '.get' do
|
12
14
|
let(:url) { 'https://example.com/widgets/132' }
|
13
15
|
let(:headers) {{}}
|
14
|
-
|
16
|
+
let(:fetcher) { described_class.new }
|
17
|
+
subject { fetcher.get(url, headers: headers) }
|
15
18
|
|
16
19
|
before do
|
17
20
|
@req = stub_request(:get, /example\.com/).to_return(
|
@@ -41,7 +44,8 @@ describe Routemaster::Fetcher do
|
|
41
44
|
it 'uses auth' do
|
42
45
|
subject
|
43
46
|
assert_requested(:get, /example/) do |req|
|
44
|
-
|
47
|
+
credentials = Base64.strict_encode64('username:s3cr3t')
|
48
|
+
expect(req.headers['Authorization']).to eq("Basic #{credentials}")
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'spec/support/uses_redis'
|
3
|
+
require 'spec/support/uses_dotenv'
|
4
|
+
require 'routemaster/cache'
|
5
|
+
require 'webrick'
|
6
|
+
|
7
|
+
RSpec.describe 'Requests with caching' do
|
8
|
+
uses_dotenv
|
9
|
+
uses_redis
|
10
|
+
|
11
|
+
let!(:log) { WEBrick::Log.new '/dev/null' }
|
12
|
+
let(:service) do
|
13
|
+
WEBrick::HTTPServer.new(Port: 8000, DocumentRoot: Dir.pwd, Logger: log).tap do |server|
|
14
|
+
server.mount_proc '/test' do |req, res|
|
15
|
+
res.body = { field: 'test' }.to_json
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
before do
|
21
|
+
@pid = fork do
|
22
|
+
trap 'INT' do service.shutdown end
|
23
|
+
service.start
|
24
|
+
end
|
25
|
+
sleep(0.5) # leave sometime for the previous webrick to teardown
|
26
|
+
end
|
27
|
+
|
28
|
+
after do
|
29
|
+
Process.kill('KILL', @pid)
|
30
|
+
Process.wait(@pid)
|
31
|
+
end
|
32
|
+
|
33
|
+
subject { Routemaster::Cache.new }
|
34
|
+
|
35
|
+
describe 'GET request' do
|
36
|
+
let(:cache_keys) { ["cache:#{url}", "v:,l:"] }
|
37
|
+
let(:url) { 'http://localhost:8000/test' }
|
38
|
+
|
39
|
+
context 'when there is no previous cached response' do
|
40
|
+
it 'makes an http call' do
|
41
|
+
response = subject.get(url)
|
42
|
+
expect(response.headers['server']).to be
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'sets the new response onto the cache' do
|
46
|
+
expect { subject.get(url) }
|
47
|
+
.to change { Routemaster::Config.cache_redis.hget(*cache_keys)}
|
48
|
+
.from(nil)
|
49
|
+
.to({ field: 'test'}.to_json)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when there is a previous cached response' do
|
54
|
+
before do
|
55
|
+
subject.get(url)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'fetches the cached response' do
|
59
|
+
expect(subject.get(url).body).to eq({ field: 'test' }.to_json)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'does not make an http call' do
|
63
|
+
response = subject.get(url)
|
64
|
+
expect(response.headers['server']).to be_nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
RSpec.shared_examples 'a job backend' do
|
2
|
+
class TestJob
|
3
|
+
def perform(x, y); end
|
4
|
+
end
|
5
|
+
|
6
|
+
let(:job) { TestJob.new }
|
7
|
+
let(:x) { 123 }
|
8
|
+
let(:y) { 'hello' }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(TestJob).to receive(:new).and_return(job)
|
12
|
+
allow(job).to receive(:perform).and_call_original
|
13
|
+
described_class.new.enqueue('test_queue', TestJob, x, y)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#enqueue' do
|
17
|
+
it 'should execute jobs with a #perform method with the passed arguments' do
|
18
|
+
expect(job).to have_received(:perform).with(x, y)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'routemaster/jobs/backends/resque'
|
2
|
+
require 'spec/routemaster/jobs/backends/backend_examples'
|
3
|
+
|
4
|
+
RSpec.describe Routemaster::Jobs::Backends::Resque do
|
5
|
+
around do |example|
|
6
|
+
original_inline = Resque.inline
|
7
|
+
begin
|
8
|
+
Resque.inline = true
|
9
|
+
example.run
|
10
|
+
ensure
|
11
|
+
Resque.inline = original_inline
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it_behaves_like 'a job backend'
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'sidekiq/testing'
|
2
|
+
require 'routemaster/jobs/backends/sidekiq'
|
3
|
+
require 'spec/routemaster/jobs/backends/backend_examples'
|
4
|
+
|
5
|
+
RSpec.describe Routemaster::Jobs::Backends::Sidekiq do
|
6
|
+
around do |example|
|
7
|
+
Sidekiq::Testing.inline! { example.run }
|
8
|
+
end
|
9
|
+
|
10
|
+
it_behaves_like 'a job backend'
|
11
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'routemaster/jobs/client'
|
2
|
+
require 'routemaster/jobs/cache_and_sweep'
|
3
|
+
|
4
|
+
RSpec.describe Routemaster::Jobs::Client do
|
5
|
+
let(:client) { Routemaster::Jobs::Client.new(adapter) }
|
6
|
+
|
7
|
+
let(:perform) do
|
8
|
+
client.enqueue('routemaster', Routemaster::Jobs::CacheAndSweep, 'https://example.com/1')
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#enqueue' do
|
12
|
+
before do
|
13
|
+
allow(Routemaster::Config).to receive(:queue_adapter).and_return(backend)
|
14
|
+
allow(client).to receive(:enqueue).and_call_original
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when the backend is Resque' do
|
18
|
+
let(:backend) { :resque }
|
19
|
+
let(:adapter) { double('Resque', enqueue_to: nil) }
|
20
|
+
|
21
|
+
it 'queues a Resque fetch job' do
|
22
|
+
expect(adapter).to receive(:enqueue_to).with(
|
23
|
+
'routemaster',
|
24
|
+
Routemaster::Jobs::Backends::Resque::JobWrapper,
|
25
|
+
{ 'class' => 'Routemaster::Jobs::CacheAndSweep', 'args' => ['https://example.com/1'] })
|
26
|
+
perform
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when the backend is Sidekiq' do
|
31
|
+
let(:backend) { :sidekiq }
|
32
|
+
let(:adapter) { double('Sidekiq', push: nil) }
|
33
|
+
|
34
|
+
it 'queues a Sidekiq fetch job' do
|
35
|
+
expect(adapter).to receive(:push).with(
|
36
|
+
'queue' => 'routemaster',
|
37
|
+
'class' => Routemaster::Jobs::Backends::Sidekiq::JobWrapper,
|
38
|
+
'args' => [{ 'class' => 'Routemaster::Jobs::CacheAndSweep', 'args' => ['https://example.com/1'] }])
|
39
|
+
perform
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
@@ -2,30 +2,29 @@ require 'spec_helper'
|
|
2
2
|
require 'spec/support/rack_test'
|
3
3
|
require 'routemaster/middleware/cache'
|
4
4
|
|
5
|
-
describe Routemaster::Middleware::Cache do
|
6
|
-
|
5
|
+
RSpec.describe Routemaster::Middleware::Cache do
|
7
6
|
# busts the cache for each dirty url
|
8
7
|
|
9
8
|
let(:terminator) { ErrorRackApp.new }
|
10
9
|
let(:app) { described_class.new(terminator, **options) }
|
11
|
-
let(:
|
12
|
-
let(:cache) {
|
13
|
-
let(:options) {{ cache: cache,
|
14
|
-
|
10
|
+
let(:client) { Routemaster::Jobs::Client.new }
|
11
|
+
let(:cache) { instance_double(Routemaster::Cache, bust: nil) }
|
12
|
+
let(:options) {{ cache: cache, client: client }}
|
13
|
+
|
15
14
|
let(:perform) do
|
16
15
|
post '/whatever', '', 'routemaster.dirty' => payload
|
17
16
|
end
|
18
17
|
|
19
18
|
describe '#call' do
|
20
19
|
let(:payload) { ['https://example.com/1'] }
|
21
|
-
|
20
|
+
|
22
21
|
it 'busts the cache' do
|
23
22
|
expect(cache).to receive(:bust).with(payload.first)
|
24
23
|
perform
|
25
24
|
end
|
26
25
|
|
27
26
|
it 'queues a fetch job' do
|
28
|
-
expect(
|
27
|
+
expect(client).to receive(:enqueue).with('routemaster', Routemaster::Jobs::CacheAndSweep, 'https://example.com/1')
|
29
28
|
perform
|
30
29
|
end
|
31
30
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
4
|
+
require 'byebug'
|
5
|
+
|
1
6
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
7
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
8
|
# Require this file using `require "spec_helper"` to ensure that it is only
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: routemaster-drain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Letessier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -42,44 +42,44 @@ dependencies:
|
|
42
42
|
name: net-http-persistent
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "<"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "<"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rack
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 1.6.2
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 1.6.2
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: wisper
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
75
|
+
version: 1.6.1
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
82
|
+
version: 1.6.1
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: hashie
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,20 +108,6 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: resque
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: thread
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -167,10 +153,15 @@ files:
|
|
167
153
|
- lib/routemaster/drain/mapping.rb
|
168
154
|
- lib/routemaster/drain/terminator.rb
|
169
155
|
- lib/routemaster/fetcher.rb
|
156
|
+
- lib/routemaster/jobs/backends/resque.rb
|
157
|
+
- lib/routemaster/jobs/backends/sidekiq.rb
|
170
158
|
- lib/routemaster/jobs/cache.rb
|
171
159
|
- lib/routemaster/jobs/cache_and_sweep.rb
|
160
|
+
- lib/routemaster/jobs/client.rb
|
161
|
+
- lib/routemaster/jobs/job.rb
|
172
162
|
- lib/routemaster/middleware/authenticate.rb
|
173
163
|
- lib/routemaster/middleware/cache.rb
|
164
|
+
- lib/routemaster/middleware/caching.rb
|
174
165
|
- lib/routemaster/middleware/dirty.rb
|
175
166
|
- lib/routemaster/middleware/filter.rb
|
176
167
|
- lib/routemaster/middleware/parse.rb
|
@@ -186,6 +177,11 @@ files:
|
|
186
177
|
- spec/routemaster/drain/mapping_spec.rb
|
187
178
|
- spec/routemaster/drain/terminator_spec.rb
|
188
179
|
- spec/routemaster/fetcher_spec.rb
|
180
|
+
- spec/routemaster/integration/cache_spec.rb
|
181
|
+
- spec/routemaster/jobs/backends/backend_examples.rb
|
182
|
+
- spec/routemaster/jobs/backends/resque_spec.rb
|
183
|
+
- spec/routemaster/jobs/backends/sidekiq_spec.rb
|
184
|
+
- spec/routemaster/jobs/client_spec.rb
|
189
185
|
- spec/routemaster/middleware/authenticate_spec.rb
|
190
186
|
- spec/routemaster/middleware/cache_spec.rb
|
191
187
|
- spec/routemaster/middleware/dirty_spec.rb
|
@@ -220,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
220
216
|
version: '0'
|
221
217
|
requirements: []
|
222
218
|
rubyforge_project:
|
223
|
-
rubygems_version: 2.
|
219
|
+
rubygems_version: 2.5.1
|
224
220
|
signing_key:
|
225
221
|
specification_version: 4
|
226
222
|
summary: Event receiver for the Routemaster bus
|
@@ -234,6 +230,11 @@ test_files:
|
|
234
230
|
- spec/routemaster/drain/mapping_spec.rb
|
235
231
|
- spec/routemaster/drain/terminator_spec.rb
|
236
232
|
- spec/routemaster/fetcher_spec.rb
|
233
|
+
- spec/routemaster/integration/cache_spec.rb
|
234
|
+
- spec/routemaster/jobs/backends/backend_examples.rb
|
235
|
+
- spec/routemaster/jobs/backends/resque_spec.rb
|
236
|
+
- spec/routemaster/jobs/backends/sidekiq_spec.rb
|
237
|
+
- spec/routemaster/jobs/client_spec.rb
|
237
238
|
- spec/routemaster/middleware/authenticate_spec.rb
|
238
239
|
- spec/routemaster/middleware/cache_spec.rb
|
239
240
|
- spec/routemaster/middleware/dirty_spec.rb
|