launchdarkly-server-sdk 6.4.0 → 7.0.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/config.rb +102 -56
- data/lib/ldclient-rb/context.rb +487 -0
- data/lib/ldclient-rb/evaluation_detail.rb +20 -20
- data/lib/ldclient-rb/events.rb +77 -132
- data/lib/ldclient-rb/flags_state.rb +4 -4
- data/lib/ldclient-rb/impl/big_segments.rb +17 -17
- data/lib/ldclient-rb/impl/context.rb +96 -0
- data/lib/ldclient-rb/impl/context_filter.rb +145 -0
- data/lib/ldclient-rb/impl/diagnostic_events.rb +9 -10
- data/lib/ldclient-rb/impl/evaluator.rb +379 -131
- data/lib/ldclient-rb/impl/evaluator_bucketing.rb +40 -41
- data/lib/ldclient-rb/impl/evaluator_helpers.rb +28 -31
- data/lib/ldclient-rb/impl/evaluator_operators.rb +26 -55
- data/lib/ldclient-rb/impl/event_sender.rb +6 -6
- data/lib/ldclient-rb/impl/event_summarizer.rb +12 -7
- data/lib/ldclient-rb/impl/event_types.rb +18 -30
- data/lib/ldclient-rb/impl/integrations/consul_impl.rb +7 -7
- data/lib/ldclient-rb/impl/integrations/dynamodb_impl.rb +29 -29
- data/lib/ldclient-rb/impl/integrations/file_data_source.rb +8 -8
- data/lib/ldclient-rb/impl/integrations/redis_impl.rb +92 -12
- data/lib/ldclient-rb/impl/model/clause.rb +39 -0
- data/lib/ldclient-rb/impl/model/feature_flag.rb +213 -0
- data/lib/ldclient-rb/impl/model/preprocessed_data.rb +8 -121
- data/lib/ldclient-rb/impl/model/segment.rb +126 -0
- data/lib/ldclient-rb/impl/model/serialization.rb +52 -12
- data/lib/ldclient-rb/impl/repeating_task.rb +1 -1
- data/lib/ldclient-rb/impl/store_data_set_sorter.rb +2 -2
- data/lib/ldclient-rb/impl/unbounded_pool.rb +1 -1
- data/lib/ldclient-rb/impl/util.rb +2 -2
- data/lib/ldclient-rb/in_memory_store.rb +2 -2
- data/lib/ldclient-rb/integrations/consul.rb +1 -1
- data/lib/ldclient-rb/integrations/dynamodb.rb +1 -1
- data/lib/ldclient-rb/integrations/file_data.rb +3 -3
- data/lib/ldclient-rb/integrations/redis.rb +4 -4
- data/lib/ldclient-rb/integrations/test_data/flag_builder.rb +218 -62
- data/lib/ldclient-rb/integrations/test_data.rb +16 -12
- data/lib/ldclient-rb/integrations/util/store_wrapper.rb +9 -9
- data/lib/ldclient-rb/interfaces.rb +14 -14
- data/lib/ldclient-rb/ldclient.rb +94 -144
- data/lib/ldclient-rb/memoized_value.rb +1 -1
- data/lib/ldclient-rb/non_blocking_thread_pool.rb +1 -1
- data/lib/ldclient-rb/polling.rb +2 -2
- data/lib/ldclient-rb/reference.rb +274 -0
- data/lib/ldclient-rb/requestor.rb +5 -5
- data/lib/ldclient-rb/stream.rb +7 -8
- data/lib/ldclient-rb/util.rb +4 -19
- data/lib/ldclient-rb/version.rb +1 -1
- data/lib/ldclient-rb.rb +2 -3
- metadata +34 -17
- data/lib/ldclient-rb/file_data_source.rb +0 -23
- data/lib/ldclient-rb/newrelic.rb +0 -17
- data/lib/ldclient-rb/redis_store.rb +0 -88
- data/lib/ldclient-rb/user_filter.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e189d76d654dbf73dc95e9cea758b81bc0df93d9012ebb6560d0994e6dff227c
|
4
|
+
data.tar.gz: fc8bdc8b9affee0e51ef233c217cfa4a3c7fbdbceb4694c38c5a2e90155205ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fb89d48c3185f7019cd170f36f571b1ca2f7de130c624d6301fbfd30d46a0ae7a986494393ab290fa23b66511ce676b660533e1ad23d3a9e01fb037e20db6c4
|
7
|
+
data.tar.gz: 7e706747d2fcd1ab299a76eca7bf26908dbe97972b8c1ea74cfae6bc6aaffe866ddfc157b26675eb44fb22044c74efff88e7c5c4bf8dc0e75fa93dfe0ddbea8a
|
data/lib/ldclient-rb/config.rb
CHANGED
@@ -13,6 +13,18 @@ module LaunchDarkly
|
|
13
13
|
#
|
14
14
|
# Constructor for creating custom LaunchDarkly configurations.
|
15
15
|
#
|
16
|
+
# `user_keys_capacity` and `user_keys_flush_interval` are deprecated
|
17
|
+
# configuration options. They exist to maintain backwards compatibility
|
18
|
+
# with previous configurations. Newer code should prefer their replacement
|
19
|
+
# options -- `context_keys_capacity` and `context_keys_flush_interval`.
|
20
|
+
#
|
21
|
+
# In the event both the user and context variations are provided, the
|
22
|
+
# context specific configuration option will take precedence.
|
23
|
+
#
|
24
|
+
# Similarly, `private_attribute_names` is deprecated. Newer code should
|
25
|
+
# prefer `private_attributes`. If both are provided, `private_attributes`
|
26
|
+
# will take precedence.
|
27
|
+
#
|
16
28
|
# @param opts [Hash] the configuration options
|
17
29
|
# @option opts [Logger] :logger See {#logger}.
|
18
30
|
# @option opts [String] :base_uri ("https://sdk.launchdarkly.com") See {#base_uri}.
|
@@ -31,13 +43,13 @@ module LaunchDarkly
|
|
31
43
|
# @option opts [Boolean] :stream (true) See {#stream?}.
|
32
44
|
# @option opts [Boolean] all_attributes_private (false) See {#all_attributes_private}.
|
33
45
|
# @option opts [Array] :private_attribute_names See {#private_attribute_names}.
|
46
|
+
# @option opts [Array] :private_attributes See {#private_attributes}.
|
34
47
|
# @option opts [Boolean] :send_events (true) See {#send_events}.
|
35
48
|
# @option opts [Integer] :user_keys_capacity (1000) See {#user_keys_capacity}.
|
49
|
+
# @option opts [Integer] :context_keys_capacity (1000) See {#context_keys_capacity}.
|
36
50
|
# @option opts [Float] :user_keys_flush_interval (300) See {#user_keys_flush_interval}.
|
37
|
-
# @option opts [
|
51
|
+
# @option opts [Float] :context_keys_flush_interval (300) See {#context_keys_flush_interval}.
|
38
52
|
# @option opts [Object] :data_source See {#data_source}.
|
39
|
-
# @option opts [Object] :update_processor Obsolete synonym for `data_source`.
|
40
|
-
# @option opts [Object] :update_processor_factory Obsolete synonym for `data_source`.
|
41
53
|
# @option opts [Boolean] :diagnostic_opt_out (false) See {#diagnostic_opt_out?}.
|
42
54
|
# @option opts [Float] :diagnostic_recording_interval (900) See {#diagnostic_recording_interval}.
|
43
55
|
# @option opts [String] :wrapper_name See {#wrapper_name}.
|
@@ -63,14 +75,11 @@ module LaunchDarkly
|
|
63
75
|
@offline = opts.has_key?(:offline) ? opts[:offline] : Config.default_offline
|
64
76
|
@poll_interval = opts.has_key?(:poll_interval) && opts[:poll_interval] > Config.default_poll_interval ? opts[:poll_interval] : Config.default_poll_interval
|
65
77
|
@all_attributes_private = opts[:all_attributes_private] || false
|
66
|
-
@
|
78
|
+
@private_attributes = opts[:private_attributes] || opts[:private_attribute_names] || []
|
67
79
|
@send_events = opts.has_key?(:send_events) ? opts[:send_events] : Config.default_send_events
|
68
|
-
@
|
69
|
-
@
|
70
|
-
@
|
71
|
-
@data_source = opts[:data_source] || opts[:update_processor] || opts[:update_processor_factory]
|
72
|
-
@update_processor = opts[:update_processor]
|
73
|
-
@update_processor_factory = opts[:update_processor_factory]
|
80
|
+
@context_keys_capacity = opts[:context_keys_capacity] || opts[:user_keys_capacity] || Config.default_context_keys_capacity
|
81
|
+
@context_keys_flush_interval = opts[:context_keys_flush_interval] || opts[:user_keys_flush_interval] || Config.default_user_keys_flush_interval
|
82
|
+
@data_source = opts[:data_source]
|
74
83
|
@diagnostic_opt_out = opts.has_key?(:diagnostic_opt_out) && opts[:diagnostic_opt_out]
|
75
84
|
@diagnostic_recording_interval = opts.has_key?(:diagnostic_recording_interval) && opts[:diagnostic_recording_interval] > Config.minimum_diagnostic_recording_interval ?
|
76
85
|
opts[:diagnostic_recording_interval] : Config.default_diagnostic_recording_interval
|
@@ -126,7 +135,7 @@ module LaunchDarkly
|
|
126
135
|
def use_ldd?
|
127
136
|
@use_ldd
|
128
137
|
end
|
129
|
-
|
138
|
+
|
130
139
|
#
|
131
140
|
# Whether the client should be initialized in offline mode. In offline mode, default values are
|
132
141
|
# returned for all flags and no remote network requests are made.
|
@@ -209,28 +218,37 @@ module LaunchDarkly
|
|
209
218
|
attr_reader :feature_store
|
210
219
|
|
211
220
|
#
|
212
|
-
# True if all
|
221
|
+
# True if all context attributes (other than the key) should be considered private. This means
|
213
222
|
# that the attribute values will not be sent to LaunchDarkly in analytics events and will not
|
214
223
|
# appear on the LaunchDarkly dashboard.
|
215
224
|
# @return [Boolean]
|
216
|
-
# @see #
|
225
|
+
# @see #private_attributes
|
217
226
|
#
|
218
227
|
attr_reader :all_attributes_private
|
219
228
|
|
220
229
|
#
|
221
|
-
# A list of
|
230
|
+
# A list of context attribute names that should always be considered private. This means that the
|
222
231
|
# attribute values will not be sent to LaunchDarkly in analytics events and will not appear on
|
223
232
|
# the LaunchDarkly dashboard.
|
224
233
|
#
|
225
|
-
# You can also specify the same behavior for an individual flag evaluation
|
226
|
-
#
|
227
|
-
#
|
234
|
+
# You can also specify the same behavior for an individual flag evaluation
|
235
|
+
# by providing the context object with a list of private attributes.
|
236
|
+
#
|
237
|
+
# @see https://docs.launchdarkly.com/sdk/features/user-context-config#using-private-attributes
|
228
238
|
#
|
229
239
|
# @return [Array<String>]
|
230
240
|
# @see #all_attributes_private
|
231
241
|
#
|
232
|
-
attr_reader :
|
233
|
-
|
242
|
+
attr_reader :private_attributes
|
243
|
+
|
244
|
+
#
|
245
|
+
# @deprecated Backwards compatibility alias for #private_attributes.
|
246
|
+
#
|
247
|
+
# @return [Integer]
|
248
|
+
# @see #private_attributes
|
249
|
+
#
|
250
|
+
alias :private_attribute_names :private_attributes
|
251
|
+
|
234
252
|
#
|
235
253
|
# Whether to send events back to LaunchDarkly. This differs from {#offline?} in that it affects
|
236
254
|
# only the sending of client-side events, not streaming or polling for events from the server.
|
@@ -239,27 +257,35 @@ module LaunchDarkly
|
|
239
257
|
attr_reader :send_events
|
240
258
|
|
241
259
|
#
|
242
|
-
# The number of
|
243
|
-
# amount of duplicate
|
260
|
+
# The number of context keys that the event processor can remember at any one time. This reduces the
|
261
|
+
# amount of duplicate context details sent in analytics events.
|
262
|
+
# @return [Integer]
|
263
|
+
# @see #context_keys_flush_interval
|
264
|
+
#
|
265
|
+
attr_reader :context_keys_capacity
|
266
|
+
|
267
|
+
#
|
268
|
+
# @deprecated Backwards compatibility alias for #context_keys_capacity.
|
269
|
+
#
|
244
270
|
# @return [Integer]
|
245
|
-
# @see #
|
271
|
+
# @see #context_keys_flush_interval
|
246
272
|
#
|
247
|
-
|
273
|
+
alias :user_keys_capacity :context_keys_capacity
|
248
274
|
|
249
275
|
#
|
250
|
-
# The interval in seconds at which the event processor will reset its set of known
|
276
|
+
# The interval in seconds at which the event processor will reset its set of known context keys.
|
251
277
|
# @return [Float]
|
252
|
-
# @see #
|
278
|
+
# @see #context_keys_capacity
|
253
279
|
#
|
254
|
-
attr_reader :
|
280
|
+
attr_reader :context_keys_flush_interval
|
255
281
|
|
256
282
|
#
|
257
|
-
#
|
258
|
-
# include the user key, except for one "index" event that provides the full details for the user.
|
259
|
-
# The only reason to change this is if you are using the Analytics Data Stream.
|
260
|
-
# @return [Boolean]
|
283
|
+
# @deprecated Backwards compatibility alias for #context_keys_flush_interval.
|
261
284
|
#
|
262
|
-
|
285
|
+
# @return [Integer]
|
286
|
+
# @see #context_keys_flush_interval
|
287
|
+
#
|
288
|
+
alias :user_keys_flush_interval :context_keys_flush_interval
|
263
289
|
|
264
290
|
#
|
265
291
|
# An object that is responsible for receiving feature flag data from LaunchDarkly. By default,
|
@@ -279,7 +305,7 @@ module LaunchDarkly
|
|
279
305
|
#
|
280
306
|
# Configuration options related to Big Segments.
|
281
307
|
#
|
282
|
-
# Big Segments are a specific type of
|
308
|
+
# Big Segments are a specific type of segments. For more information, read the LaunchDarkly
|
283
309
|
# documentation: https://docs.launchdarkly.com/home/users/big-segments
|
284
310
|
#
|
285
311
|
# @return [BigSegmentsConfig]
|
@@ -304,12 +330,6 @@ module LaunchDarkly
|
|
304
330
|
#
|
305
331
|
attr_reader :application
|
306
332
|
|
307
|
-
# @deprecated This is replaced by {#data_source}.
|
308
|
-
attr_reader :update_processor
|
309
|
-
|
310
|
-
# @deprecated This is replaced by {#data_source}.
|
311
|
-
attr_reader :update_processor_factory
|
312
|
-
|
313
333
|
#
|
314
334
|
# Set to true to opt out of sending diagnostics data.
|
315
335
|
#
|
@@ -446,8 +466,8 @@ module LaunchDarkly
|
|
446
466
|
#
|
447
467
|
def self.default_logger
|
448
468
|
if defined?(Rails) && Rails.respond_to?(:logger)
|
449
|
-
Rails.logger
|
450
|
-
else
|
469
|
+
Rails.logger
|
470
|
+
else
|
451
471
|
log = ::Logger.new($stdout)
|
452
472
|
log.level = ::Logger::WARN
|
453
473
|
log
|
@@ -503,21 +523,33 @@ module LaunchDarkly
|
|
503
523
|
end
|
504
524
|
|
505
525
|
#
|
506
|
-
# The default value for {#
|
526
|
+
# The default value for {#context_keys_capacity}.
|
507
527
|
# @return [Integer] 1000
|
508
528
|
#
|
509
|
-
def self.
|
529
|
+
def self.default_context_keys_capacity
|
510
530
|
1000
|
511
531
|
end
|
512
532
|
|
513
533
|
#
|
514
|
-
# The default value for {#
|
534
|
+
# The default value for {#context_keys_flush_interval}.
|
515
535
|
# @return [Float] 300
|
516
536
|
#
|
517
|
-
def self.
|
537
|
+
def self.default_context_keys_flush_interval
|
518
538
|
300
|
519
539
|
end
|
520
540
|
|
541
|
+
class << self
|
542
|
+
#
|
543
|
+
# @deprecated Backwards compatibility alias for #default_context_keys_capacity
|
544
|
+
#
|
545
|
+
alias :default_user_keys_capacity :default_context_keys_capacity
|
546
|
+
|
547
|
+
#
|
548
|
+
# @deprecated Backwards compatibility alias for #default_context_keys_flush_interval
|
549
|
+
#
|
550
|
+
alias :default_user_keys_flush_interval :default_context_keys_flush_interval
|
551
|
+
end
|
552
|
+
|
521
553
|
#
|
522
554
|
# The default value for {#diagnostic_recording_interval}.
|
523
555
|
# @return [Float] 900
|
@@ -538,7 +570,7 @@ module LaunchDarkly
|
|
538
570
|
#
|
539
571
|
# Configuration options related to Big Segments.
|
540
572
|
#
|
541
|
-
# Big Segments are a specific type of
|
573
|
+
# Big Segments are a specific type of segments. For more information, read the LaunchDarkly
|
542
574
|
# documentation: https://docs.launchdarkly.com/home/users/big-segments
|
543
575
|
#
|
544
576
|
# If your application uses Big Segments, you will need to create a `BigSegmentsConfig` that at a
|
@@ -552,8 +584,8 @@ module LaunchDarkly
|
|
552
584
|
# client = LaunchDarkly::LDClient.new(my_sdk_key, config)
|
553
585
|
#
|
554
586
|
class BigSegmentsConfig
|
555
|
-
|
556
|
-
|
587
|
+
DEFAULT_CONTEXT_CACHE_SIZE = 1000
|
588
|
+
DEFAULT_CONTEXT_CACHE_TIME = 5
|
557
589
|
DEFAULT_STATUS_POLL_INTERVAL = 5
|
558
590
|
DEFAULT_STALE_AFTER = 2 * 60
|
559
591
|
|
@@ -561,15 +593,15 @@ module LaunchDarkly
|
|
561
593
|
# Constructor for setting Big Segments options.
|
562
594
|
#
|
563
595
|
# @param store [LaunchDarkly::Interfaces::BigSegmentStore] the data store implementation
|
564
|
-
# @param
|
565
|
-
# @param
|
596
|
+
# @param context_cache_size [Integer] See {#context_cache_size}.
|
597
|
+
# @param context_cache_time [Float] See {#context_cache_time}.
|
566
598
|
# @param status_poll_interval [Float] See {#status_poll_interval}.
|
567
599
|
# @param stale_after [Float] See {#stale_after}.
|
568
600
|
#
|
569
|
-
def initialize(store:,
|
601
|
+
def initialize(store:, context_cache_size: nil, context_cache_time: nil, status_poll_interval: nil, stale_after: nil)
|
570
602
|
@store = store
|
571
|
-
@
|
572
|
-
@
|
603
|
+
@context_cache_size = context_cache_size.nil? ? DEFAULT_CONTEXT_CACHE_SIZE : context_cache_size
|
604
|
+
@context_cache_time = context_cache_time.nil? ? DEFAULT_CONTEXT_CACHE_TIME : context_cache_time
|
573
605
|
@status_poll_interval = status_poll_interval.nil? ? DEFAULT_STATUS_POLL_INTERVAL : status_poll_interval
|
574
606
|
@stale_after = stale_after.nil? ? DEFAULT_STALE_AFTER : stale_after
|
575
607
|
end
|
@@ -579,14 +611,28 @@ module LaunchDarkly
|
|
579
611
|
# @return [LaunchDarkly::Interfaces::BigSegmentStore]
|
580
612
|
attr_reader :store
|
581
613
|
|
582
|
-
# The maximum number of
|
614
|
+
# The maximum number of contexts whose Big Segment state will be cached by the SDK at any given time.
|
615
|
+
# @return [Integer]
|
616
|
+
attr_reader :context_cache_size
|
617
|
+
|
618
|
+
#
|
619
|
+
# @deprecated Backwards compatibility alias for #context_cache_size
|
620
|
+
#
|
583
621
|
# @return [Integer]
|
584
|
-
|
622
|
+
#
|
623
|
+
alias :user_cache_size :context_cache_size
|
585
624
|
|
586
|
-
# The maximum length of time (in seconds) that the Big Segment state for a
|
625
|
+
# The maximum length of time (in seconds) that the Big Segment state for a context will be cached
|
587
626
|
# by the SDK.
|
588
627
|
# @return [Float]
|
589
|
-
attr_reader :
|
628
|
+
attr_reader :context_cache_time
|
629
|
+
|
630
|
+
#
|
631
|
+
# @deprecated Backwards compatibility alias for #context_cache_time
|
632
|
+
#
|
633
|
+
# @return [Float]
|
634
|
+
#
|
635
|
+
alias :user_cache_time :context_cache_time
|
590
636
|
|
591
637
|
# The interval (in seconds) at which the SDK will poll the Big Segment store to make sure it is
|
592
638
|
# available and to determine how long ago it was updated.
|