prefab-cloud-ruby 0.13.0 → 0.13.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/.ruby-version +1 -0
- data/Gemfile +4 -11
- data/Gemfile.lock +32 -52
- data/README.md +1 -19
- data/Rakefile +0 -1
- data/VERSION +1 -1
- data/compile_protos.sh +0 -3
- data/lib/prefab/auth_interceptor.rb +0 -1
- data/lib/prefab/cancellable_interceptor.rb +0 -1
- data/lib/prefab/client.rb +36 -49
- data/lib/prefab/config_client.rb +73 -145
- data/lib/prefab/config_loader.rb +13 -98
- data/lib/prefab/config_resolver.rb +49 -56
- data/lib/prefab/feature_flag_client.rb +11 -129
- data/lib/prefab/logger_client.rb +8 -10
- data/lib/prefab/murmer3.rb +0 -1
- data/lib/prefab/noop_cache.rb +0 -1
- data/lib/prefab/noop_stats.rb +0 -1
- data/lib/prefab/ratelimit_client.rb +0 -1
- data/lib/prefab-cloud-ruby.rb +0 -10
- data/lib/prefab_pb.rb +132 -214
- data/lib/prefab_services_pb.rb +6 -35
- data/prefab-cloud-ruby.gemspec +11 -30
- data/test/.prefab.test.config.yaml +1 -27
- data/test/test_config_loader.rb +25 -39
- data/test/test_config_resolver.rb +38 -134
- data/test/test_feature_flag_client.rb +35 -277
- data/test/test_helper.rb +4 -70
- data/test/test_logger.rb +29 -23
- metadata +15 -70
- data/.github/workflows/ruby.yml +0 -39
- data/.tool-versions +0 -1
- data/CODEOWNERS +0 -1
- data/lib/prefab/config_helper.rb +0 -29
- data/lib/prefab/error.rb +0 -6
- data/lib/prefab/errors/initialization_timeout_error.rb +0 -13
- data/lib/prefab/errors/invalid_api_key_error.rb +0 -19
- data/lib/prefab/errors/missing_default_error.rb +0 -13
- data/lib/prefab/internal_logger.rb +0 -29
- data/lib/prefab/options.rb +0 -82
- data/run_test_harness_server.sh +0 -8
- data/test/harness_server.rb +0 -64
- data/test/test_client.rb +0 -91
- data/test/test_config_client.rb +0 -56
@@ -1,306 +1,64 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
require 'test_helper'
|
3
2
|
|
4
3
|
class TestFeatureFlagClient < Minitest::Test
|
5
4
|
|
6
|
-
def setup
|
7
|
-
super
|
8
|
-
@mock_base_client = MockBaseClient.new
|
9
|
-
@client = Prefab::FeatureFlagClient.new(@mock_base_client)
|
10
|
-
Prefab::FeatureFlagClient.send(:public, :is_on?) #publicize for testing
|
11
|
-
Prefab::FeatureFlagClient.send(:public, :segment_match?) #publicize for testing
|
12
|
-
Prefab::FeatureFlagClient.send(:public, :get_variant) #publicize for testing
|
13
|
-
end
|
14
|
-
|
15
5
|
def test_pct
|
6
|
+
client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
|
7
|
+
Prefab::FeatureFlagClient.send(:public, :is_on?)
|
16
8
|
feature = "FlagName"
|
9
|
+
flag = Prefab::FeatureFlag.new( pct: 0.5)
|
17
10
|
|
18
|
-
variants = [
|
19
|
-
Prefab::FeatureFlagVariant.new(bool: false),
|
20
|
-
Prefab::FeatureFlagVariant.new(bool: true)
|
21
|
-
]
|
22
|
-
flag = Prefab::FeatureFlag.new(
|
23
|
-
active: true,
|
24
|
-
inactive_variant_idx: 1,
|
25
|
-
rules: [
|
26
|
-
Prefab::Rule.new(
|
27
|
-
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::ALWAYS_TRUE),
|
28
|
-
variant_weights: [
|
29
|
-
Prefab::VariantWeight.new(weight: 86,
|
30
|
-
variant_idx: 2), #true
|
31
|
-
Prefab::VariantWeight.new(weight: 14,
|
32
|
-
variant_idx: 1), #false
|
33
|
-
]
|
34
|
-
)
|
35
|
-
]
|
36
|
-
)
|
37
|
-
# weights above chosen to be 86% in variant_idx 2. and 14% in variant_idx 1.
|
38
|
-
# since hashes high is 86.32 > 86 it just falls outside the 86% range and gets false
|
39
|
-
|
40
|
-
# "1FlagNamehashes high" hashes to 86.322% through dist
|
41
11
|
assert_equal false,
|
42
|
-
|
43
|
-
# "1FlagNamehashes low" hashes to 44.547% through dist
|
44
|
-
assert_equal true,
|
45
|
-
evaluate(feature, "hashes low", [], flag, variants)
|
12
|
+
client.is_on?(feature, "hashes high", [], flag)
|
46
13
|
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_basic_active_inactive
|
50
|
-
feature = "FlagName"
|
51
|
-
variants = [
|
52
|
-
Prefab::FeatureFlagVariant.new(bool: false),
|
53
|
-
Prefab::FeatureFlagVariant.new(bool: true)
|
54
|
-
]
|
55
|
-
flag = Prefab::FeatureFlag.new(
|
56
|
-
active: true,
|
57
|
-
inactive_variant_idx: 1,
|
58
|
-
rules: default_ff_rule(2)
|
59
|
-
)
|
60
14
|
assert_equal true,
|
61
|
-
|
62
|
-
assert_equal true,
|
63
|
-
evaluate(feature, "hashes low", [], flag, variants)
|
64
|
-
|
65
|
-
variants = [
|
66
|
-
Prefab::FeatureFlagVariant.new(bool: false),
|
67
|
-
Prefab::FeatureFlagVariant.new(bool: true)
|
68
|
-
]
|
69
|
-
flag = Prefab::FeatureFlag.new(
|
70
|
-
active: false,
|
71
|
-
inactive_variant_idx: 1,
|
72
|
-
rules: default_ff_rule(2)
|
73
|
-
)
|
74
|
-
assert_equal false,
|
75
|
-
evaluate(feature, "hashes high", [], flag, variants)
|
76
|
-
assert_equal false,
|
77
|
-
evaluate(feature, "hashes low", [], flag, variants)
|
15
|
+
client.is_on?(feature, "hashes low", [], flag)
|
78
16
|
end
|
79
17
|
|
80
|
-
def test_inclusion_rule
|
81
|
-
feature = "FlagName"
|
82
|
-
variants = [
|
83
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
84
|
-
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
85
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
86
|
-
]
|
87
|
-
flag = Prefab::FeatureFlag.new(
|
88
|
-
active: true,
|
89
|
-
inactive_variant_idx: 1,
|
90
|
-
rules: [
|
91
|
-
Prefab::Rule.new(
|
92
|
-
variant_weights: [
|
93
|
-
Prefab::VariantWeight.new(weight: 1000,
|
94
|
-
variant_idx: 2)
|
95
|
-
],
|
96
|
-
criteria: Prefab::Criteria.new(
|
97
|
-
operator: "LOOKUP_KEY_IN",
|
98
|
-
values: ["user:1"]
|
99
|
-
)
|
100
|
-
),
|
101
|
-
Prefab::Rule.new(
|
102
|
-
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::ALWAYS_TRUE),
|
103
|
-
variant_weights: [
|
104
|
-
Prefab::VariantWeight.new(weight: 1000,
|
105
|
-
variant_idx: 3)
|
106
|
-
]
|
107
|
-
)
|
108
|
-
|
109
|
-
],
|
110
|
-
)
|
111
18
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
evaluate(feature, "user:2", [], flag, variants)
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_property_is_one_of
|
19
|
+
def test_off
|
20
|
+
client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
|
21
|
+
Prefab::FeatureFlagClient.send(:public, :is_on?)
|
120
22
|
feature = "FlagName"
|
121
|
-
|
122
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
123
|
-
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
124
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
125
|
-
]
|
126
|
-
flag = Prefab::FeatureFlag.new(
|
127
|
-
active: true,
|
128
|
-
inactive_variant_idx: 1,
|
129
|
-
rules: [
|
130
|
-
Prefab::Rule.new(
|
131
|
-
variant_weights: [
|
132
|
-
Prefab::VariantWeight.new(weight: 1000,
|
133
|
-
variant_idx: 2)
|
134
|
-
],
|
135
|
-
criteria: Prefab::Criteria.new(
|
136
|
-
operator: "PROP_IS_ONE_OF",
|
137
|
-
values: ["a@example.com", "b@example.com"],
|
138
|
-
property: "email"
|
139
|
-
)
|
140
|
-
),
|
141
|
-
Prefab::Rule.new(
|
142
|
-
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::ALWAYS_TRUE),
|
143
|
-
variant_weights: [
|
144
|
-
Prefab::VariantWeight.new(weight: 1000,
|
145
|
-
variant_idx: 3)
|
146
|
-
]
|
147
|
-
)
|
148
|
-
|
149
|
-
],
|
150
|
-
)
|
23
|
+
flag = Prefab::FeatureFlag.new(pct: 0)
|
151
24
|
|
152
|
-
assert_equal
|
153
|
-
|
154
|
-
assert_equal "default",
|
155
|
-
evaluate(feature, "user:2", {}, flag, variants)
|
156
|
-
assert_equal "rule target",
|
157
|
-
evaluate(feature, "user:2", { email: "b@example.com" }, flag, variants)
|
158
|
-
assert_equal "rule target",
|
159
|
-
evaluate(feature, "user:2", { "email" => "b@example.com" }, flag, variants)
|
160
|
-
|
161
|
-
end
|
25
|
+
assert_equal false,
|
26
|
+
client.is_on?(feature, "hashes high", [], flag)
|
162
27
|
|
163
|
-
|
164
|
-
|
165
|
-
criterion: [
|
166
|
-
Prefab::Criteria.new(
|
167
|
-
operator: "PROP_IS_ONE_OF",
|
168
|
-
values: ["a@example.com", "b@example.com"],
|
169
|
-
property: "email"
|
170
|
-
),
|
171
|
-
Prefab::Criteria.new(
|
172
|
-
operator: "LOOKUP_KEY_IN",
|
173
|
-
values: ["user:2"]
|
174
|
-
)
|
175
|
-
]
|
176
|
-
)
|
177
|
-
assert_equal false, @client.segment_match?(segment, "user:0", {})
|
178
|
-
assert_equal true, @client.segment_match?(segment, "user:2", {})
|
179
|
-
assert_equal false, @client.segment_match?(segment, "user:1", { email: "no@example.com" })
|
180
|
-
assert_equal true, @client.segment_match?(segment, "user:1", { email: "a@example.com" })
|
28
|
+
assert_equal false,
|
29
|
+
client.is_on?(feature, "hashes low", [], flag)
|
181
30
|
end
|
182
31
|
|
183
|
-
def test_segments
|
184
|
-
segment_key = "prefab-segment-beta-group"
|
185
|
-
@mock_base_client.config_client.mock_this_config(segment_key,
|
186
|
-
Prefab::Segment.new(
|
187
|
-
criterion: [
|
188
|
-
Prefab::Criteria.new(
|
189
|
-
operator: Prefab::Criteria::CriteriaOperator::LOOKUP_KEY_IN,
|
190
|
-
values: ["user:1"]
|
191
|
-
)
|
192
|
-
]
|
193
|
-
)
|
194
|
-
)
|
195
32
|
|
33
|
+
def test_on
|
34
|
+
client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
|
35
|
+
Prefab::FeatureFlagClient.send(:public, :is_on?)
|
196
36
|
feature = "FlagName"
|
197
|
-
|
198
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
199
|
-
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
200
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
201
|
-
]
|
202
|
-
flag = Prefab::FeatureFlag.new(
|
203
|
-
active: true,
|
204
|
-
inactive_variant_idx: 1,
|
205
|
-
rules: [
|
206
|
-
Prefab::Rule.new(
|
207
|
-
variant_weights: [
|
208
|
-
Prefab::VariantWeight.new(weight: 1000,
|
209
|
-
variant_idx: 2)
|
210
|
-
],
|
211
|
-
criteria: Prefab::Criteria.new(
|
212
|
-
operator: "IN_SEG",
|
213
|
-
values: [segment_key]
|
214
|
-
)
|
215
|
-
),
|
216
|
-
Prefab::Rule.new(
|
217
|
-
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::ALWAYS_TRUE),
|
218
|
-
variant_weights: [
|
219
|
-
Prefab::VariantWeight.new(weight: 1000,
|
220
|
-
variant_idx: 3)
|
221
|
-
]
|
222
|
-
)
|
37
|
+
flag = Prefab::FeatureFlag.new(pct: 1)
|
223
38
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
assert_equal "rule target",
|
228
|
-
evaluate(feature, "user:1", [], flag, variants)
|
229
|
-
assert_equal "default",
|
230
|
-
evaluate(feature, "user:2", [], flag, variants)
|
39
|
+
assert_equal true,
|
40
|
+
client.is_on?(feature, "hashes high", [], flag)
|
231
41
|
|
42
|
+
assert_equal true,
|
43
|
+
client.is_on?(feature, "hashes low", [], flag)
|
232
44
|
end
|
233
45
|
|
234
|
-
def
|
235
|
-
|
236
|
-
|
237
|
-
Prefab::Segment.new(
|
238
|
-
criterion: [
|
239
|
-
Prefab::Criteria.new(
|
240
|
-
operator: Prefab::Criteria::CriteriaOperator::LOOKUP_KEY_IN,
|
241
|
-
values: ["user:1", "user:2"]
|
242
|
-
)
|
243
|
-
]
|
244
|
-
)
|
245
|
-
)
|
246
|
-
segment_key_two = "prefab-segment-segment-2"
|
247
|
-
@mock_base_client.config_client.mock_this_config(segment_key_two,
|
248
|
-
Prefab::Segment.new(
|
249
|
-
criterion: [
|
250
|
-
Prefab::Criteria.new(
|
251
|
-
operator: Prefab::Criteria::CriteriaOperator::LOOKUP_KEY_IN,
|
252
|
-
values: ["user:3", "user:4"]
|
253
|
-
)
|
254
|
-
]
|
255
|
-
)
|
256
|
-
)
|
257
|
-
|
46
|
+
def test_whitelist
|
47
|
+
client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
|
48
|
+
Prefab::FeatureFlagClient.send(:public, :is_on?)
|
258
49
|
feature = "FlagName"
|
259
|
-
|
260
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
261
|
-
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
262
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
263
|
-
]
|
264
|
-
flag = Prefab::FeatureFlag.new(
|
265
|
-
active: true,
|
266
|
-
inactive_variant_idx: 1,
|
267
|
-
rules: [
|
268
|
-
Prefab::Rule.new(
|
269
|
-
variant_weights: [
|
270
|
-
Prefab::VariantWeight.new(weight: 1000,
|
271
|
-
variant_idx: 2)
|
272
|
-
],
|
273
|
-
criteria: Prefab::Criteria.new(
|
274
|
-
operator: "IN_SEG",
|
275
|
-
values: [segment_key_one, segment_key_two]
|
276
|
-
)
|
277
|
-
),
|
278
|
-
Prefab::Rule.new(
|
279
|
-
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::ALWAYS_TRUE),
|
280
|
-
variant_weights: [
|
281
|
-
Prefab::VariantWeight.new(weight: 1000,
|
282
|
-
variant_idx: 3)
|
283
|
-
]
|
284
|
-
)
|
50
|
+
flag = Prefab::FeatureFlag.new(pct: 0, whitelisted: ["beta", "user:1", "user:3"])
|
285
51
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
evaluate(feature, "user:4", [], flag, variants)
|
297
|
-
assert_equal "default",
|
298
|
-
evaluate(feature, "user:5", [], flag, variants)
|
299
|
-
|
300
|
-
end
|
52
|
+
assert_equal false,
|
53
|
+
client.is_on?(feature, "anything", [], flag)
|
54
|
+
assert_equal true,
|
55
|
+
client.is_on?(feature, "anything", ["beta"], flag)
|
56
|
+
assert_equal true,
|
57
|
+
client.is_on?(feature, "anything", ["alpha", "beta"], flag)
|
58
|
+
assert_equal true,
|
59
|
+
client.is_on?(feature, "anything", ["alpha", "user:1"], flag)
|
60
|
+
assert_equal false,
|
61
|
+
client.is_on?(feature, "anything", ["alpha", "user:2"], flag)
|
301
62
|
|
302
|
-
def evaluate(feature_name, lookup_key, attributes, flag, variants)
|
303
|
-
variant = @client.get_variant(feature_name, lookup_key, attributes, flag, variants)
|
304
|
-
@client.value_of_variant(variant)
|
305
63
|
end
|
306
64
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,89 +1,23 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
require 'minitest/autorun'
|
3
2
|
require 'prefab-cloud-ruby'
|
4
3
|
|
5
4
|
class MockBaseClient
|
6
|
-
|
7
|
-
PRODUCTION_ENV_ID = 2
|
8
|
-
TEST_ENV_ID = 3
|
9
|
-
attr_reader :namespace, :logger, :config_client, :options
|
5
|
+
attr_reader :namespace, :logger
|
10
6
|
|
11
|
-
def initialize(
|
12
|
-
@options = options
|
7
|
+
def initialize(namespace: "")
|
13
8
|
@namespace = namespace
|
14
|
-
@logger =
|
15
|
-
@config_client = MockConfigClient.new
|
9
|
+
@logger = Logger.new($stdout)
|
16
10
|
end
|
17
11
|
|
18
|
-
def
|
12
|
+
def account_id
|
19
13
|
1
|
20
14
|
end
|
21
15
|
|
22
|
-
def log
|
23
|
-
@logger
|
24
|
-
end
|
25
|
-
|
26
16
|
def log_internal level, message
|
27
17
|
end
|
28
|
-
|
29
|
-
def config_value key
|
30
|
-
@config_values[key]
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
class MockConfigClient
|
36
|
-
def initialize(config_values = {})
|
37
|
-
@config_values = config_values
|
38
|
-
end
|
39
|
-
def get(key, default=nil)
|
40
|
-
@config_values.fetch(key, default)
|
41
|
-
end
|
42
|
-
|
43
|
-
def get_config(key)
|
44
|
-
Prefab::Config.new(value: @config_values[key], key: key)
|
45
|
-
end
|
46
|
-
|
47
|
-
def mock_this_config key, config_value
|
48
|
-
@config_values[key] = config_value
|
49
|
-
end
|
50
18
|
end
|
51
19
|
|
52
20
|
class MockConfigLoader
|
53
21
|
def calc_config
|
54
22
|
end
|
55
23
|
end
|
56
|
-
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def default_ff_rule(variant_idx)
|
61
|
-
[
|
62
|
-
Prefab::Rule.new(
|
63
|
-
criteria: Prefab::Criteria.new(operator: Prefab::Criteria::CriteriaOperator::ALWAYS_TRUE),
|
64
|
-
variant_weights: [
|
65
|
-
Prefab::VariantWeight.new(weight: 1000,
|
66
|
-
variant_idx: variant_idx)
|
67
|
-
]
|
68
|
-
)
|
69
|
-
]
|
70
|
-
end
|
71
|
-
|
72
|
-
def with_env(key, value)
|
73
|
-
old_value = ENV[key]
|
74
|
-
|
75
|
-
ENV[key] = value
|
76
|
-
ensure
|
77
|
-
ENV[key] = old_value
|
78
|
-
end
|
79
|
-
|
80
|
-
def new_client(overrides = {})
|
81
|
-
options = Prefab::Options.new(**{
|
82
|
-
prefab_config_override_dir: "none",
|
83
|
-
prefab_config_classpath_dir: "test",
|
84
|
-
defaults_env: "unit_tests",
|
85
|
-
prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY
|
86
|
-
}.merge(overrides))
|
87
|
-
|
88
|
-
Prefab::Client.new(options)
|
89
|
-
end
|
data/test/test_logger.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
require 'test_helper'
|
3
2
|
|
4
3
|
class TestCLogger < Minitest::Test
|
@@ -19,27 +18,34 @@ class TestCLogger < Minitest::Test
|
|
19
18
|
end
|
20
19
|
|
21
20
|
def test_level_of
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
21
|
+
assert_equal Logger::INFO,
|
22
|
+
@logger.level_of("app.models.user"), "PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL is info"
|
23
|
+
|
24
|
+
@logger.set_config_client(MockConfigClient.new({}))
|
25
|
+
assert_equal Logger::WARN,
|
26
|
+
@logger.level_of("app.models.user"), "default is warn"
|
27
|
+
|
28
|
+
@logger.set_config_client(MockConfigClient.new("log_level.app" => "info"))
|
29
|
+
assert_equal Logger::INFO,
|
30
|
+
@logger.level_of("app.models.user")
|
31
|
+
|
32
|
+
@logger.set_config_client(MockConfigClient.new("log_level.app" => "debug"))
|
33
|
+
assert_equal Logger::DEBUG,
|
34
|
+
@logger.level_of("app.models.user")
|
35
|
+
|
36
|
+
@logger.set_config_client(MockConfigClient.new("log_level.app" => "debug",
|
37
|
+
"log_level.app.models" => "warn"))
|
38
|
+
assert_equal Logger::WARN,
|
39
|
+
@logger.level_of("app.models.user")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class MockConfigClient
|
44
|
+
def initialize(hash)
|
45
|
+
@hash = hash
|
46
|
+
end
|
47
|
+
|
48
|
+
def get(key)
|
49
|
+
@hash[key]
|
44
50
|
end
|
45
51
|
end
|
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.13.
|
4
|
+
version: 0.13.1
|
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-08-
|
11
|
+
date: 2022-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -44,20 +44,6 @@ dependencies:
|
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: ld-eventsource
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '0'
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: grpc
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,35 +59,21 @@ dependencies:
|
|
73
59
|
- !ruby/object:Gem::Version
|
74
60
|
version: '0'
|
75
61
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - ">="
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '0'
|
82
|
-
type: :runtime
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - ">="
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '0'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: googleapis-common-protos-types
|
62
|
+
name: grpc-tools
|
91
63
|
requirement: !ruby/object:Gem::Requirement
|
92
64
|
requirements:
|
93
|
-
- - "
|
65
|
+
- - "~>"
|
94
66
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
96
|
-
type: :
|
67
|
+
version: 1.17.1
|
68
|
+
type: :development
|
97
69
|
prerelease: false
|
98
70
|
version_requirements: !ruby/object:Gem::Requirement
|
99
71
|
requirements:
|
100
|
-
- - "
|
72
|
+
- - "~>"
|
101
73
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
74
|
+
version: 1.17.1
|
103
75
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
76
|
+
name: shoulda
|
105
77
|
requirement: !ruby/object:Gem::Requirement
|
106
78
|
requirements:
|
107
79
|
- - ">="
|
@@ -132,16 +104,16 @@ dependencies:
|
|
132
104
|
name: bundler
|
133
105
|
requirement: !ruby/object:Gem::Requirement
|
134
106
|
requirements:
|
135
|
-
- - "
|
107
|
+
- - "~>"
|
136
108
|
- !ruby/object:Gem::Version
|
137
|
-
version: '0'
|
109
|
+
version: '1.0'
|
138
110
|
type: :development
|
139
111
|
prerelease: false
|
140
112
|
version_requirements: !ruby/object:Gem::Requirement
|
141
113
|
requirements:
|
142
|
-
- - "
|
114
|
+
- - "~>"
|
143
115
|
- !ruby/object:Gem::Version
|
144
|
-
version: '0'
|
116
|
+
version: '1.0'
|
145
117
|
- !ruby/object:Gem::Dependency
|
146
118
|
name: juwelier
|
147
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,20 +142,6 @@ dependencies:
|
|
170
142
|
- - ">="
|
171
143
|
- !ruby/object:Gem::Version
|
172
144
|
version: '0'
|
173
|
-
- !ruby/object:Gem::Dependency
|
174
|
-
name: thin
|
175
|
-
requirement: !ruby/object:Gem::Requirement
|
176
|
-
requirements:
|
177
|
-
- - ">="
|
178
|
-
- !ruby/object:Gem::Version
|
179
|
-
version: '0'
|
180
|
-
type: :development
|
181
|
-
prerelease: false
|
182
|
-
version_requirements: !ruby/object:Gem::Requirement
|
183
|
-
requirements:
|
184
|
-
- - ">="
|
185
|
-
- !ruby/object:Gem::Version
|
186
|
-
version: '0'
|
187
145
|
description: RateLimits & Config as a service
|
188
146
|
email: jdwyer@prefab.cloud
|
189
147
|
executables: []
|
@@ -193,9 +151,7 @@ extra_rdoc_files:
|
|
193
151
|
- README.md
|
194
152
|
files:
|
195
153
|
- ".envrc"
|
196
|
-
- ".
|
197
|
-
- ".tool-versions"
|
198
|
-
- CODEOWNERS
|
154
|
+
- ".ruby-version"
|
199
155
|
- Gemfile
|
200
156
|
- Gemfile.lock
|
201
157
|
- LICENSE.txt
|
@@ -208,29 +164,18 @@ files:
|
|
208
164
|
- lib/prefab/cancellable_interceptor.rb
|
209
165
|
- lib/prefab/client.rb
|
210
166
|
- lib/prefab/config_client.rb
|
211
|
-
- lib/prefab/config_helper.rb
|
212
167
|
- lib/prefab/config_loader.rb
|
213
168
|
- lib/prefab/config_resolver.rb
|
214
|
-
- lib/prefab/error.rb
|
215
|
-
- lib/prefab/errors/initialization_timeout_error.rb
|
216
|
-
- lib/prefab/errors/invalid_api_key_error.rb
|
217
|
-
- lib/prefab/errors/missing_default_error.rb
|
218
169
|
- lib/prefab/feature_flag_client.rb
|
219
|
-
- lib/prefab/internal_logger.rb
|
220
170
|
- lib/prefab/logger_client.rb
|
221
171
|
- lib/prefab/murmer3.rb
|
222
172
|
- lib/prefab/noop_cache.rb
|
223
173
|
- lib/prefab/noop_stats.rb
|
224
|
-
- lib/prefab/options.rb
|
225
174
|
- lib/prefab/ratelimit_client.rb
|
226
175
|
- lib/prefab_pb.rb
|
227
176
|
- lib/prefab_services_pb.rb
|
228
177
|
- prefab-cloud-ruby.gemspec
|
229
|
-
- run_test_harness_server.sh
|
230
178
|
- test/.prefab.test.config.yaml
|
231
|
-
- test/harness_server.rb
|
232
|
-
- test/test_client.rb
|
233
|
-
- test/test_config_client.rb
|
234
179
|
- test/test_config_loader.rb
|
235
180
|
- test/test_config_resolver.rb
|
236
181
|
- test/test_feature_flag_client.rb
|
@@ -255,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
200
|
- !ruby/object:Gem::Version
|
256
201
|
version: '0'
|
257
202
|
requirements: []
|
258
|
-
rubygems_version: 3.
|
203
|
+
rubygems_version: 3.1.6
|
259
204
|
signing_key:
|
260
205
|
specification_version: 4
|
261
206
|
summary: Prefab Ruby Infrastructure
|