prefab-cloud-ruby 1.6.0.pre2 → 1.6.1

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.
@@ -8,18 +8,8 @@ module Prefab
8
8
  attr_reader :name
9
9
 
10
10
  def initialize(name, hash)
11
- @hash = {}
12
11
  @name = name.to_s
13
-
14
- merge!(hash)
15
- end
16
-
17
- def get(parts)
18
- @hash[parts]
19
- end
20
-
21
- def merge!(other)
22
- @hash = @hash.merge(other.transform_keys(&:to_s))
12
+ @hash = hash.transform_keys(&:to_s)
23
13
  end
24
14
 
25
15
  def to_h
@@ -27,13 +17,13 @@ module Prefab
27
17
  end
28
18
 
29
19
  def key
30
- "#{@name}:#{get('key')}"
20
+ "#{@name}:#{@hash['key']}"
31
21
  end
32
22
 
33
23
  def to_proto
34
24
  PrefabProto::Context.new(
35
25
  type: name,
36
- values: to_h.transform_values do |value|
26
+ values: @hash.transform_values do |value|
37
27
  ConfigValueWrapper.wrap(value)
38
28
  end
39
29
  )
@@ -44,17 +34,35 @@ module Prefab
44
34
  attr_reader :contexts, :seen_at
45
35
 
46
36
  class << self
37
+ def global_context=(context)
38
+ @global_context = join(hash: context, parent: nil, id: :global_context)
39
+ end
40
+
41
+ def global_context
42
+ @global_context ||= join(parent: nil, id: :global_context)
43
+ end
44
+
45
+ def default_context=(context)
46
+ @default_context = join(hash: context, parent: global_context, id: :default_context)
47
+
48
+ self.current.update_parent(@default_context)
49
+ end
50
+
51
+ def default_context
52
+ @default_context ||= join(parent: global_context, id: :default_context)
53
+ end
54
+
47
55
  def current=(context)
48
- Thread.current[THREAD_KEY] = context
56
+ Thread.current[THREAD_KEY] = join(hash: context || {}, parent: default_context, id: :block)
49
57
  end
50
58
 
51
59
  def current
52
- Thread.current[THREAD_KEY] ||= new
60
+ Thread.current[THREAD_KEY] ||= join(parent: default_context, id: :block)
53
61
  end
54
62
 
55
63
  def with_context(context)
56
64
  old_context = Thread.current[THREAD_KEY]
57
- Thread.current[THREAD_KEY] = new(context)
65
+ Thread.current[THREAD_KEY] = join(parent: default_context, hash: context, id: :block)
58
66
  yield
59
67
  ensure
60
68
  Thread.current[THREAD_KEY] = old_context
@@ -62,7 +70,7 @@ module Prefab
62
70
 
63
71
  def with_merged_context(context)
64
72
  old_context = Thread.current[THREAD_KEY]
65
- Thread.current[THREAD_KEY] = merge_with_current(context)
73
+ Thread.current[THREAD_KEY] = join(parent: current, hash: context, id: :merged)
66
74
  yield
67
75
  ensure
68
76
  Thread.current[THREAD_KEY] = old_context
@@ -77,51 +85,92 @@ module Prefab
77
85
  end
78
86
  end
79
87
 
80
- def initialize(context = {})
88
+ def self.join(hash: {}, parent: nil, id: :not_provided)
89
+ context = new(hash)
90
+ context.update_parent(parent)
91
+ context.instance_variable_set(:@id, id)
92
+ context
93
+ end
94
+
95
+ def initialize(hash = {})
81
96
  @contexts = {}
97
+ @flattened = {}
82
98
  @seen_at = Time.now.utc.to_i
99
+ warned = false
100
+
101
+ if hash.is_a?(Hash)
102
+ hash.map do |name, values|
103
+ unless values.is_a?(Hash)
104
+ warn "[DEPRECATION] Prefab contexts should be a hash with a key of the context name and a value of a hash."
105
+ values = { name => values }
106
+ name = BLANK_CONTEXT_NAME
107
+ end
83
108
 
