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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a36d24a94355b3b7a2b3b889734e1f6f6ccafc7dcebfb11ff11d77ba92ea7828
4
- data.tar.gz: 326b3166d4fc2589ebb2550114b2cc198617620daa70ecfb6b9fe394c9dd79a5
3
+ metadata.gz: c18d5a31a2f535269b3faf262b82a57e67b75ceee5581c5ef6f8cea7bbdb416b
4
+ data.tar.gz: d7125da40abab76dc25e37459cdde3a891801dc4f630c3f3f2f22f7f65ef2f5d
5
5
  SHA512:
6
- metadata.gz: fb73839190f23e05540688572b8f47c1300ae9181bdecef0f24fdecb9a9e73ace1c88937e7c228601c20ff68405876c21b977e45bd691ba33f59d71dd4811718
7
- data.tar.gz: 792f04aa032c2f9975444a191ddbb8f727e256d12ec2fc4b3c26819bff4a425deabffb3ff262221e7fe90ed4c1d1422d7a2cb447530264cde494b4e149de7e78
6
+ metadata.gz: 38e1ad427078327f05b01b869d5f0879819271b372d8373996d5d592e3d4efa92bed6b59d061d92dc2a21eb49c6c529140ae9f9b5d8825fc2b828840d1b23a7f
7
+ data.tar.gz: 88cf63bf9dfdc9c103660240a5d2b35f27103eda55c28a96cb16943da41adf4ffa85928533fd739a868b3b5f5bb5ef565b80073f75712f3bb62305921694d1b2
data/Gemfile CHANGED
@@ -2,6 +2,7 @@ source "https://rubygems.org"
2
2
 
3
3
  gem 'concurrent-ruby', '~> 1.0', '>= 1.0.5'
4
4
  gem 'faraday'
5
+ gem 'ld-eventsource'
5
6
  gem 'grpc', :platforms => :ruby
6
7
  gem 'google-protobuf', :platforms => :ruby
7
8
  gem 'googleapis-common-protos-types', :platforms => :ruby
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.7.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, :environment
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("-") == 2
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
- @environment = api_key.split("-")[1]
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 = ENV["PREFAB_CLOUD_HTTP"] == "true" ? :this_channel_is_insecure : creds
42
- url = ENV["PREFAB_API_URL"] || 'grpc.prefab.cloud:443'
43
- log_internal Logger::DEBUG, "GRPC Channel #{url} #{credentials}"
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,
@@ -29,7 +29,8 @@ module Prefab
29
29
 
30
30
  def start_streaming
31
31
  @streaming = true
32
- start_api_connection_thread(@config_loader.highwater_mark)
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::ConfigDelta.new(key: [namespace, key].compact.join(":"),
66
- value: config_value)
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(project_id: @base_client.project_id,
96
- start_at_id: @config_loader.highwater_mark)
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
- load_deltas(resp, :api)
100
- resp.deltas.each do |delta|
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
- deltas = Prefab::ConfigDeltas.decode(resp.body)
116
- load_deltas(deltas, :s3)
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 load_deltas(deltas, source)
123
- deltas.deltas.each do |delta|
124
- @config_loader.set(delta)
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 start_api_connection_thread(start_at_id)
162
- config_req = Prefab::ConfigServicePointer.new(project_id: @base_client.project_id,
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.deltas.each do |delta|
178
- @config_loader.set(delta)
208
+ r.configs.each do |config|
209
+ @config_loader.set(config)
179
210
  end
180
211
  @config_resolver.update
181
212
  finish_init!(:streaming)
@@ -20,18 +20,18 @@ module Prefab
20
20
  rtn
21
21
  end
22
22
 
23
- def set(delta)
23
+ def set(config)
24
24
  # don't overwrite newer values
25
- if @api_config[delta.key] && @api_config[delta.key].id > delta.id
25
+ if @api_config[config.key] && @api_config[config.key].id > config.id
26
26
  return
27
27
  end
28
28
 
29
- if delta.default.nil?
30
- @api_config.delete(delta.key)
29
+ if config.rows.empty?
30
+ @api_config.delete(config.key)
31
31
  else
32
- @api_config[delta.key] = delta
32
+ @api_config[config.key] = config
33
33
  end
34
- @highwater_mark = [delta.id, @highwater_mark].max
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
- deltas = Prefab::ConfigDeltas.new
42
+ configs = Prefab::Configs.new
43
43
  @api_config.each_value do |config_value|
44
- deltas.deltas << config_value
44
+ configs.configs << config_value
45
45
  end
46
- deltas
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::ConfigDelta.new(key: k, default: Prefab::ConfigValue.new(value_from(v)))
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
- @environment = base_client.environment
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
- value = v[:value]
20
- str << "|#{k}| from #{v[:match]} |#{value_of(value)}|#{value_of(value).class}\n"
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 = @lock.with_read_lock do
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, delta|
59
- # start with the top level default
60
- to_store = { match: "default", value: delta.default }
61
- if delta.envs.any?
62
- env_values = delta.envs.select { |e| e.environment == @environment }
63
-
64
- # do we have and env_values that match our env?
65
- if env_values.any?
66
- env_value = env_values.first
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
- evaluate(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)
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(feature_obj, feature_obj.inactive_variant_idx)
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(feature_obj, target.variant_idx)
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(feature_obj, variant_idx)
77
+ return get_variant_obj(variants, variant_idx)
77
78
  end
78
79
 
79
- def get_variant_obj(feature_obj, idx)
80
- return feature_obj.variants[idx] if feature_obj.variants.length >= idx
80
+ def get_variant_obj(variants, idx)
81
+ return variants[idx] if variants.length >= idx
81
82
  nil
82
83
  end
83
84
 
@@ -2,6 +2,8 @@ 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'
7
9
  require 'prefab/config_helper'
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 :env_key, :string, 3
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.NamespaceValue" do
26
- optional :namespace, :string, 1
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.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
28
+ add_message "prefab.Config" do
35
29
  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"
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
- 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
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
@@ -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::ConfigDeltas)
32
- rpc :GetAllConfig, ::Prefab::ConfigServicePointer, ::Prefab::ConfigDeltas
33
- rpc :Upsert, ::Prefab::UpsertRequest, ::Prefab::ConfigServicePointer
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
@@ -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.7.0 ruby lib
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.7.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-02-24"
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"])