prefab-cloud-ruby 0.5.0 → 0.7.0

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.
@@ -1,6 +1,8 @@
1
1
  module Prefab
2
2
  class FeatureFlagClient
3
+ include Prefab::ConfigHelper
3
4
  MAX_32_FLOAT = 4294967294.0
5
+ DISTRIBUTION_SPACE = 1000
4
6
 
5
7
  def initialize(base_client)
6
8
  @base_client = base_client
@@ -14,38 +16,124 @@ module Prefab
14
16
  feature_is_on_for?(feature_name, nil)
15
17
  end
16
18
 
17
- def feature_is_on_for?(feature_name, lookup_key, attributes: [])
19
+ def feature_is_on_for?(feature_name, lookup_key, attributes: {})
18
20
  @base_client.stats.increment("prefab.featureflag.on", tags: ["feature:#{feature_name}"])
19
21
 
22
+ return is_on?(get(feature_name, lookup_key, attributes))
23
+ end
24
+
25
+ def get(feature_name, lookup_key, attributes)
20
26
  feature_obj = @base_client.config_client.get(feature_name)
21
- return is_on?(feature_name, lookup_key, attributes, feature_obj)
27
+ evaluate(feature_name, lookup_key, attributes, feature_obj)
28
+ end
29
+
30
+ def evaluate(feature_name, lookup_key, attributes, feature_obj)
31
+ value_of(get_variant(feature_name, lookup_key, attributes, feature_obj))
22
32
  end
23
33
 
24
34
  private
25
35
 
26
- def is_on?(feature_name, lookup_key, attributes, feature_obj)
27
- if feature_obj.nil?
36
+ def is_on?(variant)
37
+ if variant.nil?
28
38
  return false
29
39
  end
40
+ variant.bool
41
+ end
42
+
43
+ def get_variant(feature_name, lookup_key, attributes, feature_obj)
44
+ if !feature_obj.active
45
+ return get_variant_obj(feature_obj, feature_obj.inactive_variant_idx)
46
+ end
47
+
48
+ variant_distribution = feature_obj.default
49
+
50
+ # if user_targets.match
51
+ feature_obj.user_targets.each do |target|
52
+ if (target.identifiers.include? lookup_key)
53
+ return get_variant_obj(feature_obj, target.variant_idx)
54
+ end
55
+ end
30
56
 
31
- attributes << lookup_key if lookup_key
32
- if (attributes & feature_obj.whitelisted).size > 0
33
- return true
57
+ # if rules.match
58
+ feature_obj.rules.each do |rule|
59
+ if criteria_match?(rule, lookup_key, attributes)
60
+ variant_distribution = rule.distribution
61
+ end
34
62
  end
35
63
 
36
- if lookup_key
37
- return get_user_pct(feature_name, lookup_key) < feature_obj.pct
64
+ if variant_distribution.type == :variant_idx
65
+ variant_idx = variant_distribution.variant_idx
66
+ else
67
+ percent_through_distribution = rand()
68
+ if lookup_key
69
+ percent_through_distribution = get_user_pct(feature_name, lookup_key)
70
+ end
71
+ distribution_bucket = DISTRIBUTION_SPACE * percent_through_distribution
72
+
73
+ variant_idx = get_variant_idx_from_weights(variant_distribution.variant_weights.weights, distribution_bucket, feature_name)
38
74
  end
39
75
 
40
- return feature_obj.pct > rand()
76
+ return get_variant_obj(feature_obj, variant_idx)
77
+ end
78
+
79
+ def get_variant_obj(feature_obj, idx)
80
+ return feature_obj.variants[idx] if feature_obj.variants.length >= idx
81
+ nil
82
+ end
83
+
84
+ def get_variant_idx_from_weights(variant_weights, bucket, feature_name)
85
+ sum = 0
86
+ variant_weights.each do |variant_weight|
87
+ if bucket < sum + variant_weight.weight
88
+ return variant_weight.variant_idx
89
+ else
90
+ sum += variant_weight.weight
91
+ end
92
+ end
93
+ # variants didn't add up to 100%
94
+ @base_client.log.info("Variants of #{feature_name} did not add to 100%")
95
+ return variant_weights.last.variant
41
96
  end
