prefab-cloud-ruby 0.13.1 → 0.13.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +39 -0
  3. data/.tool-versions +1 -0
  4. data/CODEOWNERS +1 -0
  5. data/Gemfile +11 -4
  6. data/Gemfile.lock +52 -32
  7. data/README.md +19 -1
  8. data/Rakefile +1 -0
  9. data/VERSION +1 -1
  10. data/compile_protos.sh +3 -0
  11. data/lib/prefab/auth_interceptor.rb +1 -0
  12. data/lib/prefab/cancellable_interceptor.rb +1 -0
  13. data/lib/prefab/client.rb +51 -38
  14. data/lib/prefab/config_client.rb +145 -73
  15. data/lib/prefab/config_helper.rb +29 -0
  16. data/lib/prefab/config_loader.rb +98 -13
  17. data/lib/prefab/config_resolver.rb +56 -49
  18. data/lib/prefab/error.rb +6 -0
  19. data/lib/prefab/errors/initialization_timeout_error.rb +13 -0
  20. data/lib/prefab/errors/invalid_api_key_error.rb +19 -0
  21. data/lib/prefab/errors/missing_default_error.rb +13 -0
  22. data/lib/prefab/feature_flag_client.rb +129 -11
  23. data/lib/prefab/internal_logger.rb +29 -0
  24. data/lib/prefab/logger_client.rb +10 -8
  25. data/lib/prefab/murmer3.rb +1 -0
  26. data/lib/prefab/noop_cache.rb +1 -0
  27. data/lib/prefab/noop_stats.rb +1 -0
  28. data/lib/prefab/options.rb +82 -0
  29. data/lib/prefab/ratelimit_client.rb +1 -0
  30. data/lib/prefab-cloud-ruby.rb +10 -0
  31. data/lib/prefab_pb.rb +214 -132
  32. data/lib/prefab_services_pb.rb +35 -6
  33. data/prefab-cloud-ruby.gemspec +29 -10
  34. data/run_test_harness_server.sh +8 -0
  35. data/test/.prefab.test.config.yaml +27 -1
  36. data/test/harness_server.rb +64 -0
  37. data/test/test_client.rb +98 -0
  38. data/test/test_config_client.rb +56 -0
  39. data/test/test_config_loader.rb +39 -25
  40. data/test/test_config_resolver.rb +134 -38
  41. data/test/test_feature_flag_client.rb +277 -35
  42. data/test/test_helper.rb +70 -4
  43. data/test/test_logger.rb +23 -29
  44. metadata +69 -14
  45. data/.ruby-version +0 -1
data/lib/prefab_pb.rb CHANGED
@@ -1,144 +1,226 @@
1
+ # frozen_string_literal: true
1
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
2
3
  # source: prefab.proto
3
4
 
4
5
  require 'google/protobuf'
5
6
 
6
7
  Google::Protobuf::DescriptorPool.generated_pool.build do
