prefab-cloud-ruby 0.6.0 → 0.9.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,125 @@ 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
+ variants = @base_client.config_client.get_config_obj(feature_name).variants
28
+ evaluate(feature_name, lookup_key, attributes, feature_obj, variants)
29
+ end
30
+
31
+ def evaluate(feature_name, lookup_key, attributes, feature_obj, variants)
32
+ value_of(get_variant(feature_name, lookup_key, attributes, feature_obj, variants))
22
33
  end
23
34
 
24
35
  private
25
36
 
26
- def is_on?(feature_name, lookup_key, attributes, feature_obj)
27
- if feature_obj.nil?
37
+ def is_on?(variant)
38
+ if variant.nil?
28
39
  return false
29
40
  end
41
+ variant.bool
42
+ end
43
+
44
+ def get_variant(feature_name, lookup_key, attributes, feature_obj, variants)
45
+ if !feature_obj.active
46
+ return get_variant_obj(variants, feature_obj.inactive_variant_idx)
47
+ end
48
+
49
+ variant_distribution = feature_obj.default
50
+
51
+ # if user_targets.match
52
+ feature_obj.user_targets.each do |target|
53
+ if (target.identifiers.include? lookup_key)
54
+ return get_variant_obj(variants, target.variant_idx)
55
+ end
56
+ end
30
57
 
31
- attributes << lookup_key if lookup_key
32
- if (attributes & feature_obj.whitelisted).size > 0
33
- return true
58
+ # if rules.match
59
+ feature_obj.rules.each do |rule|
60
+ if criteria_match?(rule, lookup_key, attributes)
61
+ variant_distribution = rule.distribution
62
+ end
34
63
  end
35
64
 
36
- if lookup_key
37
- return get_user_pct(feature_name, lookup_key) < feature_obj.pct
65
+ if variant_distribution.type == :variant_idx
66
+ variant_idx = variant_distribution.variant_idx
67
+ else
68
+ percent_through_distribution = rand()
69
+ if lookup_key
70
+ percent_through_distribution = get_user_pct(feature_name, lookup_key)
71
+ end
72
+ distribution_bucket = DISTRIBUTION_SPACE * percent_through_distribution
73
+
74
+ variant_idx = get_variant_idx_from_weights(variant_distribution.variant_weights.weights, distribution_bucket, feature_name)
38
75
  end
39
76
 
40
- return feature_obj.pct > rand()
77
+ return get_variant_obj(variants, variant_idx)
78
+ end
79
+
80
+ def get_variant_obj(variants, idx)
81
+ return variants[idx] if variants.length >= idx
82
+ nil
83
+ end
84
+
85
+ def get_variant_idx_from_weights(variant_weights, bucket, feature_name)
86
+ sum = 0
87
+ variant_weights.each do |variant_weight|
88
+ if bucket < sum + variant_weight.weight
89
+ return variant_weight.variant_idx
90
+ else
91
+ sum += variant_weight.weight
92
+ end
93
+ end
94
+ # variants didn't add up to 100%
95
+ @base_client.log.info("Variants of #{feature_name} did not add to 100%")
96
+ return variant_weights.last.variant
41
97
  end
42
98
 
43
99
  def get_user_pct(feature, lookup_key)
44
- to_hash = "#{@base_client.account_id}#{feature}#{lookup_key}"
100
+ to_hash = "#{@base_client.project_id}#{feature}#{lookup_key}"
45
101
  int_value = Murmur3.murmur3_32(to_hash)
46
102
  int_value / MAX_32_FLOAT
47
103
  end
48
104
 
