prefab-cloud-ruby 0.15.0 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/VERSION +1 -1
- data/lib/prefab/feature_flag_client.rb +31 -24
- data/prefab-cloud-ruby.gemspec +5 -3
- data/test/test_feature_flag_client.rb +60 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82381e4b656d675f4b98ee11601cde1920637e52eb5b039814247500207b9fa5
|
4
|
+
data.tar.gz: 4ff8914774523e745d512d506cc42f20e71a657fd8191d82e7e6ba1878bf04c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aac3fc04c779900ca92a6a859430a2fe7776bee90afba632456ff45e3bacb428dda61314d3cbf5a5b04ce61672e4591afb7ae0248b77352b381f52dcbbfb6f24
|
7
|
+
data.tar.gz: 5e2008ec802e2f32154bffb34804673187feb618a60edf2aba19666851787e14111e3d6e0fbeeebe8e3192cac56a32f3010b4d46ef507c3d16359886973ee90c
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -3,6 +3,7 @@ GEM
|
|
3
3
|
specs:
|
4
4
|
addressable (2.8.0)
|
5
5
|
public_suffix (>= 2.0.2, < 5.0)
|
6
|
+
benchmark-ips (2.10.0)
|
6
7
|
builder (3.2.4)
|
7
8
|
concurrent-ruby (1.1.10)
|
8
9
|
daemons (1.4.1)
|
@@ -109,6 +110,7 @@ PLATFORMS
|
|
109
110
|
ruby
|
110
111
|
|
111
112
|
DEPENDENCIES
|
113
|
+
benchmark-ips
|
112
114
|
bundler
|
113
115
|
concurrent-ruby (~> 1.0, >= 1.0.5)
|
114
116
|
faraday
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.16.0
|
@@ -121,33 +121,40 @@ module Prefab
|
|
121
121
|
int_value / MAX_32_FLOAT
|
122
122
|
end
|
123
123
|
|
124
|
-
# def criteria_match?(rule, lookup_key, attributes)
|
125
|
-
#
|
126
|
-
# end
|
127
124
|
def criteria_match?(criteria, lookup_key, attributes)
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
125
|
+
case criteria.operator
|
126
|
+
when :ALWAYS_TRUE
|
127
|
+
true
|
128
|
+
when :LOOKUP_KEY_IN
|
129
|
+
criteria.values.include?(lookup_key)
|
130
|
+
when :LOOKUP_KEY_NOT_IN
|
131
|
+
!criteria.values.include?(lookup_key)
|
132
|
+
when :IN_SEG
|
133
|
+
segment_matches?(criteria.values, lookup_key, attributes)
|
134
|
+
when :NOT_IN_SEG
|
135
|
+
!segment_matches?(criteria.values, lookup_key, attributes)
|
136
|
+
when :PROP_IS_ONE_OF
|
137
|
+
criteria.values.include?(attribute_value(attributes, criteria.property))
|
138
|
+
when :PROP_IS_NOT_ONE_OF
|
139
|
+
!criteria.values.include?(attribute_value(attributes, criteria.property))
|
140
|
+
when :PROP_ENDS_WITH_ONE_OF
|
141
|
+
criteria.values.any? { |value| attribute_value(attributes, criteria.property)&.end_with?(value) }
|
142
|
+
when :PROP_DOES_NOT_END_WITH_ONE_OF
|
143
|
+
criteria.values.none? { |value| attribute_value(attributes, criteria.property)&.end_with?(value) }
|
144
|
+
else
|
145
|
+
@base_client.log.info("Unknown Operator: #{criteria.operator}")
|
146
|
+
false
|
142
147
|
end
|
143
|
-
@base_client.log.info("Unknown Operator")
|
144
|
-
false
|
145
148
|
end
|
146
149
|
|
147
|
-
|
150
|
+
def attribute_value(attributes, property)
|
151
|
+
attributes[property] || attributes[property.to_sym]
|
152
|
+
end
|
153
|
+
|
154
|
+
# evaluate each segment key and return whether any match
|
148
155
|
# there should be an associated segment available as a standard config obj
|
149
|
-
def segment_matches(segment_keys, lookup_key, attributes)
|
150
|
-
segment_keys.
|
156
|
+
def segment_matches?(segment_keys, lookup_key, attributes)
|
157
|
+
segment_keys.any? do |segment_key|
|
151
158
|
segment = @base_client.config_client.get(segment_key)
|
152
159
|
if segment.nil?
|
153
160
|
@base_client.log.info("Missing Segment")
|
@@ -160,9 +167,9 @@ module Prefab
|
|
160
167
|
|
161
168
|
# does a given segment match?
|
162
169
|
def segment_match?(segment, lookup_key, attributes)
|
163
|
-
segment.criterion.
|
170
|
+
segment.criterion.any? do |criteria|
|
164
171
|
criteria_match?(criteria, lookup_key, attributes)
|
165
|
-
end
|
172
|
+
end
|
166
173
|
end
|
167
174
|
end
|
168
175
|
end
|
data/prefab-cloud-ruby.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: prefab-cloud-ruby 0.
|
5
|
+
# stub: prefab-cloud-ruby 0.16.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "prefab-cloud-ruby".freeze
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.16.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Jeff Dwyer".freeze]
|
14
|
-
s.date = "2022-
|
14
|
+
s.date = "2022-09-01"
|
15
15
|
s.description = "RateLimits & Config as a service".freeze
|
16
16
|
s.email = "jdwyer@prefab.cloud".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -81,6 +81,7 @@ Gem::Specification.new do |s|
|
|
81
81
|
s.add_runtime_dependency(%q<grpc>.freeze, [">= 0"])
|
82
82
|
s.add_runtime_dependency(%q<google-protobuf>.freeze, [">= 0"])
|
83
83
|
s.add_runtime_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
|
84
|
+
s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
84
85
|
s.add_development_dependency(%q<grpc-tools>.freeze, [">= 0"])
|
85
86
|
s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
86
87
|
s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
|
@@ -94,6 +95,7 @@ Gem::Specification.new do |s|
|
|
94
95
|
s.add_dependency(%q<grpc>.freeze, [">= 0"])
|
95
96
|
s.add_dependency(%q<google-protobuf>.freeze, [">= 0"])
|
96
97
|
s.add_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
|
98
|
+
s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
97
99
|
s.add_dependency(%q<grpc-tools>.freeze, [">= 0"])
|
98
100
|
s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
99
101
|
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
@@ -299,6 +299,66 @@ class TestFeatureFlagClient < Minitest::Test
|
|
299
299
|
|
300
300
|
end
|
301
301
|
|
302
|
+
def test_prop_ends_with_one_of
|
303
|
+
feature = "FlagName"
|
304
|
+
|
305
|
+
variants = [
|
306
|
+
Prefab::FeatureFlagVariant.new(bool: false),
|
307
|
+
Prefab::FeatureFlagVariant.new(bool: true)
|
308
|
+
]
|
309
|
+
flag = Prefab::FeatureFlag.new(
|
310
|
+
active: true,
|
311
|
+
inactive_variant_idx: 1,
|
312
|
+
rules: [
|
313
|
+
Prefab::Rule.new(
|
314
|
+
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::PROP_ENDS_WITH_ONE_OF,
|
315
|
+
property: "email",
|
316
|
+
values: ["@example.com"]),
|
317
|
+
variant_weights: [
|
318
|
+
Prefab::VariantWeight.new(weight: 100, variant_idx: 2)
|
319
|
+
]
|
320
|
+
)
|
321
|
+
]
|
322
|
+
)
|
323
|
+
|
324
|
+
assert_equal false, evaluate(feature, "user:0", {}, flag, variants)
|
325
|
+
assert_equal true, evaluate(feature, "user:0", {email: "test@example.com"}, flag, variants)
|
326
|
+
assert_equal true, evaluate(feature, "user:0", {"email" => "test@example.com"}, flag, variants)
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_prop_does_not_end_with_one_of
|
330
|
+
feature = "FlagName"
|
331
|
+
|
332
|
+
variants = [
|
333
|
+
Prefab::FeatureFlagVariant.new(bool: false),
|
334
|
+
Prefab::FeatureFlagVariant.new(bool: true)
|
335
|
+
]
|
336
|
+
flag = Prefab::FeatureFlag.new(
|
337
|
+
active: true,
|
338
|
+
inactive_variant_idx: 1,
|
339
|
+
rules: [
|
340
|
+
Prefab::Rule.new(
|
341
|
+
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::PROP_DOES_NOT_END_WITH_ONE_OF,
|
342
|
+
property: "email",
|
343
|
+
values: ["@example.com"]),
|
344
|
+
variant_weights: [
|
345
|
+
Prefab::VariantWeight.new(weight: 100, variant_idx: 2)
|
346
|
+
]
|
347
|
+
),
|
348
|
+
Prefab::Rule.new(
|
349
|
+
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::ALWAYS_TRUE),
|
350
|
+
variant_weights: [
|
351
|
+
Prefab::VariantWeight.new(weight: 100, variant_idx: 1)
|
352
|
+
]
|
353
|
+
)
|
354
|
+
],
|
355
|
+
)
|
356
|
+
|
357
|
+
assert_equal true, evaluate(feature, "user:0", {}, flag, variants)
|
358
|
+
assert_equal false, evaluate(feature, "user:0", {email: "test@example.com"}, flag, variants)
|
359
|
+
assert_equal false, evaluate(feature, "user:0", {"email" => "test@example.com"}, flag, variants)
|
360
|
+
end
|
361
|
+
|
302
362
|
def evaluate(feature_name, lookup_key, attributes, flag, variants)
|
303
363
|
variant = @client.get_variant(feature_name, lookup_key, attributes, flag, variants)
|
304
364
|
@client.value_of_variant(variant)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prefab-cloud-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -100,6 +100,20 @@ dependencies:
|
|
100
100
|
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: benchmark-ips
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
103
117
|
- !ruby/object:Gem::Dependency
|
104
118
|
name: grpc-tools
|
105
119
|
requirement: !ruby/object:Gem::Requirement
|