simple_feature_flags 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +25 -23
- data/README.md +53 -2
- data/lib/simple_feature_flags/ram_storage.rb +48 -8
- data/lib/simple_feature_flags/redis_storage.rb +48 -8
- data/lib/simple_feature_flags/version.rb +1 -1
- data/lib/simple_feature_flags.rb +2 -2
- 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: 27f8966e824b5b17fd9c76095203e7bb4999d7332e64dcc32c43dcc8784541b2
|
4
|
+
data.tar.gz: 907626c29e851f93aeddd9e1be8d63dac9c85f7fb13ad0424bddbf83fe1e58d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 420763922a049e720412d3dff1a9461c953ab4be1e7d4991b5b0b15f96d22d162c2a169071a31bd528fc3f87dc8f59bfc2c95ae21c6e0751a34b0a7187d8c4e4
|
7
|
+
data.tar.gz: 6403704ba929bfa87268e30676f1b15d520796be973485457ddf55ddccd81f6cbb922c4015decfd8dd95fa009c3305e0030e3881471989784dbabc53d33f9a10
|
data/Gemfile.lock
CHANGED
@@ -1,56 +1,56 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
simple_feature_flags (1.
|
4
|
+
simple_feature_flags (1.2.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
10
|
backport (1.2.0)
|
11
|
-
benchmark (0.
|
12
|
-
bundler-audit (0.
|
11
|
+
benchmark (0.2.0)
|
12
|
+
bundler-audit (0.9.0.1)
|
13
13
|
bundler (>= 1.2.0, < 3)
|
14
14
|
thor (~> 1.0)
|
15
15
|
byebug (11.1.3)
|
16
|
-
diff-lcs (1.
|
16
|
+
diff-lcs (1.5.0)
|
17
17
|
e2mmap (0.1.0)
|
18
18
|
jaro_winkler (1.5.4)
|
19
19
|
kramdown (2.3.1)
|
20
20
|
rexml
|
21
21
|
kramdown-parser-gfm (1.1.0)
|
22
22
|
kramdown (~> 2.0)
|
23
|
-
mini_portile2 (2.
|
24
|
-
minitest (5.
|
25
|
-
nokogiri (1.
|
26
|
-
mini_portile2 (~> 2.
|
23
|
+
mini_portile2 (2.7.1)
|
24
|
+
minitest (5.15.0)
|
25
|
+
nokogiri (1.13.1)
|
26
|
+
mini_portile2 (~> 2.7.0)
|
27
27
|
racc (~> 1.4)
|
28
|
-
parallel (1.
|
29
|
-
parser (3.0.
|
28
|
+
parallel (1.21.0)
|
29
|
+
parser (3.1.0.0)
|
30
30
|
ast (~> 2.4.1)
|
31
|
-
racc (1.
|
32
|
-
rainbow (3.
|
31
|
+
racc (1.6.0)
|
32
|
+
rainbow (3.1.1)
|
33
33
|
rake (12.3.3)
|
34
|
-
redis (4.
|
34
|
+
redis (4.6.0)
|
35
35
|
redis-namespace (1.8.1)
|
36
36
|
redis (>= 3.0.4)
|
37
|
-
regexp_parser (2.
|
38
|
-
reverse_markdown (2.
|
37
|
+
regexp_parser (2.2.1)
|
38
|
+
reverse_markdown (2.1.1)
|
39
39
|
nokogiri
|
40
40
|
rexml (3.2.5)
|
41
|
-
rubocop (1.
|
41
|
+
rubocop (1.25.1)
|
42
42
|
parallel (~> 1.10)
|
43
|
-
parser (>= 3.
|
43
|
+
parser (>= 3.1.0.0)
|
44
44
|
rainbow (>= 2.2.2, < 4.0)
|
45
45
|
regexp_parser (>= 1.8, < 3.0)
|
46
46
|
rexml
|
47
|
-
rubocop-ast (>= 1.
|
47
|
+
rubocop-ast (>= 1.15.1, < 2.0)
|
48
48
|
ruby-progressbar (~> 1.7)
|
49
49
|
unicode-display_width (>= 1.4.0, < 3.0)
|
50
|
-
rubocop-ast (1.
|
50
|
+
rubocop-ast (1.15.2)
|
51
51
|
parser (>= 3.0.1.1)
|
52
52
|
ruby-progressbar (1.11.0)
|
53
|
-
solargraph (0.
|
53
|
+
solargraph (0.44.3)
|
54
54
|
backport (~> 1.2)
|
55
55
|
benchmark
|
56
56
|
bundler (>= 1.17.2)
|
@@ -65,10 +65,12 @@ GEM
|
|
65
65
|
thor (~> 1.0)
|
66
66
|
tilt (~> 2.0)
|
67
67
|
yard (~> 0.9, >= 0.9.24)
|
68
|
-
thor (1.1
|
68
|
+
thor (1.2.1)
|
69
69
|
tilt (2.0.10)
|
70
|
-
unicode-display_width (2.
|
71
|
-
|
70
|
+
unicode-display_width (2.1.0)
|
71
|
+
webrick (1.7.0)
|
72
|
+
yard (0.9.27)
|
73
|
+
webrick (~> 1.7.0)
|
72
74
|
|
73
75
|
PLATFORMS
|
74
76
|
ruby
|
data/README.md
CHANGED
@@ -136,11 +136,19 @@ FEATURE_FLAGS.active?(:feature_name) #=> false
|
|
136
136
|
FEATURE_FLAGS.active_globally?(:feature_name) #=> false
|
137
137
|
FEATURE_FLAGS.active_partially?(:feature_name) #=> false
|
138
138
|
|
139
|
+
FEATURE_FLAGS.inactive?(:feature_name) #=> true
|
140
|
+
FEATURE_FLAGS.inactive_globally?(:feature_name) #=> true
|
141
|
+
FEATURE_FLAGS.inactive_partially?(:feature_name) #=> true
|
142
|
+
|
139
143
|
FEATURE_FLAGS.activate(:feature_name) # or FEATURE_FLAGS.activate_globally(:feature_name)
|
140
144
|
|
141
145
|
FEATURE_FLAGS.active?(:feature_name) #=> true
|
142
146
|
FEATURE_FLAGS.active_globally?(:feature_name) #=> true
|
143
147
|
FEATURE_FLAGS.active_partially?(:feature_name) #=> false
|
148
|
+
|
149
|
+
FEATURE_FLAGS.inactive?(:feature_name) #=> false
|
150
|
+
FEATURE_FLAGS.inactive_globally?(:feature_name) #=> false
|
151
|
+
FEATURE_FLAGS.inactive_partially?(:feature_name) #=> true
|
144
152
|
```
|
145
153
|
|
146
154
|
#### Deactivate a feature
|
@@ -149,10 +157,12 @@ Deactivates a feature in the global scope
|
|
149
157
|
|
150
158
|
```ruby
|
151
159
|
FEATURE_FLAGS.active?(:feature_name) #=> true
|
160
|
+
FEATURE_FLAGS.inactive?(:feature_name) #=> false
|
152
161
|
|
153
162
|
FEATURE_FLAGS.deactivate(:feature_name)
|
154
163
|
|
155
164
|
FEATURE_FLAGS.active?(:feature_name) #=> false
|
165
|
+
FEATURE_FLAGS.inactive?(:feature_name) #=> true
|
156
166
|
```
|
157
167
|
|
158
168
|
#### Activate a feature for a particular record/object
|
@@ -162,11 +172,19 @@ FEATURE_FLAGS.active_partially?(:feature_name) #=> true
|
|
162
172
|
FEATURE_FLAGS.active_for?(:feature_name, User.first) #=> false
|
163
173
|
FEATURE_FLAGS.active_for?(:feature_name, User.last) #=> false
|
164
174
|
|
175
|
+
FEATURE_FLAGS.inactive_partially?(:feature_name) #=> false
|
176
|
+
FEATURE_FLAGS.inactive_for?(:feature_name, User.first) #=> true
|
177
|
+
FEATURE_FLAGS.inactive_for?(:feature_name, User.last) #=> true
|
178
|
+
|
165
179
|
FEATURE_FLAGS.activate_for(:feature_name, User.first) #=> true
|
166
180
|
|
167
181
|
FEATURE_FLAGS.active_partially?(:feature_name) #=> true
|
168
182
|
FEATURE_FLAGS.active_for?(:feature_name, User.first) #=> true
|
169
183
|
FEATURE_FLAGS.active_for?(:feature_name, User.last) #=> false
|
184
|
+
|
185
|
+
FEATURE_FLAGS.inactive_partially?(:feature_name) #=> false
|
186
|
+
FEATURE_FLAGS.inactive_for?(:feature_name, User.first) #=> false
|
187
|
+
FEATURE_FLAGS.inactive_for?(:feature_name, User.last) #=> true
|
170
188
|
```
|
171
189
|
|
172
190
|
Note that the flag itself has to be active `partially` for any record/object specific settings to work.
|
@@ -299,6 +317,10 @@ if FEATURE_FLAGS.active?(:feature_name)
|
|
299
317
|
number += 1
|
300
318
|
end
|
301
319
|
|
320
|
+
if FEATURE_FLAGS.inactive?(:feature_name)
|
321
|
+
number += 1
|
322
|
+
end
|
323
|
+
|
302
324
|
# or using a block
|
303
325
|
|
304
326
|
# this code will run only when the :feature_name flag is active (either partially or globally)
|
@@ -306,27 +328,52 @@ FEATURE_FLAGS.when_active(:feature_name) do
|
|
306
328
|
number += 1
|
307
329
|
end
|
308
330
|
|
331
|
+
# the opposite
|
332
|
+
FEATURE_FLAGS.when_inactive(:feature_name) do
|
333
|
+
number += 1
|
334
|
+
end
|
335
|
+
|
309
336
|
# this code will run only when the :feature_name flag is active globally
|
310
337
|
FEATURE_FLAGS.when_active_globally(:feature_name) do
|
311
338
|
number += 1
|
312
339
|
end
|
313
340
|
|
341
|
+
# the opposite
|
342
|
+
FEATURE_FLAGS.when_inactive_globally(:feature_name) do
|
343
|
+
number += 1
|
344
|
+
end
|
345
|
+
|
314
346
|
# this code will run only when the :feature_name flag is active partially (only for specific records/users)
|
315
347
|
FEATURE_FLAGS.when_active_partially(:feature_name) do
|
316
348
|
number += 1
|
317
349
|
end
|
318
350
|
|
319
|
-
#
|
351
|
+
# the opposite
|
352
|
+
FEATURE_FLAGS.when_inactive_partially(:feature_name) do
|
353
|
+
number += 1
|
354
|
+
end
|
355
|
+
|
356
|
+
# this code will run only if the :feature_name flag is active for the first User
|
320
357
|
FEATURE_FLAGS.when_active_for(:feature_name, User.first) do
|
321
358
|
number += 1
|
322
359
|
end
|
323
360
|
|
361
|
+
# the opposite
|
362
|
+
FEATURE_FLAGS.when_inactive_for(:feature_name, User.first) do
|
363
|
+
number += 1
|
364
|
+
end
|
365
|
+
|
324
366
|
# feature flags that don't exist will return false
|
325
367
|
FEATURE_FLAGS.active?(:non_existant) #=> false
|
368
|
+
FEATURE_FLAGS.inactive?(:non_existant) #=> true
|
326
369
|
|
327
370
|
if FEATURE_FLAGS.active_for?(:feature_name, User.first)
|
328
371
|
number += 1
|
329
372
|
end
|
373
|
+
|
374
|
+
if FEATURE_FLAGS.inactive_for?(:feature_name, User.first)
|
375
|
+
number += 1
|
376
|
+
end
|
330
377
|
```
|
331
378
|
|
332
379
|
#### Adding feature flags
|
@@ -340,7 +387,7 @@ FEATURE_FLAGS.add(:feature_name, 'Description')
|
|
340
387
|
FEATURE_FLAGS.active?(:feature_name) #=> false
|
341
388
|
FEATURE_FLAGS.active_partially?(:feature_name) #=> false
|
342
389
|
FEATURE_FLAGS.active_globally?(:feature_name) #=> false
|
343
|
-
FEATURE_FLAGS.active_for?(:
|
390
|
+
FEATURE_FLAGS.active_for?(:feature_name, User.first) #=> false
|
344
391
|
|
345
392
|
# add a new globally active flag
|
346
393
|
FEATURE_FLAGS.add(:active_feature, 'Description', :globally)
|
@@ -370,6 +417,10 @@ FEATURE_FLAGS.remove(:feature_name)
|
|
370
417
|
FEATURE_FLAGS.active?(:feature_name) #=> false
|
371
418
|
FEATURE_FLAGS.active_partially?(:feature_name) #=> false
|
372
419
|
FEATURE_FLAGS.active_globally?(:feature_name) #=> false
|
420
|
+
|
421
|
+
FEATURE_FLAGS.inactive?(:feature_name) #=> true
|
422
|
+
FEATURE_FLAGS.inactive_partially?(:feature_name) #=> true
|
423
|
+
FEATURE_FLAGS.inactive_globally?(:feature_name) #=> true
|
373
424
|
```
|
374
425
|
|
375
426
|
|
@@ -34,14 +34,26 @@ module SimpleFeatureFlags
|
|
34
34
|
false
|
35
35
|
end
|
36
36
|
|
37
|
+
def inactive?(feature)
|
38
|
+
!active?(feature)
|
39
|
+
end
|
40
|
+
|
37
41
|
def active_globally?(feature)
|
38
42
|
ACTIVE_GLOBALLY.include? flags.dig(feature.to_sym, 'active')
|
39
43
|
end
|
40
44
|
|
45
|
+
def inactive_globally?(feature)
|
46
|
+
!active_globally?(feature)
|
47
|
+
end
|
48
|
+
|
41
49
|
def active_partially?(feature)
|
42
50
|
ACTIVE_PARTIALLY.include? flags.dig(feature.to_sym, 'active')
|
43
51
|
end
|
44
52
|
|
53
|
+
def inactive_partially?(feature)
|
54
|
+
!active_partially?(feature)
|
55
|
+
end
|
56
|
+
|
45
57
|
def active_for?(feature, object, object_id_method = CONFIG.default_id_method)
|
46
58
|
return false unless active?(feature)
|
47
59
|
return true if active_globally?(feature)
|
@@ -54,6 +66,10 @@ module SimpleFeatureFlags
|
|
54
66
|
active_ids.include? object.public_send(object_id_method)
|
55
67
|
end
|
56
68
|
|
69
|
+
def inactive_for?(feature, object, object_id_method = CONFIG.default_id_method)
|
70
|
+
!active_for?(feature, object, object_id_method)
|
71
|
+
end
|
72
|
+
|
57
73
|
def exists?(feature)
|
58
74
|
return false if [nil, ''].include? flags[feature.to_sym]
|
59
75
|
|
@@ -64,28 +80,52 @@ module SimpleFeatureFlags
|
|
64
80
|
flags.dig(feature.to_sym, 'description')
|
65
81
|
end
|
66
82
|
|
67
|
-
def when_active(feature
|
83
|
+
def when_active(feature)
|
68
84
|
return unless active?(feature)
|
69
85
|
|
70
|
-
|
86
|
+
yield
|
87
|
+
end
|
88
|
+
|
89
|
+
def when_inactive(feature)
|
90
|
+
return unless inactive?(feature)
|
91
|
+
|
92
|
+
yield
|
71
93
|
end
|
72
94
|
|
73
|
-
def when_active_globally(feature
|
95
|
+
def when_active_globally(feature)
|
74
96
|
return unless active_globally?(feature)
|
75
97
|
|
76
|
-
|
98
|
+
yield
|
77
99
|
end
|
78
100
|
|
79
|
-
def
|
101
|
+
def when_inactive_globally(feature)
|
102
|
+
return unless inactive_globally?(feature)
|
103
|
+
|
104
|
+
yield
|
105
|
+
end
|
106
|
+
|
107
|
+
def when_active_partially(feature)
|
80
108
|
return unless active_partially?(feature)
|
81
109
|
|
82
|
-
|
110
|
+
yield
|
111
|
+
end
|
112
|
+
|
113
|
+
def when_inactive_partially(feature)
|
114
|
+
return unless inactive_partially?(feature)
|
115
|
+
|
116
|
+
yield
|
83
117
|
end
|
84
118
|
|
85
|
-
def when_active_for(feature, object, object_id_method = CONFIG.default_id_method
|
119
|
+
def when_active_for(feature, object, object_id_method = CONFIG.default_id_method)
|
86
120
|
return unless active_for?(feature, object, object_id_method)
|
87
121
|
|
88
|
-
|
122
|
+
yield
|
123
|
+
end
|
124
|
+
|
125
|
+
def when_inactive_for(feature, object, object_id_method = CONFIG.default_id_method)
|
126
|
+
return unless inactive_for?(feature, object, object_id_method)
|
127
|
+
|
128
|
+
yield
|
89
129
|
end
|
90
130
|
|
91
131
|
def activate(feature)
|
@@ -33,14 +33,26 @@ module SimpleFeatureFlags
|
|
33
33
|
false
|
34
34
|
end
|
35
35
|
|
36
|
+
def inactive?(feature)
|
37
|
+
!active?(feature)
|
38
|
+
end
|
39
|
+
|
36
40
|
def active_globally?(feature)
|
37
41
|
ACTIVE_GLOBALLY.include? redis.hget(feature.to_s, 'active')
|
38
42
|
end
|
39
43
|
|
44
|
+
def inactive_globally?(feature)
|
45
|
+
!active_globally?(feature)
|
46
|
+
end
|
47
|
+
|
40
48
|
def active_partially?(feature)
|
41
49
|
ACTIVE_PARTIALLY.include? redis.hget(feature.to_s, 'active')
|
42
50
|
end
|
43
51
|
|
52
|
+
def inactive_partially?(feature)
|
53
|
+
!active_partially?(feature)
|
54
|
+
end
|
55
|
+
|
44
56
|
def active_for?(feature, object, object_id_method = CONFIG.default_id_method)
|
45
57
|
return false unless active?(feature)
|
46
58
|
return true if active_globally?(feature)
|
@@ -53,6 +65,10 @@ module SimpleFeatureFlags
|
|
53
65
|
active_ids.include? object.public_send(object_id_method)
|
54
66
|
end
|
55
67
|
|
68
|
+
def inactive_for?(feature, object, object_id_method = CONFIG.default_id_method)
|
69
|
+
!active_for?(feature, object, object_id_method)
|
70
|
+
end
|
71
|
+
|
56
72
|
def exists?(feature)
|
57
73
|
return false if [nil, ''].include? redis.hget(feature.to_s, 'name')
|
58
74
|
|
@@ -63,28 +79,52 @@ module SimpleFeatureFlags
|
|
63
79
|
redis.hget(feature.to_s, 'description')
|
64
80
|
end
|
65
81
|
|
66
|
-
def when_active(feature
|
82
|
+
def when_active(feature)
|
67
83
|
return unless active?(feature)
|
68
84
|
|
69
|
-
|
85
|
+
yield
|
86
|
+
end
|
87
|
+
|
88
|
+
def when_inactive(feature)
|
89
|
+
return unless inactive?(feature)
|
90
|
+
|
91
|
+
yield
|
70
92
|
end
|
71
93
|
|
72
|
-
def when_active_globally(feature
|
94
|
+
def when_active_globally(feature)
|
73
95
|
return unless active_globally?(feature)
|
74
96
|
|
75
|
-
|
97
|
+
yield
|
76
98
|
end
|
77
99
|
|
78
|
-
def
|
100
|
+
def when_inactive_globally(feature)
|
101
|
+
return unless inactive_globally?(feature)
|
102
|
+
|
103
|
+
yield
|
104
|
+
end
|
105
|
+
|
106
|
+
def when_active_partially(feature)
|
79
107
|
return unless active_partially?(feature)
|
80
108
|
|
81
|
-
|
109
|
+
yield
|
110
|
+
end
|
111
|
+
|
112
|
+
def when_inactive_partially(feature)
|
113
|
+
return unless inactive_partially?(feature)
|
114
|
+
|
115
|
+
yield
|
82
116
|
end
|
83
117
|
|
84
|
-
def when_active_for(feature, object, object_id_method = CONFIG.default_id_method
|
118
|
+
def when_active_for(feature, object, object_id_method = CONFIG.default_id_method)
|
85
119
|
return unless active_for?(feature, object, object_id_method)
|
86
120
|
|
87
|
-
|
121
|
+
yield
|
122
|
+
end
|
123
|
+
|
124
|
+
def when_inactive_for(feature, object, object_id_method = CONFIG.default_id_method)
|
125
|
+
return unless inactive_for?(feature, object, object_id_method)
|
126
|
+
|
127
|
+
yield
|
88
128
|
end
|
89
129
|
|
90
130
|
def activate(feature)
|
data/lib/simple_feature_flags.rb
CHANGED
@@ -10,8 +10,8 @@ module SimpleFeatureFlags
|
|
10
10
|
UI_CLASS_NAME = '::SimpleFeatureFlags::Ui'
|
11
11
|
WEB_UI_CLASS_NAME = '::SimpleFeatureFlags::Ui::Web'
|
12
12
|
|
13
|
-
ACTIVE_GLOBALLY = ['globally', :globally, 'true', true].freeze
|
14
|
-
ACTIVE_PARTIALLY = ['partially', :partially].freeze
|
13
|
+
ACTIVE_GLOBALLY = ::Set['globally', :globally, 'true', true].freeze
|
14
|
+
ACTIVE_PARTIALLY = ::Set['partially', :partially].freeze
|
15
15
|
|
16
16
|
class NoSuchCommandError < StandardError; end
|
17
17
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_feature_flags
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Espago
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|