105
+ def criteria_match?(rule, lookup_key, attributes)
106
+ if rule.criteria.operator == :IN
107
+ return rule.criteria.values.include?(lookup_key)
108
+ elsif rule.criteria.operator == :NOT_IN
109
+ return !rule.criteria.values.include?(lookup_key)
110
+ elsif rule.criteria.operator == :IN_SEG
111
+ return segment_matches(rule.criteria.values, lookup_key, attributes).any?
112
+ elsif rule.criteria.operator == :NOT_IN_SEG
113
+ return segment_matches(rule.criteria.values, lookup_key, attributes).none?
114
+ end
115
+ @base_client.log.info("Unknown Operator")
116
+ false
117
+ end
118
+
119
+ # evaluate each segment key and return whether each one matches
120
+ # there should be an associated segment available as a standard config obj
121
+ def segment_matches(segment_keys, lookup_key, attributes)
122
+ segment_keys.map do |segment_key|
123
+ segment = @base_client.config_client.get(segment_key)
124
+ if segment.nil?
125
+ @base_client.log.info("Missing Segment")
126
+ false
127
+ else
128
+ segment_match?(segment, lookup_key, attributes)
129
+ end
130
+ end
131
+ end
132
+
133
+ def segment_match?(segment, lookup_key, attributes)
134
+ includes = segment.includes.include?(lookup_key)
135
+ excludes = segment.excludes.include?(lookup_key)
136
+ includes && !excludes
137
+ end
49
138
  end
50
139
  end
51
140
 
@@ -2,8 +2,11 @@ require "concurrent/atomics"
2
2
  require 'concurrent'
3
3
  require 'faraday'
4
4
  require 'openssl'
5
+ require 'openssl'
6
+ require 'ld-eventsource'
5
7
  require 'prefab_pb'
6
8
  require 'prefab_services_pb'
9
+ require 'prefab/config_helper'
7
10
  require 'prefab/config_loader'
8
11
  require 'prefab/config_resolver'
9
12
  require 'prefab/client'
