prefab-cloud-ruby 0

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.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.envrc.sample +3 -0
  3. data/.github/workflows/ruby.yml +46 -0
  4. data/.gitmodules +3 -0
  5. data/.rubocop.yml +13 -0
  6. data/.tool-versions +1 -0
  7. data/CHANGELOG.md +169 -0
  8. data/CODEOWNERS +1 -0
  9. data/Gemfile +26 -0
  10. data/Gemfile.lock +188 -0
  11. data/LICENSE.txt +20 -0
  12. data/README.md +94 -0
  13. data/Rakefile +50 -0
  14. data/VERSION +1 -0
  15. data/bin/console +21 -0
  16. data/compile_protos.sh +18 -0
  17. data/lib/prefab/client.rb +153 -0
  18. data/lib/prefab/config_client.rb +292 -0
  19. data/lib/prefab/config_client_presenter.rb +18 -0
  20. data/lib/prefab/config_loader.rb +84 -0
  21. data/lib/prefab/config_resolver.rb +77 -0
  22. data/lib/prefab/config_value_unwrapper.rb +115 -0
  23. data/lib/prefab/config_value_wrapper.rb +18 -0
  24. data/lib/prefab/context.rb +179 -0
  25. data/lib/prefab/context_shape.rb +20 -0
  26. data/lib/prefab/context_shape_aggregator.rb +65 -0
  27. data/lib/prefab/criteria_evaluator.rb +136 -0
  28. data/lib/prefab/encryption.rb +65 -0
  29. data/lib/prefab/error.rb +6 -0
  30. data/lib/prefab/errors/env_var_parse_error.rb +11 -0
  31. data/lib/prefab/errors/initialization_timeout_error.rb +13 -0
  32. data/lib/prefab/errors/invalid_api_key_error.rb +19 -0
  33. data/lib/prefab/errors/missing_default_error.rb +13 -0
  34. data/lib/prefab/errors/missing_env_var_error.rb +11 -0
  35. data/lib/prefab/errors/uninitialized_error.rb +13 -0
  36. data/lib/prefab/evaluation.rb +52 -0
  37. data/lib/prefab/evaluation_summary_aggregator.rb +87 -0
  38. data/lib/prefab/example_contexts_aggregator.rb +78 -0
  39. data/lib/prefab/exponential_backoff.rb +21 -0
  40. data/lib/prefab/feature_flag_client.rb +42 -0
  41. data/lib/prefab/http_connection.rb +41 -0
  42. data/lib/prefab/internal_logger.rb +16 -0
  43. data/lib/prefab/local_config_parser.rb +151 -0
  44. data/lib/prefab/log_path_aggregator.rb +69 -0
  45. data/lib/prefab/logger_client.rb +264 -0
  46. data/lib/prefab/murmer3.rb +50 -0
  47. data/lib/prefab/options.rb +208 -0
  48. data/lib/prefab/periodic_sync.rb +69 -0
  49. data/lib/prefab/prefab.rb +56 -0
  50. data/lib/prefab/rate_limit_cache.rb +41 -0
  51. data/lib/prefab/resolved_config_presenter.rb +86 -0
  52. data/lib/prefab/time_helpers.rb +7 -0
  53. data/lib/prefab/weighted_value_resolver.rb +42 -0
  54. data/lib/prefab/yaml_config_parser.rb +34 -0
  55. data/lib/prefab-cloud-ruby.rb +57 -0
  56. data/lib/prefab_pb.rb +93 -0
  57. data/prefab-cloud-ruby.gemspec +155 -0
  58. data/test/.prefab.default.config.yaml +2 -0
  59. data/test/.prefab.unit_tests.config.yaml +28 -0
  60. data/test/integration_test.rb +150 -0
  61. data/test/integration_test_helpers.rb +151 -0
  62. data/test/support/common_helpers.rb +180 -0
  63. data/test/support/mock_base_client.rb +42 -0
  64. data/test/support/mock_config_client.rb +19 -0
  65. data/test/support/mock_config_loader.rb +1 -0
  66. data/test/test_client.rb +444 -0
  67. data/test/test_config_client.rb +109 -0
  68. data/test/test_config_loader.rb +117 -0
  69. data/test/test_config_resolver.rb +430 -0
  70. data/test/test_config_value_unwrapper.rb +224 -0
  71. data/test/test_config_value_wrapper.rb +42 -0
  72. data/test/test_context.rb +203 -0
  73. data/test/test_context_shape.rb +50 -0
  74. data/test/test_context_shape_aggregator.rb +147 -0
  75. data/test/test_criteria_evaluator.rb +726 -0
  76. data/test/test_encryption.rb +16 -0
  77. data/test/test_evaluation_summary_aggregator.rb +162 -0
  78. data/test/test_example_contexts_aggregator.rb +238 -0
  79. data/test/test_exponential_backoff.rb +18 -0
  80. data/test/test_feature_flag_client.rb +48 -0
  81. data/test/test_helper.rb +17 -0
  82. data/test/test_integration.rb +58 -0
  83. data/test/test_local_config_parser.rb +147 -0
  84. data/test/test_log_path_aggregator.rb +62 -0
  85. data/test/test_logger.rb +621 -0
  86. data/test/test_logger_initialization.rb +12 -0
  87. data/test/test_options.rb +75 -0
  88. data/test/test_prefab.rb +12 -0
  89. data/test/test_rate_limit_cache.rb +44 -0
  90. data/test/test_weighted_value_resolver.rb +71 -0
  91. metadata +337 -0
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class TestOptions < Minitest::Test
6
+ API_KEY = 'abcdefg'
7
+
8
+ def test_prefab_api_url
9
+ assert_equal 'https://api.prefab.cloud', Prefab::Options.new.prefab_api_url
10
+
11
+ with_env 'PREFAB_API_URL', 'https://api.prefab.cloud' do
12
+ assert_equal 'https://api.prefab.cloud', Prefab::Options.new.prefab_api_url
13
+ end
14
+
15
+ with_env 'PREFAB_API_URL', 'https://api.prefab.cloud/' do
16
+ assert_equal 'https://api.prefab.cloud', Prefab::Options.new.prefab_api_url
17
+ end
18
+ end
19
+
20
+ def test_works_with_named_arguments
21
+ assert_equal API_KEY, Prefab::Options.new(api_key: API_KEY).api_key
22
+ end
23
+
24
+ def test_works_with_hash
25
+ assert_equal API_KEY, Prefab::Options.new({ api_key: API_KEY }).api_key
26
+ end
27
+
28
+ def test_collect_max_paths
29
+ assert_equal 1000, Prefab::Options.new.collect_max_paths
30
+ assert_equal 100, Prefab::Options.new(collect_max_paths: 100).collect_max_paths
31
+ end
32
+
33
+ def test_collect_max_paths_with_local_only
34
+ options = Prefab::Options.new(collect_max_paths: 100,
35
+ prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY)
36
+ assert_equal 0, options.collect_max_paths
37
+ end
38
+
39
+ def test_collect_max_paths_with_collect_logger_counts_false
40
+ options = Prefab::Options.new(collect_max_paths: 100,
41
+ collect_logger_counts: false)
42
+ assert_equal 0, options.collect_max_paths
43
+ end
44
+
45
+ def test_collect_max_evaluation_summaries
46
+ assert_equal 100_000, Prefab::Options.new.collect_max_evaluation_summaries
47
+ assert_equal 0, Prefab::Options.new(collect_evaluation_summaries: false).collect_max_evaluation_summaries
48
+ assert_equal 3,
49
+ Prefab::Options.new(collect_max_evaluation_summaries: 3).collect_max_evaluation_summaries
50
+ end
51
+
52
+ def test_context_upload_mode_periodic
53
+ options = Prefab::Options.new(context_upload_mode: :periodic_example, context_max_size: 100)
54
+ assert_equal 100, options.collect_max_example_contexts
55
+
56
+ options = Prefab::Options.new(context_upload_mode: :none)
57
+ assert_equal 0, options.collect_max_example_contexts
58
+ end
59
+
60
+ def test_context_upload_mode_shape_only
61
+ options = Prefab::Options.new(context_upload_mode: :shape_only, context_max_size: 100)
62
+ assert_equal 100, options.collect_max_shapes
63
+
64
+ options = Prefab::Options.new(context_upload_mode: :none)
65
+ assert_equal 0, options.collect_max_shapes
66
+ end
67
+
68
+ def test_context_upload_mode_none
69
+ options = Prefab::Options.new(context_upload_mode: :none)
70
+ assert_equal 0, options.collect_max_example_contexts
71
+
72
+ options = Prefab::Options.new(context_upload_mode: :none)
73
+ assert_equal 0, options.collect_max_shapes
74
+ end
75
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class TestPrefab < Minitest::Test
6
+ def test_get
7
+ Prefab.init(prefab_options)
8
+ assert_equal 'default', Prefab.get('does.not.exist', 'default')
9
+ assert_equal 'test sample value', Prefab.get('sample')
10
+ assert_equal 123, Prefab.get('sample_int')
11
+ end
12
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+ require 'timecop'
5
+
6
+ class RateLimitCacheTest < Minitest::Test
7
+ def test_set_and_fresh
8
+ cache = Prefab::RateLimitCache.new(5)
9
+ cache.set('key')
10
+ assert cache.fresh?('key')
11
+ end
12
+
13
+ def test_fresh_with_no_set
14
+ cache = Prefab::RateLimitCache.new(5)
15
+ refute cache.fresh?('key')
16
+ end
17
+
18
+ def test_get_after_expiration
19
+ cache = Prefab::RateLimitCache.new(5)
20
+
21
+ Timecop.freeze(Time.now - 6) do
22
+ cache.set('key')
23
+ assert cache.fresh?('key')
24
+ end
25
+
26
+ refute cache.fresh?('key')
27
+
28
+ # but the data is still there
29
+ assert cache.data.get('key')
30
+ end
31
+
32
+ def test_prune
33
+ cache = Prefab::RateLimitCache.new(5)
34
+
35
+ Timecop.freeze(Time.now - 6) do
36
+ cache.set('key')
37
+ assert cache.fresh?('key')
38
+ end
39
+
40
+ cache.prune
41
+
42
+ refute cache.fresh?('key')
43
+ end
44
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class TestWeightedValueResolver < Minitest::Test
6
+ KEY = 'config_key'
7
+
8
+ def test_resolving_single_value
9
+ values = weighted_values([['abc', 1]])
10
+ resolver = Prefab::WeightedValueResolver.new(values, KEY, nil)
11
+ assert_equal 'abc', resolver.resolve[0].value.string
12
+ assert_equal 0, resolver.resolve[1]
13
+ end
14
+
15
+ def test_resolving_multiple_values_evenly_distributed
16
+ values = weighted_values([['abc', 1], ['def', 1]])
17
+
18
+ resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:001')
19
+ assert_equal 'abc', resolver.resolve[0].value.string
20
+ assert_equal 0, resolver.resolve[1]
21
+
22
+ resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:456')
23
+ assert_equal 'def', resolver.resolve[0].value.string
24
+ assert_equal 1, resolver.resolve[1]
25
+ end
26
+
27
+ def test_resolving_multiple_values_unevenly_distributed
28
+ values = weighted_values([['abc', 1], ['def', 98], ['ghi', 1]])
29
+
30
+ resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:456')
31
+ assert_equal 'def', resolver.resolve[0].value.string
32
+ assert_equal 1, resolver.resolve[1]
33
+
34
+ resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:103')
35
+ assert_equal 'ghi', resolver.resolve[0].value.string
36
+ assert_equal 2, resolver.resolve[1]
37
+
38
+ resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:119')
39
+ assert_equal 'abc', resolver.resolve[0].value.string
40
+ assert_equal 0, resolver.resolve[1]
41
+ end
42
+
43
+ def test_resolving_multiple_values_with_simulation
44
+ values = weighted_values([['abc', 1], ['def', 98], ['ghi', 1]])
45
+ results = {}
46
+
47
+ 10_000.times do |i|
48
+ result = Prefab::WeightedValueResolver.new(values, KEY, "user:#{i}").resolve[0].value.string
49
+ results[result] ||= 0
50
+ results[result] += 1
51
+ end
52
+
53
+ assert_in_delta 100, results['abc'], 20
54
+ assert_in_delta 9800, results['def'], 50
55
+ assert_in_delta 100, results['ghi'], 20
56
+ end
57
+
58
+ private
59
+
60
+ def weighted_values(values_and_weights)
61
+ values_and_weights.map do |value, weight|
62
+ weighted_value(value, weight)
63
+ end
64
+ end
65
+
66
+ def weighted_value(string, weight)
67
+ PrefabProto::WeightedValue.new(
68
+ value: PrefabProto::ConfigValue.new(string: string), weight: weight
69
+ )
70
+ end
71
+ end
metadata ADDED
@@ -0,0 +1,337 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prefab-cloud-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: '0'
5
+ platform: ruby
6
+ authors:
7
+ - Jeff Dwyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-02-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.5
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.5
33
+ - !ruby/object:Gem::Dependency
34
+ name: faraday
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: googleapis-common-protos-types
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
+ - !ruby/object:Gem::Dependency
62
+ name: google-protobuf
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: ld-eventsource
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: uuid
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: activesupport
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '4'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '4'
117
+ - !ruby/object:Gem::Dependency
118
+ name: actionpack
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '4'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '4'
131
+ - !ruby/object:Gem::Dependency
132
+ name: semantic_logger
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: benchmark-ips
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: bundler
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: juwelier
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: 2.4.9
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: 2.4.9
187
+ - !ruby/object:Gem::Dependency
188
+ name: rdoc
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ - !ruby/object:Gem::Dependency
202
+ name: simplecov
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ description: Feature Flags, Live Config, and Dynamic Log Levels as a service
216
+ email: jdwyer@prefab.cloud
217
+ executables:
218
+ - console
219
+ extensions: []
220
+ extra_rdoc_files:
221
+ - CHANGELOG.md
222
+ - LICENSE.txt
223
+ - README.md
224
+ files:
225
+ - ".envrc.sample"
226
+ - ".github/workflows/ruby.yml"
227
+ - ".gitmodules"
228
+ - ".rubocop.yml"
229
+ - ".tool-versions"
230
+ - CHANGELOG.md
231
+ - CODEOWNERS
232
+ - Gemfile
233
+ - Gemfile.lock
234
+ - LICENSE.txt
235
+ - README.md
236
+ - Rakefile
237
+ - VERSION
238
+ - bin/console
239
+ - compile_protos.sh
240
+ - lib/prefab-cloud-ruby.rb
241
+ - lib/prefab/client.rb
242
+ - lib/prefab/config_client.rb
243
+ - lib/prefab/config_client_presenter.rb
244
+ - lib/prefab/config_loader.rb
245
+ - lib/prefab/config_resolver.rb
246
+ - lib/prefab/config_value_unwrapper.rb
247
+ - lib/prefab/config_value_wrapper.rb
248
+ - lib/prefab/context.rb
249
+ - lib/prefab/context_shape.rb
250
+ - lib/prefab/context_shape_aggregator.rb
251
+ - lib/prefab/criteria_evaluator.rb
252
+ - lib/prefab/encryption.rb
253
+ - lib/prefab/error.rb
254
+ - lib/prefab/errors/env_var_parse_error.rb
255
+ - lib/prefab/errors/initialization_timeout_error.rb
256
+ - lib/prefab/errors/invalid_api_key_error.rb
257
+ - lib/prefab/errors/missing_default_error.rb
258
+ - lib/prefab/errors/missing_env_var_error.rb
259
+ - lib/prefab/errors/uninitialized_error.rb
260
+ - lib/prefab/evaluation.rb
261
+ - lib/prefab/evaluation_summary_aggregator.rb
262
+ - lib/prefab/example_contexts_aggregator.rb
263
+ - lib/prefab/exponential_backoff.rb
264
+ - lib/prefab/feature_flag_client.rb
265
+ - lib/prefab/http_connection.rb
266
+ - lib/prefab/internal_logger.rb
267
+ - lib/prefab/local_config_parser.rb
268
+ - lib/prefab/log_path_aggregator.rb
269
+ - lib/prefab/logger_client.rb
270
+ - lib/prefab/murmer3.rb
271
+ - lib/prefab/options.rb
272
+ - lib/prefab/periodic_sync.rb
273
+ - lib/prefab/prefab.rb
274
+ - lib/prefab/rate_limit_cache.rb
275
+ - lib/prefab/resolved_config_presenter.rb
276
+ - lib/prefab/time_helpers.rb
277
+ - lib/prefab/weighted_value_resolver.rb
278
+ - lib/prefab/yaml_config_parser.rb
279
+ - lib/prefab_pb.rb
280
+ - prefab-cloud-ruby.gemspec
281
+ - test/.prefab.default.config.yaml
282
+ - test/.prefab.unit_tests.config.yaml
283
+ - test/integration_test.rb
284
+ - test/integration_test_helpers.rb
285
+ - test/support/common_helpers.rb
286
+ - test/support/mock_base_client.rb
287
+ - test/support/mock_config_client.rb
288
+ - test/support/mock_config_loader.rb
289
+ - test/test_client.rb
290
+ - test/test_config_client.rb
291
+ - test/test_config_loader.rb
292
+ - test/test_config_resolver.rb
293
+ - test/test_config_value_unwrapper.rb
294
+ - test/test_config_value_wrapper.rb
295
+ - test/test_context.rb
296
+ - test/test_context_shape.rb
297
+ - test/test_context_shape_aggregator.rb
298
+ - test/test_criteria_evaluator.rb
299
+ - test/test_encryption.rb
300
+ - test/test_evaluation_summary_aggregator.rb
301
+ - test/test_example_contexts_aggregator.rb
302
+ - test/test_exponential_backoff.rb
303
+ - test/test_feature_flag_client.rb
304
+ - test/test_helper.rb
305
+ - test/test_integration.rb
306
+ - test/test_local_config_parser.rb
307
+ - test/test_log_path_aggregator.rb
308
+ - test/test_logger.rb
309
+ - test/test_logger_initialization.rb
310
+ - test/test_options.rb
311
+ - test/test_prefab.rb
312
+ - test/test_rate_limit_cache.rb
313
+ - test/test_weighted_value_resolver.rb
314
+ homepage: http://github.com/prefab-cloud/prefab-cloud-ruby
315
+ licenses:
316
+ - MIT
317
+ metadata: {}
318
+ post_install_message:
319
+ rdoc_options: []
320
+ require_paths:
321
+ - lib
322
+ required_ruby_version: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ">="
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
327
+ required_rubygems_version: !ruby/object:Gem::Requirement
328
+ requirements:
329
+ - - ">="
330
+ - !ruby/object:Gem::Version
331
+ version: '0'
332
+ requirements: []
333
+ rubygems_version: 3.2.32
334
+ signing_key:
335
+ specification_version: 4
336
+ summary: Prefab Ruby Infrastructure
337
+ test_files: []