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 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