prefab-cloud-ruby 1.2.1 → 1.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +21 -0
- data/LICENSE.txt +1 -1
- data/VERSION +1 -1
- data/lib/prefab/client.rb +4 -0
- data/lib/prefab/config_client.rb +20 -1
- data/lib/prefab/config_loader.rb +2 -0
- data/lib/prefab/config_value_unwrapper.rb +93 -15
- data/lib/prefab/config_value_wrapper.rb +6 -6
- data/lib/prefab/criteria_evaluator.rb +4 -3
- data/lib/prefab/encryption.rb +65 -0
- data/lib/prefab/errors/env_var_parse_error.rb +11 -0
- data/lib/prefab/evaluation.rb +8 -4
- data/lib/prefab/internal_logger.rb +6 -23
- data/lib/prefab/local_config_parser.rb +58 -2
- data/lib/prefab/log_subscribers/action_controller_subscriber.rb +54 -0
- data/lib/prefab/logger_client.rb +0 -7
- data/lib/prefab/options.rb +11 -1
- data/lib/prefab/resolved_config_presenter.rb +2 -2
- data/lib/prefab/sse_logger.rb +4 -20
- data/lib/prefab/static_logger.rb +29 -0
- data/lib/prefab-cloud-ruby.rb +6 -0
- data/prefab-cloud-ruby.gemspec +11 -3
- data/test/test_action_controller.rb +52 -0
- data/test/test_config_value_unwrapper.rb +167 -20
- data/test/test_context_shape.rb +0 -1
- data/test/test_encryption.rb +16 -0
- data/test/test_local_config_parser.rb +73 -2
- data/test/test_logger.rb +5 -5
- metadata +22 -2
@@ -6,6 +6,11 @@ class TestLocalConfigParser < Minitest::Test
|
|
6
6
|
FILE_NAME = 'example-config.yaml'
|
7
7
|
DEFAULT_MATCH = 'default'
|
8
8
|
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
@mock_resolver = MockResolver.new
|
12
|
+
end
|
13
|
+
|
9
14
|
def test_parse_int_config
|
10
15
|
key = :sample_int
|
11
16
|
parsed = Prefab::LocalConfigParser.parse(key, 123, {}, FILE_NAME)[key]
|
@@ -34,7 +39,7 @@ class TestLocalConfigParser < Minitest::Test
|
|
34
39
|
assert_equal 1, config.rows[0].values.size
|
35
40
|
|
36
41
|
value_row = config.rows[0].values[0]
|
37
|
-
assert_equal 'all-features', Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}).unwrap
|
42
|
+
assert_equal 'all-features', Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}, @mock_resolver).unwrap
|
38
43
|
end
|
39
44
|
|
40
45
|
def test_flag_in_user_key
|
@@ -53,13 +58,73 @@ class TestLocalConfigParser < Minitest::Test
|
|
53
58
|
assert_equal 1, config.rows[0].values[0].criteria.size
|
54
59
|
|
55
60
|
value_row = config.rows[0].values[0]
|
56
|
-
assert_equal true, Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}).unwrap
|
61
|
+
assert_equal true, Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}, @mock_resolver).unwrap
|
57
62
|
|
58
63
|
assert_equal 'user.key', value_row.criteria[0].property_name
|
59
64
|
assert_equal :PROP_IS_ONE_OF, value_row.criteria[0].operator
|
60
65
|
assert_equal %w[abc123 xyz987], value_row.criteria[0].value_to_match.string_list.values
|
61
66
|
end
|
62
67
|
|
68
|
+
def test_provided_values
|
69
|
+
with_env('LOOKUP_ENV', 'from env') do
|
70
|
+
key = :test_provided
|
71
|
+
value = stringify_keys({type: 'provided', source: 'ENV_VAR', lookup: 'LOOKUP_ENV'})
|
72
|
+
parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key]
|
73
|
+
config = parsed[:config]
|
74
|
+
|
75
|
+
assert_equal FILE_NAME, parsed[:source]
|
76
|
+
assert_equal 'LOOKUP_ENV', parsed[:match]
|
77
|
+
assert_equal :CONFIG, config.config_type
|
78
|
+
assert_equal key.to_s, config.key
|
79
|
+
assert_equal 1, config.rows.size
|
80
|
+
assert_equal 1, config.rows[0].values.size
|
81
|
+
|
82
|
+
value_row = config.rows[0].values[0]
|
83
|
+
provided = value_row.value.provided
|
84
|
+
assert_equal :ENV_VAR, provided.source
|
85
|
+
assert_equal 'LOOKUP_ENV', provided.lookup
|
86
|
+
assert_equal 'from env', Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).unwrap
|
87
|
+
reportable_value = Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).reportable_value
|
88
|
+
assert_equal 'from env', reportable_value
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_confidential_provided_values
|
93
|
+
with_env('LOOKUP_ENV', 'from env') do
|
94
|
+
key = :test_provided
|
95
|
+
value = stringify_keys({type: 'provided', source: 'ENV_VAR', lookup: 'LOOKUP_ENV', confidential: true})
|
96
|
+
parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key]
|
97
|
+
config = parsed[:config]
|
98
|
+
|
99
|
+
value_row = config.rows[0].values[0]
|
100
|
+
provided = value_row.value.provided
|
101
|
+
assert_equal :ENV_VAR, provided.source
|
102
|
+
assert_equal 'LOOKUP_ENV', provided.lookup
|
103
|
+
assert_equal 'from env', Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).unwrap
|
104
|
+
reportable_value = Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).reportable_value
|
105
|
+
assert reportable_value.start_with? Prefab::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_confidential_values
|
110
|
+
key = :test_confidential
|
111
|
+
value = stringify_keys({value: 'a confidential string', confidential: true})
|
112
|
+
parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key]
|
113
|
+
config = parsed[:config]
|
114
|
+
|
115
|
+
assert_equal FILE_NAME, parsed[:source]
|
116
|
+
assert_equal :CONFIG, config.config_type
|
117
|
+
assert_equal key.to_s, config.key
|
118
|
+
assert_equal 1, config.rows.size
|
119
|
+
assert_equal 1, config.rows[0].values.size
|
120
|
+
|
121
|
+
value_row = config.rows[0].values[0]
|
122
|
+
config_value = value_row.value
|
123
|
+
assert_equal 'a confidential string', Prefab::ConfigValueUnwrapper.deepest_value(config_value, key, {}, @mock_resolver).unwrap
|
124
|
+
reportable_value = Prefab::ConfigValueUnwrapper.deepest_value(config_value, key, {}, @mock_resolver).reportable_value
|
125
|
+
assert reportable_value.start_with? Prefab::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX
|
126
|
+
end
|
127
|
+
|
63
128
|
private
|
64
129
|
|
65
130
|
def stringify_keys(hash)
|
@@ -73,4 +138,10 @@ class TestLocalConfigParser < Minitest::Test
|
|
73
138
|
end
|
74
139
|
result
|
75
140
|
end
|
141
|
+
|
142
|
+
class MockResolver
|
143
|
+
def get(key)
|
144
|
+
raise "unexpected key"
|
145
|
+
end
|
146
|
+
end
|
76
147
|
end
|
data/test/test_logger.rb
CHANGED
@@ -87,22 +87,22 @@ class TestLogger < Minitest::Test
|
|
87
87
|
|
88
88
|
def test_log_internal
|
89
89
|
prefab, io = captured_logger
|
90
|
-
prefab.log.log_internal(::Logger::WARN, 'test message', 'test.path')
|
90
|
+
prefab.log.log_internal(::Logger::WARN, 'test message', 'cloud.prefab.client.test.path')
|
91
91
|
assert_logged io, 'WARN', "cloud.prefab.client.test.path", "test message"
|
92
92
|
end
|
93
93
|
|
94
94
|
def test_log_internal_unknown
|
95
95
|
prefab, io = captured_logger
|
96
|
-
prefab.log.log_internal(::Logger::UNKNOWN, 'test message', 'test.path')
|
96
|
+
prefab.log.log_internal(::Logger::UNKNOWN, 'test message', 'cloud.prefab.client.test.path')
|
97
97
|
assert_logged io, 'ANY', "cloud.prefab.client.test.path", "test message"
|
98
98
|
end
|
99
99
|
|
100
100
|
def test_log_internal_silencing
|
101
101
|
prefab, io = captured_logger
|
102
102
|
prefab.log.silence do
|
103
|
-
prefab.log.log_internal(::Logger::WARN, 'should not log', 'test.path')
|
103
|
+
prefab.log.log_internal(::Logger::WARN, 'should not log', 'cloud.prefab.client.test.path')
|
104
104
|
end
|
105
|
-
prefab.log.log_internal(::Logger::WARN, 'should log', 'test.path')
|
105
|
+
prefab.log.log_internal(::Logger::WARN, 'should log', 'cloud.prefab.client.test.path')
|
106
106
|
assert_logged io, 'WARN', "cloud.prefab.client.test.path", "should log"
|
107
107
|
refute_logged io, 'should not log'
|
108
108
|
end
|
@@ -457,7 +457,7 @@ class TestLogger < Minitest::Test
|
|
457
457
|
def test_structured_internal_logging
|
458
458
|
prefab, io = captured_logger
|
459
459
|
|
460
|
-
prefab.log.log_internal(::Logger::WARN, 'test', 'test.path', user: "michael")
|
460
|
+
prefab.log.log_internal(::Logger::WARN, 'test', 'cloud.prefab.client.test.path', user: "michael")
|
461
461
|
|
462
462
|
assert_logged io, 'WARN', 'cloud.prefab.client.test.path', "test user=michael"
|
463
463
|
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: 1.
|
4
|
+
version: 1.3.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: 2023-11-
|
11
|
+
date: 2023-11-13 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: 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'
|
103
117
|
- !ruby/object:Gem::Dependency
|
104
118
|
name: benchmark-ips
|
105
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -207,7 +221,9 @@ files:
|
|
207
221
|
- lib/prefab/context_shape.rb
|
208
222
|
- lib/prefab/context_shape_aggregator.rb
|
209
223
|
- lib/prefab/criteria_evaluator.rb
|
224
|
+
- lib/prefab/encryption.rb
|
210
225
|
- lib/prefab/error.rb
|
226
|
+
- lib/prefab/errors/env_var_parse_error.rb
|
211
227
|
- lib/prefab/errors/initialization_timeout_error.rb
|
212
228
|
- lib/prefab/errors/invalid_api_key_error.rb
|
213
229
|
- lib/prefab/errors/missing_default_error.rb
|
@@ -220,6 +236,7 @@ files:
|
|
220
236
|
- lib/prefab/internal_logger.rb
|
221
237
|
- lib/prefab/local_config_parser.rb
|
222
238
|
- lib/prefab/log_path_aggregator.rb
|
239
|
+
- lib/prefab/log_subscribers/action_controller_subscriber.rb
|
223
240
|
- lib/prefab/logger_client.rb
|
224
241
|
- lib/prefab/murmer3.rb
|
225
242
|
- lib/prefab/options.rb
|
@@ -228,6 +245,7 @@ files:
|
|
228
245
|
- lib/prefab/rate_limit_cache.rb
|
229
246
|
- lib/prefab/resolved_config_presenter.rb
|
230
247
|
- lib/prefab/sse_logger.rb
|
248
|
+
- lib/prefab/static_logger.rb
|
231
249
|
- lib/prefab/time_helpers.rb
|
232
250
|
- lib/prefab/weighted_value_resolver.rb
|
233
251
|
- lib/prefab/yaml_config_parser.rb
|
@@ -241,6 +259,7 @@ files:
|
|
241
259
|
- test/support/mock_base_client.rb
|
242
260
|
- test/support/mock_config_client.rb
|
243
261
|
- test/support/mock_config_loader.rb
|
262
|
+
- test/test_action_controller.rb
|
244
263
|
- test/test_client.rb
|
245
264
|
- test/test_config_client.rb
|
246
265
|
- test/test_config_loader.rb
|
@@ -251,6 +270,7 @@ files:
|
|
251
270
|
- test/test_context_shape.rb
|
252
271
|
- test/test_context_shape_aggregator.rb
|
253
272
|
- test/test_criteria_evaluator.rb
|
273
|
+
- test/test_encryption.rb
|
254
274
|
- test/test_evaluation_summary_aggregator.rb
|
255
275
|
- test/test_example_contexts_aggregator.rb
|
256
276
|
- test/test_exponential_backoff.rb
|