unleash 4.4.0 → 4.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/stale.yml +1 -0
- data/.github/workflows/pull_request.yml +4 -2
- data/.rubocop.yml +3 -2
- data/README.md +26 -3
- data/lib/unleash/client.rb +11 -0
- data/lib/unleash/constraint.rb +1 -0
- data/lib/unleash/context.rb +1 -1
- data/lib/unleash/feature_toggle.rb +11 -5
- data/lib/unleash/metrics.rb +20 -12
- data/lib/unleash/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8461b30f4a58518d73731731a7dfbc32041a5a017362319b9d8ba76d2cecb98
|
4
|
+
data.tar.gz: '06098a3f106f50b0ddad46e17bef57584918ecbefe88486009d95edbdb546550'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec0644f3bd93de7f75b06e44c059d39ff3ed87af00ee7ca17d1ad3a3e444626f190c4e26863167b116eda85ce0c01196542f8167f4494052fdae9b3e3e09e15c
|
7
|
+
data.tar.gz: 11764caf8ccd33c757cbd282a5e5f3d6d6b9dc7b70c29c0e9e196b512be3c1baee10abb21279358e7c7001a91b3825d5c42661910695e74e9e1585e2003c9b58
|
data/.github/stale.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
_extends: .github
|
@@ -28,8 +28,10 @@ jobs:
|
|
28
28
|
- ubuntu
|
29
29
|
- macos
|
30
30
|
ruby-version:
|
31
|
-
- jruby-9.
|
31
|
+
- jruby-9.4
|
32
32
|
- jruby-9.3
|
33
|
+
- jruby-9.2
|
34
|
+
- 3.2
|
33
35
|
- 3.1
|
34
36
|
- '3.0'
|
35
37
|
- 2.7
|
@@ -37,7 +39,7 @@ jobs:
|
|
37
39
|
- 2.5
|
38
40
|
|
39
41
|
steps:
|
40
|
-
- uses: actions/checkout@
|
42
|
+
- uses: actions/checkout@v3
|
41
43
|
- name: Set up Ruby ${{ matrix.ruby-version }}
|
42
44
|
uses: ruby/setup-ruby@v1
|
43
45
|
with:
|
data/.rubocop.yml
CHANGED
@@ -6,10 +6,11 @@ AllCops:
|
|
6
6
|
Naming/PredicateName:
|
7
7
|
AllowedMethods:
|
8
8
|
- is_enabled?
|
9
|
+
- is_disabled?
|
9
10
|
|
10
11
|
|
11
12
|
Metrics/ClassLength:
|
12
|
-
Max:
|
13
|
+
Max: 135
|
13
14
|
Layout/LineLength:
|
14
15
|
Max: 140
|
15
16
|
Metrics/MethodLength:
|
@@ -22,7 +23,7 @@ Metrics/BlockLength:
|
|
22
23
|
Metrics/AbcSize:
|
23
24
|
Max: 30
|
24
25
|
Metrics/CyclomaticComplexity:
|
25
|
-
Max:
|
26
|
+
Max: 10
|
26
27
|
Metrics/PerceivedComplexity:
|
27
28
|
Max: 10
|
28
29
|
|
data/README.md
CHANGED
@@ -10,11 +10,13 @@ Leverage the [Unleash Server](https://github.com/Unleash/unleash) for powerful f
|
|
10
10
|
|
11
11
|
## Supported Ruby Interpreters
|
12
12
|
|
13
|
+
* MRI 3.2
|
13
14
|
* MRI 3.1
|
14
15
|
* MRI 3.0
|
15
16
|
* MRI 2.7
|
16
17
|
* MRI 2.6
|
17
18
|
* MRI 2.5
|
19
|
+
* jruby 9.4
|
18
20
|
* jruby 9.3
|
19
21
|
* jruby 9.2
|
20
22
|
|
@@ -23,7 +25,7 @@ Leverage the [Unleash Server](https://github.com/Unleash/unleash) for powerful f
|
|
23
25
|
Add this line to your application's Gemfile:
|
24
26
|
|
25
27
|
```ruby
|
26
|
-
gem 'unleash', '~> 4.
|
28
|
+
gem 'unleash', '~> 4.4.0'
|
27
29
|
```
|
28
30
|
|
29
31
|
And then execute:
|
@@ -123,6 +125,12 @@ if @unleash.is_enabled?(feature_name, unleash_context)
|
|
123
125
|
else
|
124
126
|
puts " #{feature_name} is disabled according to unleash"
|
125
127
|
end
|
128
|
+
|
129
|
+
if @unleash.is_disabled?(feature_name, unleash_context)
|
130
|
+
puts " #{feature_name} is disabled according to unleash"
|
131
|
+
else
|
132
|
+
puts " #{feature_name} is enabled according to unleash"
|
133
|
+
end
|
126
134
|
```
|
127
135
|
|
128
136
|
## Usage in a Rails Application
|
@@ -302,6 +310,9 @@ Then wherever in your application that you need a feature toggle, you can use:
|
|
302
310
|
if UNLEASH.is_enabled? "AwesomeFeature", @unleash_context
|
303
311
|
puts "AwesomeFeature is enabled"
|
304
312
|
end
|
313
|
+
if UNLEASH.is_disabled? "AwesomeFeature", @unleash_context
|
314
|
+
puts "AwesomeFeature is disabled"
|
315
|
+
end
|
305
316
|
```
|
306
317
|
|
307
318
|
or if client is set in `Rails.configuration.unleash`:
|
@@ -310,6 +321,9 @@ or if client is set in `Rails.configuration.unleash`:
|
|
310
321
|
if Rails.configuration.unleash.is_enabled? "AwesomeFeature", @unleash_context
|
311
322
|
puts "AwesomeFeature is enabled"
|
312
323
|
end
|
324
|
+
if Rails.configuration.unleash.is_disabled? "AwesomeFeature", @unleash_context
|
325
|
+
puts "AwesomeFeature is enabled"
|
326
|
+
end
|
313
327
|
```
|
314
328
|
|
315
329
|
If the feature is not found in the server, it will by default return false.
|
@@ -443,6 +457,9 @@ Method Name | Description | Return Type |
|
|
443
457
|
`is_enabled?` | Check if feature toggle is to be enabled or not. | Boolean |
|
444
458
|
`enabled?` | Alias to the `is_enabled?` method. But more ruby idiomatic. | Boolean |
|
445
459
|
`if_enabled` | Run a code block, if a feature is enabled. | `yield` |
|
460
|
+
`is_disabled?` | Check if feature toggle is to be enabled or not. | Boolean |
|
461
|
+
`disabled?` | Alias to the `is_disabled?` method. But more ruby idiomatic. | Boolean |
|
462
|
+
`if_disabled` | Run a code block, if a feature is disabled. | `yield` |
|
446
463
|
`get_variant` | Get variant for a given feature | `Unleash::Variant` |
|
447
464
|
`shutdown` | Save metrics to disk, flush metrics to server, and then kill ToggleFetcher and MetricsReporter threads. A safe shutdown. Not really useful in long running applications, like web applications. | nil |
|
448
465
|
`shutdown!` | Kill ToggleFetcher and MetricsReporter threads immediately. | nil |
|
@@ -475,7 +492,7 @@ This client comes with the all the required strategies out of the box:
|
|
475
492
|
|
476
493
|
## Custom Strategies
|
477
494
|
|
478
|
-
Client allows to add [custom activation strategies](https://docs.getunleash.io/advanced/custom_activation_strategy) using configuration.
|
495
|
+
Client allows to add [custom activation strategies](https://docs.getunleash.io/advanced/custom_activation_strategy) using configuration.
|
479
496
|
In order for strategy to work correctly it should support two methods `name` and `is_enabled?`
|
480
497
|
|
481
498
|
```ruby
|
@@ -483,7 +500,7 @@ class MyCustomStrategy
|
|
483
500
|
def name
|
484
501
|
'muCustomStrategy'
|
485
502
|
end
|
486
|
-
|
503
|
+
|
487
504
|
def is_enabled?(params = {}, context = nil)
|
488
505
|
true
|
489
506
|
end
|
@@ -498,6 +515,12 @@ end
|
|
498
515
|
|
499
516
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
500
517
|
|
518
|
+
This SDK is also built against the Unleash Client Specification tests. To run the Ruby SDK against this test suite, you'll need to have a copy on your machine, you can clone the repository directly using:
|
519
|
+
|
520
|
+
`git clone --depth 5 --branch v4.2.2 https://github.com/Unleash/client-specification.git client-specification`
|
521
|
+
|
522
|
+
After doing this, `rake spec` will also run the client specification tests.
|
523
|
+
|
501
524
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
502
525
|
|
503
526
|
|
data/lib/unleash/client.rb
CHANGED
@@ -50,14 +50,25 @@ module Unleash
|
|
50
50
|
toggle.is_enabled?(context)
|
51
51
|
end
|
52
52
|
|
53
|
+
def is_disabled?(feature, context = nil, default_value_param = true, &fallback_blk)
|
54
|
+
!is_enabled?(feature, context, !default_value_param, &fallback_blk)
|
55
|
+
end
|
56
|
+
|
53
57
|
# enabled? is a more ruby idiomatic method name than is_enabled?
|
54
58
|
alias enabled? is_enabled?
|
59
|
+
# disabled? is a more ruby idiomatic method name than is_disabled?
|
60
|
+
alias disabled? is_disabled?
|
55
61
|
|
56
62
|
# execute a code block (passed as a parameter), if is_enabled? is true.
|
57
63
|
def if_enabled(feature, context = nil, default_value = false, &blk)
|
58
64
|
yield(blk) if is_enabled?(feature, context, default_value)
|
59
65
|
end
|
60
66
|
|
67
|
+
# execute a code block (passed as a parameter), if is_disabled? is true.
|
68
|
+
def if_disabled(feature, context = nil, default_value = true, &blk)
|
69
|
+
yield(blk) if is_disabled?(feature, context, default_value)
|
70
|
+
end
|
71
|
+
|
61
72
|
def get_variant(feature, context = Unleash::Context.new, fallback_variant = disabled_variant)
|
62
73
|
Unleash.logger.debug "Unleash::Client.get_variant for feature: #{feature} with context #{context}"
|
63
74
|
|
data/lib/unleash/constraint.rb
CHANGED
@@ -43,6 +43,7 @@ module Unleash
|
|
43
43
|
|
44
44
|
def matches_context?(context)
|
45
45
|
Unleash.logger.debug "Unleash::Constraint matches_context? value: #{self.value} context.get_by_name(#{self.context_name})"
|
46
|
+
return false if context.nil?
|
46
47
|
|
47
48
|
match = matches_constraint?(context)
|
48
49
|
self.inverted ? !match : match
|
data/lib/unleash/context.rb
CHANGED
@@ -9,7 +9,7 @@ module Unleash
|
|
9
9
|
|
10
10
|
self.app_name = value_for('appName', params, Unleash&.configuration&.app_name)
|
11
11
|
self.environment = value_for('environment', params, Unleash&.configuration&.environment || 'default')
|
12
|
-
self.user_id = value_for('userId', params)
|
12
|
+
self.user_id = value_for('userId', params)&.to_s
|
13
13
|
self.session_id = value_for('sessionId', params)
|
14
14
|
self.remote_address = value_for('remoteAddress', params)
|
15
15
|
self.current_time = value_for('currentTime', params, Time.now.utc.iso8601.to_s)
|
@@ -37,12 +37,11 @@ module Unleash
|
|
37
37
|
|
38
38
|
context = ensure_valid_context(context)
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
variant = variant_from_override_match(context) || variant_from_weights(context, resolve_stickiness)
|
40
|
+
toggle_enabled = am_enabled?(context)
|
41
|
+
variant = resolve_variant(context, toggle_enabled)
|
44
42
|
|
45
|
-
|
43
|
+
choice = toggle_enabled ? :yes : :no
|
44
|
+
Unleash.toggle_metrics.increment_variant(self.name, choice, variant.name) unless Unleash.configuration.disable_metrics
|
46
45
|
variant
|
47
46
|
end
|
48
47
|
|
@@ -52,6 +51,13 @@ module Unleash
|
|
52
51
|
|
53
52
|
private
|
54
53
|
|
54
|
+
def resolve_variant(context, toggle_enabled)
|
55
|
+
return Unleash::FeatureToggle.disabled_variant unless toggle_enabled
|
56
|
+
return Unleash::FeatureToggle.disabled_variant if sum_variant_defs_weights <= 0
|
57
|
+
|
58
|
+
variant_from_override_match(context) || variant_from_weights(context, resolve_stickiness)
|
59
|
+
end
|
60
|
+
|
55
61
|
def resolve_stickiness
|
56
62
|
self.variant_definitions&.map(&:stickiness)&.compact&.first || "default"
|
57
63
|
end
|
data/lib/unleash/metrics.rb
CHANGED
@@ -1,33 +1,41 @@
|
|
1
1
|
module Unleash
|
2
2
|
class Metrics
|
3
|
-
attr_accessor :features
|
4
|
-
|
5
|
-
# NOTE: no mutexes for features
|
3
|
+
attr_accessor :features, :features_lock
|
6
4
|
|
7
5
|
def initialize
|
8
6
|
self.features = {}
|
7
|
+
self.features_lock = Mutex.new
|
9
8
|
end
|
10
9
|
|
11
10
|
def to_s
|
12
|
-
self.
|
11
|
+
self.features_lock.synchronize do
|
12
|
+
return self.features.to_json
|
13
|
+
end
|
13
14
|
end
|
14
15
|
|
15
16
|
def increment(feature, choice)
|
16
17
|
raise "InvalidArgument choice must be :yes or :no" unless [:yes, :no].include? choice
|
17
18
|
|
18
|
-
self.
|
19
|
-
|
19
|
+
self.features_lock.synchronize do
|
20
|
+
self.features[feature] = { yes: 0, no: 0 } unless self.features.include? feature
|
21
|
+
self.features[feature][choice] += 1
|
22
|
+
end
|
20
23
|
end
|
21
24
|
|
22
|
-
def increment_variant(feature, variant)
|
23
|
-
self.
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
def increment_variant(feature, choice, variant)
|
26
|
+
self.features_lock.synchronize do
|
27
|
+
self.features[feature] = { yes: 0, no: 0 } unless self.features.include? feature
|
28
|
+
self.features[feature][choice] += 1
|
29
|
+
self.features[feature]['variant'] = {} unless self.features[feature].include? 'variant'
|
30
|
+
self.features[feature]['variant'][variant] = 0 unless self.features[feature]['variant'].include? variant
|
31
|
+
self.features[feature]['variant'][variant] += 1
|
32
|
+
end
|
27
33
|
end
|
28
34
|
|
29
35
|
def reset
|
30
|
-
self.
|
36
|
+
self.features_lock.synchronize do
|
37
|
+
self.features = {}
|
38
|
+
end
|
31
39
|
end
|
32
40
|
end
|
33
41
|
end
|
data/lib/unleash/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unleash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.4.
|
4
|
+
version: 4.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Renato Arruda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: murmurhash3
|
@@ -146,6 +146,7 @@ executables:
|
|
146
146
|
extensions: []
|
147
147
|
extra_rdoc_files: []
|
148
148
|
files:
|
149
|
+
- ".github/stale.yml"
|
149
150
|
- ".github/workflows/add-to-project.yml"
|
150
151
|
- ".github/workflows/pull_request.yml"
|
151
152
|
- ".gitignore"
|