ff-ruby-server-sdk 1.1.4 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c7f4259f611fd7b153a81babb2ae42b476e9033b0a12939b3794f30d21352c0e
4
- data.tar.gz: 5d30db5e2c24751816423a609139a1ad4226e679862338bc186c7112366dcb21
3
+ metadata.gz: 0dee84b9df38fbf84679cc05accc99fcca8f0c44ae7df00b5786ea34c2990569
4
+ data.tar.gz: bdcdad8c786cb642a4261801c25f140511dd1a6789696d33b3a59d913e42c591
5
5
  SHA512:
6
- metadata.gz: b8603ebf3b69522413921870f2db3cae4dec9924b4df094cb5c4686986737b313f27bcdf872e7e3b8a20be403dccb78799ae3a0d6f87dd6161f827a68bef9a0b
7
- data.tar.gz: cb6d07f58cbd1350fb250c5b42b19268991b3bf6b9026f6d73dece570e0c1d110f15475137866714f991ab7bb9088a322264c260c059fca4c52d8776b11b0eab
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
- joined = property.to_s + ":" + bucket_by.to_s
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 != nil
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, weighted_variation.weight)
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",
@@ -5,7 +5,7 @@ module Ff
5
5
  module Server
6
6
  module Sdk
7
7
 
8
- VERSION = "1.1.4"
8
+ VERSION = "1.2.1"
9
9
  end
10
10
  end
11
11
  end
data/scripts/sdk_specs.sh CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/bin/bash
2
2
 
3
3
  export ff_ruby_sdk="ff-ruby-server-sdk"
4
- export ff_ruby_sdk_version="1.1.4"
4
+ export ff_ruby_sdk_version="1.2.1"
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
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-08-15 00:00:00.000000000 Z
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.1
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.1
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.0
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.0
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.2
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.2
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.0
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.0
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.10
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.10
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>
@@ -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>