prefab-cloud-ruby 1.6.1 → 1.6.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/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/lib/prefab/context.rb +23 -6
- data/lib/prefab/logger_client.rb +2 -8
- data/prefab-cloud-ruby.gemspec +3 -3
- data/test/support/common_helpers.rb +2 -0
- data/test/test_config_resolver.rb +31 -0
- data/test/test_context.rb +87 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f938b850265077b3ea456a8cab3d93eda3eadcba2d7807af03bae5be36b9c625
|
4
|
+
data.tar.gz: 5219784f5f6e30a0bddc1376ef102e3f2431639278c9225aa8000ac53cc9c4fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16c8a0d94d3c267cc3ea7ff4be436e0dfe7a2b7124e8f7d5500194379d0a06e8f8985f790dbc128e70b8960f61c8ce56bc15025ed8872722ce6b9b729a36a760
|
7
|
+
data.tar.gz: 1eb81d70d7728b1f900a7a96ae344b7c2fc85a248eecc17ddb662ff1aec80c7704321e1b7e9fb8926090736ae3fe12f2a8f1d378c625900a94031b390cfcfba6
|
data/CHANGELOG.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.2
|
data/lib/prefab/context.rb
CHANGED
@@ -31,7 +31,7 @@ module Prefab
|
|
31
31
|
end
|
32
32
|
|
33
33
|
THREAD_KEY = :prefab_context
|
34
|
-
attr_reader :contexts, :seen_at
|
34
|
+
attr_reader :contexts, :seen_at, :id, :parent
|
35
35
|
|
36
36
|
class << self
|
37
37
|
def global_context=(context)
|
@@ -173,6 +173,7 @@ module Prefab
|
|
173
173
|
|
174
174
|
def clear
|
175
175
|
@contexts = {}
|
176
|
+
@flattened = {}
|
176
177
|
end
|
177
178
|
|
178
179
|
def context(name)
|
@@ -187,6 +188,18 @@ module Prefab
|
|
187
188
|
self
|
188
189
|
end
|
189
190
|
|
191
|
+
def reportable_tree
|
192
|
+
ctx = self
|
193
|
+
reportables = []
|
194
|
+
|
195
|
+
while ctx
|
196
|
+
reportables.unshift(ctx)
|
197
|
+
ctx = ctx.parent
|
198
|
+
end
|
199
|
+
|
200
|
+
reportables
|
201
|
+
end
|
202
|
+
|
190
203
|
def to_proto(namespace)
|
191
204
|
prefab_context = {
|
192
205
|
'current-time' => ConfigValueWrapper.wrap(Prefab::TimeHelpers.now_in_ms)
|
@@ -194,8 +207,16 @@ module Prefab
|
|
194
207
|
|
195
208
|
prefab_context['namespace'] = ConfigValueWrapper.wrap(namespace) if namespace&.length&.positive?
|
196
209
|
|
210
|
+
reportable_contexts = {}
|
211
|
+
|
212
|
+
reportable_tree.each do |ctx|
|
213
|
+
ctx.contexts.each do |name, context|
|
214
|
+
reportable_contexts[name] = context
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
197
218
|
PrefabProto::ContextSet.new(
|
198
|
-
contexts:
|
219
|
+
contexts: reportable_contexts.map do |name, context|
|
199
220
|
context.to_proto
|
200
221
|
end.concat([PrefabProto::Context.new(type: 'prefab',
|
201
222
|
values: prefab_context)])
|
@@ -224,9 +245,5 @@ module Prefab
|
|
224
245
|
super
|
225
246
|
end
|
226
247
|
end
|
227
|
-
|
228
|
-
def id
|
229
|
-
@id
|
230
|
-
end
|
231
248
|
end
|
232
249
|
end
|
data/lib/prefab/logger_client.rb
CHANGED
@@ -28,13 +28,11 @@ module Prefab
|
|
28
28
|
|
29
29
|
def semantic_filter(log)
|
30
30
|
class_path = class_path_name(log.name)
|
31
|
-
lookup_path = "#{logger_prefix}.#{class_path}"
|
32
31
|
level = SemanticLogger::Levels.index(log.level)
|
33
|
-
log.named_tags.merge!({ path:
|
34
|
-
should_log? level,
|
32
|
+
log.named_tags.merge!({ path: class_path })
|
33
|
+
should_log? level, class_path
|
35
34
|
end
|
36
35
|
|
37
|
-
|
38
36
|
def config_client=(config_client)
|
39
37
|
@config_client = config_client
|
40
38
|
end
|
@@ -50,10 +48,6 @@ module Prefab
|
|
50
48
|
end.gsub(/[^a-z_]/i, '.')
|
51
49
|
end
|
52
50
|
|
53
|
-
def logger_prefix
|
54
|
-
Context.current.get("application.key") || "prefab-cloud-ruby"
|
55
|
-
end
|
56
|
-
|
57
51
|
# Find the closest match to 'log_level.path' in config
|
58
52
|
def level_of(path)
|
59
53
|
closest_log_level_match = nil
|
data/prefab-cloud-ruby.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: prefab-cloud-ruby 1.6.
|
5
|
+
# stub: prefab-cloud-ruby 1.6.2 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "prefab-cloud-ruby".freeze
|
9
|
-
s.version = "1.6.
|
9
|
+
s.version = "1.6.2"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Jeff Dwyer".freeze]
|
14
|
-
s.date = "2024-03-
|
14
|
+
s.date = "2024-03-29"
|
15
15
|
s.description = "Feature Flags, Live Config, and Dynamic Log Levels as a service".freeze
|
16
16
|
s.email = "jdwyer@prefab.cloud".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -7,6 +7,8 @@ module CommonHelpers
|
|
7
7
|
$oldstderr, $stderr = $stderr, StringIO.new
|
8
8
|
|
9
9
|
$logs = StringIO.new
|
10
|
+
Prefab::Context.global_context.clear
|
11
|
+
Prefab::Context.default_context.clear
|
10
12
|
SemanticLogger.add_appender(io: $logs, filter: Prefab.log_filter)
|
11
13
|
SemanticLogger.sync!
|
12
14
|
Timecop.freeze('2023-08-09 15:18:12 -0400')
|
@@ -449,6 +449,37 @@ class TestConfigResolver < Minitest::Test
|
|
449
449
|
end
|
450
450
|
end
|
451
451
|
|
452
|
+
def test_context_lookup_with_no_local_context
|
453
|
+
global_context = { cpu: { count: 4, speed: '2.4GHz' }, clock: { timezone: 'UTC' } }
|
454
|
+
default_context = { 'prefab-api-key' => { 'user-id' => 123 } }
|
455
|
+
jit_context = { user: { name: 'Frank' } }
|
456
|
+
|
457
|
+
config = PrefabProto::Config.new( key: 'example', rows: [ PrefabProto::ConfigRow.new( values: [ PrefabProto::ConditionalValue.new( value: PrefabProto::ConfigValue.new(string: 'valueB2')) ]) ])
|
458
|
+
|
459
|
+
client = new_client(global_context: global_context, config: [config])
|
460
|
+
|
461
|
+
# we fake getting the default context from the API
|
462
|
+
Prefab::Context.default_context = default_context
|
463
|
+
|
464
|
+
resolver = client.resolver
|
465
|
+
|
466
|
+
context = resolver.get("example", jit_context).context
|
467
|
+
|
468
|
+
# This digs all the way to the global context
|
469
|
+
assert_equal 4, context.get('cpu.count')
|
470
|
+
assert_equal '2.4GHz', context.get('cpu.speed')
|
471
|
+
assert_equal 'UTC', context.get('clock.timezone')
|
472
|
+
|
473
|
+
# This digs to the default context
|
474
|
+
assert_equal 123, context.get('prefab-api-key.user-id')
|
475
|
+
|
476
|
+
# This uses the jit context
|
477
|
+
assert_equal 'Frank', context.get('user.name')
|
478
|
+
|
479
|
+
# This is nil in the jit context because `user` was clobbered
|
480
|
+
assert_nil context.get('user.email')
|
481
|
+
end
|
482
|
+
|
452
483
|
private
|
453
484
|
|
454
485
|
def resolver_for_namespace(namespace, loader, project_env_id: TEST_ENV_ID)
|
data/test/test_context.rb
CHANGED
@@ -154,6 +154,93 @@ class TestContext < Minitest::Test
|
|
154
154
|
), contexts.to_proto(namespace)
|
155
155
|
end
|
156
156
|
|
157
|
+
def test_to_proto_with_parent
|
158
|
+
global_context = { cpu: { count: 4, speed: '2.4GHz' }, clock: { timezone: 'UTC' }, magic: { key: "global-key" } }
|
159
|
+
default_context = { 'prefab-api-key' => { 'user-id' => 123 } }
|
160
|
+
|
161
|
+
Prefab::Context.global_context = global_context
|
162
|
+
Prefab::Context.default_context = default_context
|
163
|
+
|
164
|
+
Prefab::Context.current = {
|
165
|
+
user: { id: 2, email: 'parent-email' },
|
166
|
+
magic: { key: 'parent-key', rabbits: 3 },
|
167
|
+
clock: { timezone: 'PST' }
|
168
|
+
}
|
169
|
+
|
170
|
+
contexts = Prefab::Context.join(hash: {
|
171
|
+
user: {
|
172
|
+
id: 1,
|
173
|
+
email: 'user-email'
|
174
|
+
},
|
175
|
+
team: {
|
176
|
+
id: 2,
|
177
|
+
name: 'team-name'
|
178
|
+
}
|
179
|
+
}, id: :jit, parent: Prefab::Context.current)
|
180
|
+
|
181
|
+
expected = PrefabProto::ContextSet.new(
|
182
|
+
contexts: [
|
183
|
+
# Via global
|
184
|
+
PrefabProto::Context.new(
|
185
|
+
type: "cpu",
|
186
|
+
values: {
|
187
|
+
"count" => PrefabProto::ConfigValue.new(int: 4),
|
188
|
+
"speed" => PrefabProto::ConfigValue.new(string: "2.4GHz")
|
189
|
+
}
|
190
|
+
),
|
191
|
+
# Via default
|
192
|
+
PrefabProto::Context.new(
|
193
|
+
type: "clock",
|
194
|
+
values: {
|
195
|
+
"timezone" => PrefabProto::ConfigValue.new(string: 'PST'),
|
196
|
+
}
|
197
|
+
),
|
198
|
+
# via current
|
199
|
+
PrefabProto::Context.new(
|
200
|
+
type: "magic",
|
201
|
+
values: {
|
202
|
+
"key" => PrefabProto::ConfigValue.new(string: 'parent-key'),
|
203
|
+
"rabbits" => PrefabProto::ConfigValue.new(int: 3)
|
204
|
+
}
|
205
|
+
),
|
206
|
+
# via default
|
207
|
+
PrefabProto::Context.new(
|
208
|
+
type: "prefab-api-key",
|
209
|
+
values: {
|
210
|
+
"user-id" => PrefabProto::ConfigValue.new(int: 123)
|
211
|
+
}
|
212
|
+
),
|
213
|
+
# via jit
|
214
|
+
PrefabProto::Context.new(
|
215
|
+
type: "user",
|
216
|
+
values: {
|
217
|
+
"id" => PrefabProto::ConfigValue.new(int: 1),
|
218
|
+
"email" => PrefabProto::ConfigValue.new(string: "user-email")
|
219
|
+
}
|
220
|
+
),
|
221
|
+
# via jit
|
222
|
+
PrefabProto::Context.new(
|
223
|
+
type: "team",
|
224
|
+
values: {
|
225
|
+
"id" => PrefabProto::ConfigValue.new(int: 2),
|
226
|
+
"name" => PrefabProto::ConfigValue.new(string: "team-name")
|
227
|
+
}
|
228
|
+
),
|
229
|
+
# via to_proto
|
230
|
+
PrefabProto::Context.new(
|
231
|
+
type: "prefab",
|
232
|
+
values: {
|
233
|
+
'current-time' => PrefabProto::ConfigValue.new(int: Prefab::TimeHelpers.now_in_ms),
|
234
|
+
}
|
235
|
+
)
|
236
|
+
]
|
237
|
+
)
|
238
|
+
|
239
|
+
actual = contexts.to_proto("")
|
240
|
+
|
241
|
+
assert_equal expected, actual
|
242
|
+
end
|
243
|
+
|
157
244
|
def test_parent_lookup
|
158
245
|
global_context = { cpu: { count: 4, speed: '2.4GHz' }, clock: { timezone: 'UTC' } }
|
159
246
|
default_context = { 'prefab-api-key' => { 'user-id' => 123 } }
|
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.6.
|
4
|
+
version: 1.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|