prefab-cloud-ruby 0.24.2 → 0.24.4

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.rubocop.yml +13 -0
  4. data/CHANGELOG.md +76 -0
  5. data/Gemfile.lock +4 -4
  6. data/VERSION +1 -1
  7. data/bin/console +21 -0
  8. data/compile_protos.sh +6 -0
  9. data/lib/prefab/client.rb +25 -4
  10. data/lib/prefab/config_client.rb +16 -6
  11. data/lib/prefab/config_loader.rb +1 -1
  12. data/lib/prefab/config_resolver.rb +2 -4
  13. data/lib/prefab/config_value_wrapper.rb +18 -0
  14. data/lib/prefab/context.rb +22 -2
  15. data/lib/prefab/context_shape.rb +20 -0
  16. data/lib/prefab/context_shape_aggregator.rb +63 -0
  17. data/lib/prefab/criteria_evaluator.rb +61 -41
  18. data/lib/prefab/evaluated_configs_aggregator.rb +60 -0
  19. data/lib/prefab/evaluated_keys_aggregator.rb +41 -0
  20. data/lib/prefab/local_config_parser.rb +13 -13
  21. data/lib/prefab/log_path_aggregator.rb +64 -0
  22. data/lib/prefab/logger_client.rb +29 -16
  23. data/lib/prefab/options.rb +46 -1
  24. data/lib/prefab/periodic_sync.rb +51 -0
  25. data/lib/prefab/time_helpers.rb +7 -0
  26. data/lib/prefab-cloud-ruby.rb +8 -1
  27. data/lib/prefab_pb.rb +33 -220
  28. data/prefab-cloud-ruby.gemspec +21 -5
  29. data/test/test_config_loader.rb +15 -15
  30. data/test/test_config_resolver.rb +102 -102
  31. data/test/test_config_value_unwrapper.rb +13 -13
  32. data/test/test_context.rb +42 -0
  33. data/test/test_context_shape.rb +51 -0
  34. data/test/test_context_shape_aggregator.rb +137 -0
  35. data/test/test_criteria_evaluator.rb +253 -150
  36. data/test/test_evaluated_configs_aggregator.rb +254 -0
  37. data/test/test_evaluated_keys_aggregator.rb +54 -0
  38. data/test/test_helper.rb +34 -2
  39. data/test/test_log_path_aggregator.rb +57 -0
  40. data/test/test_logger.rb +61 -76
  41. data/test/test_weighted_value_resolver.rb +2 -2
  42. metadata +21 -5
  43. data/lib/prefab/log_path_collector.rb +0 -102
  44. data/test/test_log_path_collector.rb +0 -58
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class TestContextShapeAggregator < Minitest::Test
6
+ DOB = Date.new
7
+
8
+ CONTEXT_1 = Prefab::Context.new({
9
+ 'user' => {
10
+ 'name' => 'user-name',
11
+ 'email' => 'user.email',
12
+ 'age' => 42.5
13
+ },
14
+ 'subscription' => {
15
+ 'plan' => 'advanced',
16
+ 'free' => false
17
+ }
18
+ }).freeze
19
+
20
+ CONTEXT_2 = Prefab::Context.new({
21
+ 'user' => {
22
+ 'name' => 'other-user-name',
23
+ 'dob' => DOB
24
+ },
25
+ 'device' => {
26
+ 'name' => 'device-name',
27
+ 'os' => 'os-name',
28
+ 'version' => 3
29
+ }
30
+ }).freeze
31
+
32
+ CONTEXT_3 = Prefab::Context.new({
33
+ 'subscription' => {
34
+ 'plan' => 'pro',
35
+ 'trial' => true
36
+ }
37
+ }).freeze
38
+
39
+ def test_push
40
+ aggregator = new_aggregator(max_shapes: 9)
41
+
42
+ aggregator.push(CONTEXT_1)
43
+ aggregator.push(CONTEXT_2)
44
+ assert_equal 9, aggregator.data.size
45
+
46
+ # we've reached the limit so no more
47
+ aggregator.push(CONTEXT_3)
48
+ assert_equal 9, aggregator.data.size
49
+
50
+ 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
+ aggregator.data.to_a
52
+ end
53
+
54
+ def test_prepare_data
55
+ aggregator = new_aggregator
56
+
57
+ aggregator.push(CONTEXT_1)
58
+ aggregator.push(CONTEXT_2)
59
+ aggregator.push(CONTEXT_3)
60
+
61
+ data = aggregator.prepare_data
62
+
63
+ assert_equal %w[user subscription device], data.keys
64
+
65
+ assert_equal data['user'], {
66
+ 'name' => 2,
67
+ 'email' => 2,
68
+ 'dob' => 2,
69
+ 'age' => 4
70
+ }
71
+
72
+ assert_equal data['subscription'], {
73
+ 'plan' => 2,
74
+ 'trial' => 5,
75
+ 'free' => 5
76
+ }
77
+
78
+ assert_equal data['device'], {
79
+ 'name' => 2,
80
+ 'os' => 2,
81
+ 'version' => 1
82
+ }
83
+
84
+ assert_equal [], aggregator.data.to_a
85
+ end
86
+
87
+ def test_sync
88
+ client = new_client
89
+
90
+ client.get 'some.key', 'default', CONTEXT_1
91
+ client.get 'some.key', 'default', CONTEXT_2
92
+ client.get 'some.key', 'default', CONTEXT_3
93
+
94
+ requests = wait_for_post_requests(client) do
95
+ client.context_shape_aggregator.send(:sync)
96
+ end
97
+
98
+ assert_equal [
99
+ [
100
+ '/api/v1/context-shapes',
101
+ PrefabProto::ContextShapes.new(shapes: [
102
+ PrefabProto::ContextShape.new(
103
+ name: 'user', field_types: {
104
+ 'age' => 4, 'dob' => 2, 'email' => 2, 'name' => 2
105
+ }
106
+ ),
107
+ PrefabProto::ContextShape.new(
108
+ name: 'subscription', field_types: {
109
+ 'plan' => 2, 'free' => 5, 'trial' => 5
110
+ }
111
+ ),
112
+ PrefabProto::ContextShape.new(
113
+ name: 'device', field_types: {
114
+ 'version' => 1, 'os' => 2, 'name' => 2
115
+ }
116
+ )
117
+ ])
118
+ ]
119
+ ], requests
120
+ end
121
+
122
+ private
123
+
124
+ def new_client(overrides = {})
125
+ super(**{
126
+ prefab_datasources: Prefab::Options::DATASOURCES::ALL,
127
+ initialization_timeout_sec: 0,
128
+ on_init_failure: Prefab::Options::ON_INITIALIZATION_FAILURE::RETURN,
129
+ api_key: '123-development-yourapikey-SDK',
130
+ shape_sync_interval: 1000 # we'll trigger sync manually in our test
131
+ }.merge(overrides))
132
+ end
133
+
134
+ def new_aggregator(max_shapes: 1000)
135
+ Prefab::ContextShapeAggregator.new(client: new_client, sync_interval: 1000, max_shapes: max_shapes)
136
+ end
137
+ end