devcycle-ruby-server-sdk 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/devcycle-ruby-server-sdk.gemspec +1 -0
- data/lib/devcycle-ruby-server-sdk/api/devcycle_api.rb +38 -8
- data/lib/devcycle-ruby-server-sdk/localbucketing/bucketing-lib.release.wasm +0 -0
- data/lib/devcycle-ruby-server-sdk/localbucketing/dvc_options.rb +0 -2
- data/lib/devcycle-ruby-server-sdk/localbucketing/local_bucketing.rb +105 -23
- data/lib/devcycle-ruby-server-sdk/localbucketing/platform_data.rb +16 -1
- data/lib/devcycle-ruby-server-sdk/localbucketing/proto/helpers.rb +51 -0
- data/lib/devcycle-ruby-server-sdk/localbucketing/proto/variableForUser.proto +70 -0
- data/lib/devcycle-ruby-server-sdk/localbucketing/proto/variableForUser_pb.rb +80 -0
- data/lib/devcycle-ruby-server-sdk/models/event.rb +4 -0
- data/lib/devcycle-ruby-server-sdk/models/user_data.rb +19 -3
- data/lib/devcycle-ruby-server-sdk/version.rb +1 -1
- data/lib/devcycle-ruby-server-sdk.rb +2 -2
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cc9dd1b991a3647be626b38da7398efb99d89752f3f277225d5655490c4c9f5
|
4
|
+
data.tar.gz: 9aea4ae493717583a41a7bfa4c837d333a7d956fdc1d08fbb45e876be1412707
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edb164bbfba2dc76e50947a70f19b79e28dbb18652e50873f7164f73d477bb44c3576525db2fe75873c627f0618b5e71de424316890296f8db5174af6e287523
|
7
|
+
data.tar.gz: 50b1254b7c4cb4fdc69a2d632e3aded8d7f7db94c13e72e29aa2042cb1e7057c9a83aed9a69200260d9ce10764938786dc961598b2d9c017d01e9f5c04249c03
|
data/Gemfile
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_runtime_dependency 'concurrent-ruby', '~> 1.2.0'
|
29
29
|
s.add_runtime_dependency 'sorbet-runtime', '~> 0.5'
|
30
30
|
s.add_runtime_dependency 'oj', '3.13.2'
|
31
|
+
s.add_runtime_dependency 'google-protobuf', '~> 3.22'
|
31
32
|
|
32
33
|
|
33
34
|
s.add_development_dependency 'rspec', '~> 3.6', '>= 3.6.0'
|
@@ -59,13 +59,13 @@ module DevCycle
|
|
59
59
|
nil
|
60
60
|
end
|
61
61
|
|
62
|
-
def set_client_custom_data(
|
62
|
+
def set_client_custom_data(custom_data)
|
63
63
|
if @dvc_options.enable_cloud_bucketing
|
64
64
|
raise StandardError.new("Client Custom Data is only available in Local bucketing mode.")
|
65
65
|
end
|
66
66
|
|
67
67
|
if local_bucketing_initialized?
|
68
|
-
@local_bucketing.set_client_custom_data(
|
68
|
+
@local_bucketing.set_client_custom_data(custom_data)
|
69
69
|
else
|
70
70
|
@logger.warn("Local bucketing not initialized. Unable to set client custom data.")
|
71
71
|
end
|
@@ -181,13 +181,11 @@ module DevCycle
|
|
181
181
|
defaulted = true
|
182
182
|
if local_bucketing_initialized? && @local_bucketing.has_config
|
183
183
|
type_code = variable_type_code_from_type(type)
|
184
|
-
|
185
|
-
if
|
186
|
-
@logger.warn("No variable found for key #{key}, returning default value")
|
187
|
-
elsif type != variable_json['type']
|
188
|
-
@logger.warn("Type mismatch for variable #{key}, returning default value")
|
184
|
+
variable_pb = variable_for_user_pb(user_data, key, type_code)
|
185
|
+
if variable_pb == nil
|
186
|
+
@logger.warn("No variable found or type mismatch for key #{key}, returning default value")
|
189
187
|
else
|
190
|
-
value =
|
188
|
+
value = get_variable_value(variable_pb)
|
191
189
|
defaulted = false
|
192
190
|
end
|
193
191
|
else
|
@@ -212,6 +210,23 @@ module DevCycle
|
|
212
210
|
JSON.parse(json_str)
|
213
211
|
end
|
214
212
|
|
213
|
+
def variable_for_user_pb(user, key, variable_type_code)
|
214
|
+
user_data_pb = user.to_pb_user_data
|
215
|
+
params_pb = Proto::VariableForUserParams_PB.new(
|
216
|
+
sdkKey: @sdkKey,
|
217
|
+
variableKey: key,
|
218
|
+
variableType: variable_type_pb_code_from_type_code(variable_type_code),
|
219
|
+
user: user_data_pb,
|
220
|
+
shouldTrackEvent: true
|
221
|
+
)
|
222
|
+
param_bin_string = Proto::VariableForUserParams_PB.encode(params_pb)
|
223
|
+
var_bin_string = @local_bucketing.variable_for_user_pb(param_bin_string)
|
224
|
+
if var_bin_string.nil?
|
225
|
+
return nil
|
226
|
+
end
|
227
|
+
Proto::SDKVariable_PB.decode(var_bin_string)
|
228
|
+
end
|
229
|
+
|
215
230
|
# Get variable by key for user data
|
216
231
|
# @param key [String] Variable key
|
217
232
|
# @param user_data [UserData]
|
@@ -497,5 +512,20 @@ module DevCycle
|
|
497
512
|
raise ArgumentError.new("Invalid type for variable: #{type}")
|
498
513
|
end
|
499
514
|
end
|
515
|
+
|
516
|
+
def variable_type_pb_code_from_type_code(type_code)
|
517
|
+
case type_code
|
518
|
+
when @local_bucketing.variable_type_codes[:string]
|
519
|
+
Proto::VariableType_PB::String
|
520
|
+
when @local_bucketing.variable_type_codes[:boolean]
|
521
|
+
Proto::VariableType_PB::Boolean
|
522
|
+
when @local_bucketing.variable_type_codes[:number]
|
523
|
+
Proto::VariableType_PB::Number
|
524
|
+
when @local_bucketing.variable_type_codes[:json]
|
525
|
+
Proto::VariableType_PB::JSON
|
526
|
+
else
|
527
|
+
raise ArgumentError.new("Invalid type code for variable: #{type_code}")
|
528
|
+
end
|
529
|
+
end
|
500
530
|
end
|
501
531
|
end
|
Binary file
|
@@ -17,6 +17,11 @@ module DevCycle
|
|
17
17
|
attr_accessor :initialized
|
18
18
|
attr_accessor :has_config
|
19
19
|
|
20
|
+
BUFFER_HEADER_SIZE = 12
|
21
|
+
ARRAY_BUFFER_CLASS_ID = 1
|
22
|
+
STRING_CLASS_ID = 2
|
23
|
+
HEADER_ID = 9
|
24
|
+
|
20
25
|
@@rand = Random.new(seed = Random.new_seed)
|
21
26
|
@@engine = Wasmtime::Engine.new
|
22
27
|
|
@@ -77,7 +82,6 @@ module DevCycle
|
|
77
82
|
|
78
83
|
@@linker.func_new("env", "seed", [], [:f64]) do |_caller|
|
79
84
|
@@rand.rand(1.0) * DateTime.now.strftime("%Q").to_i
|
80
|
-
|
81
85
|
end
|
82
86
|
|
83
87
|
@@instance = @@linker.instantiate(@@store, @@wasmmodule)
|
@@ -101,6 +105,8 @@ module DevCycle
|
|
101
105
|
number: @@instance.export("VariableType.Number").to_global.get.to_i,
|
102
106
|
json: @@instance.export("VariableType.JSON").to_global.get.to_i
|
103
107
|
}
|
108
|
+
@buffer_header_addr = @@instance.export("__new").to_func.call(BUFFER_HEADER_SIZE, HEADER_ID)
|
109
|
+
asc_pin(@buffer_header_addr)
|
104
110
|
set_sdk_key_internal(sdkkey)
|
105
111
|
platform_data = PlatformData.new('server', VERSION, RUBY_VERSION, nil, 'Ruby', Socket.gethostname)
|
106
112
|
set_platform_data(platform_data)
|
@@ -142,6 +148,16 @@ module DevCycle
|
|
142
148
|
end
|
143
149
|
end
|
144
150
|
|
151
|
+
sig { params(bin_str: String).returns(T.nilable(String)) }
|
152
|
+
def variable_for_user_pb(bin_str)
|
153
|
+
@wasm_mutex.synchronize do
|
154
|
+
@@stack_tracer = @@stack_tracer_raise
|
155
|
+
params_addr = malloc_asc_byte_array(bin_str)
|
156
|
+
var_addr = @@instance.invoke("variableForUser_PB", params_addr)
|
157
|
+
read_asc_byte_array(var_addr)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
145
161
|
sig { returns(T::Array[EventsPayload]) }
|
146
162
|
def flush_event_queue
|
147
163
|
@wasm_mutex.synchronize do
|
@@ -187,9 +203,9 @@ module DevCycle
|
|
187
203
|
def queue_event(user, event)
|
188
204
|
@wasm_mutex.synchronize do
|
189
205
|
begin
|
190
|
-
user_addr = malloc_asc_string(
|
206
|
+
user_addr = malloc_asc_string(user.to_json)
|
191
207
|
asc_pin(user_addr)
|
192
|
-
event_addr = malloc_asc_string(
|
208
|
+
event_addr = malloc_asc_string(event.to_json)
|
193
209
|
@@stack_tracer = @@stack_tracer_raise
|
194
210
|
@@instance.invoke("queueEvent", @sdkKeyAddr, user_addr, event_addr)
|
195
211
|
ensure
|
@@ -210,7 +226,7 @@ module DevCycle
|
|
210
226
|
end
|
211
227
|
varmap_addr = malloc_asc_string(Oj.dump(variable_variation_map))
|
212
228
|
asc_pin(varmap_addr)
|
213
|
-
event_addr = malloc_asc_string(
|
229
|
+
event_addr = malloc_asc_string(event.to_json)
|
214
230
|
@@stack_tracer = @@stack_tracer_raise
|
215
231
|
@@instance.invoke("queueAggregateEvent", @sdkKeyAddr, event_addr, varmap_addr)
|
216
232
|
ensure
|
@@ -222,9 +238,9 @@ module DevCycle
|
|
222
238
|
sig { params(config: String).returns(NilClass) }
|
223
239
|
def store_config(config)
|
224
240
|
@wasm_mutex.synchronize do
|
225
|
-
config_addr =
|
241
|
+
config_addr = malloc_asc_byte_array(config)
|
226
242
|
@@stack_tracer = @@stack_tracer_raise
|
227
|
-
@@instance.invoke("
|
243
|
+
@@instance.invoke("setConfigDataUTF8", @sdkKeyAddr, config_addr)
|
228
244
|
end
|
229
245
|
end
|
230
246
|
|
@@ -238,25 +254,25 @@ module DevCycle
|
|
238
254
|
end
|
239
255
|
end
|
240
256
|
|
241
|
-
sig { params(
|
242
|
-
def set_client_custom_data(
|
257
|
+
sig { params(custom_data: Hash).returns(NilClass) }
|
258
|
+
def set_client_custom_data(custom_data)
|
243
259
|
@wasm_mutex.synchronize do
|
244
|
-
|
245
|
-
|
260
|
+
custom_data_json = Oj.dump(custom_data, mode: :json)
|
261
|
+
custom_data_addr = malloc_asc_byte_array(custom_data_json)
|
246
262
|
@@stack_tracer = @@stack_tracer_raise
|
247
|
-
@@instance.invoke("
|
263
|
+
@@instance.invoke("setClientCustomDataUTF8", @sdkKeyAddr, custom_data_addr)
|
248
264
|
end
|
249
265
|
end
|
250
266
|
|
251
267
|
private
|
252
268
|
|
253
|
-
sig { params(
|
254
|
-
def set_platform_data(
|
269
|
+
sig { params(platform_data: PlatformData).returns(NilClass) }
|
270
|
+
def set_platform_data(platform_data)
|
255
271
|
@wasm_mutex.synchronize do
|
256
|
-
|
257
|
-
|
272
|
+
platform_data_json = platform_data.to_json
|
273
|
+
platform_data_addr = malloc_asc_byte_array(platform_data_json)
|
258
274
|
@@stack_tracer = @@stack_tracer_raise
|
259
|
-
@@instance.invoke("
|
275
|
+
@@instance.invoke("setPlatformDataUTF8", platform_data_addr)
|
260
276
|
end
|
261
277
|
end
|
262
278
|
|
@@ -280,13 +296,12 @@ module DevCycle
|
|
280
296
|
# @return [Integer] address to WASM String
|
281
297
|
sig { params(string: String).returns(Integer) }
|
282
298
|
def malloc_asc_string(string)
|
283
|
-
wasm_object_id = 1
|
284
299
|
@@stack_tracer = @@stack_tracer_raise
|
285
300
|
wasm_new = @@instance.export("__new").to_func
|
286
301
|
utf8_bytes = string.bytes
|
287
302
|
byte_len = utf8_bytes.length
|
288
303
|
|
289
|
-
start_addr = wasm_new.call(byte_len * 2,
|
304
|
+
start_addr = wasm_new.call(byte_len * 2, STRING_CLASS_ID)
|
290
305
|
i = 0
|
291
306
|
while i < byte_len
|
292
307
|
@@stack_tracer = @@stack_tracer_raise
|
@@ -306,15 +321,82 @@ module DevCycle
|
|
306
321
|
end
|
307
322
|
|
308
323
|
@@stack_tracer = @@stack_tracer_raise
|
309
|
-
raw_bytes = @@memory.read(address - 4, 4).bytes
|
310
|
-
len =
|
311
|
-
raw_bytes.each { |j|
|
312
|
-
len = (len << 8) + (j & 0xFF)
|
313
|
-
}
|
324
|
+
raw_bytes = @@memory.read(address - 4, 4).bytes
|
325
|
+
len = asc_bytes_to_int(raw_bytes)
|
314
326
|
|
315
327
|
@@stack_tracer = @@stack_tracer_raise
|
316
328
|
result = @@memory.read(address, len).bytes
|
317
329
|
result.select.with_index { |_, i| i.even? }.pack('c*')
|
318
330
|
end
|
331
|
+
|
332
|
+
# @param [String] string utf8 string to allocate
|
333
|
+
# @return [Integer] address to WASM String
|
334
|
+
sig { params(raw_str: String).returns(Integer) }
|
335
|
+
def malloc_asc_byte_array(raw_str)
|
336
|
+
align = 0
|
337
|
+
@@stack_tracer = @@stack_tracer_raise
|
338
|
+
wasm_new = @@instance.export("__new").to_func
|
339
|
+
|
340
|
+
# break up the UTF-8 characters in raw_str into bytes and pack them into a binary sequence
|
341
|
+
# example: "Ϗ" -> "\xCF\x8F"
|
342
|
+
bin_string = raw_str.bytes.pack('C*')
|
343
|
+
length = bin_string.length
|
344
|
+
|
345
|
+
# allocate buffer of size length - returned address is in Big Endian order
|
346
|
+
buffer_addr = wasm_new.call(length << align, ARRAY_BUFFER_CLASS_ID)
|
347
|
+
|
348
|
+
# convert to array of bytes in Little Endian order
|
349
|
+
# - pack('L<') packs the address into a binary sequence in Little Endian order
|
350
|
+
# - unpack('C*') converts each byte in the string to it's decimal representation
|
351
|
+
buffer_addr_little_endian_bytes = [buffer_addr].pack('L<').unpack('C*')
|
352
|
+
|
353
|
+
# write address byte values in Little Endian order to header
|
354
|
+
buffer_addr_little_endian_bytes.each_with_index { |byte, i|
|
355
|
+
@@memory.write(@buffer_header_addr + i, [byte].pack('C'))
|
356
|
+
@@memory.write(@buffer_header_addr + i + 4, [byte].pack('C'))
|
357
|
+
}
|
358
|
+
|
359
|
+
# convert length to an array of bytes in Little Endian order
|
360
|
+
byte_len_little_endian_bytes = [length].pack('L<').unpack('C*')
|
361
|
+
|
362
|
+
# write length to header
|
363
|
+
byte_len_little_endian_bytes.each_with_index { |byte, i|
|
364
|
+
@@memory.write(@buffer_header_addr + i + 8, [byte].pack('C'))
|
365
|
+
}
|
366
|
+
|
367
|
+
# write data bytes to buffer
|
368
|
+
bin_string.each_char.with_index { |char, i|
|
369
|
+
@@memory.write(buffer_addr + i, char)
|
370
|
+
}
|
371
|
+
|
372
|
+
@buffer_header_addr
|
373
|
+
end
|
374
|
+
|
375
|
+
sig { params(address: Integer).returns(T.nilable(String)) }
|
376
|
+
def read_asc_byte_array(address)
|
377
|
+
if address == 0
|
378
|
+
@logger.debug("null address passed to read_asc_byte_array")
|
379
|
+
return nil
|
380
|
+
end
|
381
|
+
|
382
|
+
length_bytes = @@memory.read(address + 8, 4).bytes
|
383
|
+
length = asc_bytes_to_int(length_bytes)
|
384
|
+
|
385
|
+
buffer_addr_bytes = @@memory.read(address, 4).bytes
|
386
|
+
buffer_addr = asc_bytes_to_int(buffer_addr_bytes)
|
387
|
+
|
388
|
+
@@memory.read(buffer_addr, length)
|
389
|
+
end
|
390
|
+
|
391
|
+
# @param [Array<Integer>] bytes: array of bytes in Little Endian order
|
392
|
+
# @return [Integer] integer value
|
393
|
+
# @example
|
394
|
+
# asc_bytes_to_int([0, 4, 0, 0]) # => 1024 = (0 << 0) + (4 << 8) + (0 << 16) + (0 << 24)
|
395
|
+
sig { params(bytes: T::Array[Integer]).returns(Integer) }
|
396
|
+
def asc_bytes_to_int(bytes)
|
397
|
+
bytes.each_with_index.reduce(0) { |acc, (byte, i)|
|
398
|
+
acc + (byte << (i * 8))
|
399
|
+
}
|
400
|
+
end
|
319
401
|
end
|
320
402
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'socket'
|
4
|
-
require '
|
4
|
+
require 'oj'
|
5
5
|
|
6
6
|
module DevCycle
|
7
7
|
class PlatformData
|
@@ -25,5 +25,20 @@ module DevCycle
|
|
25
25
|
@hostname = Socket.gethostname
|
26
26
|
self
|
27
27
|
end
|
28
|
+
|
29
|
+
def to_hash
|
30
|
+
{
|
31
|
+
sdkType: @sdkType,
|
32
|
+
sdkVersion: @sdkVersion,
|
33
|
+
platformVersion: @platformVersion,
|
34
|
+
deviceModel: @deviceModel,
|
35
|
+
platform: @platform,
|
36
|
+
hostname: @hostname
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_json
|
41
|
+
Oj.dump(to_hash, mode: :json)
|
42
|
+
end
|
28
43
|
end
|
29
44
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
def create_nullable_string(val)
|
2
|
+
if val.nil? || val.empty?
|
3
|
+
Proto::NullableString.new(value: "", isNull: true)
|
4
|
+
else
|
5
|
+
Proto::NullableString.new(value: val, isNull: false)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_nullable_double(val)
|
10
|
+
if val.nil?
|
11
|
+
Proto::NullableDouble.new(value: 0, isNull: true)
|
12
|
+
else
|
13
|
+
Proto::NullableDouble.new(value: val, isNull: false)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_nullable_custom_data(data)
|
18
|
+
data_map = {}
|
19
|
+
if data.nil? || data.length == 0
|
20
|
+
return Proto::NullableCustomData.new(value: data_map, isNull: true)
|
21
|
+
end
|
22
|
+
|
23
|
+
data.each do |key, value|
|
24
|
+
if value.nil?
|
25
|
+
data_map[key] = Proto::CustomDataValue.new(type: Proto::CustomDataType::Null)
|
26
|
+
end
|
27
|
+
|
28
|
+
if value.is_a? String
|
29
|
+
data_map[key] = Proto::CustomDataValue.new(type: Proto::CustomDataType::Str, stringValue: value)
|
30
|
+
elsif value.is_a?(Float) || value.is_a?(Integer)
|
31
|
+
data_map[key] = Proto::CustomDataValue.new(type: Proto::CustomDataType::Num, doubleValue: value)
|
32
|
+
elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
33
|
+
data_map[key] = Proto::CustomDataValue.new(type: Proto::CustomDataType::Bool, boolValue: value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Proto::NullableCustomData.new(value: data_map, isNull: false)
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_variable_value(variable_pb)
|
41
|
+
case variable_pb.type
|
42
|
+
when :Boolean
|
43
|
+
variable_pb.boolValue
|
44
|
+
when :Number
|
45
|
+
variable_pb.doubleValue
|
46
|
+
when :String
|
47
|
+
variable_pb.stringValue
|
48
|
+
when :JSON
|
49
|
+
JSON.parse variable_pb.stringValue
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
syntax = "proto3";
|
2
|
+
package proto;
|
3
|
+
|
4
|
+
enum VariableType_PB {
|
5
|
+
Boolean = 0;
|
6
|
+
Number = 1;
|
7
|
+
String = 2;
|
8
|
+
JSON = 3;
|
9
|
+
}
|
10
|
+
|
11
|
+
message NullableString {
|
12
|
+
string value = 1;
|
13
|
+
bool isNull = 2;
|
14
|
+
}
|
15
|
+
|
16
|
+
message NullableDouble {
|
17
|
+
double value = 1;
|
18
|
+
bool isNull = 2;
|
19
|
+
string dummy = 3;
|
20
|
+
}
|
21
|
+
|
22
|
+
enum CustomDataType {
|
23
|
+
Bool = 0;
|
24
|
+
Num = 1;
|
25
|
+
Str = 2;
|
26
|
+
Null = 3;
|
27
|
+
}
|
28
|
+
|
29
|
+
message CustomDataValue {
|
30
|
+
CustomDataType type = 1;
|
31
|
+
bool boolValue = 2;
|
32
|
+
double doubleValue = 3;
|
33
|
+
string stringValue = 4;
|
34
|
+
}
|
35
|
+
|
36
|
+
message NullableCustomData {
|
37
|
+
map<string, CustomDataValue> value = 1;
|
38
|
+
bool isNull = 2;
|
39
|
+
}
|
40
|
+
|
41
|
+
message VariableForUserParams_PB {
|
42
|
+
string sdkKey = 1;
|
43
|
+
string variableKey = 2;
|
44
|
+
VariableType_PB variableType = 3;
|
45
|
+
DVCUser_PB user = 4;
|
46
|
+
bool shouldTrackEvent = 5;
|
47
|
+
}
|
48
|
+
|
49
|
+
message DVCUser_PB {
|
50
|
+
string user_id = 1;
|
51
|
+
NullableString email = 2;
|
52
|
+
NullableString name = 3;
|
53
|
+
NullableString language = 4;
|
54
|
+
NullableString country = 5;
|
55
|
+
NullableDouble appBuild = 6;
|
56
|
+
NullableString appVersion = 7;
|
57
|
+
NullableString deviceModel = 8;
|
58
|
+
NullableCustomData customData = 9;
|
59
|
+
NullableCustomData privateCustomData = 10;
|
60
|
+
}
|
61
|
+
|
62
|
+
message SDKVariable_PB {
|
63
|
+
string _id = 1;
|
64
|
+
VariableType_PB type = 2;
|
65
|
+
string key = 3;
|
66
|
+
bool boolValue = 4;
|
67
|
+
double doubleValue = 5;
|
68
|
+
string stringValue = 6;
|
69
|
+
NullableString evalReason = 7;
|
70
|
+
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: variableForUser.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
+
add_file("variableForUser.proto", :syntax => :proto3) do
|
8
|
+
add_message "proto.NullableString" do
|
9
|
+
optional :value, :string, 1
|
10
|
+
optional :isNull, :bool, 2
|
11
|
+
end
|
12
|
+
add_message "proto.NullableDouble" do
|
13
|
+
optional :value, :double, 1
|
14
|
+
optional :isNull, :bool, 2
|
15
|
+
optional :dummy, :string, 3
|
16
|
+
end
|
17
|
+
add_message "proto.CustomDataValue" do
|
18
|
+
optional :type, :enum, 1, "proto.CustomDataType"
|
19
|
+
optional :boolValue, :bool, 2
|
20
|
+
optional :doubleValue, :double, 3
|
21
|
+
optional :stringValue, :string, 4
|
22
|
+
end
|
23
|
+
add_message "proto.NullableCustomData" do
|
24
|
+
map :value, :string, :message, 1, "proto.CustomDataValue"
|
25
|
+
optional :isNull, :bool, 2
|
26
|
+
end
|
27
|
+
add_message "proto.VariableForUserParams_PB" do
|
28
|
+
optional :sdkKey, :string, 1
|
29
|
+
optional :variableKey, :string, 2
|
30
|
+
optional :variableType, :enum, 3, "proto.VariableType_PB"
|
31
|
+
optional :user, :message, 4, "proto.DVCUser_PB"
|
32
|
+
optional :shouldTrackEvent, :bool, 5
|
33
|
+
end
|
34
|
+
add_message "proto.DVCUser_PB" do
|
35
|
+
optional :user_id, :string, 1
|
36
|
+
optional :email, :message, 2, "proto.NullableString"
|
37
|
+
optional :name, :message, 3, "proto.NullableString"
|
38
|
+
optional :language, :message, 4, "proto.NullableString"
|
39
|
+
optional :country, :message, 5, "proto.NullableString"
|
40
|
+
optional :appBuild, :message, 6, "proto.NullableDouble"
|
41
|
+
optional :appVersion, :message, 7, "proto.NullableString"
|
42
|
+
optional :deviceModel, :message, 8, "proto.NullableString"
|
43
|
+
optional :customData, :message, 9, "proto.NullableCustomData"
|
44
|
+
optional :privateCustomData, :message, 10, "proto.NullableCustomData"
|
45
|
+
end
|
46
|
+
add_message "proto.SDKVariable_PB" do
|
47
|
+
optional :_id, :string, 1
|
48
|
+
optional :type, :enum, 2, "proto.VariableType_PB"
|
49
|
+
optional :key, :string, 3
|
50
|
+
optional :boolValue, :bool, 4
|
51
|
+
optional :doubleValue, :double, 5
|
52
|
+
optional :stringValue, :string, 6
|
53
|
+
optional :evalReason, :message, 7, "proto.NullableString"
|
54
|
+
end
|
55
|
+
add_enum "proto.VariableType_PB" do
|
56
|
+
value :Boolean, 0
|
57
|
+
value :Number, 1
|
58
|
+
value :String, 2
|
59
|
+
value :JSON, 3
|
60
|
+
end
|
61
|
+
add_enum "proto.CustomDataType" do
|
62
|
+
value :Bool, 0
|
63
|
+
value :Num, 1
|
64
|
+
value :Str, 2
|
65
|
+
value :Null, 3
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module Proto
|
71
|
+
NullableString = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.NullableString").msgclass
|
72
|
+
NullableDouble = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.NullableDouble").msgclass
|
73
|
+
CustomDataValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.CustomDataValue").msgclass
|
74
|
+
NullableCustomData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.NullableCustomData").msgclass
|
75
|
+
VariableForUserParams_PB = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.VariableForUserParams_PB").msgclass
|
76
|
+
DVCUser_PB = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.DVCUser_PB").msgclass
|
77
|
+
SDKVariable_PB = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.SDKVariable_PB").msgclass
|
78
|
+
VariableType_PB = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.VariableType_PB").enummodule
|
79
|
+
CustomDataType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("proto.CustomDataType").enummodule
|
80
|
+
end
|
@@ -12,6 +12,7 @@ OpenAPI Generator version: 5.3.0
|
|
12
12
|
|
13
13
|
require 'date'
|
14
14
|
require 'time'
|
15
|
+
require 'oj'
|
15
16
|
|
16
17
|
module DevCycle
|
17
18
|
class Event
|
@@ -259,6 +260,9 @@ module DevCycle
|
|
259
260
|
end
|
260
261
|
end
|
261
262
|
|
263
|
+
def to_json
|
264
|
+
Oj.dump(to_hash, mode: :json)
|
265
|
+
end
|
262
266
|
end
|
263
267
|
|
264
268
|
end
|
@@ -17,9 +17,6 @@ require 'oj'
|
|
17
17
|
module DevCycle
|
18
18
|
class UserData
|
19
19
|
|
20
|
-
def to_json
|
21
|
-
Oj.dump(self)
|
22
|
-
end
|
23
20
|
# Unique id to identify the user
|
24
21
|
attr_accessor :user_id
|
25
22
|
|
@@ -414,5 +411,24 @@ module DevCycle
|
|
414
411
|
value
|
415
412
|
end
|
416
413
|
end
|
414
|
+
|
415
|
+
def to_json
|
416
|
+
Oj.dump(to_hash, mode: :json)
|
417
|
+
end
|
418
|
+
|
419
|
+
def to_pb_user_data
|
420
|
+
pb_user = Proto::DVCUser_PB.new
|
421
|
+
pb_user.user_id = @user_id
|
422
|
+
pb_user.email = create_nullable_string(@email)
|
423
|
+
pb_user.name = create_nullable_string(@name)
|
424
|
+
pb_user.language = create_nullable_string(@language)
|
425
|
+
pb_user.country = create_nullable_string(@country)
|
426
|
+
pb_user.appVersion = create_nullable_string(@appVersion)
|
427
|
+
pb_user.appBuild = create_nullable_double(@appBuild)
|
428
|
+
pb_user.customData = create_nullable_custom_data(@customData)
|
429
|
+
pb_user.privateCustomData = create_nullable_custom_data(@privateCustomData)
|
430
|
+
|
431
|
+
pb_user
|
432
|
+
end
|
417
433
|
end
|
418
434
|
end
|
@@ -15,8 +15,6 @@ require 'devcycle-ruby-server-sdk/api_client'
|
|
15
15
|
require 'devcycle-ruby-server-sdk/api_error'
|
16
16
|
require 'devcycle-ruby-server-sdk/version'
|
17
17
|
require 'devcycle-ruby-server-sdk/configuration'
|
18
|
-
require 'devcycle-ruby-server-sdk/localbucketing/event_queue'
|
19
|
-
require 'devcycle-ruby-server-sdk/localbucketing/event_types'
|
20
18
|
|
21
19
|
# Models
|
22
20
|
require 'devcycle-ruby-server-sdk/models/error_response'
|
@@ -36,6 +34,8 @@ require 'devcycle-ruby-server-sdk/localbucketing/platform_data'
|
|
36
34
|
require 'devcycle-ruby-server-sdk/localbucketing/bucketed_user_config'
|
37
35
|
require 'devcycle-ruby-server-sdk/localbucketing/event_queue'
|
38
36
|
require 'devcycle-ruby-server-sdk/localbucketing/event_types'
|
37
|
+
require 'devcycle-ruby-server-sdk/localbucketing/proto/variableForUser_pb'
|
38
|
+
require 'devcycle-ruby-server-sdk/localbucketing/proto/helpers'
|
39
39
|
|
40
40
|
module DevCycle
|
41
41
|
class << self
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devcycle-ruby-server-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DevCycleHQ
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03-
|
11
|
+
date: 2023-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -86,6 +86,20 @@ dependencies:
|
|
86
86
|
- - '='
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: 3.13.2
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: google-protobuf
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '3.22'
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '3.22'
|
89
103
|
- !ruby/object:Gem::Dependency
|
90
104
|
name: rspec
|
91
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,6 +146,9 @@ files:
|
|
132
146
|
- lib/devcycle-ruby-server-sdk/localbucketing/events_payload.rb
|
133
147
|
- lib/devcycle-ruby-server-sdk/localbucketing/local_bucketing.rb
|
134
148
|
- lib/devcycle-ruby-server-sdk/localbucketing/platform_data.rb
|
149
|
+
- lib/devcycle-ruby-server-sdk/localbucketing/proto/helpers.rb
|
150
|
+
- lib/devcycle-ruby-server-sdk/localbucketing/proto/variableForUser.proto
|
151
|
+
- lib/devcycle-ruby-server-sdk/localbucketing/proto/variableForUser_pb.rb
|
135
152
|
- lib/devcycle-ruby-server-sdk/models/error_response.rb
|
136
153
|
- lib/devcycle-ruby-server-sdk/models/event.rb
|
137
154
|
- lib/devcycle-ruby-server-sdk/models/feature.rb
|