prefab-cloud-ruby 0.13.0 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/Gemfile +4 -11
  4. data/Gemfile.lock +32 -52
  5. data/README.md +1 -19
  6. data/Rakefile +0 -1
  7. data/VERSION +1 -1
  8. data/compile_protos.sh +0 -3
  9. data/lib/prefab/auth_interceptor.rb +0 -1
  10. data/lib/prefab/cancellable_interceptor.rb +0 -1
  11. data/lib/prefab/client.rb +36 -49
  12. data/lib/prefab/config_client.rb +73 -145
  13. data/lib/prefab/config_loader.rb +13 -98
  14. data/lib/prefab/config_resolver.rb +49 -56
  15. data/lib/prefab/feature_flag_client.rb +11 -129
  16. data/lib/prefab/logger_client.rb +8 -10
  17. data/lib/prefab/murmer3.rb +0 -1
  18. data/lib/prefab/noop_cache.rb +0 -1
  19. data/lib/prefab/noop_stats.rb +0 -1
  20. data/lib/prefab/ratelimit_client.rb +0 -1
  21. data/lib/prefab-cloud-ruby.rb +0 -10
  22. data/lib/prefab_pb.rb +132 -214
  23. data/lib/prefab_services_pb.rb +6 -35
  24. data/prefab-cloud-ruby.gemspec +11 -30
  25. data/test/.prefab.test.config.yaml +1 -27
  26. data/test/test_config_loader.rb +25 -39
  27. data/test/test_config_resolver.rb +38 -134
  28. data/test/test_feature_flag_client.rb +35 -277
  29. data/test/test_helper.rb +4 -70
  30. data/test/test_logger.rb +29 -23
  31. metadata +15 -70
  32. data/.github/workflows/ruby.yml +0 -39
  33. data/.tool-versions +0 -1
  34. data/CODEOWNERS +0 -1
  35. data/lib/prefab/config_helper.rb +0 -29
  36. data/lib/prefab/error.rb +0 -6
  37. data/lib/prefab/errors/initialization_timeout_error.rb +0 -13
  38. data/lib/prefab/errors/invalid_api_key_error.rb +0 -19
  39. data/lib/prefab/errors/missing_default_error.rb +0 -13
  40. data/lib/prefab/internal_logger.rb +0 -29
  41. data/lib/prefab/options.rb +0 -82
  42. data/run_test_harness_server.sh +0 -8
  43. data/test/harness_server.rb +0 -64
  44. data/test/test_client.rb +0 -91
  45. 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
- 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)
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
- 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)
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
- 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
19
+ def test_off
20
+ client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
21
+ Prefab::FeatureFlagClient.send(:public, :is_on?)
120
22
  feature = "FlagName"
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
- )
148
-
149
- ],
150
- )
23
+ flag = Prefab::FeatureFlag.new(pct: 0)
151
24
 
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
25
+ assert_equal false,
26
+ client.is_on?(feature, "hashes high", [], flag)
162
27
 
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" })
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
- 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
- )
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 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
-
46
+ def test_whitelist
47
+ client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
48
+ Prefab::FeatureFlagClient.send(:public, :is_on?)
258
49
  feature = "FlagName"
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
- )
50
+ flag = Prefab::FeatureFlag.new(pct: 0, whitelisted: ["beta", "user:1", "user:3"])
285
51
 
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
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
- STAGING_ENV_ID = 1
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(options = Prefab::Options.new)
12
- @options = options
7
+ def initialize(namespace: "")
13
8
  @namespace = namespace
14
- @logger = Prefab::LoggerClient.new($stdout)
15
- @config_client = MockConfigClient.new
9
+ @logger = Logger.new($stdout)
16
10
  end
17
11
 
18
- def project_id
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
- 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
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.0
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-10 00:00:00.000000000 Z
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: google-protobuf
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: '0'
96
- type: :runtime
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: '0'
74
+ version: 1.17.1
103
75
  - !ruby/object:Gem::Dependency
104
- name: grpc-tools
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
- - ".github/workflows/ruby.yml"
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.2.32
203
+ rubygems_version: 3.1.6
259
204
  signing_key:
260
205
  specification_version: 4
261
206
  summary: Prefab Ruby Infrastructure