prefab-cloud-ruby 0.24.5 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/VERSION +1 -1
  4. data/compile_protos.sh +7 -0
  5. data/lib/prefab/client.rb +20 -46
  6. data/lib/prefab/config_client.rb +9 -12
  7. data/lib/prefab/config_resolver.rb +2 -1
  8. data/lib/prefab/config_value_unwrapper.rb +20 -9
  9. data/lib/prefab/context.rb +43 -7
  10. data/lib/prefab/context_shape_aggregator.rb +1 -1
  11. data/lib/prefab/criteria_evaluator.rb +24 -16
  12. data/lib/prefab/evaluation.rb +48 -0
  13. data/lib/prefab/evaluation_summary_aggregator.rb +85 -0
  14. data/lib/prefab/example_contexts_aggregator.rb +76 -0
  15. data/lib/prefab/exponential_backoff.rb +5 -0
  16. data/lib/prefab/feature_flag_client.rb +0 -2
  17. data/lib/prefab/log_path_aggregator.rb +1 -1
  18. data/lib/prefab/logger_client.rb +12 -13
  19. data/lib/prefab/options.rb +52 -43
  20. data/lib/prefab/periodic_sync.rb +30 -13
  21. data/lib/prefab/rate_limit_cache.rb +41 -0
  22. data/lib/prefab/resolved_config_presenter.rb +2 -4
  23. data/lib/prefab/weighted_value_resolver.rb +1 -1
  24. data/lib/prefab-cloud-ruby.rb +5 -5
  25. data/lib/prefab_pb.rb +11 -1
  26. data/prefab-cloud-ruby.gemspec +14 -9
  27. data/test/integration_test.rb +1 -3
  28. data/test/integration_test_helpers.rb +0 -1
  29. data/test/support/common_helpers.rb +174 -0
  30. data/test/support/mock_base_client.rb +44 -0
  31. data/test/support/mock_config_client.rb +19 -0
  32. data/test/support/mock_config_loader.rb +1 -0
  33. data/test/test_client.rb +354 -40
  34. data/test/test_config_client.rb +1 -0
  35. data/test/test_config_loader.rb +1 -0
  36. data/test/test_config_resolver.rb +25 -24
  37. data/test/test_config_value_unwrapper.rb +22 -32
  38. data/test/test_context.rb +1 -0
  39. data/test/test_context_shape_aggregator.rb +11 -1
  40. data/test/test_criteria_evaluator.rb +180 -133
  41. data/test/test_evaluation_summary_aggregator.rb +162 -0
  42. data/test/test_example_contexts_aggregator.rb +238 -0
  43. data/test/test_helper.rb +5 -131
  44. data/test/test_integration.rb +6 -4
  45. data/test/test_local_config_parser.rb +2 -2
  46. data/test/test_log_path_aggregator.rb +9 -1
  47. data/test/test_logger.rb +6 -5
  48. data/test/test_options.rb +33 -2
  49. data/test/test_rate_limit_cache.rb +44 -0
  50. data/test/test_weighted_value_resolver.rb +13 -7
  51. metadata +13 -8
  52. data/lib/prefab/evaluated_configs_aggregator.rb +0 -60
  53. data/lib/prefab/evaluated_keys_aggregator.rb +0 -41
  54. data/lib/prefab/noop_cache.rb +0 -15
  55. data/lib/prefab/noop_stats.rb +0 -8
  56. data/test/test_evaluated_configs_aggregator.rb +0 -254
  57. data/test/test_evaluated_keys_aggregator.rb +0 -54
@@ -8,77 +8,67 @@ class TestConfigValueUnwrapper < Minitest::Test
8
8
 
9
9
  def test_unwrapping_int
10
10
  config_value = PrefabProto::ConfigValue.new(int: 123)
11
- assert_equal 123, Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
11
+ assert_equal 123, unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
12
12
  end
13
13
 
14
14
  def test_unwrapping_string
15
15
  config_value = PrefabProto::ConfigValue.new(string: 'abc')
16
- assert_equal 'abc', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
16
+ assert_equal 'abc', unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
17
17
  end
18
18
 
19
19
  def test_unwrapping_double
20
20
  config_value = PrefabProto::ConfigValue.new(double: 1.23)
21
- assert_equal 1.23, Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
21
+ assert_equal 1.23, unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
22
22
  end
23
23
 
24
24
  def test_unwrapping_bool
25
25
  config_value = PrefabProto::ConfigValue.new(bool: true)
26
- assert_equal true, Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
26
+ assert_equal true, unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
27
27
 
28
28
  config_value = PrefabProto::ConfigValue.new(bool: false)
29
- assert_equal false, Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
29
+ assert_equal false, unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
30
30
  end
31
31
 
32
32
  def test_unwrapping_log_level
33
33
  config_value = PrefabProto::ConfigValue.new(log_level: :INFO)
34
- assert_equal :INFO, Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
34
+ assert_equal :INFO, unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
35
35
  end
36
36
 
37
37
  def test_unwrapping_string_list
38
38
  config_value = PrefabProto::ConfigValue.new(string_list: PrefabProto::StringList.new(values: %w[a b c]))
39
- assert_equal %w[a b c], Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
39
+ assert_equal %w[a b c], unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
40
40
  end
41
41
 
42
42
  def test_unwrapping_weighted_values
43
43
  # single value
44
44
  config_value = PrefabProto::ConfigValue.new(weighted_values: weighted_values([['abc', 1]]))
45
45
 
46
- assert_equal 'abc', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
46
+ assert_equal 'abc', unwrap(config_value, CONFIG_KEY, EMPTY_CONTEXT)
47
47
 
