launchdarkly-server-sdk 5.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +134 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.gitignore +15 -0
  6. data/.hound.yml +2 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +600 -0
  9. data/.simplecov +4 -0
  10. data/.yardopts +9 -0
  11. data/CHANGELOG.md +261 -0
  12. data/CODEOWNERS +1 -0
  13. data/CONTRIBUTING.md +37 -0
  14. data/Gemfile +3 -0
  15. data/Gemfile.lock +102 -0
  16. data/LICENSE.txt +13 -0
  17. data/README.md +56 -0
  18. data/Rakefile +5 -0
  19. data/azure-pipelines.yml +51 -0
  20. data/ext/mkrf_conf.rb +11 -0
  21. data/launchdarkly-server-sdk.gemspec +40 -0
  22. data/lib/ldclient-rb.rb +29 -0
  23. data/lib/ldclient-rb/cache_store.rb +45 -0
  24. data/lib/ldclient-rb/config.rb +411 -0
  25. data/lib/ldclient-rb/evaluation.rb +455 -0
  26. data/lib/ldclient-rb/event_summarizer.rb +55 -0
  27. data/lib/ldclient-rb/events.rb +468 -0
  28. data/lib/ldclient-rb/expiring_cache.rb +77 -0
  29. data/lib/ldclient-rb/file_data_source.rb +312 -0
  30. data/lib/ldclient-rb/flags_state.rb +76 -0
  31. data/lib/ldclient-rb/impl.rb +13 -0
  32. data/lib/ldclient-rb/impl/integrations/consul_impl.rb +158 -0
  33. data/lib/ldclient-rb/impl/integrations/dynamodb_impl.rb +228 -0
  34. data/lib/ldclient-rb/impl/integrations/redis_impl.rb +155 -0
  35. data/lib/ldclient-rb/impl/store_client_wrapper.rb +47 -0
  36. data/lib/ldclient-rb/impl/store_data_set_sorter.rb +55 -0
  37. data/lib/ldclient-rb/in_memory_store.rb +100 -0
  38. data/lib/ldclient-rb/integrations.rb +55 -0
  39. data/lib/ldclient-rb/integrations/consul.rb +38 -0
  40. data/lib/ldclient-rb/integrations/dynamodb.rb +47 -0
  41. data/lib/ldclient-rb/integrations/redis.rb +55 -0
  42. data/lib/ldclient-rb/integrations/util/store_wrapper.rb +230 -0
  43. data/lib/ldclient-rb/interfaces.rb +153 -0
  44. data/lib/ldclient-rb/ldclient.rb +424 -0
  45. data/lib/ldclient-rb/memoized_value.rb +32 -0
  46. data/lib/ldclient-rb/newrelic.rb +17 -0
  47. data/lib/ldclient-rb/non_blocking_thread_pool.rb +46 -0
  48. data/lib/ldclient-rb/polling.rb +78 -0
  49. data/lib/ldclient-rb/redis_store.rb +87 -0
  50. data/lib/ldclient-rb/requestor.rb +101 -0
  51. data/lib/ldclient-rb/simple_lru_cache.rb +25 -0
  52. data/lib/ldclient-rb/stream.rb +141 -0
  53. data/lib/ldclient-rb/user_filter.rb +51 -0
  54. data/lib/ldclient-rb/util.rb +50 -0
  55. data/lib/ldclient-rb/version.rb +3 -0
  56. data/scripts/gendocs.sh +11 -0
  57. data/scripts/release.sh +27 -0
  58. data/spec/config_spec.rb +63 -0
  59. data/spec/evaluation_spec.rb +739 -0
  60. data/spec/event_summarizer_spec.rb +63 -0
  61. data/spec/events_spec.rb +642 -0
  62. data/spec/expiring_cache_spec.rb +76 -0
  63. data/spec/feature_store_spec_base.rb +213 -0
  64. data/spec/file_data_source_spec.rb +255 -0
  65. data/spec/fixtures/feature.json +37 -0
  66. data/spec/fixtures/feature1.json +36 -0
  67. data/spec/fixtures/user.json +9 -0
  68. data/spec/flags_state_spec.rb +81 -0
  69. data/spec/http_util.rb +109 -0
  70. data/spec/in_memory_feature_store_spec.rb +12 -0
  71. data/spec/integrations/consul_feature_store_spec.rb +42 -0
  72. data/spec/integrations/dynamodb_feature_store_spec.rb +105 -0
  73. data/spec/integrations/store_wrapper_spec.rb +276 -0
  74. data/spec/ldclient_spec.rb +471 -0
  75. data/spec/newrelic_spec.rb +5 -0
  76. data/spec/polling_spec.rb +120 -0
  77. data/spec/redis_feature_store_spec.rb +95 -0
  78. data/spec/requestor_spec.rb +214 -0
  79. data/spec/segment_store_spec_base.rb +95 -0
  80. data/spec/simple_lru_cache_spec.rb +24 -0
  81. data/spec/spec_helper.rb +9 -0
  82. data/spec/store_spec.rb +10 -0
  83. data/spec/stream_spec.rb +60 -0
  84. data/spec/user_filter_spec.rb +91 -0
  85. data/spec/util_spec.rb +17 -0
  86. data/spec/version_spec.rb +7 -0
  87. metadata +375 -0
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rspec/core/rake_task"
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: :spec
@@ -0,0 +1,51 @@
1
+ jobs:
2
+ - job: build
3
+ pool:
4
+ vmImage: 'vs2017-win2016'
5
+ steps:
6
+ - task: PowerShell@2
7
+ displayName: 'Setup Dynamo'
8
+ inputs:
9
+ targetType: inline
10
+ workingDirectory: $(System.DefaultWorkingDirectory)
11
+ script: |
12
+ iwr -outf dynamo.zip https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.zip
13
+ mkdir dynamo
14
+ Expand-Archive -Path dynamo.zip -DestinationPath dynamo
15
+ cd dynamo
16
+ javaw -D"java.library.path=./DynamoDBLocal_lib" -jar DynamoDBLocal.jar
17
+ - task: PowerShell@2
18
+ displayName: 'Setup Consul'
19
+ inputs:
20
+ targetType: inline
21
+ workingDirectory: $(System.DefaultWorkingDirectory)
22
+ script: |
23
+ iwr -outf consul.zip https://releases.hashicorp.com/consul/1.4.2/consul_1.4.2_windows_amd64.zip
24
+ mkdir consul
25
+ Expand-Archive -Path consul.zip -DestinationPath consul
26
+ cd consul
27
+ sc.exe create "Consul" binPath="$(System.DefaultWorkingDirectory)/consul/consul.exe agent -dev"
28
+ sc.exe start "Consul"
29
+ - task: PowerShell@2
30
+ displayName: 'Setup Redis'
31
+ inputs:
32
+ targetType: inline
33
+ workingDirectory: $(System.DefaultWorkingDirectory)
34
+ script: |
35
+ iwr -outf redis.zip https://github.com/MicrosoftArchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.zip
36
+ mkdir redis
37
+ Expand-Archive -Path redis.zip -DestinationPath redis
38
+ cd redis
39
+ ./redis-server --service-install
40
+ ./redis-server --service-start
41
+ - task: PowerShell@2
42
+ displayName: 'Setup SDK and Test'
43
+ inputs:
44
+ targetType: inline
45
+ workingDirectory: $(System.DefaultWorkingDirectory)
46
+ script: |
47
+ ruby -v
48
+ gem install bundler -v 1.17.3
49
+ bundle install
50
+ mkdir rspec
51
+ bundle exec rspec --format progress --format RspecJunitFormatter -o ./rspec/rspec.xml spec
data/ext/mkrf_conf.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "rubygems"
2
+
3
+
4
+ # From http://stackoverflow.com/questions/5830835/how-to-add-openssl-dependency-to-gemspec
5
+ # the whole reason this file exists: to return an error if openssl
6
+ # isn't installed.
7
+ require "openssl"
8
+
9
+ f = File.open(File.join(File.dirname(__FILE__), "Rakefile"), "w") # create dummy rakefile to indicate success
10
+ f.write("task :default\n")
11
+ f.close
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "ldclient-rb/version"
6
+
7
+ # rubocop:disable Metrics/BlockLength
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "launchdarkly-server-sdk"
10
+ spec.version = LaunchDarkly::VERSION
11
+ spec.authors = ["LaunchDarkly"]
12
+ spec.email = ["team@launchdarkly.com"]
13
+ spec.summary = "LaunchDarkly SDK for Ruby"
14
+ spec.description = "Official LaunchDarkly SDK for Ruby"
15
+ spec.homepage = "https://github.com/launchdarkly/ruby-server-sdk"
16
+ spec.license = "Apache-2.0"
17
+
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
22
+ spec.extensions = 'ext/mkrf_conf.rb'
23
+
24
+ spec.add_development_dependency "aws-sdk-dynamodb", "~> 1.18"
25
+ spec.add_development_dependency "bundler", "~> 1.7"
26
+ spec.add_development_dependency "rspec", "~> 3.2"
27
+ spec.add_development_dependency "codeclimate-test-reporter", "~> 0"
28
+ spec.add_development_dependency "diplomat", ">= 2.0.2"
29
+ spec.add_development_dependency "redis", "~> 3.3.5"
30
+ spec.add_development_dependency "connection_pool", ">= 2.1.2"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rspec_junit_formatter", "~> 0.3.0"
33
+ spec.add_development_dependency "timecop", "~> 0.9.1"
34
+ spec.add_development_dependency "listen", "~> 3.0" # see file_data_source.rb
35
+
36
+ spec.add_runtime_dependency "json", [">= 1.8", "< 3"]
37
+ spec.add_runtime_dependency "semantic", "~> 1.6"
38
+ spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
39
+ spec.add_runtime_dependency "ld-eventsource", '~> 1.0'
40
+ end
@@ -0,0 +1,29 @@
1
+
2
+ #
3
+ # Namespace for the LaunchDarkly Ruby SDK.
4
+ #
5
+ module LaunchDarkly
6
+ end
7
+
8
+ require "ldclient-rb/version"
9
+ require "ldclient-rb/interfaces"
10
+ require "ldclient-rb/util"
11
+ require "ldclient-rb/evaluation"
12
+ require "ldclient-rb/flags_state"
13
+ require "ldclient-rb/ldclient"
14
+ require "ldclient-rb/cache_store"
15
+ require "ldclient-rb/expiring_cache"
16
+ require "ldclient-rb/memoized_value"
17
+ require "ldclient-rb/in_memory_store"
18
+ require "ldclient-rb/config"
19
+ require "ldclient-rb/newrelic"
20
+ require "ldclient-rb/stream"
21
+ require "ldclient-rb/polling"
22
+ require "ldclient-rb/user_filter"
23
+ require "ldclient-rb/simple_lru_cache"
24
+ require "ldclient-rb/non_blocking_thread_pool"
25
+ require "ldclient-rb/event_summarizer"
26
+ require "ldclient-rb/events"
27
+ require "ldclient-rb/requestor"
28
+ require "ldclient-rb/file_data_source"
29
+ require "ldclient-rb/integrations"
@@ -0,0 +1,45 @@
1
+ require "concurrent/map"
2
+
3
+ module LaunchDarkly
4
+ #
5
+ # A thread-safe in-memory store that uses the same semantics that Faraday would expect, although we
6
+ # no longer use Faraday. This is used by Requestor, when we are not in a Rails environment.
7
+ #
8
+ # @private
9
+ #
10
+ class ThreadSafeMemoryStore
11
+ #
12
+ # Default constructor
13
+ #
14
+ # @return [ThreadSafeMemoryStore] a new store
15
+ def initialize
16
+ @cache = Concurrent::Map.new
17
+ end
18
+
19
+ #
20
+ # Read a value from the cache
21
+ # @param key [Object] the cache key
22
+ #
23
+ # @return [Object] the cache value
24
+ def read(key)
25
+ @cache[key]
26
+ end
27
+
28
+ #
29
+ # Store a value in the cache
30
+ # @param key [Object] the cache key
31
+ # @param value [Object] the value to associate with the key
32
+ #
33
+ # @return [Object] the value
34
+ def write(key, value)
35
+ @cache[key] = value
36
+ end
37
+
38
+ #
39
+ # Delete a value in the cache
40
+ # @param key [Object] the cache key
41
+ def delete(key)
42
+ @cache.delete(key)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,411 @@
1
+ require "logger"
2
+
3
+ module LaunchDarkly
4
+ #
5
+ # This class exposes advanced configuration options for the LaunchDarkly
6
+ # client library. Most users will not need to use a custom configuration--
7
+ # the default configuration sets sane defaults for most use cases.
8
+ #
9
+ #
10
+ class Config
11
+ # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
12
+
13
+ #
14
+ # Constructor for creating custom LaunchDarkly configurations.
15
+ #
16
+ # @param opts [Hash] the configuration options
17
+ # @option opts [Logger] :logger See {#logger}.
18
+ # @option opts [String] :base_uri ("https://app.launchdarkly.com") See {#base_uri}.
19
+ # @option opts [String] :stream_uri ("https://stream.launchdarkly.com") See {#stream_uri}.
20
+ # @option opts [String] :events_uri ("https://events.launchdarkly.com") See {#events_uri}.
21
+ # @option opts [Integer] :capacity (10000) See {#capacity}.
22
+ # @option opts [Float] :flush_interval (30) See {#flush_interval}.
23
+ # @option opts [Float] :read_timeout (10) See {#read_timeout}.
24
+ # @option opts [Float] :connect_timeout (2) See {#connect_timeout}.
25
+ # @option opts [Object] :cache_store See {#cache_store}.
26
+ # @option opts [Object] :feature_store See {#feature_store}.
27
+ # @option opts [Boolean] :use_ldd (false) See {#use_ldd?}.
28
+ # @option opts [Boolean] :offline (false) See {#offline?}.
29
+ # @option opts [Float] :poll_interval (30) See {#poll_interval}.
30
+ # @option opts [Boolean] :stream (true) See {#stream?}.
31
+ # @option opts [Boolean] all_attributes_private (false) See {#all_attributes_private}.
32
+ # @option opts [Array] :private_attribute_names See {#private_attribute_names}.
33
+ # @option opts [Boolean] :send_events (true) See {#send_events}.
34
+ # @option opts [Integer] :user_keys_capacity (1000) See {#user_keys_capacity}.
35
+ # @option opts [Float] :user_keys_flush_interval (300) See {#user_keys_flush_interval}.
36
+ # @option opts [Boolean] :inline_users_in_events (false) See {#inline_users_in_events}.
37
+ # @option opts [Object] :data_source See {#data_source}.
38
+ # @option opts [Object] :update_processor Obsolete synonym for `data_source`.
39
+ # @option opts [Object] :update_processor_factory Obsolete synonym for `data_source`.
40
+ #
41
+ def initialize(opts = {})
42
+ @base_uri = (opts[:base_uri] || Config.default_base_uri).chomp("/")
43
+ @stream_uri = (opts[:stream_uri] || Config.default_stream_uri).chomp("/")
44
+ @events_uri = (opts[:events_uri] || Config.default_events_uri).chomp("/")
45
+ @capacity = opts[:capacity] || Config.default_capacity
46
+ @logger = opts[:logger] || Config.default_logger
47
+ @cache_store = opts[:cache_store] || Config.default_cache_store
48
+ @flush_interval = opts[:flush_interval] || Config.default_flush_interval
49
+ @connect_timeout = opts[:connect_timeout] || Config.default_connect_timeout
50
+ @read_timeout = opts[:read_timeout] || Config.default_read_timeout
51
+ @feature_store = opts[:feature_store] || Config.default_feature_store
52
+ @stream = opts.has_key?(:stream) ? opts[:stream] : Config.default_stream
53
+ @use_ldd = opts.has_key?(:use_ldd) ? opts[:use_ldd] : Config.default_use_ldd
54
+ @offline = opts.has_key?(:offline) ? opts[:offline] : Config.default_offline
55
+ @poll_interval = opts.has_key?(:poll_interval) && opts[:poll_interval] > Config.default_poll_interval ? opts[:poll_interval] : Config.default_poll_interval
56
+ @all_attributes_private = opts[:all_attributes_private] || false
57
+ @private_attribute_names = opts[:private_attribute_names] || []
58
+ @send_events = opts.has_key?(:send_events) ? opts[:send_events] : Config.default_send_events
59
+ @user_keys_capacity = opts[:user_keys_capacity] || Config.default_user_keys_capacity
60
+ @user_keys_flush_interval = opts[:user_keys_flush_interval] || Config.default_user_keys_flush_interval
61
+ @inline_users_in_events = opts[:inline_users_in_events] || false
62
+ @data_source = opts[:data_source] || opts[:update_processor] || opts[:update_processor_factory]
63
+ @update_processor = opts[:update_processor]
64
+ @update_processor_factory = opts[:update_processor_factory]
65
+ end
66
+
67
+ #
68
+ # The base URL for the LaunchDarkly server. This is configurable mainly for testing
69
+ # purposes; most users should use the default value.
70
+ # @return [String]
71
+ #
72
+ attr_reader :base_uri
73
+
74
+ #
75
+ # The base URL for the LaunchDarkly streaming server. This is configurable mainly for testing
76
+ # purposes; most users should use the default value.
77
+ # @return [String]
78
+ #
79
+ attr_reader :stream_uri
80
+
81
+ #
82
+ # The base URL for the LaunchDarkly events server. This is configurable mainly for testing
83
+ # purposes; most users should use the default value.
84
+ # @return [String]
85
+ #
86
+ attr_reader :events_uri
87
+
88
+ #
89
+ # Whether streaming mode should be enabled. Streaming mode asynchronously updates
90
+ # feature flags in real-time using server-sent events. Streaming is enabled by default, and
91
+ # should only be disabled on the advice of LaunchDarkly support.
92
+ # @return [Boolean]
93
+ #
94
+ def stream?
95
+ @stream
96
+ end
97
+
98
+ #
99
+ # Whether to use the LaunchDarkly relay proxy in daemon mode. In this mode, the client does not
100
+ # use polling or streaming to get feature flag updates from the server, but instead reads them
101
+ # from the {#feature_store feature store}, which is assumed to be a database that is populated by
102
+ # a LaunchDarkly relay proxy. For more information, see ["The relay proxy"](https://docs.launchdarkly.com/v2.0/docs/the-relay-proxy)
103
+ # and ["Using a persistent feature store"](https://docs.launchdarkly.com/v2.0/docs/using-a-persistent-feature-store).
104
+ #
105
+ # All other properties related to streaming or polling are ignored if this option is set to true.
106
+ #
107
+ # @return [Boolean]
108
+ #
109
+ def use_ldd?
110
+ @use_ldd
111
+ end
112
+
113
+ #
114
+ # Whether the client should be initialized in offline mode. In offline mode, default values are
115
+ # returned for all flags and no remote network requests are made.
116
+ # @return [Boolean]
117
+ #
118
+ def offline?
119
+ @offline
120
+ end
121
+
122
+ #
123
+ # The number of seconds between flushes of the event buffer. Decreasing the flush interval means
124
+ # that the event buffer is less likely to reach capacity.
125
+ # @return [Float]
126
+ #
127
+ attr_reader :flush_interval
128
+
129
+ #
130
+ # The number of seconds to wait before polling for feature flag updates. This option has no
131
+ # effect unless streaming is disabled.
132
+ # @return [Float]
133
+ #
134
+ attr_reader :poll_interval
135
+
136
+ #
137
+ # The configured logger for the LaunchDarkly client. The client library uses the log to
138
+ # print warning and error messages. If not specified, this defaults to the Rails logger
139
+ # in a Rails environment, or stdout otherwise.
140
+ # @return [Logger]
141
+ #
142
+ attr_reader :logger
143
+
144
+ #
145
+ # The capacity of the events buffer. The client buffers up to this many
146
+ # events in memory before flushing. If the capacity is exceeded before
147
+ # the buffer is flushed, events will be discarded.
148
+ # Increasing the capacity means that events are less likely to be discarded,
149
+ # at the cost of consuming more memory.
150
+ # @return [Integer]
151
+ #
152
+ attr_reader :capacity
153
+
154
+ #
155
+ # A store for HTTP caching (used only in polling mode). This must support the semantics used by
156
+ # the [`faraday-http-cache`](https://github.com/plataformatec/faraday-http-cache) gem, although
157
+ # the SDK no longer uses Faraday. Defaults to the Rails cache in a Rails environment, or a
158
+ # thread-safe in-memory store otherwise.
159
+ # @return [Object]
160
+ #
161
+ attr_reader :cache_store
162
+
163
+ #
164
+ # The read timeout for network connections in seconds. This does not apply to the streaming
165
+ # connection, which uses a longer timeout since the server does not send data constantly.
166
+ # @return [Float]
167
+ #
168
+ attr_reader :read_timeout
169
+
170
+ #
171
+ # The connect timeout for network connections in seconds.
172
+ # @return [Float]
173
+ #
174
+ attr_reader :connect_timeout
175
+
176
+ #
177
+ # A store for feature flags and related data. The client uses it to store all data received
178
+ # from LaunchDarkly, and uses the last stored data when evaluating flags. Defaults to
179
+ # {InMemoryFeatureStore}; for other implementations, see {LaunchDarkly::Integrations}.
180
+ #
181
+ # For more information, see ["Using a persistent feature store"](https://docs.launchdarkly.com/v2.0/docs/using-a-persistent-feature-store).
182
+ #
183
+ # @return [LaunchDarkly::Interfaces::FeatureStore]
184
+ #
185
+ attr_reader :feature_store
186
+
187
+ #
188
+ # True if all user attributes (other than the key) should be considered private. This means
189
+ # that the attribute values will not be sent to LaunchDarkly in analytics events and will not
190
+ # appear on the LaunchDarkly dashboard.
191
+ # @return [Boolean]
192
+ # @see #private_attribute_names
193
+ #
194
+ attr_reader :all_attributes_private
195
+
196
+ #
197
+ # A list of user attribute names that should always be considered private. This means that the
198
+ # attribute values will not be sent to LaunchDarkly in analytics events and will not appear on
199
+ # the LaunchDarkly dashboard.
200
+ #
201
+ # You can also specify the same behavior for an individual flag evaluation by storing an array
202
+ # of attribute names in the `:privateAttributeNames` property (note camelcase name) of the
203
+ # user object.
204
+ #
205
+ # @return [Array<String>]
206
+ # @see #all_attributes_private
207
+ #
208
+ attr_reader :private_attribute_names
209
+
210
+ #
211
+ # Whether to send events back to LaunchDarkly. This differs from {#offline?} in that it affects
212
+ # only the sending of client-side events, not streaming or polling for events from the server.
213
+ # @return [Boolean]
214
+ #
215
+ attr_reader :send_events
216
+
217
+ #
218
+ # The number of user keys that the event processor can remember at any one time. This reduces the
219
+ # amount of duplicate user details sent in analytics events.
220
+ # @return [Integer]
221
+ # @see #user_keys_flush_interval
222
+ #
223
+ attr_reader :user_keys_capacity
224
+
225
+ #
226
+ # The interval in seconds at which the event processor will reset its set of known user keys.
227
+ # @return [Float]
228
+ # @see #user_keys_capacity
229
+ #
230
+ attr_reader :user_keys_flush_interval
231
+
232
+ #
233
+ # Whether to include full user details in every analytics event. By default, events will only
234
+ # include the user key, except for one "index" event that provides the full details for the user.
235
+ # The only reason to change this is if you are using the Analytics Data Stream.
236
+ # @return [Boolean]
237
+ #
238
+ attr_reader :inline_users_in_events
239
+
240
+ #
241
+ # An object that is responsible for receiving feature flag data from LaunchDarkly. By default,
242
+ # the client uses its standard polling or streaming implementation; this is customizable for
243
+ # testing purposes.
244
+ #
245
+ # This may be set to either an object that conforms to {LaunchDarkly::Interfaces::DataSource},
246
+ # or a lambda (or Proc) that takes two parameters-- SDK key and {Config}-- and returns such an
247
+ # object.
248
+ #
249
+ # @return [LaunchDarkly::Interfaces::DataSource|lambda]
250
+ # @see FileDataSource
251
+ #
252
+ attr_reader :data_source
253
+
254
+ # @deprecated This is replaced by {#data_source}.
255
+ attr_reader :update_processor
256
+
257
+ # @deprecated This is replaced by {#data_source}.
258
+ attr_reader :update_processor_factory
259
+
260
+ #
261
+ # The default LaunchDarkly client configuration. This configuration sets
262
+ # reasonable defaults for most users.
263
+ # @return [Config] The default LaunchDarkly configuration.
264
+ #
265
+ def self.default
266
+ Config.new
267
+ end
268
+
269
+ #
270
+ # The default value for {#capacity}.
271
+ # @return [Integer] 10000
272
+ #
273
+ def self.default_capacity
274
+ 10000
275
+ end
276
+
277
+ #
278
+ # The default value for {#base_uri}.
279
+ # @return [String] "https://app.launchdarkly.com"
280
+ #
281
+ def self.default_base_uri
282
+ "https://app.launchdarkly.com"
283
+ end
284
+
285
+ #
286
+ # The default value for {#stream_uri}.
287
+ # @return [String] "https://stream.launchdarkly.com"
288
+ #
289
+ def self.default_stream_uri
290
+ "https://stream.launchdarkly.com"
291
+ end
292
+
293
+ #
294
+ # The default value for {#events_uri}.
295
+ # @return [String] "https://events.launchdarkly.com"
296
+ #
297
+ def self.default_events_uri
298
+ "https://events.launchdarkly.com"
299
+ end
300
+
301
+ #
302
+ # The default value for {#cache_store}.
303
+ # @return [Object] the Rails cache if in Rails, or a simple in-memory implementation otherwise
304
+ #
305
+ def self.default_cache_store
306
+ defined?(Rails) && Rails.respond_to?(:cache) ? Rails.cache : ThreadSafeMemoryStore.new
307
+ end
308
+
309
+ #
310
+ # The default value for {#flush_interval}.
311
+ # @return [Float] 10
312
+ #
313
+ def self.default_flush_interval
314
+ 10
315
+ end
316
+
317
+ #
318
+ # The default value for {#read_timeout}.
319
+ # @return [Float] 10
320
+ #
321
+ def self.default_read_timeout
322
+ 10
323
+ end
324
+
325
+ #
326
+ # The default value for {#connect_timeout}.
327
+ # @return [Float] 10
328
+ #
329
+ def self.default_connect_timeout
330
+ 2
331
+ end
332
+
333
+ #
334
+ # The default value for {#logger}.
335
+ # @return [Logger] the Rails logger if in Rails, or a default Logger at WARN level otherwise
336
+ #
337
+ def self.default_logger
338
+ if defined?(Rails) && Rails.respond_to?(:logger)
339
+ Rails.logger
340
+ else
341
+ log = ::Logger.new($stdout)
342
+ log.level = ::Logger::WARN
343
+ log
344
+ end
345
+ end
346
+
347
+ #
348
+ # The default value for {#stream?}.
349
+ # @return [Boolean] true
350
+ #
351
+ def self.default_stream
352
+ true
353
+ end
354
+
355
+ #
356
+ # The default value for {#use_ldd?}.
357
+ # @return [Boolean] false
358
+ #
359
+ def self.default_use_ldd
360
+ false
361
+ end
362
+
363
+ #
364
+ # The default value for {#feature_store}.
365
+ # @return [LaunchDarkly::Interfaces::FeatureStore] an {InMemoryFeatureStore}
366
+ #
367
+ def self.default_feature_store
368
+ InMemoryFeatureStore.new
369
+ end
370
+
371
+ #
372
+ # The default value for {#offline?}.
373
+ # @return [Boolean] false
374
+ #
375
+ def self.default_offline
376
+ false
377
+ end
378
+
379
+ #
380
+ # The default value for {#poll_interval}.
381
+ # @return [Float] 30
382
+ #
383
+ def self.default_poll_interval
384
+ 30
385
+ end
386
+
387
+ #
388
+ # The default value for {#send_events}.
389
+ # @return [Boolean] true
390
+ #
391
+ def self.default_send_events
392
+ true
393
+ end
394
+
395
+ #
396
+ # The default value for {#user_keys_capacity}.
397
+ # @return [Integer] 1000
398
+ #
399
+ def self.default_user_keys_capacity
400
+ 1000
401
+ end
402
+
403
+ #
404
+ # The default value for {#user_keys_flush_interval}.
405
+ # @return [Float] 300
406
+ #
407
+ def self.default_user_keys_flush_interval
408
+ 300
409
+ end
410
+ end
411
+ end