this_feature-adapters-flipper 0.4.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9156cd4072f7a42da3a841bacacb32ecb87b01e2ea67d5fb2f793cf531276223
4
- data.tar.gz: d9818a598cc91d4190b3f29a03b0ee1cce98a2206f059c017f310baaf29b024f
3
+ metadata.gz: 9e4a26fde4d195b60dbd8eeb857a773257de6b5f8779347988035e74380e3e9b
4
+ data.tar.gz: 3ded8c80f4d943b08c7b3a9f769caaa6bf53940acceb5fd519d049e67331c10d
5
5
  SHA512:
6
- metadata.gz: e54cd280974cef9b688bbf4dce7de1831e99f152856872f97b3a14de7bd68c6108965e2894ce600af36e45f53a97fcee8d6565a0e1b085f64663570646f4c96d
7
- data.tar.gz: 59852a79b60b4bca12f1bfc6e145cb6348d348e6b4ad377f5971baa160bc3586570b3c145be99936d4200a411a5c2d5db43b4801a76c8e1d9c8e56f1ee4e44cb
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.4.1)
5
- this_feature-adapters-flipper (0.4.1)
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.4.1)
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.1)
36
+ faraday (1.3.0)
37
+ faraday-net_http (~> 1.0)
37
38
  multipart-post (>= 1.2, < 3)
38
- flipper (0.18.0)
39
- flipper-active_record (0.18.0)
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.18.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.3.1)
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.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.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.1.3)
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 (>= 3.2)
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
- The purpose of ThisFeature is to have one way to use feature flags
3
+ **A common interface to interact with many feature flag providers.**
4
4
 
5
- ## Installation
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
- Add this line to your application's `Gemfile`:
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
- config.adapters = [ThisFeature::Adapters::Memory]
33
- config.default_adapter = config.adapters.first
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? # check if flag is turned on
59
- ThisFeature.flag('flag_name').off? # check if flag is turned off
60
- ThisFeature.flag('flag_name').control? # see if the adapter is using the control
61
- ThisFeature.flag('flag_name').on! # turn on the flag
62
- ThisFeature.flag('flag_name').off! # turn off the flag
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
- ## TODO: Write documentation for the adapters (creating adapters, using memory adapter, using flipper adapter)
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
@@ -34,4 +34,8 @@ class ThisFeature
34
34
  def self.adapters
35
35
  configuration.adapters
36
36
  end
37
+
38
+ def self.test_adapter
39
+ configuration.test_adapter
40
+ end
37
41
  end
@@ -1,11 +1,6 @@
1
1
  class ThisFeature
2
2
  module Adapters
3
3
  class Base
4
-
5
- def setup
6
- raise UnimplementedError.new(self, __method__)
7
- end
8
-
9
4
  def present?(flag_name)
10
5
  raise UnimplementedError.new(self, __method__)
11
6
  end
@@ -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
- on_result = on?(flag_name, context: context)
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
- on_result = on?(flag_name, context: context)
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
- key = if context.nil?
37
- UNDEFINED_KEY
38
- elsif context.respond_to?(:to_s)
39
- context.to_s
40
- else
41
- context
42
- end
43
-
44
- client.get_treatment(key, flag_name, data)
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
@@ -14,9 +14,9 @@ class ThisFeature
14
14
  end
15
15
  end
16
16
 
17
- class NoWriteAdapter < Error
17
+ class NoAdaptersError < Error
18
18
  def initialize
19
- super("Use the `ThisFeature.write_adapter=` setter before calling #enable or #disable")
19
+ super("No adapters configured.")
20
20
  end
21
21
  end
22
22
 
@@ -1,3 +1,3 @@
1
1
  class ThisFeature
2
- VERSION = "0.4.1"
2
+ VERSION = "0.6.0"
3
3
  end
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.1
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: 2020-09-11 00:00:00.000000000 Z
11
+ date: 2021-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: this_feature