7
- add_message "prefab.ConfigServicePointer" do
8
- optional :account_id, :int64, 1
9
- optional :start_at_id, :int64, 2
10
- end
11
- add_message "prefab.ConfigDelta" do
12
- optional :id, :int64, 2
13
- optional :key, :string, 3
14
- optional :value, :message, 4, "prefab.ConfigValue"
15
- optional :created_by, :string, 5
16
- end
17
- add_message "prefab.ConfigValue" do
18
- oneof :type do
19
- optional :int, :int64, 1
20
- optional :string, :string, 2
21
- optional :bytes, :bytes, 3
22
- optional :double, :double, 4
23
- optional :bool, :bool, 5
24
- optional :feature_flag, :message, 6, "prefab.FeatureFlag"
25
- optional :limit_definition, :message, 7, "prefab.LimitDefinition"
8
+ add_file("prefab.proto", :syntax => :proto3) do
9
+ add_message "prefab.ConfigServicePointer" do
10
+ optional :project_id, :int64, 1
11
+ optional :start_at_id, :int64, 2
12
+ optional :project_env_id, :int64, 3
13
+ end
14
+ add_message "prefab.ConfigValue" do
15
+ oneof :type do
16
+ optional :int, :int64, 1
17
+ optional :string, :string, 2
18
+ optional :bytes, :bytes, 3
19
+ optional :double, :double, 4
20
+ optional :bool, :bool, 5
21
+ optional :feature_flag, :message, 6, "prefab.FeatureFlag"
22
+ optional :limit_definition, :message, 7, "prefab.LimitDefinition"
23
+ optional :segment, :message, 8, "prefab.Segment"
24
+ end
25
+ end
26
+ add_message "prefab.Configs" do
27
+ repeated :configs, :message, 1, "prefab.Config"
28
+ optional :config_service_pointer, :message, 2, "prefab.ConfigServicePointer"
29
+ end
30
+ add_message "prefab.Config" do
31
+ optional :id, :int64, 1
32
+ optional :project_id, :int64, 2
33
+ optional :key, :string, 3
34
+ optional :changed_by, :string, 4
35
+ repeated :rows, :message, 5, "prefab.ConfigRow"
36
+ repeated :variants, :message, 6, "prefab.FeatureFlagVariant"
37
+ end
38
+ add_message "prefab.ConfigRow" do
39
+ optional :project_env_id, :int64, 1
40
+ optional :namespace, :string, 2
41
+ optional :value, :message, 3, "prefab.ConfigValue"
42
+ end
43
+ add_message "prefab.LimitResponse" do
44
+ optional :passed, :bool, 1
45
+ optional :expires_at, :int64, 2
46
+ optional :enforced_group, :string, 3
47
+ optional :current_bucket, :int64, 4
48
+ optional :policy_group, :string, 5
49
+ optional :policy_name, :enum, 6, "prefab.LimitResponse.LimitPolicyNames"
50
+ optional :policy_limit, :int32, 7
51
+ optional :amount, :int64, 8
52
+ optional :limit_reset_at, :int64, 9
53
+ optional :safety_level, :enum, 10, "prefab.LimitDefinition.SafetyLevel"
54
+ end
55
+ add_enum "prefab.LimitResponse.LimitPolicyNames" do
56
+ value :NOT_SET, 0
57
+ value :SECONDLY_ROLLING, 1
58
+ value :MINUTELY_ROLLING, 3
59
+ value :HOURLY_ROLLING, 5
60
+ value :DAILY_ROLLING, 7
61
+ value :MONTHLY_ROLLING, 8
62
+ value :INFINITE, 9
63
+ value :YEARLY_ROLLING, 10
64
+ end
65
+ add_message "prefab.LimitRequest" do
66
+ optional :account_id, :int64, 1
67
+ optional :acquire_amount, :int32, 2
68
+ repeated :groups, :string, 3
69
+ optional :limit_combiner, :enum, 4, "prefab.LimitRequest.LimitCombiner"
70
+ optional :allow_partial_response, :bool, 5
71
+ optional :safety_level, :enum, 6, "prefab.LimitDefinition.SafetyLevel"
72
+ end
73
+ add_enum "prefab.LimitRequest.LimitCombiner" do
74
+ value :NOT_SET, 0
75
+ value :MINIMUM, 1
76
+ value :MAXIMUM, 2
77
+ end
78
+ add_message "prefab.FeatureFlagVariant" do
79
+ proto3_optional :int, :int64, 1
80
+ proto3_optional :string, :string, 2
81
+ proto3_optional :double, :double, 3
82
+ proto3_optional :bool, :bool, 4
83
+ optional :name, :string, 5
84
+ optional :description, :string, 6
85
+ end
86
+ add_message "prefab.Criteria" do
87
+ optional :property, :string, 1
88
+ optional :operator, :enum, 2, "prefab.Criteria.CriteriaOperator"
89
+ repeated :values, :string, 3
90
+ end
91
+ add_enum "prefab.Criteria.CriteriaOperator" do
92
+ value :NOT_SET, 0
93
+ value :LOOKUP_KEY_IN, 1
94
+ value :LOOKUP_KEY_NOT_IN, 2
95
+ value :IN_SEG, 3
96
+ value :NOT_IN_SEG, 4
97
+ value :ALWAYS_TRUE, 5
98
+ value :PROP_IS_ONE_OF, 6
99
+ value :PROP_IS_NOT_ONE_OF, 7
100
+ value :PROP_ENDS_WITH_ONE_OF, 8
101
+ value :PROP_DOES_NOT_END_WITH_ONE_OF, 9
102
+ end
103
+ add_message "prefab.Rule" do
104
+ optional :criteria, :message, 1, "prefab.Criteria"
105
+ repeated :variant_weights, :message, 2, "prefab.VariantWeight"
106
+ end
107
+ add_message "prefab.Segment" do
108
+ repeated :criterion, :message, 1, "prefab.Criteria"
109
+ end
110
+ add_message "prefab.VariantWeight" do
111
+ optional :weight, :int32, 1
112
+ optional :variant_idx, :int32, 2
113
+ end
114
+ add_message "prefab.FeatureFlag" do
115
+ optional :active, :bool, 1
116
+ optional :inactive_variant_idx, :int32, 2
117
+ repeated :rules, :message, 5, "prefab.Rule"
118
+ end
119
+ add_message "prefab.Identity" do
120
+ proto3_optional :lookup, :string, 1
121
+ map :attributes, :string, :string, 2
122
+ end
123
+ add_message "prefab.ClientConfigValue" do
124
+ proto3_optional :int, :int64, 1
125
+ proto3_optional :string, :string, 2
126
+ proto3_optional :double, :double, 3
127
+ proto3_optional :bool, :bool, 4
128
+ end
129
+ add_message "prefab.ConfigEvaluations" do
130
+ map :values, :string, :message, 1, "prefab.ClientConfigValue"
131
+ end
132
+ add_message "prefab.LimitDefinition" do
133
+ optional :policy_name, :enum, 2, "prefab.LimitResponse.LimitPolicyNames"
134
+ optional :limit, :int32, 3
135
+ optional :burst, :int32, 4
136
+ optional :account_id, :int64, 5
137
+ optional :last_modified, :int64, 6
138
+ optional :returnable, :bool, 7
139
+ optional :safety_level, :enum, 8, "prefab.LimitDefinition.SafetyLevel"
140
+ end
141
+ add_enum "prefab.LimitDefinition.SafetyLevel" do
142
+ value :NOT_SET, 0
143
+ value :L4_BEST_EFFORT, 4
144
+ value :L5_BOMBPROOF, 5
145
+ end
146
+ add_message "prefab.LimitDefinitions" do
147
+ repeated :definitions, :message, 1, "prefab.LimitDefinition"
148
+ end
149
+ add_message "prefab.BufferedRequest" do
150
+ optional :account_id, :int64, 1
151
+ optional :method, :string, 2
152
+ optional :uri, :string, 3
153
+ optional :body, :string, 4
154
+ repeated :limit_groups, :string, 5
155
+ optional :content_type, :string, 6
156
+ optional :fifo, :bool, 7
157
+ end
158
+ add_message "prefab.BatchRequest" do
159
+ optional :account_id, :int64, 1
160
+ optional :method, :string, 2
161
+ optional :uri, :string, 3
162
+ optional :body, :string, 4
163
+ repeated :limit_groups, :string, 5
164
+ optional :batch_template, :string, 6
165
+ optional :batch_separator, :string, 7
166
+ end
167
+ add_message "prefab.BasicResponse" do
168
+ optional :message, :string, 1
169
+ end
170
+ add_message "prefab.CreationResponse" do
171
+ optional :message, :string, 1
172
+ optional :new_id, :int64, 2
173
+ end
174
+ add_message "prefab.IdBlock" do
175
+ optional :project_id, :int64, 1
176
+ optional :project_env_id, :int64, 2
177
+ optional :sequence_name, :string, 3
178
+ optional :start, :int64, 4
179
+ optional :end, :int64, 5
180
+ end
181
+ add_message "prefab.IdBlockRequest" do
182
+ optional :project_id, :int64, 1
183
+ optional :project_env_id, :int64, 2
184
+ optional :sequence_name, :string, 3
185
+ optional :size, :int64, 4
186
+ end
187
+ add_enum "prefab.OnFailure" do
188
+ value :NOT_SET, 0
189
+ value :LOG_AND_PASS, 1
190
+ value :LOG_AND_FAIL, 2
191
+ value :THROW, 3
26
192
  end