42
97
 
43
98
  def get_user_pct(feature, lookup_key)
44
- to_hash = "#{@base_client.account_id}#{feature}#{lookup_key}"
99
+ to_hash = "#{@base_client.project_id}#{feature}#{lookup_key}"
45
100
  int_value = Murmur3.murmur3_32(to_hash)
46
101
  int_value / MAX_32_FLOAT
47
102
  end
48
103
 
104
+ def criteria_match?(rule, lookup_key, attributes)
105
+ if rule.criteria.operator == :IN
106
+ return rule.criteria.values.include?(lookup_key)
107
+ elsif rule.criteria.operator == :NOT_IN
108
+ return !rule.criteria.values.include?(lookup_key)
109
+ elsif rule.criteria.operator == :IN_SEG
110
+ return segment_matches(rule.criteria.values, lookup_key, attributes).any?
111
+ elsif rule.criteria.operator == :NOT_IN_SEG
112
+ return segment_matches(rule.criteria.values, lookup_key, attributes).none?
113
+ end
114
+ @base_client.log.info("Unknown Operator")
115
+ false
116
+ end
117
+
118
+ # evaluate each segment key and return whether each one matches
119
+ # there should be an associated segment available as a standard config obj
120
+ def segment_matches(segment_keys, lookup_key, attributes)
121
+ segment_keys.map do |segment_key|
122
+ segment = @base_client.config_client.get(segment_key)
123
+ if segment.nil?
124
+ @base_client.log.info("Missing Segment")
125
+ false
126
+ else
127
+ segment_match?(segment, lookup_key, attributes)
128
+ end
129
+ end
130
+ end
131
+
132
+ def segment_match?(segment, lookup_key, attributes)
133
+ includes = segment.includes.include?(lookup_key)
134
+ excludes = segment.excludes.include?(lookup_key)
135
+ includes && !excludes
136
+ end
49
137
  end
50
138
  end
51
139
 
@@ -4,6 +4,7 @@ require 'faraday'
4
4
  require 'openssl'
5
5
  require 'prefab_pb'
6
6
  require 'prefab_services_pb'
7
+ require 'prefab/config_helper'
7
8
  require 'prefab/config_loader'
8
9
  require 'prefab/config_resolver'
9
10
  require 'prefab/client'
data/lib/prefab_pb.rb CHANGED
@@ -4,141 +4,215 @@
4
4
  require 'google/protobuf'
5
5
 
6
6
  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"
