flipper-fallback 0.0.2 → 0.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/README.md +54 -2
- data/lib/flipper/adapters/fallback.rb +19 -7
- data/spec/fallback_spec.rb +6 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72e22e996ecb958f8d9204b4706dd925de7f6946
|
4
|
+
data.tar.gz: 2b9ec63f46d922af3724107f81978126935a45a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3d2de1ebd7064194bb1afc1a836fdb44e1bb61f0b28fad1737fbf76f86aabd2d6545a58f58fe27e1c0350c17126100bc49f34716ee9d4cd0295a6e3e5a2893d
|
7
|
+
data.tar.gz: fc0b8fa00eb954da53b79b3dd20e4b62c5077383cdd38cbcec422c2a8f2f7d9da2324c49d617b5704c16b786b337a46c206bd7572a3bb089d63503b8686443c0
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# Flipper::Fallback
|
2
2
|
|
3
|
-
|
3
|
+
This gem lets you utilize multiple flipper adapters by providing a fall back pattern.
|
4
|
+
If the primary adapter fails by throwing an exception, the secondary adapter will be called.
|
5
|
+
By default, the fall back adapter is the in memory adapter which should not fail.
|
6
|
+
However, by default, the memory adapter is empty and ***everything will fail closed***
|
4
7
|
|
5
8
|
## Installation
|
6
9
|
|
@@ -18,7 +21,56 @@ Or install it yourself as:
|
|
18
21
|
|
19
22
|
## Usage
|
20
23
|
|
21
|
-
|
24
|
+
Basic usage might look like this
|
25
|
+
```ruby
|
26
|
+
require 'flipper/adapters/redis'
|
27
|
+
require 'flipper/adapters/fallback'
|
28
|
+
|
29
|
+
flipper_adapter ||= Flipper::Adapters::Fallback.new(Flipper::Adapters::Redis.new(App.redis))
|
30
|
+
@flipper ||= Flipper.new(flipper_adapter)
|
31
|
+
```
|
32
|
+
|
33
|
+
If you wanted to set how things will fail, you should be able to do something like this.
|
34
|
+
```ruby
|
35
|
+
# Untested
|
36
|
+
# Please give me a better example of how one might do this
|
37
|
+
memory = Flipper::Adapters::Memory.new()
|
38
|
+
template = Flipper.new(memory)
|
39
|
+
template[:search].enable
|
40
|
+
template[:experimental].disable
|
41
|
+
|
42
|
+
# Template has modified our "memory" adapter to how we want
|
43
|
+
adapter = Flipper::Adapters::Fallback.new(Flipper::Adapters::Redis.new(App.redis), options = {}, memory)
|
44
|
+
```
|
45
|
+
|
46
|
+
Advanced usage might look like this
|
47
|
+
```ruby
|
48
|
+
error_handler = lambda do |error, primary_adapter, fallback_adapter|
|
49
|
+
# Keep stats on how many and what kind of error we are seeing
|
50
|
+
# There is probably a better way to do this
|
51
|
+
statsd.increment("flipper.#{primary_adapter.name}.errors.#{error.to_s.gsub('.','_')}")
|
52
|
+
end
|
53
|
+
|
54
|
+
# Throw a timeout exception if we take more than 2 seconds.
|
55
|
+
# Timeout wraps both the primary and fallback adapters.
|
56
|
+
# If the primary adapter takes longer than 2 seconds, we won't even try the fallback
|
57
|
+
timeout_in_seconds = 2
|
58
|
+
|
59
|
+
flipper_adapter ||= Flipper::Adapters::Fallback.new(Flipper::Adapters::Redis.new(App.redis), :on_error => error_handler, :timeout => timeout_in_seconds)
|
60
|
+
@flipper ||= Flipper.new(flipper_adapter)
|
61
|
+
```
|
62
|
+
|
63
|
+
Some "creative" usage might look like this
|
64
|
+
```ruby
|
65
|
+
# Untested
|
66
|
+
# Make a list of adapters to try
|
67
|
+
head = Flipper::Adapters::Fallback.new(Flipper::Adapters::Memcache.new(Rails.cache))
|
68
|
+
head = Flipper::Adapters::Fallback.new(Flipper::Adapters::Redis.new(App.redis), { :timeout => 1 }, head)
|
69
|
+
head = Flipper::Adapters::Fallback.new(Flipper::Adapters::ElasticSearch.new(App.search), { :timeout => 1 }, head)
|
70
|
+
|
71
|
+
# This would try ES -> Redis -> Memcache -> Memory.
|
72
|
+
@flipper ||= Flipper.new(head)
|
73
|
+
```
|
22
74
|
|
23
75
|
## Contributing
|
24
76
|
|
@@ -1,25 +1,37 @@
|
|
1
1
|
require 'flipper'
|
2
2
|
require 'flipper/adapters/memory'
|
3
3
|
require 'delegate'
|
4
|
+
require 'timeout'
|
4
5
|
|
5
6
|
module Flipper
|
6
7
|
module Adapters
|
7
8
|
class Fallback < SimpleDelegator
|
8
|
-
VERSION = '0.0
|
9
|
-
|
9
|
+
VERSION = '0.1.0'
|
10
|
+
|
11
|
+
def initialize(primary_adapter, options = {}, fallback_adapter = Flipper::Adapters::Memory.new)
|
10
12
|
super(primary_adapter)
|
11
13
|
@primary_adapter = primary_adapter
|
12
14
|
@fallback_adapter = fallback_adapter
|
13
15
|
|
14
16
|
@delegate_sd_obj = primary_adapter
|
17
|
+
|
18
|
+
@on_error = options[:on_error] || lambda do |error, primary_adapter, fallback_adapter|
|
19
|
+
STDERR.puts("[Flipper::Adapters::Fallback] Primary adapter(#{primary_adapter.inspect}) Failure! #{error}")
|
20
|
+
STDERR.puts("[Flipper::Adapters::Fallback] Falling back to #{fallback_adapter.inspect})")
|
21
|
+
end
|
22
|
+
|
23
|
+
@timeout = options[:timeout]
|
15
24
|
end
|
16
25
|
|
17
26
|
def method_missing(m, *args, &block)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
Timeout::timeout(@timeout) do
|
28
|
+
begin
|
29
|
+
super
|
30
|
+
rescue => error
|
31
|
+
@on_error.call(error, @primary_adapter, @fallback_adapter)
|
32
|
+
@fallback_adapter.__send__(m, *args, &block)
|
33
|
+
end
|
34
|
+
end
|
23
35
|
end
|
24
36
|
end
|
25
37
|
end
|
data/spec/fallback_spec.rb
CHANGED
@@ -35,7 +35,12 @@ describe Flipper::Adapters::Fallback do
|
|
35
35
|
Redis.new(options)
|
36
36
|
}
|
37
37
|
|
38
|
-
|
38
|
+
let(:on_error) do
|
39
|
+
lambda do |error, primary_adapter, fallback_adapter|
|
40
|
+
# noop
|
41
|
+
end
|
42
|
+
end
|
43
|
+
subject { described_class.new(Flipper::Adapters::Redis.new(client), { :on_error => on_error, :timeout => 0.1 }) }
|
39
44
|
|
40
45
|
it_should_behave_like 'a flipper adapter'
|
41
46
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flipper-fallback
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Lundquist
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: flipper
|