launchdarkly-server-sdk 8.4.2 → 8.5.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/lib/ldclient-rb/context.rb +43 -0
- data/lib/ldclient-rb/impl/integrations/file_data_source.rb +15 -11
- data/lib/ldclient-rb/integrations/file_data.rb +1 -1
- data/lib/ldclient-rb/ldclient.rb +12 -7
- data/lib/ldclient-rb/reference.rb +10 -0
- data/lib/ldclient-rb/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1774083dedfc1cdc4e32a2c2855a91c1075cd22aeb1ec55ff68d305c3d82d11
|
4
|
+
data.tar.gz: a07b4851ed59e16271e5d32ad83027899846d8cc1dd18718ae2d3eed84ab27a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8407bb6f129c50da2b93c43cc17c53383ad1e01e7bc11ce803d1743d89bc42dda73734dd055e097f7fe11224082125e46aa23f63284fa06753f7e51678b065f1
|
7
|
+
data.tar.gz: 313092bf41b6a3f82b603561f7fd3dd921318811ce542ac0c0d35d5d5677aba1060111b77dc810cf5caf7492c9e52161fbf54eac3bbd46709440eb4729abb055
|
data/lib/ldclient-rb/context.rb
CHANGED
@@ -334,6 +334,49 @@ module LaunchDarkly
|
|
334
334
|
multi_kind? ? individual_context(key.to_s) : get_value(key)
|
335
335
|
end
|
336
336
|
|
337
|
+
#
|
338
|
+
# Convert the LDContext to a JSON string.
|
339
|
+
#
|
340
|
+
# @param args [Array]
|
341
|
+
# @return [String]
|
342
|
+
#
|
343
|
+
def to_json(*args)
|
344
|
+
JSON.generate(to_h, *args)
|
345
|
+
end
|
346
|
+
|
347
|
+
#
|
348
|
+
# Convert the LDContext to a hash. If the LDContext is invalid, the hash will contain an error key with the error
|
349
|
+
# message.
|
350
|
+
#
|
351
|
+
# @return [Hash]
|
352
|
+
#
|
353
|
+
def to_h
|
354
|
+
return {error: error} unless valid?
|
355
|
+
return hash_single_kind unless multi_kind?
|
356
|
+
|
357
|
+
hash = {kind: 'multi'}
|
358
|
+
@contexts.each do |context|
|
359
|
+
single_kind_hash = context.to_h
|
360
|
+
kind = single_kind_hash.delete(:kind)
|
361
|
+
hash[kind] = single_kind_hash
|
362
|
+
end
|
363
|
+
|
364
|
+
hash
|
365
|
+
end
|
366
|
+
|
367
|
+
protected def hash_single_kind
|
368
|
+
hash = attributes.nil? ? {} : attributes.clone
|
369
|
+
|
370
|
+
hash[:kind] = kind
|
371
|
+
hash[:key] = key
|
372
|
+
|
373
|
+
hash[:name] = name unless name.nil?
|
374
|
+
hash[:anonymous] = anonymous if anonymous
|
375
|
+
hash[:_meta] = {privateAttributes: private_attributes} unless private_attributes.empty?
|
376
|
+
|
377
|
+
hash
|
378
|
+
end
|
379
|
+
|
337
380
|
#
|
338
381
|
# Retrieve the value of any top level, addressable attribute.
|
339
382
|
#
|
@@ -36,18 +36,13 @@ module LaunchDarkly
|
|
36
36
|
@paths = [ @paths ]
|
37
37
|
end
|
38
38
|
@auto_update = options[:auto_update]
|
39
|
-
|
40
|
-
# We have seen unreliable behavior in the 'listen' gem in JRuby 9.1 (https://github.com/guard/listen/issues/449).
|
41
|
-
# Therefore, on that platform we'll fall back to file polling instead.
|
42
|
-
if defined?(JRUBY_VERSION) && JRUBY_VERSION.start_with?("9.1.")
|
43
|
-
@use_listen = false
|
44
|
-
else
|
45
|
-
@use_listen = true
|
46
|
-
end
|
47
|
-
end
|
39
|
+
@use_listen = @auto_update && @@have_listen && !options[:force_polling]
|
48
40
|
@poll_interval = options[:poll_interval] || 1
|
49
41
|
@initialized = Concurrent::AtomicBoolean.new(false)
|
50
42
|
@ready = Concurrent::Event.new
|
43
|
+
|
44
|
+
@version_lock = Mutex.new
|
45
|
+
@last_version = 1
|
51
46
|
end
|
52
47
|
|
53
48
|
def initialized?
|
@@ -101,14 +96,22 @@ module LaunchDarkly
|
|
101
96
|
end
|
102
97
|
|
103
98
|
def load_file(path, all_data)
|
99
|
+
version = 1
|
100
|
+
@version_lock.synchronize {
|
101
|
+
version = @last_version
|
102
|
+
@last_version += 1
|
103
|
+
}
|
104
|
+
|
104
105
|
parsed = parse_content(IO.read(path))
|
105
106
|
(parsed[:flags] || {}).each do |key, flag|
|
107
|
+
flag[:version] = version
|
106
108
|
add_item(all_data, FEATURES, flag)
|
107
109
|
end
|
108
110
|
(parsed[:flagValues] || {}).each do |key, value|
|
109
|
-
add_item(all_data, FEATURES, make_flag_with_value(key.to_s, value))
|
111
|
+
add_item(all_data, FEATURES, make_flag_with_value(key.to_s, value, version))
|
110
112
|
end
|
111
113
|
(parsed[:segments] || {}).each do |key, segment|
|
114
|
+
segment[:version] = version
|
112
115
|
add_item(all_data, SEGMENTS, segment)
|
113
116
|
end
|
114
117
|
end
|
@@ -142,10 +145,11 @@ module LaunchDarkly
|
|
142
145
|
items[key] = Model.deserialize(kind, item)
|
143
146
|
end
|
144
147
|
|
145
|
-
def make_flag_with_value(key, value)
|
148
|
+
def make_flag_with_value(key, value, version)
|
146
149
|
{
|
147
150
|
key: key,
|
148
151
|
on: true,
|
152
|
+
version: version,
|
149
153
|
fallthrough: { variation: 0 },
|
150
154
|
variations: [ value ],
|
151
155
|
}
|
@@ -93,7 +93,7 @@ module LaunchDarkly
|
|
93
93
|
# Note that the default implementation of this feature is based on polling the filesystem,
|
94
94
|
# which may not perform well. If you install the 'listen' gem (not included by default, to
|
95
95
|
# avoid adding unwanted dependencies to the SDK), its native file watching mechanism will be
|
96
|
-
# used instead.
|
96
|
+
# used instead.
|
97
97
|
# @option options [Float] :poll_interval The minimum interval, in seconds, between checks for
|
98
98
|
# file modifications - used only if auto_update is true, and if the native file-watching
|
99
99
|
# mechanism from 'listen' is not being used. The default value is 1 second.
|
data/lib/ldclient-rb/ldclient.rb
CHANGED
@@ -124,13 +124,18 @@ module LaunchDarkly
|
|
124
124
|
end
|
125
125
|
|
126
126
|
ready = @data_source.start
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
127
|
+
|
128
|
+
return unless wait_for_sec > 0
|
129
|
+
|
130
|
+
if wait_for_sec > 60
|
131
|
+
@config.logger.warn { "[LDClient] Client was configured to block for up to #{wait_for_sec} seconds when initializing. We recommend blocking no longer than 60." }
|
132
|
+
end
|
133
|
+
|
134
|
+
ok = ready.wait(wait_for_sec)
|
135
|
+
if !ok
|
136
|
+
@config.logger.error { "[LDClient] Timeout encountered waiting for LaunchDarkly client initialization" }
|
137
|
+
elsif !@data_source.initialized?
|
138
|
+
@config.logger.error { "[LDClient] LaunchDarkly client initialization failed" }
|
134
139
|
end
|
135
140
|
end
|
136
141
|
|
@@ -238,6 +238,16 @@ module LaunchDarkly
|
|
238
238
|
([error] + components).hash
|
239
239
|
end
|
240
240
|
|
241
|
+
#
|
242
|
+
# Convert the Reference to a JSON string.
|
243
|
+
#
|
244
|
+
# @param args [Array]
|
245
|
+
# @return [String]
|
246
|
+
#
|
247
|
+
def to_json(*args)
|
248
|
+
JSON.generate(@raw_path, *args)
|
249
|
+
end
|
250
|
+
|
241
251
|
#
|
242
252
|
# Performs unescaping of attribute reference path components:
|
243
253
|
#
|
data/lib/ldclient-rb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: launchdarkly-server-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.
|
4
|
+
version: 8.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LaunchDarkly
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-dynamodb
|