84
- if context.is_a?(NamedContext)
85
- @contexts[context.name] = context
86
- elsif context.is_a?(Hash)
87
- context.map do |name, values|
88
- if values.is_a?(Hash)
89
- @contexts[name.to_s] = NamedContext.new(name, values)
90
- else
91
- warn '[DEPRECATION] Prefab contexts should be a hash with a key of the context name and a value of a hash.'
92
-
93
- @contexts[BLANK_CONTEXT_NAME] ||= NamedContext.new(BLANK_CONTEXT_NAME, {})
94
- @contexts[BLANK_CONTEXT_NAME].merge!({ name => values })
109
+ @contexts[name.to_s] = NamedContext.new(name, values)
110
+ values.each do |key, value|
111
+ @flattened[name.to_s + '.' + key.to_s] = value
95
112
  end
96
113
  end
97
114
  else
98
- raise ArgumentError, 'must be a Hash or a NamedContext'
115
+ raise ArgumentError, 'must be a Hash'
99
116
  end
100
117
  end
101
118
 
119
+ def update_parent(parent)
120
+ @parent = parent
121
+ end
122
+
102
123
  def blank?
103
124
  contexts.empty?
104
125
  end
105
126
 
106
127
  def set(name, hash)
107
128
  @contexts[name.to_s] = NamedContext.new(name, hash)
129
+ hash.each do |key, value|
130
+ @flattened[name.to_s + '.' + key.to_s] = value
131
+ end
108
132
  end
109
133
 
110
- def get(property_key)
111
- name, key = property_key.split('.', 2)
112
-
113
- if key.nil?
114
- name = BLANK_CONTEXT_NAME
115
- key = property_key
134
+ def get(property_key, scope: nil)
135
+ if !property_key.include?(".")
136
+ property_key = BLANK_CONTEXT_NAME + '.' + property_key
116
137
  end
117
138
 
118
- contexts[name]&.get(key)
139
+ if @flattened.key?(property_key)
140
+ @flattened[property_key]
141
+ else
142
+ scope ||= property_key.split('.').first
143
+
144
+ if @contexts[scope]
145
+ # If the key is in the present scope, parent values should not be used.
146
+ # We can consider the parent value clobbered by the present scope.
147
+ nil
148
+ else
149
+ @parent&.get(property_key, scope: scope)
150
+ end
151
+ end
119
152
  end
120
153
 
121
154
  def to_h
122
155
  contexts.transform_values(&:to_h)
123
156
  end
124
157
 
158
+ def to_s
159
+ "#<Prefab::Context:#{object_id} id=#{@id} #{to_h}>"
160
+ end
161
+
162
+ # Visualize a tree of the context up through its parents
163
+ #
164
+ # example:
165
+ #
166
+ # | jit: {"user"=>{"name"=>"Frank"}}
167
+ # |-- block: {"clock"=>{"timezone"=>"PST"}}
168
+ # |---- default_context: {"prefab-api-key"=>{"user-id"=>123}}
169
+ # |------ global_context: {"cpu"=>{"count"=>4, "speed"=>"2.4GHz"}, "clock"=>{"timezone"=>"UTC"}}
170
+ def tree(depth = 0)
171
+ "|" + ("-" * depth) + " #{id}: #{(" " * (30 - id.to_s.length - depth ))}#{to_h}\n" + (@parent&.tree(depth + 2) || '')
172
+ end
173
+
125
174
  def clear
126
175
  @contexts = {}
127
176
  end
@@ -175,5 +224,9 @@ module Prefab
175
224
  super
176
225
  end
177
226
  end
227
+
228
+ def id
229
+ @id
230
+ end
178
231
  end
179
232
  end
@@ -3,7 +3,7 @@
3
3
  module Prefab
4
4
  # Records the result of evaluating a config's criteria and forensics for reporting
5
5
  class Evaluation
