prefab-cloud-ruby 0.13.1 → 0.13.2
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/.github/workflows/ruby.yml +39 -0
- data/.tool-versions +1 -0
- data/CODEOWNERS +1 -0
- data/Gemfile +11 -4
- data/Gemfile.lock +52 -32
- data/README.md +19 -1
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/compile_protos.sh +3 -0
- data/lib/prefab/auth_interceptor.rb +1 -0
- data/lib/prefab/cancellable_interceptor.rb +1 -0
- data/lib/prefab/client.rb +51 -38
- data/lib/prefab/config_client.rb +145 -73
- data/lib/prefab/config_helper.rb +29 -0
- data/lib/prefab/config_loader.rb +98 -13
- data/lib/prefab/config_resolver.rb +56 -49
- data/lib/prefab/error.rb +6 -0
- data/lib/prefab/errors/initialization_timeout_error.rb +13 -0
- data/lib/prefab/errors/invalid_api_key_error.rb +19 -0
- data/lib/prefab/errors/missing_default_error.rb +13 -0
- data/lib/prefab/feature_flag_client.rb +129 -11
- data/lib/prefab/internal_logger.rb +29 -0
- data/lib/prefab/logger_client.rb +10 -8
- data/lib/prefab/murmer3.rb +1 -0
- data/lib/prefab/noop_cache.rb +1 -0
- data/lib/prefab/noop_stats.rb +1 -0
- data/lib/prefab/options.rb +82 -0
- data/lib/prefab/ratelimit_client.rb +1 -0
- data/lib/prefab-cloud-ruby.rb +10 -0
- data/lib/prefab_pb.rb +214 -132
- data/lib/prefab_services_pb.rb +35 -6
- data/prefab-cloud-ruby.gemspec +29 -10
- data/run_test_harness_server.sh +8 -0
- data/test/.prefab.test.config.yaml +27 -1
- data/test/harness_server.rb +64 -0
- data/test/test_client.rb +98 -0
- data/test/test_config_client.rb +56 -0
- data/test/test_config_loader.rb +39 -25
- data/test/test_config_resolver.rb +134 -38
- data/test/test_feature_flag_client.rb +277 -35
- data/test/test_helper.rb +70 -4
- data/test/test_logger.rb +23 -29
- metadata +69 -14
- data/.ruby-version +0 -1
@@ -1,64 +1,306 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
class TestFeatureFlagClient < Minitest::Test
|
4
5
|
|
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
|
+
|
5
15
|
def test_pct
|
6
|
-
client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
|
7
|
-
Prefab::FeatureFlagClient.send(:public, :is_on?)
|
8
16
|
feature = "FlagName"
|
9
|
-
flag = Prefab::FeatureFlag.new( pct: 0.5)
|
10
17
|
|
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
|
11
41
|
assert_equal false,
|
12
|
-
|
42
|
+
evaluate(feature, "hashes high", [], flag, variants)
|
43
|
+
# "1FlagNamehashes low" hashes to 44.547% through dist
|
44
|
+
assert_equal true,
|
45
|
+
evaluate(feature, "hashes low", [], flag, variants)
|
13
46
|
|
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
|
+
)
|
14
60
|
assert_equal true,
|
15
|
-
|
61
|
+
evaluate(feature, "hashes high", [], flag, variants)
|
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)
|
16
78
|
end
|
17
79
|
|
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
|
+
)
|
18
111
|
|
19
|
-
|
20
|
-
|
21
|
-
|
112
|
+
assert_equal "rule target",
|
113
|
+
evaluate(feature, "user:1", [], flag, variants)
|
114
|
+
assert_equal "default",
|
115
|
+
evaluate(feature, "user:2", [], flag, variants)
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_property_is_one_of
|
22
120
|
feature = "FlagName"
|
23
|
-
|
121
|
+
variants = [
|
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
|
+
)
|
24
148
|
|
25
|
-
|
26
|
-
|
149
|
+
],
|
150
|
+
)
|
27
151
|
|
28
|
-
assert_equal
|
29
|
-
|
152
|
+
assert_equal "default",
|
153
|
+
evaluate(feature, "user:1", { email: "not@example.com" }, flag, variants)
|
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
|
162
|
+
|
163
|
+
def test_segment_match?
|
164
|
+
segment = Prefab::Segment.new(
|
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" })
|
30
181
|
end
|
31
182
|
|
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
|
+
)
|
32
195
|
|
33
|
-
def test_on
|
34
|
-
client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
|
35
|
-
Prefab::FeatureFlagClient.send(:public, :is_on?)
|
36
196
|
feature = "FlagName"
|
37
|
-
|
197
|
+
variants = [
|
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
|
+
)
|
38
223
|
|
39
|
-
|
40
|
-
|
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)
|
41
231
|
|
42
|
-
assert_equal true,
|
43
|
-
client.is_on?(feature, "hashes low", [], flag)
|
44
232
|
end
|
45
233
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
234
|
+
def test_in_multiple_segments_has_or_behavior
|
235
|
+
segment_key_one = "prefab-segment-segment-1"
|
236
|
+
@mock_base_client.config_client.mock_this_config(segment_key_one,
|
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
|
+
|
49
258
|
feature = "FlagName"
|
50
|
-
|
259
|
+
variants = [
|
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
|
+
)
|
51
285
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
286
|
+
],
|
287
|
+
)
|
288
|
+
|
289
|
+
assert_equal "rule target",
|
290
|
+
evaluate(feature, "user:1", [], flag, variants)
|
291
|
+
assert_equal "rule target",
|
292
|
+
evaluate(feature, "user:2", [], flag, variants), "matches segment 1"
|
293
|
+
assert_equal "rule target",
|
294
|
+
evaluate(feature, "user:3", [], flag, variants)
|
295
|
+
assert_equal "rule target",
|
296
|
+
evaluate(feature, "user:4", [], flag, variants)
|
297
|
+
assert_equal "default",
|
298
|
+
evaluate(feature, "user:5", [], flag, variants)
|
299
|
+
|
300
|
+
end
|
62
301
|
|
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)
|
63
305
|
end
|
64
306
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,23 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'minitest/autorun'
|
2
3
|
require 'prefab-cloud-ruby'
|
3
4
|
|
4
5
|
class MockBaseClient
|
5
|
-
|
6
|
+
STAGING_ENV_ID = 1
|
7
|
+
PRODUCTION_ENV_ID = 2
|
8
|
+
TEST_ENV_ID = 3
|
9
|
+
attr_reader :namespace, :logger, :config_client, :options
|
6
10
|
|
7
|
-
def initialize(
|
11
|
+
def initialize(options = Prefab::Options.new)
|
12
|
+
@options = options
|
8
13
|
@namespace = namespace
|
9
|
-
@logger =
|
14
|
+
@logger = Prefab::LoggerClient.new($stdout)
|
15
|
+
@config_client = MockConfigClient.new
|
10
16
|
end
|
11
17
|
|
12
|
-
def
|
18
|
+
def project_id
|
13
19
|
1
|
14
20
|
end
|
15
21
|
|
22
|
+
def log
|
23
|
+
@logger
|
24
|
+
end
|
25
|
+
|
16
26
|
def log_internal level, message
|
17
27
|
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
|
18
50
|
end
|
19
51
|
|
20
52
|
class MockConfigLoader
|
21
53
|
def calc_config
|
22
54
|
end
|
23
55
|
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,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
class TestCLogger < Minitest::Test
|
@@ -18,34 +19,27 @@ class TestCLogger < Minitest::Test
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def test_level_of
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
class MockConfigClient
|
44
|
-
def initialize(hash)
|
45
|
-
@hash = hash
|
46
|
-
end
|
47
|
-
|
48
|
-
def get(key)
|
49
|
-
@hash[key]
|
22
|
+
with_env("PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL", "info") do
|
23
|
+
# env var overrides the default level
|
24
|
+
assert_equal Logger::INFO,
|
25
|
+
@logger.level_of("app.models.user"), "PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL is info"
|
26
|
+
|
27
|
+
@logger.set_config_client(MockConfigClient.new({}))
|
28
|
+
assert_equal Logger::WARN,
|
29
|
+
@logger.level_of("app.models.user"), "default is warn"
|
30
|
+
|
31
|
+
@logger.set_config_client(MockConfigClient.new("log_level.app" => "info"))
|
32
|
+
assert_equal Logger::INFO,
|
33
|
+
@logger.level_of("app.models.user")
|
34
|
+
|
35
|
+
@logger.set_config_client(MockConfigClient.new("log_level.app" => "debug"))
|
36
|
+
assert_equal Logger::DEBUG,
|
37
|
+
@logger.level_of("app.models.user")
|
38
|
+
|
39
|
+
@logger.set_config_client(MockConfigClient.new("log_level.app" => "debug",
|
40
|
+
"log_level.app.models" => "warn"))
|
41
|
+
assert_equal Logger::WARN,
|
42
|
+
@logger.level_of("app.models.user")
|
43
|
+
end
|
50
44
|
end
|
51
45
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
@@ -44,6 +44,20 @@ 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'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: grpc
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,21 +73,35 @@ dependencies:
|
|
59
73
|
- !ruby/object:Gem::Version
|
60
74
|
version: '0'
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
76
|
+
name: google-protobuf
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
64
78
|
requirements:
|
65
|
-
- - "
|
79
|
+
- - ">="
|
66
80
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
68
|
-
type: :
|
81
|
+
version: '0'
|
82
|
+
type: :runtime
|
69
83
|
prerelease: false
|
70
84
|
version_requirements: !ruby/object:Gem::Requirement
|
71
85
|
requirements:
|
72
|
-
- - "
|
86
|
+
- - ">="
|
73
87
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
88
|
+
version: '0'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
90
|
+
name: googleapis-common-protos-types
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: grpc-tools
|
77
105
|
requirement: !ruby/object:Gem::Requirement
|
78
106
|
requirements:
|
79
107
|
- - ">="
|
@@ -104,16 +132,16 @@ dependencies:
|
|
104
132
|
name: bundler
|
105
133
|
requirement: !ruby/object:Gem::Requirement
|
106
134
|
requirements:
|
107
|
-
- - "
|
135
|
+
- - ">="
|
108
136
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
137
|
+
version: '0'
|
110
138
|
type: :development
|
111
139
|
prerelease: false
|
112
140
|
version_requirements: !ruby/object:Gem::Requirement
|
113
141
|
requirements:
|
114
|
-
- - "
|
142
|
+
- - ">="
|
115
143
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
144
|
+
version: '0'
|
117
145
|
- !ruby/object:Gem::Dependency
|
118
146
|
name: juwelier
|
119
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,6 +170,20 @@ dependencies:
|
|
142
170
|
- - ">="
|
143
171
|
- !ruby/object:Gem::Version
|
144
172
|
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'
|
145
187
|
description: RateLimits & Config as a service
|
146
188
|
email: jdwyer@prefab.cloud
|
147
189
|
executables: []
|
@@ -151,7 +193,9 @@ extra_rdoc_files:
|
|
151
193
|
- README.md
|
152
194
|
files:
|
153
195
|
- ".envrc"
|
154
|
-
- ".ruby
|
196
|
+
- ".github/workflows/ruby.yml"
|
197
|
+
- ".tool-versions"
|
198
|
+
- CODEOWNERS
|
155
199
|
- Gemfile
|
156
200
|
- Gemfile.lock
|
157
201
|
- LICENSE.txt
|
@@ -164,18 +208,29 @@ files:
|
|
164
208
|
- lib/prefab/cancellable_interceptor.rb
|
165
209
|
- lib/prefab/client.rb
|
166
210
|
- lib/prefab/config_client.rb
|
211
|
+
- lib/prefab/config_helper.rb
|
167
212
|
- lib/prefab/config_loader.rb
|
168
213
|
- 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
|
169
218
|
- lib/prefab/feature_flag_client.rb
|
219
|
+
- lib/prefab/internal_logger.rb
|
170
220
|
- lib/prefab/logger_client.rb
|
171
221
|
- lib/prefab/murmer3.rb
|
172
222
|
- lib/prefab/noop_cache.rb
|
173
223
|
- lib/prefab/noop_stats.rb
|
224
|
+
- lib/prefab/options.rb
|
174
225
|
- lib/prefab/ratelimit_client.rb
|
175
226
|
- lib/prefab_pb.rb
|
176
227
|
- lib/prefab_services_pb.rb
|
177
228
|
- prefab-cloud-ruby.gemspec
|
229
|
+
- run_test_harness_server.sh
|
178
230
|
- test/.prefab.test.config.yaml
|
231
|
+
- test/harness_server.rb
|
232
|
+
- test/test_client.rb
|
233
|
+
- test/test_config_client.rb
|
179
234
|
- test/test_config_loader.rb
|
180
235
|
- test/test_config_resolver.rb
|
181
236
|
- test/test_feature_flag_client.rb
|
@@ -200,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
255
|
- !ruby/object:Gem::Version
|
201
256
|
version: '0'
|
202
257
|
requirements: []
|
203
|
-
rubygems_version: 3.
|
258
|
+
rubygems_version: 3.2.32
|
204
259
|
signing_key:
|
205
260
|
specification_version: 4
|
206
261
|
summary: Prefab Ruby Infrastructure
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.4.2
|