ff-ruby-server-sdk 1.1.4 → 1.2.1
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/CHANGELOG.md +11 -0
- data/Gemfile +0 -27
- data/lib/ff/ruby/server/sdk/api/evaluator.rb +13 -11
- data/lib/ff/ruby/server/sdk/common/sdk_codes.rb +8 -0
- data/lib/ff/ruby/server/sdk/version.rb +1 -1
- data/scripts/sdk_specs.sh +1 -1
- metadata +22 -25
- data/.idea/.gitignore +0 -0
- data/.run/example.run.xml +0 -21
- data/.run/sdk_test.rb.run.xml +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0dee84b9df38fbf84679cc05accc99fcca8f0c44ae7df00b5786ea34c2990569
|
4
|
+
data.tar.gz: bdcdad8c786cb642a4261801c25f140511dd1a6789696d33b3a59d913e42c591
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 168e0964f465430c0639560daaf8ae72d161e6153e268e2fc0f62da5a6a19dca36bbfa03af069b99d2c8de4a246491d61e0206e7a3cfb94403c0eaa24c8b20ef
|
7
|
+
data.tar.gz: 1daa90440c9bc18c305433eee228ed241400625b757e23442ec02b9df998e9d98b52cba1aa71917438b8a5d9e6d7462705e7fd58ccfc936ea52a13c77cc9725c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# [1.2.1]
|
2
|
+
|
3
|
+
- [FFM-10177] - Ruby SDK - Use pessimistic version operator for minor versions
|
4
|
+
|
5
|
+
# [1.2.0] ** BREAKING **
|
6
|
+
|
7
|
+
- [FFM-9804] - The percentage rollout hash algorithm was slightly different compared to other Feature Flags SDKs, which resulted
|
8
|
+
in a different bucket allocation for the same target. While the overall percentage distribution was correct with the previous
|
9
|
+
algorithm; this fix ensures that the same target will get the same allocation per SDK. We are marking as a breaking change
|
10
|
+
as existing targets may get different allocations in a percentage rollout flag.
|
11
|
+
|
1
12
|
# [1.1.0]
|
2
13
|
|
3
14
|
- [FFM-7285] - Remove Metrics queue and implement Map for better memory usage
|
data/Gemfile
CHANGED
@@ -1,31 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
|
-
|
5
4
|
gemspec
|
6
|
-
|
7
|
-
gem "rake", "~> 13.0"
|
8
|
-
gem "minitest", "~> 5.0"
|
9
|
-
gem "standard", "~> 1.3"
|
10
|
-
|
11
|
-
# Caching support:
|
12
|
-
gem "rufus-scheduler"
|
13
|
-
gem "libcache"
|
14
|
-
gem "jwt"
|
15
|
-
gem "moneta"
|
16
|
-
|
17
|
-
# SSE support:
|
18
|
-
gem "rest-client"
|
19
|
-
|
20
|
-
# Concurrency support:
|
21
|
-
gem "concurrent-ruby", "1.1.10", require: "concurrent"
|
22
|
-
|
23
|
-
# Evaluator dependencies:
|
24
|
-
gem "murmurhash3"
|
25
|
-
|
26
|
-
gem "typhoeus"
|
27
|
-
|
28
|
-
group :test do
|
29
|
-
gem 'simplecov', '~> 0.21.2'
|
30
|
-
end
|
31
|
-
|
@@ -181,20 +181,24 @@ class Evaluator < Evaluation
|
|
181
181
|
end
|
182
182
|
|
183
183
|
def get_normalized_number(property, bucket_by)
|
184
|
-
|
185
|
-
|
186
|
-
hash = MurmurHash3::V32.str_hash(joined, joined.length)
|
184
|
+
joined = bucket_by.to_s + ":" + property.to_s
|
185
|
+
hash = MurmurHash3::V32.str_hash(joined, 0)
|
187
186
|
(hash % 100) + 1
|
188
187
|
end
|
189
188
|
|
190
189
|
def is_enabled(target, bucket_by, percentage)
|
191
|
-
|
192
190
|
property = get_attr_value(target, bucket_by)
|
193
191
|
|
194
|
-
if property
|
192
|
+
if property == nil
|
193
|
+
old_bb = bucket_by
|
194
|
+
bucket_by = "identifier"
|
195
|
+
property = get_attr_value(target, bucket_by)
|
196
|
+
SdkCodes.warn_bucket_by_attr_not_found @logger, old_bb, property
|
197
|
+
end
|
195
198
|
|
199
|
+
if property != nil
|
196
200
|
bucket_id = get_normalized_number(property, bucket_by)
|
197
|
-
|
201
|
+
@logger.debug "MM3 percentage_check=%s bucket_by=%s value=%s bucket=%s" % [percentage, bucket_by, property, bucket_id]
|
198
202
|
return percentage > 0 && bucket_id <= percentage
|
199
203
|
end
|
200
204
|
|
@@ -206,13 +210,11 @@ class Evaluator < Evaluation
|
|
206
210
|
if distribution != nil
|
207
211
|
|
208
212
|
variation = nil
|
209
|
-
|
213
|
+
total_percentage = 0
|
210
214
|
distribution.variations.each do |weighted_variation|
|
211
|
-
|
212
215
|
variation = weighted_variation.variation
|
213
|
-
|
214
|
-
if is_enabled(target, distribution.bucket_by,
|
215
|
-
|
216
|
+
total_percentage = total_percentage + weighted_variation.weight
|
217
|
+
if is_enabled(target, distribution.bucket_by, total_percentage)
|
216
218
|
return variation
|
217
219
|
end
|
218
220
|
end
|
@@ -54,6 +54,13 @@ class SdkCodes
|
|
54
54
|
logger.warn SdkCodes.sdk_err_msg(6001, "identifier=%s, target=%s, default=%s" % [identifier, target.identifier, default])
|
55
55
|
end
|
56
56
|
|
57
|
+
def self.warn_bucket_by_attr_not_found(logger, attr_name, new_value)
|
58
|
+
if new_value == nil
|
59
|
+
new_value = "NOT FOUND"
|
60
|
+
end
|
61
|
+
logger.warn SdkCodes.sdk_err_msg(6002, "missing=%s, using value=%s" % [attr_name, new_value])
|
62
|
+
end
|
63
|
+
|
57
64
|
private
|
58
65
|
|
59
66
|
@map =
|
@@ -77,6 +84,7 @@ class SdkCodes
|
|
77
84
|
# SDK_EVAL_6xxx
|
78
85
|
6000 => "Evaluated variation successfully",
|
79
86
|
6001 => "Default variation was served",
|
87
|
+
6002 => "BucketBy attribute not found in target attributes, falling back to 'identifier':",
|
80
88
|
# SDK_METRICS_7xxx
|
81
89
|
7000 => "Metrics thread started",
|
82
90
|
7001 => "Metrics thread exited",
|
data/scripts/sdk_specs.sh
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ff-ruby-server-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 'Miloš Vasić, cyr.: Милош Васић'
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: rufus-scheduler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 3.8
|
61
|
+
version: '3.8'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 3.8
|
68
|
+
version: '3.8'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: libcache
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,58 +84,58 @@ dependencies:
|
|
84
84
|
name: jwt
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 2.3
|
89
|
+
version: '2.3'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 2.3
|
96
|
+
version: '2.3'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: moneta
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.4
|
103
|
+
version: '1.4'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.4
|
110
|
+
version: '1.4'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rest-client
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 2.1
|
117
|
+
version: '2.1'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 2.1
|
124
|
+
version: '2.1'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: concurrent-ruby
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.1
|
131
|
+
version: '1.1'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 1.1
|
138
|
+
version: '1.1'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: murmurhash3
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,9 +178,6 @@ executables: []
|
|
178
178
|
extensions: []
|
179
179
|
extra_rdoc_files: []
|
180
180
|
files:
|
181
|
-
- ".idea/.gitignore"
|
182
|
-
- ".run/example.run.xml"
|
183
|
-
- ".run/sdk_test.rb.run.xml"
|
184
181
|
- ".standard.yml"
|
185
182
|
- CHANGELOG.md
|
186
183
|
- Gemfile
|
data/.idea/.gitignore
DELETED
File without changes
|
data/.run/example.run.xml
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
<component name="ProjectRunConfigurationManager">
|
2
|
-
<configuration default="false" name="example" type="RubyRunConfigurationType" factoryName="Ruby">
|
3
|
-
<module name="ff-ruby-server-sdk" />
|
4
|
-
<RUBY_RUN_CONFIG NAME="RUBY_ARGS" VALUE="" />
|
5
|
-
<RUBY_RUN_CONFIG NAME="WORK DIR" VALUE="$MODULE_DIR$/lib/ff/ruby/server/sdk" />
|
6
|
-
<RUBY_RUN_CONFIG NAME="SHOULD_USE_SDK" VALUE="false" />
|
7
|
-
<RUBY_RUN_CONFIG NAME="ALTERN_SDK_NAME" VALUE="" />
|
8
|
-
<RUBY_RUN_CONFIG NAME="myPassParentEnvs" VALUE="true" />
|
9
|
-
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
|
10
|
-
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
11
|
-
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov" ENABLE_BRANCH_COVERAGE="true" ENABLE_FORKED_COVERAGE="true">
|
12
|
-
<COVERAGE_PATTERN ENABLED="true">
|
13
|
-
<PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
|
14
|
-
</COVERAGE_PATTERN>
|
15
|
-
</EXTENSION>
|
16
|
-
<EXTENSION ID="org.jetbrains.plugins.ruby.rails.run.RailsRunConfigurationExtension" SCRATCH_USE_RAILS_RUNNER="false" />
|
17
|
-
<RUBY_RUN_CONFIG NAME="SCRIPT_PATH" VALUE="$MODULE_DIR$/example/example.rb" />
|
18
|
-
<RUBY_RUN_CONFIG NAME="SCRIPT_ARGS" VALUE="" />
|
19
|
-
<method v="2" />
|
20
|
-
</configuration>
|
21
|
-
</component>
|
data/.run/sdk_test.rb.run.xml
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
<component name="ProjectRunConfigurationManager">
|
2
|
-
<configuration default="false" name="SDK test" type="TestUnitRunConfigurationType" factoryName="Test::Unit/Shoulda/Minitest">
|
3
|
-
<module name="ff-ruby-server-sdk" />
|
4
|
-
<predefined_log_file enabled="true" id="RUBY_TESTUNIT" />
|
5
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-Ilib:test" />
|
6
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
|
7
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
|
8
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
|
9
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
|
10
|
-
<envs>
|
11
|
-
<env name="JRUBY_OPTS" value="-X+O" />
|
12
|
-
</envs>
|
13
|
-
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
|
14
|
-
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
15
|
-
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov" ENABLE_BRANCH_COVERAGE="true" ENABLE_FORKED_COVERAGE="true">
|
16
|
-
<COVERAGE_PATTERN ENABLED="true">
|
17
|
-
<PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
|
18
|
-
</COVERAGE_PATTERN>
|
19
|
-
</EXTENSION>
|
20
|
-
<EXTENSION ID="org.jetbrains.plugins.ruby.rails.run.RailsRunConfigurationExtension" SCRATCH_USE_RAILS_RUNNER="false" />
|
21
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
|
22
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/test/ff/ruby/server/sdk/sdk_test.rb" />
|
23
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPTS_PATHS" VALUE="$MODULE_DIR$/test/ff/ruby/server/sdk/sdk_test.rb" />
|
24
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="" />
|
25
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_METHOD_NAME" VALUE="" />
|
26
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="CUSTOM_SET_OF_FILES" />
|
27
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
|
28
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
|
29
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
|
30
|
-
<RTEST_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_OPTIONS" VALUE="" />
|
31
|
-
<method v="2" />
|
32
|
-
</configuration>
|
33
|
-
</component>
|