6
- attr_reader :value
6
+ attr_reader :value, :context
7
7
 
8
8
  def initialize(config:, value:, value_index:, config_row_index:, context:, resolver:)
9
9
  @config = config
@@ -32,6 +32,7 @@ module Prefab
32
32
 
33
33
  def report(evaluation_summary_aggregator)
34
34
  return if @config.config_type == :LOG_LEVEL
35
+
35
36
  evaluation_summary_aggregator&.record(
36
37
  config_key: @config.key,
37
38
  config_type: @config.config_type,
@@ -15,7 +15,7 @@ module Prefab
15
15
  attr_reader :collect_sync_interval
16
16
  attr_reader :use_local_cache
17
17
  attr_reader :datafile
18
- attr_reader :disable_action_controller_logging
18
+ attr_reader :global_context
19
19
  attr_accessor :is_fork
20
20
 
21
21
  module ON_INITIALIZATION_FAILURE
@@ -59,7 +59,7 @@ module Prefab
59
59
  allow_telemetry_in_local_mode: false,
60
60
  x_datafile: ENV['PREFAB_DATAFILE'],
61
61
  x_use_local_cache: false,
62
- disable_action_controller_logging: false
62
+ global_context: {}
63
63
  )
64
64
  @api_key = api_key
65
65
  @namespace = namespace
@@ -79,8 +79,8 @@ module Prefab
79
79
  @collect_max_evaluation_summaries = collect_max_evaluation_summaries
80
80
  @allow_telemetry_in_local_mode = allow_telemetry_in_local_mode
81
81
  @use_local_cache = x_use_local_cache
82
- @disable_action_controller_logging = disable_action_controller_logging
83
82
  @is_fork = false
83
+ @global_context = global_context
84
84
 
85
85
  # defaults that may be overridden by context_upload_mode
86
86
  @collect_shapes = false
@@ -94,6 +94,8 @@ module Prefab
94
94
  when :periodic_example
95
95
  @collect_example_contexts = true
96
96
  @collect_max_example_contexts = context_max_size
97
+ @collect_shapes = true
98
+ @collect_max_shapes = context_max_size
97
99
  when :shape_only
98
100
  @collect_shapes = true
99
101
  @collect_max_shapes = context_max_size
@@ -45,7 +45,6 @@ require 'prefab/context'
45
45
  require 'prefab/logger_client'
46
46
  require 'active_support/deprecation'
47
47
  require 'active_support'
48
- require 'action_controller/metal/strong_parameters'
49
48
  require 'prefab/client'
50
49
  require 'prefab/config_client_presenter'
51
50
  require 'prefab/config_client'
@@ -2,19 +2,18 @@
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.0.pre2 ruby lib
5
+ # stub: prefab-cloud-ruby 1.6.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "prefab-cloud-ruby".freeze
9
- s.version = "1.6.0.pre2"
9
+ s.version = "1.6.1"
10
10
 