7
+ add_file("prefab.proto", :syntax => :proto3) do
8
+ add_message "prefab.ConfigServicePointer" do
9
+ optional :project_id, :int64, 1
10
+ optional :start_at_id, :int64, 2
11
+ optional :env_key, :string, 3
12
+ end
13
+ add_message "prefab.ConfigValue" do
14
+ oneof :type do
15
+ optional :int, :int64, 1
16
+ optional :string, :string, 2
17
+ optional :bytes, :bytes, 3
18
+ optional :double, :double, 4
19
+ optional :bool, :bool, 5
20
+ optional :feature_flag, :message, 6, "prefab.FeatureFlag"
21
+ optional :limit_definition, :message, 7, "prefab.LimitDefinition"
22
+ optional :segment, :message, 8, "prefab.Segment"
23
+ end
24
+ end
25
+ add_message "prefab.NamespaceValue" do
26
+ optional :namespace, :string, 1
27
+ optional :config_value, :message, 2, "prefab.ConfigValue"
28
+ end
29
+ add_message "prefab.EnvironmentValues" do
30
+ optional :environment, :string, 1
31
+ repeated :namespace_values, :message, 2, "prefab.NamespaceValue"
32
+ optional :default, :message, 3, "prefab.ConfigValue"
33
+ end
34
+ add_message "prefab.ConfigDelta" do
35
+ optional :id, :int64, 1
36
+ optional :key, :string, 2
37
+ optional :default, :message, 3, "prefab.ConfigValue"
38
+ repeated :envs, :message, 4, "prefab.EnvironmentValues"
39
+ end
40
+ add_message "prefab.ConfigDeltas" do
41
+ repeated :deltas, :message, 1, "prefab.ConfigDelta"
42
+ end
43
+ add_message "prefab.UpsertRequest" do
44
+ optional :project_id, :int64, 1
45
+ optional :config_delta, :message, 2, "prefab.ConfigDelta"
46
+ optional :changed_by, :string, 4
47
+ end
48
+ add_message "prefab.LimitResponse" do
49
+ optional :passed, :bool, 1
50
+ optional :expires_at, :int64, 2
51
+ optional :enforced_group, :string, 3
52
+ optional :current_bucket, :int64, 4
53
+ optional :policy_group, :string, 5
54
+ optional :policy_name, :enum, 6, "prefab.LimitResponse.LimitPolicyNames"
55
+ optional :policy_limit, :int32, 7
56
+ optional :amount, :int64, 8
57
+ optional :limit_reset_at, :int64, 9
58
+ optional :safety_level, :enum, 10, "prefab.LimitDefinition.SafetyLevel"
59
+ end
60
+ add_enum "prefab.LimitResponse.LimitPolicyNames" do
61
+ value :NOT_SET, 0
62
+ value :SECONDLY_ROLLING, 1
63
+ value :MINUTELY_ROLLING, 3
64
+ value :HOURLY_ROLLING, 5
65
+ value :DAILY_ROLLING, 7
66
+ value :MONTHLY_ROLLING, 8
67
+ value :INFINITE, 9
68
+ value :YEARLY_ROLLING, 10
69
+ end
70
+ add_message "prefab.LimitRequest" do
71
+ optional :account_id, :int64, 1
72
+ optional :acquire_amount, :int32, 2
73
+ repeated :groups, :string, 3
74
+ optional :limit_combiner, :enum, 4, "prefab.LimitRequest.LimitCombiner"
75
+ optional :allow_partial_response, :bool, 5
76
+ optional :safety_level, :enum, 6, "prefab.LimitDefinition.SafetyLevel"
77
+ end
78
+ add_enum "prefab.LimitRequest.LimitCombiner" do
79
+ value :NOT_SET, 0
80
+ value :MINIMUM, 1
81
+ value :MAXIMUM, 2
82
+ end
83
+ add_message "prefab.FeatureFlagVariant" do
84
+ optional :name, :string, 5
85
+ optional :description, :string, 6
86
+ oneof :type do
87
+ optional :int, :int64, 1
88
+ optional :string, :string, 2
89
+ optional :double, :double, 3
90
+ optional :bool, :bool, 4
91
+ end
92
+ end
93
+ add_message "prefab.Criteria" do
94
+ optional :property, :string, 1
95
+ optional :operator, :enum, 2, "prefab.Criteria.CriteriaOperator"
96
+ repeated :values, :string, 3
97
+ end
98
+ add_enum "prefab.Criteria.CriteriaOperator" do
99
+ value :NOT_SET, 0
100
+ value :IN, 1
101
+ value :NOT_IN, 2
102
+ value :EQ, 3
103
+ value :IN_SEG, 4
104
+ value :NOT_IN_SEG, 5
105
+ end
106
+ add_message "prefab.Rule" do
107
+ optional :criteria, :message, 1, "prefab.Criteria"
108
+ optional :distribution, :message, 2, "prefab.VariantDistribution"
109
+ end
110
+ add_message "prefab.Segment" do
111
+ optional :name, :string, 1
112
+ optional :description, :string, 2
113
+ repeated :includes, :string, 3
114
+ repeated :excludes, :string, 4
115
+ repeated :criterion, :message, 5, "prefab.Criteria"
116
+ end
117
+ add_message "prefab.UserTarget" do
118
+ optional :variant_idx, :int32, 1
119
+ repeated :identifiers, :string, 2
120
+ end
121
+ add_message "prefab.VariantWeight" do
122
+ optional :weight, :int32, 1
123
+ optional :variant_idx, :int32, 2
124
+ end
125
+ add_message "prefab.VariantWeights" do
126
+ repeated :weights, :message, 1, "prefab.VariantWeight"
127
+ end
128
+ add_message "prefab.VariantDistribution" do
129
+ oneof :type do
130
+ optional :variant_idx, :int32, 1
131
+ optional :variant_weights, :message, 2, "prefab.VariantWeights"
132
+ end
133
+ end
134
+ add_message "prefab.FeatureFlag" do
135
+ optional :active, :bool, 1
136
+ optional :inactive_variant_idx, :int32, 2
137
+ optional :default, :message, 3, "prefab.VariantDistribution"
138
+ repeated :user_targets, :message, 4, "prefab.UserTarget"
139
+ repeated :rules, :message, 5, "prefab.Rule"
140
+ repeated :variants, :message, 6, "prefab.FeatureFlagVariant"
141
+ end
142
+ add_message "prefab.LimitDefinition" do
143
+ optional :policy_name, :enum, 2, "prefab.LimitResponse.LimitPolicyNames"
144
+ optional :limit, :int32, 3
145
+ optional :burst, :int32, 4
146
+ optional :account_id, :int64, 5
147
+ optional :last_modified, :int64, 6
148
+ optional :returnable, :bool, 7
149
+ optional :safety_level, :enum, 8, "prefab.LimitDefinition.SafetyLevel"
150
+ end
151
+ add_enum "prefab.LimitDefinition.SafetyLevel" do
152
+ value :NOT_SET, 0
153
+ value :L4_BEST_EFFORT, 4
154
+ value :L5_BOMBPROOF, 5
155
+ end
156
+ add_message "prefab.LimitDefinitions" do
157
+ repeated :definitions, :message, 1, "prefab.LimitDefinition"
158
+ end
159
+ add_message "prefab.BufferedRequest" do
160
+ optional :account_id, :int64, 1
161
+ optional :method, :string, 2
162
+ optional :uri, :string, 3
163
+ optional :body, :string, 4
164
+ repeated :limit_groups, :string, 5
165
+ optional :content_type, :string, 6
166
+ optional :fifo, :bool, 7
167
+ end
168
+ add_message "prefab.BatchRequest" do
169
+ optional :account_id, :int64, 1
170
+ optional :method, :string, 2
171
+ optional :uri, :string, 3
172
+ optional :body, :string, 4
173
+ repeated :limit_groups, :string, 5
174
+ optional :batch_template, :string, 6
175
+ optional :batch_separator, :string, 7
176
+ end
177
+ add_message "prefab.BasicResponse" do
178
+ optional :message, :string, 1
179
+ end
180
+ add_enum "prefab.OnFailure" do
181
+ value :NOT_SET, 0
182
+ value :LOG_AND_PASS, 1
183
+ value :LOG_AND_FAIL, 2
184
+ value :THROW, 3
26
185
  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