48
48
  # multiple values, evenly distributed
49
49
  config_value = PrefabProto::ConfigValue.new(weighted_values: weighted_values([['abc', 1], ['def', 1], ['ghi', 1]]))
50
- assert_equal 'def', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:000'))
51
- assert_equal 'ghi', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:456'))
52
- assert_equal 'abc', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:789'))
53
- assert_equal 'ghi', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:888'))
50
+ assert_equal 'def', unwrap(config_value, CONFIG_KEY, context_with_key('user:000'))
51
+ assert_equal 'ghi', unwrap(config_value, CONFIG_KEY, context_with_key('user:456'))
52
+ assert_equal 'abc', unwrap(config_value, CONFIG_KEY, context_with_key('user:789'))
53
+ assert_equal 'ghi', unwrap(config_value, CONFIG_KEY, context_with_key('user:888'))
54
54
 
55
55
  # multiple values, unevenly distributed
56
56
  config_value = PrefabProto::ConfigValue.new(weighted_values: weighted_values([['abc', 1], ['def', 99], ['ghi', 1]]))
57
- assert_equal 'def', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:123'))
58
- assert_equal 'def', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:456'))
59
- assert_equal 'def', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:789'))
60
- assert_equal 'def', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:012'))
61
- assert_equal 'ghi', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:428'))
62
- assert_equal 'abc', Prefab::ConfigValueUnwrapper.unwrap(config_value, CONFIG_KEY, context_with_key('user:548'))
57
+ assert_equal 'def', unwrap(config_value, CONFIG_KEY, context_with_key('user:123'))
58
+ assert_equal 'def', unwrap(config_value, CONFIG_KEY, context_with_key('user:456'))
59
+ assert_equal 'def', unwrap(config_value, CONFIG_KEY, context_with_key('user:789'))
60
+ assert_equal 'def', unwrap(config_value, CONFIG_KEY, context_with_key('user:012'))
61
+ assert_equal 'ghi', unwrap(config_value, CONFIG_KEY, context_with_key('user:428'))
62
+ assert_equal 'abc', unwrap(config_value, CONFIG_KEY, context_with_key('user:548'))
63
63
  end
64
64
 
65
65
  private
66
66
 
67
- def weighted_values(values_and_weights, hash_by_property_name: 'user.key')
68
- values = values_and_weights.map do |value, weight|
69
- weighted_value(value, weight)
70
- end
71
-
72
- PrefabProto::WeightedValues.new(weighted_values: values, hash_by_property_name: hash_by_property_name)
73
- end
74
-
75
- def weighted_value(string, weight)
76
- PrefabProto::WeightedValue.new(
77
- value: PrefabProto::ConfigValue.new(string: string), weight: weight
78
- )
79
- end
80
-
81
67
  def context_with_key(key)
82
68
  Prefab::Context.new(user: { key: key })
83
69
  end
70
+
71
+ def unwrap(config_value, config_key, context)
72
+ Prefab::ConfigValueUnwrapper.deepest_value(config_value, config_key, context).unwrap
73
+ end
84
74
  end
data/test/test_context.rb CHANGED
@@ -6,6 +6,7 @@ class TestContext < Minitest::Test
6
6
  EXAMPLE_PROPERTIES = { user: { key: 'some-user-key', name: 'Ted' }, team: { key: 'abc', plan: 'pro' } }.freeze
7
7
 
8
8
  def setup
9
+ super
9
10
  Prefab::Context.current = nil
10
11
  end
11
12
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'test_helper'
4
+ require 'timecop'
4
5
 
5
6
  class TestContextShapeAggregator < Minitest::Test
6
7
  DOB = Date.new
@@ -49,6 +50,8 @@ class TestContextShapeAggregator < Minitest::Test
49
50
 
50
51
  assert_equal [['user', 'name', 2], ['user', 'email', 2], ['user', 'age', 4], ['subscription', 'plan', 2], ['subscription', 'free', 5], ['user', 'dob', 2], ['device', 'name', 2], ['device', 'os', 2], ['device', 'version', 1]],
51
52
  aggregator.data.to_a
53
+
54
+ assert_only_expected_logs
52
55
  end
53
56
 
54
57
  def test_prepare_data
@@ -82,6 +85,7 @@ class TestContextShapeAggregator < Minitest::Test
82
85
  }
83
86
 
84
87
  assert_equal [], aggregator.data.to_a
88
+ assert_only_expected_logs
85
89
  end
86
90
 
87
91
  def test_sync
@@ -117,6 +121,12 @@ class TestContextShapeAggregator < Minitest::Test
117
121
  ])
118
122
  ]
119
123
  ], requests
124
+
125
+
126
+ assert_logged [
127
+ "WARN 2023-08-09 15:18:12 -0400: cloud.prefab.client No success loading checkpoints",
128
+ "WARN 2023-08-09 15:18:12 -0400: cloud.prefab.client Couldn't Initialize In 0. Key some.key. Returning what we have"
129
+ ]
120
130
  end
121
131
 
122
132
  private
@@ -127,7 +137,7 @@ class TestContextShapeAggregator < Minitest::Test
127
137
  initialization_timeout_sec: 0,
128
138
  on_init_failure: Prefab::Options::ON_INITIALIZATION_FAILURE::RETURN,
129
139
  api_key: '123-development-yourapikey-SDK',
130
- shape_sync_interval: 1000 # we'll trigger sync manually in our test
140
+ context_upload_mode: :shape_only
131
141
  }.merge(overrides))
132
142
  end
133
143