11
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
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-02-22"
14
+ s.date = "2024-03-28"
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
- s.executables = ["console".freeze]
18
17
  s.extra_rdoc_files = [
19
18
  "CHANGELOG.md",
20
19
  "LICENSE.txt",
@@ -34,8 +33,10 @@ Gem::Specification.new do |s|
34
33
  "README.md",
35
34
  "Rakefile",
36
35
  "VERSION",
37
- "bin/console",
38
36
  "compile_protos.sh",
37
+ "dev/allocation_stats",
38
+ "dev/benchmark",
39
+ "dev/console",
39
40
  "lib/prefab-cloud-ruby.rb",
40
41
  "lib/prefab/client.rb",
41
42
  "lib/prefab/config_client.rb",
@@ -129,7 +130,6 @@ Gem::Specification.new do |s|
129
130
  s.add_runtime_dependency(%q<ld-eventsource>.freeze, [">= 0"])
130
131
  s.add_runtime_dependency(%q<uuid>.freeze, [">= 0"])
131
132
  s.add_runtime_dependency(%q<activesupport>.freeze, [">= 4"])
132
- s.add_runtime_dependency(%q<actionpack>.freeze, [">= 4"])
133
133
  s.add_runtime_dependency(%q<semantic_logger>.freeze, [">= 0"])
134
134
  s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0"])
135
135
  s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
@@ -144,7 +144,6 @@ Gem::Specification.new do |s|
144
144
  s.add_dependency(%q<ld-eventsource>.freeze, [">= 0"])
145
145
  s.add_dependency(%q<uuid>.freeze, [">= 0"])
146
146
  s.add_dependency(%q<activesupport>.freeze, [">= 4"])
147
- s.add_dependency(%q<actionpack>.freeze, [">= 4"])
148
147
  s.add_dependency(%q<semantic_logger>.freeze, [">= 0"])
149
148
  s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
150
149
  s.add_dependency(%q<bundler>.freeze, [">= 0"])
@@ -6,12 +6,24 @@ module CommonHelpers
6
6
  def setup
7
7
  $oldstderr, $stderr = $stderr, StringIO.new
8
8
 
9
- $logs ||= StringIO.new
10
- SemanticLogger.add_appender(io: $logs)
9
+ $logs = StringIO.new
10
+ SemanticLogger.add_appender(io: $logs, filter: Prefab.log_filter)
11
+ SemanticLogger.sync!
11
12
  Timecop.freeze('2023-08-09 15:18:12 -0400')
12
13
  end
13
14
 
14
15
  def teardown
16
+ if $logs && !$logs.string.empty?
17
+ log_lines = $logs.string.split("\n").reject do |line|
18
+ line.match(/Prefab::ConfigClient -- No success loading checkpoints/)
19
+ end
20
+
21
+ if log_lines.size > 0
22
+ $logs = nil
23
+ raise "Unexpected logs. Handle logs with assert_logged\n\n#{log_lines}"
24
+ end
25
+ end
26
+
15
27
  if $stderr != $oldstderr && !$stderr.string.empty?
16
28
  # we ignore 2.X because of the number of `instance variable @xyz not initialized` warnings
17
29
  if !RUBY_VERSION.start_with?('2.')
@@ -41,7 +53,6 @@ module CommonHelpers
41
53
  }.freeze
42
54
 
43
55
  def new_client(overrides = {})
44
-
45
56
  config = overrides.delete(:config)
46
57
  project_env_id = overrides.delete(:project_env_id)
47
58
 
@@ -140,12 +151,6 @@ module CommonHelpers
140
151
  Prefab::Context.new(properties)
141
152
  end
142
153
 
143
- def assert_only_expected_logs
144
- # assert_equal "WARN 2023-08-09 15:18:12 -0400: cloud.prefab.client.configclient No success loading checkpoints\n", $logs.string
145
- # mark nil to indicate we handled it
146
- $logs = nil
147
- end
148
-
149
154
  def assert_logged(expected)
150
155
  # we do a uniq here because logging can happen in a separate thread so the
151
156
  # number of times a log might happen could be slightly variable.
@@ -159,6 +164,8 @@ module CommonHelpers
159
164
 
160
165
  assert(matched, "expectation: #{expectation}, got: #{actuals}")
161
166
  end
167
+ # mark nil to indicate we handled it
168
+ $logs = nil
162
169
  end
163
170
 
164
171
  def assert_stderr(expected)
@@ -173,7 +180,7 @@ module CommonHelpers
173
180
  return
174
181
  end
175
182
 
176
- assert_equal expected, $stderr.string.split("\n")
183
+ assert_equal expected.uniq, $stderr.string.split("\n").uniq
177
184
 
178
185
  # restore since we've handled it
179
186
  $stderr = $oldstderr
@@ -408,6 +408,47 @@ class TestConfigResolver < Minitest::Test
408
408
  end
409
409
  end
410
410
 