186
  end
123
187
  end
124
188
 
125
189
  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
190
+ ConfigServicePointer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigServicePointer").msgclass
191
+ ConfigValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigValue").msgclass
192
+ NamespaceValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.NamespaceValue").msgclass
193
+ EnvironmentValues = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.EnvironmentValues").msgclass
194
+ ConfigDelta = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigDelta").msgclass
195
+ ConfigDeltas = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigDeltas").msgclass
196
+ UpsertRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.UpsertRequest").msgclass
197
+ LimitResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse").msgclass
198
+ LimitResponse::LimitPolicyNames = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse.LimitPolicyNames").enummodule
199
+ LimitRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest").msgclass
200
+ LimitRequest::LimitCombiner = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest.LimitCombiner").enummodule
201
+ FeatureFlagVariant = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlagVariant").msgclass
202
+ Criteria = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Criteria").msgclass
203
+ Criteria::CriteriaOperator = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Criteria.CriteriaOperator").enummodule
204
+ Rule = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Rule").msgclass
205
+ Segment = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Segment").msgclass
206
+ UserTarget = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.UserTarget").msgclass
207
+ VariantWeight = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.VariantWeight").msgclass
208
+ VariantWeights = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.VariantWeights").msgclass
209
+ VariantDistribution = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.VariantDistribution").msgclass
210
+ FeatureFlag = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlag").msgclass
211
+ LimitDefinition = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition").msgclass
212
+ LimitDefinition::SafetyLevel = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition.SafetyLevel").enummodule
213
+ LimitDefinitions = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinitions").msgclass
214
+ BufferedRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BufferedRequest").msgclass
215
+ BatchRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BatchRequest").msgclass
216
+ BasicResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BasicResponse").msgclass
217
+ OnFailure = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.OnFailure").enummodule
144
218
  end
