this_feature 0.6.1 → 0.7.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 +24 -12
- data/README.md +30 -6
- data/lib/this_feature/adapters/memory.rb +4 -3
- data/lib/this_feature/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8812767db56e7467a7439bc73bd243e3829974f9ee8897b85e434a036d0cdff9
|
4
|
+
data.tar.gz: b27419213f0bb1954a7d9c221ce315ae2229f2bb27fee13ae92b8987371d7c24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc7fe3136ed720c6eca4aed7ee10a02faf9e3eca3f39302137f7b375e408bf7be7b6259e5fa6ab7b631d9c929fa6c562c25e697cc2ff061a0d204c982dc45a73
|
7
|
+
data.tar.gz: 6b7e73cead9d55c2c116c9fda04a61c789b2ab8c368d53535958f38f6fe8a7e1191842119e1c469d6d4459a55c4ad722dfdf2e24b9fb64ec95bcbcf5bc1ca36b
|
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.7.0)
|
5
|
+
this_feature-adapters-flipper (0.7.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.7.0)
|
10
10
|
splitclient-rb
|
11
11
|
this_feature
|
12
12
|
|
@@ -27,27 +27,39 @@ GEM
|
|
27
27
|
byebug (11.1.2)
|
28
28
|
coderay (1.1.2)
|
29
29
|
concurrent-ruby (1.1.8)
|
30
|
-
connection_pool (2.2.
|
30
|
+
connection_pool (2.2.5)
|
31
31
|
database_cleaner (1.8.4)
|
32
32
|
database_cleaner-active_record (1.8.0)
|
33
33
|
activerecord
|
34
34
|
database_cleaner (~> 1.8.0)
|
35
35
|
diff-lcs (1.3)
|
36
|
-
faraday (1.
|
36
|
+
faraday (1.5.0)
|
37
|
+
faraday-em_http (~> 1.0)
|
38
|
+
faraday-em_synchrony (~> 1.0)
|
39
|
+
faraday-excon (~> 1.1)
|
40
|
+
faraday-httpclient (~> 1.0.1)
|
37
41
|
faraday-net_http (~> 1.0)
|
42
|
+
faraday-net_http_persistent (~> 1.1)
|
43
|
+
faraday-patron (~> 1.0)
|
38
44
|
multipart-post (>= 1.2, < 3)
|
39
|
-
ruby2_keywords
|
45
|
+
ruby2_keywords (>= 0.0.4)
|
46
|
+
faraday-em_http (1.0.0)
|
47
|
+
faraday-em_synchrony (1.0.0)
|
48
|
+
faraday-excon (1.1.0)
|
49
|
+
faraday-httpclient (1.0.1)
|
40
50
|
faraday-net_http (1.0.1)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
51
|
+
faraday-net_http_persistent (1.1.0)
|
52
|
+
faraday-patron (1.0.0)
|
53
|
+
flipper (0.22.0)
|
54
|
+
flipper-active_record (0.22.0)
|
55
|
+
activerecord (>= 4.2, < 7)
|
56
|
+
flipper (~> 0.22.0)
|
45
57
|
gem-release (2.2.1)
|
46
58
|
hitimes (1.3.1)
|
47
59
|
i18n (1.8.9)
|
48
60
|
concurrent-ruby (~> 1.0)
|
49
61
|
json (2.5.1)
|
50
|
-
jwt (2.2.
|
62
|
+
jwt (2.2.3)
|
51
63
|
lru_redux (1.1.0)
|
52
64
|
method_source (1.0.0)
|
53
65
|
minitest (5.14.4)
|
@@ -61,7 +73,7 @@ GEM
|
|
61
73
|
byebug (~> 11.0)
|
62
74
|
pry (~> 0.13.0)
|
63
75
|
rake (13.0.1)
|
64
|
-
redis (4.
|
76
|
+
redis (4.3.1)
|
65
77
|
rspec (3.9.0)
|
66
78
|
rspec-core (~> 3.9.0)
|
67
79
|
rspec-expectations (~> 3.9.0)
|
data/README.md
CHANGED
@@ -2,17 +2,27 @@
|
|
2
2
|
|
3
3
|
**A common interface to interact with many feature flag providers.**
|
4
4
|
|
5
|
-
|
5
|
+
ThisFeature can be used to more easily migrate from one feature flag service to another
|
6
6
|
|
7
7
|
If your code uses ThisFeature,
|
8
|
-
then you can just swap out the adapter without
|
8
|
+
then you can just swap out the vendor adapter without needing to do a bunch of find-and-replace in your codebase
|
9
|
+
from one vendor's class/method signature to the another's.
|
9
10
|
|
10
11
|
## Installation
|
11
12
|
|
13
|
+
Add ThisFeature to your `Gemfile`:
|
14
|
+
|
12
15
|
```ruby
|
16
|
+
# Gemfile
|
13
17
|
gem 'this_feature'
|
14
18
|
```
|
15
19
|
|
20
|
+
Then from your Rails app's root directory:
|
21
|
+
|
22
|
+
```sh
|
23
|
+
bundle install
|
24
|
+
```
|
25
|
+
|
16
26
|
## Configuration
|
17
27
|
|
18
28
|
```ruby
|
@@ -36,14 +46,13 @@ end
|
|
36
46
|
```ruby
|
37
47
|
ThisFeature.flag('flag_name').on? # is the flag is turned on?
|
38
48
|
ThisFeature.flag('flag_name').off? # is the flag is turned off?
|
39
|
-
ThisFeature.flag('flag_name').control? # is the adapter
|
40
|
-
ThisFeature.flag('flag_name').present? # is the flag set at all?
|
49
|
+
ThisFeature.flag('flag_name').control? # is the adapter using the control?
|
41
50
|
ThisFeature.default_adapter # access the default adapter directly if needed
|
42
51
|
```
|
43
52
|
|
44
53
|
### Context
|
45
54
|
|
46
|
-
You can also pass a context to the flag, many feature flagging systems support this.
|
55
|
+
You can also pass a `context` to the flag, many feature flagging systems support this.
|
47
56
|
|
48
57
|
```ruby
|
49
58
|
ThisFeature.flag('flag_name', context: current_user).on?
|
@@ -51,12 +60,17 @@ ThisFeature.flag('flag_name', context: current_user).on?
|
|
51
60
|
|
52
61
|
### Data
|
53
62
|
|
54
|
-
In case context is not sufficient, you can also pass a data hash.
|
63
|
+
In case `context` is not sufficient, you can also pass a `data` hash.
|
55
64
|
|
56
65
|
```ruby
|
57
66
|
ThisFeature.flag('flag_name', context: context, data: { org_id: 1 }).on?
|
58
67
|
```
|
59
68
|
|
69
|
+
### Avoid Pitfalls
|
70
|
+
|
71
|
+
1. If your flag has context-specific rules (e.g. on for some orgs, off for others), make sure that the code does a context-specific check. `ThisFeature.flag("flag_name").on?` may return true, while `ThisFeature.flag("flag_name", context: Org.first).on?` would return false.
|
72
|
+
2. Related to the previous bullet point, if you are checking whether a flag is "globally enabled" (and thus may be removed from the codebase), do not just use `ThisFeature.flag("flag_name").on?`, it won't tell you the whole story. Go to the vendor console and check whether there are context-specific rules enabled.
|
73
|
+
|
60
74
|
## Available Adapters
|
61
75
|
|
62
76
|
These adapters do behave slightly differently, so make sure to read the following docs:
|
@@ -65,6 +79,16 @@ These adapters do behave slightly differently, so make sure to read the followin
|
|
65
79
|
- [Split.io adapter](./docs/splitio.md)
|
66
80
|
- [Memory adapter](./docs/memory.md) - **designed for use in tests**
|
67
81
|
|
82
|
+
### Needed Adapters
|
83
|
+
|
84
|
+
We'd like to add more adapters for more vendors.
|
85
|
+
If you're using a different backend and write your own adapter,
|
86
|
+
please submit a pull request to upstream that adaptor into this repo.
|
87
|
+
|
88
|
+
- Launch Darkly
|
89
|
+
- YAML files
|
90
|
+
- ...
|
91
|
+
|
68
92
|
## Development
|
69
93
|
|
70
94
|
The tests are a good reflection of the current development state.
|
@@ -19,11 +19,11 @@ class ThisFeature
|
|
19
19
|
|
20
20
|
flag_data = storage[flag_name]
|
21
21
|
|
22
|
-
|
23
|
-
return false if context.nil?
|
22
|
+
context_registered = flag_data[:contexts]&.key?(context_key(context))
|
24
23
|
|
25
|
-
flag_data[:
|
24
|
+
return !!flag_data[:global] if !context || (context && !context_registered)
|
26
25
|
|
26
|
+
flag_data[:contexts] ||= {}
|
27
27
|
!!flag_data[:contexts][context_key(context)]
|
28
28
|
end
|
29
29
|
|
@@ -62,6 +62,7 @@ class ThisFeature
|
|
62
62
|
attr_reader :context_key_method
|
63
63
|
|
64
64
|
def context_key(context)
|
65
|
+
return nil unless context
|
65
66
|
return context if context_key_method.nil?
|
66
67
|
|
67
68
|
context.send(context_key_method)
|
data/lib/this_feature/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: this_feature
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max Pleaner
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
requirements: []
|
168
|
-
rubygems_version: 3.
|
168
|
+
rubygems_version: 3.0.3
|
169
169
|
signing_key:
|
170
170
|
specification_version: 4
|
171
171
|
summary: Feature flag control
|