flipper 0.10.2 → 0.11.0.beta1
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/.rubocop.yml +42 -0
- data/.rubocop_todo.yml +188 -0
- data/Changelog.md +10 -0
- data/Gemfile +6 -3
- data/README.md +4 -3
- data/Rakefile +13 -13
- data/docs/Adapters.md +2 -1
- data/docs/DockerCompose.md +6 -3
- data/docs/Gates.md +25 -3
- data/docs/Optimization.md +27 -5
- data/docs/api/README.md +73 -32
- data/docs/http/README.md +34 -0
- data/docs/read-only/README.md +22 -0
- data/examples/percentage_of_actors_group.rb +49 -0
- data/flipper.gemspec +15 -15
- data/lib/flipper.rb +2 -5
- data/lib/flipper/adapter.rb +10 -0
- data/lib/flipper/adapters/http.rb +147 -0
- data/lib/flipper/adapters/http/client.rb +83 -0
- data/lib/flipper/adapters/http/error.rb +14 -0
- data/lib/flipper/adapters/instrumented.rb +36 -36
- data/lib/flipper/adapters/memoizable.rb +2 -6
- data/lib/flipper/adapters/memory.rb +10 -9
- data/lib/flipper/adapters/operation_logger.rb +1 -1
- data/lib/flipper/adapters/pstore.rb +12 -11
- data/lib/flipper/adapters/read_only.rb +6 -6
- data/lib/flipper/dsl.rb +1 -3
- data/lib/flipper/feature.rb +11 -16
- data/lib/flipper/gate.rb +3 -3
- data/lib/flipper/gate_values.rb +6 -6
- data/lib/flipper/gates/group.rb +2 -2
- data/lib/flipper/gates/percentage_of_actors.rb +2 -2
- data/lib/flipper/instrumentation/log_subscriber.rb +2 -4
- data/lib/flipper/instrumentation/metriks.rb +1 -1
- data/lib/flipper/instrumentation/statsd.rb +1 -1
- data/lib/flipper/instrumentation/statsd_subscriber.rb +1 -3
- data/lib/flipper/instrumentation/subscriber.rb +11 -10
- data/lib/flipper/instrumenters/memory.rb +1 -5
- data/lib/flipper/instrumenters/noop.rb +1 -1
- data/lib/flipper/middleware/memoizer.rb +11 -27
- data/lib/flipper/middleware/setup_env.rb +44 -0
- data/lib/flipper/registry.rb +8 -10
- data/lib/flipper/spec/shared_adapter_specs.rb +45 -67
- data/lib/flipper/test/shared_adapter_test.rb +25 -31
- data/lib/flipper/typecast.rb +2 -2
- data/lib/flipper/types/actor.rb +2 -4
- data/lib/flipper/types/group.rb +1 -1
- data/lib/flipper/types/percentage.rb +2 -1
- data/lib/flipper/version.rb +1 -1
- data/spec/fixtures/feature.json +31 -0
- data/spec/flipper/adapters/http_spec.rb +148 -0
- data/spec/flipper/adapters/instrumented_spec.rb +20 -20
- data/spec/flipper/adapters/memoizable_spec.rb +59 -59
- data/spec/flipper/adapters/operation_logger_spec.rb +16 -16
- data/spec/flipper/adapters/pstore_spec.rb +6 -6
- data/spec/flipper/adapters/read_only_spec.rb +28 -34
- data/spec/flipper/dsl_spec.rb +73 -84
- data/spec/flipper/feature_check_context_spec.rb +27 -27
- data/spec/flipper/feature_spec.rb +186 -196
- data/spec/flipper/gate_spec.rb +11 -11
- data/spec/flipper/gate_values_spec.rb +46 -45
- data/spec/flipper/gates/actor_spec.rb +2 -2
- data/spec/flipper/gates/boolean_spec.rb +24 -23
- data/spec/flipper/gates/group_spec.rb +19 -19
- data/spec/flipper/gates/percentage_of_actors_spec.rb +10 -10
- data/spec/flipper/gates/percentage_of_time_spec.rb +2 -2
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +20 -20
- data/spec/flipper/instrumentation/metriks_subscriber_spec.rb +20 -20
- data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +11 -11
- data/spec/flipper/instrumenters/memory_spec.rb +5 -5
- data/spec/flipper/instrumenters/noop_spec.rb +6 -6
- data/spec/flipper/middleware/memoizer_spec.rb +83 -100
- data/spec/flipper/middleware/setup_env_spec.rb +76 -0
- data/spec/flipper/registry_spec.rb +35 -39
- data/spec/flipper/typecast_spec.rb +18 -18
- data/spec/flipper/types/actor_spec.rb +30 -29
- data/spec/flipper/types/boolean_spec.rb +8 -8
- data/spec/flipper/types/group_spec.rb +28 -28
- data/spec/flipper/types/percentage_spec.rb +14 -14
- data/spec/flipper_spec.rb +61 -54
- data/spec/helper.rb +26 -21
- data/spec/integration_spec.rb +121 -113
- data/spec/support/fake_udp_socket.rb +1 -1
- data/spec/support/spec_helpers.rb +32 -4
- data/test/adapters/pstore_test.rb +3 -3
- data/test/test_helper.rb +1 -1
- metadata +20 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dba40ce57cd34d4be2608ce8725c2b314eb5345
|
4
|
+
data.tar.gz: 929230ec45235cfb08634d63ab0bdfe704197b45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3618c5c38a0901f219e719de7b04230ad8ca4534673f271b31c055fe1d88bb7545638b5bdb90c3fdec6e842819678e4137c2f32eb83eb77826381396eb75d95e
|
7
|
+
data.tar.gz: 98e939ae62ee4ac6bd7f19eab5be8c0c58281525db190a852a0b36643e8108c16feb5df94a4ca943ab4517bccec6c7a20d80ea5389fa7bb595bb7d7fdb394cf9
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# This is the configuration used to check the rubocop source code.
|
2
|
+
|
3
|
+
require: rubocop-rspec
|
4
|
+
inherit_from:
|
5
|
+
- .rubocop_todo.yml
|
6
|
+
|
7
|
+
AllCops:
|
8
|
+
Exclude:
|
9
|
+
- 'docker-compose/**/*'
|
10
|
+
- 'examples/**/*'
|
11
|
+
- 'tmp/**/*'
|
12
|
+
- 'bin/**/*'
|
13
|
+
TargetRubyVersion: 2.0
|
14
|
+
# DefaultFormatter: fuubar
|
15
|
+
Style/Alias:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Style/Documentation:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Style/Encoding:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
Style/NumericLiterals:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
Style/StringLiterals:
|
28
|
+
Enabled: false
|
29
|
+
|
30
|
+
Metrics/LineLength:
|
31
|
+
Max: 100
|
32
|
+
Exclude:
|
33
|
+
- '*.gemspec'
|
34
|
+
|
35
|
+
Style/RegexpLiteral:
|
36
|
+
EnforcedStyle: mixed
|
37
|
+
|
38
|
+
Style/TrailingCommaInLiteral:
|
39
|
+
EnforcedStyleForMultiline: consistent_comma
|
40
|
+
|
41
|
+
RSpec/InstanceVariable:
|
42
|
+
Enabled: false
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2016-11-20 15:49:33 +0000 using RuboCop version 0.45.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
require: rubocop-rspec
|
10
|
+
|
11
|
+
# Offense count: 2
|
12
|
+
Lint/AmbiguousRegexpLiteral:
|
13
|
+
Exclude:
|
14
|
+
- 'lib/flipper/instrumentation/metriks.rb'
|
15
|
+
- 'lib/flipper/instrumentation/statsd.rb'
|
16
|
+
|
17
|
+
# Offense count: 6
|
18
|
+
# Configuration parameters: AllowSafeAssignment.
|
19
|
+
Lint/AssignmentInCondition:
|
20
|
+
Exclude:
|
21
|
+
- 'lib/flipper/adapters/active_record.rb'
|
22
|
+
- 'lib/flipper/adapters/sequel.rb'
|
23
|
+
- 'lib/flipper/feature.rb'
|
24
|
+
- 'lib/flipper/gate_values.rb'
|
25
|
+
|
26
|
+
# Offense count: 1
|
27
|
+
Lint/Eval:
|
28
|
+
Exclude:
|
29
|
+
- 'flipper.gemspec'
|
30
|
+
|
31
|
+
# Offense count: 3
|
32
|
+
Lint/HandleExceptions:
|
33
|
+
Exclude:
|
34
|
+
- 'spec/flipper/adapters/mongo_spec.rb'
|
35
|
+
- 'test/adapters/mongo_test.rb'
|
36
|
+
- 'test/helper.rb'
|
37
|
+
|
38
|
+
# Offense count: 24
|
39
|
+
Lint/ShadowingOuterLocalVariable:
|
40
|
+
Exclude:
|
41
|
+
- 'lib/flipper/adapters/active_record.rb'
|
42
|
+
- 'lib/flipper/adapters/instrumented.rb'
|
43
|
+
- 'lib/flipper/adapters/sequel.rb'
|
44
|
+
- 'spec/flipper/api/v1/actions/actors_gate_spec.rb'
|
45
|
+
- 'spec/flipper/api/v1/actions/percentage_of_actors_gate_spec.rb'
|
46
|
+
- 'spec/flipper/api/v1/actions/percentage_of_time_gate_spec.rb'
|
47
|
+
- 'spec/flipper/dsl_spec.rb'
|
48
|
+
- 'spec/flipper/feature_spec.rb'
|
49
|
+
- 'spec/flipper/types/group_spec.rb'
|
50
|
+
|
51
|
+
# Offense count: 26
|
52
|
+
Lint/UselessAssignment:
|
53
|
+
Exclude:
|
54
|
+
- 'lib/flipper/instrumentation/log_subscriber.rb'
|
55
|
+
- 'lib/flipper/instrumentation/subscriber.rb'
|
56
|
+
- 'lib/flipper/ui/actions/groups_gate.rb'
|
57
|
+
- 'spec/flipper/api/action_spec.rb'
|
58
|
+
- 'spec/flipper/dsl_spec.rb'
|
59
|
+
- 'spec/flipper/feature_spec.rb'
|
60
|
+
- 'spec/flipper/gates/group_spec.rb'
|
61
|
+
- 'spec/flipper/instrumentation/metriks_subscriber_spec.rb'
|
62
|
+
- 'spec/flipper/instrumentation/statsd_subscriber_spec.rb'
|
63
|
+
- 'spec/flipper_spec.rb'
|
64
|
+
- 'spec/flipper/middleware/memoizer_spec.rb'
|
65
|
+
- 'test/helper.rb'
|
66
|
+
|
67
|
+
# Offense count: 27
|
68
|
+
Metrics/AbcSize:
|
69
|
+
Max: 30
|
70
|
+
|
71
|
+
# Offense count: 1
|
72
|
+
# Configuration parameters: CountComments.
|
73
|
+
Metrics/BlockLength:
|
74
|
+
Max: 195
|
75
|
+
|
76
|
+
# Offense count: 4
|
77
|
+
# Configuration parameters: CountComments.
|
78
|
+
Metrics/ClassLength:
|
79
|
+
Max: 178
|
80
|
+
|
81
|
+
# Offense count: 39
|
82
|
+
# Configuration parameters: CountComments.
|
83
|
+
Metrics/MethodLength:
|
84
|
+
Max: 23
|
85
|
+
|
86
|
+
# Offense count: 65
|
87
|
+
# Configuration parameters: Max.
|
88
|
+
RSpec/ExampleLength:
|
89
|
+
Enabled: false
|
90
|
+
|
91
|
+
# Offense count: 2
|
92
|
+
# Configuration parameters: CustomTransform.
|
93
|
+
RSpec/FilePath:
|
94
|
+
Exclude:
|
95
|
+
- 'spec/flipper/adapters/pstore_spec.rb'
|
96
|
+
- 'spec/integration_spec.rb'
|
97
|
+
|
98
|
+
# Offense count: 91
|
99
|
+
RSpec/InstanceVariable:
|
100
|
+
Exclude:
|
101
|
+
- 'spec/flipper/adapters/operation_logger_spec.rb'
|
102
|
+
- 'spec/flipper/dsl_spec.rb'
|
103
|
+
- 'spec/flipper/feature_spec.rb'
|
104
|
+
- 'spec/flipper/instrumentation/log_subscriber_spec.rb'
|
105
|
+
- 'spec/flipper/ui/actions/add_feature_spec.rb'
|
106
|
+
- 'spec/flipper/ui/actions/features_spec.rb'
|
107
|
+
- 'spec/flipper/ui/decorators/feature_spec.rb'
|
108
|
+
- 'spec/flipper/ui/decorators/gate_spec.rb'
|
109
|
+
- 'spec/flipper/ui_spec.rb'
|
110
|
+
- 'spec/flipper_spec.rb'
|
111
|
+
- 'spec/integration_spec.rb'
|
112
|
+
|
113
|
+
# Offense count: 15
|
114
|
+
# Configuration parameters: IgnoreSymbolicNames.
|
115
|
+
RSpec/VerifiedDoubles:
|
116
|
+
Exclude:
|
117
|
+
- 'spec/flipper/api/v1/actions/features_spec.rb'
|
118
|
+
- 'spec/flipper/dsl_spec.rb'
|
119
|
+
- 'spec/flipper/feature_spec.rb'
|
120
|
+
- 'spec/flipper/types/group_spec.rb'
|
121
|
+
- 'spec/flipper_spec.rb'
|
122
|
+
- 'spec/integration_spec.rb'
|
123
|
+
|
124
|
+
# Offense count: 2
|
125
|
+
Style/AccessorMethodName:
|
126
|
+
Exclude:
|
127
|
+
- 'lib/flipper/adapters/memory.rb'
|
128
|
+
- 'lib/flipper/adapters/pstore.rb'
|
129
|
+
|
130
|
+
# Offense count: 7
|
131
|
+
Style/ConstantName:
|
132
|
+
Exclude:
|
133
|
+
- 'lib/flipper.rb'
|
134
|
+
- 'lib/flipper/adapters/dalli.rb'
|
135
|
+
- 'lib/flipper/adapters/memoizable.rb'
|
136
|
+
- 'lib/flipper/adapters/memory.rb'
|
137
|
+
- 'lib/flipper/adapters/mongo.rb'
|
138
|
+
- 'lib/flipper/adapters/pstore.rb'
|
139
|
+
- 'lib/flipper/adapters/redis.rb'
|
140
|
+
|
141
|
+
# Offense count: 3
|
142
|
+
Style/DoubleNegation:
|
143
|
+
Exclude:
|
144
|
+
- 'lib/flipper/adapters/memoizable.rb'
|
145
|
+
- 'lib/flipper/gates/boolean.rb'
|
146
|
+
- 'lib/flipper/typecast.rb'
|
147
|
+
|
148
|
+
# Offense count: 7
|
149
|
+
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts.
|
150
|
+
Style/FileName:
|
151
|
+
Exclude:
|
152
|
+
- 'lib/flipper-active_record.rb'
|
153
|
+
- 'lib/flipper-api.rb'
|
154
|
+
- 'lib/flipper-cloud.rb'
|
155
|
+
- 'lib/flipper-dalli.rb'
|
156
|
+
- 'lib/flipper-mongo.rb'
|
157
|
+
- 'lib/flipper-redis.rb'
|
158
|
+
- 'lib/flipper-sequel.rb'
|
159
|
+
- 'lib/flipper-ui.rb'
|
160
|
+
|
161
|
+
# Offense count: 2
|
162
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
163
|
+
# SupportedStyles: format, sprintf, percent
|
164
|
+
Style/FormatString:
|
165
|
+
Exclude:
|
166
|
+
- 'lib/flipper/instrumentation/log_subscriber.rb'
|
167
|
+
|
168
|
+
# Offense count: 10
|
169
|
+
# Configuration parameters: MinBodyLength.
|
170
|
+
Style/GuardClause:
|
171
|
+
Exclude:
|
172
|
+
- 'lib/flipper/api/v1/actions/percentage_of_actors_gate.rb'
|
173
|
+
- 'lib/flipper/api/v1/actions/percentage_of_time_gate.rb'
|
174
|
+
- 'lib/flipper/gate_values.rb'
|
175
|
+
- 'lib/flipper/instrumentation/statsd_subscriber.rb'
|
176
|
+
- 'lib/flipper/instrumentation/subscriber.rb'
|
177
|
+
- 'lib/flipper/registry.rb'
|
178
|
+
- 'lib/flipper/typecast.rb'
|
179
|
+
|
180
|
+
# Offense count: 1
|
181
|
+
Style/IfInsideElse:
|
182
|
+
Exclude:
|
183
|
+
- 'lib/flipper/gates/actor.rb'
|
184
|
+
|
185
|
+
# Offense count: 1
|
186
|
+
Style/MethodMissing:
|
187
|
+
Exclude:
|
188
|
+
- 'lib/flipper/types/actor.rb'
|
data/Changelog.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## 0.11
|
2
|
+
|
3
|
+
* Use primary keys with sequel adapter (https://github.com/jnunemaker/flipper/pull/210).
|
4
|
+
* Add redis cache adapter (https://github.com/jnunemaker/flipper/pull/211).
|
5
|
+
* Finish API and HTTP adapter that speaks to API.
|
6
|
+
* Set flipper from env for API and UI (https://github.com/jnunemaker/flipper/pull/223 and https://github.com/jnunemaker/flipper/pull/229).
|
7
|
+
* Add flipper cloud adapter (https://github.com/jnunemaker/flipper/pull/249).
|
8
|
+
* Allow unregistered groups (https://github.com/jnunemaker/flipper/pull/244).
|
9
|
+
* Drop support for Ruby 2.0 as it is end of lined (https://github.com/jnunemaker/flipper/commit/c2c81ed89938155ce91acb5173ac38580f630e3d).
|
10
|
+
|
1
11
|
## 0.10.2
|
2
12
|
|
3
13
|
* Add Adapter#get_multi to allow for efficient loading of more than one feature at a time (https://github.com/jnunemaker/flipper/pull/198)
|
data/Gemfile
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
|
-
gemspec :
|
2
|
+
gemspec name: 'flipper'
|
3
3
|
|
4
4
|
Dir['flipper-*.gemspec'].each do |gemspec|
|
5
5
|
plugin = gemspec.scan(/flipper-(.*)\.gemspec/).flatten.first
|
6
|
-
gemspec(:
|
6
|
+
gemspec(name: "flipper-#{plugin}", development_group: plugin)
|
7
7
|
end
|
8
8
|
|
9
9
|
gem 'rake', '~> 10.4.2'
|
@@ -13,8 +13,11 @@ gem 'statsd-ruby', '~> 1.2.1'
|
|
13
13
|
gem 'rspec', '~> 3.0'
|
14
14
|
gem 'rack-test', '~> 0.6.3'
|
15
15
|
gem 'sqlite3', '~> 1.3.11'
|
16
|
-
gem 'rails', "~> #{ENV[
|
16
|
+
gem 'rails', "~> #{ENV['RAILS_VERSION'] || '4.2.5'}"
|
17
17
|
gem 'minitest', '~> 5.8.0'
|
18
|
+
gem 'rubocop', '~> 0.45.0'
|
19
|
+
gem 'rubocop-rspec', '= 1.5.1'
|
20
|
+
gem 'webmock', '~> 2.0'
|
18
21
|
|
19
22
|
# for active support tests in test/ and only needed for ruby 2.2.x
|
20
23
|
gem 'test-unit', '~> 3.0'
|
data/README.md
CHANGED
@@ -80,9 +80,10 @@ Of course there are more [examples for you to peruse](examples/). You could also
|
|
80
80
|
|
81
81
|
1. Fork it
|
82
82
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
83
|
-
3.
|
84
|
-
4.
|
85
|
-
5.
|
83
|
+
3. Check your changes with Rubocop tests (`script/rubocop`)
|
84
|
+
4. Commit your changes (`git commit -am 'Added some feature'`)
|
85
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
86
|
+
6. Create new Pull Request
|
86
87
|
|
87
88
|
## Releasing
|
88
89
|
|
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
|
-
$LOAD_PATH.push File.expand_path(
|
2
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
3
3
|
require 'rake/testtask'
|
4
|
-
require
|
4
|
+
require 'flipper/version'
|
5
5
|
|
6
6
|
# gem install pkg/*.gem
|
7
7
|
# gem uninstall flipper flipper-ui flipper-redis
|
@@ -16,34 +16,34 @@ task :build do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
desc 'Tags version, pushes to remote, and pushes gem'
|
19
|
-
task :
|
19
|
+
task release: :build do
|
20
20
|
sh 'git', 'tag', "v#{Flipper::VERSION}"
|
21
|
-
sh
|
21
|
+
sh 'git push origin master'
|
22
22
|
sh "git push origin v#{Flipper::VERSION}"
|
23
|
-
sh
|
23
|
+
sh 'ls pkg/*.gem | xargs -n 1 gem push'
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
26
|
+
require 'rspec/core/rake_task'
|
27
27
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
28
28
|
t.rspec_opts = %w(--color)
|
29
29
|
end
|
30
30
|
|
31
31
|
namespace :spec do
|
32
|
-
desc
|
32
|
+
desc 'Run specs for UI queue'
|
33
33
|
RSpec::Core::RakeTask.new(:ui) do |t|
|
34
34
|
t.rspec_opts = %w(--color)
|
35
|
-
t.pattern = [
|
35
|
+
t.pattern = ['spec/flipper/ui/**/*_spec.rb', 'spec/flipper/ui_spec.rb']
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
Rake::TestTask.new do |t|
|
40
|
-
t.libs =
|
41
|
-
t.pattern =
|
40
|
+
t.libs = %w(lib test)
|
41
|
+
t.pattern = 'test/**/*_test.rb'
|
42
42
|
end
|
43
43
|
|
44
44
|
Rake::TestTask.new(:shared_test) do |t|
|
45
|
-
t.libs =
|
46
|
-
t.pattern =
|
45
|
+
t.libs = %w(lib test)
|
46
|
+
t.pattern = 'lib/flipper/shared/test/**_test.rb'
|
47
47
|
end
|
48
48
|
|
49
|
-
task :
|
49
|
+
task default: [:spec, :test, :shared_test]
|
data/docs/Adapters.md
CHANGED
@@ -11,10 +11,11 @@ I plan on supporting the adapters in the flipper repo. Other adapters are welcom
|
|
11
11
|
* [ActiveRecord adapter](https://github.com/jnunemaker/flipper/blob/master/docs/active_record) - Rails 3, 4, and 5.
|
12
12
|
* [Sequel adapter](https://github.com/jnunemaker/flipper/blob/master/docs/sequel)
|
13
13
|
* [Cassanity adapter](https://github.com/jnunemaker/flipper-cassanity)
|
14
|
+
* [read-only adapter](https://github.com/jnunemaker/flipper/blob/master/docs/read-only)
|
15
|
+
* [Http adapter](https://github.com/jnunemaker/flipper/blob/master/docs/http)
|
14
16
|
|
15
17
|
## Community Supported
|
16
18
|
|
17
|
-
* [Active Record 4 adapter](https://github.com/bgentry/flipper-activerecord)
|
18
19
|
* [Active Record 3 adapter](https://github.com/blueboxjesse/flipper-activerecord)
|
19
20
|
* [Consul adapter](https://github.com/gdavison/flipper-consul)
|
20
21
|
|
data/docs/DockerCompose.md
CHANGED
@@ -7,9 +7,12 @@ new contributor could start working on code with a minumum efforts.
|
|
7
7
|
## Steps:
|
8
8
|
|
9
9
|
1. Install Docker Compose https://docs.docker.com/compose/install
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
1. Build the app container `docker-compose build`
|
11
|
+
1. Install gems `docker-compose run --rm app bundle install`
|
12
|
+
1. Run specs `docker-compose run --rm app bundle exec rspec`
|
13
|
+
1. Run tests `docker-compose run --rm app bundle exec rake test`
|
14
|
+
1. Clear and check files with Rubocop `docker-compose run --rm app bundle exec rubocop -D`
|
15
|
+
1. Optional: log in to container an using a bash for running specs
|
13
16
|
```sh
|
14
17
|
docker-compose run --rm app bash
|
15
18
|
bundle exec rspec
|
data/docs/Gates.md
CHANGED
@@ -24,8 +24,8 @@ end
|
|
24
24
|
|
25
25
|
flipper = Flipper.new(adapter)
|
26
26
|
|
27
|
-
flipper[:stats].enable flipper.group(:admins) # turn on for admins
|
28
|
-
flipper[:stats].disable flipper.group(:admins) # turn off for admins
|
27
|
+
flipper[:stats].enable flipper.group(:admins) # turn on the stats feature for admins
|
28
|
+
flipper[:stats].disable flipper.group(:admins) # turn off the stats feature for admins
|
29
29
|
|
30
30
|
person = Person.find(params[:id])
|
31
31
|
flipper[:stats].enabled? person # check if enabled, returns true if person.admin? is true
|
@@ -37,7 +37,29 @@ flipper[:stats].enable_group :admins
|
|
37
37
|
flipper[:stats].disable_group :admins
|
38
38
|
```
|
39
39
|
|
40
|
-
|
40
|
+
Here's a quick explanation of the above code block:
|
41
|
+
|
42
|
+
```
|
43
|
+
Flipper.register(:admins) do |actor|
|
44
|
+
actor.respond_to?(:admin?) && actor.admin?
|
45
|
+
end
|
46
|
+
```
|
47
|
+
- The above first registers a group called `admins` which essentially saves a [Proc](http://www.eriktrautman.com/posts/ruby-explained-blocks-procs-and-lambdas-aka-closures) to be called later.
|
48
|
+
|
49
|
+
```
|
50
|
+
flipper[:stats].enable flipper.group(:admins)
|
51
|
+
```
|
52
|
+
|
53
|
+
- The above enables the stats feature to any object that returns true from the :admins proc.
|
54
|
+
|
55
|
+
```
|
56
|
+
person = Person.find(params[:id])
|
57
|
+
flipper[:stats].enabled? person # check if person is enabled, returns true if person.admin? is true
|
58
|
+
```
|
59
|
+
|
60
|
+
When the `person` object is passed to the `enabled?` method, it is then passed into the proc. If the proc returns true, the entire statement returns true and so `flipper[:stats].enabled? person` returns true. Whatever logic follows this conditional check is then executed.
|
61
|
+
|
62
|
+
There is no requirement that the thing yielded to the block be a user model or whatever. It can be anything you want, therefore it is a good idea to check that the thing passed into the group block actually responds to what you are trying to do in the `register` proc.
|
41
63
|
|
42
64
|
## 3. Individual Actor
|
43
65
|
|
data/docs/Optimization.md
CHANGED
@@ -12,8 +12,10 @@ You can use the middleware from a Rails initializer like so:
|
|
12
12
|
# create flipper dsl instance, see above Usage for more details
|
13
13
|
flipper = Flipper.new(...)
|
14
14
|
|
15
|
+
require 'flipper/middleware/setup_env'
|
15
16
|
require 'flipper/middleware/memoizer'
|
16
|
-
config.middleware.use Flipper::Middleware::
|
17
|
+
config.middleware.use Flipper::Middleware::SetupEnv, flipper
|
18
|
+
config.middleware.use Flipper::Middleware::Memoizer
|
17
19
|
```
|
18
20
|
|
19
21
|
If you set your flipper instance up in an initializer, you can pass a block to the middleware and it will lazily load the instance the first time the middleware is invoked.
|
@@ -27,9 +29,12 @@ module MyRailsApp
|
|
27
29
|
end
|
28
30
|
|
29
31
|
# config/application.rb
|
30
|
-
|
32
|
+
require 'flipper/middleware/setup_env'
|
33
|
+
require 'flipper/middleware/memoizer'
|
34
|
+
config.middleware.use Flipper::Middleware::SetupEnv, lambda {
|
31
35
|
MyRailsApp.flipper
|
32
36
|
}
|
37
|
+
config.middleware.use Flipper::Middleware::Memoizer
|
33
38
|
```
|
34
39
|
|
35
40
|
**Note**: Be sure that the middleware is high enough up in your stack that all feature checks are wrapped.
|
@@ -40,12 +45,12 @@ The Memoizer middleware also supports a few options. Use either `preload` or `pr
|
|
40
45
|
|
41
46
|
* **`:preload`** - An `Array` of feature names (`Symbol`) to preload for every request. Useful if you have features that are used on every endpoint. `preload` uses `Adapter#get_multi` to attempt to load the features in one network call instead of N+1 network calls.
|
42
47
|
```ruby
|
43
|
-
config.middleware.use Flipper::Middleware::Memoizer,
|
48
|
+
config.middleware.use Flipper::Middleware::Memoizer,
|
44
49
|
preload: [:stats, :search, :some_feature]
|
45
50
|
```
|
46
|
-
* **`:preload_all`** - A Boolean value (default: false) of whether or not all features should be preloaded. Using this results in a `preload` call with the result of `Adapter#features`. Any subsequent feature checks will be memoized and perform no network calls. I wouldn't recommend using this unless you have few features (< 30?) and nearly all of them are used on every request.
|
51
|
+
* **`:preload_all`** - A Boolean value (default: false) of whether or not all features should be preloaded. Using this results in a `preload` call with the result of `Adapter#features`. Any subsequent feature checks will be memoized and perform no network calls. I wouldn't recommend using this unless you have few features (< 30?) and nearly all of them are used on every request.
|
47
52
|
```ruby
|
48
|
-
config.middleware.use Flipper::Middleware::Memoizer,
|
53
|
+
config.middleware.use Flipper::Middleware::Memoizer,
|
49
54
|
preload_all: true
|
50
55
|
```
|
51
56
|
|
@@ -67,3 +72,20 @@ memory_adapter = Flipper::Adapters::Memory.new
|
|
67
72
|
adapter = Flipper::Adapters::Dalli.new(memory_adapter, dalli_client, 600)
|
68
73
|
flipper = Flipper.new(adapter)
|
69
74
|
```
|
75
|
+
### RedisCache
|
76
|
+
|
77
|
+
Applications using [Redis](https://redis.io/) via the [redis-rb](https://github.com/redis/redis-rb) client can take advantage of the RedisCache adapter.
|
78
|
+
|
79
|
+
Initialize `RedisCache` with a flipper [adapter](https://github.com/jnunemaker/flipper/blob/master/docs/Adapters.md), a Redis client instance, and an optional TTL in seconds. TTL defaults to 3600 seconds.
|
80
|
+
|
81
|
+
Example using the RedisCache adapter with the Memory adapter and a TTL of 4800 seconds:
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
require 'flipper/adapters/memory'
|
85
|
+
require 'flipper/adapters/redis_cache'
|
86
|
+
|
87
|
+
redis = Redis.new(url: ENV['REDIS_URL'])
|
88
|
+
memory_adapter = Flipper::Adapters::Memory.new
|
89
|
+
adapter = Flipper::Adapters::RedisCache.new(memory_adapter, redis, 4800)
|
90
|
+
flipper = Flipper.new(adapter)
|
91
|
+
```
|