prefab-cloud-ruby 0.7.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +24 -0
- data/README.md +9 -0
- data/VERSION +1 -1
- data/lib/prefab/client.rb +14 -8
- data/lib/prefab/config_client.rb +48 -17
- data/lib/prefab/config_loader.rb +12 -10
- data/lib/prefab/config_resolver.rb +34 -38
- data/lib/prefab/feature_flag_client.rb +10 -9
- data/lib/prefab-cloud-ruby.rb +2 -0
- data/lib/prefab_pb.rb +36 -26
- data/lib/prefab_services_pb.rb +17 -3
- data/prefab-cloud-ruby.gemspec +5 -3
- data/run_test_harness_server.sh +1 -1
- data/test/harness_server.rb +11 -3
- data/test/test_config_loader.rb +20 -20
- data/test/test_config_resolver.rb +69 -52
- data/test/test_feature_flag_client.rb +53 -53
- data/test/test_helper.rb +27 -6
- data/test/test_logger.rb +0 -10
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c18d5a31a2f535269b3faf262b82a57e67b75ceee5581c5ef6f8cea7bbdb416b
|
4
|
+
data.tar.gz: d7125da40abab76dc25e37459cdde3a891801dc4f630c3f3f2f22f7f65ef2f5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38e1ad427078327f05b01b869d5f0879819271b372d8373996d5d592e3d4efa92bed6b59d061d92dc2a21eb49c6c529140ae9f9b5d8825fc2b828840d1b23a7f
|
7
|
+
data.tar.gz: 88cf63bf9dfdc9c103660240a5d2b35f27103eda55c28a96cb16943da41adf4ffa85928533fd739a868b3b5f5bb5ef565b80073f75712f3bb62305921694d1b2
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -14,12 +14,18 @@ GEM
|
|
14
14
|
descendants_tracker (0.0.4)
|
15
15
|
thread_safe (~> 0.3, >= 0.3.1)
|
16
16
|
docile (1.3.5)
|
17
|
+
domain_name (0.5.20190701)
|
18
|
+
unf (>= 0.0.5, < 1.0.0)
|
17
19
|
eventmachine (1.2.7)
|
18
20
|
faraday (1.3.0)
|
19
21
|
faraday-net_http (~> 1.0)
|
20
22
|
multipart-post (>= 1.2, < 3)
|
21
23
|
ruby2_keywords
|
22
24
|
faraday-net_http (1.0.1)
|
25
|
+
ffi (1.15.5)
|
26
|
+
ffi-compiler (1.0.1)
|
27
|
+
ffi (>= 1.0.0)
|
28
|
+
rake
|
23
29
|
git (1.8.1)
|
24
30
|
rchardet (~> 1.8)
|
25
31
|
github_api (0.19.0)
|
@@ -37,6 +43,14 @@ GEM
|
|
37
43
|
grpc-tools (1.43.1)
|
38
44
|
hashie (3.6.0)
|
39
45
|
highline (2.0.3)
|
46
|
+
http (5.0.1)
|
47
|
+
addressable (~> 2.3)
|
48
|
+
http-cookie (~> 1.0)
|
49
|
+
http-form_data (~> 2.2)
|
50
|
+
llhttp-ffi (~> 0.3.0)
|
51
|
+
http-cookie (1.0.4)
|
52
|
+
domain_name (~> 0.5)
|
53
|
+
http-form_data (2.3.0)
|
40
54
|
i18n (1.8.9)
|
41
55
|
concurrent-ruby (~> 1.0)
|
42
56
|
json (1.8.6)
|
@@ -55,6 +69,12 @@ GEM
|
|
55
69
|
jwt (2.2.2)
|
56
70
|
kamelcase (0.0.2)
|
57
71
|
semver2 (~> 3)
|
72
|
+
ld-eventsource (2.2.0)
|
73
|
+
concurrent-ruby (~> 1.0)
|
74
|
+
http (>= 4.4.1, < 6.0.0)
|
75
|
+
llhttp-ffi (0.3.1)
|
76
|
+
ffi-compiler (~> 1.0)
|
77
|
+
rake (~> 13.0)
|
58
78
|
mini_portile2 (2.7.1)
|
59
79
|
minitest (5.14.4)
|
60
80
|
multi_json (1.15.0)
|
@@ -96,6 +116,9 @@ GEM
|
|
96
116
|
thread_safe (0.3.6)
|
97
117
|
tzinfo (1.2.9)
|
98
118
|
thread_safe (~> 0.1)
|
119
|
+
unf (0.1.4)
|
120
|
+
unf_ext
|
121
|
+
unf_ext (0.0.8)
|
99
122
|
|
100
123
|
PLATFORMS
|
101
124
|
ruby
|
@@ -109,6 +132,7 @@ DEPENDENCIES
|
|
109
132
|
grpc
|
110
133
|
grpc-tools
|
111
134
|
juwelier (~> 2.4.9)
|
135
|
+
ld-eventsource
|
112
136
|
rdoc (~> 3.12)
|
113
137
|
shoulda
|
114
138
|
simplecov
|
data/README.md
CHANGED
@@ -53,6 +53,15 @@ end
|
|
53
53
|
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
54
54
|
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
55
55
|
|
56
|
+
## Release
|
57
|
+
|
58
|
+
```shell
|
59
|
+
update VERSION
|
60
|
+
bundle exec rake gemspec:generate
|
61
|
+
git commit & push
|
62
|
+
REMOTE_BRANCH=main LOCAL_BRANCH=main bundle exec rake release
|
63
|
+
```
|
64
|
+
|
56
65
|
## Copyright
|
57
66
|
|
58
67
|
Copyright (c) 2022 Jeff Dwyer. See LICENSE.txt for
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.0
|
data/lib/prefab/client.rb
CHANGED
@@ -8,7 +8,7 @@ module Prefab
|
|
8
8
|
}
|
9
9
|
|
10
10
|
|
11
|
-
attr_reader :project_id, :shared_cache, :stats, :namespace, :interceptor, :api_key, :
|
11
|
+
attr_reader :project_id, :shared_cache, :stats, :namespace, :interceptor, :api_key, :project_env_id, :prefab_api_url
|
12
12
|
|
13
13
|
def initialize(api_key: ENV['PREFAB_API_KEY'],
|
14
14
|
logdev: nil,
|
@@ -19,7 +19,7 @@ module Prefab
|
|
19
19
|
log_formatter: DEFAULT_LOG_FORMATTER
|
20
20
|
)
|
21
21
|
raise "No API key. Set PREFAB_API_KEY env var" if api_key.nil? || api_key.empty?
|
22
|
-
raise "PREFAB_API_KEY format invalid. Expecting 123-development-yourapikey" unless api_key.count("-") ==
|
22
|
+
raise "PREFAB_API_KEY format invalid. Expecting 123-development-yourapikey-SDK" unless api_key.count("-") == 3
|
23
23
|
@logdev = (logdev || $stdout)
|
24
24
|
@log_formatter = log_formatter
|
25
25
|
@local = local
|
@@ -27,21 +27,23 @@ module Prefab
|
|
27
27
|
@shared_cache = (shared_cache || NoopCache.new)
|
28
28
|
@api_key = api_key
|
29
29
|
@project_id = api_key.split("-")[0].to_i
|
30
|
-
@
|
30
|
+
@project_env_id = api_key.split("-")[1].to_i
|
31
31
|
@namespace = namespace
|
32
32
|
@interceptor = Prefab::AuthInterceptor.new(api_key)
|
33
33
|
@stubs = {}
|
34
|
-
|
34
|
+
@prefab_api_url = ENV["PREFAB_API_URL"] || 'https://api.prefab.cloud'
|
35
|
+
@prefab_grpc_url = ENV["PREFAB_GRPC_URL"] || 'grpc.prefab.cloud:443'
|
36
|
+
log_internal Logger::INFO, "Prefab Initializing in environment: '#{@project_env_id}' and namespace: '#{@namespace}'"
|
37
|
+
log_internal Logger::INFO, "Prefab Connecting to: #{@prefab_api_url} and #{@prefab_grpc_url} Secure: #{http_secure?}"
|
35
38
|
at_exit do
|
36
39
|
channel.destroy
|
37
40
|
end
|
38
41
|
end
|
39
42
|
|
40
43
|
def channel
|
41
|
-
credentials =
|
42
|
-
|
43
|
-
|
44
|
-
@_channel ||= GRPC::Core::Channel.new(url, nil, credentials)
|
44
|
+
credentials = http_secure? ? creds : :this_channel_is_insecure
|
45
|
+
log_internal Logger::DEBUG, "GRPC Channel #{@prefab_grpc_url} #{credentials}"
|
46
|
+
@_channel ||= GRPC::Core::Channel.new(@prefab_grpc_url, nil, credentials)
|
45
47
|
end
|
46
48
|
|
47
49
|
def config_client(timeout: 5.0)
|
@@ -101,6 +103,10 @@ module Prefab
|
|
101
103
|
|
102
104
|
private
|
103
105
|
|
106
|
+
def http_secure?
|
107
|
+
ENV["PREFAB_CLOUD_HTTP"] != "true"
|
108
|
+
end
|
109
|
+
|
104
110
|
def stub_for(service, timeout)
|
105
111
|
@stubs["#{service}_#{timeout}"] ||= service::Stub.new(nil,
|
106
112
|
nil,
|
data/lib/prefab/config_client.rb
CHANGED
@@ -29,7 +29,8 @@ module Prefab
|
|
29
29
|
|
30
30
|
def start_streaming
|
31
31
|
@streaming = true
|
32
|
-
|
32
|
+
# start_grpc_streaming_connection_thread(@config_loader.highwater_mark)
|
33
|
+
start_sse_streaming_connection_thread(@config_loader.highwater_mark)
|
33
34
|
end
|
34
35
|
|
35
36
|
def get(key)
|
@@ -62,8 +63,14 @@ module Prefab
|
|
62
63
|
end
|
63
64
|
|
64
65
|
def self.value_to_delta(key, config_value, namespace = nil)
|
65
|
-
Prefab::
|
66
|
-
|
66
|
+
Prefab::Config.new(key: [namespace, key].compact.join(":"),
|
67
|
+
rows: [Prefab::ConfigRow.new(value: config_value)])
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_config_obj(key)
|
71
|
+
@initialization_lock.with_read_lock do
|
72
|
+
@config_resolver.get_config(key)
|
73
|
+
end
|
67
74
|
end
|
68
75
|
|
69
76
|
private
|
@@ -92,12 +99,12 @@ module Prefab
|
|
92
99
|
def load_checkpoint_from_config
|
93
100
|
@base_client.log_internal Logger::DEBUG, "Load Checkpoint From Config"
|
94
101
|
|
95
|
-
config_req = Prefab::ConfigServicePointer.new(
|
96
|
-
|
102
|
+
config_req = Prefab::ConfigServicePointer.new(start_at_id: @config_loader.highwater_mark)
|
103
|
+
|
97
104
|
resp = stub.get_all_config(config_req)
|
98
105
|
@base_client.log_internal Logger::DEBUG, "Got Response #{resp}"
|
99
|
-
|
100
|
-
resp.
|
106
|
+
load_configs(resp, :api)
|
107
|
+
resp.configs.each do |delta|
|
101
108
|
@config_loader.set(delta)
|
102
109
|
end
|
103
110
|
@config_resolver.update
|
@@ -112,16 +119,16 @@ module Prefab
|
|
112
119
|
url = "#{@s3_cloud_front}/#{@base_client.api_key.gsub("|", "/")}"
|
113
120
|
resp = Faraday.get url
|
114
121
|
if resp.status == 200
|
115
|
-
|
116
|
-
|
122
|
+
configs = Prefab::Configs.decode(resp.body)
|
123
|
+
load_configs(configs, :s3)
|
117
124
|
else
|
118
125
|
@base_client.log_internal Logger::INFO, "No S3 checkpoint. Response #{resp.status} Plan may not support this."
|
119
126
|
end
|
120
127
|
end
|
121
128
|
|
122
|
-
def
|
123
|
-
|
124
|
-
@config_loader.set(
|
129
|
+
def load_configs(configs, source)
|
130
|
+
configs.configs.each do |config|
|
131
|
+
@config_loader.set(config)
|
125
132
|
end
|
126
133
|
@base_client.log_internal Logger::INFO, "Found checkpoint with highwater id #{@config_loader.highwater_mark} from #{source}"
|
127
134
|
@base_client.stats.increment("prefab.config.checkpoint.load")
|
@@ -156,11 +163,35 @@ module Prefab
|
|
156
163
|
end
|
157
164
|
end
|
158
165
|
|
166
|
+
|
167
|
+
def start_sse_streaming_connection_thread(start_at_id)
|
168
|
+
auth = "#{@base_client.project_id}:#{@base_client.api_key}"
|
169
|
+
|
170
|
+
auth_string = Base64.strict_encode64(auth)
|
171
|
+
headers = {
|
172
|
+
"x-prefab-start-at-id": start_at_id,
|
173
|
+
"Authorization": "Basic #{auth_string}",
|
174
|
+
}
|
175
|
+
url = "#{@base_client.prefab_api_url}/api/v1/sse/config"
|
176
|
+
@base_client.log_internal Logger::INFO, "SSE Streaming Connect to #{url}"
|
177
|
+
SSE::Client.new(url, headers: headers) do |client|
|
178
|
+
client.on_event do |event|
|
179
|
+
configs = Prefab::Configs.decode(Base64.decode64(event.data))
|
180
|
+
@base_client.log_internal Logger::INFO, "SSE received configs."
|
181
|
+
@base_client.log_internal Logger::DEBUG, "SSE received configs: #{configs}"
|
182
|
+
configs.configs.each do |config|
|
183
|
+
@config_loader.set(config)
|
184
|
+
end
|
185
|
+
@config_resolver.update
|
186
|
+
finish_init!(:streaming)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
159
191
|
# Setup a streaming connection to the API
|
160
192
|
# Save new config values into the loader
|
161
|
-
def
|
162
|
-
config_req = Prefab::ConfigServicePointer.new(
|
163
|
-
start_at_id: start_at_id)
|
193
|
+
def start_grpc_streaming_connection_thread(start_at_id)
|
194
|
+
config_req = Prefab::ConfigServicePointer.new(start_at_id: start_at_id)
|
164
195
|
@base_client.log_internal Logger::DEBUG, "start api connection thread #{start_at_id}"
|
165
196
|
@base_client.stats.increment("prefab.config.api.start")
|
166
197
|
|
@@ -174,8 +205,8 @@ module Prefab
|
|
174
205
|
begin
|
175
206
|
resp = stub.get_config(config_req)
|
176
207
|
resp.each do |r|
|
177
|
-
r.
|
178
|
-
@config_loader.set(
|
208
|
+
r.configs.each do |config|
|
209
|
+
@config_loader.set(config)
|
179
210
|
end
|
180
211
|
@config_resolver.update
|
181
212
|
finish_init!(:streaming)
|
data/lib/prefab/config_loader.rb
CHANGED
@@ -20,18 +20,18 @@ module Prefab
|
|
20
20
|
rtn
|
21
21
|
end
|
22
22
|
|
23
|
-
def set(
|
23
|
+
def set(config)
|
24
24
|
# don't overwrite newer values
|
25
|
-
if @api_config[
|
25
|
+
if @api_config[config.key] && @api_config[config.key].id > config.id
|
26
26
|
return
|
27
27
|
end
|
28
28
|
|
29
|
-
if
|
30
|
-
@api_config.delete(
|
29
|
+
if config.rows.empty?
|
30
|
+
@api_config.delete(config.key)
|
31
31
|
else
|
32
|
-
@api_config[
|
32
|
+
@api_config[config.key] = config
|
33
33
|
end
|
34
|
-
@highwater_mark = [
|
34
|
+
@highwater_mark = [config.id, @highwater_mark].max
|
35
35
|
end
|
36
36
|
|
37
37
|
def rm(key)
|
@@ -39,11 +39,11 @@ module Prefab
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def get_api_deltas
|
42
|
-
|
42
|
+
configs = Prefab::Configs.new
|
43
43
|
@api_config.each_value do |config_value|
|
44
|
-
|
44
|
+
configs.configs << config_value
|
45
45
|
end
|
46
|
-
|
46
|
+
configs
|
47
47
|
end
|
48
48
|
|
49
49
|
private
|
@@ -63,7 +63,9 @@ module Prefab
|
|
63
63
|
Dir.glob(glob).each do |file|
|
64
64
|
yaml = load(file)
|
65
65
|
yaml.each do |k, v|
|
66
|
-
rtn[k] = Prefab::
|
66
|
+
rtn[k] = Prefab::Config.new(key: k, rows: [
|
67
|
+
Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(value_from(v)))
|
68
|
+
])
|
67
69
|
end
|
68
70
|
end
|
69
71
|
rtn
|
@@ -6,7 +6,7 @@ module Prefab
|
|
6
6
|
def initialize(base_client, config_loader)
|
7
7
|
@lock = Concurrent::ReadWriteLock.new
|
8
8
|
@local_store = {}
|
9
|
-
@
|
9
|
+
@project_env_id = base_client.project_env_id
|
10
10
|
@namespace = base_client.namespace
|
11
11
|
@config_loader = config_loader
|
12
12
|
make_local
|
@@ -16,20 +16,27 @@ module Prefab
|
|
16
16
|
str = ""
|
17
17
|
@lock.with_read_lock do
|
18
18
|
@local_store.each do |k, v|
|
19
|
-
|
20
|
-
|
19
|
+
if v.nil?
|
20
|
+
str<< "|#{k}| tombstone\n"
|
21
|
+
else
|
22
|
+
value = v[:value]
|
23
|
+
str << "|#{k}| from #{v[:match]} |#{value_of(value)}|#{value_of(value).class}\n"
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
23
27
|
str
|
24
28
|
end
|
25
29
|
|
26
30
|
def get(property)
|
27
|
-
config =
|
28
|
-
@local_store[property]
|
29
|
-
end
|
31
|
+
config = _get(property)
|
30
32
|
config ? value_of(config[:value]) : nil
|
31
33
|
end
|
32
34
|
|
35
|
+
def get_config(property)
|
36
|
+
config = _get(property)
|
37
|
+
config ? config[:config] : nil
|
38
|
+
end
|
39
|
+
|
33
40
|
def update
|
34
41
|
make_local
|
35
42
|
end
|
@@ -55,46 +62,35 @@ module Prefab
|
|
55
62
|
|
56
63
|
def make_local
|
57
64
|
store = {}
|
58
|
-
@config_loader.calc_config.each do |key,
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
# override the top level default with env default
|
69
|
-
to_store = { match: "env_default", env: env_value.environment, value: env_value.default }
|
70
|
-
|
71
|
-
if env_value.namespace_values.any?
|
72
|
-
# check all namespace_values for match
|
73
|
-
env_value.namespace_values.each do |namespace_value|
|
74
|
-
(starts_with, count) = starts_with_ns?(namespace_value.namespace, @namespace)
|
75
|
-
if starts_with
|
76
|
-
# is this match the best match?
|
77
|
-
if count > (to_store[:match_depth_count] || 0)
|
78
|
-
to_store = { match: namespace_value.namespace, count: count, value: namespace_value.config_value }
|
79
|
-
end
|
80
|
-
end
|
65
|
+
@config_loader.calc_config.each do |key, config|
|
66
|
+
sortable = config.rows.map do |row|
|
67
|
+
if row.project_env_id != 0
|
68
|
+
if row.project_env_id == @project_env_id
|
69
|
+
if !row.namespace.empty?
|
70
|
+
(starts_with, count) = starts_with_ns?(row.namespace, @namespace)
|
71
|
+
# rubocop:disable BlockNesting
|
72
|
+
{ sortable: 2 + count, match: row.namespace, value: row.value, config: config} if starts_with
|
73
|
+
else
|
74
|
+
{ sortable: 1, match: row.project_env_id, value: row.value, config: config}
|
81
75
|
end
|
82
76
|
end
|
77
|
+
else
|
78
|
+
{ sortable: 0, match: "default", value: row.value, config: config}
|
83
79
|
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# feature flags are a funny case
|
87
|
-
# we only define the variants in the default in order to be DRY
|
88
|
-
# but we want to access them in environments, clone them over
|
89
|
-
if to_store[:value].type == :feature_flag
|
90
|
-
to_store[:value].feature_flag.variants = delta.default.feature_flag.variants
|
91
|
-
end
|
92
|
-
|
80
|
+
end.compact
|
81
|
+
to_store = sortable.sort_by { |h| h[:sortable] }.last
|
93
82
|
store[key] = to_store
|
94
83
|
end
|
84
|
+
|
95
85
|
@lock.with_write_lock do
|
96
86
|
@local_store = store
|
97
87
|
end
|
98
88
|
end
|
89
|
+
|
90
|
+
def _get(property)
|
91
|
+
@lock.with_read_lock do
|
92
|
+
@local_store[property]
|
93
|
+
end
|
94
|
+
end
|
99
95
|
end
|
100
96
|
end
|
@@ -24,11 +24,12 @@ module Prefab
|
|
24
24
|
|
25
25
|
def get(feature_name, lookup_key, attributes)
|
26
26
|
feature_obj = @base_client.config_client.get(feature_name)
|
27
|
-
|
27
|
+
variants = @base_client.config_client.get_config_obj(feature_name).variants
|
28
|
+
evaluate(feature_name, lookup_key, attributes, feature_obj, variants)
|
28
29
|
end
|
29
30
|
|
30
|
-
def evaluate(feature_name, lookup_key, attributes, feature_obj)
|
31
|
-
value_of(get_variant(feature_name, lookup_key, attributes, feature_obj))
|
31
|
+
def evaluate(feature_name, lookup_key, attributes, feature_obj, variants)
|
32
|
+
value_of(get_variant(feature_name, lookup_key, attributes, feature_obj, variants))
|
32
33
|
end
|
33
34
|
|
34
35
|
private
|
@@ -40,9 +41,9 @@ module Prefab
|
|
40
41
|
variant.bool
|
41
42
|
end
|
42
43
|
|
43
|
-
def get_variant(feature_name, lookup_key, attributes, feature_obj)
|
44
|
+
def get_variant(feature_name, lookup_key, attributes, feature_obj, variants)
|
44
45
|
if !feature_obj.active
|
45
|
-
return get_variant_obj(
|
46
|
+
return get_variant_obj(variants, feature_obj.inactive_variant_idx)
|
46
47
|
end
|
47
48
|
|
48
49
|
variant_distribution = feature_obj.default
|
@@ -50,7 +51,7 @@ module Prefab
|
|
50
51
|
# if user_targets.match
|
51
52
|
feature_obj.user_targets.each do |target|
|
52
53
|
if (target.identifiers.include? lookup_key)
|
53
|
-
return get_variant_obj(
|
54
|
+
return get_variant_obj(variants, target.variant_idx)
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
@@ -73,11 +74,11 @@ module Prefab
|
|
73
74
|
variant_idx = get_variant_idx_from_weights(variant_distribution.variant_weights.weights, distribution_bucket, feature_name)
|
74
75
|
end
|
75
76
|
|
76
|
-
return get_variant_obj(
|
77
|
+
return get_variant_obj(variants, variant_idx)
|
77
78
|
end
|
78
79
|
|
79
|
-
def get_variant_obj(
|
80
|
-
return
|
80
|
+
def get_variant_obj(variants, idx)
|
81
|
+
return variants[idx] if variants.length >= idx
|
81
82
|
nil
|
82
83
|
end
|
83
84
|
|
data/lib/prefab-cloud-ruby.rb
CHANGED
data/lib/prefab_pb.rb
CHANGED
@@ -8,7 +8,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
8
8
|
add_message "prefab.ConfigServicePointer" do
|
9
9
|
optional :project_id, :int64, 1
|
10
10
|
optional :start_at_id, :int64, 2
|
11
|
-
optional :
|
11
|
+
optional :project_env_id, :int64, 3
|
12
12
|
end
|
13
13
|
add_message "prefab.ConfigValue" do
|
14
14
|
oneof :type do
|
@@ -22,28 +22,21 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
22
22
|
optional :segment, :message, 8, "prefab.Segment"
|
23
23
|
end
|
24
24
|
end
|
25
|
-
add_message "prefab.
|
26
|
-
|
27
|
-
optional :config_value, :message, 2, "prefab.ConfigValue"
|
25
|
+
add_message "prefab.Configs" do
|
26
|
+
repeated :configs, :message, 1, "prefab.Config"
|
28
27
|
end
|
29
|
-
add_message "prefab.
|
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
|
28
|
+
add_message "prefab.Config" do
|
35
29
|
optional :id, :int64, 1
|
36
|
-
optional :
|
37
|
-
optional :
|
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"
|
30
|
+
optional :project_id, :int64, 2
|
31
|
+
optional :key, :string, 3
|
46
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 :project_env_id, :int64, 1
|
38
|
+
optional :namespace, :string, 2
|
39
|
+
optional :value, :message, 3, "prefab.ConfigValue"
|
47
40
|
end
|
48
41
|
add_message "prefab.LimitResponse" do
|
49
42
|
optional :passed, :bool, 1
|
@@ -137,7 +130,6 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
137
130
|
optional :default, :message, 3, "prefab.VariantDistribution"
|
138
131
|
repeated :user_targets, :message, 4, "prefab.UserTarget"
|
139
132
|
repeated :rules, :message, 5, "prefab.Rule"
|
140
|
-
repeated :variants, :message, 6, "prefab.FeatureFlagVariant"
|
141
133
|
end
|
142
134
|
add_message "prefab.LimitDefinition" do
|
143
135
|
optional :policy_name, :enum, 2, "prefab.LimitResponse.LimitPolicyNames"
|
@@ -177,6 +169,23 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
177
169
|
add_message "prefab.BasicResponse" do
|
178
170
|
optional :message, :string, 1
|
179
171
|
end
|
172
|
+
add_message "prefab.CreationResponse" do
|
173
|
+
optional :message, :string, 1
|
174
|
+
optional :new_id, :int64, 2
|
175
|
+
end
|
176
|
+
add_message "prefab.IdBlock" do
|
177
|
+
optional :project_id, :int64, 1
|
178
|
+
optional :project_env_id, :int64, 2
|
179
|
+
optional :sequence_name, :string, 3
|
180
|
+
optional :start, :int64, 4
|
181
|
+
optional :end, :int64, 5
|
182
|
+
end
|
183
|
+
add_message "prefab.IdBlockRequest" do
|
184
|
+
optional :project_id, :int64, 1
|
185
|
+
optional :project_env_id, :int64, 2
|
186
|
+
optional :sequence_name, :string, 3
|
187
|
+
optional :size, :int64, 4
|
188
|
+
end
|
180
189
|
add_enum "prefab.OnFailure" do
|
181
190
|
value :NOT_SET, 0
|
182
191
|
value :LOG_AND_PASS, 1
|
@@ -189,11 +198,9 @@ end
|
|
189
198
|
module Prefab
|
190
199
|
ConfigServicePointer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigServicePointer").msgclass
|
191
200
|
ConfigValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigValue").msgclass
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
ConfigDeltas = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigDeltas").msgclass
|
196
|
-
UpsertRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.UpsertRequest").msgclass
|
201
|
+
Configs = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Configs").msgclass
|
202
|
+
Config = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.Config").msgclass
|
203
|
+
ConfigRow = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.ConfigRow").msgclass
|
197
204
|
LimitResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse").msgclass
|
198
205
|
LimitResponse::LimitPolicyNames = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitResponse.LimitPolicyNames").enummodule
|
199
206
|
LimitRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.LimitRequest").msgclass
|
@@ -214,5 +221,8 @@ module Prefab
|
|
214
221
|
BufferedRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BufferedRequest").msgclass
|
215
222
|
BatchRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BatchRequest").msgclass
|
216
223
|
BasicResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.BasicResponse").msgclass
|
224
|
+
CreationResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.CreationResponse").msgclass
|
225
|
+
IdBlock = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.IdBlock").msgclass
|
226
|
+
IdBlockRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.IdBlockRequest").msgclass
|
217
227
|
OnFailure = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("prefab.OnFailure").enummodule
|
218
228
|
end
|
data/lib/prefab_services_pb.rb
CHANGED
@@ -28,9 +28,23 @@ module Prefab
|
|
28
28
|
self.unmarshal_class_method = :decode
|
29
29
|
self.service_name = 'prefab.ConfigService'
|
30
30
|
|
31
|
-
rpc :GetConfig, ::Prefab::ConfigServicePointer, stream(::Prefab::
|
32
|
-
rpc :GetAllConfig, ::Prefab::ConfigServicePointer, ::Prefab::
|
33
|
-
rpc :Upsert, ::Prefab::
|
31
|
+
rpc :GetConfig, ::Prefab::ConfigServicePointer, stream(::Prefab::Configs)
|
32
|
+
rpc :GetAllConfig, ::Prefab::ConfigServicePointer, ::Prefab::Configs
|
33
|
+
rpc :Upsert, ::Prefab::Config, ::Prefab::CreationResponse
|
34
|
+
end
|
35
|
+
|
36
|
+
Stub = Service.rpc_stub_class
|
37
|
+
end
|
38
|
+
module IdService
|
39
|
+
class Service
|
40
|
+
|
41
|
+
include ::GRPC::GenericService
|
42
|
+
|
43
|
+
self.marshal_class_method = :encode
|
44
|
+
self.unmarshal_class_method = :decode
|
45
|
+
self.service_name = 'prefab.IdService'
|
46
|
+
|
47
|
+
rpc :GetBlock, ::Prefab::IdBlockRequest, ::Prefab::IdBlock
|
34
48
|
end
|
35
49
|
|
36
50
|
Stub = Service.rpc_stub_class
|
data/prefab-cloud-ruby.gemspec
CHANGED
@@ -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
|
+
# stub: prefab-cloud-ruby 0.10.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "prefab-cloud-ruby".freeze
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.10.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 = "2022-
|
14
|
+
s.date = "2022-03-23"
|
15
15
|
s.description = "RateLimits & Config as a service".freeze
|
16
16
|
s.email = "jdwyer@prefab.cloud".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -67,6 +67,7 @@ Gem::Specification.new do |s|
|
|
67
67
|
if s.respond_to? :add_runtime_dependency then
|
68
68
|
s.add_runtime_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
|
69
69
|
s.add_runtime_dependency(%q<faraday>.freeze, [">= 0"])
|
70
|
+
s.add_runtime_dependency(%q<ld-eventsource>.freeze, [">= 0"])
|
70
71
|
s.add_runtime_dependency(%q<grpc>.freeze, [">= 0"])
|
71
72
|
s.add_runtime_dependency(%q<google-protobuf>.freeze, [">= 0"])
|
72
73
|
s.add_runtime_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
|
@@ -80,6 +81,7 @@ Gem::Specification.new do |s|
|
|
80
81
|
else
|
81
82
|
s.add_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
|
82
83
|
s.add_dependency(%q<faraday>.freeze, [">= 0"])
|
84
|
+
s.add_dependency(%q<ld-eventsource>.freeze, [">= 0"])
|
83
85
|
s.add_dependency(%q<grpc>.freeze, [">= 0"])
|
84
86
|
s.add_dependency(%q<google-protobuf>.freeze, [">= 0"])
|
85
87
|
s.add_dependency(%q<googleapis-common-protos-types>.freeze, [">= 0"])
|