411
+ def test_context_lookup
412
+ global_context = { cpu: { count: 4, speed: '2.4GHz' }, clock: { timezone: 'UTC' } }
413
+ default_context = { 'prefab-api-key' => { 'user-id' => 123 } }
414
+ local_context = { clock: { timezone: 'PST' }, user: { name: 'Ted', email: 'ted@example.com' } }
415
+ jit_context = { user: { name: 'Frank' } }
416
+
417
+ config = PrefabProto::Config.new( key: 'example', rows: [ PrefabProto::ConfigRow.new( values: [ PrefabProto::ConditionalValue.new( value: PrefabProto::ConfigValue.new(string: 'valueB2')) ]) ])
418
+
419
+ client = new_client(global_context: global_context, config: [config])
420
+
421
+ # we fake getting the default context from the API
422
+ Prefab::Context.default_context = default_context
423
+
424
+ resolver = client.resolver
425
+
426
+ client.with_context(local_context) do
427
+ context = resolver.get("example", jit_context).context
428
+
429
+ # This digs all the way to the global context
430
+ assert_equal 4, context.get('cpu.count')
431
+ assert_equal '2.4GHz', context.get('cpu.speed')
432
+
433
+ # This digs to the default context
434
+ assert_equal 123, context.get('prefab-api-key.user-id')
435
+
436
+ # This digs to the local context
437
+ assert_equal 'PST', context.get('clock.timezone')
438
+
439
+ # This uses the jit context
440
+ assert_equal 'Frank', context.get('user.name')
441
+
442
+ # This is nil in the jit context because `user` was clobbered
443
+ assert_nil context.get('user.email')
444
+
445
+ context = resolver.get("example").context
446
+
447
+ # But without the JIT clobbering, it is still set
448
+ assert_equal 'ted@example.com', context.get('user.email')
449
+ end
450
+ end
451
+
411
452
  private
412
453
 
413
454
  def resolver_for_namespace(namespace, loader, project_env_id: TEST_ENV_ID)
data/test/test_context.rb CHANGED
@@ -15,33 +15,17 @@ class TestContext < Minitest::Test
15
15
  assert_empty context.contexts
16
16
  end
17
17
 
18
- def test_initialize_with_named_context
19
- named_context = Prefab::Context::NamedContext.new('test', foo: 'bar')
20
- context = Prefab::Context.new(named_context)
21
- assert_equal 1, context.contexts.size
22
- assert_equal named_context, context.contexts['test']
23
- end
24
-
25
18
  def test_initialize_with_hash
26
19
  context = Prefab::Context.new(test: { foo: 'bar' })
27
20
  assert_equal 1, context.contexts.size
28
- assert_equal 'bar', context.contexts['test'].get('foo')
21
+ assert_equal 'bar', context.get("test.foo")
29
22
  end
30
23
 
31
24
  def test_initialize_with_multiple_hashes
32
25
  context = Prefab::Context.new(test: { foo: 'bar' }, other: { foo: 'baz' })
33
26
  assert_equal 2, context.contexts.size
34
- assert_equal 'bar', context.contexts['test'].get('foo')
35
- assert_equal 'baz', context.contexts['other'].get('foo')
36
- end
37
-
38
- def test_initialize_with_invalid_hash
39
- _, err = capture_io do
40
- Prefab::Context.new({ foo: 'bar', baz: 'qux' })
41
- end
42
-
43
- assert_match '[DEPRECATION] Prefab contexts should be a hash with a key of the context name and a value of a hash',
44
- err
27
+ assert_equal 'bar', context.get("test.foo")
28
+ assert_equal 'baz', context.get("other.foo")
45
29
  end
46
30
 
47
31
  def test_initialize_with_invalid_argument
@@ -56,33 +40,11 @@ class TestContext < Minitest::Test
56
40
 
57
41
  def test_current_set
58
42
  context = Prefab::Context.new(EXAMPLE_PROPERTIES)
59
- Prefab::Context.current = context
43
+ Prefab::Context.current = context.to_h
60
44
  assert_instance_of Prefab::Context, context