27
- end
28
- add_message "prefab.ConfigDeltas" do
29
- repeated :deltas, :message, 1, "prefab.ConfigDelta"
30
- end
31
- add_message "prefab.UpsertRequest" do
32
- optional :account_id, :int64, 1
33
- optional :config_delta, :message, 2, "prefab.ConfigDelta"
34
- optional :changed_by, :string, 4
35
- end
36
- add_message "prefab.LimitResponse" do
37
- optional :passed, :bool, 1
38
- optional :expires_at, :int64, 2
39
- optional :enforced_group, :string, 3
40
- optional :current_bucket, :int64, 4
41
- optional :policy_group, :string, 5
42
- optional :policy_name, :enum, 6, "prefab.LimitResponse.LimitPolicyNames"
43
- optional :policy_limit, :int32, 7
44
- optional :amount, :int64, 8
45
- optional :limit_reset_at, :int64, 9
46
- optional :safety_level, :enum, 10, "prefab.LimitDefinition.SafetyLevel"
47
- end
48
- add_enum "prefab.LimitResponse.LimitPolicyNames" do
49
- value :NOT_SET, 0
50
- value :SECONDLY_ROLLING, 1
51
- value :MINUTELY_ROLLING, 3
52
- value :HOURLY_ROLLING, 5
53
- value :DAILY_ROLLING, 7
54
- value :MONTHLY_ROLLING, 8
55
- value :INFINITE, 9
56
- value :YEARLY_ROLLING, 10
57
- end
58
- add_message "prefab.LimitRequest" do
59
- optional :account_id, :int64, 1
60
- optional :acquire_amount, :int32, 2
61
- repeated :groups, :string, 3
62
- optional :limit_combiner, :enum, 4, "prefab.LimitRequest.LimitCombiner"
63
- optional :allow_partial_response, :bool, 5
64
- optional :safety_level, :enum, 6, "prefab.LimitDefinition.SafetyLevel"
65
- end
66
- add_enum "prefab.LimitRequest.LimitCombiner" do
67
- value :NOT_SET, 0
68
- value :MINIMUM, 1
69
- value :MAXIMUM, 2
70
- end
71
- add_message "prefab.FeatureFlag" do
72
- optional :pct, :double, 3
73
- repeated :whitelisted, :string, 4
74
- end
75
- add_message "prefab.LimitDefinition" do
76
- optional :policy_name, :enum, 2, "prefab.LimitResponse.LimitPolicyNames"
77
- optional :limit, :int32, 3
78
- optional :burst, :int32, 4
79
- optional :account_id, :int64, 5
80
- optional :last_modified, :int64, 6
81
- optional :returnable, :bool, 7
82
- optional :safety_level, :enum, 8, "prefab.LimitDefinition.SafetyLevel"
83
- end
84
- add_enum "prefab.LimitDefinition.SafetyLevel" do
85
- value :NOT_SET, 0
86
- value :L4_BEST_EFFORT, 4
87
- value :L5_BOMBPROOF, 5
88
- end
89
- add_message "prefab.LimitDefinitions" do
90
- repeated :definitions, :message, 1, "prefab.LimitDefinition"
91
- end
92
- add_message "prefab.FeatureFlags" do
93
- repeated :flags, :message, 1, "prefab.FeatureFlag"
94
- optional :cache_expiry, :int64, 2
95
- end
96
- add_message "prefab.BufferedRequest" do
97
- optional :account_id, :int64, 1
98
- optional :method, :string, 2
99
- optional :uri, :string, 3
100
- optional :body, :string, 4
101
- repeated :limit_groups, :string, 5
102
- optional :content_type, :string, 6
103
- optional :fifo, :bool, 7
104
- end
105
- add_message "prefab.BatchRequest" do
106
- optional :account_id, :int64, 1
107
- optional :method, :string, 2
108
- optional :uri, :string, 3
109
- optional :body, :string, 4
110
- repeated :limit_groups, :string, 5
111
- optional :batch_template, :string, 6
112
- optional :batch_separator, :string, 7
113
- end
114
- add_message "prefab.BasicResponse" do
115
- optional :message, :string, 1
116
- end
117
- add_enum "prefab.OnFailure" do
118
- value :NOT_SET, 0
119
- value :LOG_AND_PASS, 1
120
- value :LOG_AND_FAIL, 2
121
- value :THROW, 3
122
193
  end