@@ -8,13 +8,13 @@ module Prefab
8
8
  module RateLimitService
9
9
  class Service
10
10
 
11
- include GRPC::GenericService
11
+ include ::GRPC::GenericService
12
12
 
13
13
  self.marshal_class_method = :encode
14
14
  self.unmarshal_class_method = :decode
15
15
  self.service_name = 'prefab.RateLimitService'
16
16
 
17
- rpc :LimitCheck, LimitRequest, LimitResponse
17
+ rpc :LimitCheck, ::Prefab::LimitRequest, ::Prefab::LimitResponse
18
18
  end
19
19
 
20
20
  Stub = Service.rpc_stub_class
@@ -22,15 +22,15 @@ module Prefab
22
22
  module ConfigService
23
23
  class Service
24
24
 
25
- include GRPC::GenericService
25
+ include ::GRPC::GenericService
26
26
 
27
27
  self.marshal_class_method = :encode
28
28
  self.unmarshal_class_method = :decode
29
29
  self.service_name = 'prefab.ConfigService'
30
30
 
31
- rpc :GetConfig, ConfigServicePointer, stream(ConfigDeltas)
32
- rpc :GetAllConfig, ConfigServicePointer, ConfigDeltas
33
- rpc :Upsert, UpsertRequest, ConfigServicePointer
31
+ rpc :GetConfig, ::Prefab::ConfigServicePointer, stream(::Prefab::ConfigDeltas)
32
+ rpc :GetAllConfig, ::Prefab::ConfigServicePointer, ::Prefab::ConfigDeltas
33
+ rpc :Upsert, ::Prefab::UpsertRequest, ::Prefab::ConfigServicePointer
34
34
  end
35
35
 
36
36
  Stub = Service.rpc_stub_class
@@ -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 0.5.0 ruby lib
5
+ # stub: prefab-cloud-ruby 0.7.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "prefab-cloud-ruby".freeze
9
- s.version = "0.5.0"
9
+ s.version = "0.7.0"
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 = "2019-02-23"
14
+ s.date = "2022-02-24"
15
15
  s.description = "RateLimits & Config as a service".freeze
16
16
  s.email = "jdwyer@prefab.cloud".freeze
17
17
  s.extra_rdoc_files = [
@@ -20,7 +20,8 @@ Gem::Specification.new do |s|
20
20
  ]
21
21
  s.files = [
22
22
  ".envrc",
23
- ".ruby-version",
23
+ ".tool-versions",
24
+ "CODEOWNERS",
24
25
  "Gemfile",
25
26
  "Gemfile.lock",
26
27
  "LICENSE.txt",
@@ -33,6 +34,7 @@ Gem::Specification.new do |s|
33
34
  "lib/prefab/cancellable_interceptor.rb",
34
35
  "lib/prefab/client.rb",
35
36
  "lib/prefab/config_client.rb",
37
+ "lib/prefab/config_helper.rb",
36
38
  "lib/prefab/config_loader.rb",
37
39
  "lib/prefab/config_resolver.rb",
38
40
  "lib/prefab/feature_flag_client.rb",
@@ -44,7 +46,9 @@ Gem::Specification.new do |s|
44
46
  "lib/prefab_pb.rb",
45
47
  "lib/prefab_services_pb.rb",
46
48
  "prefab-cloud-ruby.gemspec",
49
+ "run_test_harness_server.sh",
47
50
  "test/.prefab.test.config.yaml",
51
+ "test/harness_server.rb",
48
52
  "test/test_config_loader.rb",
49
53
  "test/test_config_resolver.rb",
50
54
  "test/test_feature_flag_client.rb",
@@ -53,43 +57,39 @@ Gem::Specification.new do |s|
53
57
  ]