data/lib/prefab_pb.rb CHANGED
@@ -4,141 +4,210 @@
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.Configs" do
26
+ repeated :configs, :message, 1, "prefab.Config"
27
+ end
28
+ add_message "prefab.Config" do
29
+ optional :id, :int64, 1
30
+ optional :project_id, :int64, 2
31
+ optional :key, :string, 3
32
+ optional :changed_by, :string, 4
33
+ repeated :rows, :message, 5, "prefab.ConfigRow"
34
+ repeated :variants, :message, 6, "prefab.FeatureFlagVariant"
35
+ end
36
+ add_message "prefab.ConfigRow" do
37
+ optional :env_key, :string, 1
38
+ optional :namespace, :string, 2
39
+ optional :value, :message, 3, "prefab.ConfigValue"
40
+ end
41
+ add_message "prefab.LimitResponse" do
42
+ optional :passed, :bool, 1
43
+ optional :expires_at, :int64, 2
44
+ optional :enforced_group, :string, 3
45
+ optional :current_bucket, :int64, 4
46
+ optional :policy_group, :string, 5
47
+ optional :policy_name, :enum, 6, "prefab.LimitResponse.LimitPolicyNames"
48
+ optional :policy_limit, :int32, 7
49
+ optional :amount, :int64, 8
50
+ optional :limit_reset_at, :int64, 9
51
+ optional :safety_level, :enum, 10, "prefab.LimitDefinition.SafetyLevel"
52
+ end
53
+ add_enum "prefab.LimitResponse.LimitPolicyNames" do
54
+ value :NOT_SET, 0
55
+ value :SECONDLY_ROLLING, 1
56
+ value :MINUTELY_ROLLING, 3
57
+ value :HOURLY_ROLLING, 5
58
+ value :DAILY_ROLLING, 7
59
+ value :MONTHLY_ROLLING, 8
60
+ value :INFINITE, 9
61
+ value :YEARLY_ROLLING, 10
62
+ end
63
+ add_message "prefab.LimitRequest" do
64
+ optional :account_id, :int64, 1
65
+ optional :acquire_amount, :int32, 2
66
+ repeated :groups, :string, 3
67
+ optional :limit_combiner, :enum, 4, "prefab.LimitRequest.LimitCombiner"
68
+ optional :allow_partial_response, :bool, 5
69
+ optional :safety_level, :enum, 6, "prefab.LimitDefinition.SafetyLevel"
70
+ end
71
+ add_enum "prefab.LimitRequest.LimitCombiner" do
72
+ value :NOT_SET, 0
73
+ value :MINIMUM, 1
74
+ value :MAXIMUM, 2
75
+ end
76
+ add_message "prefab.FeatureFlagVariant" do
77
+ optional :name, :string, 5
78
+ optional :description, :string, 6
79
+ oneof :type do
80
+ optional :int, :int64, 1
81
+ optional :string, :string, 2
82
+ optional :double, :double, 3
83
+ optional :bool, :bool, 4
84
+ end
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 :IN, 1
94
+ value :NOT_IN, 2
95
+ value :EQ, 3
96
+ value :IN_SEG, 4
97
+ value :NOT_IN_SEG, 5
98
+ end
99
+ add_message "prefab.Rule" do
100
+ optional :criteria, :message, 1, "prefab.Criteria"
101
+ optional :distribution, :message, 2, "prefab.VariantDistribution"
102
+ end
103
+ add_message "prefab.Segment" do
104
+ optional :name, :string, 1
105
+ optional :description, :string, 2
106
+ repeated :includes, :string, 3
107
+ repeated :excludes, :string, 4
108
+ repeated :criterion, :message, 5, "prefab.Criteria"
109
+ end
110
+ add_message "prefab.UserTarget" do
111
+ optional :variant_idx, :int32, 1
112
+ repeated :identifiers, :string, 2
113
+ end
114
+ add_message "prefab.VariantWeight" do
115
+ optional :weight, :int32, 1
116
+ optional :variant_idx, :int32, 2
117
+ end
118
+ add_message "prefab.VariantWeights" do
119
+ repeated :weights, :message, 1, "prefab.VariantWeight"
120
+ end
121
+ add_message "prefab.VariantDistribution" do
122
+ oneof :type do
123
+ optional :variant_idx, :int32, 1
124
+ optional :variant_weights, :message, 2, "prefab.VariantWeights"
125
+ end
126
+ end
127
+ add_message "prefab.FeatureFlag" do
128
+ optional :active, :bool, 1
129
+ optional :inactive_variant_idx, :int32, 2
130
+ optional :default, :message, 3, "prefab.VariantDistribution"
131
+ repeated :user_targets, :message, 4, "prefab.UserTarget"
132
+ repeated :rules, :message, 5, "prefab.Rule"
133
+ end
134
+ add_message "prefab.LimitDefinition" do
135
+ optional :policy_name, :enum, 2, "prefab.LimitResponse.LimitPolicyNames"
136
+ optional :limit, :int32, 3
137
+ optional :burst, :int32, 4
138
+ optional :account_id, :int64, 5
139
+ optional :last_modified, :int64, 6
140
+ optional :returnable, :bool, 7
141
+ optional :safety_level, :enum, 8, "prefab.LimitDefinition.SafetyLevel"
142
+ end
143
+ add_enum "prefab.LimitDefinition.SafetyLevel" do
144
+ value :NOT_SET, 0
145
+ value :L4_BEST_EFFORT, 4
146
+ value :L5_BOMBPROOF, 5
147
+ end
148
+ add_message "prefab.LimitDefinitions" do
149
+ repeated :definitions, :message, 1, "prefab.LimitDefinition"
150
+ end
151
+ add_message "prefab.BufferedRequest" do
152
+ optional :account_id, :int64, 1
153
+ optional :method, :string, 2
154
+ optional :uri, :string, 3
155
+ optional :body, :string, 4
156
+ repeated :limit_groups, :string, 5
157
+ optional :content_type, :string, 6
158
+ optional :fifo, :bool, 7
159
+ end
160
+ add_message "prefab.BatchRequest" do
161
+ optional :account_id, :int64, 1
162
+ optional :method, :string, 2
163
+ optional :uri, :string, 3
164
+ optional :body, :string, 4
165
+ repeated :limit_groups, :string, 5
166
+ optional :batch_template, :string, 6
167
+ optional :batch_separator, :string, 7
168
+ end
169
+ add_message "prefab.BasicResponse" do
170
+ optional :message, :string, 1
171
+ end
172
+ add_message "prefab.CreationResponse" do
173
+ optional :message, :string, 1
174
+ optional :new_id, :int64, 2
175
+ end
176
+ add_enum "prefab.OnFailure" do
177
+ value :NOT_SET, 0
178
+ value :LOG_AND_PASS, 1
179
+ value :LOG_AND_FAIL, 2
180
+ value :THROW, 3
26
181
  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