123
194
  end
124
195
 
125
196
  module Prefab
126
- ConfigServicePointer = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigServicePointer").msgclass
127
- ConfigDelta = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigDelta").msgclass
128
- ConfigValue = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigValue").msgclass
129
- ConfigDeltas = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigDeltas").msgclass
130
- UpsertRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.UpsertRequest").msgclass
131
- LimitResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse").msgclass
132
- LimitResponse::LimitPolicyNames = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse.LimitPolicyNames").enummodule
133
- LimitRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest").msgclass
134
- LimitRequest::LimitCombiner = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest.LimitCombiner").enummodule
135
- FeatureFlag = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlag").msgclass
136
- LimitDefinition = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition").msgclass
137
- LimitDefinition::SafetyLevel = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition.SafetyLevel").enummodule
138
- LimitDefinitions = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinitions").msgclass
139
- FeatureFlags = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlags").msgclass
140
- BufferedRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BufferedRequest").msgclass
141
- BatchRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BatchRequest").msgclass
142
- BasicResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BasicResponse").msgclass
143
- OnFailure = Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.OnFailure").enummodule
197
+ ConfigServicePointer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigServicePointer").msgclass
198
+ ConfigValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigValue").msgclass
199
+ Configs = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Configs").msgclass
200
+ Config = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Config").msgclass
201
+ ConfigRow = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigRow").msgclass
202
+ LimitResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse").msgclass
203
+ LimitResponse::LimitPolicyNames = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse.LimitPolicyNames").enummodule
204
+ LimitRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest").msgclass
205
+ LimitRequest::LimitCombiner = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest.LimitCombiner").enummodule
206
+ FeatureFlagVariant = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlagVariant").msgclass
207
+ Criteria = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Criteria").msgclass
208
+ Criteria::CriteriaOperator = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Criteria.CriteriaOperator").enummodule
209
+ Rule = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Rule").msgclass
210
+ Segment = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Segment").msgclass
211
+ VariantWeight = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.VariantWeight").msgclass
212
+ FeatureFlag = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlag").msgclass
213
+ Identity = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Identity").msgclass
214
+ ClientConfigValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ClientConfigValue").msgclass
215
+ ConfigEvaluations = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigEvaluations").msgclass
216
+ LimitDefinition = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition").msgclass
217
+ LimitDefinition::SafetyLevel = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition.SafetyLevel").enummodule
218
+ LimitDefinitions = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinitions").msgclass
219
+ BufferedRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BufferedRequest").msgclass
220
+ BatchRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BatchRequest").msgclass
221
+ BasicResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BasicResponse").msgclass
222
+ CreationResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.CreationResponse").msgclass
223
+ IdBlock = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.IdBlock").msgclass
224
+ IdBlockRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.IdBlockRequest").msgclass
225
+ OnFailure = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.OnFailure").enummodule
144
226
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
2
3
  # Source: prefab.proto for package 'prefab'