54
58
  s.homepage = "http://github.com/prefab-cloud/prefab-cloud-ruby".freeze
55
59
  s.licenses = ["MIT".freeze]
56
- s.rubygems_version = "2.6.14".freeze
60
+ s.rubygems_version = "3.2.32".freeze
57
61
  s.summary = "Prefab Ruby Infrastructure".freeze
58
62
 
59
63
  if s.respond_to? :specification_version then
60
64
  s.specification_version = 4
65
+ end
61
66
 
62
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
- s.add_runtime_dependency(%q<concurrent-ruby>.freeze, [">= 1.0.5", "~> 1.0"])
64
- s.add_runtime_dependency(%q<faraday>.freeze, [">= 0"])
65
- s.add_runtime_dependency(%q<grpc>.freeze, ["~> 1.17.1"])
66
- s.add_development_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
67
- s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
68
- s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
69
- s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
70
- s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
71
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
72
- else
73
- s.add_dependency(%q<concurrent-ruby>.freeze, [">= 1.0.5", "~> 1.0"])
74
- s.add_dependency(%q<faraday>.freeze, [">= 0"])
75
- s.add_dependency(%q<grpc>.freeze, ["~> 1.17.1"])
76
- s.add_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
77
- s.add_dependency(%q<shoulda>.freeze, [">= 0"])
78
- s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
79
- s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
80
- s.add_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
81
- s.add_dependency(%q<simplecov>.freeze, [">= 0"])
82
- end
67
+ if s.respond_to? :add_runtime_dependency then
68
+ s.add_runtime_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
69
+ s.add_runtime_dependency(%q<faraday>.freeze, [">= 0"])
70
+ s.add_runtime_dependency(%q<grpc>.freeze, [">= 0"])
71
+ s.add_runtime_dependency(%q<google-protobuf>.freeze, [">= 0"])
72
+ s.add_runtime_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
73
+ s.add_development_dependency(%q<grpc-tools>.freeze, [">= 0"])
74
+ s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
75
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
76
+ s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
77
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
78
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
79
+ s.add_development_dependency(%q<thin>.freeze, [">= 0"])
83
80
  else
84
- s.add_dependency(%q<concurrent-ruby>.freeze, [">= 1.0.5", "~> 1.0"])
81
+ s.add_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
85
82
  s.add_dependency(%q<faraday>.freeze, [">= 0"])
86
- s.add_dependency(%q<grpc>.freeze, ["~> 1.17.1"])
87
- s.add_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
83
+ s.add_dependency(%q<grpc>.freeze, [">= 0"])
84
+ s.add_dependency(%q<google-protobuf>.freeze, [">= 0"])
85
+ s.add_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
86
+ s.add_dependency(%q<grpc-tools>.freeze, [">= 0"])
88
87
  s.add_dependency(%q<shoulda>.freeze, [">= 0"])
89
88
  s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
90
- s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
89
+ s.add_dependency(%q<bundler>.freeze, [">= 0"])
91
90
  s.add_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
92
91
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
92
+ s.add_dependency(%q<thin>.freeze, [">= 0"])
93
93
  end
94
94
  end
95
95
 
@@ -0,0 +1,2 @@
1
+ PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug PREFAB_CLOUD_HTTP=true PREFAB_API_KEY="1|local_development_api_key" PREFAB_API_URL="localhost:50051" ruby -Ilib test/harness_server.rb
2
+ #GRPC_TRACE=all GRPC_VERBOSITY=DEBUG PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug PREFAB_CLOUD_HTTP=true PREFAB_API_KEY="1|local_development_api_key" PREFAB_API_URL="localhost:50051" ruby -Ilib test/harness_server.rb