prefab-cloud-ruby 0.5.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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