3
4
 
@@ -8,13 +9,13 @@ module Prefab
8
9
  module RateLimitService
9
10
  class Service
10
11
 
11
- include GRPC::GenericService
12
+ include ::GRPC::GenericService
12
13
 
13
14
  self.marshal_class_method = :encode
14
15
  self.unmarshal_class_method = :decode
15
16
  self.service_name = 'prefab.RateLimitService'
16
17
 
17
- rpc :LimitCheck, LimitRequest, LimitResponse
18
+ rpc :LimitCheck, ::Prefab::LimitRequest, ::Prefab::LimitResponse
18
19
  end
19
20
 
20
21
  Stub = Service.rpc_stub_class
@@ -22,15 +23,43 @@ module Prefab
22
23
  module ConfigService
23
24
  class Service
24
25
 
25
- include GRPC::GenericService
26
+ include ::GRPC::GenericService
26
27
 
27
28
  self.marshal_class_method = :encode
28
29
  self.unmarshal_class_method = :decode
29
30
  self.service_name = 'prefab.ConfigService'
30
31
 
31
- rpc :GetConfig, ConfigServicePointer, stream(ConfigDeltas)
32
- rpc :GetAllConfig, ConfigServicePointer, ConfigDeltas
33
- rpc :Upsert, UpsertRequest, ConfigServicePointer
32
+ rpc :GetConfig, ::Prefab::ConfigServicePointer, stream(::Prefab::Configs)
33
+ rpc :GetAllConfig, ::Prefab::ConfigServicePointer, ::Prefab::Configs
34
+ rpc :Upsert, ::Prefab::Config, ::Prefab::CreationResponse
35
+ end
36
+
37
+ Stub = Service.rpc_stub_class
38
+ end
39
+ module IdService
40
+ class Service
41
+
42
+ include ::GRPC::GenericService
43
+
44
+ self.marshal_class_method = :encode
45
+ self.unmarshal_class_method = :decode
46
+ self.service_name = 'prefab.IdService'
47
+
48
+ rpc :GetBlock, ::Prefab::IdBlockRequest, ::Prefab::IdBlock
49
+ end
50
+
51
+ Stub = Service.rpc_stub_class
52
+ end
53
+ module ClientService
54
+ class Service
55
+
56
+ include ::GRPC::GenericService
57
+
58
+ self.marshal_class_method = :encode
59
+ self.unmarshal_class_method = :decode
60
+ self.service_name = 'prefab.ClientService'
61
+
62
+ rpc :GetAll, ::Prefab::Identity, ::Prefab::ConfigEvaluations
34
63
  end