61
45
  assert_equal stringify(EXAMPLE_PROPERTIES), context.to_h
62
46
  end
63
47
 
64
- def test_merge_with_current
65
- context = Prefab::Context.new(EXAMPLE_PROPERTIES)
66
- Prefab::Context.current = context
67
- assert_equal stringify(EXAMPLE_PROPERTIES), context.to_h
68
-
69
- new_context = Prefab::Context.merge_with_current({ user: { key: 'brand-new', other: 'different' },
70
- address: { city: 'New York' } })
71
- assert_equal stringify({
72
- # Note that the user's `name` from the original
73
- # context is not included. This is because we don't _merge_ the new
74
- # properties if they collide with an existing context name. We _replace_
75
- # them.
76
- user: { key: 'brand-new', other: 'different' },
77
- team: EXAMPLE_PROPERTIES[:team],
78
- address: { city: 'New York' }
79
- }),
80
- new_context.to_h
81
-
82
- # the original/current context is unchanged
83
- assert_equal stringify(EXAMPLE_PROPERTIES), Prefab::Context.current.to_h
84
- end
85
-
86
48
  def test_with_context
87
49
  Prefab::Context.with_context(EXAMPLE_PROPERTIES) do
88
50
  context = Prefab::Context.current
@@ -105,9 +67,14 @@ class TestContext < Minitest::Test
105
67
 
106
68
  def test_with_context_merge_nesting
107
69
  Prefab::Context.with_context(EXAMPLE_PROPERTIES) do
108
- Prefab::Context.with_merged_context({ user: { key: 'abc', other: 'different' } }) do
70
+ Prefab::Context.with_merged_context({ user: { key: 'hij', other: 'different' } }) do
109
71
  context = Prefab::Context.current
110
- assert_equal({ 'user' => { 'key' => 'abc', 'other' => 'different' }, "team"=>{"key"=>"abc", "plan"=>"pro"} }, context.to_h)
72
+ assert_nil context.get('user.name')
73
+ assert_equal context.get('user.key'), 'hij'
74
+ assert_equal context.get('user.other'), 'different'
75
+
76
+ assert_equal context.get('team.key'), 'abc'
77
+ assert_equal context.get('team.plan'), 'pro'
111
78
  end
112
79
 
113
80
  context = Prefab::Context.current
@@ -187,6 +154,35 @@ class TestContext < Minitest::Test
187
154
  ), contexts.to_proto(namespace)
188
155
  end
189
156
 
157
+ def test_parent_lookup
158
+ global_context = { cpu: { count: 4, speed: '2.4GHz' }, clock: { timezone: 'UTC' } }
159
+ default_context = { 'prefab-api-key' => { 'user-id' => 123 } }
160
+ local_context = { clock: { timezone: 'PST' }, user: { name: 'Ted', email: 'ted@example.com' } }
161
+ jit_context = { user: { name: 'Frank' } }
162
+
163
+ Prefab::Context.global_context = global_context
164
+ Prefab::Context.default_context = default_context
165
+ Prefab::Context.current = local_context
166
+
167
+ context = Prefab::Context.join(parent: Prefab::Context.current, hash: jit_context, id: :jit)
168
+
169
+ # This digs all the way to the global context
170
+ assert_equal 4, context.get('cpu.count')
171
+ assert_equal '2.4GHz', context.get('cpu.speed')
172
+
173
+ # This digs to the default context
174
+ assert_equal 123, context.get('prefab-api-key.user-id')
175
+
176
+ # This digs to the local context
177
+ assert_equal 'PST', context.get('clock.timezone')
178
+
179
+ # This uses the jit context
180
+ assert_equal 'Frank', context.get('user.name')
181
+
182
+ # This is nil in the jit context because `user` was clobbered
183
+ assert_nil context.get('user.email')
184
+ end
185
+
190
186
  private
191
187
 
192
188
  def stringify(hash)