182
  end
123
183
  end
124
184
 
125
185
  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
186
+ ConfigServicePointer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigServicePointer").msgclass
187
+ ConfigValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigValue").msgclass
188
+ Configs = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Configs").msgclass
189
+ Config = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Config").msgclass
190
+ ConfigRow = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigRow").msgclass
191
+ LimitResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse").msgclass
192
+ LimitResponse::LimitPolicyNames = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse.LimitPolicyNames").enummodule
193
+ LimitRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest").msgclass
194
+ LimitRequest::LimitCombiner = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest.LimitCombiner").enummodule
195
+ FeatureFlagVariant = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlagVariant").msgclass
196
+ Criteria = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Criteria").msgclass
197
+ Criteria::CriteriaOperator = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Criteria.CriteriaOperator").enummodule
198
+ Rule = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Rule").msgclass
199
+ Segment = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Segment").msgclass
200
+ UserTarget = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.UserTarget").msgclass
201
+ VariantWeight = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.VariantWeight").msgclass
202
+ VariantWeights = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.VariantWeights").msgclass
203
+ VariantDistribution = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.VariantDistribution").msgclass
204
+ FeatureFlag = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.FeatureFlag").msgclass
205
+ LimitDefinition = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition").msgclass
206
+ LimitDefinition::SafetyLevel = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinition.SafetyLevel").enummodule
207
+ LimitDefinitions = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitDefinitions").msgclass
208
+ BufferedRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BufferedRequest").msgclass
209
+ BatchRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BatchRequest").msgclass
210
+ BasicResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BasicResponse").msgclass
211
+ CreationResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.CreationResponse").msgclass
212
+ OnFailure = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.OnFailure").enummodule
144
213
  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::Configs)
32
+ rpc :GetAllConfig, ::Prefab::ConfigServicePointer, ::Prefab::Configs
33
+ rpc :Upsert, ::Prefab::Config, ::Prefab::CreationResponse
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.6.0 ruby lib
5
+ # stub: prefab-cloud-ruby 0.9.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "prefab-cloud-ruby".freeze
9
- s.version = "0.6.0"
9
+ s.version = "0.9.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 = "2021-03-23"
14
+ s.date = "2022-03-18"
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,41 @@ 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, [">= 0"])
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, [">= 0"])
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<ld-eventsource>.freeze, [">= 0"])
71
+ s.add_runtime_dependency(%q<grpc>.freeze, [">= 0"])
72
+ s.add_runtime_dependency(%q<google-protobuf>.freeze, [">= 0"])
73
+ s.add_runtime_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
74
+ s.add_development_dependency(%q<grpc-tools>.freeze, [">= 0"])
75
+ s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
76
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
77
+ s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
78
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
79
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
80
+ s.add_development_dependency(%q<thin>.freeze, [">= 0"])
83
81
  else
84
- s.add_dependency(%q<concurrent-ruby>.freeze, [">= 1.0.5", "~> 1.0"])
82
+ s.add_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
85
83
  s.add_dependency(%q<faraday>.freeze, [">= 0"])
84
+ s.add_dependency(%q<ld-eventsource>.freeze, [">= 0"])
86
85
  s.add_dependency(%q<grpc>.freeze, [">= 0"])
87
- s.add_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
86
+ s.add_dependency(%q<google-protobuf>.freeze, [">= 0"])
87
+ s.add_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
88
+ s.add_dependency(%q<grpc-tools>.freeze, [">= 0"])
88
89
  s.add_dependency(%q<shoulda>.freeze, [">= 0"])
89
90
  s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
90
- s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
91
+ s.add_dependency(%q<bundler>.freeze, [">= 0"])
91
92
  s.add_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
92
93
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
94
+ s.add_dependency(%q<thin>.freeze, [">= 0"])
93
95
  end
94
96
  end
95
97
 
@@ -0,0 +1,2 @@
1
+ PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug PREFAB_CLOUD_HTTP=true PREFAB_GRPC_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