35
64
 
36
65
  Stub = Service.rpc_stub_class
@@ -2,11 +2,11 @@
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 0.13.1 ruby lib
5
+ # stub: prefab-cloud-ruby 0.13.2 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "prefab-cloud-ruby".freeze
9
- s.version = "0.13.1"
9
+ s.version = "0.13.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]
@@ -20,7 +20,9 @@ Gem::Specification.new do |s|
20
20
  ]
21
21
  s.files = [
22
22
  ".envrc",
23
- ".ruby-version",
23
+ ".github/workflows/ruby.yml",
24
+ ".tool-versions",
25
+ "CODEOWNERS",
24
26
  "Gemfile",
25
27
  "Gemfile.lock",
26
28
  "LICENSE.txt",
@@ -33,18 +35,29 @@ Gem::Specification.new do |s|
33
35
  "lib/prefab/cancellable_interceptor.rb",
34
36
  "lib/prefab/client.rb",
35
37
  "lib/prefab/config_client.rb",
38
+ "lib/prefab/config_helper.rb",
36
39
  "lib/prefab/config_loader.rb",
37
40
  "lib/prefab/config_resolver.rb",
41
+ "lib/prefab/error.rb",
42
+ "lib/prefab/errors/initialization_timeout_error.rb",
43
+ "lib/prefab/errors/invalid_api_key_error.rb",
44
+ "lib/prefab/errors/missing_default_error.rb",
38
45
  "lib/prefab/feature_flag_client.rb",
46
+ "lib/prefab/internal_logger.rb",
39
47
  "lib/prefab/logger_client.rb",
40
48
  "lib/prefab/murmer3.rb",
41
49
  "lib/prefab/noop_cache.rb",
42
50
  "lib/prefab/noop_stats.rb",
51
+ "lib/prefab/options.rb",
43
52
  "lib/prefab/ratelimit_client.rb",
44
53
  "lib/prefab_pb.rb",
45
54
  "lib/prefab_services_pb.rb",
46
55
  "prefab-cloud-ruby.gemspec",
56
+ "run_test_harness_server.sh",
47
57
  "test/.prefab.test.config.yaml",
58
+ "test/harness_server.rb",
59
+ "test/test_client.rb",
60
+ "test/test_config_client.rb",
48
61
  "test/test_config_loader.rb",
49
62
  "test/test_config_resolver.rb",
50
63
  "test/test_feature_flag_client.rb",
@@ -53,7 +66,7 @@ Gem::Specification.new do |s|
53
66
  ]