@@ -10,10 +10,7 @@ class TestExampleContextsAggregator < Minitest::Test
10
10
  aggregator = Prefab::ExampleContextsAggregator.new(client: MockBaseClient.new, max_contexts: 2,
11
11
  sync_interval: EFFECTIVELY_NEVER)
12
12
 
13
- context = Prefab::Context.new(
14
- user: { key: 'abc' },
15
- device: { key: 'def', mobile: true }
16
- )
13
+ context = Prefab::Context.new(user: { key: 'abc' }, device: { key: 'def', mobile: true })
17
14
 
18
15
  aggregator.record(context)
19
16
  assert_equal [context], aggregator.data
data/test/test_helper.rb CHANGED
@@ -11,7 +11,7 @@ Dir.glob(File.join(File.dirname(__FILE__), 'support', '**', '*.rb')).each do |fi
11
11
  require file
12
12
  end
13
13
 
14
- MiniTest::Test.class_eval do
14
+ Minitest::Test.class_eval do
15
15
  include CommonHelpers
16
16
  extend CommonHelpers
17
17
  end
@@ -50,6 +50,12 @@ class TestIntegration < Minitest::Test
50
50
  else
51
51
  raise "Unknown test type: #{it.test_type}"
52
52
  end
53
+
54
+ if test_case["name"].match(/doesn't raise on init timeout/)
55
+ assert_logged [
56
+ "Prefab::ConfigClient -- Couldn't Initialize In 0.01. Key any-key. Returning what we have"
57
+ ]
58
+ end
53
59
  end
54
60
  end
55
61
  end
@@ -8,7 +8,7 @@ class TestLogPathAggregator < Minitest::Test
8
8
  SLEEP_TIME = 0.01
9
9
 
10
10
  def test_push
11
- client = new_client
11
+ client = new_client(prefab_datasources: Prefab::Options::DATASOURCES::ALL,)
12
12
  aggregator = Prefab::LogPathAggregator.new(client: client, max_paths: 2, sync_interval: 1000)
13
13
 
14
14
  aggregator.push('test.test_log_path_aggregator.test_push.1', ::Logger::INFO)
@@ -19,16 +19,14 @@ class TestLogPathAggregator < Minitest::Test
19
19
  # we've reached the limit, so no more
20
20
  aggregator.push('test.test_log_path_aggregator.test_push.3', ::Logger::INFO)
21
21
  assert_equal 2, aggregator.data.size
22
-
23
- assert_only_expected_logs
24
22
  end
25
23
 
26
24
  def test_sync
27
25
  Timecop.freeze do
28
26
  client = new_client(namespace: 'this.is.a.namespace', allow_telemetry_in_local_mode: true)
29
27
 
30
- 2.times { client.log.should_log? 1, "test.test_log_path_aggregator.test_sync"}
31
- 3.times { client.log.should_log? 3, "test.test_log_path_aggregator.test_sync"}
28
+ 2.times { client.log.should_log? 1, "test.test_log_path_aggregator.test_sync" }
29
+ 3.times { client.log.should_log? 3, "test.test_log_path_aggregator.test_sync" }
32
30
 
33
31
  requests = wait_for_post_requests(client) do
34
32
  client.log_path_aggregator.send(:sync)
@@ -40,7 +38,9 @@ class TestLogPathAggregator < Minitest::Test
40
38
  assert_equal Prefab::TimeHelpers.now_in_ms, sent_logger.start_at
41
39
  assert_equal Prefab::TimeHelpers.now_in_ms, sent_logger.end_at
42
40
  assert_equal client.instance_hash, sent_logger.instance_hash
43
- assert_includes sent_logger.loggers, PrefabProto::Logger.new(logger_name: 'test.test_log_path_aggregator.test_sync', infos: 2, errors: 3)
41
+ assert_includes sent_logger.loggers,
42
+ PrefabProto::Logger.new(logger_name: 'test.test_log_path_aggregator.test_sync', infos: 2,
43
+ errors: 3)
44
44
  end
45
45
  end
46
46