this_feature-adapters-flipper 0.4.1 → 0.6.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/Gemfile.lock +16 -12
- data/README.md +27 -38
- data/lib/this_feature.rb +4 -0
- data/lib/this_feature/adapters/base.rb +0 -5
- data/lib/this_feature/adapters/flipper.rb +1 -7
- data/lib/this_feature/adapters/memory.rb +2 -6
- data/lib/this_feature/adapters/split_io.rb +12 -11
- data/lib/this_feature/configuration.rb +7 -2
- data/lib/this_feature/errors.rb +2 -2
- data/lib/this_feature/version.rb +1 -1
- data/memory +0 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e4a26fde4d195b60dbd8eeb857a773257de6b5f8779347988035e74380e3e9b
|
4
|
+
data.tar.gz: 3ded8c80f4d943b08c7b3a9f769caaa6bf53940acceb5fd519d049e67331c10d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aafaf413f0a4dd23db4fde7c982c2faa91fee7449763cbfb39ef9edef28e5737c8cb8e1f26ab340a369d4109faa71415449d5e172121e5465e3c7fcc067529f4
|
7
|
+
data.tar.gz: 2cc0debacbf86eab5b03ef7bce12636f5d1bfb04f71f477c358ac256ba6ebefc75bae460b234eac9de43a2da25010c98c41b52464b5c7507e36a1787c816c878
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
this_feature (0.
|
5
|
-
this_feature-adapters-flipper (0.
|
4
|
+
this_feature (0.6.0)
|
5
|
+
this_feature-adapters-flipper (0.6.0)
|
6
6
|
flipper (~> 0.16)
|
7
7
|
flipper-active_record (~> 0.16)
|
8
8
|
this_feature
|
9
|
-
this_feature-adapters-split_io (0.
|
9
|
+
this_feature-adapters-split_io (0.6.0)
|
10
10
|
splitclient-rb
|
11
11
|
this_feature
|
12
12
|
|
@@ -33,23 +33,26 @@ GEM
|
|
33
33
|
activerecord
|
34
34
|
database_cleaner (~> 1.8.0)
|
35
35
|
diff-lcs (1.3)
|
36
|
-
faraday (1.0
|
36
|
+
faraday (1.3.0)
|
37
|
+
faraday-net_http (~> 1.0)
|
37
38
|
multipart-post (>= 1.2, < 3)
|
38
|
-
|
39
|
-
|
39
|
+
ruby2_keywords
|
40
|
+
faraday-net_http (1.0.1)
|
41
|
+
flipper (0.20.3)
|
42
|
+
flipper-active_record (0.20.3)
|
40
43
|
activerecord (>= 5.0, < 7)
|
41
|
-
flipper (~> 0.
|
44
|
+
flipper (~> 0.20.3)
|
42
45
|
gem-release (2.1.1)
|
43
46
|
hitimes (1.3.1)
|
44
47
|
i18n (1.8.5)
|
45
48
|
concurrent-ruby (~> 1.0)
|
46
|
-
json (2.
|
49
|
+
json (2.5.1)
|
47
50
|
jwt (2.2.2)
|
48
51
|
lru_redux (1.1.0)
|
49
52
|
method_source (1.0.0)
|
50
53
|
minitest (5.14.1)
|
51
54
|
multipart-post (2.1.1)
|
52
|
-
net-http-persistent (4.0.
|
55
|
+
net-http-persistent (4.0.1)
|
53
56
|
connection_pool (~> 2.2)
|
54
57
|
pry (0.13.1)
|
55
58
|
coderay (~> 1.1)
|
@@ -58,7 +61,7 @@ GEM
|
|
58
61
|
byebug (~> 11.0)
|
59
62
|
pry (~> 0.13.0)
|
60
63
|
rake (13.0.1)
|
61
|
-
redis (4.2.
|
64
|
+
redis (4.2.5)
|
62
65
|
rspec (3.9.0)
|
63
66
|
rspec-core (~> 3.9.0)
|
64
67
|
rspec-expectations (~> 3.9.0)
|
@@ -72,16 +75,17 @@ GEM
|
|
72
75
|
diff-lcs (>= 1.2.0, < 2.0)
|
73
76
|
rspec-support (~> 3.9.0)
|
74
77
|
rspec-support (3.9.2)
|
78
|
+
ruby2_keywords (0.0.4)
|
75
79
|
socketry (0.5.1)
|
76
80
|
hitimes (~> 1.2)
|
77
|
-
splitclient-rb (7.
|
81
|
+
splitclient-rb (7.2.2)
|
78
82
|
concurrent-ruby (~> 1.0)
|
79
83
|
faraday (>= 0.8)
|
80
84
|
json (>= 1.8)
|
81
85
|
jwt (>= 2.2.1)
|
82
86
|
lru_redux
|
83
87
|
net-http-persistent (>= 2.9)
|
84
|
-
redis (>=
|
88
|
+
redis (>= 4.2.2)
|
85
89
|
socketry (~> 0.5.1)
|
86
90
|
thread_safe (>= 0.3)
|
87
91
|
sqlite3 (1.4.2)
|
data/README.md
CHANGED
@@ -1,65 +1,44 @@
|
|
1
1
|
# ThisFeature
|
2
2
|
|
3
|
-
|
3
|
+
**A common interface to interact with many feature flag providers.**
|
4
4
|
|
5
|
-
|
5
|
+
Can be used to more easily migrate among providers.
|
6
|
+
|
7
|
+
If your code uses ThisFeature,
|
8
|
+
then you can just swap out the adapter without having to do a bunch of find-and-replace.
|
6
9
|
|
7
|
-
|
10
|
+
## Installation
|
8
11
|
|
9
12
|
```ruby
|
10
13
|
gem 'this_feature'
|
11
14
|
```
|
12
15
|
|
13
|
-
And then execute:
|
14
|
-
|
15
|
-
```sh
|
16
|
-
bundle
|
17
|
-
```
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
```sh
|
22
|
-
gem install this_feature
|
23
|
-
```
|
24
|
-
|
25
16
|
## Configuration
|
26
17
|
|
27
18
|
```ruby
|
28
19
|
# config/initializers/this_feature.rb
|
29
20
|
require 'this_feature'
|
21
|
+
require 'this_feature/adapters/memory'
|
30
22
|
|
31
23
|
ThisFeature.configure do |config|
|
32
|
-
|
33
|
-
config.
|
24
|
+
adapter = ThisFeature::Adapters::Memory.new
|
25
|
+
config.adapters = [adapter]
|
26
|
+
config.default_adapter = adapter
|
34
27
|
end
|
35
28
|
```
|
36
29
|
|
37
30
|
**NOTE**: When searching for the presence of a flag, adapters are queried in order. The default adapter is the fallback adapter used when a flag isn't present in any of the adapters.
|
38
31
|
|
39
|
-
|
40
|
-
### With Flipper
|
41
|
-
|
42
|
-
```ruby
|
43
|
-
# config/initializers/this_feature.rb
|
44
|
-
require 'this_feature/adapters/flipper'
|
45
|
-
|
46
|
-
ThisFeature.configure do |config|
|
47
|
-
config.adapters = [ThisFeature::Adapters::Flipper]
|
48
|
-
config.default_adapter = config.adapters.first
|
49
|
-
end
|
50
|
-
```
|
51
|
-
|
52
|
-
|
53
|
-
|
54
32
|
## Usage
|
55
33
|
|
56
34
|
### Flags
|
35
|
+
|
57
36
|
```ruby
|
58
|
-
ThisFeature.flag('flag_name').on?
|
59
|
-
ThisFeature.flag('flag_name').off?
|
60
|
-
ThisFeature.flag('flag_name').control? #
|
61
|
-
ThisFeature.flag('flag_name').
|
62
|
-
ThisFeature.
|
37
|
+
ThisFeature.flag('flag_name').on? # is the flag is turned on?
|
38
|
+
ThisFeature.flag('flag_name').off? # is the flag is turned off?
|
39
|
+
ThisFeature.flag('flag_name').control? # is the adapter is using the control?
|
40
|
+
ThisFeature.flag('flag_name').present? # is the flag set at all?
|
41
|
+
ThisFeature.default_adapter # access the default adapter directly if needed
|
63
42
|
```
|
64
43
|
|
65
44
|
### Context
|
@@ -78,8 +57,13 @@ In case context is not sufficient, you can also pass a data hash.
|
|
78
57
|
ThisFeature.flag('flag_name', context: context, data: { org_id: 1 }).on?
|
79
58
|
```
|
80
59
|
|
81
|
-
##
|
60
|
+
## Available Adapters
|
61
|
+
|
62
|
+
These adapters do behave slightly differently, so make sure to read the following docs:
|
82
63
|
|
64
|
+
- [Flipper adapter](./docs/flipper.md)
|
65
|
+
- [Split.io adapter](./docs/splitio.md)
|
66
|
+
- [Memory adapter](./docs/memory.md) - **designed for use in tests**
|
83
67
|
|
84
68
|
## Development
|
85
69
|
|
@@ -90,6 +74,11 @@ You can run the tests with these commands in your Terminal:
|
|
90
74
|
bundle install && bundle exec rspec
|
91
75
|
```
|
92
76
|
|
77
|
+
To write a new adapter, check the [Guide](./docs/writing_an_adapter.md).
|
78
|
+
|
93
79
|
## License
|
94
80
|
|
95
81
|
ThisFeature is released under the [MIT License](https://choosealicense.com/licenses/mit).
|
82
|
+
|
83
|
+
|
84
|
+
|
data/lib/this_feature.rb
CHANGED
@@ -19,17 +19,11 @@ class ThisFeature
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def on?(flag_name, context: nil, data: {})
|
22
|
-
return unless present?(flag_name)
|
23
|
-
|
24
22
|
client[flag_name].enabled?(*[context].compact)
|
25
23
|
end
|
26
24
|
|
27
25
|
def off?(flag_name, context: nil, data: {})
|
28
|
-
|
29
|
-
|
30
|
-
return if on_result.nil?
|
31
|
-
|
32
|
-
!on_result
|
26
|
+
!on?(flag_name, context: context)
|
33
27
|
end
|
34
28
|
|
35
29
|
private
|
@@ -15,7 +15,7 @@ class ThisFeature
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def on?(flag_name, context: nil, data: {})
|
18
|
-
return unless present?(flag_name)
|
18
|
+
return false unless present?(flag_name)
|
19
19
|
|
20
20
|
flag_data = storage[flag_name]
|
21
21
|
|
@@ -28,11 +28,7 @@ class ThisFeature
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def off?(flag_name, context: nil, data: {})
|
31
|
-
|
32
|
-
|
33
|
-
return if on_result.nil?
|
34
|
-
|
35
|
-
!on_result
|
31
|
+
!on?(flag_name, context: context, data: data)
|
36
32
|
end
|
37
33
|
|
38
34
|
def on!(flag_name, context: nil, data: {})
|
@@ -6,8 +6,9 @@ class ThisFeature
|
|
6
6
|
# used as treatment key when none is given, it's required by split
|
7
7
|
UNDEFINED_KEY = 'undefined_key'
|
8
8
|
|
9
|
-
def initialize(client: nil)
|
9
|
+
def initialize(client: nil, context_key_method: nil)
|
10
10
|
@client = client || default_split_client
|
11
|
+
@context_key_method = context_key_method
|
11
12
|
|
12
13
|
@client.block_until_ready
|
13
14
|
end
|
@@ -30,18 +31,18 @@ class ThisFeature
|
|
30
31
|
|
31
32
|
private
|
32
33
|
|
33
|
-
attr_reader :client
|
34
|
+
attr_reader :client, :context_key_method
|
34
35
|
|
35
36
|
def treatment(flag_name, context: UNDEFINED_KEY, data: {})
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
37
|
+
client.get_treatment(context_key(context), flag_name, data)
|
38
|
+
end
|
39
|
+
|
40
|
+
def context_key(context)
|
41
|
+
return UNDEFINED_KEY if context.nil? || context.eql?(UNDEFINED_KEY)
|
42
|
+
return context.send(context_key_method) unless context_key_method.nil?
|
43
|
+
return context.to_s if context.respond_to?(:to_s)
|
44
|
+
|
45
|
+
context
|
45
46
|
end
|
46
47
|
|
47
48
|
def default_split_client
|
@@ -1,13 +1,14 @@
|
|
1
|
-
|
2
1
|
class ThisFeature
|
3
2
|
class Configuration
|
4
|
-
attr_writer :adapters, :default_adapter
|
3
|
+
attr_writer :adapters, :default_adapter, :test_adapter
|
5
4
|
|
6
5
|
def init
|
7
6
|
validate_adapters!
|
8
7
|
end
|
9
8
|
|
10
9
|
def validate_adapters!
|
10
|
+
raise(NoAdaptersError.new) unless adapters.any?
|
11
|
+
|
11
12
|
adapters.each do |adapter|
|
12
13
|
raise BadAdapterError.new(adapter) unless adapter.class < Adapters::Base
|
13
14
|
end
|
@@ -20,5 +21,9 @@ class ThisFeature
|
|
20
21
|
def default_adapter
|
21
22
|
@default_adapter ||= adapters.first
|
22
23
|
end
|
24
|
+
|
25
|
+
def test_adapter
|
26
|
+
@test_adapter ||= Adapters::Memory.new
|
27
|
+
end
|
23
28
|
end
|
24
29
|
end
|
data/lib/this_feature/errors.rb
CHANGED
@@ -14,9 +14,9 @@ class ThisFeature
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
class
|
17
|
+
class NoAdaptersError < Error
|
18
18
|
def initialize
|
19
|
-
super("
|
19
|
+
super("No adapters configured.")
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
data/lib/this_feature/version.rb
CHANGED
data/memory
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: this_feature-adapters-flipper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max Pleaner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: this_feature
|