54
67
  s.homepage = "http://github.com/prefab-cloud/prefab-cloud-ruby".freeze
55
68
  s.licenses = ["MIT".freeze]
56
- s.rubygems_version = "3.1.6".freeze
69
+ s.rubygems_version = "3.2.32".freeze
57
70
  s.summary = "Prefab Ruby Infrastructure".freeze
58
71
 
59
72
  if s.respond_to? :specification_version then
@@ -63,23 +76,29 @@ Gem::Specification.new do |s|
63
76
  if s.respond_to? :add_runtime_dependency then
64
77
  s.add_runtime_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
65
78
  s.add_runtime_dependency(%q<faraday>.freeze, [">= 0"])
79
+ s.add_runtime_dependency(%q<ld-eventsource>.freeze, [">= 0"])
66
80
  s.add_runtime_dependency(%q<grpc>.freeze, [">= 0"])
67
- s.add_development_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
68
- s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
81
+ s.add_runtime_dependency(%q<google-protobuf>.freeze, [">= 0"])
82
+ s.add_runtime_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
83
+ s.add_development_dependency(%q<grpc-tools>.freeze, [">= 0"])
69
84
  s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
70
- s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
85
+ s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
71
86
  s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
72
87
  s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
88
+ s.add_development_dependency(%q<thin>.freeze, [">= 0"])
73
89
  else
74
90
  s.add_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
75
91
  s.add_dependency(%q<faraday>.freeze, [">= 0"])
92
+ s.add_dependency(%q<ld-eventsource>.freeze, [">= 0"])
76
93
  s.add_dependency(%q<grpc>.freeze, [">= 0"])
77
- s.add_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
78
- s.add_dependency(%q<shoulda>.freeze, [">= 0"])
94
+ s.add_dependency(%q<google-protobuf>.freeze, [">= 0"])
95
+ s.add_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
96
+ s.add_dependency(%q<grpc-tools>.freeze, [">= 0"])
79
97
  s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
80
- s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
98
+ s.add_dependency(%q<bundler>.freeze, [">= 0"])
81
99
  s.add_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
82
100
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
101
+ s.add_dependency(%q<thin>.freeze, [">= 0"])
83
102
  end
84
103
  end
85
104
 
@@ -0,0 +1,8 @@
1
+ #! /usr/bin/env bash
2
+
3
+ PREFAB_CDN_URL="https://api-prefab-cloud.global.ssl.fastly.net" \
4
+ PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug \
5
+ PREFAB_CLOUD_HTTP=true \
6
+ PREFAB_API_KEY="1|local_development_api_key" \
7
+ PREFAB_GRPC_URL="localhost:50051" \
8
+ ruby -Ilib test/harness_server.rb
@@ -1,6 +1,32 @@
1
- sample: OneTwoThree
1
+ sample: default sample value
2
2
  sample_int: 123
3
3
  sample_double: 12.12
4
4
  sample_bool: true
5
+ false_value: false
6
+ zero_value: 0
5
7
  sample_to_override: Foo
6
8
  prefab.log_level: debug
9
+ unit_tests:
10
+ sample: test sample value
11
+ enabled_flag: true
12
+ disabled_flag: false
13
+ flag_with_a_value:
14
+ feature_flag: true
15
+ value: "all-features"
16
+ in_lookup_key:
17
+ feature_flag: true
18
+ value: true
19
+ criteria:
20
+ operator: LOOKUP_KEY_IN
21
+ values:
22
+ - abc123
23
+ - xyz987
24
+ just_my_domain:
25
+ feature_flag: true
26
+ value: new-version
27
+ criteria:
28
+ operator: PROP_IS_ONE_OF
29
+ property: domain
30
+ values: ["prefab.cloud", "example.com"]
31
+ ignored_env:
32
+ sample: ignored value
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ require 'prefab-cloud-ruby'
3
+ require 'rack'
4
+ require 'base64'
5
+ require 'json'
6
+
7
+ handler = Rack::Handler::Thin
8
+
9
+ #
10
+ # This is a very lightweight server that allows the compliance harness to excercise the prefab client
11
+ #
12
+ class RackApp
13
+ def call(env)
14
+ props = CGI::parse(env["QUERY_STRING"])
15
+ props = JSON.parse(Base64.decode64(props["props"][0]))
16
+
17
+ key = props["key"]
18
+ namespace = props["namespace"]
19
+ api_key = props["api_key"]
20
+ user_key = props["user_key"]
21
+ is_feature_flag = !props["feature_flag"].nil?
22
+ attributes = props["attributes"]
23
+ puts props
24
+
25
+ options = Prefab::Options.new(
26
+ api_key: api_key,
27
+ namespace: namespace,
28
+ initialization_timeout_sec: 1,
29
+ # We want to `return` rather than raise so we'll use the initial payload if we can't connect to the SSE server
30
+ on_init_failure: Prefab::Options::ON_INITIALIZATION_FAILURE::RETURN,
31
+ # Want to return `nil` rather than raise so we can verify empty values
32
+ on_no_default: Prefab::Options::ON_NO_DEFAULT::RETURN_NIL
33
+ )
34
+
35
+ client = Prefab::Client.new(options)
36
+
37
+ puts "Key #{key}"
38
+ puts "User #{user_key}"
39
+ puts "api_key #{api_key}"
40
+ puts "Namespace #{namespace}"
41
+ puts "Props! #{props}"
42
+ puts "is_feature_flag! #{is_feature_flag}"
43
+
44
+ puts client.config_client.to_s
45
+
46
+ if is_feature_flag
47
+ puts "EVALFF #{key} #{user_key}"
48
+ rtn = client.feature_flag_client.get(key, user_key, attributes).to_s
49
+ else
50
+ rtn = client.config_client.get(key).to_s
51
+ end
52
+
53
+ puts "return #{rtn}"
54
+
55
+ [200, { "Content-Type" => "text/plain" }, rtn]
56
+
57
+ rescue Exception => e
58
+ puts "ERROR #{e.message}"
59
+ puts e.backtrace
60
+ [500, { "Content-Type" => "text/plain" }, e.message]
61
+ end
62
+ end
63
+
64
+ handler.run RackApp.new